diff --git a/.dev/gather_models.py b/.dev/gather_models.py new file mode 100644 index 0000000000000000000000000000000000000000..1899195d7dc90088e89a424c8c749f075e4e18d6 --- /dev/null +++ b/.dev/gather_models.py @@ -0,0 +1,197 @@ +import argparse +import glob +import json +import os +import os.path as osp +import shutil +import subprocess + +import mmcv +import torch + +# build schedule look-up table to automatically find the final model +RESULTS_LUT = ['mIoU', 'mAcc', 'aAcc'] + + +def process_checkpoint(in_file, out_file): + checkpoint = torch.load(in_file, map_location='cpu') + # remove optimizer for smaller file size + if 'optimizer' in checkpoint: + del checkpoint['optimizer'] + # if it is necessary to remove some sensitive data in checkpoint['meta'], + # add the code here. + torch.save(checkpoint, out_file) + sha = subprocess.check_output(['sha256sum', out_file]).decode() + final_file = out_file.rstrip('.pth') + '-{}.pth'.format(sha[:8]) + subprocess.Popen(['mv', out_file, final_file]) + return final_file + + +def get_final_iter(config): + iter_num = config.split('_')[-2] + assert iter_num.endswith('k') + return int(iter_num[:-1]) * 1000 + + +def get_final_results(log_json_path, iter_num): + result_dict = dict() + with open(log_json_path, 'r') as f: + for line in f.readlines(): + log_line = json.loads(line) + if 'mode' not in log_line.keys(): + continue + + if log_line['mode'] == 'train' and log_line['iter'] == iter_num: + result_dict['memory'] = log_line['memory'] + + if log_line['iter'] == iter_num: + result_dict.update({ + key: log_line[key] + for key in RESULTS_LUT if key in log_line + }) + return result_dict + + +def parse_args(): + parser = argparse.ArgumentParser(description='Gather benchmarked models') + parser.add_argument( + 'root', + type=str, + help='root path of benchmarked models to be gathered') + parser.add_argument( + 'config', + type=str, + help='root path of benchmarked configs to be gathered') + parser.add_argument( + 'out_dir', + type=str, + help='output path of gathered models to be stored') + parser.add_argument('out_file', type=str, help='the output json file name') + parser.add_argument( + '--filter', type=str, nargs='+', default=[], help='config filter') + parser.add_argument( + '--all', action='store_true', help='whether include .py and .log') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + models_root = args.root + models_out = args.out_dir + config_name = args.config + mmcv.mkdir_or_exist(models_out) + + # find all models in the root directory to be gathered + raw_configs = list(mmcv.scandir(config_name, '.py', recursive=True)) + + # filter configs that is not trained in the experiments dir + used_configs = [] + for raw_config in raw_configs: + work_dir = osp.splitext(osp.basename(raw_config))[0] + if osp.exists(osp.join(models_root, work_dir)): + used_configs.append((work_dir, raw_config)) + print(f'Find {len(used_configs)} models to be gathered') + + # find final_ckpt and log file for trained each config + # and parse the best performance + model_infos = [] + for used_config, raw_config in used_configs: + bypass = True + for p in args.filter: + if p in used_config: + bypass = False + break + if bypass: + continue + exp_dir = osp.join(models_root, used_config) + # check whether the exps is finished + final_iter = get_final_iter(used_config) + final_model = 'iter_{}.pth'.format(final_iter) + model_path = osp.join(exp_dir, final_model) + + # skip if the model is still training + if not osp.exists(model_path): + print(f'{used_config} train not finished yet') + continue + + # get logs + log_json_paths = glob.glob(osp.join(exp_dir, '*.log.json')) + log_json_path = log_json_paths[0] + model_performance = None + for idx, _log_json_path in enumerate(log_json_paths): + model_performance = get_final_results(_log_json_path, final_iter) + if model_performance is not None: + log_json_path = _log_json_path + break + + if model_performance is None: + print(f'{used_config} model_performance is None') + continue + + model_time = osp.split(log_json_path)[-1].split('.')[0] + model_infos.append( + dict( + config=used_config, + raw_config=raw_config, + results=model_performance, + iters=final_iter, + model_time=model_time, + log_json_path=osp.split(log_json_path)[-1])) + + # publish model for each checkpoint + publish_model_infos = [] + for model in model_infos: + model_publish_dir = osp.join(models_out, + model['raw_config'].rstrip('.py')) + model_name = osp.split(model['config'])[-1].split('.')[0] + + publish_model_path = osp.join(model_publish_dir, + model_name + '_' + model['model_time']) + trained_model_path = osp.join(models_root, model['config'], + 'iter_{}.pth'.format(model['iters'])) + if osp.exists(model_publish_dir): + for file in os.listdir(model_publish_dir): + if file.endswith('.pth'): + print(f'model {file} found') + model['model_path'] = osp.abspath( + osp.join(model_publish_dir, file)) + break + if 'model_path' not in model: + print(f'dir {model_publish_dir} exists, no model found') + + else: + mmcv.mkdir_or_exist(model_publish_dir) + + # convert model + final_model_path = process_checkpoint(trained_model_path, + publish_model_path) + model['model_path'] = final_model_path + + new_json_path = f'{model_name}-{model["log_json_path"]}' + # copy log + shutil.copy( + osp.join(models_root, model['config'], model['log_json_path']), + osp.join(model_publish_dir, new_json_path)) + if args.all: + new_txt_path = new_json_path.rstrip('.json') + shutil.copy( + osp.join(models_root, model['config'], + model['log_json_path'].rstrip('.json')), + osp.join(model_publish_dir, new_txt_path)) + + if args.all: + # copy config to guarantee reproducibility + raw_config = osp.join(config_name, model['raw_config']) + mmcv.Config.fromfile(raw_config).dump( + osp.join(model_publish_dir, osp.basename(raw_config))) + + publish_model_infos.append(model) + + models = dict(models=publish_model_infos) + mmcv.dump(models, osp.join(models_out, args.out_file)) + + +if __name__ == '__main__': + main() diff --git a/.dev/upload_modelzoo.py b/.dev/upload_modelzoo.py new file mode 100644 index 0000000000000000000000000000000000000000..bd78bc41e69c3b603e7bbb4ee8a6c420ad87e26b --- /dev/null +++ b/.dev/upload_modelzoo.py @@ -0,0 +1,44 @@ +import argparse +import os +import os.path as osp + +import oss2 + +ACCESS_KEY_ID = os.getenv('OSS_ACCESS_KEY_ID', None) +ACCESS_KEY_SECRET = os.getenv('OSS_ACCESS_KEY_SECRET', None) +BUCKET_NAME = 'openmmlab' +ENDPOINT = 'https://oss-accelerate.aliyuncs.com' + + +def parse_args(): + parser = argparse.ArgumentParser(description='Upload models to OSS') + parser.add_argument('model_zoo', type=str, help='model_zoo input') + parser.add_argument( + '--dst-folder', + type=str, + default='mmsegmentation/v0.5', + help='destination folder') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + model_zoo = args.model_zoo + dst_folder = args.dst_folder + bucket = oss2.Bucket( + oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET), ENDPOINT, BUCKET_NAME) + + for root, dirs, files in os.walk(model_zoo): + for file in files: + file_path = osp.relpath(osp.join(root, file), model_zoo) + print(f'Uploading {file_path}') + + oss2.resumable_upload(bucket, osp.join(dst_folder, file_path), + osp.join(model_zoo, file_path)) + bucket.put_object_acl( + osp.join(dst_folder, file_path), oss2.OBJECT_ACL_PUBLIC_READ) + + +if __name__ == '__main__': + main() diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..610b0d072f87550bc267c5025f97767433f6c8e6 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,47 @@ +<<<<<<< HEAD +<<<<<<< HEAD +*.pth filter=lfs diff=lfs merge=lfs -text +======= +======= +>>>>>>> f406c34c024e7549cfd031b9b7f8682c3107c813 +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +<<<<<<< HEAD +>>>>>>> f406c34c024e7549cfd031b9b7f8682c3107c813 +======= +>>>>>>> f406c34c024e7549cfd031b9b7f8682c3107c813 +*.png filter=lfs diff=lfs merge=lfs -text +*.gif filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..9b7cffbc88b17eb033ca403bed5c6254a539e73c --- /dev/null +++ b/.gitignore @@ -0,0 +1,117 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +data +.vscode +.idea + +# custom +*.pkl +*.pkl.json +*.log.json +work_dirs/ + +# Pytorch +*.pth diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d3395dc284edbae1fea7006ee7c8967ea62a3b45 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,40 @@ +repos: + - repo: https://gitlab.com/pycqa/flake8.git + rev: 3.8.3 + hooks: + - id: flake8 + - repo: https://github.com/asottile/seed-isort-config + rev: v2.2.0 + hooks: + - id: seed-isort-config + - repo: https://github.com/timothycrosley/isort + rev: 4.3.21 + hooks: + - id: isort + - repo: https://github.com/pre-commit/mirrors-yapf + rev: v0.30.0 + hooks: + - id: yapf + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.1.0 + hooks: + - id: trailing-whitespace + - id: check-yaml + - id: end-of-file-fixer + - id: requirements-txt-fixer + - id: double-quote-string-fixer + - id: check-merge-conflict + - id: fix-encoding-pragma + args: ["--remove"] + - id: mixed-line-ending + args: ["--fix=lf"] + - repo: https://github.com/jumanjihouse/pre-commit-hooks + rev: 2.1.4 + hooks: + - id: markdownlint + args: ["-r", "~MD002,~MD013,~MD029,~MD033,~MD034,~MD036"] + - repo: https://github.com/myint/docformatter + rev: v1.3.1 + hooks: + - id: docformatter + args: ["--in-place", "--wrap-descriptions", "79"] diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000000000000000000000000000000000000..73ea4cb7e95530cd18ed94895ca38edd531f0d94 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,7 @@ +version: 2 + +python: + version: 3.7 + install: + - requirements: requirements/docs.txt + - requirements: requirements/readthedocs.txt diff --git a/.tags b/.tags new file mode 100644 index 0000000000000000000000000000000000000000..bde6d2877474357e0a809846f12c0be9c14f4c7d --- /dev/null +++ b/.tags @@ -0,0 +1,5568 @@ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ +!_TAG_PROGRAM_NAME Exuberant Ctags // +!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ +!_TAG_PROGRAM_VERSION 5.8 // +ABCMeta .\mmseg\core\seg\sampler\base_pixel_sampler.py /^from abc import ABCMeta, abstractmethod$/;" i +ABCMeta .\mmseg\models\decode_heads\cascade_decode_head.py /^from abc import ABCMeta, abstractmethod$/;" i +ABCMeta .\mmseg\models\decode_heads\decode_head.py /^from abc import ABCMeta, abstractmethod$/;" i +ABCMeta .\mmseg\models\segmentors\base.py /^from abc import ABCMeta, abstractmethod$/;" i +ACCESS_KEY_ID .\.dev\upload_modelzoo.py /^ACCESS_KEY_ID = os.getenv('OSS_ACCESS_KEY_ID', None)$/;" v +ACCESS_KEY_SECRET .\.dev\upload_modelzoo.py /^ACCESS_KEY_SECRET = os.getenv('OSS_ACCESS_KEY_SECRET', None)$/;" v +ACM .\mmseg\models\decode_heads\apc_head.py /^class ACM(nn.Module):$/;" c +ADE20KDataset .\mmseg\datasets\__init__.py /^from .ade import ADE20KDataset$/;" i +ADE20KDataset .\mmseg\datasets\ade.py /^class ADE20KDataset(CustomDataset):$/;" c +ADE20KDataset .\tests\test_data\test_dataset.py /^from mmseg.datasets import (DATASETS, ADE20KDataset, CityscapesDataset,$/;" i +AFNB .\mmseg\models\decode_heads\ann_head.py /^class AFNB(nn.Module):$/;" c +ANNHead .\mmseg\models\decode_heads\__init__.py /^from .ann_head import ANNHead$/;" i +ANNHead .\mmseg\models\decode_heads\ann_head.py /^class ANNHead(BaseDecodeHead):$/;" c +ANNHead .\tests\test_models\test_heads.py /^from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead,$/;" i +APCHead .\mmseg\models\decode_heads\__init__.py /^from .apc_head import APCHead$/;" i +APCHead .\mmseg\models\decode_heads\apc_head.py /^class APCHead(BaseDecodeHead):$/;" c +APCHead .\tests\test_models\test_heads.py /^from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead,$/;" i +APNB .\mmseg\models\decode_heads\ann_head.py /^class APNB(nn.Module):$/;" c +ASPPHead .\mmseg\models\decode_heads\__init__.py /^from .aspp_head import ASPPHead$/;" i +ASPPHead .\mmseg\models\decode_heads\aspp_head.py /^class ASPPHead(BaseDecodeHead):$/;" c +ASPPHead .\mmseg\models\decode_heads\sep_aspp_head.py /^from .aspp_head import ASPPHead, ASPPModule$/;" i +ASPPHead .\tests\test_models\test_heads.py /^from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead,$/;" i +ASPPModule .\mmseg\models\decode_heads\aspp_head.py /^class ASPPModule(nn.ModuleList):$/;" c +ASPPModule .\mmseg\models\decode_heads\sep_aspp_head.py /^from .aspp_head import ASPPHead, ASPPModule$/;" i +AUG_LEN .\tools\convert_datasets\voc_aug.py /^AUG_LEN = 10582$/;" v +Accuracy .\mmseg\models\losses\__init__.py /^from .accuracy import Accuracy, accuracy$/;" i +Accuracy .\mmseg\models\losses\accuracy.py /^class Accuracy(nn.Module):$/;" c +Accuracy .\tests\test_models\test_losses.py /^from mmseg.models.losses import Accuracy, reduce_loss, weight_reduce_loss$/;" i +AdjustGamma .\mmseg\datasets\pipelines\__init__.py /^from .transforms import (CLAHE, AdjustGamma, Normalize, Pad,$/;" i +AdjustGamma .\mmseg\datasets\pipelines\transforms.py /^class AdjustGamma(object):$/;" c +ArgumentParser .\demo\image_demo.py /^from argparse import ArgumentParser$/;" i +AsciiTable .\mmseg\datasets\custom.py /^from terminaltables import AsciiTable$/;" i +Attention .\mmseg\models\backbones\pvt.py /^class Attention(nn.Module):$/;" c +Attention .\mmseg\models\backbones\pvt_dia.py /^class Attention(nn.Module):$/;" c +Attention .\mmseg\models\backbones\vit.py /^class Attention(nn.Module):$/;" c +Attention .\mmseg\models\backbones\vit_mla.py /^class Attention(nn.Module):$/;" c +AvgPool2d .\tests\test_models\test_backbone.py /^from torch.nn.modules import AvgPool2d, GroupNorm$/;" i +BACKBONES .\mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +BACKBONES .\mmseg\models\backbones\cgnet.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\fast_scnn.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\hrnet.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\mobilenet_v2.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\mobilenet_v3.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\pvt.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\pvt_dia.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\resnest.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\resnet.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\resnext.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\unet.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\vit.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\backbones\vit_mla.py /^from ..builder import BACKBONES$/;" i +BACKBONES .\mmseg\models\builder.py /^BACKBONES = Registry('backbone')$/;" v +BACKBONES .\tests\test_models\test_segmentor.py /^from mmseg.models import BACKBONES, HEADS, build_segmentor$/;" i +BUCKET_NAME .\.dev\upload_modelzoo.py /^BUCKET_NAME = 'openmmlab'$/;" v +BUILDDIR .\docs\make.bat /^set BUILDDIR=_build$/;" v +BaseCascadeDecodeHead .\mmseg\models\decode_heads\cascade_decode_head.py /^class BaseCascadeDecodeHead(BaseDecodeHead, metaclass=ABCMeta):$/;" c +BaseCascadeDecodeHead .\mmseg\models\decode_heads\ocr_head.py /^from .cascade_decode_head import BaseCascadeDecodeHead$/;" i +BaseCascadeDecodeHead .\mmseg\models\decode_heads\point_head.py /^from .cascade_decode_head import BaseCascadeDecodeHead$/;" i +BaseCascadeDecodeHead .\tests\test_models\test_segmentor.py /^from mmseg.models.decode_heads.cascade_decode_head import BaseCascadeDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\ann_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\apc_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\aspp_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\cascade_decode_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\da_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\decode_head.py /^class BaseDecodeHead(nn.Module, metaclass=ABCMeta):$/;" c +BaseDecodeHead .\mmseg\models\decode_heads\dm_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\ema_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\enc_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\fcn_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\fpn_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\lraspp_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\psa_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\psp_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\uper_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\vit_mla_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\mmseg\models\decode_heads\vit_up_head.py /^from .decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\tests\test_models\test_heads.py /^from mmseg.models.decode_heads.decode_head import BaseDecodeHead$/;" i +BaseDecodeHead .\tests\test_models\test_segmentor.py /^from mmseg.models.decode_heads.decode_head import BaseDecodeHead$/;" i +BasePixelSampler .\mmseg\core\seg\__init__.py /^from .sampler import BasePixelSampler, OHEMPixelSampler$/;" i +BasePixelSampler .\mmseg\core\seg\sampler\__init__.py /^from .base_pixel_sampler import BasePixelSampler$/;" i +BasePixelSampler .\mmseg\core\seg\sampler\base_pixel_sampler.py /^class BasePixelSampler(metaclass=ABCMeta):$/;" c +BasePixelSampler .\mmseg\core\seg\sampler\ohem_pixel_sampler.py /^from .base_pixel_sampler import BasePixelSampler$/;" i +BaseSegmentor .\mmseg\models\segmentors\base.py /^class BaseSegmentor(nn.Module):$/;" c +BaseSegmentor .\mmseg\models\segmentors\encoder_decoder.py /^from .base import BaseSegmentor$/;" i +BasicBlock .\mmseg\models\backbones\hrnet.py /^from .resnet import BasicBlock, Bottleneck$/;" i +BasicBlock .\mmseg\models\backbones\resnet.py /^class BasicBlock(nn.Module):$/;" c +BasicBlock .\tests\test_models\test_backbone.py /^from mmseg.models.backbones.resnet import BasicBlock, Bottleneck$/;" i +BasicConvBlock .\mmseg\models\backbones\unet.py /^class BasicConvBlock(nn.Module):$/;" c +BasicConvBlock .\tests\test_models\test_unet.py /^from mmseg.models.backbones.unet import (BasicConvBlock, DeconvModule,$/;" i +Block .\mmseg\models\backbones\pvt.py /^class Block(nn.Module):$/;" c +Block .\mmseg\models\backbones\pvt_dia.py /^class Block(nn.Module):$/;" c +Block .\mmseg\models\backbones\vit.py /^class Block(nn.Module):$/;" c +Block .\mmseg\models\backbones\vit_mla.py /^class Block(nn.Module):$/;" c +Block .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^from ..backbones.vit import Block$/;" i +Block .\mmseg\models\decode_heads\vit_mla_head.py /^from ..backbones.vit import Block$/;" i +Block .\mmseg\models\decode_heads\vit_up_head.py /^from ..backbones.vit import Block$/;" i +Bottleneck .\mmseg\models\backbones\hrnet.py /^from .resnet import BasicBlock, Bottleneck$/;" i +Bottleneck .\mmseg\models\backbones\resnest.py /^class Bottleneck(_Bottleneck):$/;" c +Bottleneck .\mmseg\models\backbones\resnet.py /^class Bottleneck(nn.Module):$/;" c +Bottleneck .\mmseg\models\backbones\resnext.py /^class Bottleneck(_Bottleneck):$/;" c +Bottleneck .\tests\test_models\test_backbone.py /^from mmseg.models.backbones.resnet import BasicBlock, Bottleneck$/;" i +BottleneckS .\tests\test_models\test_backbone.py /^from mmseg.models.backbones.resnest import Bottleneck as BottleneckS$/;" i +BottleneckX .\tests\test_models\test_backbone.py /^from mmseg.models.backbones.resnext import Bottleneck as BottleneckX$/;" i +CAM .\mmseg\models\decode_heads\da_head.py /^class CAM(nn.Module):$/;" c +CCHead .\mmseg\models\decode_heads\__init__.py /^from .cc_head import CCHead$/;" i +CCHead .\mmseg\models\decode_heads\cc_head.py /^class CCHead(FCNHead):$/;" c +CCHead .\tests\test_models\test_heads.py /^from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead,$/;" i +CGNet .\mmseg\models\backbones\__init__.py /^from .cgnet import CGNet$/;" i +CGNet .\mmseg\models\backbones\cgnet.py /^class CGNet(nn.Module):$/;" c +CGNet .\tests\test_models\test_backbone.py /^from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt,$/;" i +CHASE_DB1_LEN .\tools\convert_datasets\chase_db1.py /^CHASE_DB1_LEN = 28 * 3$/;" v +CLAHE .\mmseg\datasets\pipelines\__init__.py /^from .transforms import (CLAHE, AdjustGamma, Normalize, Pad,$/;" i +CLAHE .\mmseg\datasets\pipelines\transforms.py /^class CLAHE(object):$/;" c +CLASSES .\mmseg\datasets\ade.py /^ CLASSES = ($/;" v class:ADE20KDataset +CLASSES .\mmseg\datasets\chase_db1.py /^ CLASSES = ('background', 'vessel')$/;" v class:ChaseDB1Dataset +CLASSES .\mmseg\datasets\cityscapes.py /^ CLASSES = ('road', 'sidewalk', 'building', 'wall', 'fence', 'pole',$/;" v class:CityscapesDataset +CLASSES .\mmseg\datasets\custom.py /^ CLASSES = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,$/;" v class:CustomDataset +CLASSES .\mmseg\datasets\drive.py /^ CLASSES = ('background', 'vessel')$/;" v class:DRIVEDataset +CLASSES .\mmseg\datasets\hrf.py /^ CLASSES = ('background', 'vessel')$/;" v class:HRFDataset +CLASSES .\mmseg\datasets\pascal_context.py /^ CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle',$/;" v class:PascalContextDataset +CLASSES .\mmseg\datasets\stare.py /^ CLASSES = ('background', 'vessel')$/;" v class:STAREDataset +CLASSES .\mmseg\datasets\voc.py /^ CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle',$/;" v class:PascalVOCDataset +CSEval .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa$/;" i +CSLabels .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +CSLabels .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +CascadeEncoderDecoder .\mmseg\models\segmentors\__init__.py /^from .cascade_encoder_decoder import CascadeEncoderDecoder$/;" i +CascadeEncoderDecoder .\mmseg\models\segmentors\cascade_encoder_decoder.py /^class CascadeEncoderDecoder(EncoderDecoder):$/;" c +ChaseDB1Dataset .\mmseg\datasets\__init__.py /^from .chase_db1 import ChaseDB1Dataset$/;" i +ChaseDB1Dataset .\mmseg\datasets\chase_db1.py /^class ChaseDB1Dataset(CustomDataset):$/;" c +CityscapesDataset .\mmseg\datasets\__init__.py /^from .cityscapes import CityscapesDataset$/;" i +CityscapesDataset .\mmseg\datasets\cityscapes.py /^class CityscapesDataset(CustomDataset):$/;" c +CityscapesDataset .\tests\test_data\test_dataset.py /^from mmseg.datasets import (DATASETS, ADE20KDataset, CityscapesDataset,$/;" i +Collect .\mmseg\datasets\pipelines\__init__.py /^from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor,$/;" i +Collect .\mmseg\datasets\pipelines\formating.py /^class Collect(object):$/;" c +Compose .\mmseg\apis\inference.py /^from mmseg.datasets.pipelines import Compose$/;" i +Compose .\mmseg\datasets\custom.py /^from .pipelines import Compose$/;" i +Compose .\mmseg\datasets\pipelines\__init__.py /^from .compose import Compose$/;" i +Compose .\mmseg\datasets\pipelines\compose.py /^class Compose(object):$/;" c +Compose .\mmseg\datasets\pipelines\test_time_aug.py /^from .compose import Compose$/;" i +Compose .\tests\test_config.py /^ from mmseg.datasets.pipelines import Compose$/;" i +ConcatDataset .\mmseg\datasets\__init__.py /^from .dataset_wrappers import ConcatDataset, RepeatDataset$/;" i +ConcatDataset .\mmseg\datasets\builder.py /^ from .dataset_wrappers import ConcatDataset$/;" i +ConcatDataset .\mmseg\datasets\builder.py /^ from .dataset_wrappers import ConcatDataset, RepeatDataset$/;" i +ConcatDataset .\mmseg\datasets\dataset_wrappers.py /^class ConcatDataset(_ConcatDataset):$/;" c +ConcatDataset .\tests\test_data\test_dataset_builder.py /^from mmseg.datasets import (DATASETS, ConcatDataset, build_dataloader,$/;" i +Config .\tests\test_config.py /^ from mmcv import Config$/;" i +Config .\tests\test_config.py /^from mmcv import Config$/;" i +Config .\tests\test_models\test_forward.py /^ from mmcv import Config$/;" i +Config .\tools\benchmark.py /^from mmcv import Config$/;" i +Config .\tools\get_flops.py /^from mmcv import Config$/;" i +Config .\tools\print_config.py /^from mmcv import Config, DictAction$/;" i +Config .\tools\train.py /^from mmcv.utils import Config, DictAction, get_git_hash$/;" i +ConfigDict .\tests\test_models\test_heads.py /^from mmcv.utils import ConfigDict$/;" i +ConfigDict .\tests\test_models\test_segmentor.py /^from mmcv import ConfigDict$/;" i +ContextBlock .\mmseg\models\decode_heads\gc_head.py /^from mmcv.cnn import ContextBlock$/;" i +ContextGuidedBlock .\mmseg\models\backbones\cgnet.py /^class ContextGuidedBlock(nn.Module):$/;" c +ContextGuidedBlock .\tests\test_models\test_backbone.py /^from mmseg.models.backbones.cgnet import (ContextGuidedBlock,$/;" i +Conv2dAdaptivePadding .\mmseg\models\backbones\mobilenet_v3.py /^from mmcv.cnn.bricks import Conv2dAdaptivePadding$/;" i +ConvModule .\mmseg\models\backbones\cgnet.py /^from mmcv.cnn import (ConvModule, build_conv_layer, build_norm_layer,$/;" i +ConvModule .\mmseg\models\backbones\fast_scnn.py /^from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, constant_init,$/;" i +ConvModule .\mmseg\models\backbones\mobilenet_v2.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +ConvModule .\mmseg\models\backbones\mobilenet_v3.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +ConvModule .\mmseg\models\backbones\unet.py /^from mmcv.cnn import (UPSAMPLE_LAYERS, ConvModule, build_activation_layer,$/;" i +ConvModule .\mmseg\models\decode_heads\ann_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\apc_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\aspp_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\da_head.py /^from mmcv.cnn import ConvModule, Scale$/;" i +ConvModule .\mmseg\models\decode_heads\dm_head.py /^from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer$/;" i +ConvModule .\mmseg\models\decode_heads\ema_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\enc_head.py /^from mmcv.cnn import ConvModule, build_norm_layer$/;" i +ConvModule .\mmseg\models\decode_heads\fcn_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\fpn_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\lraspp_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\ocr_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\point_head.py /^from mmcv.cnn import ConvModule, normal_init$/;" i +ConvModule .\mmseg\models\decode_heads\psa_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\psp_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\sep_aspp_head.py /^from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule$/;" i +ConvModule .\mmseg\models\decode_heads\uper_head.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\necks\fpn.py /^from mmcv.cnn import ConvModule, xavier_init$/;" i +ConvModule .\mmseg\models\utils\inverted_residual.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\utils\se_layer.py /^from mmcv.cnn import ConvModule$/;" i +ConvModule .\mmseg\models\utils\self_attention_block.py /^from mmcv.cnn import ConvModule, constant_init$/;" i +ConvModule .\mmseg\models\utils\up_conv_block.py /^from mmcv.cnn import ConvModule, build_upsample_layer$/;" i +ConvModule .\tests\test_models\test_heads.py /^from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule$/;" i +ConvModule .\tests\test_models\test_unet.py /^from mmcv.cnn import ConvModule$/;" i +Conv_MLA .\mmseg\models\backbones\vit_mla.py /^class Conv_MLA(nn.Module):$/;" c +CrissCrossAttention .\mmseg\models\decode_heads\cc_head.py /^ CrissCrossAttention = None$/;" v +CrissCrossAttention .\mmseg\models\decode_heads\cc_head.py /^ from mmcv.ops import CrissCrossAttention$/;" i +CrossEntropyLoss .\mmseg\models\losses\__init__.py /^from .cross_entropy_loss import (CrossEntropyLoss, binary_cross_entropy,$/;" i +CrossEntropyLoss .\mmseg\models\losses\cross_entropy_loss.py /^class CrossEntropyLoss(nn.Module):$/;" c +CustomDataset .\mmseg\datasets\__init__.py /^from .custom import CustomDataset$/;" i +CustomDataset .\mmseg\datasets\ade.py /^from .custom import CustomDataset$/;" i +CustomDataset .\mmseg\datasets\chase_db1.py /^from .custom import CustomDataset$/;" i +CustomDataset .\mmseg\datasets\cityscapes.py /^from .custom import CustomDataset$/;" i +CustomDataset .\mmseg\datasets\custom.py /^class CustomDataset(Dataset):$/;" c +CustomDataset .\mmseg\datasets\drive.py /^from .custom import CustomDataset$/;" i +CustomDataset .\mmseg\datasets\hrf.py /^from .custom import CustomDataset$/;" i +CustomDataset .\mmseg\datasets\pascal_context.py /^from .custom import CustomDataset$/;" i +CustomDataset .\mmseg\datasets\stare.py /^from .custom import CustomDataset$/;" i +CustomDataset .\mmseg\datasets\voc.py /^from .custom import CustomDataset$/;" i +DAHead .\mmseg\models\decode_heads\__init__.py /^from .da_head import DAHead$/;" i +DAHead .\mmseg\models\decode_heads\da_head.py /^class DAHead(BaseDecodeHead):$/;" c +DATASETS .\mmseg\datasets\__init__.py /^from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset$/;" i +DATASETS .\mmseg\datasets\ade.py /^from .builder import DATASETS$/;" i +DATASETS .\mmseg\datasets\builder.py /^DATASETS = Registry('dataset')$/;" v +DATASETS .\mmseg\datasets\chase_db1.py /^from .builder import DATASETS$/;" i +DATASETS .\mmseg\datasets\cityscapes.py /^from .builder import DATASETS$/;" i +DATASETS .\mmseg\datasets\custom.py /^from .builder import DATASETS$/;" i +DATASETS .\mmseg\datasets\dataset_wrappers.py /^from .builder import DATASETS$/;" i +DATASETS .\mmseg\datasets\drive.py /^from .builder import DATASETS$/;" i +DATASETS .\mmseg\datasets\hrf.py /^from .builder import DATASETS$/;" i +DATASETS .\mmseg\datasets\pascal_context.py /^from .builder import DATASETS$/;" i +DATASETS .\mmseg\datasets\stare.py /^from .builder import DATASETS$/;" i +DATASETS .\mmseg\datasets\voc.py /^from .builder import DATASETS$/;" i +DATASETS .\tests\test_data\test_dataset.py /^from mmseg.datasets import (DATASETS, ADE20KDataset, CityscapesDataset,$/;" i +DATASETS .\tests\test_data\test_dataset_builder.py /^from mmseg.datasets import (DATASETS, ConcatDataset, build_dataloader,$/;" i +DC .\mmseg\datasets\pipelines\formating.py /^from mmcv.parallel import DataContainer as DC$/;" i +DCM .\mmseg\models\decode_heads\dm_head.py /^class DCM(nn.Module):$/;" c +DMHead .\mmseg\models\decode_heads\__init__.py /^from .dm_head import DMHead$/;" i +DMHead .\mmseg\models\decode_heads\dm_head.py /^class DMHead(BaseDecodeHead):$/;" c +DNLHead .\mmseg\models\decode_heads\__init__.py /^from .dnl_head import DNLHead$/;" i +DNLHead .\mmseg\models\decode_heads\dnl_head.py /^class DNLHead(FCNHead):$/;" c +DRIVEDataset .\mmseg\datasets\__init__.py /^from .drive import DRIVEDataset$/;" i +DRIVEDataset .\mmseg\datasets\drive.py /^class DRIVEDataset(CustomDataset):$/;" c +DataLoader .\mmseg\core\evaluation\eval_hooks.py /^from torch.utils.data import DataLoader$/;" i +DataLoader .\mmseg\datasets\builder.py /^from mmcv.utils.parrots_wrapper import DataLoader, PoolDataLoader$/;" i +DataLoader .\tests\test_eval_hook.py /^from torch.utils.data import DataLoader, Dataset$/;" i +Dataset .\mmseg\datasets\custom.py /^from torch.utils.data import Dataset$/;" i +Dataset .\tests\test_eval_hook.py /^from torch.utils.data import DataLoader, Dataset$/;" i +DeconvModule .\mmseg\models\backbones\unet.py /^class DeconvModule(nn.Module):$/;" c +DeconvModule .\tests\test_models\test_unet.py /^from mmseg.models.backbones.unet import (BasicConvBlock, DeconvModule,$/;" i +DefaultFormatBundle .\mmseg\datasets\pipelines\formating.py /^class DefaultFormatBundle(object):$/;" c +DeformConv2dPack .\tests\test_models\test_backbone.py /^from mmcv.ops import DeformConv2dPack$/;" i +DepthwiseSeparableASPPHead .\mmseg\models\decode_heads\__init__.py /^from .sep_aspp_head import DepthwiseSeparableASPPHead$/;" i +DepthwiseSeparableASPPHead .\mmseg\models\decode_heads\sep_aspp_head.py /^class DepthwiseSeparableASPPHead(ASPPHead):$/;" c +DepthwiseSeparableASPPModule .\mmseg\models\decode_heads\sep_aspp_head.py /^class DepthwiseSeparableASPPModule(ASPPModule):$/;" c +DepthwiseSeparableConvModule .\mmseg\models\backbones\fast_scnn.py /^from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, constant_init,$/;" i +DepthwiseSeparableConvModule .\mmseg\models\decode_heads\sep_aspp_head.py /^from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule$/;" i +DepthwiseSeparableConvModule .\mmseg\models\decode_heads\sep_fcn_head.py /^from mmcv.cnn import DepthwiseSeparableConvModule$/;" i +DepthwiseSeparableConvModule .\tests\test_models\test_heads.py /^from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule$/;" i +DepthwiseSeparableFCNHead .\mmseg\models\decode_heads\__init__.py /^from .sep_fcn_head import DepthwiseSeparableFCNHead$/;" i +DepthwiseSeparableFCNHead .\mmseg\models\decode_heads\sep_fcn_head.py /^class DepthwiseSeparableFCNHead(FCNHead):$/;" c +Detail .\tools\convert_datasets\pascal_context.py /^from detail import Detail$/;" i +DictAction .\tools\print_config.py /^from mmcv import Config, DictAction$/;" i +DictAction .\tools\test.py /^from mmcv.utils import DictAction$/;" i +DictAction .\tools\train.py /^from mmcv.utils import Config, DictAction, get_git_hash$/;" i +DisentangledNonLocal2d .\mmseg\models\decode_heads\dnl_head.py /^class DisentangledNonLocal2d(NonLocal2d):$/;" c +DistEvalHook .\mmseg\apis\train.py /^from mmseg.core import DistEvalHook, EvalHook$/;" i +DistEvalHook .\mmseg\core\evaluation\__init__.py /^from .eval_hooks import DistEvalHook, EvalHook$/;" i +DistEvalHook .\mmseg\core\evaluation\eval_hooks.py /^class DistEvalHook(EvalHook):$/;" c +DistEvalHook .\tests\test_eval_hook.py /^from mmseg.core import DistEvalHook, EvalHook$/;" i +DistributedSampler .\mmseg\datasets\builder.py /^from torch.utils.data import DistributedSampler$/;" i +DistributedSampler .\tests\test_data\test_dataset_builder.py /^from torch.utils.data import (DistributedSampler, RandomSampler,$/;" i +DropBlock2d .\mmseg\models\backbones\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +DropBlock2d .\mmseg\models\backbones\layers\drop.py /^class DropBlock2d(nn.Module):$/;" c +DropBlock2d .\mmseg\models\decode_heads\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +DropBlock2d .\mmseg\models\decode_heads\layers\drop.py /^class DropBlock2d(nn.Module):$/;" c +DropPath .\mmseg\models\backbones\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +DropPath .\mmseg\models\backbones\layers\drop.py /^class DropPath(nn.Module):$/;" c +DropPath .\mmseg\models\backbones\pvt.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +DropPath .\mmseg\models\backbones\pvt_dia.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +DropPath .\mmseg\models\backbones\vit.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +DropPath .\mmseg\models\backbones\vit_mla.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +DropPath .\mmseg\models\decode_heads\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +DropPath .\mmseg\models\decode_heads\layers\drop.py /^class DropPath(nn.Module):$/;" c +DropPath .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +DropPath .\mmseg\models\decode_heads\vit_mla_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +DropPath .\mmseg\models\decode_heads\vit_up_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +EMAHead .\mmseg\models\decode_heads\__init__.py /^from .ema_head import EMAHead$/;" i +EMAHead .\mmseg\models\decode_heads\ema_head.py /^class EMAHead(BaseDecodeHead):$/;" c +EMAModule .\mmseg\models\decode_heads\ema_head.py /^class EMAModule(nn.Module):$/;" c +ENDPOINT .\.dev\upload_modelzoo.py /^ENDPOINT = 'https:\/\/oss-accelerate.aliyuncs.com'$/;" v +EncHead .\mmseg\models\decode_heads\__init__.py /^from .enc_head import EncHead$/;" i +EncHead .\mmseg\models\decode_heads\enc_head.py /^class EncHead(BaseDecodeHead):$/;" c +EncModule .\mmseg\models\decode_heads\enc_head.py /^class EncModule(nn.Module):$/;" c +EncoderDecoder .\mmseg\models\segmentors\__init__.py /^from .encoder_decoder import EncoderDecoder$/;" i +EncoderDecoder .\mmseg\models\segmentors\cascade_encoder_decoder.py /^from .encoder_decoder import EncoderDecoder$/;" i +EncoderDecoder .\mmseg\models\segmentors\encoder_decoder.py /^class EncoderDecoder(BaseSegmentor):$/;" c +Encoding .\mmseg\models\decode_heads\enc_head.py /^from mmseg.ops import Encoding, resize$/;" i +Encoding .\mmseg\ops\__init__.py /^from .encoding import Encoding$/;" i +Encoding .\mmseg\ops\encoding.py /^class Encoding(nn.Module):$/;" c +EvalHook .\mmseg\apis\train.py /^from mmseg.core import DistEvalHook, EvalHook$/;" i +EvalHook .\mmseg\core\evaluation\__init__.py /^from .eval_hooks import DistEvalHook, EvalHook$/;" i +EvalHook .\mmseg\core\evaluation\eval_hooks.py /^class EvalHook(Hook):$/;" c +EvalHook .\tests\test_eval_hook.py /^from mmseg.core import DistEvalHook, EvalHook$/;" i +ExampleBackbone .\tests\test_models\test_segmentor.py /^class ExampleBackbone(nn.Module):$/;" c +ExampleCascadeDecodeHead .\tests\test_models\test_segmentor.py /^class ExampleCascadeDecodeHead(BaseCascadeDecodeHead):$/;" c +ExampleDataset .\tests\test_eval_hook.py /^class ExampleDataset(Dataset):$/;" c +ExampleDecodeHead .\tests\test_models\test_segmentor.py /^class ExampleDecodeHead(BaseDecodeHead):$/;" c +ExampleModel .\tests\test_eval_hook.py /^class ExampleModel(nn.Module):$/;" c +F .\mmseg\core\seg\sampler\ohem_pixel_sampler.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\backbones\helpers.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\backbones\layers\drop.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\backbones\pvt.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\backbones\pvt_dia.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\backbones\resnest.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\backbones\vit.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\backbones\vit_mla.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\apc_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\da_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\dm_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\ema_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\enc_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\helpers.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\layers\drop.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\ocr_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\psa_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\decode_heads\vit_up_head.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\losses\cross_entropy_loss.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\losses\lovasz_loss.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\losses\utils.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\necks\fpn.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\segmentors\encoder_decoder.py /^import torch.nn.functional as F$/;" i +F .\mmseg\models\utils\self_attention_block.py /^from torch.nn import functional as F$/;" i +F .\mmseg\ops\encoding.py /^from torch.nn import functional as F$/;" i +F .\mmseg\ops\wrappers.py /^import torch.nn.functional as F$/;" i +F401 .\mmseg\core\__init__.py /^from .evaluation import * # noqa: F401, F403$/;" i +F401 .\mmseg\core\__init__.py /^from .seg import * # noqa: F401, F403$/;" i +F401 .\mmseg\core\__init__.py /^from .utils import * # noqa: F401, F403$/;" i +F401 .\mmseg\models\__init__.py /^from .backbones import * # noqa: F401,F403$/;" i +F401 .\mmseg\models\__init__.py /^from .decode_heads import * # noqa: F401,F403$/;" i +F401 .\mmseg\models\__init__.py /^from .losses import * # noqa: F401,F403$/;" i +F401 .\mmseg\models\__init__.py /^from .necks import * # noqa: F401,F403$/;" i +F401 .\mmseg\models\__init__.py /^from .segmentors import * # noqa: F401,F403$/;" i +F401 .\mmseg\models\backbones\helpers.py /^from urllib.parse import urlparse # noqa: F401$/;" i +F403 .\mmseg\core\__init__.py /^from .evaluation import * # noqa: F401, F403$/;" i +F403 .\mmseg\core\__init__.py /^from .seg import * # noqa: F401, F403$/;" i +F403 .\mmseg\core\__init__.py /^from .utils import * # noqa: F401, F403$/;" i +F403 .\mmseg\models\__init__.py /^from .backbones import * # noqa: F401,F403$/;" i +F403 .\mmseg\models\__init__.py /^from .decode_heads import * # noqa: F401,F403$/;" i +F403 .\mmseg\models\__init__.py /^from .losses import * # noqa: F401,F403$/;" i +F403 .\mmseg\models\__init__.py /^from .necks import * # noqa: F401,F403$/;" i +F403 .\mmseg\models\__init__.py /^from .segmentors import * # noqa: F401,F403$/;" i +FCNHead .\mmseg\models\decode_heads\__init__.py /^from .fcn_head import FCNHead$/;" i +FCNHead .\mmseg\models\decode_heads\cc_head.py /^from .fcn_head import FCNHead$/;" i +FCNHead .\mmseg\models\decode_heads\dnl_head.py /^from .fcn_head import FCNHead$/;" i +FCNHead .\mmseg\models\decode_heads\fcn_head.py /^class FCNHead(BaseDecodeHead):$/;" c +FCNHead .\mmseg\models\decode_heads\gc_head.py /^from .fcn_head import FCNHead$/;" i +FCNHead .\mmseg\models\decode_heads\nl_head.py /^from .fcn_head import FCNHead$/;" i +FCNHead .\mmseg\models\decode_heads\sep_fcn_head.py /^from .fcn_head import FCNHead$/;" i +FCNHead .\tests\test_sampler.py /^from mmseg.models.decode_heads import FCNHead$/;" i +FPN .\mmseg\models\necks\__init__.py /^from .fpn import FPN$/;" i +FPN .\mmseg\models\necks\fpn.py /^class FPN(nn.Module):$/;" c +FPN .\tests\test_models\test_necks.py /^from mmseg.models import FPN$/;" i +FPNHead .\mmseg\models\decode_heads\__init__.py /^from .fpn_head import FPNHead$/;" i +FPNHead .\mmseg\models\decode_heads\fpn_head.py /^class FPNHead(BaseDecodeHead):$/;" c +FastSCNN .\mmseg\models\backbones\__init__.py /^from .fast_scnn import FastSCNN$/;" i +FastSCNN .\mmseg\models\backbones\fast_scnn.py /^class FastSCNN(nn.Module):$/;" c +FastSCNN .\tests\test_models\test_backbone.py /^from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt,$/;" i +FeatureFusionModule .\mmseg\models\backbones\fast_scnn.py /^class FeatureFusionModule(nn.Module):$/;" c +GCHead .\mmseg\models\decode_heads\__init__.py /^from .gc_head import GCHead$/;" i +GCHead .\mmseg\models\decode_heads\gc_head.py /^class GCHead(FCNHead):$/;" c +GlobalContextExtractor .\mmseg\models\backbones\cgnet.py /^class GlobalContextExtractor(nn.Module):$/;" c +GlobalFeatureExtractor .\mmseg\models\backbones\fast_scnn.py /^class GlobalFeatureExtractor(nn.Module):$/;" c +GroupNorm .\tests\test_models\test_backbone.py /^from torch.nn.modules import AvgPool2d, GroupNorm$/;" i +HASH_REGEX .\mmseg\models\backbones\helpers.py /^HASH_REGEX = re.compile(r'-([a-f0-9]*)\\.')$/;" v +HEADS .\mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +HEADS .\mmseg\models\builder.py /^HEADS = Registry('head')$/;" v +HEADS .\mmseg\models\decode_heads\ann_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\apc_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\aspp_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\cc_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\da_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\dm_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\dnl_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\ema_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\enc_head.py /^from ..builder import HEADS, build_loss$/;" i +HEADS .\mmseg\models\decode_heads\fcn_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\fpn_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\gc_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\lraspp_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\nl_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\ocr_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\point_head.py /^from mmseg.models.builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\psa_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\psp_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\sep_aspp_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\sep_fcn_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\uper_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\vit_mla_head.py /^from ..builder import HEADS$/;" i +HEADS .\mmseg\models\decode_heads\vit_up_head.py /^from ..builder import HEADS$/;" i +HEADS .\tests\test_models\test_segmentor.py /^from mmseg.models import BACKBONES, HEADS, build_segmentor$/;" i +HRFDataset .\mmseg\datasets\__init__.py /^from .hrf import HRFDataset$/;" i +HRFDataset .\mmseg\datasets\hrf.py /^class HRFDataset(CustomDataset):$/;" c +HRF_LEN .\tools\convert_datasets\hrf.py /^HRF_LEN = 15$/;" v +HRModule .\mmseg\models\backbones\hrnet.py /^class HRModule(nn.Module):$/;" c +HRNet .\mmseg\models\backbones\__init__.py /^from .hrnet import HRNet$/;" i +HRNet .\mmseg\models\backbones\hrnet.py /^class HRNet(nn.Module):$/;" c +Hook .\mmseg\core\evaluation\eval_hooks.py /^from mmcv.runner import Hook$/;" i +HybridEmbed .\mmseg\models\backbones\vit.py /^class HybridEmbed(nn.Module):$/;" c +HybridEmbed .\mmseg\models\backbones\vit_mla.py /^class HybridEmbed(nn.Module):$/;" c +Image .\mmseg\datasets\cityscapes.py /^from PIL import Image$/;" i +Image .\tests\test_data\test_transform.py /^from PIL import Image$/;" i +Image .\tools\convert_datasets\pascal_context.py /^from PIL import Image$/;" i +Image .\tools\convert_datasets\voc_aug.py /^from PIL import Image$/;" i +ImageToTensor .\mmseg\datasets\pipelines\__init__.py /^from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor,$/;" i +ImageToTensor .\mmseg\datasets\pipelines\formating.py /^class ImageToTensor(object):$/;" c +InputInjection .\mmseg\models\backbones\cgnet.py /^class InputInjection(nn.Module):$/;" c +InterpConv .\mmseg\models\backbones\unet.py /^class InterpConv(nn.Module):$/;" c +InvertedResidual .\mmseg\models\backbones\fast_scnn.py /^from ..utils.inverted_residual import InvertedResidual$/;" i +InvertedResidual .\mmseg\models\backbones\mobilenet_v2.py /^from ..utils import InvertedResidual, make_divisible$/;" i +InvertedResidual .\mmseg\models\backbones\mobilenet_v3.py /^from ..utils import InvertedResidualV3 as InvertedResidual$/;" i +InvertedResidual .\mmseg\models\utils\__init__.py /^from .inverted_residual import InvertedResidual, InvertedResidualV3$/;" i +InvertedResidual .\mmseg\models\utils\inverted_residual.py /^class InvertedResidual(nn.Module):$/;" c +InvertedResidual .\tests\test_utils\test_inverted_residual_module.py /^from mmseg.models.utils import InvertedResidual, InvertedResidualV3$/;" i +InvertedResidualV3 .\mmseg\models\utils\__init__.py /^from .inverted_residual import InvertedResidual, InvertedResidualV3$/;" i +InvertedResidualV3 .\mmseg\models\utils\inverted_residual.py /^class InvertedResidualV3(nn.Module):$/;" c +InvertedResidualV3 .\tests\test_utils\test_inverted_residual_module.py /^from mmseg.models.utils import InvertedResidual, InvertedResidualV3$/;" i +LOSSES .\mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +LOSSES .\mmseg\models\builder.py /^LOSSES = Registry('loss')$/;" v +LOSSES .\mmseg\models\losses\cross_entropy_loss.py /^from ..builder import LOSSES$/;" i +LOSSES .\mmseg\models\losses\lovasz_loss.py /^from ..builder import LOSSES$/;" i +LRASPPHead .\mmseg\models\decode_heads\__init__.py /^from .lraspp_head import LRASPPHead$/;" i +LRASPPHead .\mmseg\models\decode_heads\lraspp_head.py /^class LRASPPHead(BaseDecodeHead):$/;" c +LearningToDownsample .\mmseg\models\backbones\fast_scnn.py /^class LearningToDownsample(nn.Module):$/;" c +LoadAnnotations .\mmseg\datasets\pipelines\__init__.py /^from .loading import LoadAnnotations, LoadImageFromFile$/;" i +LoadAnnotations .\mmseg\datasets\pipelines\loading.py /^class LoadAnnotations(object):$/;" c +LoadAnnotations .\tests\test_data\test_loading.py /^from mmseg.datasets.pipelines import LoadAnnotations, LoadImageFromFile$/;" i +LoadImage .\mmseg\apis\inference.py /^class LoadImage:$/;" c +LoadImageFromFile .\mmseg\datasets\pipelines\__init__.py /^from .loading import LoadAnnotations, LoadImageFromFile$/;" i +LoadImageFromFile .\mmseg\datasets\pipelines\loading.py /^class LoadImageFromFile(object):$/;" c +LoadImageFromFile .\tests\test_data\test_loading.py /^from mmseg.datasets.pipelines import LoadAnnotations, LoadImageFromFile$/;" i +LovaszLoss .\mmseg\models\losses\__init__.py /^from .lovasz_loss import LovaszLoss$/;" i +LovaszLoss .\mmseg\models\losses\lovasz_loss.py /^class LovaszLoss(nn.Module):$/;" c +MLAHead .\mmseg\models\decode_heads\vit_mla_head.py /^class MLAHead(nn.Module):$/;" c +MMCV_MAX .\mmseg\__init__.py /^MMCV_MAX = '1.3.0'$/;" v +MMCV_MIN .\mmseg\__init__.py /^MMCV_MIN = '1.1.4'$/;" v +MMDataParallel .\mmseg\apis\train.py /^from mmcv.parallel import MMDataParallel, MMDistributedDataParallel$/;" i +MMDataParallel .\tools\benchmark.py /^from mmcv.parallel import MMDataParallel$/;" i +MMDataParallel .\tools\test.py /^from mmcv.parallel import MMDataParallel, MMDistributedDataParallel$/;" i +MMDistributedDataParallel .\mmseg\apis\train.py /^from mmcv.parallel import MMDataParallel, MMDistributedDataParallel$/;" i +MMDistributedDataParallel .\tools\test.py /^from mmcv.parallel import MMDataParallel, MMDistributedDataParallel$/;" i +MagicMock .\tests\test_data\test_dataset.py /^from unittest.mock import MagicMock, patch$/;" i +MagicMock .\tests\test_eval_hook.py /^from unittest.mock import MagicMock, patch$/;" i +Mlp .\mmseg\models\backbones\pvt.py /^class Mlp(nn.Module):$/;" c +Mlp .\mmseg\models\backbones\pvt_dia.py /^class Mlp(nn.Module):$/;" c +Mlp .\mmseg\models\backbones\vit.py /^class Mlp(nn.Module):$/;" c +Mlp .\mmseg\models\backbones\vit_mla.py /^class Mlp(nn.Module):$/;" c +MobileNetV2 .\mmseg\models\backbones\__init__.py /^from .mobilenet_v2 import MobileNetV2$/;" i +MobileNetV2 .\mmseg\models\backbones\mobilenet_v2.py /^class MobileNetV2(nn.Module):$/;" c +MobileNetV3 .\mmseg\models\backbones\__init__.py /^from .mobilenet_v3 import MobileNetV3$/;" i +MobileNetV3 .\mmseg\models\backbones\mobilenet_v3.py /^class MobileNetV3(nn.Module):$/;" c +MobileNetV3 .\tests\test_models\test_backbone.py /^from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt,$/;" i +MultiScaleFlipAug .\mmseg\datasets\pipelines\__init__.py /^from .test_time_aug import MultiScaleFlipAug$/;" i +MultiScaleFlipAug .\mmseg\datasets\pipelines\test_time_aug.py /^class MultiScaleFlipAug(object):$/;" c +NECKS .\mmseg\models\builder.py /^NECKS = Registry('neck')$/;" v +NECKS .\mmseg\models\necks\fpn.py /^from ..builder import NECKS$/;" i +NLHead .\mmseg\models\decode_heads\__init__.py /^from .nl_head import NLHead$/;" i +NLHead .\mmseg\models\decode_heads\nl_head.py /^class NLHead(FCNHead):$/;" c +NonLocal2d .\mmseg\models\decode_heads\dnl_head.py /^from mmcv.cnn import NonLocal2d$/;" i +NonLocal2d .\mmseg\models\decode_heads\nl_head.py /^from mmcv.cnn import NonLocal2d$/;" i +Normalize .\mmseg\datasets\pipelines\__init__.py /^from .transforms import (CLAHE, AdjustGamma, Normalize, Pad,$/;" i +Normalize .\mmseg\datasets\pipelines\transforms.py /^class Normalize(object):$/;" c +OCRHead .\mmseg\models\decode_heads\__init__.py /^from .ocr_head import OCRHead$/;" i +OCRHead .\mmseg\models\decode_heads\ocr_head.py /^class OCRHead(BaseCascadeDecodeHead):$/;" c +OHEMPixelSampler .\mmseg\core\seg\__init__.py /^from .sampler import BasePixelSampler, OHEMPixelSampler$/;" i +OHEMPixelSampler .\mmseg\core\seg\sampler\__init__.py /^from .ohem_pixel_sampler import OHEMPixelSampler$/;" i +OHEMPixelSampler .\mmseg\core\seg\sampler\ohem_pixel_sampler.py /^class OHEMPixelSampler(BasePixelSampler):$/;" c +OHEMPixelSampler .\tests\test_sampler.py /^from mmseg.core import OHEMPixelSampler$/;" i +ObjectAttentionBlock .\mmseg\models\decode_heads\ocr_head.py /^class ObjectAttentionBlock(_SelfAttentionBlock):$/;" c +OrderedDict .\mmseg\models\segmentors\base.py /^from collections import OrderedDict$/;" i +PALETTE .\mmseg\datasets\ade.py /^ PALETTE = [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50],$/;" v class:ADE20KDataset +PALETTE .\mmseg\datasets\chase_db1.py /^ PALETTE = [[120, 120, 120], [6, 230, 230]]$/;" v class:ChaseDB1Dataset +PALETTE .\mmseg\datasets\cityscapes.py /^ PALETTE = [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156],$/;" v class:CityscapesDataset +PALETTE .\mmseg\datasets\custom.py /^ PALETTE = [[0, 0, 0], [40, 100, 150], [80, 150, 200], [120, 200, 10], [160, 10, 60],$/;" v class:CustomDataset +PALETTE .\mmseg\datasets\drive.py /^ PALETTE = [[120, 120, 120], [6, 230, 230]]$/;" v class:DRIVEDataset +PALETTE .\mmseg\datasets\hrf.py /^ PALETTE = [[120, 120, 120], [6, 230, 230]]$/;" v class:HRFDataset +PALETTE .\mmseg\datasets\pascal_context.py /^ PALETTE = [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50],$/;" v class:PascalContextDataset +PALETTE .\mmseg\datasets\stare.py /^ PALETTE = [[120, 120, 120], [6, 230, 230]]$/;" v class:STAREDataset +PALETTE .\mmseg\datasets\voc.py /^ PALETTE = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128],$/;" v class:PascalVOCDataset +PAM .\mmseg\models\decode_heads\da_head.py /^class PAM(_SelfAttentionBlock):$/;" c +PIPELINES .\mmseg\datasets\__init__.py /^from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset$/;" i +PIPELINES .\mmseg\datasets\builder.py /^PIPELINES = Registry('pipeline')$/;" v +PIPELINES .\mmseg\datasets\pipelines\compose.py /^from ..builder import PIPELINES$/;" i +PIPELINES .\mmseg\datasets\pipelines\formating.py /^from ..builder import PIPELINES$/;" i +PIPELINES .\mmseg\datasets\pipelines\loading.py /^from ..builder import PIPELINES$/;" i +PIPELINES .\mmseg\datasets\pipelines\test_time_aug.py /^from ..builder import PIPELINES$/;" i +PIPELINES .\mmseg\datasets\pipelines\transforms.py /^from ..builder import PIPELINES$/;" i +PIPELINES .\tests\test_data\test_transform.py /^from mmseg.datasets.builder import PIPELINES$/;" i +PIPELINES .\tests\test_data\test_tta.py /^from mmseg.datasets.builder import PIPELINES$/;" i +PIXEL_SAMPLERS .\mmseg\core\seg\builder.py /^PIXEL_SAMPLERS = Registry('pixel sampler')$/;" v +PIXEL_SAMPLERS .\mmseg\core\seg\sampler\ohem_pixel_sampler.py /^from ..builder import PIXEL_SAMPLERS$/;" i +PPM .\mmseg\models\backbones\fast_scnn.py /^from mmseg.models.decode_heads.psp_head import PPM$/;" i +PPM .\mmseg\models\decode_heads\psp_head.py /^class PPM(nn.ModuleList):$/;" c +PPM .\mmseg\models\decode_heads\uper_head.py /^from .psp_head import PPM$/;" i +PPMConcat .\mmseg\models\decode_heads\ann_head.py /^class PPMConcat(nn.ModuleList):$/;" c +PSAHead .\mmseg\models\decode_heads\__init__.py /^from .psa_head import PSAHead$/;" i +PSAHead .\mmseg\models\decode_heads\psa_head.py /^class PSAHead(BaseDecodeHead):$/;" c +PSAMask .\mmseg\models\decode_heads\psa_head.py /^ PSAMask = None$/;" v +PSAMask .\mmseg\models\decode_heads\psa_head.py /^ from mmcv.ops import PSAMask$/;" i +PSPHead .\mmseg\models\decode_heads\__init__.py /^from .psp_head import PSPHead$/;" i +PSPHead .\mmseg\models\decode_heads\psp_head.py /^class PSPHead(BaseDecodeHead):$/;" c +Pad .\mmseg\datasets\pipelines\__init__.py /^from .transforms import (CLAHE, AdjustGamma, Normalize, Pad,$/;" i +Pad .\mmseg\datasets\pipelines\transforms.py /^class Pad(object):$/;" c +PascalContextDataset .\mmseg\datasets\__init__.py /^from .pascal_context import PascalContextDataset$/;" i +PascalContextDataset .\mmseg\datasets\pascal_context.py /^class PascalContextDataset(CustomDataset):$/;" c +PascalVOCDataset .\mmseg\datasets\__init__.py /^from .voc import PascalVOCDataset$/;" i +PascalVOCDataset .\mmseg\datasets\voc.py /^class PascalVOCDataset(CustomDataset):$/;" c +PatchEmbed .\mmseg\models\backbones\pvt.py /^class PatchEmbed(nn.Module):$/;" c +PatchEmbed .\mmseg\models\backbones\pvt_dia.py /^class PatchEmbed(nn.Module):$/;" c +PatchEmbed .\mmseg\models\backbones\vit.py /^class PatchEmbed(nn.Module):$/;" c +PatchEmbed .\mmseg\models\backbones\vit_mla.py /^class PatchEmbed(nn.Module):$/;" c +PhotoMetricDistortion .\mmseg\datasets\pipelines\transforms.py /^class PhotoMetricDistortion(object):$/;" c +PointHead .\mmseg\models\decode_heads\__init__.py /^from .point_head import PointHead$/;" i +PointHead .\mmseg\models\decode_heads\point_head.py /^class PointHead(BaseCascadeDecodeHead):$/;" c +PoolDataLoader .\mmseg\datasets\builder.py /^from mmcv.utils.parrots_wrapper import DataLoader, PoolDataLoader$/;" i +PyramidVisionTransformer .\mmseg\models\backbones\pvt.py /^class PyramidVisionTransformer(nn.Module):$/;" c +PyramidVisionTransformer .\mmseg\models\backbones\pvt_dia.py /^class PyramidVisionTransformer(nn.Module):$/;" c +RESULTS_LUT .\.dev\gather_models.py /^RESULTS_LUT = ['mIoU', 'mAcc', 'aAcc']$/;" v +RGB2Gray .\mmseg\datasets\pipelines\transforms.py /^class RGB2Gray(object):$/;" c +RSoftmax .\mmseg\models\backbones\resnest.py /^class RSoftmax(nn.Module):$/;" c +RandomCrop .\mmseg\datasets\pipelines\transforms.py /^class RandomCrop(object):$/;" c +RandomFlip .\mmseg\datasets\pipelines\transforms.py /^class RandomFlip(object):$/;" c +RandomRotate .\mmseg\datasets\pipelines\transforms.py /^class RandomRotate(object):$/;" c +RandomSampler .\tests\test_data\test_dataset_builder.py /^from torch.utils.data import (DistributedSampler, RandomSampler,$/;" i +Registry .\mmseg\core\seg\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +Registry .\mmseg\datasets\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +Registry .\mmseg\models\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +RepeatDataset .\mmseg\datasets\__init__.py /^from .dataset_wrappers import ConcatDataset, RepeatDataset$/;" i +RepeatDataset .\mmseg\datasets\builder.py /^ from .dataset_wrappers import ConcatDataset, RepeatDataset$/;" i +RepeatDataset .\mmseg\datasets\dataset_wrappers.py /^class RepeatDataset(object):$/;" c +Rerange .\mmseg\datasets\pipelines\transforms.py /^class Rerange(object):$/;" c +ResLayer .\mmseg\models\backbones\resnest.py /^from ..utils import ResLayer$/;" i +ResLayer .\mmseg\models\backbones\resnet.py /^from ..utils import ResLayer$/;" i +ResLayer .\mmseg\models\backbones\resnext.py /^from ..utils import ResLayer$/;" i +ResLayer .\mmseg\models\utils\__init__.py /^from .res_layer import ResLayer$/;" i +ResLayer .\mmseg\models\utils\res_layer.py /^class ResLayer(nn.Sequential):$/;" c +ResLayer .\tests\test_models\test_backbone.py /^from mmseg.models.utils import ResLayer$/;" i +ResNeSt .\mmseg\models\backbones\__init__.py /^from .resnest import ResNeSt$/;" i +ResNeSt .\mmseg\models\backbones\resnest.py /^class ResNeSt(ResNetV1d):$/;" c +ResNeSt .\tests\test_models\test_backbone.py /^from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt,$/;" i +ResNeXt .\mmseg\models\backbones\__init__.py /^from .resnext import ResNeXt$/;" i +ResNeXt .\mmseg\models\backbones\resnext.py /^class ResNeXt(ResNet):$/;" c +ResNet .\mmseg\models\backbones\__init__.py /^from .resnet import ResNet, ResNetV1c, ResNetV1d$/;" i +ResNet .\mmseg\models\backbones\resnet.py /^class ResNet(nn.Module):$/;" c +ResNet .\mmseg\models\backbones\resnext.py /^from .resnet import ResNet$/;" i +ResNetV1c .\mmseg\models\backbones\__init__.py /^from .resnet import ResNet, ResNetV1c, ResNetV1d$/;" i +ResNetV1c .\mmseg\models\backbones\resnet.py /^class ResNetV1c(ResNet):$/;" c +ResNetV1d .\mmseg\models\backbones\__init__.py /^from .resnet import ResNet, ResNetV1c, ResNetV1d$/;" i +ResNetV1d .\mmseg\models\backbones\resnest.py /^from .resnet import ResNetV1d$/;" i +ResNetV1d .\mmseg\models\backbones\resnet.py /^class ResNetV1d(ResNet):$/;" c +Resize .\mmseg\datasets\pipelines\transforms.py /^class Resize(object):$/;" c +SEGMENTORS .\mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +SEGMENTORS .\mmseg\models\builder.py /^SEGMENTORS = Registry('segmentor')$/;" v +SEGMENTORS .\mmseg\models\segmentors\cascade_encoder_decoder.py /^from ..builder import SEGMENTORS$/;" i +SEGMENTORS .\mmseg\models\segmentors\encoder_decoder.py /^from ..builder import SEGMENTORS$/;" i +SELayer .\mmseg\models\utils\inverted_residual.py /^from .se_layer import SELayer$/;" i +SELayer .\mmseg\models\utils\se_layer.py /^class SELayer(nn.Module):$/;" c +SELayer .\tests\test_utils\test_se_layer.py /^from mmseg.models.utils.se_layer import SELayer$/;" i +SOURCEDIR .\docs\make.bat /^set SOURCEDIR=.$/;" v +SPHINXBUILD .\docs\make.bat /^ set SPHINXBUILD=sphinx-build$/;" v +STAREDataset .\mmseg\datasets\__init__.py /^from .stare import STAREDataset$/;" i +STAREDataset .\mmseg\datasets\stare.py /^class STAREDataset(CustomDataset):$/;" c +STARE_LEN .\tools\convert_datasets\stare.py /^STARE_LEN = 20$/;" v +Scale .\mmseg\models\decode_heads\da_head.py /^from mmcv.cnn import ConvModule, Scale$/;" i +SegRescale .\mmseg\datasets\pipelines\transforms.py /^class SegRescale(object):$/;" c +SelfAttentionBlock .\mmseg\models\decode_heads\ann_head.py /^class SelfAttentionBlock(_SelfAttentionBlock):$/;" c +SelfAttentionBlock .\mmseg\models\utils\__init__.py /^from .self_attention_block import SelfAttentionBlock$/;" i +SelfAttentionBlock .\mmseg\models\utils\self_attention_block.py /^class SelfAttentionBlock(nn.Module):$/;" c +Sequence .\mmseg\datasets\pipelines\formating.py /^from collections.abc import Sequence$/;" i +SpatialGatherModule .\mmseg\models\decode_heads\ocr_head.py /^class SpatialGatherModule(nn.Module):$/;" c +SplitAttentionConv2d .\mmseg\models\backbones\resnest.py /^class SplitAttentionConv2d(nn.Module):$/;" c +SyncBatchNorm .\tests\test_models\test_forward.py /^from mmcv.utils.parrots_wrapper import SyncBatchNorm, _BatchNorm$/;" i +SyncBatchNorm .\tests\test_models\test_heads.py /^from mmcv.utils.parrots_wrapper import SyncBatchNorm$/;" i +TRAINING_LEN .\tools\convert_datasets\chase_db1.py /^TRAINING_LEN = 60$/;" v +TRAINING_LEN .\tools\convert_datasets\hrf.py /^TRAINING_LEN = 5$/;" v +TRAINING_LEN .\tools\convert_datasets\stare.py /^TRAINING_LEN = 10$/;" v +TestLoading .\tests\test_data\test_loading.py /^class TestLoading(object):$/;" c +ToDataContainer .\mmseg\datasets\pipelines\__init__.py /^from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor,$/;" i +ToDataContainer .\mmseg\datasets\pipelines\formating.py /^class ToDataContainer(object):$/;" c +ToTensor .\mmseg\datasets\pipelines\__init__.py /^from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor,$/;" i +ToTensor .\mmseg\datasets\pipelines\formating.py /^class ToTensor(object):$/;" c +ToyDataset .\tests\test_data\test_dataset_builder.py /^class ToyDataset(object):$/;" c +Transpose .\mmseg\datasets\pipelines\formating.py /^class Transpose(object):$/;" c +UNet .\mmseg\models\backbones\__init__.py /^from .unet import UNet$/;" i +UNet .\mmseg\models\backbones\unet.py /^class UNet(nn.Module):$/;" c +UPSAMPLE_LAYERS .\mmseg\models\backbones\unet.py /^from mmcv.cnn import (UPSAMPLE_LAYERS, ConvModule, build_activation_layer,$/;" i +UPerHead .\mmseg\models\decode_heads\__init__.py /^from .uper_head import UPerHead$/;" i +UPerHead .\mmseg\models\decode_heads\uper_head.py /^class UPerHead(BaseDecodeHead):$/;" c +UpConvBlock .\mmseg\models\backbones\unet.py /^from ..utils import UpConvBlock$/;" i +UpConvBlock .\mmseg\models\utils\__init__.py /^from .up_conv_block import UpConvBlock$/;" i +UpConvBlock .\mmseg\models\utils\up_conv_block.py /^class UpConvBlock(nn.Module):$/;" c +Upsample .\mmseg\models\backbones\hrnet.py /^from mmseg.ops import Upsample, resize$/;" i +Upsample .\mmseg\ops\__init__.py /^from .wrappers import Upsample, resize$/;" i +Upsample .\mmseg\ops\wrappers.py /^class Upsample(nn.Module):$/;" c +VIT_MLA .\mmseg\models\backbones\__init__.py /^from .vit_mla import VIT_MLA$/;" i +VIT_MLA .\mmseg\models\backbones\vit_mla.py /^class VIT_MLA(nn.Module):$/;" c +VIT_MLAHead .\mmseg\models\decode_heads\__init__.py /^from .vit_mla_head import VIT_MLAHead$/;" i +VIT_MLAHead .\mmseg\models\decode_heads\vit_mla_head.py /^class VIT_MLAHead(BaseDecodeHead):$/;" c +VIT_MLA_AUXIHead .\mmseg\models\decode_heads\__init__.py /^from .vit_mla_auxi_head import VIT_MLA_AUXIHead$/;" i +VIT_MLA_AUXIHead .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^class VIT_MLA_AUXIHead(BaseDecodeHead):$/;" c +VisionTransformer .\mmseg\models\backbones\__init__.py /^from .vit import VisionTransformer$/;" i +VisionTransformer .\mmseg\models\backbones\vit.py /^class VisionTransformer(nn.Module):$/;" c +VisionTransformerUpHead .\mmseg\models\decode_heads\__init__.py /^from .vit_up_head import VisionTransformerUpHead$/;" i +VisionTransformerUpHead .\mmseg\models\decode_heads\vit_up_head.py /^class VisionTransformerUpHead(BaseDecodeHead):$/;" c +_BatchNorm .\mmseg\models\backbones\cgnet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +_BatchNorm .\mmseg\models\backbones\fast_scnn.py /^from torch.nn.modules.batchnorm import _BatchNorm$/;" i +_BatchNorm .\mmseg\models\backbones\hrnet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +_BatchNorm .\mmseg\models\backbones\mobilenet_v2.py /^from torch.nn.modules.batchnorm import _BatchNorm$/;" i +_BatchNorm .\mmseg\models\backbones\mobilenet_v3.py /^from torch.nn.modules.batchnorm import _BatchNorm$/;" i +_BatchNorm .\mmseg\models\backbones\resnet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +_BatchNorm .\mmseg\models\backbones\unet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +_BatchNorm .\tests\test_models\test_backbone.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +_BatchNorm .\tests\test_models\test_forward.py /^from mmcv.utils.parrots_wrapper import SyncBatchNorm, _BatchNorm$/;" i +_BatchNorm .\tests\test_models\test_unet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +_Bottleneck .\mmseg\models\backbones\resnest.py /^from .resnet import Bottleneck as _Bottleneck$/;" i +_Bottleneck .\mmseg\models\backbones\resnext.py /^from .resnet import Bottleneck as _Bottleneck$/;" i +_C .\tools\pytorch2onnx.py /^import torch._C$/;" i +_ConcatDataset .\mmseg\datasets\dataset_wrappers.py /^from torch.utils.data.dataset import ConcatDataset as _ConcatDataset$/;" i +_SelfAttentionBlock .\mmseg\models\decode_heads\ann_head.py /^from ..utils import SelfAttentionBlock as _SelfAttentionBlock$/;" i +_SelfAttentionBlock .\mmseg\models\decode_heads\da_head.py /^from ..utils import SelfAttentionBlock as _SelfAttentionBlock$/;" i +_SelfAttentionBlock .\mmseg\models\decode_heads\ocr_head.py /^from ..utils import SelfAttentionBlock as _SelfAttentionBlock$/;" i +__all__ .\mmseg\__init__.py /^__all__ = ['__version__', 'version_info']$/;" v +__all__ .\mmseg\apis\__init__.py /^__all__ = [$/;" v +__all__ .\mmseg\core\evaluation\__init__.py /^__all__ = [$/;" v +__all__ .\mmseg\core\seg\__init__.py /^__all__ = ['build_pixel_sampler', 'BasePixelSampler', 'OHEMPixelSampler']$/;" v +__all__ .\mmseg\core\seg\sampler\__init__.py /^__all__ = ['BasePixelSampler', 'OHEMPixelSampler']$/;" v +__all__ .\mmseg\core\utils\__init__.py /^__all__ = ['add_prefix']$/;" v +__all__ .\mmseg\datasets\__init__.py /^__all__ = [$/;" v +__all__ .\mmseg\datasets\pipelines\__init__.py /^__all__ = [$/;" v +__all__ .\mmseg\models\__init__.py /^__all__ = [$/;" v +__all__ .\mmseg\models\backbones\__init__.py /^__all__ = [$/;" v +__all__ .\mmseg\models\decode_heads\__init__.py /^__all__ = [$/;" v +__all__ .\mmseg\models\losses\__init__.py /^__all__ = [$/;" v +__all__ .\mmseg\models\necks\__init__.py /^__all__ = ['FPN']$/;" v +__all__ .\mmseg\models\segmentors\__init__.py /^__all__ = ['EncoderDecoder', 'CascadeEncoderDecoder']$/;" v +__all__ .\mmseg\models\utils\__init__.py /^__all__ = [$/;" v +__all__ .\mmseg\ops\__init__.py /^__all__ = ['Upsample', 'resize', 'Encoding']$/;" v +__all__ .\mmseg\utils\__init__.py /^__all__ = ['get_root_logger', 'collect_env']$/;" v +__call__ .\mmseg\apis\inference.py /^ def __call__(self, results):$/;" m class:LoadImage file: +__call__ .\mmseg\datasets\pipelines\compose.py /^ def __call__(self, data):$/;" m class:Compose file: +__call__ .\mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:Collect file: +__call__ .\mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:DefaultFormatBundle file: +__call__ .\mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:ImageToTensor file: +__call__ .\mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:ToDataContainer file: +__call__ .\mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:ToTensor file: +__call__ .\mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:Transpose file: +__call__ .\mmseg\datasets\pipelines\loading.py /^ def __call__(self, results):$/;" m class:LoadAnnotations file: +__call__ .\mmseg\datasets\pipelines\loading.py /^ def __call__(self, results):$/;" m class:LoadImageFromFile file: +__call__ .\mmseg\datasets\pipelines\test_time_aug.py /^ def __call__(self, results):$/;" m class:MultiScaleFlipAug file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:AdjustGamma file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:CLAHE file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:Normalize file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:Pad file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:PhotoMetricDistortion file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:RGB2Gray file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:RandomCrop file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:RandomFlip file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:RandomRotate file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:Rerange file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:Resize file: +__call__ .\mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:SegRescale file: +__getitem__ .\mmseg\datasets\custom.py /^ def __getitem__(self, idx):$/;" m class:CustomDataset file: +__getitem__ .\mmseg\datasets\dataset_wrappers.py /^ def __getitem__(self, idx):$/;" m class:RepeatDataset file: +__getitem__ .\tests\test_eval_hook.py /^ def __getitem__(self, idx):$/;" m class:ExampleDataset file: +__init__ .\mmseg\core\evaluation\eval_hooks.py /^ def __init__(self, dataloader, interval=1, by_epoch=False, **eval_kwargs):$/;" m class:EvalHook +__init__ .\mmseg\core\evaluation\eval_hooks.py /^ def __init__(self,$/;" m class:DistEvalHook +__init__ .\mmseg\core\seg\sampler\base_pixel_sampler.py /^ def __init__(self, **kwargs):$/;" m class:BasePixelSampler +__init__ .\mmseg\core\seg\sampler\ohem_pixel_sampler.py /^ def __init__(self, context, thresh=None, min_kept=100000):$/;" m class:OHEMPixelSampler +__init__ .\mmseg\datasets\ade.py /^ def __init__(self, **kwargs):$/;" m class:ADE20KDataset +__init__ .\mmseg\datasets\chase_db1.py /^ def __init__(self, **kwargs):$/;" m class:ChaseDB1Dataset +__init__ .\mmseg\datasets\cityscapes.py /^ def __init__(self, **kwargs):$/;" m class:CityscapesDataset +__init__ .\mmseg\datasets\custom.py /^ def __init__(self,$/;" m class:CustomDataset +__init__ .\mmseg\datasets\dataset_wrappers.py /^ def __init__(self, dataset, times):$/;" m class:RepeatDataset +__init__ .\mmseg\datasets\dataset_wrappers.py /^ def __init__(self, datasets):$/;" m class:ConcatDataset +__init__ .\mmseg\datasets\drive.py /^ def __init__(self, **kwargs):$/;" m class:DRIVEDataset +__init__ .\mmseg\datasets\hrf.py /^ def __init__(self, **kwargs):$/;" m class:HRFDataset +__init__ .\mmseg\datasets\pascal_context.py /^ def __init__(self, split, **kwargs):$/;" m class:PascalContextDataset +__init__ .\mmseg\datasets\pipelines\compose.py /^ def __init__(self, transforms):$/;" m class:Compose +__init__ .\mmseg\datasets\pipelines\formating.py /^ def __init__(self, keys):$/;" m class:ImageToTensor +__init__ .\mmseg\datasets\pipelines\formating.py /^ def __init__(self, keys):$/;" m class:ToTensor +__init__ .\mmseg\datasets\pipelines\formating.py /^ def __init__(self, keys, order):$/;" m class:Transpose +__init__ .\mmseg\datasets\pipelines\formating.py /^ def __init__(self,$/;" m class:Collect +__init__ .\mmseg\datasets\pipelines\formating.py /^ def __init__(self,$/;" m class:ToDataContainer +__init__ .\mmseg\datasets\pipelines\loading.py /^ def __init__(self,$/;" m class:LoadAnnotations +__init__ .\mmseg\datasets\pipelines\loading.py /^ def __init__(self,$/;" m class:LoadImageFromFile +__init__ .\mmseg\datasets\pipelines\test_time_aug.py /^ def __init__(self,$/;" m class:MultiScaleFlipAug +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self, clip_limit=40.0, tile_grid_size=(8, 8)):$/;" m class:CLAHE +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self, crop_size, cat_max_ratio=1., ignore_index=255):$/;" m class:RandomCrop +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self, gamma=1.0):$/;" m class:AdjustGamma +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self, mean, std, to_rgb=True):$/;" m class:Normalize +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self, min_value=0, max_value=255):$/;" m class:Rerange +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self, out_channels=None, weights=(0.299, 0.587, 0.114)):$/;" m class:RGB2Gray +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self, prob=None, direction='horizontal'):$/;" m class:RandomFlip +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self, scale_factor=1):$/;" m class:SegRescale +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self,$/;" m class:Pad +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self,$/;" m class:PhotoMetricDistortion +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self,$/;" m class:RandomRotate +__init__ .\mmseg\datasets\pipelines\transforms.py /^ def __init__(self,$/;" m class:Resize +__init__ .\mmseg\datasets\stare.py /^ def __init__(self, **kwargs):$/;" m class:STAREDataset +__init__ .\mmseg\datasets\voc.py /^ def __init__(self, split, **kwargs):$/;" m class:PascalVOCDataset +__init__ .\mmseg\models\backbones\cgnet.py /^ def __init__(self, channel, reduction=16, with_cp=False):$/;" m class:GlobalContextExtractor +__init__ .\mmseg\models\backbones\cgnet.py /^ def __init__(self, num_downsampling):$/;" m class:InputInjection +__init__ .\mmseg\models\backbones\cgnet.py /^ def __init__(self,$/;" m class:CGNet +__init__ .\mmseg\models\backbones\cgnet.py /^ def __init__(self,$/;" m class:ContextGuidedBlock +__init__ .\mmseg\models\backbones\fast_scnn.py /^ def __init__(self,$/;" m class:FastSCNN +__init__ .\mmseg\models\backbones\fast_scnn.py /^ def __init__(self,$/;" m class:FeatureFusionModule +__init__ .\mmseg\models\backbones\fast_scnn.py /^ def __init__(self,$/;" m class:GlobalFeatureExtractor +__init__ .\mmseg\models\backbones\fast_scnn.py /^ def __init__(self,$/;" m class:LearningToDownsample +__init__ .\mmseg\models\backbones\hrnet.py /^ def __init__(self,$/;" m class:HRModule +__init__ .\mmseg\models\backbones\hrnet.py /^ def __init__(self,$/;" m class:HRNet +__init__ .\mmseg\models\backbones\layers\drop.py /^ def __init__(self, drop_prob=None):$/;" m class:DropPath +__init__ .\mmseg\models\backbones\layers\drop.py /^ def __init__(self,$/;" m class:DropBlock2d +__init__ .\mmseg\models\backbones\mobilenet_v2.py /^ def __init__(self,$/;" m class:MobileNetV2 +__init__ .\mmseg\models\backbones\mobilenet_v3.py /^ def __init__(self,$/;" m class:MobileNetV3 +__init__ .\mmseg\models\backbones\pvt.py /^ def __init__(self, **kwargs):$/;" m class:pvt_large +__init__ .\mmseg\models\backbones\pvt.py /^ def __init__(self, **kwargs):$/;" m class:pvt_small +__init__ .\mmseg\models\backbones\pvt.py /^ def __init__(self, **kwargs):$/;" m class:pvt_small_f4 +__init__ .\mmseg\models\backbones\pvt.py /^ def __init__(self, **kwargs):$/;" m class:pvt_tiny +__init__ .\mmseg\models\backbones\pvt.py /^ def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,$/;" m class:Block +__init__ .\mmseg\models\backbones\pvt.py /^ def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0., sr_ratio=1):$/;" m class:Attention +__init__ .\mmseg\models\backbones\pvt.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):$/;" m class:PatchEmbed +__init__ .\mmseg\models\backbones\pvt.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, num_classes=1000, embed_dims=[64, 128, 256, 512],$/;" m class:PyramidVisionTransformer +__init__ .\mmseg\models\backbones\pvt.py /^ def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):$/;" m class:Mlp +__init__ .\mmseg\models\backbones\pvt_dia.py /^ def __init__(self, **kwargs):$/;" m class:pvt_small_dia +__init__ .\mmseg\models\backbones\pvt_dia.py /^ def __init__(self, **kwargs):$/;" m class:pvt_tiny_dia +__init__ .\mmseg\models\backbones\pvt_dia.py /^ def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,$/;" m class:Block +__init__ .\mmseg\models\backbones\pvt_dia.py /^ def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0., sr_ratio=1):$/;" m class:Attention +__init__ .\mmseg\models\backbones\pvt_dia.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768, dilation=1):$/;" m class:PatchEmbed +__init__ .\mmseg\models\backbones\pvt_dia.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, num_classes=1000, embed_dims=[64, 128, 256, 512],$/;" m class:PyramidVisionTransformer +__init__ .\mmseg\models\backbones\pvt_dia.py /^ def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):$/;" m class:Mlp +__init__ .\mmseg\models\backbones\resnest.py /^ def __init__(self, radix, groups):$/;" m class:RSoftmax +__init__ .\mmseg\models\backbones\resnest.py /^ def __init__(self,$/;" m class:Bottleneck +__init__ .\mmseg\models\backbones\resnest.py /^ def __init__(self,$/;" m class:ResNeSt +__init__ .\mmseg\models\backbones\resnest.py /^ def __init__(self,$/;" m class:SplitAttentionConv2d +__init__ .\mmseg\models\backbones\resnet.py /^ def __init__(self, **kwargs):$/;" m class:ResNetV1c +__init__ .\mmseg\models\backbones\resnet.py /^ def __init__(self, **kwargs):$/;" m class:ResNetV1d +__init__ .\mmseg\models\backbones\resnet.py /^ def __init__(self,$/;" m class:BasicBlock +__init__ .\mmseg\models\backbones\resnet.py /^ def __init__(self,$/;" m class:Bottleneck +__init__ .\mmseg\models\backbones\resnet.py /^ def __init__(self,$/;" m class:ResNet +__init__ .\mmseg\models\backbones\resnext.py /^ def __init__(self, groups=1, base_width=4, **kwargs):$/;" m class:ResNeXt +__init__ .\mmseg\models\backbones\resnext.py /^ def __init__(self,$/;" m class:Bottleneck +__init__ .\mmseg\models\backbones\unet.py /^ def __init__(self,$/;" m class:BasicConvBlock +__init__ .\mmseg\models\backbones\unet.py /^ def __init__(self,$/;" m class:DeconvModule +__init__ .\mmseg\models\backbones\unet.py /^ def __init__(self,$/;" m class:InterpConv +__init__ .\mmseg\models\backbones\unet.py /^ def __init__(self,$/;" m class:UNet +__init__ .\mmseg\models\backbones\vit.py /^ def __init__(self, backbone, img_size=224, feature_size=None, in_chans=3, embed_dim=768):$/;" m class:HybridEmbed +__init__ .\mmseg\models\backbones\vit.py /^ def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,$/;" m class:Block +__init__ .\mmseg\models\backbones\vit.py /^ def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):$/;" m class:Attention +__init__ .\mmseg\models\backbones\vit.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):$/;" m class:PatchEmbed +__init__ .\mmseg\models\backbones\vit.py /^ def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):$/;" m class:Mlp +__init__ .\mmseg\models\backbones\vit.py /^ def __init__(self, model_name='vit_large_patch16_384', img_size=384, patch_size=16, in_chans=3, embed_dim=1024, depth=24,$/;" m class:VisionTransformer +__init__ .\mmseg\models\backbones\vit_mla.py /^ def __init__(self, backbone, img_size=224, feature_size=None, in_chans=3, embed_dim=768):$/;" m class:HybridEmbed +__init__ .\mmseg\models\backbones\vit_mla.py /^ def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,$/;" m class:Block +__init__ .\mmseg\models\backbones\vit_mla.py /^ def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):$/;" m class:Attention +__init__ .\mmseg\models\backbones\vit_mla.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):$/;" m class:PatchEmbed +__init__ .\mmseg\models\backbones\vit_mla.py /^ def __init__(self, in_channels=1024, mla_channels=256, norm_cfg=None):$/;" m class:Conv_MLA +__init__ .\mmseg\models\backbones\vit_mla.py /^ def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):$/;" m class:Mlp +__init__ .\mmseg\models\backbones\vit_mla.py /^ def __init__(self, model_name='vit_large_patch16_384', img_size=384, patch_size=16, in_chans=3, embed_dim=1024, depth=24,$/;" m class:VIT_MLA +__init__ .\mmseg\models\decode_heads\ann_head.py /^ def __init__(self, in_channels, channels, out_channels, query_scales,$/;" m class:APNB +__init__ .\mmseg\models\decode_heads\ann_head.py /^ def __init__(self, low_in_channels, high_in_channels, channels,$/;" m class:AFNB +__init__ .\mmseg\models\decode_heads\ann_head.py /^ def __init__(self, low_in_channels, high_in_channels, channels,$/;" m class:SelfAttentionBlock +__init__ .\mmseg\models\decode_heads\ann_head.py /^ def __init__(self, pool_scales=(1, 3, 6, 8)):$/;" m class:PPMConcat +__init__ .\mmseg\models\decode_heads\ann_head.py /^ def __init__(self,$/;" m class:ANNHead +__init__ .\mmseg\models\decode_heads\apc_head.py /^ def __init__(self, pool_scale, fusion, in_channels, channels, conv_cfg,$/;" m class:ACM +__init__ .\mmseg\models\decode_heads\apc_head.py /^ def __init__(self, pool_scales=(1, 2, 3, 6), fusion=True, **kwargs):$/;" m class:APCHead +__init__ .\mmseg\models\decode_heads\aspp_head.py /^ def __init__(self, dilations, in_channels, channels, conv_cfg, norm_cfg,$/;" m class:ASPPModule +__init__ .\mmseg\models\decode_heads\aspp_head.py /^ def __init__(self, dilations=(1, 6, 12, 18), **kwargs):$/;" m class:ASPPHead +__init__ .\mmseg\models\decode_heads\cascade_decode_head.py /^ def __init__(self, *args, **kwargs):$/;" m class:BaseCascadeDecodeHead +__init__ .\mmseg\models\decode_heads\cc_head.py /^ def __init__(self, recurrence=2, **kwargs):$/;" m class:CCHead +__init__ .\mmseg\models\decode_heads\da_head.py /^ def __init__(self):$/;" m class:CAM +__init__ .\mmseg\models\decode_heads\da_head.py /^ def __init__(self, in_channels, channels):$/;" m class:PAM +__init__ .\mmseg\models\decode_heads\da_head.py /^ def __init__(self, pam_channels, **kwargs):$/;" m class:DAHead +__init__ .\mmseg\models\decode_heads\decode_head.py /^ def __init__(self,$/;" m class:BaseDecodeHead +__init__ .\mmseg\models\decode_heads\dm_head.py /^ def __init__(self, filter_size, fusion, in_channels, channels, conv_cfg,$/;" m class:DCM +__init__ .\mmseg\models\decode_heads\dm_head.py /^ def __init__(self, filter_sizes=(1, 3, 5, 7), fusion=False, **kwargs):$/;" m class:DMHead +__init__ .\mmseg\models\decode_heads\dnl_head.py /^ def __init__(self, *arg, temperature, **kwargs):$/;" m class:DisentangledNonLocal2d +__init__ .\mmseg\models\decode_heads\dnl_head.py /^ def __init__(self,$/;" m class:DNLHead +__init__ .\mmseg\models\decode_heads\ema_head.py /^ def __init__(self, channels, num_bases, num_stages, momentum):$/;" m class:EMAModule +__init__ .\mmseg\models\decode_heads\ema_head.py /^ def __init__(self,$/;" m class:EMAHead +__init__ .\mmseg\models\decode_heads\enc_head.py /^ def __init__(self, in_channels, num_codes, conv_cfg, norm_cfg, act_cfg):$/;" m class:EncModule +__init__ .\mmseg\models\decode_heads\enc_head.py /^ def __init__(self,$/;" m class:EncHead +__init__ .\mmseg\models\decode_heads\fcn_head.py /^ def __init__(self,$/;" m class:FCNHead +__init__ .\mmseg\models\decode_heads\fpn_head.py /^ def __init__(self, feature_strides, **kwargs):$/;" m class:FPNHead +__init__ .\mmseg\models\decode_heads\gc_head.py /^ def __init__(self,$/;" m class:GCHead +__init__ .\mmseg\models\decode_heads\layers\drop.py /^ def __init__(self, drop_prob=None):$/;" m class:DropPath +__init__ .\mmseg\models\decode_heads\layers\drop.py /^ def __init__(self,$/;" m class:DropBlock2d +__init__ .\mmseg\models\decode_heads\lraspp_head.py /^ def __init__(self, branch_channels=(32, 64), **kwargs):$/;" m class:LRASPPHead +__init__ .\mmseg\models\decode_heads\nl_head.py /^ def __init__(self,$/;" m class:NLHead +__init__ .\mmseg\models\decode_heads\ocr_head.py /^ def __init__(self, in_channels, channels, scale, conv_cfg, norm_cfg,$/;" m class:ObjectAttentionBlock +__init__ .\mmseg\models\decode_heads\ocr_head.py /^ def __init__(self, ocr_channels, scale=1, **kwargs):$/;" m class:OCRHead +__init__ .\mmseg\models\decode_heads\ocr_head.py /^ def __init__(self, scale):$/;" m class:SpatialGatherModule +__init__ .\mmseg\models\decode_heads\point_head.py /^ def __init__(self,$/;" m class:PointHead +__init__ .\mmseg\models\decode_heads\psa_head.py /^ def __init__(self,$/;" m class:PSAHead +__init__ .\mmseg\models\decode_heads\psp_head.py /^ def __init__(self, pool_scales, in_channels, channels, conv_cfg, norm_cfg,$/;" m class:PPM +__init__ .\mmseg\models\decode_heads\psp_head.py /^ def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs):$/;" m class:PSPHead +__init__ .\mmseg\models\decode_heads\sep_aspp_head.py /^ def __init__(self, **kwargs):$/;" m class:DepthwiseSeparableASPPModule +__init__ .\mmseg\models\decode_heads\sep_aspp_head.py /^ def __init__(self, c1_in_channels, c1_channels, **kwargs):$/;" m class:DepthwiseSeparableASPPHead +__init__ .\mmseg\models\decode_heads\sep_fcn_head.py /^ def __init__(self, **kwargs):$/;" m class:DepthwiseSeparableFCNHead +__init__ .\mmseg\models\decode_heads\uper_head.py /^ def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs):$/;" m class:UPerHead +__init__ .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^ def __init__(self, img_size=768, **kwargs):$/;" m class:VIT_MLA_AUXIHead +__init__ .\mmseg\models\decode_heads\vit_mla_head.py /^ def __init__(self, img_size=768, mla_channels=256, mlahead_channels=128, $/;" m class:VIT_MLAHead +__init__ .\mmseg\models\decode_heads\vit_mla_head.py /^ def __init__(self, mla_channels=256, mlahead_channels=128, norm_cfg=None):$/;" m class:MLAHead +__init__ .\mmseg\models\decode_heads\vit_up_head.py /^ def __init__(self, img_size=768, embed_dim=1024, $/;" m class:VisionTransformerUpHead +__init__ .\mmseg\models\losses\accuracy.py /^ def __init__(self, topk=(1, ), thresh=None):$/;" m class:Accuracy +__init__ .\mmseg\models\losses\cross_entropy_loss.py /^ def __init__(self,$/;" m class:CrossEntropyLoss +__init__ .\mmseg\models\losses\lovasz_loss.py /^ def __init__(self,$/;" m class:LovaszLoss +__init__ .\mmseg\models\necks\fpn.py /^ def __init__(self,$/;" m class:FPN +__init__ .\mmseg\models\segmentors\base.py /^ def __init__(self):$/;" m class:BaseSegmentor +__init__ .\mmseg\models\segmentors\cascade_encoder_decoder.py /^ def __init__(self,$/;" m class:CascadeEncoderDecoder +__init__ .\mmseg\models\segmentors\encoder_decoder.py /^ def __init__(self,$/;" m class:EncoderDecoder +__init__ .\mmseg\models\utils\inverted_residual.py /^ def __init__(self,$/;" m class:InvertedResidual +__init__ .\mmseg\models\utils\inverted_residual.py /^ def __init__(self,$/;" m class:InvertedResidualV3 +__init__ .\mmseg\models\utils\res_layer.py /^ def __init__(self,$/;" m class:ResLayer +__init__ .\mmseg\models\utils\se_layer.py /^ def __init__(self,$/;" m class:SELayer +__init__ .\mmseg\models\utils\self_attention_block.py /^ def __init__(self, key_in_channels, query_in_channels, channels,$/;" m class:SelfAttentionBlock +__init__ .\mmseg\models\utils\up_conv_block.py /^ def __init__(self,$/;" m class:UpConvBlock +__init__ .\mmseg\ops\encoding.py /^ def __init__(self, channels, num_codes):$/;" m class:Encoding +__init__ .\mmseg\ops\wrappers.py /^ def __init__(self,$/;" m class:Upsample +__init__ .\tests\test_data\test_dataset_builder.py /^ def __init__(self, cnt=0):$/;" m class:ToyDataset +__init__ .\tests\test_eval_hook.py /^ def __init__(self):$/;" m class:ExampleModel +__init__ .\tests\test_models\test_segmentor.py /^ def __init__(self):$/;" m class:ExampleBackbone +__init__ .\tests\test_models\test_segmentor.py /^ def __init__(self):$/;" m class:ExampleCascadeDecodeHead +__init__ .\tests\test_models\test_segmentor.py /^ def __init__(self):$/;" m class:ExampleDecodeHead +__item__ .\tests\test_data\test_dataset_builder.py /^ def __item__(self, idx):$/;" m class:ToyDataset file: +__len__ .\mmseg\datasets\custom.py /^ def __len__(self):$/;" m class:CustomDataset file: +__len__ .\mmseg\datasets\dataset_wrappers.py /^ def __len__(self):$/;" m class:RepeatDataset file: +__len__ .\tests\test_data\test_dataset_builder.py /^ def __len__(self):$/;" m class:ToyDataset file: +__len__ .\tests\test_eval_hook.py /^ def __len__(self):$/;" m class:ExampleDataset file: +__metaclass__ .\mmseg\models\segmentors\base.py /^ __metaclass__ = ABCMeta$/;" v class:BaseSegmentor +__repr__ .\mmseg\datasets\pipelines\compose.py /^ def __repr__(self):$/;" m class:Compose file: +__repr__ .\mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:Collect file: +__repr__ .\mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:DefaultFormatBundle file: +__repr__ .\mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:ImageToTensor file: +__repr__ .\mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:ToDataContainer file: +__repr__ .\mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:ToTensor file: +__repr__ .\mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:Transpose file: +__repr__ .\mmseg\datasets\pipelines\loading.py /^ def __repr__(self):$/;" m class:LoadAnnotations file: +__repr__ .\mmseg\datasets\pipelines\loading.py /^ def __repr__(self):$/;" m class:LoadImageFromFile file: +__repr__ .\mmseg\datasets\pipelines\test_time_aug.py /^ def __repr__(self):$/;" m class:MultiScaleFlipAug file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:AdjustGamma file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:CLAHE file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:Normalize file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:Pad file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:PhotoMetricDistortion file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:RGB2Gray file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:RandomCrop file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:RandomFlip file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:RandomRotate file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:Rerange file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:Resize file: +__repr__ .\mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:SegRescale file: +__repr__ .\mmseg\ops\encoding.py /^ def __repr__(self):$/;" m class:Encoding file: +__version__ .\mmseg\__init__.py /^from .version import __version__, version_info$/;" i +__version__ .\mmseg\version.py /^__version__ = '0.11.0'$/;" v +__version__ .\tools\train.py /^from mmseg import __version__$/;" i +_auxiliary_head_forward_train .\mmseg\models\segmentors\encoder_decoder.py /^ def _auxiliary_head_forward_train(self, x, img_metas, gt_semantic_seg):$/;" m class:EncoderDecoder +_base_ .\configs\_base_\datasets\Recipe1M_768x768.py /^_base_ = '.\/Recipe1M.py'$/;" v +_base_ .\configs\_base_\datasets\cityscapes_769x769.py /^_base_ = '.\/cityscapes.py'$/;" v +_base_ .\configs\_base_\datasets\pascal_voc12_aug.py /^_base_ = '.\/pascal_voc12.py'$/;" v +_base_ .\configs\ann\ann_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/ann_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\ann\ann_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/ann_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\ann\ann_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/ann_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\ann\ann_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/ann_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\ann\ann_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/ann_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\ann\ann_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/ann_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\ann\ann_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/ann_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\ann\ann_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/ann_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\ann\ann_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ann\ann_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ann\ann_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\ann\ann_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\ann\ann_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\ann\ann_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\apcnet\apcnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/apcnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\apcnet\apcnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/apcnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\apcnet\apcnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/apcnet_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\apcnet\apcnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/apcnet_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\apcnet\apcnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/apcnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\apcnet\apcnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/apcnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\apcnet\apcnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\apcnet\apcnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\apcnet\apcnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\apcnet\apcnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ccnet\ccnet_r101-d8_512x1024_40k_Recipe1M.py /^_base_ = ['..\/_base_\/datasets\/Recipe1M.py',$/;" v +_base_ .\configs\ccnet\ccnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/ccnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\ccnet\ccnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/ccnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\ccnet\ccnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/ccnet_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\ccnet\ccnet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/ccnet_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\ccnet\ccnet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/ccnet_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\ccnet\ccnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/ccnet_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\ccnet\ccnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/ccnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\ccnet\ccnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/ccnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\ccnet\ccnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ccnet\ccnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ccnet\ccnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\ccnet\ccnet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\ccnet\ccnet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\ccnet\ccnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^_base_ = ['..\/_base_\/models\/cgnet.py', '..\/_base_\/default_runtime.py']$/;" v +_base_ .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\danet\danet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/danet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\danet\danet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/danet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\danet\danet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/danet_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\danet\danet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/danet_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\danet\danet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/danet_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\danet\danet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/danet_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\danet\danet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/danet_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\danet\danet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/danet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\danet\danet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\danet\danet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\danet\danet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\danet\danet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\danet\danet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\danet\danet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_480x480_40k_pascal_context.py /^_base_ = '.\/deeplabv3_r50-d8_480x480_40k_pascal_context.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_480x480_80k_pascal_context.py /^_base_ = '.\/deeplabv3_r50-d8_480x480_80k_pascal_context.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/deeplabv3_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/deeplabv3_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/deeplabv3_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/deeplabv3_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r101b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3\deeplabv3_r50b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_480x480_40k_pascal_context.py /^_base_ = '.\/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_480x480_80k_pascal_context.py /^_base_ = '.\/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\deeplabv3plus\deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\dmnet\dmnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/dmnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\dmnet\dmnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/dmnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\dmnet\dmnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/dmnet_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\dmnet\dmnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/dmnet_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\dmnet\dmnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/dmnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\dmnet\dmnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/dmnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\dmnet\dmnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\dmnet\dmnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\dmnet\dmnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\dmnet\dmnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\dnlnet\dnl_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/dnl_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\dnlnet\dnl_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/dnl_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\dnlnet\dnl_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/dnl_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\dnlnet\dnl_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/dnl_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\dnlnet\dnl_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/dnl_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\dnlnet\dnl_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/dnl_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\dnlnet\dnl_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\dnlnet\dnl_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\dnlnet\dnl_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\dnlnet\dnl_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\emanet\emanet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/emanet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\emanet\emanet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/emanet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\emanet\emanet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\encnet\encnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/encnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\encnet\encnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/encnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\encnet\encnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/encnet_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\encnet\encnet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/encnet_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\encnet\encnet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/encnet_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\encnet\encnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/encnet_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\encnet\encnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/encnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\encnet\encnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/encnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\encnet\encnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\encnet\encnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\encnet\encnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\encnet\encnet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\encnet\encnet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\encnet\encnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\fastscnn\fast_scnn_4x8_80k_lr0.12_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r101-d8_480x480_40k_pascal_context.py /^_base_ = '.\/fcn_r50-d8_480x480_40k_pascal_context.py'$/;" v +_base_ .\configs\fcn\fcn_r101-d8_480x480_80k_pascal_context.py /^_base_ = '.\/fcn_r50-d8_480x480_80k_pascal_context.py'$/;" v +_base_ .\configs\fcn\fcn_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/fcn_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\fcn\fcn_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/fcn_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\fcn\fcn_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/fcn_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\fcn\fcn_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/fcn_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\fcn\fcn_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r101b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r101b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\fcn\fcn_r50b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\fcn\fcn_r50b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^_base_ = [$/;" v +_base_ .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^_base_ = [$/;" v +_base_ .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^_base_ = [$/;" v +_base_ .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^_base_ = [$/;" v +_base_ .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^_base_ = [$/;" v +_base_ .\configs\foodnet\ccnet_r50-d8_512x1024_80k.py /^_base_ = [$/;" v +_base_ .\configs\foodnet\ccnet_r50-d8_512x1024_80k_RM.py /^_base_ = [$/;" v +_base_ .\configs\foodnet\ccnet_vit_768x768_80k.py /^_base_ = [$/;" v +_base_ .\configs\foodnet\fpn_r50_512x1024_80k.py /^_base_ = [$/;" v +_base_ .\configs\foodnet\fpn_r50_512x1024_80k_RM.py /^_base_ = [$/;" v +_base_ .\configs\fp16\deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\fp16\deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\fp16\fcn_r101-d8_512x1024_80k_fp16_cityscapes.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\fp16\pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\gcnet\gcnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/gcnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\gcnet\gcnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/gcnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\gcnet\gcnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/gcnet_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\gcnet\gcnet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/gcnet_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\gcnet\gcnet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/gcnet_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\gcnet\gcnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/gcnet_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\gcnet\gcnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/gcnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\gcnet\gcnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/gcnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\gcnet\gcnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\gcnet\gcnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\gcnet\gcnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\gcnet\gcnet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\gcnet\gcnet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\gcnet\gcnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18_512x1024_160k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^_base_ = '.\/fcn_hr18_480x480_40k_pascal_context.py'$/;" v +_base_ .\configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^_base_ = '.\/fcn_hr18_480x480_80k_pascal_context.py'$/;" v +_base_ .\configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_160k_cityscapes.py'$/;" v +_base_ .\configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^_base_ = '.\/fcn_hr18_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^_base_ = '.\/fcn_hr18_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^_base_ = '.\/fcn_hr18_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^_base_ = '.\/fcn_hr18_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^_base_ = '.\/fcn_hr18_480x480_40k_pascal_context.py'$/;" v +_base_ .\configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^_base_ = '.\/fcn_hr18_480x480_80k_pascal_context.py'$/;" v +_base_ .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_160k_cityscapes.py'$/;" v +_base_ .\configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^_base_ = '.\/fcn_hr18_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^_base_ = '.\/fcn_hr18_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^_base_ = '.\/fcn_hr18_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^_base_ = '.\/fcn_hr18_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\mobilenet_v3\lraspp_m-v3-d8_512x1024_320k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\mobilenet_v3\lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^_base_ = '.\/lraspp_m-v3-d8_512x1024_320k_cityscapes.py'$/;" v +_base_ .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^_base_ = '.\/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py'$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/nonlocal_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/nonlocal_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/nonlocal_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/nonlocal_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/nonlocal_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/nonlocal_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/nonlocal_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/nonlocal_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18_512x1024_160k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_160k_cityscapes.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^_base_ = '.\/ocrnet_hr18_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^_base_ = '.\/ocrnet_hr18_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^_base_ = '.\/ocrnet_hr18_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^_base_ = '.\/ocrnet_hr18_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_160k_cityscapes.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^_base_ = '.\/ocrnet_hr18_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^_base_ = '.\/ocrnet_hr18_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^_base_ = '.\/ocrnet_hr18_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^_base_ = '.\/ocrnet_hr18_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\ocrnet\ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\point_rend\pointrend_r101_512x1024_80k_cityscapes.py /^_base_ = '.\/pointrend_r50_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\point_rend\pointrend_r101_512x512_160k_ade20k.py /^_base_ = '.\/pointrend_r50_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\point_rend\pointrend_r50_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\psanet\psanet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/psanet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\psanet\psanet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/psanet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\psanet\psanet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/psanet_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\psanet\psanet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/psanet_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\psanet\psanet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/psanet_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\psanet\psanet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/psanet_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\psanet\psanet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/psanet_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\psanet\psanet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/psanet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\psanet\psanet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\psanet\psanet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\psanet\psanet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\psanet\psanet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\psanet\psanet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\psanet\psanet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_480x480_40k_pascal_context.py /^_base_ = '.\/pspnet_r50-d8_480x480_40k_pascal_context.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_480x480_80k_pascal_context.py /^_base_ = '.\/pspnet_r50-d8_480x480_80k_pascal_context.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/pspnet_r50-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/pspnet_r50-d8_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/pspnet_r50-d8_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/pspnet_r50-d8_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r101b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\pspnet\pspnet_r50b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\pspnet\pspnet_r50b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\sem_fpn\fpn_r101_512x1024_80k_cityscapes.py /^_base_ = '.\/fpn_r50_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\sem_fpn\fpn_r101_512x512_160k_ade20k.py /^_base_ = '.\/fpn_r50_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\sem_fpn\fpn_r50_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\sem_fpn\fpn_r50_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\unet\deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py /^_base_ = [$/;" v +_base_ .\configs\unet\deeplabv3_unet_s5-d16_128x128_40k_stare.py /^_base_ = [$/;" v +_base_ .\configs\unet\deeplabv3_unet_s5-d16_256x256_40k_hrf.py /^_base_ = [$/;" v +_base_ .\configs\unet\deeplabv3_unet_s5-d16_64x64_40k_drive.py /^_base_ = [$/;" v +_base_ .\configs\unet\fcn_unet_s5-d16_128x128_40k_chase_db1.py /^_base_ = [$/;" v +_base_ .\configs\unet\fcn_unet_s5-d16_128x128_40k_stare.py /^_base_ = [$/;" v +_base_ .\configs\unet\fcn_unet_s5-d16_256x256_40k_hrf.py /^_base_ = [$/;" v +_base_ .\configs\unet\fcn_unet_s5-d16_64x64_40k_drive.py /^_base_ = [$/;" v +_base_ .\configs\unet\pspnet_unet_s5-d16_128x128_40k_chase_db1.py /^_base_ = [$/;" v +_base_ .\configs\unet\pspnet_unet_s5-d16_128x128_40k_stare.py /^_base_ = [$/;" v +_base_ .\configs\unet\pspnet_unet_s5-d16_256x256_40k_hrf.py /^_base_ = [$/;" v +_base_ .\configs\unet\pspnet_unet_s5-d16_64x64_40k_drive.py /^_base_ = [$/;" v +_base_ .\configs\upernet\upernet_r101_512x1024_40k_cityscapes.py /^_base_ = '.\/upernet_r50_512x1024_40k_cityscapes.py'$/;" v +_base_ .\configs\upernet\upernet_r101_512x1024_80k_cityscapes.py /^_base_ = '.\/upernet_r50_512x1024_80k_cityscapes.py'$/;" v +_base_ .\configs\upernet\upernet_r101_512x512_160k_ade20k.py /^_base_ = '.\/upernet_r50_512x512_160k_ade20k.py'$/;" v +_base_ .\configs\upernet\upernet_r101_512x512_20k_voc12aug.py /^_base_ = '.\/upernet_r50_512x512_20k_voc12aug.py'$/;" v +_base_ .\configs\upernet\upernet_r101_512x512_40k_voc12aug.py /^_base_ = '.\/upernet_r50_512x512_40k_voc12aug.py'$/;" v +_base_ .\configs\upernet\upernet_r101_512x512_80k_ade20k.py /^_base_ = '.\/upernet_r50_512x512_80k_ade20k.py'$/;" v +_base_ .\configs\upernet\upernet_r101_769x769_40k_cityscapes.py /^_base_ = '.\/upernet_r50_769x769_40k_cityscapes.py'$/;" v +_base_ .\configs\upernet\upernet_r101_769x769_80k_cityscapes.py /^_base_ = '.\/upernet_r50_769x769_80k_cityscapes.py'$/;" v +_base_ .\configs\upernet\upernet_r50_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\upernet\upernet_r50_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\upernet\upernet_r50_512x512_160k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\upernet\upernet_r50_512x512_20k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\upernet\upernet_r50_512x512_40k_voc12aug.py /^_base_ = [$/;" v +_base_ .\configs\upernet\upernet_r50_512x512_80k_ade20k.py /^_base_ = [$/;" v +_base_ .\configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^_base_ = [$/;" v +_base_ .\configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^_base_ = [$/;" v +_cfg .\mmseg\models\backbones\pvt.py /^from timm.models.vision_transformer import _cfg$/;" i +_cfg .\mmseg\models\backbones\pvt_dia.py /^from timm.models.vision_transformer import _cfg$/;" i +_cfg .\mmseg\models\backbones\vit.py /^def _cfg(url='', **kwargs):$/;" f +_cfg .\mmseg\models\backbones\vit_mla.py /^def _cfg(url='', **kwargs):$/;" f +_check_branches .\mmseg\models\backbones\hrnet.py /^ def _check_branches(self, num_branches, num_blocks, in_channels,$/;" m class:HRModule +_check_decode_head .\tests\test_config.py /^def _check_decode_head(decode_head_cfg, decode_head):$/;" f +_check_input_devisible .\mmseg\models\backbones\unet.py /^ def _check_input_devisible(self, x):$/;" m class:UNet +_check_input_dim .\tests\test_models\test_forward.py /^def _check_input_dim(self, inputs):$/;" f +_class_to_index .\tools\convert_datasets\pascal_context.py /^ def _class_to_index(mask, _mapping, _key):$/;" f function:generate_labels +_concat_dataset .\mmseg\datasets\builder.py /^def _concat_dataset(cfg, default_args=None):$/;" f +_context_for_ohem .\tests\test_sampler.py /^def _context_for_ohem():$/;" f +_conv_filter .\mmseg\models\backbones\pvt.py /^def _conv_filter(state_dict, patch_size=16):$/;" f +_conv_filter .\mmseg\models\backbones\pvt_dia.py /^def _conv_filter(state_dict, patch_size=16):$/;" f +_conv_filter .\mmseg\models\backbones\vit.py /^ def _conv_filter(self, state_dict, patch_size=16):$/;" m class:VisionTransformer +_conv_filter .\mmseg\models\backbones\vit_mla.py /^ def _conv_filter(self, state_dict, patch_size=16):$/;" m class:VIT_MLA +_conv_has_norm .\tests\test_models\test_heads.py /^def _conv_has_norm(module, sync_bn):$/;" f +_convert_batchnorm .\tests\test_models\test_forward.py /^def _convert_batchnorm(module):$/;" f +_convert_batchnorm .\tools\pytorch2onnx.py /^def _convert_batchnorm(module):$/;" f +_convert_to_label_id .\mmseg\datasets\cityscapes.py /^ def _convert_to_label_id(result):$/;" m class:CityscapesDataset +_convert_to_onehot_labels .\mmseg\models\decode_heads\enc_head.py /^ def _convert_to_onehot_labels(seg_label, num_classes):$/;" m class:EncHead +_decode_head_forward_test .\mmseg\models\segmentors\encoder_decoder.py /^ def _decode_head_forward_test(self, x, img_metas):$/;" m class:EncoderDecoder +_decode_head_forward_train .\mmseg\models\segmentors\cascade_encoder_decoder.py /^ def _decode_head_forward_train(self, x, img_metas, gt_semantic_seg):$/;" m class:CascadeEncoderDecoder +_decode_head_forward_train .\mmseg\models\segmentors\encoder_decoder.py /^ def _decode_head_forward_train(self, x, img_metas, gt_semantic_seg):$/;" m class:EncoderDecoder +_delete_ .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ _delete_=True,$/;" v +_delete_ .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ _delete_=True,$/;" v +_delete_ .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ _delete_=True,$/;" v +_delete_ .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ _delete_=True,$/;" v +_delete_ .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ _delete_=True,$/;" v +_delete_ .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ _delete_=True,$/;" v +_delete_ .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ _delete_=True,$/;" v +_delete_ .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ _delete_=True,$/;" v +_demo_mm_inputs .\tests\test_models\test_forward.py /^def _demo_mm_inputs(input_shape=(2, 3, 8, 16), num_classes=10):$/;" f +_demo_mm_inputs .\tests\test_models\test_segmentor.py /^def _demo_mm_inputs(input_shape=(1, 3, 8, 16), num_classes=10):$/;" f +_demo_mm_inputs .\tools\pytorch2onnx.py /^def _demo_mm_inputs(input_shape, num_classes):$/;" f +_evaluate_cityscapes .\mmseg\datasets\cityscapes.py /^ def _evaluate_cityscapes(self, results, logger, imgfile_prefix):$/;" m class:CityscapesDataset +_expand_onehot_labels .\mmseg\models\losses\cross_entropy_loss.py /^def _expand_onehot_labels(labels, label_weights, target_shape, ignore_index):$/;" f +_freeze_stages .\mmseg\models\backbones\mobilenet_v2.py /^ def _freeze_stages(self):$/;" m class:MobileNetV2 +_freeze_stages .\mmseg\models\backbones\mobilenet_v3.py /^ def _freeze_stages(self):$/;" m class:MobileNetV3 +_freeze_stages .\mmseg\models\backbones\resnet.py /^ def _freeze_stages(self):$/;" m class:ResNet +_get_coarse_point_feats .\mmseg\models\decode_heads\point_head.py /^ def _get_coarse_point_feats(self, prev_output, points):$/;" m class:PointHead +_get_config_directory .\tests\test_config.py /^def _get_config_directory():$/;" f +_get_config_directory .\tests\test_models\test_forward.py /^def _get_config_directory():$/;" f +_get_config_module .\tests\test_models\test_forward.py /^def _get_config_module(fname):$/;" f +_get_fine_grained_point_feats .\mmseg\models\decode_heads\point_head.py /^ def _get_fine_grained_point_feats(self, x, points):$/;" m class:PointHead +_get_pos_embed .\mmseg\models\backbones\pvt.py /^ def _get_pos_embed(self, pos_embed, patch_embed, H, W):$/;" m class:PyramidVisionTransformer +_get_pos_embed .\mmseg\models\backbones\pvt_dia.py /^ def _get_pos_embed(self, pos_embed, patch_embed, H, W):$/;" m class:PyramidVisionTransformer +_get_segmentor_cfg .\tests\test_models\test_forward.py /^def _get_segmentor_cfg(fname):$/;" f +_init_auxiliary_head .\mmseg\models\segmentors\encoder_decoder.py /^ def _init_auxiliary_head(self, auxiliary_head):$/;" m class:EncoderDecoder +_init_decode_head .\mmseg\models\segmentors\cascade_encoder_decoder.py /^ def _init_decode_head(self, decode_head):$/;" m class:CascadeEncoderDecoder +_init_decode_head .\mmseg\models\segmentors\encoder_decoder.py /^ def _init_decode_head(self, decode_head):$/;" m class:EncoderDecoder +_init_inputs .\mmseg\models\decode_heads\decode_head.py /^ def _init_inputs(self, in_channels, in_index, input_transform):$/;" m class:BaseDecodeHead +_init_weights .\mmseg\models\backbones\pvt.py /^ def _init_weights(self, m):$/;" m class:PyramidVisionTransformer +_init_weights .\mmseg\models\backbones\pvt_dia.py /^ def _init_weights(self, m):$/;" m class:PyramidVisionTransformer +_inner_forward .\mmseg\models\backbones\cgnet.py /^ def _inner_forward(x):$/;" f function:ContextGuidedBlock.forward +_inner_forward .\mmseg\models\backbones\cgnet.py /^ def _inner_forward(x):$/;" f function:GlobalContextExtractor.forward +_inner_forward .\mmseg\models\backbones\resnest.py /^ def _inner_forward(x):$/;" f function:Bottleneck.forward +_inner_forward .\mmseg\models\backbones\resnet.py /^ def _inner_forward(x):$/;" f function:BasicBlock.forward +_inner_forward .\mmseg\models\backbones\resnet.py /^ def _inner_forward(x):$/;" f function:Bottleneck.forward +_inner_forward .\mmseg\models\utils\inverted_residual.py /^ def _inner_forward(x):$/;" f function:InvertedResidual.forward +_inner_forward .\mmseg\models\utils\inverted_residual.py /^ def _inner_forward(x):$/;" f function:InvertedResidualV3.forward +_key .\tools\convert_datasets\pascal_context.py /^_key = np.array(range(len(_mapping))).astype('uint8')$/;" v +_logger .\mmseg\models\backbones\helpers.py /^_logger = logging.getLogger(__name__)$/;" v +_logger .\mmseg\models\decode_heads\helpers.py /^_logger = logging.getLogger(__name__)$/;" v +_make_branches .\mmseg\models\backbones\hrnet.py /^ def _make_branches(self, num_branches, block, num_blocks, num_channels):$/;" m class:HRModule +_make_fuse_layers .\mmseg\models\backbones\hrnet.py /^ def _make_fuse_layers(self):$/;" m class:HRModule +_make_layer .\mmseg\models\backbones\fast_scnn.py /^ def _make_layer(self,$/;" m class:GlobalFeatureExtractor +_make_layer .\mmseg\models\backbones\hrnet.py /^ def _make_layer(self, block, inplanes, planes, blocks, stride=1):$/;" m class:HRNet +_make_layer .\mmseg\models\backbones\mobilenet_v3.py /^ def _make_layer(self):$/;" m class:MobileNetV3 +_make_one_branch .\mmseg\models\backbones\hrnet.py /^ def _make_one_branch(self,$/;" m class:HRModule +_make_stage .\mmseg\models\backbones\hrnet.py /^ def _make_stage(self, layer_config, in_channels, multiscale_output=True):$/;" m class:HRNet +_make_stem_layer .\mmseg\models\backbones\resnet.py /^ def _make_stem_layer(self, in_channels, stem_channels):$/;" m class:ResNet +_make_transition_layer .\mmseg\models\backbones\hrnet.py /^ def _make_transition_layer(self, num_channels_pre_layer,$/;" m class:HRNet +_mapping .\tools\convert_datasets\pascal_context.py /^_mapping = np.sort($/;" v +_no_grad_trunc_normal_ .\mmseg\models\backbones\layers\weight_init.py /^def _no_grad_trunc_normal_(tensor, mean, std, a, b):$/;" f +_no_grad_trunc_normal_ .\mmseg\models\decode_heads\layers\weight_init.py /^def _no_grad_trunc_normal_(tensor, mean, std, a, b):$/;" f +_ntuple .\mmseg\models\backbones\layers\helpers.py /^def _ntuple(n):$/;" f +_ntuple .\mmseg\models\decode_heads\layers\helpers.py /^def _ntuple(n):$/;" f +_pad_img .\mmseg\datasets\pipelines\transforms.py /^ def _pad_img(self, results):$/;" m class:Pad +_pad_seg .\mmseg\datasets\pipelines\transforms.py /^ def _pad_seg(self, results):$/;" m class:Pad +_papertype .\docs\stat.py /^ _papertype = [x for x in re.findall(r'\\[([A-Z]+)\\]', content)]$/;" v +_parse_losses .\mmseg\models\segmentors\base.py /^ def _parse_losses(losses):$/;" m class:BaseSegmentor +_random_scale .\mmseg\datasets\pipelines\transforms.py /^ def _random_scale(self, results):$/;" m class:Resize +_resize_img .\mmseg\datasets\pipelines\transforms.py /^ def _resize_img(self, results):$/;" m class:Resize +_resize_seg .\mmseg\datasets\pipelines\transforms.py /^ def _resize_seg(self, results):$/;" m class:Resize +_segmentor_forward_train_test .\tests\test_models\test_segmentor.py /^def _segmentor_forward_train_test(segmentor):$/;" f +_test_encoder_decoder_forward .\tests\test_models\test_forward.py /^def _test_encoder_decoder_forward(cfg_file):$/;" f +_transform_inputs .\mmseg\models\decode_heads\decode_head.py /^ def _transform_inputs(self, inputs):$/;" m class:BaseDecodeHead +abstractmethod .\mmseg\core\seg\sampler\base_pixel_sampler.py /^from abc import ABCMeta, abstractmethod$/;" i +abstractmethod .\mmseg\models\decode_heads\cascade_decode_head.py /^from abc import ABCMeta, abstractmethod$/;" i +abstractmethod .\mmseg\models\decode_heads\decode_head.py /^from abc import ABCMeta, abstractmethod$/;" i +abstractmethod .\mmseg\models\segmentors\base.py /^from abc import ABCMeta, abstractmethod$/;" i +accuracy .\mmseg\models\decode_heads\decode_head.py /^from ..losses import accuracy$/;" i +accuracy .\mmseg\models\decode_heads\point_head.py /^from ..losses import accuracy$/;" i +accuracy .\mmseg\models\losses\__init__.py /^from .accuracy import Accuracy, accuracy$/;" i +accuracy .\mmseg\models\losses\accuracy.py /^def accuracy(pred, target, topk=1, thresh=None):$/;" f +act_cfg .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ act_cfg=dict(type='ReLU'),$/;" v +act_cfg .\configs\_base_\models\fcn_unet_s5-d16.py /^ act_cfg=dict(type='ReLU'),$/;" v +act_cfg .\configs\_base_\models\lraspp_m-v3-d8.py /^ act_cfg=dict(type='ReLU'),$/;" v +act_cfg .\configs\_base_\models\pspnet_unet_s5-d16.py /^ act_cfg=dict(type='ReLU'),$/;" v +act_cfg .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ act_cfg=dict(type='ReLU'),$/;" v +act_cfg .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ act_cfg=dict(type='ReLU'),$/;" v +add_lateral .\configs\_base_\models\encnet_r50-d8.py /^ add_lateral=False,$/;" v +add_prefix .\mmseg\core\utils\__init__.py /^from .misc import add_prefix$/;" i +add_prefix .\mmseg\core\utils\misc.py /^def add_prefix(inputs, prefix):$/;" f +add_prefix .\mmseg\models\decode_heads\da_head.py /^from mmseg.core import add_prefix$/;" i +add_prefix .\mmseg\models\segmentors\cascade_encoder_decoder.py /^from mmseg.core import add_prefix$/;" i +add_prefix .\mmseg\models\segmentors\encoder_decoder.py /^from mmseg.core import add_prefix$/;" i +ade_classes .\mmseg\core\evaluation\class_names.py /^def ade_classes():$/;" f +ade_palette .\mmseg\core\evaluation\class_names.py /^def ade_palette():$/;" f +after_train_epoch .\mmseg\core\evaluation\eval_hooks.py /^ def after_train_epoch(self, runner):$/;" m class:DistEvalHook +after_train_epoch .\mmseg\core\evaluation\eval_hooks.py /^ def after_train_epoch(self, runner):$/;" m class:EvalHook +after_train_iter .\mmseg\core\evaluation\eval_hooks.py /^ def after_train_iter(self, runner):$/;" m class:DistEvalHook +after_train_iter .\mmseg\core\evaluation\eval_hooks.py /^ def after_train_iter(self, runner):$/;" m class:EvalHook +aggregate .\mmseg\ops\encoding.py /^ def aggregate(assigment_weights, x, codewords):$/;" m class:Encoding +align_corners .\configs\_base_\models\ann_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\apcnet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\ccnet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\danet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\deeplabv3_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\dmnet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\dnl_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\emanet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\encnet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\fast_scnn.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\fast_scnn.py /^ align_corners=False),$/;" v +align_corners .\configs\_base_\models\fast_scnn.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\fcn_hr18.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\fcn_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\fcn_unet_s5-d16.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\fpn_r50.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\gcnet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\lraspp_m-v3-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\nonlocal_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\ocrnet_hr18.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\ocrnet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\pointrend_r50.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\psanet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\pspnet_r50-d8.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\pspnet_unet_s5-d16.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\setr_mla.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\setr_naive_pup.py /^ align_corners=False,$/;" v +align_corners .\configs\_base_\models\upernet_r50.py /^ align_corners=False,$/;" v +align_corners .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ align_corners=False,$/;" v +align_corners .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ align_corners=False,$/;" v +align_corners .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ align_corners=False,$/;" v +align_corners .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ align_corners=False,$/;" v +align_corners .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ align_corners=False,$/;" v +align_corners .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ align_corners=False, $/;" v +align_corners .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ align_corners=False,$/;" v +align_corners .\configs\foodnet\ccnet_vit_768x768_80k.py /^ align_corners=False,$/;" v +align_corners .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ align_corners=False,$/;" v +align_corners .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ align_corners=False,$/;" v +align_corners .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ align_corners=False,$/;" v +align_corners .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ align_corners=False,$/;" v +all_zeros .\tests\test_models\test_backbone.py /^def all_zeros(modules):$/;" f +allpapers .\docs\stat.py /^allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats])$/;" v +ann_dir .\configs\_base_\datasets\FoodSeg103.py /^ ann_dir='ann_dir\/test',$/;" v +ann_dir .\configs\_base_\datasets\FoodSeg103.py /^ ann_dir='ann_dir\/train',$/;" v +ann_dir .\configs\_base_\datasets\ade20k.py /^ ann_dir='annotations\/training',$/;" v +ann_dir .\configs\_base_\datasets\ade20k.py /^ ann_dir='annotations\/validation',$/;" v +ann_dir .\configs\_base_\datasets\chase_db1.py /^ ann_dir='annotations\/training',$/;" v +ann_dir .\configs\_base_\datasets\chase_db1.py /^ ann_dir='annotations\/validation',$/;" v +ann_dir .\configs\_base_\datasets\cityscapes.py /^ ann_dir='gtFine\/train',$/;" v +ann_dir .\configs\_base_\datasets\cityscapes.py /^ ann_dir='gtFine\/val',$/;" v +ann_dir .\configs\_base_\datasets\drive.py /^ ann_dir='annotations\/training',$/;" v +ann_dir .\configs\_base_\datasets\drive.py /^ ann_dir='annotations\/validation',$/;" v +ann_dir .\configs\_base_\datasets\hrf.py /^ ann_dir='annotations\/training',$/;" v +ann_dir .\configs\_base_\datasets\hrf.py /^ ann_dir='annotations\/validation',$/;" v +ann_dir .\configs\_base_\datasets\pascal_context.py /^ ann_dir='SegmentationClassContext',$/;" v +ann_dir .\configs\_base_\datasets\pascal_voc12.py /^ ann_dir='SegmentationClass',$/;" v +ann_dir .\configs\_base_\datasets\pascal_voc12_aug.py /^ ann_dir=['SegmentationClass', 'SegmentationClassAug'],$/;" v +ann_dir .\configs\_base_\datasets\stare.py /^ ann_dir='annotations\/training',$/;" v +ann_dir .\configs\_base_\datasets\stare.py /^ ann_dir='annotations\/validation',$/;" v +ann_dir .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ ann_dir='gtFine\/train',$/;" v +ann_dir .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ ann_dir='gtFine\/val',$/;" v +arch .\configs\_base_\models\lraspp_m-v3-d8.py /^ arch='large',$/;" v +arch .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ arch='small',$/;" v +arch .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ arch='small',$/;" v +arch_settings .\mmseg\models\backbones\mobilenet_v2.py /^ arch_settings = [[1, 16, 1], [6, 24, 2], [6, 32, 3], [6, 64, 4],$/;" v class:MobileNetV2 +arch_settings .\mmseg\models\backbones\mobilenet_v3.py /^ arch_settings = {$/;" v class:MobileNetV3 +arch_settings .\mmseg\models\backbones\resnest.py /^ arch_settings = {$/;" v class:ResNeSt +arch_settings .\mmseg\models\backbones\resnet.py /^ arch_settings = {$/;" v class:ResNet +arch_settings .\mmseg\models\backbones\resnext.py /^ arch_settings = {$/;" v class:ResNeXt +argparse .\.dev\gather_models.py /^import argparse$/;" i +argparse .\.dev\upload_modelzoo.py /^import argparse$/;" i +argparse .\tools\benchmark.py /^import argparse$/;" i +argparse .\tools\convert_datasets\chase_db1.py /^import argparse$/;" i +argparse .\tools\convert_datasets\cityscapes.py /^import argparse$/;" i +argparse .\tools\convert_datasets\drive.py /^import argparse$/;" i +argparse .\tools\convert_datasets\hrf.py /^import argparse$/;" i +argparse .\tools\convert_datasets\pascal_context.py /^import argparse$/;" i +argparse .\tools\convert_datasets\stare.py /^import argparse$/;" i +argparse .\tools\convert_datasets\voc_aug.py /^import argparse$/;" i +argparse .\tools\get_flops.py /^import argparse$/;" i +argparse .\tools\print_config.py /^import argparse$/;" i +argparse .\tools\publish_model.py /^import argparse$/;" i +argparse .\tools\pytorch2onnx.py /^import argparse$/;" i +argparse .\tools\test.py /^import argparse$/;" i +argparse .\tools\train.py /^import argparse$/;" i +args .\tools\pytorch2onnx.py /^ args = parse_args()$/;" v +aug_test .\mmseg\models\segmentors\base.py /^ def aug_test(self, imgs, img_metas, **kwargs):$/;" m class:BaseSegmentor +aug_test .\mmseg\models\segmentors\encoder_decoder.py /^ def aug_test(self, imgs, img_metas, rescale=True):$/;" m class:EncoderDecoder +author .\docs\conf.py /^author = 'MMSegmentation Authors'$/;" v +auto_fp16 .\mmseg\models\decode_heads\decode_head.py /^from mmcv.runner import auto_fp16, force_fp32$/;" i +auto_fp16 .\mmseg\models\segmentors\base.py /^from mmcv.runner import auto_fp16$/;" i +autodoc_mock_imports .\docs\conf.py /^autodoc_mock_imports = ['matplotlib', 'pycocotools', 'mmseg.version']$/;" v +auxiliary_head .\configs\_base_\models\ann_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\apcnet_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\ccnet_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\danet_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\deeplabv3_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\dmnet_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\dnl_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\emanet_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\encnet_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\fast_scnn.py /^ auxiliary_head=[$/;" v +auxiliary_head .\configs\_base_\models\fcn_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\fcn_unet_s5-d16.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\gcnet_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\nonlocal_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\psanet_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\pspnet_r50-d8.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\pspnet_unet_s5-d16.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\_base_\models\upernet_r50.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^ auxiliary_head=dict(num_classes=60),$/;" v +auxiliary_head .\configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^ auxiliary_head=dict(num_classes=60),$/;" v +auxiliary_head .\configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^ auxiliary_head=dict(num_classes=60),$/;" v +auxiliary_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^ auxiliary_head=dict(num_classes=60),$/;" v +auxiliary_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^ auxiliary_head=dict(num_classes=150))$/;" v +auxiliary_head .\configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ auxiliary_head=[$/;" v +auxiliary_head .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ auxiliary_head=[$/;" v +auxiliary_head .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ auxiliary_head=[$/;" v +auxiliary_head .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ auxiliary_head=[$/;" v +auxiliary_head .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ auxiliary_head=[$/;" v +auxiliary_head .\configs\foodnet\ccnet_vit_768x768_80k.py /^ auxiliary_head=dict($/;" v +auxiliary_head .\configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=96))$/;" v +auxiliary_head .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(in_channels=96))$/;" v +auxiliary_head .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=96))$/;" v +auxiliary_head .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(in_channels=96))$/;" v +auxiliary_head .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=96))$/;" v +auxiliary_head .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(in_channels=96))$/;" v +auxiliary_head .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=96))$/;" v +auxiliary_head .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(in_channels=96))$/;" v +auxiliary_head .\configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\psanet\psanet_r50-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(num_classes=150))$/;" v +auxiliary_head .\configs\psanet\psanet_r50-d8_512x512_80k_ade20k.py /^ auxiliary_head=dict(num_classes=150))$/;" v +auxiliary_head .\configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +auxiliary_head .\configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +auxiliary_head .\configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +avg_down_stride .\configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ avg_down_stride=True))$/;" v +avg_down_stride .\configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ avg_down_stride=True))$/;" v +avg_down_stride .\configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ avg_down_stride=True))$/;" v +avg_down_stride .\configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ avg_down_stride=True))$/;" v +avg_down_stride .\configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ avg_down_stride=True))$/;" v +avg_down_stride .\configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ avg_down_stride=True))$/;" v +avg_down_stride .\configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ avg_down_stride=True))$/;" v +avg_down_stride .\configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ avg_down_stride=True))$/;" v +backbone .\configs\_base_\models\ann_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\apcnet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\ccnet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\cgnet.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\danet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\deeplabv3_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\dmnet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\dnl_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\emanet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\encnet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\fast_scnn.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\fcn_hr18.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\fcn_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\fcn_unet_s5-d16.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\fpn_r50.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\gcnet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\lraspp_m-v3-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\nonlocal_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\ocrnet_hr18.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\ocrnet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\pointrend_r50.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\psanet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\pspnet_r50-d8.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\pspnet_unet_s5-d16.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\setr_mla.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\setr_naive_pup.py /^ backbone=dict($/;" v +backbone .\configs\_base_\models\upernet_r50.py /^ backbone=dict($/;" v +backbone .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\deeplabv3\deeplabv3_r101b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +backbone .\configs\deeplabv3\deeplabv3_r101b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +backbone .\configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +backbone .\configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +backbone .\configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +backbone .\configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +backbone .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\deeplabv3plus\deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +backbone .\configs\deeplabv3plus\deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +backbone .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +backbone .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +backbone .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +backbone .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +backbone .\configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^ backbone=dict(stem_channels=128),$/;" v +backbone .\configs\fcn\fcn_r101b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +backbone .\configs\fcn\fcn_r101b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +backbone .\configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +backbone .\configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +backbone .\configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +backbone .\configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +backbone .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ backbone=dict($/;" v +backbone .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ backbone=dict($/;" v +backbone .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ backbone=dict($/;" v +backbone .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ backbone=dict($/;" v +backbone .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ backbone=dict($/;" v +backbone .\configs\foodnet\ccnet_vit_768x768_80k.py /^ backbone=dict($/;" v +backbone .\configs\foodnet\fpn_r50_512x1024_80k_RM.py /^ backbone=dict(type='ResNet'), $/;" v +backbone .\configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ backbone=dict($/;" v +backbone .\configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ backbone=dict($/;" v +backbone .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\pspnet\pspnet_r101b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +backbone .\configs\pspnet\pspnet_r101b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +backbone .\configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +backbone .\configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +backbone .\configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +backbone .\configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +backbone .\configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +backbone .\configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +backbone .\configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +base_channels .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ base_channels=64,$/;" v +base_channels .\configs\_base_\models\fcn_unet_s5-d16.py /^ base_channels=64,$/;" v +base_channels .\configs\_base_\models\pspnet_unet_s5-d16.py /^ base_channels=64,$/;" v +binary_cross_entropy .\mmseg\models\losses\__init__.py /^from .cross_entropy_loss import (CrossEntropyLoss, binary_cross_entropy,$/;" i +binary_cross_entropy .\mmseg\models\losses\cross_entropy_loss.py /^def binary_cross_entropy(pred,$/;" f +block .\configs\_base_\models\fcn_hr18.py /^ block='BASIC',$/;" v +block .\configs\_base_\models\fcn_hr18.py /^ block='BOTTLENECK',$/;" v +block .\configs\_base_\models\ocrnet_hr18.py /^ block='BASIC',$/;" v +block .\configs\_base_\models\ocrnet_hr18.py /^ block='BOTTLENECK',$/;" v +blocks_dict .\mmseg\models\backbones\hrnet.py /^ blocks_dict = {'BASIC': BasicBlock, 'BOTTLENECK': Bottleneck}$/;" v class:HRNet +brightness .\mmseg\datasets\pipelines\transforms.py /^ def brightness(self, img):$/;" m class:PhotoMetricDistortion +build .\mmseg\models\builder.py /^def build(cfg, registry, default_args=None):$/;" f +build_activation_layer .\mmseg\models\backbones\unet.py /^from mmcv.cnn import (UPSAMPLE_LAYERS, ConvModule, build_activation_layer,$/;" i +build_activation_layer .\mmseg\models\decode_heads\dm_head.py /^from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer$/;" i +build_backbone .\mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +build_backbone .\mmseg\models\builder.py /^def build_backbone(cfg):$/;" f +build_conv_layer .\mmseg\models\backbones\cgnet.py /^from mmcv.cnn import (ConvModule, build_conv_layer, build_norm_layer,$/;" i +build_conv_layer .\mmseg\models\backbones\hrnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, constant_init,$/;" i +build_conv_layer .\mmseg\models\backbones\resnest.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +build_conv_layer .\mmseg\models\backbones\resnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, build_plugin_layer,$/;" i +build_conv_layer .\mmseg\models\backbones\resnext.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +build_conv_layer .\mmseg\models\utils\res_layer.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +build_dataloader .\mmseg\apis\train.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_dataloader .\mmseg\datasets\__init__.py /^from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset$/;" i +build_dataloader .\mmseg\datasets\builder.py /^def build_dataloader(dataset,$/;" f +build_dataloader .\tests\test_data\test_dataset_builder.py /^from mmseg.datasets import (DATASETS, ConcatDataset, build_dataloader,$/;" i +build_dataloader .\tools\benchmark.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_dataloader .\tools\test.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_dataset .\mmseg\apis\train.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_dataset .\mmseg\datasets\__init__.py /^from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset$/;" i +build_dataset .\mmseg\datasets\builder.py /^def build_dataset(cfg, default_args=None):$/;" f +build_dataset .\tools\benchmark.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_dataset .\tools\test.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_dataset .\tools\train.py /^from mmseg.datasets import build_dataset$/;" i +build_from_cfg .\mmseg\core\seg\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +build_from_cfg .\mmseg\datasets\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +build_from_cfg .\mmseg\datasets\pipelines\compose.py /^from mmcv.utils import build_from_cfg$/;" i +build_from_cfg .\mmseg\models\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +build_from_cfg .\tests\test_data\test_transform.py /^from mmcv.utils import build_from_cfg$/;" i +build_from_cfg .\tests\test_data\test_tta.py /^from mmcv.utils import build_from_cfg$/;" i +build_head .\mmseg\models\builder.py /^def build_head(cfg):$/;" f +build_loss .\mmseg\models\builder.py /^def build_loss(cfg):$/;" f +build_loss .\mmseg\models\decode_heads\decode_head.py /^from ..builder import build_loss$/;" i +build_loss .\mmseg\models\decode_heads\enc_head.py /^from ..builder import HEADS, build_loss$/;" i +build_loss .\tests\test_models\test_losses.py /^ from mmseg.models import build_loss$/;" i +build_neck .\mmseg\models\builder.py /^def build_neck(cfg):$/;" f +build_norm_layer .\mmseg\models\backbones\cgnet.py /^from mmcv.cnn import (ConvModule, build_conv_layer, build_norm_layer,$/;" i +build_norm_layer .\mmseg\models\backbones\hrnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, constant_init,$/;" i +build_norm_layer .\mmseg\models\backbones\resnest.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +build_norm_layer .\mmseg\models\backbones\resnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, build_plugin_layer,$/;" i +build_norm_layer .\mmseg\models\backbones\resnext.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +build_norm_layer .\mmseg\models\backbones\vit.py /^from mmcv.cnn import build_norm_layer$/;" i +build_norm_layer .\mmseg\models\backbones\vit_mla.py /^from mmcv.cnn import build_norm_layer$/;" i +build_norm_layer .\mmseg\models\decode_heads\dm_head.py /^from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer$/;" i +build_norm_layer .\mmseg\models\decode_heads\enc_head.py /^from mmcv.cnn import ConvModule, build_norm_layer$/;" i +build_norm_layer .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^from mmcv.cnn import build_norm_layer$/;" i +build_norm_layer .\mmseg\models\decode_heads\vit_mla_head.py /^from mmcv.cnn import build_norm_layer$/;" i +build_norm_layer .\mmseg\models\decode_heads\vit_up_head.py /^from mmcv.cnn import build_norm_layer$/;" i +build_norm_layer .\mmseg\models\utils\res_layer.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +build_optimizer .\mmseg\apis\train.py /^from mmcv.runner import build_optimizer, build_runner$/;" i +build_pixel_sampler .\mmseg\core\seg\__init__.py /^from .builder import build_pixel_sampler$/;" i +build_pixel_sampler .\mmseg\core\seg\builder.py /^def build_pixel_sampler(cfg, **default_args):$/;" f +build_pixel_sampler .\mmseg\models\decode_heads\decode_head.py /^from mmseg.core import build_pixel_sampler$/;" i +build_plugin_layer .\mmseg\models\backbones\resnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, build_plugin_layer,$/;" i +build_project .\mmseg\models\utils\self_attention_block.py /^ def build_project(self, in_channels, channels, num_convs, use_conv_module,$/;" m class:SelfAttentionBlock +build_runner .\mmseg\apis\train.py /^from mmcv.runner import build_optimizer, build_runner$/;" i +build_segmentor .\mmseg\apis\inference.py /^from mmseg.models import build_segmentor$/;" i +build_segmentor .\mmseg\models\builder.py /^def build_segmentor(cfg, train_cfg=None, test_cfg=None):$/;" f +build_segmentor .\tests\test_config.py /^from mmseg.models import build_segmentor$/;" i +build_segmentor .\tests\test_models\test_forward.py /^ from mmseg.models import build_segmentor$/;" i +build_segmentor .\tests\test_models\test_segmentor.py /^from mmseg.models import BACKBONES, HEADS, build_segmentor$/;" i +build_segmentor .\tools\benchmark.py /^from mmseg.models import build_segmentor$/;" i +build_segmentor .\tools\get_flops.py /^from mmseg.models import build_segmentor$/;" i +build_segmentor .\tools\pytorch2onnx.py /^from mmseg.models import build_segmentor$/;" i +build_segmentor .\tools\test.py /^from mmseg.models import build_segmentor$/;" i +build_segmentor .\tools\train.py /^from mmseg.models import build_segmentor$/;" i +build_upsample_layer .\mmseg\models\utils\up_conv_block.py /^from mmcv.cnn import ConvModule, build_upsample_layer$/;" i +builder .\mmseg\models\segmentors\cascade_encoder_decoder.py /^from .. import builder$/;" i +builder .\mmseg\models\segmentors\encoder_decoder.py /^from .. import builder$/;" i +builder_inited_handler .\docs\conf.py /^def builder_inited_handler(app):$/;" f +by_epoch .\configs\_base_\schedules\schedule_80k_step.py /^ by_epoch=False)$/;" v +by_epoch .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ by_epoch=False)$/;" v +c .\mmseg\models\losses\lovasz_loss.py /^ fg = (labels == c).float() # foreground for class c$/;" c function:lovasz_softmax_flat +c1_channels .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ c1_channels=48,$/;" v +c1_channels .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ c1_channels=12,$/;" v +c1_channels .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ c1_channels=12,$/;" v +c1_channels .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ c1_channels=12,$/;" v +c1_channels .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ c1_channels=12,$/;" v +c1_in_channels .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ c1_in_channels=256,$/;" v +c1_in_channels .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ c1_in_channels=64,$/;" v +c1_in_channels .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ c1_in_channels=64,$/;" v +c1_in_channels .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ c1_in_channels=64,$/;" v +c1_in_channels .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ c1_in_channels=64,$/;" v +calculate_uncertainty .\mmseg\models\decode_heads\point_head.py /^def calculate_uncertainty(seg_logits):$/;" f +cam_cls_seg .\mmseg\models\decode_heads\da_head.py /^ def cam_cls_seg(self, feat):$/;" m class:DAHead +cfg .\tools\pytorch2onnx.py /^ cfg = mmcv.Config.fromfile(args.config)$/;" v +channels .\configs\_base_\models\ann_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\ann_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\apcnet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\apcnet_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\ccnet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\ccnet_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\cgnet.py /^ channels=256,$/;" v +channels .\configs\_base_\models\danet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\danet_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\deeplabv3_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\deeplabv3_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ channels=16,$/;" v +channels .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ channels=64,$/;" v +channels .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\dmnet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\dmnet_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\dnl_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\dnl_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\emanet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\encnet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\encnet_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\fast_scnn.py /^ channels=32,$/;" v +channels .\configs\_base_\models\fast_scnn.py /^ channels=128,$/;" v +channels .\configs\_base_\models\fcn_hr18.py /^ channels=sum([18, 36, 72, 144]),$/;" v +channels .\configs\_base_\models\fcn_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\fcn_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\fcn_unet_s5-d16.py /^ channels=64,$/;" v +channels .\configs\_base_\models\fpn_r50.py /^ channels=128,$/;" v +channels .\configs\_base_\models\gcnet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\gcnet_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\lraspp_m-v3-d8.py /^ channels=128,$/;" v +channels .\configs\_base_\models\nonlocal_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\nonlocal_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\ocrnet_hr18.py /^ channels=512,$/;" v +channels .\configs\_base_\models\ocrnet_hr18.py /^ channels=sum([18, 36, 72, 144]),$/;" v +channels .\configs\_base_\models\ocrnet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\ocrnet_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\pointrend_r50.py /^ channels=128,$/;" v +channels .\configs\_base_\models\pointrend_r50.py /^ channels=256,$/;" v +channels .\configs\_base_\models\psanet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\psanet_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\pspnet_r50-d8.py /^ channels=256,$/;" v +channels .\configs\_base_\models\pspnet_r50-d8.py /^ channels=512,$/;" v +channels .\configs\_base_\models\pspnet_unet_s5-d16.py /^ channels=16,$/;" v +channels .\configs\_base_\models\pspnet_unet_s5-d16.py /^ channels=64,$/;" v +channels .\configs\_base_\models\setr_mla.py /^ channels=512,$/;" v +channels .\configs\_base_\models\setr_naive_pup.py /^ channels=512,$/;" v +channels .\configs\_base_\models\upernet_r50.py /^ channels=256,$/;" v +channels .\configs\_base_\models\upernet_r50.py /^ channels=512,$/;" v +channels .\configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ channels=512,$/;" v +channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ channels=512,$/;" v +channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ channels=512,$/;" v +channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ channels=512,$/;" v +channels .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ channels=512,$/;" v +channels .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ channels=512,$/;" v +channels .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ channels=sum([18, 36, 72, 144]),$/;" v +channels .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ channels=sum([18, 36, 72, 144]),$/;" v +channels .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ channels=sum([18, 36, 72, 144]),$/;" v +channels .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ channels=sum([18, 36, 72, 144]),$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ channels=sum([48, 96, 192, 384]),$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ channels=sum([48, 96, 192, 384]),$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ channels=sum([48, 96, 192, 384]),$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ channels=sum([48, 96, 192, 384]),$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ channels=sum([48, 96, 192, 384]),$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ channels=sum([48, 96, 192, 384]),$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ channels=512,$/;" v +channels .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ channels=sum([48, 96, 192, 384]),$/;" v +channels .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ channels=128,$/;" v +channels .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ channels=256,$/;" v +channels .\configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +channels .\configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +check_norm_state .\tests\test_models\test_backbone.py /^def check_norm_state(modules, train_state):$/;" f +check_norm_state .\tests\test_models\test_unet.py /^def check_norm_state(modules, train_state):$/;" f +checkpoint_config .\configs\_base_\schedules\schedule_160k.py /^checkpoint_config = dict(by_epoch=False, interval=16000)$/;" v +checkpoint_config .\configs\_base_\schedules\schedule_20k.py /^checkpoint_config = dict(by_epoch=False, interval=2000)$/;" v +checkpoint_config .\configs\_base_\schedules\schedule_40k.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +checkpoint_config .\configs\_base_\schedules\schedule_80k.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +checkpoint_config .\configs\_base_\schedules\schedule_80k_step.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +checkpoint_config .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +checkpoint_config .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +checkpoint_config .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +checkpoint_config .\configs\foodnet\fpn_r50_512x1024_80k.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +checkpoint_config .\configs\foodnet\fpn_r50_512x1024_80k_RM.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +cityscapes_classes .\mmseg\core\evaluation\class_names.py /^def cityscapes_classes():$/;" f +cityscapes_palette .\mmseg\core\evaluation\class_names.py /^def cityscapes_palette():$/;" f +cityscapesscripts .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa$/;" i +cityscapesscripts .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +cityscapesscripts .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +ckpts .\docs\stat.py /^ ckpts = set(x.lower().strip()$/;" v +class_pred .\mmseg\models\losses\lovasz_loss.py /^ class_pred = probs[:, 0]$/;" v class:lovasz_softmax_flat.c +class_pred .\mmseg\models\losses\lovasz_loss.py /^ class_pred = probs[:, c]$/;" v class:lovasz_softmax_flat.c +class_weight .\configs\_base_\models\cgnet.py /^ class_weight=[$/;" v +cls_seg .\mmseg\models\decode_heads\decode_head.py /^ def cls_seg(self, feat):$/;" m class:BaseDecodeHead +cls_seg .\mmseg\models\decode_heads\point_head.py /^ def cls_seg(self, feat):$/;" m class:PointHead +coarse_pred_each_layer .\configs\_base_\models\pointrend_r50.py /^ coarse_pred_each_layer=True,$/;" v +coarse_pred_each_layer .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ coarse_pred_each_layer=True,$/;" v +collate .\mmseg\apis\inference.py /^from mmcv.parallel import collate, scatter$/;" i +collate .\mmseg\datasets\builder.py /^from mmcv.parallel import collate$/;" i +collect_base_env .\mmseg\utils\collect_env.py /^from mmcv.utils import collect_env as collect_base_env$/;" i +collect_env .\mmseg\utils\__init__.py /^from .collect_env import collect_env$/;" i +collect_env .\mmseg\utils\collect_env.py /^def collect_env():$/;" f +collect_env .\tools\train.py /^from mmseg.utils import collect_env, get_root_logger$/;" i +collect_results_cpu .\mmseg\apis\test.py /^def collect_results_cpu(result_part, size, tmpdir=None):$/;" f +collect_results_gpu .\mmseg\apis\test.py /^def collect_results_gpu(result_part, size):$/;" f +collections .\mmseg\datasets\pipelines\compose.py /^import collections$/;" i +compact .\configs\_base_\models\psanet_r50-d8.py /^ compact=False,$/;" v +concat_input .\configs\_base_\models\ann_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\apcnet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\ccnet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\cgnet.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\danet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\deeplabv3_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\dmnet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\dnl_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\emanet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\encnet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\fast_scnn.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\fast_scnn.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\fcn_hr18.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\fcn_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\fcn_r50-d8.py /^ concat_input=True,$/;" v +concat_input .\configs\_base_\models\fcn_unet_s5-d16.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\gcnet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\nonlocal_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\ocrnet_hr18.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\ocrnet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\psanet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\pspnet_r50-d8.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\pspnet_unet_s5-d16.py /^ concat_input=False,$/;" v +concat_input .\configs\_base_\models\upernet_r50.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ concat_input=False,$/;" v +concat_input .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ concat_input=False,$/;" v +constant_init .\mmseg\models\backbones\fast_scnn.py /^from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, constant_init,$/;" i +constant_init .\mmseg\models\backbones\hrnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, constant_init,$/;" i +constant_init .\mmseg\models\backbones\mobilenet_v2.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +constant_init .\mmseg\models\backbones\mobilenet_v3.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +constant_init .\mmseg\models\utils\self_attention_block.py /^from mmcv.cnn import ConvModule, constant_init$/;" i +container_abcs .\mmseg\models\backbones\layers\helpers.py /^from torch._six import container_abcs$/;" i +container_abcs .\mmseg\models\decode_heads\layers\helpers.py /^from torch._six import container_abcs$/;" i +content .\docs\stat.py /^ content = content_file.read()$/;" v +contract_dilation .\configs\_base_\models\ann_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\apcnet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\ccnet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\danet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\deeplabv3_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\dmnet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\dnl_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\emanet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\encnet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\fcn_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\fpn_r50.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\gcnet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\nonlocal_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\ocrnet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\pointrend_r50.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\psanet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\pspnet_r50-d8.py /^ contract_dilation=True),$/;" v +contract_dilation .\configs\_base_\models\upernet_r50.py /^ contract_dilation=True),$/;" v +contrast .\mmseg\datasets\pipelines\transforms.py /^ def contrast(self, img):$/;" m class:PhotoMetricDistortion +conv_cfg .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ conv_cfg=None,$/;" v +conv_cfg .\configs\_base_\models\fcn_unet_s5-d16.py /^ conv_cfg=None,$/;" v +conv_cfg .\configs\_base_\models\pspnet_unet_s5-d16.py /^ conv_cfg=None,$/;" v +convert .\mmseg\datasets\pipelines\transforms.py /^ def convert(self, img, alpha=1, beta=0):$/;" m class:PhotoMetricDistortion +convert_json_to_label .\tools\convert_datasets\cityscapes.py /^def convert_json_to_label(json_file):$/;" f +convert_mat .\tools\convert_datasets\voc_aug.py /^def convert_mat(mat_file, in_dir, out_dir):$/;" f +copy .\mmseg\datasets\builder.py /^import copy$/;" i +copy .\tests\test_data\test_loading.py /^import copy$/;" i +copy .\tests\test_data\test_transform.py /^import copy$/;" i +copy .\tests\test_models\test_forward.py /^import copy$/;" i +copy .\tools\train.py /^import copy$/;" i +copyright .\docs\conf.py /^copyright = '2020-2020, OpenMMLab'$/;" v +countstr .\docs\stat.py /^countstr = '\\n'.join($/;" v +cp .\mmseg\models\backbones\cgnet.py /^import torch.utils.checkpoint as cp$/;" i +cp .\mmseg\models\backbones\resnest.py /^import torch.utils.checkpoint as cp$/;" i +cp .\mmseg\models\backbones\resnet.py /^import torch.utils.checkpoint as cp$/;" i +cp .\mmseg\models\backbones\unet.py /^import torch.utils.checkpoint as cp$/;" i +cp .\mmseg\models\utils\inverted_residual.py /^from torch.utils import checkpoint as cp$/;" i +crop .\mmseg\datasets\pipelines\transforms.py /^ def crop(self, img, crop_bbox):$/;" m class:RandomCrop +crop_size .\configs\_base_\datasets\FoodSeg103.py /^crop_size = (512, 1024)$/;" v +crop_size .\configs\_base_\datasets\Recipe1M_768x768.py /^crop_size = (768, 768)$/;" v +crop_size .\configs\_base_\datasets\ade20k.py /^crop_size = (512, 512)$/;" v +crop_size .\configs\_base_\datasets\chase_db1.py /^crop_size = (128, 128)$/;" v +crop_size .\configs\_base_\datasets\cityscapes.py /^crop_size = (512, 1024)$/;" v +crop_size .\configs\_base_\datasets\cityscapes_769x769.py /^crop_size = (769, 769)$/;" v +crop_size .\configs\_base_\datasets\drive.py /^crop_size = (64, 64)$/;" v +crop_size .\configs\_base_\datasets\hrf.py /^crop_size = (256, 256)$/;" v +crop_size .\configs\_base_\datasets\pascal_context.py /^crop_size = (480, 480)$/;" v +crop_size .\configs\_base_\datasets\pascal_voc12.py /^crop_size = (512, 512)$/;" v +crop_size .\configs\_base_\datasets\stare.py /^crop_size = (128, 128)$/;" v +crop_size .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^crop_size = (512, 1024)$/;" v +crop_size .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^crop_size = (680, 680)$/;" v +crop_size .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^crop_size = (768, 768)$/;" v +crop_size .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^crop_size = (768, 768)$/;" v +crop_size .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^crop_size = (768, 768)$/;" v +crop_size .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^crop_size = (768, 768)$/;" v +crop_size .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^crop_size = (768, 768)$/;" v +crop_size .\configs\foodnet\ccnet_vit_768x768_80k.py /^crop_size = (768, 768)$/;" v +cross_entropy .\mmseg\models\losses\cross_entropy_loss.py /^def cross_entropy(pred,$/;" f +cudnn_benchmark .\configs\_base_\default_runtime.py /^cudnn_benchmark = True$/;" v +custom_keys .\configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ custom_keys=dict(theta=dict(wd_mult=0.), phi=dict(wd_mult=0.))))$/;" v +cv2 .\tools\convert_datasets\drive.py /^import cv2$/;" i +data .\configs\_base_\datasets\FoodSeg103.py /^data = dict($/;" v +data .\configs\_base_\datasets\Recipe1M_768x768.py /^data = dict($/;" v +data .\configs\_base_\datasets\ade20k.py /^data = dict($/;" v +data .\configs\_base_\datasets\chase_db1.py /^data = dict($/;" v +data .\configs\_base_\datasets\cityscapes.py /^data = dict($/;" v +data .\configs\_base_\datasets\cityscapes_769x769.py /^data = dict($/;" v +data .\configs\_base_\datasets\drive.py /^data = dict($/;" v +data .\configs\_base_\datasets\hrf.py /^data = dict($/;" v +data .\configs\_base_\datasets\pascal_context.py /^data = dict($/;" v +data .\configs\_base_\datasets\pascal_voc12.py /^data = dict($/;" v +data .\configs\_base_\datasets\pascal_voc12_aug.py /^data = dict($/;" v +data .\configs\_base_\datasets\stare.py /^data = dict($/;" v +data .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^data = dict($/;" v +data .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^data = dict($/;" v +data .\configs\fastscnn\fast_scnn_4x8_80k_lr0.12_cityscapes.py /^data = dict(samples_per_gpu=2, workers_per_gpu=4)$/;" v +data .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^data = dict(samples_per_gpu=1)$/;" v +data .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^data = dict(samples_per_gpu=1)$/;" v +data .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^data = dict(samples_per_gpu=1)$/;" v +data .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^data = dict(samples_per_gpu=1)$/;" v +data .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^data = dict(samples_per_gpu=1)$/;" v +data .\configs\foodnet\ccnet_vit_768x768_80k.py /^data = dict(samples_per_gpu=1)$/;" v +data .\configs\mobilenet_v3\lraspp_m-v3-d8_512x1024_320k_cityscapes.py /^data = dict(samples_per_gpu=4, workers_per_gpu=4)$/;" v +data .\configs\mobilenet_v3\lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py /^data = dict(samples_per_gpu=4, workers_per_gpu=4)$/;" v +data_root .\configs\_base_\datasets\FoodSeg103.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\FoodSeg103.py /^data_root = '.\/data\/Recipe1M\/'$/;" v +data_root .\configs\_base_\datasets\ade20k.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\ade20k.py /^data_root = 'data\/ade\/ADEChallengeData2016'$/;" v +data_root .\configs\_base_\datasets\chase_db1.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\chase_db1.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\chase_db1.py /^data_root = 'data\/CHASE_DB1'$/;" v +data_root .\configs\_base_\datasets\cityscapes.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\cityscapes.py /^data_root = 'data\/cityscapes\/'$/;" v +data_root .\configs\_base_\datasets\drive.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\drive.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\drive.py /^data_root = 'data\/DRIVE'$/;" v +data_root .\configs\_base_\datasets\hrf.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\hrf.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\hrf.py /^data_root = 'data\/HRF'$/;" v +data_root .\configs\_base_\datasets\pascal_context.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\pascal_context.py /^data_root = 'data\/VOCdevkit\/VOC2010\/'$/;" v +data_root .\configs\_base_\datasets\pascal_voc12.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\pascal_voc12.py /^data_root = 'data\/VOCdevkit\/VOC2012'$/;" v +data_root .\configs\_base_\datasets\stare.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\stare.py /^ data_root=data_root,$/;" v +data_root .\configs\_base_\datasets\stare.py /^data_root = 'data\/STARE'$/;" v +data_root .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ data_root=data_root,$/;" v +data_root .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^data_root = 'data\/cityscapes\/'$/;" v +dataset .\configs\_base_\datasets\chase_db1.py /^ dataset=dict($/;" v +dataset .\configs\_base_\datasets\drive.py /^ dataset=dict($/;" v +dataset .\configs\_base_\datasets\hrf.py /^ dataset=dict($/;" v +dataset .\configs\_base_\datasets\stare.py /^ dataset=dict($/;" v +dataset_aliases .\mmseg\core\evaluation\class_names.py /^dataset_aliases = {$/;" v +dataset_type .\configs\_base_\datasets\FoodSeg103.py /^dataset_type = 'CustomDataset'$/;" v +dataset_type .\configs\_base_\datasets\ade20k.py /^dataset_type = 'ADE20KDataset'$/;" v +dataset_type .\configs\_base_\datasets\chase_db1.py /^dataset_type = 'ChaseDB1Dataset'$/;" v +dataset_type .\configs\_base_\datasets\cityscapes.py /^dataset_type = 'CityscapesDataset'$/;" v +dataset_type .\configs\_base_\datasets\drive.py /^dataset_type = 'DRIVEDataset'$/;" v +dataset_type .\configs\_base_\datasets\hrf.py /^dataset_type = 'HRFDataset'$/;" v +dataset_type .\configs\_base_\datasets\pascal_context.py /^dataset_type = 'PascalContextDataset'$/;" v +dataset_type .\configs\_base_\datasets\pascal_voc12.py /^dataset_type = 'PascalVOCDataset'$/;" v +dataset_type .\configs\_base_\datasets\stare.py /^dataset_type = 'STAREDataset'$/;" v +dataset_type .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^dataset_type = 'CityscapesDataset'$/;" v +dec_dilations .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ dec_dilations=(1, 1, 1, 1),$/;" v +dec_dilations .\configs\_base_\models\fcn_unet_s5-d16.py /^ dec_dilations=(1, 1, 1, 1),$/;" v +dec_dilations .\configs\_base_\models\pspnet_unet_s5-d16.py /^ dec_dilations=(1, 1, 1, 1),$/;" v +dec_num_convs .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ dec_num_convs=(2, 2, 2, 2),$/;" v +dec_num_convs .\configs\_base_\models\fcn_unet_s5-d16.py /^ dec_num_convs=(2, 2, 2, 2),$/;" v +dec_num_convs .\configs\_base_\models\pspnet_unet_s5-d16.py /^ dec_num_convs=(2, 2, 2, 2),$/;" v +decode_head .\configs\_base_\models\ann_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\apcnet_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\ccnet_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\cgnet.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\danet_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\deeplabv3_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\dmnet_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\dnl_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\emanet_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\encnet_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\fast_scnn.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\fcn_hr18.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\fcn_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\fcn_unet_s5-d16.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\fpn_r50.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\gcnet_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\lraspp_m-v3-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\nonlocal_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\ocrnet_hr18.py /^ decode_head=[$/;" v +decode_head .\configs\_base_\models\ocrnet_r50-d8.py /^ decode_head=[$/;" v +decode_head .\configs\_base_\models\pointrend_r50.py /^ decode_head=[$/;" v +decode_head .\configs\_base_\models\psanet_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\pspnet_r50-d8.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\pspnet_unet_s5-d16.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\setr_mla.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\setr_naive_pup.py /^ decode_head=dict($/;" v +decode_head .\configs\_base_\models\upernet_r50.py /^ decode_head=dict($/;" v +decode_head .\configs\ann\ann_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\ann\ann_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\ann\ann_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\ann\ann_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\apcnet\apcnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\apcnet\apcnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\ccnet\ccnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\ccnet\ccnet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\ccnet\ccnet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\ccnet\ccnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\danet\danet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\danet\danet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\danet\danet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\danet\danet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +decode_head .\configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +decode_head .\configs\deeplabv3\deeplabv3_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\deeplabv3\deeplabv3_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\deeplabv3\deeplabv3_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\deeplabv3\deeplabv3_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\dmnet\dmnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\dmnet\dmnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\dnlnet\dnl_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\dnlnet\dnl_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\encnet\encnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\encnet\encnet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\encnet\encnet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\encnet\encnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150),$/;" v +decode_head .\configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +decode_head .\configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +decode_head .\configs\fcn\fcn_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\fcn\fcn_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\fcn\fcn_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\fcn\fcn_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104),$/;" v +decode_head .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104),$/;" v +decode_head .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104),$/;" v +decode_head .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104),$/;" v +decode_head .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ decode_head=dict($/;" v +decode_head .\configs\foodnet\ccnet_vit_768x768_80k.py /^ decode_head=dict($/;" v +decode_head .\configs\foodnet\fpn_r50_512x1024_80k_RM.py /^ decode_head=dict(num_classes=104))$/;" v +decode_head .\configs\gcnet\gcnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\gcnet\gcnet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\gcnet\gcnet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\gcnet\gcnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +decode_head .\configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +decode_head .\configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ decode_head=dict($/;" v +decode_head .\configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ decode_head=dict($/;" v +decode_head .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ decode_head=dict($/;" v +decode_head .\configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ decode_head=dict($/;" v +decode_head .\configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ decode_head=dict($/;" v +decode_head .\configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ decode_head=dict($/;" v +decode_head .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ decode_head=dict(in_channels=320),$/;" v +decode_head .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ decode_head=dict(in_channels=320),$/;" v +decode_head .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ decode_head=dict(in_channels=320, c1_in_channels=24),$/;" v +decode_head .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ decode_head=dict(in_channels=320, c1_in_channels=24),$/;" v +decode_head .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ decode_head=dict(in_channels=320),$/;" v +decode_head .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ decode_head=dict(in_channels=320),$/;" v +decode_head .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ decode_head=dict(in_channels=320),$/;" v +decode_head .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ decode_head=dict(in_channels=320),$/;" v +decode_head .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\nonlocal_net\nonlocal_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\nonlocal_net\nonlocal_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\nonlocal_net\nonlocal_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\nonlocal_net\nonlocal_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ decode_head=[$/;" v +decode_head .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ decode_head=[$/;" v +decode_head .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ decode_head=[$/;" v +decode_head .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ decode_head=[$/;" v +decode_head .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ decode_head=[$/;" v +decode_head .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ decode_head=[$/;" v +decode_head .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ decode_head=[$/;" v +decode_head .\configs\psanet\psanet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(mask_size=(66, 66), num_classes=150),$/;" v +decode_head .\configs\psanet\psanet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\psanet\psanet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\psanet\psanet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(mask_size=(66, 66), num_classes=150),$/;" v +decode_head .\configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +decode_head .\configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60), auxiliary_head=dict(num_classes=60))$/;" v +decode_head .\configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60), auxiliary_head=dict(num_classes=60))$/;" v +decode_head .\configs\pspnet\pspnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\pspnet\pspnet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\pspnet\pspnet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\pspnet\pspnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\upernet\upernet_r50_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\upernet\upernet_r50_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\upernet\upernet_r50_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +decode_head .\configs\upernet\upernet_r50_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +decode_head .\configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +decode_head .\configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +default_cfgs .\mmseg\models\backbones\vit.py /^default_cfgs = {$/;" v +default_cfgs .\mmseg\models\backbones\vit_mla.py /^default_cfgs = {$/;" v +deprecated_api_warning .\mmseg\datasets\pipelines\transforms.py /^from mmcv.utils import deprecated_api_warning, is_tuple_of$/;" i +depth .\configs\_base_\models\ann_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\apcnet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\ccnet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\danet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\deeplabv3_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\dmnet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\dnl_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\emanet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\encnet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\fcn_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\fpn_r50.py /^ depth=50,$/;" v +depth .\configs\_base_\models\gcnet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\nonlocal_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\ocrnet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\pointrend_r50.py /^ depth=50,$/;" v +depth .\configs\_base_\models\psanet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\pspnet_r50-d8.py /^ depth=50,$/;" v +depth .\configs\_base_\models\setr_mla.py /^ depth=24,$/;" v +depth .\configs\_base_\models\setr_naive_pup.py /^ depth=24,$/;" v +depth .\configs\_base_\models\upernet_r50.py /^ depth=50,$/;" v +depth .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ depth=101,$/;" v +depth .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ depth=101,$/;" v +depth .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ depth=101,$/;" v +depth .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ depth=101,$/;" v +depth .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ depth=12,$/;" v +depth .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ depth=12,$/;" v +depth .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ depth=12,$/;" v +depth .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ depth=12,$/;" v +depth .\configs\foodnet\ccnet_vit_768x768_80k.py /^ depth=12,$/;" v +digit_version .\mmseg\__init__.py /^def digit_version(version_str):$/;" f +dilations .\configs\_base_\models\ann_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\apcnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\ccnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\cgnet.py /^ dilations=(2, 4),$/;" v +dilations .\configs\_base_\models\danet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\deeplabv3_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\deeplabv3_r50-d8.py /^ dilations=(1, 12, 24, 36),$/;" v +dilations .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ dilations=(1, 12, 24, 36),$/;" v +dilations .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ dilations=(1, 12, 24, 36),$/;" v +dilations .\configs\_base_\models\dmnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\dnl_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\emanet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\encnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\fcn_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\fpn_r50.py /^ dilations=(1, 1, 1, 1),$/;" v +dilations .\configs\_base_\models\gcnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\nonlocal_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\ocrnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\pointrend_r50.py /^ dilations=(1, 1, 1, 1),$/;" v +dilations .\configs\_base_\models\psanet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\pspnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations .\configs\_base_\models\upernet_r50.py /^ dilations=(1, 1, 1, 1),$/;" v +dilations .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ dilations=(1, 1, 1, 2),$/;" v +dilations .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ dilations=(1, 6, 12, 18),$/;" v +dilations .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2),$/;" v +dilations .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ dilations=(1, 6, 12, 18),$/;" v +dilations .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ dilations=(1, 1, 1, 2),$/;" v +dilations .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ dilations=(1, 6, 12, 18),$/;" v +dilations .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2),$/;" v +dilations .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ dilations=(1, 6, 12, 18),$/;" v +dilations .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +dilations .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +dilations .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +dilations .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +dilations .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +dilations .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +dilations .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +dilations .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +dirname .\tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +dirname .\tests\test_models\test_forward.py /^from os.path import dirname, exists, join$/;" i +dist .\mmseg\apis\test.py /^import torch.distributed as dist$/;" i +dist .\mmseg\models\decode_heads\ema_head.py /^import torch.distributed as dist$/;" i +dist .\mmseg\models\segmentors\base.py /^import torch.distributed as dist$/;" i +dist_params .\configs\_base_\default_runtime.py /^dist_params = dict(backend='nccl')$/;" v +downsample_dw_channels .\configs\_base_\models\fast_scnn.py /^ downsample_dw_channels=(32, 48),$/;" v +downsamples .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ downsamples=(True, True, True, True),$/;" v +downsamples .\configs\_base_\models\fcn_unet_s5-d16.py /^ downsamples=(True, True, True, True),$/;" v +downsamples .\configs\_base_\models\pspnet_unet_s5-d16.py /^ downsamples=(True, True, True, True),$/;" v +drop_block_2d .\mmseg\models\backbones\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +drop_block_2d .\mmseg\models\backbones\layers\drop.py /^def drop_block_2d($/;" f +drop_block_2d .\mmseg\models\decode_heads\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +drop_block_2d .\mmseg\models\decode_heads\layers\drop.py /^def drop_block_2d($/;" f +drop_block_fast_2d .\mmseg\models\backbones\layers\drop.py /^def drop_block_fast_2d($/;" f +drop_block_fast_2d .\mmseg\models\decode_heads\layers\drop.py /^def drop_block_fast_2d($/;" f +drop_path .\mmseg\models\backbones\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +drop_path .\mmseg\models\backbones\layers\drop.py /^def drop_path(x, drop_prob: float = 0., training: bool = False):$/;" f +drop_path .\mmseg\models\decode_heads\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +drop_path .\mmseg\models\decode_heads\layers\drop.py /^def drop_path(x, drop_prob: float = 0., training: bool = False):$/;" f +drop_rate .\configs\_base_\models\setr_mla.py /^ drop_rate=0.1,$/;" v +drop_rate .\configs\_base_\models\setr_naive_pup.py /^ drop_rate=0.1,$/;" v +drop_rate .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ drop_rate=0.,$/;" v +drop_rate .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ drop_rate=0.,$/;" v +drop_rate .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ drop_rate=0.,$/;" v +drop_rate .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ drop_rate=0.,$/;" v +drop_rate .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ drop_rate=0.$/;" v +drop_rate .\configs\foodnet\ccnet_vit_768x768_80k.py /^ drop_rate=0.0,$/;" v +dropout_ratio .\configs\_base_\models\ann_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\apcnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\ccnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\cgnet.py /^ dropout_ratio=0,$/;" v +dropout_ratio .\configs\_base_\models\danet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\deeplabv3_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\dmnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\dnl_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\emanet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\encnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\fcn_hr18.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\_base_\models\fcn_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\fcn_unet_s5-d16.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\fpn_r50.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\gcnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\lraspp_m-v3-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\nonlocal_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\ocrnet_hr18.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\_base_\models\ocrnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\pointrend_r50.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\_base_\models\psanet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\pspnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\pspnet_unet_s5-d16.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\_base_\models\upernet_r50.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ dropout_ratio=0.1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ dropout_ratio=-1,$/;" v +dropout_ratio .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ dropout_ratio=-1,$/;" v +ema_channels .\configs\_base_\models\emanet_r50-d8.py /^ ema_channels=512,$/;" v +embed_dim .\configs\_base_\models\setr_mla.py /^ embed_dim=1024,$/;" v +embed_dim .\configs\_base_\models\setr_naive_pup.py /^ embed_dim=1024,$/;" v +embed_dim .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ embed_dim=768,$/;" v +embed_dim .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ embed_dim=768,$/;" v +embed_dim .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ embed_dim=768,$/;" v +embed_dim .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ embed_dim=768,$/;" v +embed_dim .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ embed_dim=768,$/;" v +embed_dim .\configs\foodnet\ccnet_vit_768x768_80k.py /^ embed_dim=768,$/;" v +embedded_gaussian .\mmseg\models\decode_heads\dnl_head.py /^ def embedded_gaussian(self, theta_x, phi_x):$/;" m class:DisentangledNonLocal2d +enc_dilations .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ enc_dilations=(1, 1, 1, 1, 1),$/;" v +enc_dilations .\configs\_base_\models\fcn_unet_s5-d16.py /^ enc_dilations=(1, 1, 1, 1, 1),$/;" v +enc_dilations .\configs\_base_\models\pspnet_unet_s5-d16.py /^ enc_dilations=(1, 1, 1, 1, 1),$/;" v +enc_num_convs .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ enc_num_convs=(2, 2, 2, 2, 2),$/;" v +enc_num_convs .\configs\_base_\models\fcn_unet_s5-d16.py /^ enc_num_convs=(2, 2, 2, 2, 2),$/;" v +enc_num_convs .\configs\_base_\models\pspnet_unet_s5-d16.py /^ enc_num_convs=(2, 2, 2, 2, 2),$/;" v +encode_decode .\mmseg\models\segmentors\base.py /^ def encode_decode(self, img, img_metas):$/;" m class:BaseSegmentor +encode_decode .\mmseg\models\segmentors\cascade_encoder_decoder.py /^ def encode_decode(self, img, img_metas):$/;" m class:CascadeEncoderDecoder +encode_decode .\mmseg\models\segmentors\encoder_decoder.py /^ def encode_decode(self, img, img_metas):$/;" m class:EncoderDecoder +end .\docs\make.bat /^:end$/;" l +errno .\mmseg\models\backbones\helpers.py /^import errno$/;" i +eval_metrics .\mmseg\core\evaluation\__init__.py /^from .metrics import eval_metrics, mean_dice, mean_iou$/;" i +eval_metrics .\mmseg\core\evaluation\metrics.py /^def eval_metrics(results,$/;" f +eval_metrics .\mmseg\datasets\custom.py /^from mmseg.core import eval_metrics$/;" i +eval_metrics .\tests\test_metrics.py /^from mmseg.core.evaluation import eval_metrics, mean_dice, mean_iou$/;" i +evaluate .\mmseg\core\evaluation\eval_hooks.py /^ def evaluate(self, runner, results):$/;" m class:EvalHook +evaluate .\mmseg\datasets\cityscapes.py /^ def evaluate(self,$/;" m class:CityscapesDataset +evaluate .\mmseg\datasets\custom.py /^ def evaluate(self,$/;" m class:CustomDataset +evaluation .\configs\_base_\schedules\schedule_160k.py /^evaluation = dict(interval=16000, metric='mIoU')$/;" v +evaluation .\configs\_base_\schedules\schedule_20k.py /^evaluation = dict(interval=2000, metric='mIoU')$/;" v +evaluation .\configs\_base_\schedules\schedule_40k.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +evaluation .\configs\_base_\schedules\schedule_80k.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +evaluation .\configs\_base_\schedules\schedule_80k_step.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +evaluation .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +evaluation .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +evaluation .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^evaluation = dict(interval=80000, metric='mIoU')$/;" v +evaluation .\configs\foodnet\fpn_r50_512x1024_80k.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +evaluation .\configs\foodnet\fpn_r50_512x1024_80k_RM.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +evaluation .\configs\unet\deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\deeplabv3_unet_s5-d16_128x128_40k_stare.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\deeplabv3_unet_s5-d16_256x256_40k_hrf.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\deeplabv3_unet_s5-d16_64x64_40k_drive.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\fcn_unet_s5-d16_128x128_40k_chase_db1.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\fcn_unet_s5-d16_128x128_40k_stare.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\fcn_unet_s5-d16_256x256_40k_hrf.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\fcn_unet_s5-d16_64x64_40k_drive.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\pspnet_unet_s5-d16_128x128_40k_chase_db1.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\pspnet_unet_s5-d16_128x128_40k_stare.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\pspnet_unet_s5-d16_256x256_40k_hrf.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\configs\unet\pspnet_unet_s5-d16_64x64_40k_drive.py /^evaluation = dict(metric='mDice')$/;" v +evaluation .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa$/;" i +exclude_patterns .\docs\conf.py /^exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']$/;" v +exists .\setup.py /^ from os.path import exists$/;" i +exists .\tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +exists .\tests\test_models\test_forward.py /^from os.path import dirname, exists, join$/;" i +expansion .\mmseg\models\backbones\resnest.py /^ expansion = 4$/;" v class:Bottleneck +expansion .\mmseg\models\backbones\resnet.py /^ expansion = 1$/;" v class:BasicBlock +expansion .\mmseg\models\backbones\resnet.py /^ expansion = 4$/;" v class:Bottleneck +extensions .\docs\conf.py /^extensions = [$/;" v +extra .\configs\_base_\models\fcn_hr18.py /^ extra=dict($/;" v +extra .\configs\_base_\models\ocrnet_hr18.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ extra=dict($/;" v +extra .\configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ extra=dict($/;" v +extra .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ extra=dict($/;" v +extra_repr .\mmseg\models\decode_heads\decode_head.py /^ def extra_repr(self):$/;" m class:BaseDecodeHead +extract_feat .\mmseg\models\segmentors\base.py /^ def extract_feat(self, imgs):$/;" m class:BaseSegmentor +extract_feat .\mmseg\models\segmentors\encoder_decoder.py /^ def extract_feat(self, img):$/;" m class:EncoderDecoder +feature_strides .\configs\_base_\models\fpn_r50.py /^ feature_strides=[4, 8, 16, 32],$/;" v +feature_strides .\configs\_base_\models\pointrend_r50.py /^ feature_strides=[4, 8, 16, 32],$/;" v +feature_strides .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ feature_strides=[4, 8, 16, 32],$/;" v +files .\docs\stat.py /^files = sorted(glob.glob('..\/configs\/*\/README.md'))$/;" v +filter_sizes .\configs\_base_\models\dmnet_r50-d8.py /^ filter_sizes=(1, 3, 5, 7),$/;" v +find_packages .\setup.py /^from setuptools import find_packages, setup$/;" i +find_unused_parameters .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^find_unused_parameters = True$/;" v +find_unused_parameters .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^find_unused_parameters = True$/;" v +find_unused_parameters .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^find_unused_parameters = True$/;" v +find_unused_parameters .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^find_unused_parameters = True$/;" v +find_unused_parameters .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^find_unused_parameters = True$/;" v +find_unused_parameters .\configs\foodnet\ccnet_vit_768x768_80k.py /^find_unused_parameters = True$/;" v +flatten_binary_logits .\mmseg\models\losses\lovasz_loss.py /^def flatten_binary_logits(logits, labels, ignore_index=None):$/;" f +flatten_probs .\mmseg\models\losses\lovasz_loss.py /^def flatten_probs(probs, labels, ignore_index=None):$/;" f +flip .\configs\_base_\datasets\FoodSeg103.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\Recipe1M_768x768.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\ade20k.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\chase_db1.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\cityscapes.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\cityscapes_769x769.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\drive.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\hrf.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\pascal_context.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\pascal_voc12.py /^ flip=False,$/;" v +flip .\configs\_base_\datasets\stare.py /^ flip=False,$/;" v +flip .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ flip=False,$/;" v +flip .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ flip=False,$/;" v +force_fp32 .\mmseg\models\decode_heads\decode_head.py /^from mmcv.runner import auto_fp16, force_fp32$/;" i +format_results .\mmseg\datasets\cityscapes.py /^ def format_results(self, results, imgfile_prefix=None, to_label_id=True):$/;" m class:CityscapesDataset +format_results .\mmseg\datasets\custom.py /^ def format_results(self, results, **kwargs):$/;" m class:CustomDataset +forward .\mmseg\models\backbones\cgnet.py /^ def forward(self, x):$/;" m class:CGNet +forward .\mmseg\models\backbones\cgnet.py /^ def forward(self, x):$/;" m class:ContextGuidedBlock +forward .\mmseg\models\backbones\cgnet.py /^ def forward(self, x):$/;" m class:GlobalContextExtractor +forward .\mmseg\models\backbones\cgnet.py /^ def forward(self, x):$/;" m class:InputInjection +forward .\mmseg\models\backbones\fast_scnn.py /^ def forward(self, higher_res_feature, lower_res_feature):$/;" m class:FeatureFusionModule +forward .\mmseg\models\backbones\fast_scnn.py /^ def forward(self, x):$/;" m class:FastSCNN +forward .\mmseg\models\backbones\fast_scnn.py /^ def forward(self, x):$/;" m class:GlobalFeatureExtractor +forward .\mmseg\models\backbones\fast_scnn.py /^ def forward(self, x):$/;" m class:LearningToDownsample +forward .\mmseg\models\backbones\hrnet.py /^ def forward(self, x):$/;" m class:HRModule +forward .\mmseg\models\backbones\hrnet.py /^ def forward(self, x):$/;" m class:HRNet +forward .\mmseg\models\backbones\layers\drop.py /^ def forward(self, x):$/;" m class:DropBlock2d +forward .\mmseg\models\backbones\layers\drop.py /^ def forward(self, x):$/;" m class:DropPath +forward .\mmseg\models\backbones\mobilenet_v2.py /^ def forward(self, x):$/;" m class:MobileNetV2 +forward .\mmseg\models\backbones\mobilenet_v3.py /^ def forward(self, x):$/;" m class:MobileNetV3 +forward .\mmseg\models\backbones\pvt.py /^ def forward(self, x):$/;" m class:Mlp +forward .\mmseg\models\backbones\pvt.py /^ def forward(self, x):$/;" m class:PatchEmbed +forward .\mmseg\models\backbones\pvt.py /^ def forward(self, x):$/;" m class:PyramidVisionTransformer +forward .\mmseg\models\backbones\pvt.py /^ def forward(self, x, H, W):$/;" m class:Attention +forward .\mmseg\models\backbones\pvt.py /^ def forward(self, x, H, W):$/;" m class:Block +forward .\mmseg\models\backbones\pvt_dia.py /^ def forward(self, x):$/;" m class:Mlp +forward .\mmseg\models\backbones\pvt_dia.py /^ def forward(self, x):$/;" m class:PatchEmbed +forward .\mmseg\models\backbones\pvt_dia.py /^ def forward(self, x):$/;" m class:PyramidVisionTransformer +forward .\mmseg\models\backbones\pvt_dia.py /^ def forward(self, x, H, W):$/;" m class:Attention +forward .\mmseg\models\backbones\pvt_dia.py /^ def forward(self, x, H, W):$/;" m class:Block +forward .\mmseg\models\backbones\resnest.py /^ def forward(self, x):$/;" m class:Bottleneck +forward .\mmseg\models\backbones\resnest.py /^ def forward(self, x):$/;" m class:RSoftmax +forward .\mmseg\models\backbones\resnest.py /^ def forward(self, x):$/;" m class:SplitAttentionConv2d +forward .\mmseg\models\backbones\resnet.py /^ def forward(self, x):$/;" m class:BasicBlock +forward .\mmseg\models\backbones\resnet.py /^ def forward(self, x):$/;" m class:Bottleneck +forward .\mmseg\models\backbones\resnet.py /^ def forward(self, x):$/;" m class:ResNet +forward .\mmseg\models\backbones\unet.py /^ def forward(self, x):$/;" m class:BasicConvBlock +forward .\mmseg\models\backbones\unet.py /^ def forward(self, x):$/;" m class:DeconvModule +forward .\mmseg\models\backbones\unet.py /^ def forward(self, x):$/;" m class:InterpConv +forward .\mmseg\models\backbones\unet.py /^ def forward(self, x):$/;" m class:UNet +forward .\mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:Attention +forward .\mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:Block +forward .\mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:HybridEmbed +forward .\mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:Mlp +forward .\mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:PatchEmbed +forward .\mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:VisionTransformer +forward .\mmseg\models\backbones\vit_mla.py /^ def forward(self, res2, res3, res4, res5):$/;" m class:Conv_MLA +forward .\mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:Attention +forward .\mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:Block +forward .\mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:HybridEmbed +forward .\mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:Mlp +forward .\mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:PatchEmbed +forward .\mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:VIT_MLA +forward .\mmseg\models\decode_heads\ann_head.py /^ def forward(self, feats):$/;" m class:APNB +forward .\mmseg\models\decode_heads\ann_head.py /^ def forward(self, feats):$/;" m class:PPMConcat +forward .\mmseg\models\decode_heads\ann_head.py /^ def forward(self, inputs):$/;" m class:ANNHead +forward .\mmseg\models\decode_heads\ann_head.py /^ def forward(self, low_feats, high_feats):$/;" m class:AFNB +forward .\mmseg\models\decode_heads\apc_head.py /^ def forward(self, inputs):$/;" m class:APCHead +forward .\mmseg\models\decode_heads\apc_head.py /^ def forward(self, x):$/;" m class:ACM +forward .\mmseg\models\decode_heads\aspp_head.py /^ def forward(self, inputs):$/;" m class:ASPPHead +forward .\mmseg\models\decode_heads\aspp_head.py /^ def forward(self, x):$/;" m class:ASPPModule +forward .\mmseg\models\decode_heads\cascade_decode_head.py /^ def forward(self, inputs, prev_output):$/;" m class:BaseCascadeDecodeHead +forward .\mmseg\models\decode_heads\cc_head.py /^ def forward(self, inputs):$/;" m class:CCHead +forward .\mmseg\models\decode_heads\da_head.py /^ def forward(self, inputs):$/;" m class:DAHead +forward .\mmseg\models\decode_heads\da_head.py /^ def forward(self, x):$/;" m class:CAM +forward .\mmseg\models\decode_heads\da_head.py /^ def forward(self, x):$/;" m class:PAM +forward .\mmseg\models\decode_heads\decode_head.py /^ def forward(self, inputs):$/;" m class:BaseDecodeHead +forward .\mmseg\models\decode_heads\dm_head.py /^ def forward(self, inputs):$/;" m class:DMHead +forward .\mmseg\models\decode_heads\dm_head.py /^ def forward(self, x):$/;" m class:DCM +forward .\mmseg\models\decode_heads\dnl_head.py /^ def forward(self, inputs):$/;" m class:DNLHead +forward .\mmseg\models\decode_heads\dnl_head.py /^ def forward(self, x):$/;" m class:DisentangledNonLocal2d +forward .\mmseg\models\decode_heads\ema_head.py /^ def forward(self, feats):$/;" m class:EMAModule +forward .\mmseg\models\decode_heads\ema_head.py /^ def forward(self, inputs):$/;" m class:EMAHead +forward .\mmseg\models\decode_heads\enc_head.py /^ def forward(self, inputs):$/;" m class:EncHead +forward .\mmseg\models\decode_heads\enc_head.py /^ def forward(self, x):$/;" m class:EncModule +forward .\mmseg\models\decode_heads\fcn_head.py /^ def forward(self, inputs):$/;" m class:FCNHead +forward .\mmseg\models\decode_heads\fpn_head.py /^ def forward(self, inputs):$/;" m class:FPNHead +forward .\mmseg\models\decode_heads\gc_head.py /^ def forward(self, inputs):$/;" m class:GCHead +forward .\mmseg\models\decode_heads\layers\drop.py /^ def forward(self, x):$/;" m class:DropBlock2d +forward .\mmseg\models\decode_heads\layers\drop.py /^ def forward(self, x):$/;" m class:DropPath +forward .\mmseg\models\decode_heads\lraspp_head.py /^ def forward(self, inputs):$/;" m class:LRASPPHead +forward .\mmseg\models\decode_heads\nl_head.py /^ def forward(self, inputs):$/;" m class:NLHead +forward .\mmseg\models\decode_heads\ocr_head.py /^ def forward(self, feats, probs):$/;" m class:SpatialGatherModule +forward .\mmseg\models\decode_heads\ocr_head.py /^ def forward(self, inputs, prev_output):$/;" m class:OCRHead +forward .\mmseg\models\decode_heads\ocr_head.py /^ def forward(self, query_feats, key_feats):$/;" m class:ObjectAttentionBlock +forward .\mmseg\models\decode_heads\point_head.py /^ def forward(self, fine_grained_point_feats, coarse_point_feats):$/;" m class:PointHead +forward .\mmseg\models\decode_heads\psa_head.py /^ def forward(self, inputs):$/;" m class:PSAHead +forward .\mmseg\models\decode_heads\psp_head.py /^ def forward(self, inputs):$/;" m class:PSPHead +forward .\mmseg\models\decode_heads\psp_head.py /^ def forward(self, x):$/;" m class:PPM +forward .\mmseg\models\decode_heads\sep_aspp_head.py /^ def forward(self, inputs):$/;" m class:DepthwiseSeparableASPPHead +forward .\mmseg\models\decode_heads\uper_head.py /^ def forward(self, inputs):$/;" m class:UPerHead +forward .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^ def forward(self, x):$/;" m class:VIT_MLA_AUXIHead +forward .\mmseg\models\decode_heads\vit_mla_head.py /^ def forward(self, inputs):$/;" m class:VIT_MLAHead +forward .\mmseg\models\decode_heads\vit_mla_head.py /^ def forward(self, mla_p2, mla_p3, mla_p4, mla_p5):$/;" m class:MLAHead +forward .\mmseg\models\decode_heads\vit_up_head.py /^ def forward(self, x):$/;" m class:VisionTransformerUpHead +forward .\mmseg\models\losses\accuracy.py /^ def forward(self, pred, target):$/;" m class:Accuracy +forward .\mmseg\models\losses\cross_entropy_loss.py /^ def forward(self,$/;" m class:CrossEntropyLoss +forward .\mmseg\models\losses\lovasz_loss.py /^ def forward(self,$/;" m class:LovaszLoss +forward .\mmseg\models\necks\fpn.py /^ def forward(self, inputs):$/;" m class:FPN +forward .\mmseg\models\segmentors\base.py /^ def forward(self, img, img_metas, return_loss=True, **kwargs):$/;" m class:BaseSegmentor +forward .\mmseg\models\utils\inverted_residual.py /^ def forward(self, x):$/;" m class:InvertedResidual +forward .\mmseg\models\utils\inverted_residual.py /^ def forward(self, x):$/;" m class:InvertedResidualV3 +forward .\mmseg\models\utils\se_layer.py /^ def forward(self, x):$/;" m class:SELayer +forward .\mmseg\models\utils\self_attention_block.py /^ def forward(self, query_feats, key_feats):$/;" m class:SelfAttentionBlock +forward .\mmseg\models\utils\up_conv_block.py /^ def forward(self, skip, x):$/;" m class:UpConvBlock +forward .\mmseg\ops\encoding.py /^ def forward(self, x):$/;" m class:Encoding +forward .\mmseg\ops\wrappers.py /^ def forward(self, x):$/;" m class:Upsample +forward .\tests\test_eval_hook.py /^ def forward(self, img, img_metas, test_mode=False, **kwargs):$/;" m class:ExampleModel +forward .\tests\test_models\test_segmentor.py /^ def forward(self, inputs):$/;" m class:ExampleDecodeHead +forward .\tests\test_models\test_segmentor.py /^ def forward(self, inputs, prev_out):$/;" m class:ExampleCascadeDecodeHead +forward .\tests\test_models\test_segmentor.py /^ def forward(self, x):$/;" m class:ExampleBackbone +forward_dummy .\mmseg\models\segmentors\encoder_decoder.py /^ def forward_dummy(self, img):$/;" m class:EncoderDecoder +forward_features .\mmseg\models\backbones\pvt.py /^ def forward_features(self, x):$/;" m class:PyramidVisionTransformer +forward_features .\mmseg\models\backbones\pvt_dia.py /^ def forward_features(self, x):$/;" m class:PyramidVisionTransformer +forward_plugin .\mmseg\models\backbones\resnet.py /^ def forward_plugin(self, x, plugin_names):$/;" m class:Bottleneck +forward_test .\mmseg\models\decode_heads\cascade_decode_head.py /^ def forward_test(self, inputs, prev_output, img_metas, test_cfg):$/;" m class:BaseCascadeDecodeHead +forward_test .\mmseg\models\decode_heads\da_head.py /^ def forward_test(self, inputs, img_metas, test_cfg):$/;" m class:DAHead +forward_test .\mmseg\models\decode_heads\decode_head.py /^ def forward_test(self, inputs, img_metas, test_cfg):$/;" m class:BaseDecodeHead +forward_test .\mmseg\models\decode_heads\enc_head.py /^ def forward_test(self, inputs, img_metas, test_cfg):$/;" m class:EncHead +forward_test .\mmseg\models\decode_heads\point_head.py /^ def forward_test(self, inputs, prev_output, img_metas, test_cfg):$/;" m class:PointHead +forward_test .\mmseg\models\segmentors\base.py /^ def forward_test(self, imgs, img_metas, **kwargs):$/;" m class:BaseSegmentor +forward_train .\mmseg\models\decode_heads\cascade_decode_head.py /^ def forward_train(self, inputs, prev_output, img_metas, gt_semantic_seg,$/;" m class:BaseCascadeDecodeHead +forward_train .\mmseg\models\decode_heads\decode_head.py /^ def forward_train(self, inputs, img_metas, gt_semantic_seg, train_cfg):$/;" m class:BaseDecodeHead +forward_train .\mmseg\models\decode_heads\point_head.py /^ def forward_train(self, inputs, prev_output, img_metas, gt_semantic_seg,$/;" m class:PointHead +forward_train .\mmseg\models\segmentors\base.py /^ def forward_train(self, imgs, img_metas, **kwargs):$/;" m class:BaseSegmentor +forward_train .\mmseg\models\segmentors\encoder_decoder.py /^ def forward_train(self, img, img_metas, gt_semantic_seg):$/;" m class:EncoderDecoder +func .\docs\stat.py /^import functools as func$/;" i +functools .\mmseg\models\losses\utils.py /^import functools$/;" i +fusion_out_channels .\configs\_base_\models\fast_scnn.py /^ fusion_out_channels=128,$/;" v +fusion_types .\configs\_base_\models\gcnet_r50-d8.py /^ fusion_types=('channel_add', ),$/;" v +gen_packages_items .\setup.py /^ def gen_packages_items():$/;" f function:parse_requirements +generate_aug_list .\tools\convert_datasets\voc_aug.py /^def generate_aug_list(merged_list, excluded_list):$/;" f +generate_labels .\tools\convert_datasets\pascal_context.py /^def generate_labels(img_id, detail, out_dir):$/;" f +get_ann_info .\mmseg\datasets\custom.py /^ def get_ann_info(self, idx):$/;" m class:CustomDataset +get_classes .\mmseg\core\evaluation\__init__.py /^from .class_names import get_classes, get_palette$/;" i +get_classes .\mmseg\core\evaluation\class_names.py /^def get_classes(dataset):$/;" f +get_classes .\tests\test_data\test_dataset.py /^from mmseg.core.evaluation import get_classes, get_palette$/;" i +get_classes_and_palette .\mmseg\datasets\custom.py /^ def get_classes_and_palette(self, classes=None, palette=None):$/;" m class:CustomDataset +get_confusion_matrix .\tests\test_metrics.py /^def get_confusion_matrix(pred_label, label, num_classes, ignore_index):$/;" f +get_crop_bbox .\mmseg\datasets\pipelines\transforms.py /^ def get_crop_bbox(self, img):$/;" m class:RandomCrop +get_dist_info .\mmseg\apis\test.py /^from mmcv.runner import get_dist_info$/;" i +get_dist_info .\mmseg\datasets\builder.py /^from mmcv.runner import get_dist_info$/;" i +get_dist_info .\tools\test.py /^from mmcv.runner import get_dist_info, init_dist, load_checkpoint$/;" i +get_final_iter .\.dev\gather_models.py /^def get_final_iter(config):$/;" f +get_final_results .\.dev\gather_models.py /^def get_final_results(log_json_path, iter_num):$/;" f +get_git_hash .\mmseg\utils\collect_env.py /^from mmcv.utils import get_git_hash$/;" i +get_git_hash .\tools\train.py /^from mmcv.utils import Config, DictAction, get_git_hash$/;" i +get_gt_seg_maps .\mmseg\datasets\custom.py /^ def get_gt_seg_maps(self, efficient_test=False):$/;" m class:CustomDataset +get_logger .\mmseg\utils\logger.py /^from mmcv.utils import get_logger$/;" i +get_model_complexity_info .\tools\get_flops.py /^from mmcv.cnn import get_model_complexity_info$/;" i +get_palette .\demo\image_demo.py /^from mmseg.core.evaluation import get_palette$/;" i +get_palette .\mmseg\core\evaluation\__init__.py /^from .class_names import get_classes, get_palette$/;" i +get_palette .\mmseg\core\evaluation\class_names.py /^def get_palette(dataset):$/;" f +get_palette .\tests\test_data\test_dataset.py /^from mmseg.core.evaluation import get_classes, get_palette$/;" i +get_palette_for_custom_classes .\mmseg\datasets\custom.py /^ def get_palette_for_custom_classes(self, class_names, palette=None):$/;" m class:CustomDataset +get_points_test .\mmseg\models\decode_heads\point_head.py /^ def get_points_test(self, seg_logits, uncertainty_func, cfg):$/;" m class:PointHead +get_points_train .\mmseg\models\decode_heads\point_head.py /^ def get_points_train(self, seg_logits, uncertainty_func, cfg):$/;" m class:PointHead +get_root_logger .\mmseg\apis\__init__.py /^from .train import get_root_logger, set_random_seed, train_segmentor$/;" i +get_root_logger .\mmseg\apis\train.py /^from mmseg.utils import get_root_logger$/;" i +get_root_logger .\mmseg\datasets\custom.py /^from mmseg.utils import get_root_logger$/;" i +get_root_logger .\mmseg\models\backbones\cgnet.py /^from mmseg.utils import get_root_logger$/;" i +get_root_logger .\mmseg\models\backbones\hrnet.py /^from mmseg.utils import get_root_logger$/;" i +get_root_logger .\mmseg\models\backbones\pvt.py /^from mmseg.utils import get_root_logger$/;" i +get_root_logger .\mmseg\models\backbones\pvt_dia.py /^from mmseg.utils import get_root_logger$/;" i +get_root_logger .\mmseg\models\backbones\resnet.py /^from mmseg.utils import get_root_logger$/;" i +get_root_logger .\mmseg\models\backbones\unet.py /^from mmseg.utils import get_root_logger$/;" i +get_root_logger .\mmseg\utils\__init__.py /^from .logger import get_root_logger$/;" i +get_root_logger .\mmseg\utils\logger.py /^def get_root_logger(log_file=None, log_level=logging.INFO):$/;" f +get_root_logger .\tools\train.py /^from mmseg.utils import collect_env, get_root_logger$/;" i +get_version .\docs\conf.py /^def get_version():$/;" f +get_version .\setup.py /^def get_version():$/;" f +get_world_size .\tests\test_models\test_forward.py /^def get_world_size(process_group):$/;" f +glob .\.dev\gather_models.py /^import glob$/;" i +glob .\docs\stat.py /^import glob$/;" i +glob .\tests\test_config.py /^ import glob$/;" i +glob .\tests\test_config.py /^import glob$/;" i +global_block_channels .\configs\_base_\models\fast_scnn.py /^ global_block_channels=(64, 96, 128),$/;" v +global_block_strides .\configs\_base_\models\fast_scnn.py /^ global_block_strides=(2, 2, 1),$/;" v +global_in_channels .\configs\_base_\models\fast_scnn.py /^ global_in_channels=64,$/;" v +global_out_channels .\configs\_base_\models\fast_scnn.py /^ global_out_channels=128,$/;" v +gzip .\tools\convert_datasets\stare.py /^import gzip$/;" i +hard_limit .\mmseg\datasets\builder.py /^ hard_limit = rlimit[1]$/;" v +help .\docs\make.bat /^:help$/;" l +helpers .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +helpers .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +higher_in_channels .\configs\_base_\models\fast_scnn.py /^ higher_in_channels=64,$/;" v +hooks .\configs\_base_\default_runtime.py /^ hooks=[$/;" v +html_static_path .\docs\conf.py /^html_static_path = ['_static']$/;" v +html_theme .\docs\conf.py /^html_theme = 'sphinx_rtd_theme'$/;" v +hue .\mmseg\datasets\pipelines\transforms.py /^ def hue(self, img):$/;" m class:PhotoMetricDistortion +img_dir .\configs\_base_\datasets\FoodSeg103.py /^ img_dir='img_dir\/test',$/;" v +img_dir .\configs\_base_\datasets\FoodSeg103.py /^ img_dir='img_dir\/train',$/;" v +img_dir .\configs\_base_\datasets\ade20k.py /^ img_dir='images\/training',$/;" v +img_dir .\configs\_base_\datasets\ade20k.py /^ img_dir='images\/validation',$/;" v +img_dir .\configs\_base_\datasets\chase_db1.py /^ img_dir='images\/training',$/;" v +img_dir .\configs\_base_\datasets\chase_db1.py /^ img_dir='images\/validation',$/;" v +img_dir .\configs\_base_\datasets\cityscapes.py /^ img_dir='leftImg8bit\/train',$/;" v +img_dir .\configs\_base_\datasets\cityscapes.py /^ img_dir='leftImg8bit\/val',$/;" v +img_dir .\configs\_base_\datasets\drive.py /^ img_dir='images\/training',$/;" v +img_dir .\configs\_base_\datasets\drive.py /^ img_dir='images\/validation',$/;" v +img_dir .\configs\_base_\datasets\hrf.py /^ img_dir='images\/training',$/;" v +img_dir .\configs\_base_\datasets\hrf.py /^ img_dir='images\/validation',$/;" v +img_dir .\configs\_base_\datasets\pascal_context.py /^ img_dir='JPEGImages',$/;" v +img_dir .\configs\_base_\datasets\pascal_voc12.py /^ img_dir='JPEGImages',$/;" v +img_dir .\configs\_base_\datasets\stare.py /^ img_dir='images\/training',$/;" v +img_dir .\configs\_base_\datasets\stare.py /^ img_dir='images\/validation',$/;" v +img_dir .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ img_dir='leftImg8bit\/train',$/;" v +img_dir .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ img_dir='leftImg8bit\/val',$/;" v +img_norm_cfg .\configs\_base_\datasets\FoodSeg103.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\Recipe1M_768x768.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\ade20k.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\chase_db1.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\cityscapes.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\cityscapes_769x769.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\drive.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\hrf.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\pascal_context.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\pascal_voc12.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\_base_\datasets\stare.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^img_norm_cfg = dict($/;" v +img_norm_cfg .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^img_norm_cfg = dict($/;" v +img_scale .\configs\_base_\datasets\FoodSeg103.py /^ img_scale=(2048, 1024),$/;" v +img_scale .\configs\_base_\datasets\Recipe1M_768x768.py /^ img_scale=(2049, 1025),$/;" v +img_scale .\configs\_base_\datasets\ade20k.py /^ img_scale=(2048, 512),$/;" v +img_scale .\configs\_base_\datasets\chase_db1.py /^ img_scale=img_scale,$/;" v +img_scale .\configs\_base_\datasets\chase_db1.py /^img_scale = (960, 999)$/;" v +img_scale .\configs\_base_\datasets\cityscapes.py /^ img_scale=(2048, 1024),$/;" v +img_scale .\configs\_base_\datasets\cityscapes_769x769.py /^ img_scale=(2049, 1025),$/;" v +img_scale .\configs\_base_\datasets\drive.py /^ img_scale=img_scale,$/;" v +img_scale .\configs\_base_\datasets\drive.py /^img_scale = (584, 565)$/;" v +img_scale .\configs\_base_\datasets\hrf.py /^ img_scale=img_scale,$/;" v +img_scale .\configs\_base_\datasets\hrf.py /^img_scale = (2336, 3504)$/;" v +img_scale .\configs\_base_\datasets\pascal_context.py /^ img_scale=img_scale,$/;" v +img_scale .\configs\_base_\datasets\pascal_context.py /^img_scale = (520, 520)$/;" v +img_scale .\configs\_base_\datasets\pascal_voc12.py /^ img_scale=(2048, 512),$/;" v +img_scale .\configs\_base_\datasets\stare.py /^ img_scale=img_scale,$/;" v +img_scale .\configs\_base_\datasets\stare.py /^img_scale = (605, 700)$/;" v +img_scale .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ img_scale=(2048, 1024),$/;" v +img_scale .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ img_scale=(2048, 1024),$/;" v +img_size .\configs\_base_\models\setr_mla.py /^ img_size=768,$/;" v +img_size .\configs\_base_\models\setr_naive_pup.py /^ img_size=768,$/;" v +img_size .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ img_size=768,$/;" v +img_size .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ img_size=768,$/;" v +img_size .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ img_size=768,$/;" v +img_size .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ img_size=768,$/;" v +img_size .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ img_size=768,$/;" v +img_size .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ img_size=768, $/;" v +img_size .\configs\foodnet\ccnet_vit_768x768_80k.py /^ img_size=768,$/;" v +in_channels .\configs\_base_\models\ann_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\ann_r50-d8.py /^ in_channels=[1024, 2048],$/;" v +in_channels .\configs\_base_\models\apcnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\apcnet_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\ccnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\ccnet_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\cgnet.py /^ in_channels=256,$/;" v +in_channels .\configs\_base_\models\cgnet.py /^ in_channels=3,$/;" v +in_channels .\configs\_base_\models\danet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\danet_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\deeplabv3_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\deeplabv3_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_channels=128,$/;" v +in_channels .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_channels=3,$/;" v +in_channels .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_channels=64,$/;" v +in_channels .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\dmnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\dmnet_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\dnl_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\dnl_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\emanet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\emanet_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\encnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\encnet_r50-d8.py /^ in_channels=[512, 1024, 2048],$/;" v +in_channels .\configs\_base_\models\fast_scnn.py /^ in_channels=128,$/;" v +in_channels .\configs\_base_\models\fast_scnn.py /^ in_channels=64,$/;" v +in_channels .\configs\_base_\models\fast_scnn.py /^ in_channels=128,$/;" v +in_channels .\configs\_base_\models\fcn_hr18.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_channels .\configs\_base_\models\fcn_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\fcn_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\fcn_unet_s5-d16.py /^ in_channels=128,$/;" v +in_channels .\configs\_base_\models\fcn_unet_s5-d16.py /^ in_channels=3,$/;" v +in_channels .\configs\_base_\models\fcn_unet_s5-d16.py /^ in_channels=64,$/;" v +in_channels .\configs\_base_\models\fpn_r50.py /^ in_channels=[256, 256, 256, 256],$/;" v +in_channels .\configs\_base_\models\fpn_r50.py /^ in_channels=[256, 512, 1024, 2048],$/;" v +in_channels .\configs\_base_\models\gcnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\gcnet_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\lraspp_m-v3-d8.py /^ in_channels=(16, 24, 960),$/;" v +in_channels .\configs\_base_\models\nonlocal_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\nonlocal_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\ocrnet_hr18.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_channels .\configs\_base_\models\ocrnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\ocrnet_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\pointrend_r50.py /^ in_channels=[256, 256, 256, 256],$/;" v +in_channels .\configs\_base_\models\pointrend_r50.py /^ in_channels=[256],$/;" v +in_channels .\configs\_base_\models\pointrend_r50.py /^ in_channels=[256, 512, 1024, 2048],$/;" v +in_channels .\configs\_base_\models\psanet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\psanet_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\pspnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\pspnet_r50-d8.py /^ in_channels=2048,$/;" v +in_channels .\configs\_base_\models\pspnet_unet_s5-d16.py /^ in_channels=128,$/;" v +in_channels .\configs\_base_\models\pspnet_unet_s5-d16.py /^ in_channels=3,$/;" v +in_channels .\configs\_base_\models\pspnet_unet_s5-d16.py /^ in_channels=64,$/;" v +in_channels .\configs\_base_\models\setr_mla.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\setr_naive_pup.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\upernet_r50.py /^ in_channels=1024,$/;" v +in_channels .\configs\_base_\models\upernet_r50.py /^ in_channels=[256, 512, 1024, 2048],$/;" v +in_channels .\configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_channels=256,$/;" v +in_channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_channels=256,$/;" v +in_channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_channels=256,$/;" v +in_channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_channels=256,$/;" v +in_channels .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_channels=768,$/;" v +in_channels .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_channels=768,$/;" v +in_channels .\configs\foodnet\ccnet_vit_768x768_80k.py /^ in_channels=768,$/;" v +in_channels .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ in_channels=(16, 16, 576),$/;" v +in_channels .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ in_channels=(16, 16, 576),$/;" v +in_channels .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_channels .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_channels .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ in_channels=[256, 256, 256, 256],$/;" v +in_channels .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ in_channels=[256],$/;" v +in_channels .\configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +in_channels .\configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +in_chans .\configs\_base_\models\setr_mla.py /^ in_chans=3,$/;" v +in_chans .\configs\_base_\models\setr_naive_pup.py /^ in_chans=3,$/;" v +in_chans .\configs\foodnet\ccnet_vit_768x768_80k.py /^ in_chans=3,$/;" v +in_index .\configs\_base_\models\ann_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\ann_r50-d8.py /^ in_index=[2, 3],$/;" v +in_index .\configs\_base_\models\apcnet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\apcnet_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\ccnet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\ccnet_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\cgnet.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\danet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\danet_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\deeplabv3_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\deeplabv3_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_index=4,$/;" v +in_index .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\dmnet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\dmnet_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\dnl_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\dnl_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\emanet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\emanet_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\encnet_r50-d8.py /^ in_index=(1, 2, 3),$/;" v +in_index .\configs\_base_\models\encnet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\fast_scnn.py /^ in_index=-2,$/;" v +in_index .\configs\_base_\models\fast_scnn.py /^ in_index=-3,$/;" v +in_index .\configs\_base_\models\fast_scnn.py /^ in_index=-1,$/;" v +in_index .\configs\_base_\models\fcn_hr18.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\_base_\models\fcn_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\fcn_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\fcn_unet_s5-d16.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\fcn_unet_s5-d16.py /^ in_index=4,$/;" v +in_index .\configs\_base_\models\fpn_r50.py /^ in_index=[0, 1, 2, 3],$/;" v +in_index .\configs\_base_\models\gcnet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\gcnet_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\lraspp_m-v3-d8.py /^ in_index=(0, 1, 2),$/;" v +in_index .\configs\_base_\models\nonlocal_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\nonlocal_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\ocrnet_hr18.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\_base_\models\ocrnet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\ocrnet_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\pointrend_r50.py /^ in_index=[0, 1, 2, 3],$/;" v +in_index .\configs\_base_\models\pointrend_r50.py /^ in_index=[0],$/;" v +in_index .\configs\_base_\models\psanet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\psanet_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\pspnet_r50-d8.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\pspnet_r50-d8.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\pspnet_unet_s5-d16.py /^ in_index=3,$/;" v +in_index .\configs\_base_\models\pspnet_unet_s5-d16.py /^ in_index=4,$/;" v +in_index .\configs\_base_\models\setr_naive_pup.py /^ in_index=23,$/;" v +in_index .\configs\_base_\models\upernet_r50.py /^ in_index=2,$/;" v +in_index .\configs\_base_\models\upernet_r50.py /^ in_index=[0, 1, 2, 3],$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_index=0,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_index=1,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_index=2,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_index=3,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=0,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=1,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=2,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=3,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_index=0,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_index=1,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_index=2,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_index=3,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_index=0,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_index=1,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_index=2,$/;" v +in_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_index=3,$/;" v +in_index .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=5,$/;" v +in_index .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=7,$/;" v +in_index .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=9,$/;" v +in_index .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=11,$/;" v +in_index .\configs\foodnet\ccnet_vit_768x768_80k.py /^ in_index=11,$/;" v +in_index .\configs\foodnet\ccnet_vit_768x768_80k.py /^ in_index=9,$/;" v +in_index .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ in_index=(0, 1, 2),$/;" v +in_index .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ in_index=(0, 1, 2),$/;" v +in_index .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ in_index=(0, 1, 2, 3),$/;" v +in_index .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ in_index=[0, 1, 2, 3],$/;" v +in_index .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ in_index=[0],$/;" v +inference .\mmseg\models\segmentors\encoder_decoder.py /^ def inference(self, img, img_meta, rescale):$/;" m class:EncoderDecoder +inference_segmentor .\demo\image_demo.py /^from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +inference_segmentor .\mmseg\apis\__init__.py /^from .inference import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +inference_segmentor .\mmseg\apis\inference.py /^def inference_segmentor(model, img):$/;" f +inference_segmentor .\tests\test_inference.py /^from mmseg.apis import inference_segmentor, init_segmentor$/;" i +init_dist .\tools\test.py /^from mmcv.runner import get_dist_info, init_dist, load_checkpoint$/;" i +init_dist .\tools\train.py /^from mmcv.runner import init_dist$/;" i +init_segmentor .\demo\image_demo.py /^from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +init_segmentor .\mmseg\apis\__init__.py /^from .inference import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +init_segmentor .\mmseg\apis\inference.py /^def init_segmentor(config, checkpoint=None, device='cuda:0'):$/;" f +init_segmentor .\tests\test_inference.py /^from mmseg.apis import inference_segmentor, init_segmentor$/;" i +init_weights .\mmseg\models\backbones\cgnet.py /^ def init_weights(self, pretrained=None):$/;" m class:CGNet +init_weights .\mmseg\models\backbones\fast_scnn.py /^ def init_weights(self, pretrained=None):$/;" m class:FastSCNN +init_weights .\mmseg\models\backbones\hrnet.py /^ def init_weights(self, pretrained=None):$/;" m class:HRNet +init_weights .\mmseg\models\backbones\mobilenet_v2.py /^ def init_weights(self, pretrained=None):$/;" m class:MobileNetV2 +init_weights .\mmseg\models\backbones\mobilenet_v3.py /^ def init_weights(self, pretrained=None):$/;" m class:MobileNetV3 +init_weights .\mmseg\models\backbones\pvt.py /^ def init_weights(self, pretrained=None):$/;" m class:PyramidVisionTransformer +init_weights .\mmseg\models\backbones\pvt_dia.py /^ def init_weights(self, pretrained=None):$/;" m class:PyramidVisionTransformer +init_weights .\mmseg\models\backbones\resnet.py /^ def init_weights(self, pretrained=None):$/;" m class:ResNet +init_weights .\mmseg\models\backbones\unet.py /^ def init_weights(self, pretrained=None):$/;" m class:UNet +init_weights .\mmseg\models\backbones\vit.py /^ def init_weights(self, pretrained=None):$/;" m class:VisionTransformer +init_weights .\mmseg\models\backbones\vit_mla.py /^ def init_weights(self, pretrained=None):$/;" m class:VIT_MLA +init_weights .\mmseg\models\decode_heads\decode_head.py /^ def init_weights(self):$/;" m class:BaseDecodeHead +init_weights .\mmseg\models\decode_heads\point_head.py /^ def init_weights(self):$/;" m class:PointHead +init_weights .\mmseg\models\decode_heads\vit_up_head.py /^ def init_weights(self):$/;" m class:VisionTransformerUpHead +init_weights .\mmseg\models\necks\fpn.py /^ def init_weights(self):$/;" m class:FPN +init_weights .\mmseg\models\segmentors\base.py /^ def init_weights(self, pretrained=None):$/;" m class:BaseSegmentor +init_weights .\mmseg\models\segmentors\cascade_encoder_decoder.py /^ def init_weights(self, pretrained=None):$/;" m class:CascadeEncoderDecoder +init_weights .\mmseg\models\segmentors\encoder_decoder.py /^ def init_weights(self, pretrained=None):$/;" m class:EncoderDecoder +init_weights .\mmseg\models\utils\self_attention_block.py /^ def init_weights(self):$/;" m class:SelfAttentionBlock +init_weights .\tests\test_models\test_segmentor.py /^ def init_weights(self, pretrained=None):$/;" m class:ExampleBackbone +input_shape .\tools\pytorch2onnx.py /^ input_shape = ($/;" v +input_shape .\tools\pytorch2onnx.py /^ input_shape = (1, 3, args.shape[0], args.shape[0])$/;" v +input_transform .\configs\_base_\models\fcn_hr18.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\_base_\models\lraspp_m-v3-d8.py /^ input_transform='multiple_select',$/;" v +input_transform .\configs\_base_\models\ocrnet_hr18.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ input_transform='multiple_select',$/;" v +input_transform .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ input_transform='multiple_select',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ input_transform='resize_concat',$/;" v +input_transform .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ input_transform='resize_concat',$/;" v +intersect_and_union .\mmseg\core\evaluation\metrics.py /^def intersect_and_union(pred_label,$/;" f +interval .\configs\_base_\default_runtime.py /^ interval=50,$/;" v +is_block .\tests\test_models\test_backbone.py /^def is_block(modules):$/;" f +is_norm .\tests\test_models\test_backbone.py /^def is_norm(modules):$/;" f +is_tuple_of .\mmseg\datasets\pipelines\transforms.py /^from mmcv.utils import deprecated_api_warning, is_tuple_of$/;" i +is_tuple_of .\mmseg\models\decode_heads\lraspp_head.py /^from mmcv import is_tuple_of$/;" i +isdir .\tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +join .\tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +join .\tests\test_models\test_forward.py /^from os.path import dirname, exists, join$/;" i +json .\.dev\gather_models.py /^import json$/;" i +json2labelImg .\tools\convert_datasets\cityscapes.py /^from cityscapesscripts.preparation.json2labelImg import json2labelImg$/;" i +kaiming_init .\mmseg\models\backbones\mobilenet_v2.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +kaiming_init .\mmseg\models\backbones\mobilenet_v3.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +kernel_size .\configs\_base_\models\fcn_hr18.py /^ kernel_size=1,$/;" v +kernel_size .\configs\_base_\models\ocrnet_hr18.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ kernel_size=1,$/;" v +kernel_size .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ kernel_size=1,$/;" v +key_pool_scales .\configs\_base_\models\ann_r50-d8.py /^ key_pool_scales=(1, 3, 6, 8),$/;" v +legacy_mean_dice .\tests\test_metrics.py /^def legacy_mean_dice(results, gt_seg_maps, num_classes, ignore_index):$/;" f +legacy_mean_iou .\tests\test_metrics.py /^def legacy_mean_iou(results, gt_seg_maps, num_classes, ignore_index):$/;" f +load_annotations .\mmseg\datasets\custom.py /^ def load_annotations(self, img_dir, img_suffix, ann_dir, seg_map_suffix,$/;" m class:CustomDataset +load_checkpoint .\mmseg\apis\inference.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\mmseg\models\backbones\cgnet.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\mmseg\models\backbones\hrnet.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\mmseg\models\backbones\mobilenet_v2.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\mmseg\models\backbones\mobilenet_v3.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\mmseg\models\backbones\pvt.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\mmseg\models\backbones\pvt_dia.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\mmseg\models\backbones\resnet.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\mmseg\models\backbones\unet.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\tools\benchmark.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\tools\pytorch2onnx.py /^from mmcv.runner import load_checkpoint$/;" i +load_checkpoint .\tools\test.py /^from mmcv.runner import get_dist_info, init_dist, load_checkpoint$/;" i +load_from .\configs\_base_\default_runtime.py /^load_from = None$/;" v +load_pretrained .\mmseg\models\backbones\helpers.py /^def load_pretrained(model, cfg=None, num_classes=1000, in_chans=3, filter_fn=None, strict=True, pos_embed_interp=False, num_patches=576, align_corners=False):$/;" f +load_pretrained .\mmseg\models\backbones\vit.py /^from .helpers import load_pretrained$/;" i +load_pretrained .\mmseg\models\backbones\vit_mla.py /^from .helpers import load_pretrained$/;" i +load_pretrained .\mmseg\models\decode_heads\helpers.py /^def load_pretrained(model, cfg=None, num_classes=1000, in_chans=3, filter_fn=None, strict=True, pos_embed_interp=False, num_patches=576, align_corners=False):$/;" f +load_pretrained .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .helpers import load_pretrained$/;" i +load_pretrained .\mmseg\models\decode_heads\vit_mla_head.py /^from .helpers import load_pretrained$/;" i +load_pretrained .\mmseg\models\decode_heads\vit_up_head.py /^from .helpers import load_pretrained$/;" i +load_state_dict_from_url .\mmseg\models\backbones\helpers.py /^def load_state_dict_from_url(url, model_dir=None, file_name=None, check_hash=False, progress=True, map_location=None):$/;" f +loadmat .\tools\convert_datasets\voc_aug.py /^from scipy.io import loadmat$/;" i +log_config .\configs\_base_\default_runtime.py /^log_config = dict($/;" v +log_level .\configs\_base_\default_runtime.py /^log_level = 'INFO'$/;" v +logging .\mmseg\models\backbones\helpers.py /^import logging$/;" i +logging .\mmseg\models\backbones\mobilenet_v2.py /^import logging$/;" i +logging .\mmseg\models\backbones\mobilenet_v3.py /^import logging$/;" i +logging .\mmseg\models\decode_heads\helpers.py /^import logging$/;" i +logging .\mmseg\models\segmentors\base.py /^import logging$/;" i +logging .\mmseg\utils\logger.py /^import logging$/;" i +logging .\tests\test_eval_hook.py /^import logging$/;" i +loss_decode .\configs\_base_\models\ann_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\apcnet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\ccnet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\cgnet.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\danet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\deeplabv3_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\dmnet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\dnl_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\emanet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\encnet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\fast_scnn.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\fast_scnn.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\fcn_hr18.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\fcn_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\fcn_unet_s5-d16.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\fpn_r50.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\gcnet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\lraspp_m-v3-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\nonlocal_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\ocrnet_hr18.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\ocrnet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\pointrend_r50.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\psanet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\pspnet_r50-d8.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\pspnet_unet_s5-d16.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\setr_mla.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\setr_naive_pup.py /^ loss_decode=dict($/;" v +loss_decode .\configs\_base_\models\upernet_r50.py /^ loss_decode=dict($/;" v +loss_decode .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ loss_decode=dict($/;" v +loss_decode .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ loss_decode=dict($/;" v +loss_decode .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ loss_decode=dict($/;" v +loss_decode .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ loss_decode=dict($/;" v +loss_decode .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ loss_decode=dict($/;" v +loss_decode .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ loss_decode=dict($/;" v +loss_decode .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ loss_decode=dict($/;" v +loss_decode .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ loss_decode=dict($/;" v +loss_decode .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ loss_decode=dict($/;" v +loss_se_decode .\configs\_base_\models\encnet_r50-d8.py /^ loss_se_decode=dict($/;" v +loss_weight .\configs\_base_\models\cgnet.py /^ loss_weight=1.0,$/;" v +losses .\mmseg\models\decode_heads\da_head.py /^ def losses(self, seg_logit, seg_label):$/;" m class:DAHead +losses .\mmseg\models\decode_heads\decode_head.py /^ def losses(self, seg_logit, seg_label):$/;" m class:BaseDecodeHead +losses .\mmseg\models\decode_heads\enc_head.py /^ def losses(self, seg_logit, seg_label):$/;" m class:EncHead +losses .\mmseg\models\decode_heads\point_head.py /^ def losses(self, point_logits, point_label):$/;" m class:PointHead +lovasz_grad .\mmseg\models\losses\lovasz_loss.py /^def lovasz_grad(gt_sorted):$/;" f +lovasz_hinge .\mmseg\models\losses\lovasz_loss.py /^def lovasz_hinge(logits,$/;" f +lovasz_hinge_flat .\mmseg\models\losses\lovasz_loss.py /^def lovasz_hinge_flat(logits, labels):$/;" f +lovasz_softmax .\mmseg\models\losses\lovasz_loss.py /^def lovasz_softmax(probs,$/;" f +lovasz_softmax_flat .\mmseg\models\losses\lovasz_loss.py /^def lovasz_softmax_flat(probs, labels, classes='present', class_weight=None):$/;" f +lower_in_channels .\configs\_base_\models\fast_scnn.py /^ lower_in_channels=128,$/;" v +lr_config .\configs\_base_\schedules\schedule_160k.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +lr_config .\configs\_base_\schedules\schedule_20k.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +lr_config .\configs\_base_\schedules\schedule_40k.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +lr_config .\configs\_base_\schedules\schedule_80k.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +lr_config .\configs\_base_\schedules\schedule_80k_step.py /^lr_config = dict($/;" v +lr_config .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +lr_config .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +lr_config .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^lr_config = dict(policy='step', $/;" v +lr_config .\configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py /^lr_config = dict(min_lr=2e-4)$/;" v +lr_config .\configs\ocrnet\ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py /^lr_config = dict(min_lr=2e-4)$/;" v +lr_config .\configs\point_rend\pointrend_r50_512x1024_80k_cityscapes.py /^lr_config = dict(warmup='linear', warmup_iters=200)$/;" v +lr_config .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^lr_config = dict(warmup='linear', warmup_iters=200)$/;" v +main .\.dev\gather_models.py /^def main():$/;" f +main .\.dev\upload_modelzoo.py /^def main():$/;" f +main .\demo\image_demo.py /^def main():$/;" f +main .\tools\benchmark.py /^def main():$/;" f +main .\tools\convert_datasets\chase_db1.py /^def main():$/;" f +main .\tools\convert_datasets\cityscapes.py /^def main():$/;" f +main .\tools\convert_datasets\drive.py /^def main():$/;" f +main .\tools\convert_datasets\hrf.py /^def main():$/;" f +main .\tools\convert_datasets\pascal_context.py /^def main():$/;" f +main .\tools\convert_datasets\stare.py /^def main():$/;" f +main .\tools\convert_datasets\voc_aug.py /^def main():$/;" f +main .\tools\get_flops.py /^def main():$/;" f +main .\tools\print_config.py /^def main():$/;" f +main .\tools\publish_model.py /^def main():$/;" f +main .\tools\test.py /^def main():$/;" f +main .\tools\train.py /^def main():$/;" f +make_block_plugins .\mmseg\models\backbones\resnet.py /^ def make_block_plugins(self, in_channels, plugins):$/;" m class:Bottleneck +make_divisible .\mmseg\models\backbones\mobilenet_v2.py /^from ..utils import InvertedResidual, make_divisible$/;" i +make_divisible .\mmseg\models\utils\__init__.py /^from .make_divisible import make_divisible$/;" i +make_divisible .\mmseg\models\utils\make_divisible.py /^def make_divisible(value, divisor, min_value=None, min_ratio=0.9):$/;" f +make_divisible .\mmseg\models\utils\se_layer.py /^from .make_divisible import make_divisible$/;" i +make_divisible .\tests\test_utils\test_make_divisible.py /^from mmseg.models.utils import make_divisible$/;" i +make_layer .\mmseg\models\backbones\mobilenet_v2.py /^ def make_layer(self, out_channels, num_blocks, stride, dilation,$/;" m class:MobileNetV2 +make_res_layer .\mmseg\models\backbones\resnest.py /^ def make_res_layer(self, **kwargs):$/;" m class:ResNeSt +make_res_layer .\mmseg\models\backbones\resnet.py /^ def make_res_layer(self, **kwargs):$/;" m class:ResNet +make_res_layer .\mmseg\models\backbones\resnext.py /^ def make_res_layer(self, **kwargs):$/;" m class:ResNeXt +make_stage_plugins .\mmseg\models\backbones\resnet.py /^ def make_stage_plugins(self, plugins, stage_idx):$/;" m class:ResNet +mask_cross_entropy .\mmseg\models\losses\cross_entropy_loss.py /^def mask_cross_entropy(pred,$/;" f +mask_size .\configs\_base_\models\psanet_r50-d8.py /^ mask_size=(97, 97),$/;" v +master_doc .\docs\conf.py /^master_doc = 'index'$/;" v +math .\mmseg\models\backbones\helpers.py /^import math$/;" i +math .\mmseg\models\backbones\layers\weight_init.py /^import math$/;" i +math .\mmseg\models\backbones\resnest.py /^import math$/;" i +math .\mmseg\models\backbones\resnext.py /^import math$/;" i +math .\mmseg\models\backbones\vit.py /^import math$/;" i +math .\mmseg\models\backbones\vit_mla.py /^import math$/;" i +math .\mmseg\models\decode_heads\ema_head.py /^import math$/;" i +math .\mmseg\models\decode_heads\helpers.py /^import math$/;" i +math .\mmseg\models\decode_heads\layers\weight_init.py /^import math$/;" i +math .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^import math$/;" i +math .\mmseg\models\decode_heads\vit_mla_head.py /^import math$/;" i +math .\mmseg\models\decode_heads\vit_up_head.py /^import math$/;" i +math .\tests\test_data\test_dataset_builder.py /^import math$/;" i +matplotlib .\mmseg\apis\inference.py /^import matplotlib.pyplot as plt$/;" i +mean_dice .\mmseg\core\evaluation\__init__.py /^from .metrics import eval_metrics, mean_dice, mean_iou$/;" i +mean_dice .\mmseg\core\evaluation\metrics.py /^def mean_dice(results,$/;" f +mean_dice .\tests\test_metrics.py /^from mmseg.core.evaluation import eval_metrics, mean_dice, mean_iou$/;" i +mean_iou .\mmseg\core\evaluation\__init__.py /^from .metrics import eval_metrics, mean_dice, mean_iou$/;" i +mean_iou .\mmseg\core\evaluation\metrics.py /^def mean_iou(results,$/;" f +mean_iou .\tests\test_metrics.py /^from mmseg.core.evaluation import eval_metrics, mean_dice, mean_iou$/;" i +mla_channels .\configs\_base_\models\setr_mla.py /^ mla_channels=256,$/;" v +mla_channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ mla_channels=256,$/;" v +mla_channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ mla_channels=256,$/;" v +mla_channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ mla_channels=256,$/;" v +mla_channels .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ mla_channels=256,$/;" v +mla_index .\configs\_base_\models\setr_mla.py /^ mla_index=(5,11,17,23)$/;" v +mla_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ mla_index=(5,7,9,11)$/;" v +mla_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ mla_index=(5,7,9,11)$/;" v +mla_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ mla_index=(5,7,9,11)$/;" v +mla_index .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ mla_index=(5,11,17,23)$/;" v +mlahead_channels .\configs\_base_\models\setr_mla.py /^ mlahead_channels=128,$/;" v +mmcv .\.dev\gather_models.py /^import mmcv$/;" i +mmcv .\mmseg\__init__.py /^import mmcv$/;" i +mmcv .\mmseg\apis\inference.py /^import mmcv$/;" i +mmcv .\mmseg\apis\test.py /^import mmcv$/;" i +mmcv .\mmseg\core\evaluation\class_names.py /^import mmcv$/;" i +mmcv .\mmseg\core\evaluation\metrics.py /^import mmcv$/;" i +mmcv .\mmseg\datasets\cityscapes.py /^import mmcv$/;" i +mmcv .\mmseg\datasets\custom.py /^import mmcv$/;" i +mmcv .\mmseg\datasets\pipelines\formating.py /^import mmcv$/;" i +mmcv .\mmseg\datasets\pipelines\loading.py /^import mmcv$/;" i +mmcv .\mmseg\datasets\pipelines\test_time_aug.py /^import mmcv$/;" i +mmcv .\mmseg\datasets\pipelines\transforms.py /^import mmcv$/;" i +mmcv .\mmseg\models\backbones\mobilenet_v3.py /^import mmcv$/;" i +mmcv .\mmseg\models\losses\lovasz_loss.py /^import mmcv$/;" i +mmcv .\mmseg\models\segmentors\base.py /^import mmcv$/;" i +mmcv .\mmseg\models\utils\se_layer.py /^import mmcv$/;" i +mmcv .\tests\test_data\test_loading.py /^import mmcv$/;" i +mmcv .\tests\test_data\test_transform.py /^import mmcv$/;" i +mmcv .\tests\test_data\test_tta.py /^import mmcv$/;" i +mmcv .\tests\test_eval_hook.py /^import mmcv.runner$/;" i +mmcv .\tests\test_inference.py /^import mmcv$/;" i +mmcv .\tests\test_utils\test_inverted_residual_module.py /^import mmcv$/;" i +mmcv .\tests\test_utils\test_se_layer.py /^import mmcv$/;" i +mmcv .\tools\convert_datasets\chase_db1.py /^import mmcv$/;" i +mmcv .\tools\convert_datasets\cityscapes.py /^import mmcv$/;" i +mmcv .\tools\convert_datasets\drive.py /^import mmcv$/;" i +mmcv .\tools\convert_datasets\hrf.py /^import mmcv$/;" i +mmcv .\tools\convert_datasets\pascal_context.py /^import mmcv$/;" i +mmcv .\tools\convert_datasets\stare.py /^import mmcv$/;" i +mmcv .\tools\convert_datasets\voc_aug.py /^import mmcv$/;" i +mmcv .\tools\pytorch2onnx.py /^import mmcv$/;" i +mmcv .\tools\test.py /^import mmcv$/;" i +mmcv .\tools\train.py /^import mmcv$/;" i +mmcv_max_version .\mmseg\__init__.py /^mmcv_max_version = digit_version(MMCV_MAX)$/;" v +mmcv_min_version .\mmseg\__init__.py /^mmcv_min_version = digit_version(MMCV_MIN)$/;" v +mmcv_version .\mmseg\__init__.py /^mmcv_version = digit_version(mmcv.__version__)$/;" v +mmseg .\mmseg\utils\collect_env.py /^import mmseg$/;" i +mmseg .\tests\test_config.py /^ import mmseg$/;" i +mmseg .\tests\test_models\test_forward.py /^ import mmseg$/;" i +mode .\configs\_base_\models\dnl_r50-d8.py /^ mode='embedded_gaussian',$/;" v +mode .\configs\_base_\models\nonlocal_r50-d8.py /^ mode='embedded_gaussian',$/;" v +mode .\configs\_base_\models\pointrend_r50.py /^ mode='whole',$/;" v +model .\configs\_base_\models\ann_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\apcnet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\ccnet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\cgnet.py /^model = dict($/;" v +model .\configs\_base_\models\danet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\deeplabv3_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^model = dict($/;" v +model .\configs\_base_\models\deeplabv3plus_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\dmnet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\dnl_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\emanet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\encnet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\fast_scnn.py /^model = dict($/;" v +model .\configs\_base_\models\fcn_hr18.py /^model = dict($/;" v +model .\configs\_base_\models\fcn_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\fcn_unet_s5-d16.py /^model = dict($/;" v +model .\configs\_base_\models\fpn_r50.py /^model = dict($/;" v +model .\configs\_base_\models\gcnet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\lraspp_m-v3-d8.py /^model = dict($/;" v +model .\configs\_base_\models\nonlocal_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\ocrnet_hr18.py /^model = dict($/;" v +model .\configs\_base_\models\ocrnet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\pointrend_r50.py /^model = dict($/;" v +model .\configs\_base_\models\psanet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\pspnet_r50-d8.py /^model = dict($/;" v +model .\configs\_base_\models\pspnet_unet_s5-d16.py /^model = dict($/;" v +model .\configs\_base_\models\setr_mla.py /^model = dict($/;" v +model .\configs\_base_\models\setr_naive_pup.py /^model = dict($/;" v +model .\configs\_base_\models\upernet_r50.py /^model = dict($/;" v +model .\configs\ann\ann_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ann\ann_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ann\ann_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ann\ann_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ann\ann_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ann\ann_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ann\ann_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ann\ann_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ann\ann_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\ann\ann_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\ann\ann_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\ann\ann_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\apcnet\apcnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\apcnet\apcnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\apcnet\apcnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\apcnet\apcnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\apcnet\apcnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\apcnet\apcnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\apcnet\apcnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\apcnet\apcnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\ccnet\ccnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ccnet\ccnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ccnet\ccnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ccnet\ccnet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ccnet\ccnet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ccnet\ccnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ccnet\ccnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ccnet\ccnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ccnet\ccnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\ccnet\ccnet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\ccnet\ccnet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\ccnet\ccnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\danet\danet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\danet\danet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\danet\danet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\danet\danet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\danet\danet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\danet\danet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\danet\danet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\danet\danet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\danet\danet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\danet\danet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\danet\danet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\danet\danet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_480x480_40k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_480x480_80k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3\deeplabv3_r101b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r101b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3\deeplabv3_r50b-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +model .\configs\deeplabv3\deeplabv3_r50b-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_480x480_40k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_480x480_80k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +model .\configs\deeplabv3plus\deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +model .\configs\dmnet\dmnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dmnet\dmnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dmnet\dmnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dmnet\dmnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dmnet\dmnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dmnet\dmnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dmnet\dmnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\dmnet\dmnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\dnlnet\dnl_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dnlnet\dnl_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dnlnet\dnl_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dnlnet\dnl_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dnlnet\dnl_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dnlnet\dnl_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\dnlnet\dnl_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\dnlnet\dnl_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\emanet\emanet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\emanet\emanet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\encnet\encnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\encnet\encnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\encnet\encnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\encnet\encnet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\encnet\encnet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\encnet\encnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\encnet\encnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\encnet\encnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\encnet\encnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\encnet\encnet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\encnet\encnet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\encnet\encnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\fcn\fcn_r101-d8_480x480_40k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101-d8_480x480_80k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\fcn\fcn_r101b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\fcn\fcn_r101b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^model = dict($/;" v +model .\configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^model = dict($/;" v +model .\configs\fcn\fcn_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\fcn\fcn_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\fcn\fcn_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\fcn\fcn_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\fcn\fcn_r50b-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +model .\configs\fcn\fcn_r50b-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +model .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^model = dict($/;" v +model .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^model = dict($/;" v +model .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^model = dict($/;" v +model .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^model = dict($/;" v +model .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^model = dict($/;" v +model .\configs\foodnet\ccnet_r50-d8_512x1024_80k_RM.py /^model = dict(pretrained='.\/pretrained_model\/recipe1M_R50_LSTM.pth', backbone=dict(type='ResNet'))$/;" v +model .\configs\foodnet\ccnet_vit_768x768_80k.py /^model = dict($/;" v +model .\configs\foodnet\fpn_r50_512x1024_80k.py /^model = dict(decode_head=dict(num_classes=104))$/;" v +model .\configs\foodnet\fpn_r50_512x1024_80k_RM.py /^model = dict(pretrained='.\/pretrained_model\/recipe1M_R50_LSTM.pth', $/;" v +model .\configs\gcnet\gcnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\gcnet\gcnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\gcnet\gcnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\gcnet\gcnet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\gcnet\gcnet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\gcnet\gcnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\gcnet\gcnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\gcnet\gcnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\gcnet\gcnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\gcnet\gcnet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\gcnet\gcnet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\gcnet\gcnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18_512x512_160k_ade20k.py /^model = dict(decode_head=dict(num_classes=150))$/;" v +model .\configs\hrnet\fcn_hr18_512x512_20k_voc12aug.py /^model = dict(decode_head=dict(num_classes=21))$/;" v +model .\configs\hrnet\fcn_hr18_512x512_40k_voc12aug.py /^model = dict(decode_head=dict(num_classes=21))$/;" v +model .\configs\hrnet\fcn_hr18_512x512_80k_ade20k.py /^model = dict(decode_head=dict(num_classes=150))$/;" v +model .\configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\mobilenet_v3\lraspp_m-v3-d8_512x1024_320k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/contrib\/mobilenet_v3_large')$/;" v +model .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^model = dict($/;" v +model .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^model = dict($/;" v +model .\configs\nonlocal_net\nonlocal_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\nonlocal_net\nonlocal_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\nonlocal_net\nonlocal_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\nonlocal_net\nonlocal_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\nonlocal_net\nonlocal_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\nonlocal_net\nonlocal_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\nonlocal_net\nonlocal_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\nonlocal_net\nonlocal_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\nonlocal_net\nonlocal_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\nonlocal_net\nonlocal_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\nonlocal_net\nonlocal_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\nonlocal_net\nonlocal_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^model = dict(decode_head=[$/;" v +model .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^model = dict(decode_head=[$/;" v +model .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^model = dict(decode_head=[$/;" v +model .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^model = dict(decode_head=[$/;" v +model .\configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\ocrnet\ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\point_rend\pointrend_r101_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\point_rend\pointrend_r101_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^model = dict(decode_head=[$/;" v +model .\configs\psanet\psanet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\psanet\psanet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\psanet\psanet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\psanet\psanet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\psanet\psanet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\psanet\psanet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\psanet\psanet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\psanet\psanet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\psanet\psanet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\psanet\psanet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\psanet\psanet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\psanet\psanet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r101-d8_480x480_40k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101-d8_480x480_80k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\pspnet\pspnet_r101b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r101b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +model .\configs\pspnet\pspnet_r50b-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +model .\configs\pspnet\pspnet_r50b-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +model .\configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +model .\configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\sem_fpn\fpn_r101_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\sem_fpn\fpn_r101_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\sem_fpn\fpn_r50_512x512_160k_ade20k.py /^model = dict(decode_head=dict(num_classes=150))$/;" v +model .\configs\unet\deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +model .\configs\unet\deeplabv3_unet_s5-d16_128x128_40k_stare.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +model .\configs\unet\deeplabv3_unet_s5-d16_256x256_40k_hrf.py /^model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170)))$/;" v +model .\configs\unet\deeplabv3_unet_s5-d16_64x64_40k_drive.py /^model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42)))$/;" v +model .\configs\unet\fcn_unet_s5-d16_128x128_40k_chase_db1.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +model .\configs\unet\fcn_unet_s5-d16_128x128_40k_stare.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +model .\configs\unet\fcn_unet_s5-d16_256x256_40k_hrf.py /^model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170)))$/;" v +model .\configs\unet\fcn_unet_s5-d16_64x64_40k_drive.py /^model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42)))$/;" v +model .\configs\unet\pspnet_unet_s5-d16_128x128_40k_chase_db1.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +model .\configs\unet\pspnet_unet_s5-d16_128x128_40k_stare.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +model .\configs\unet\pspnet_unet_s5-d16_256x256_40k_hrf.py /^model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170)))$/;" v +model .\configs\unet\pspnet_unet_s5-d16_64x64_40k_drive.py /^model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42)))$/;" v +model .\configs\upernet\upernet_r101_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\upernet\upernet_r101_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\upernet\upernet_r101_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\upernet\upernet_r101_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\upernet\upernet_r101_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\upernet\upernet_r101_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\upernet\upernet_r101_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\upernet\upernet_r101_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +model .\configs\upernet\upernet_r50_512x512_160k_ade20k.py /^model = dict($/;" v +model .\configs\upernet\upernet_r50_512x512_20k_voc12aug.py /^model = dict($/;" v +model .\configs\upernet\upernet_r50_512x512_40k_voc12aug.py /^model = dict($/;" v +model .\configs\upernet\upernet_r50_512x512_80k_ade20k.py /^model = dict($/;" v +model .\configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^model = dict($/;" v +model .\configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^model = dict($/;" v +model_name .\configs\_base_\models\setr_mla.py /^ model_name='vit_large_patch16_384',$/;" v +model_name .\configs\_base_\models\setr_naive_pup.py /^ model_name='vit_base_patch16_224',$/;" v +model_name .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ model_name='vit_base_patch16_384',$/;" v +model_name .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ model_name='vit_base_patch16_224',$/;" v +model_name .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ model_name='vit_base_patch16_224',$/;" v +model_name .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ model_name='vit_base_patch16_224',$/;" v +model_name .\configs\foodnet\ccnet_vit_768x768_80k.py /^ model_name='vit_large_patch16_224',$/;" v +model_zoo .\mmseg\models\backbones\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +model_zoo .\mmseg\models\decode_heads\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +momentum .\configs\_base_\models\emanet_r50-d8.py /^ momentum=0.1,$/;" v +msglist .\docs\stat.py /^msglist = '\\n'.join(x for _, _, x in stats)$/;" v +multi_gpu_test .\mmseg\apis\__init__.py /^from .test import multi_gpu_test, single_gpu_test$/;" i +multi_gpu_test .\mmseg\apis\test.py /^def multi_gpu_test(model,$/;" f +multi_gpu_test .\mmseg\core\evaluation\eval_hooks.py /^ from mmseg.apis import multi_gpu_test$/;" i +multi_gpu_test .\tests\test_eval_hook.py /^def multi_gpu_test(model, data_loader, tmpdir=None, gpu_collect=False):$/;" f +multi_gpu_test .\tools\test.py /^from mmseg.apis import multi_gpu_test, single_gpu_test$/;" i +multi_grid .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ multi_grid=(1, 2, 4)),$/;" v +multi_grid .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ multi_grid=(1, 2, 4)),$/;" v +multi_grid .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ multi_grid=(1, 2, 4)),$/;" v +multi_grid .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ multi_grid=(1, 2, 4)),$/;" v +neck .\configs\_base_\models\fpn_r50.py /^ neck=dict($/;" v +neck .\configs\_base_\models\pointrend_r50.py /^ neck=dict($/;" v +net .\tests\test_model.py /^net=torch.load(pthfile)$/;" v +nn .\mmseg\core\seg\sampler\ohem_pixel_sampler.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\backbones\cgnet.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\fast_scnn.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\helpers.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\helpers.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\backbones\hrnet.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\layers\drop.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\layers\drop.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\backbones\mobilenet_v2.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\mobilenet_v3.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\pvt.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\pvt.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\backbones\pvt_dia.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\pvt_dia.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\backbones\resnest.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\resnest.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\backbones\resnet.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\unet.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\vit.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\vit.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\backbones\vit_mla.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\backbones\vit_mla.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\builder.py /^from torch import nn$/;" i +nn .\mmseg\models\decode_heads\ann_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\apc_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\apc_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\aspp_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\da_head.py /^from torch import nn$/;" i +nn .\mmseg\models\decode_heads\da_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\decode_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\dm_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\dm_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\dnl_head.py /^from torch import nn$/;" i +nn .\mmseg\models\decode_heads\ema_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\ema_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\enc_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\enc_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\fcn_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\fpn_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\helpers.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\helpers.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\layers\drop.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\layers\drop.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\lraspp_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\ocr_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\ocr_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\point_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\psa_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\psa_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\psp_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\sep_aspp_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\uper_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\decode_heads\vit_up_head.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\decode_heads\vit_up_head.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\losses\accuracy.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\losses\cross_entropy_loss.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\losses\cross_entropy_loss.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\losses\lovasz_loss.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\losses\lovasz_loss.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\losses\utils.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\necks\fpn.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\necks\fpn.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\segmentors\base.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\segmentors\cascade_encoder_decoder.py /^from torch import nn$/;" i +nn .\mmseg\models\segmentors\encoder_decoder.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\segmentors\encoder_decoder.py /^import torch.nn.functional as F$/;" i +nn .\mmseg\models\utils\inverted_residual.py /^from torch import nn as nn$/;" i +nn .\mmseg\models\utils\res_layer.py /^from torch import nn as nn$/;" i +nn .\mmseg\models\utils\se_layer.py /^import torch.nn as nn$/;" i +nn .\mmseg\models\utils\self_attention_block.py /^from torch import nn as nn$/;" i +nn .\mmseg\models\utils\up_conv_block.py /^import torch.nn as nn$/;" i +nn .\mmseg\ops\encoding.py /^from torch import nn as nn$/;" i +nn .\mmseg\ops\wrappers.py /^import torch.nn as nn$/;" i +nn .\mmseg\ops\wrappers.py /^import torch.nn.functional as F$/;" i +nn .\tests\test_config.py /^from torch import nn$/;" i +nn .\tests\test_eval_hook.py /^import torch.nn as nn$/;" i +nn .\tests\test_models\test_forward.py /^import torch.nn as nn$/;" i +nn .\tests\test_models\test_segmentor.py /^from torch import nn$/;" i +nn .\tests\test_models\test_unet.py /^from torch import nn$/;" i +nn .\tools\pytorch2onnx.py /^from torch import nn$/;" i +no_weight_decay .\mmseg\models\backbones\vit.py /^ def no_weight_decay(self):$/;" m class:VisionTransformer +no_weight_decay .\mmseg\models\backbones\vit_mla.py /^ def no_weight_decay(self):$/;" m class:VIT_MLA +noqa .\mmseg\core\__init__.py /^from .evaluation import * # noqa: F401, F403$/;" i +noqa .\mmseg\core\__init__.py /^from .seg import * # noqa: F401, F403$/;" i +noqa .\mmseg\core\__init__.py /^from .utils import * # noqa: F401, F403$/;" i +noqa .\mmseg\datasets\cityscapes.py /^ import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa$/;" i +noqa .\mmseg\models\__init__.py /^from .backbones import * # noqa: F401,F403$/;" i +noqa .\mmseg\models\__init__.py /^from .decode_heads import * # noqa: F401,F403$/;" i +noqa .\mmseg\models\__init__.py /^from .losses import * # noqa: F401,F403$/;" i +noqa .\mmseg\models\__init__.py /^from .necks import * # noqa: F401,F403$/;" i +noqa .\mmseg\models\__init__.py /^from .segmentors import * # noqa: F401,F403$/;" i +noqa .\mmseg\models\backbones\helpers.py /^from urllib.parse import urlparse # noqa: F401$/;" i +norm0 .\mmseg\models\backbones\resnest.py /^ def norm0(self):$/;" m class:SplitAttentionConv2d +norm1 .\mmseg\models\backbones\hrnet.py /^ def norm1(self):$/;" m class:HRNet +norm1 .\mmseg\models\backbones\resnest.py /^ def norm1(self):$/;" m class:SplitAttentionConv2d +norm1 .\mmseg\models\backbones\resnet.py /^ def norm1(self):$/;" m class:BasicBlock +norm1 .\mmseg\models\backbones\resnet.py /^ def norm1(self):$/;" m class:Bottleneck +norm1 .\mmseg\models\backbones\resnet.py /^ def norm1(self):$/;" m class:ResNet +norm2 .\mmseg\models\backbones\hrnet.py /^ def norm2(self):$/;" m class:HRNet +norm2 .\mmseg\models\backbones\resnet.py /^ def norm2(self):$/;" m class:BasicBlock +norm2 .\mmseg\models\backbones\resnet.py /^ def norm2(self):$/;" m class:Bottleneck +norm3 .\mmseg\models\backbones\resnet.py /^ def norm3(self):$/;" m class:Bottleneck +norm_cdf .\mmseg\models\backbones\layers\weight_init.py /^ def norm_cdf(x):$/;" f function:_no_grad_trunc_normal_ +norm_cdf .\mmseg\models\decode_heads\layers\weight_init.py /^ def norm_cdf(x):$/;" f function:_no_grad_trunc_normal_ +norm_cfg .\configs\_base_\models\ann_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\ann_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\apcnet_r50-d8.py /^ norm_cfg=dict(type='SyncBN', requires_grad=True),$/;" v +norm_cfg .\configs\_base_\models\apcnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\apcnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\ccnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\ccnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\cgnet.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\cgnet.py /^norm_cfg = dict(type='SyncBN', eps=1e-03, requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\danet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\danet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\deeplabv3_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\deeplabv3_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\deeplabv3plus_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\dmnet_r50-d8.py /^ norm_cfg=dict(type='SyncBN', requires_grad=True),$/;" v +norm_cfg .\configs\_base_\models\dmnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\dmnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\dnl_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\dnl_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\emanet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\emanet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\encnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\encnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\fast_scnn.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\fast_scnn.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\fast_scnn.py /^norm_cfg = dict(type='SyncBN', requires_grad=True, momentum=0.01)$/;" v +norm_cfg .\configs\_base_\models\fcn_hr18.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\fcn_hr18.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\fcn_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\fcn_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\fcn_unet_s5-d16.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\fcn_unet_s5-d16.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\fpn_r50.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\fpn_r50.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\gcnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\gcnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\lraspp_m-v3-d8.py /^ norm_cfg=norm_cfg),$/;" v +norm_cfg .\configs\_base_\models\lraspp_m-v3-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\lraspp_m-v3-d8.py /^norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\nonlocal_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\nonlocal_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\ocrnet_hr18.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\ocrnet_hr18.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\ocrnet_hr18.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\ocrnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\ocrnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\ocrnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\pointrend_r50.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\pointrend_r50.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\pointrend_r50.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\psanet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\psanet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\pspnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\pspnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\pspnet_unet_s5-d16.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\pspnet_unet_s5-d16.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\setr_mla.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\setr_mla.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\setr_naive_pup.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\setr_naive_pup.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\_base_\models\upernet_r50.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\_base_\models\upernet_r50.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\foodnet\ccnet_vit_768x768_80k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\foodnet\ccnet_vit_768x768_80k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ norm_cfg=norm_cfg),$/;" v +norm_cfg .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True)$/;" v +norm_cfg .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ norm_cfg=norm_cfg),$/;" v +norm_cfg .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_cfg .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval .\configs\_base_\models\ann_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\apcnet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\ccnet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\danet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\deeplabv3_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ norm_eval=False),$/;" v +norm_eval .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\dmnet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\dnl_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\emanet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\encnet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\fcn_hr18.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\fcn_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\fcn_unet_s5-d16.py /^ norm_eval=False),$/;" v +norm_eval .\configs\_base_\models\fpn_r50.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\gcnet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\nonlocal_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\ocrnet_hr18.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\ocrnet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\pointrend_r50.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\psanet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\pspnet_r50-d8.py /^ norm_eval=False,$/;" v +norm_eval .\configs\_base_\models\pspnet_unet_s5-d16.py /^ norm_eval=False),$/;" v +norm_eval .\configs\_base_\models\upernet_r50.py /^ norm_eval=False,$/;" v +normal_init .\mmseg\models\decode_heads\decode_head.py /^from mmcv.cnn import normal_init$/;" i +normal_init .\mmseg\models\decode_heads\point_head.py /^from mmcv.cnn import ConvModule, normal_init$/;" i +normalization_factor .\configs\_base_\models\psanet_r50-d8.py /^ normalization_factor=1.0,$/;" v +np .\docs\stat.py /^import numpy as np$/;" i +np .\mmseg\apis\test.py /^import numpy as np$/;" i +np .\mmseg\apis\train.py /^import numpy as np$/;" i +np .\mmseg\core\evaluation\metrics.py /^import numpy as np$/;" i +np .\mmseg\datasets\builder.py /^import numpy as np$/;" i +np .\mmseg\datasets\cityscapes.py /^import numpy as np$/;" i +np .\mmseg\datasets\custom.py /^import numpy as np$/;" i +np .\mmseg\datasets\pipelines\formating.py /^import numpy as np$/;" i +np .\mmseg\datasets\pipelines\loading.py /^import numpy as np$/;" i +np .\mmseg\datasets\pipelines\transforms.py /^import numpy as np$/;" i +np .\mmseg\models\decode_heads\fpn_head.py /^import numpy as np$/;" i +np .\mmseg\models\segmentors\base.py /^import numpy as np$/;" i +np .\tests\test_config.py /^ import numpy as np$/;" i +np .\tests\test_data\test_dataset.py /^import numpy as np$/;" i +np .\tests\test_data\test_loading.py /^import numpy as np$/;" i +np .\tests\test_data\test_transform.py /^import numpy as np$/;" i +np .\tests\test_metrics.py /^import numpy as np$/;" i +np .\tests\test_models\test_forward.py /^import numpy as np$/;" i +np .\tests\test_models\test_losses.py /^import numpy as np$/;" i +np .\tests\test_models\test_segmentor.py /^import numpy as np$/;" i +np .\tools\convert_datasets\pascal_context.py /^import numpy as np$/;" i +np .\tools\convert_datasets\voc_aug.py /^import numpy as np$/;" i +np .\tools\pytorch2onnx.py /^import numpy as np$/;" i +np2tmp .\mmseg\apis\test.py /^def np2tmp(array, temp_file_name=None):$/;" f +num_bases .\configs\_base_\models\emanet_r50-d8.py /^ num_bases=64,$/;" v +num_blocks .\configs\_base_\models\cgnet.py /^ num_blocks=(3, 21),$/;" v +num_blocks .\configs\_base_\models\fcn_hr18.py /^ num_blocks=(4, ),$/;" v +num_blocks .\configs\_base_\models\fcn_hr18.py /^ num_blocks=(4, 4),$/;" v +num_blocks .\configs\_base_\models\fcn_hr18.py /^ num_blocks=(4, 4, 4),$/;" v +num_blocks .\configs\_base_\models\fcn_hr18.py /^ num_blocks=(4, 4, 4, 4),$/;" v +num_blocks .\configs\_base_\models\ocrnet_hr18.py /^ num_blocks=(4, ),$/;" v +num_blocks .\configs\_base_\models\ocrnet_hr18.py /^ num_blocks=(4, 4),$/;" v +num_blocks .\configs\_base_\models\ocrnet_hr18.py /^ num_blocks=(4, 4, 4),$/;" v +num_blocks .\configs\_base_\models\ocrnet_hr18.py /^ num_blocks=(4, 4, 4, 4),$/;" v +num_branches .\configs\_base_\models\fcn_hr18.py /^ num_branches=1,$/;" v +num_branches .\configs\_base_\models\fcn_hr18.py /^ num_branches=2,$/;" v +num_branches .\configs\_base_\models\fcn_hr18.py /^ num_branches=3,$/;" v +num_branches .\configs\_base_\models\fcn_hr18.py /^ num_branches=4,$/;" v +num_branches .\configs\_base_\models\ocrnet_hr18.py /^ num_branches=1,$/;" v +num_branches .\configs\_base_\models\ocrnet_hr18.py /^ num_branches=2,$/;" v +num_branches .\configs\_base_\models\ocrnet_hr18.py /^ num_branches=3,$/;" v +num_branches .\configs\_base_\models\ocrnet_hr18.py /^ num_branches=4,$/;" v +num_channels .\configs\_base_\models\cgnet.py /^ num_channels=(32, 64, 128),$/;" v +num_channels .\configs\_base_\models\fcn_hr18.py /^ num_channels=(18, 36)),$/;" v +num_channels .\configs\_base_\models\fcn_hr18.py /^ num_channels=(18, 36, 72)),$/;" v +num_channels .\configs\_base_\models\fcn_hr18.py /^ num_channels=(18, 36, 72, 144)))),$/;" v +num_channels .\configs\_base_\models\fcn_hr18.py /^ num_channels=(64, )),$/;" v +num_channels .\configs\_base_\models\ocrnet_hr18.py /^ num_channels=(18, 36)),$/;" v +num_channels .\configs\_base_\models\ocrnet_hr18.py /^ num_channels=(18, 36, 72)),$/;" v +num_channels .\configs\_base_\models\ocrnet_hr18.py /^ num_channels=(18, 36, 72, 144)))),$/;" v +num_channels .\configs\_base_\models\ocrnet_hr18.py /^ num_channels=(64, )),$/;" v +num_ckpts .\docs\stat.py /^num_ckpts = 0$/;" v +num_classes .\configs\_base_\models\ann_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\apcnet_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\ccnet_r50-d8.py /^ num_classes=104,$/;" v +num_classes .\configs\_base_\models\cgnet.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\danet_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\deeplabv3_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ num_classes=2,$/;" v +num_classes .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\dmnet_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\dnl_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\emanet_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\encnet_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\fast_scnn.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\fast_scnn.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\fcn_hr18.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\fcn_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\fcn_unet_s5-d16.py /^ num_classes=2,$/;" v +num_classes .\configs\_base_\models\fpn_r50.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\gcnet_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\lraspp_m-v3-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\nonlocal_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\ocrnet_hr18.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\ocrnet_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\pointrend_r50.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\psanet_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\pspnet_r50-d8.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\pspnet_unet_s5-d16.py /^ num_classes=2,$/;" v +num_classes .\configs\_base_\models\setr_mla.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\setr_naive_pup.py /^ num_classes=19,$/;" v +num_classes .\configs\_base_\models\upernet_r50.py /^ num_classes=19,$/;" v +num_classes .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ num_classes=104,$/;" v +num_classes .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_classes=104,$/;" v +num_classes .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ num_classes=104,$/;" v +num_classes .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ num_classes=104,$/;" v +num_classes .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_classes=104,$/;" v +num_classes .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_classes=104,$/;" v +num_classes .\configs\foodnet\ccnet_vit_768x768_80k.py /^ num_classes=104,$/;" v +num_classes .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ num_classes=19,$/;" v +num_classes .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ num_classes=19,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ num_classes=150,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ num_classes=21,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ num_classes=21,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ num_classes=150,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ num_classes=19,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ num_classes=19,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ num_classes=19,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ num_classes=150,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ num_classes=21,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ num_classes=21,$/;" v +num_classes .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ num_classes=150,$/;" v +num_classes .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ num_classes=150,$/;" v +num_codes .\configs\_base_\models\encnet_r50-d8.py /^ num_codes=32,$/;" v +num_conv .\configs\_base_\models\setr_naive_pup.py /^ num_conv=2,$/;" v +num_conv .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_conv=2,$/;" v +num_conv .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_conv=2, $/;" v +num_convs .\configs\_base_\models\ann_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\apcnet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\ccnet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\cgnet.py /^ num_convs=0,$/;" v +num_convs .\configs\_base_\models\danet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\deeplabv3_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\dmnet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\dnl_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\emanet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\encnet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\fast_scnn.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\fcn_hr18.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\fcn_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\fcn_r50-d8.py /^ num_convs=2,$/;" v +num_convs .\configs\_base_\models\fcn_unet_s5-d16.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\gcnet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\nonlocal_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\ocrnet_hr18.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\ocrnet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\psanet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\pspnet_r50-d8.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\pspnet_unet_s5-d16.py /^ num_convs=1,$/;" v +num_convs .\configs\_base_\models\upernet_r50.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ num_convs=1,$/;" v +num_convs .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ num_convs=1,$/;" v +num_fcs .\configs\_base_\models\pointrend_r50.py /^ num_fcs=3,$/;" v +num_fcs .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ num_fcs=3,$/;" v +num_heads .\configs\_base_\models\setr_mla.py /^ num_heads=16, $/;" v +num_heads .\configs\_base_\models\setr_naive_pup.py /^ num_heads=16,$/;" v +num_heads .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ num_heads=12,$/;" v +num_heads .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_heads=12,$/;" v +num_heads .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ num_heads=12,$/;" v +num_heads .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_heads=12,$/;" v +num_heads .\configs\foodnet\ccnet_vit_768x768_80k.py /^ num_heads=12, $/;" v +num_modules .\configs\_base_\models\fcn_hr18.py /^ num_modules=1,$/;" v +num_modules .\configs\_base_\models\fcn_hr18.py /^ num_modules=3,$/;" v +num_modules .\configs\_base_\models\fcn_hr18.py /^ num_modules=4,$/;" v +num_modules .\configs\_base_\models\ocrnet_hr18.py /^ num_modules=1,$/;" v +num_modules .\configs\_base_\models\ocrnet_hr18.py /^ num_modules=3,$/;" v +num_modules .\configs\_base_\models\ocrnet_hr18.py /^ num_modules=4,$/;" v +num_outs .\configs\_base_\models\fpn_r50.py /^ num_outs=4),$/;" v +num_outs .\configs\_base_\models\pointrend_r50.py /^ num_outs=4),$/;" v +num_stages .\configs\_base_\models\ann_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\apcnet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\ccnet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\danet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\deeplabv3_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ num_stages=5,$/;" v +num_stages .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\dmnet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\dnl_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\emanet_r50-d8.py /^ num_stages=3,$/;" v +num_stages .\configs\_base_\models\emanet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\encnet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\fcn_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\fcn_unet_s5-d16.py /^ num_stages=5,$/;" v +num_stages .\configs\_base_\models\fpn_r50.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\gcnet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\nonlocal_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\ocrnet_hr18.py /^ num_stages=2,$/;" v +num_stages .\configs\_base_\models\ocrnet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\ocrnet_r50-d8.py /^ num_stages=2,$/;" v +num_stages .\configs\_base_\models\pointrend_r50.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\pointrend_r50.py /^ num_stages=2,$/;" v +num_stages .\configs\_base_\models\psanet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\pspnet_r50-d8.py /^ num_stages=4,$/;" v +num_stages .\configs\_base_\models\pspnet_unet_s5-d16.py /^ num_stages=5,$/;" v +num_stages .\configs\_base_\models\upernet_r50.py /^ num_stages=4,$/;" v +obj_from_dict .\tests\test_eval_hook.py /^from mmcv.runner import obj_from_dict$/;" i +ocr_channels .\configs\_base_\models\ocrnet_hr18.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\_base_\models\ocrnet_r50-d8.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ ocr_channels=256,$/;" v +ocr_channels .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ ocr_channels=256,$/;" v +onnx .\tools\pytorch2onnx.py /^ import onnx$/;" i +opset_version .\tools\pytorch2onnx.py /^ opset_version=args.opset_version,$/;" v +optimizer .\configs\_base_\schedules\schedule_160k.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer .\configs\_base_\schedules\schedule_20k.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer .\configs\_base_\schedules\schedule_40k.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer .\configs\_base_\schedules\schedule_80k.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer .\configs\_base_\schedules\schedule_80k_step.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005)$/;" v +optimizer .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005)$/;" v +optimizer .\configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer .\configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer .\configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^optimizer = dict($/;" v +optimizer .\configs\fastscnn\fast_scnn_4x8_80k_lr0.12_cityscapes.py /^optimizer = dict(type='SGD', lr=0.12, momentum=0.9, weight_decay=4e-5)$/;" v +optimizer .\configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer .\configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^optimizer = dict(lr=0.002, weight_decay=0.0,$/;" v +optimizer .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^optimizer = dict(lr=0.002, weight_decay=0.0,$/;" v +optimizer .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^optimizer = dict(lr=0.002, weight_decay=0.0,$/;" v +optimizer .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^optimizer = dict(lr=0.002, weight_decay=0.0,$/;" v +optimizer .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^optimizer = dict(lr=0.01, weight_decay=0.0, paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)}))$/;" v +optimizer .\configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer .\configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer .\configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py /^optimizer = dict(lr=0.02)$/;" v +optimizer .\configs\ocrnet\ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py /^optimizer = dict(lr=0.02)$/;" v +optimizer .\configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer .\configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +optimizer_config .\configs\_base_\schedules\schedule_160k.py /^optimizer_config = dict()$/;" v +optimizer_config .\configs\_base_\schedules\schedule_20k.py /^optimizer_config = dict()$/;" v +optimizer_config .\configs\_base_\schedules\schedule_40k.py /^optimizer_config = dict()$/;" v +optimizer_config .\configs\_base_\schedules\schedule_80k.py /^optimizer_config = dict()$/;" v +optimizer_config .\configs\_base_\schedules\schedule_80k_step.py /^optimizer_config = dict()$/;" v +optimizer_config .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^optimizer_config = dict()$/;" v +optimizer_config .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^optimizer_config = dict()$/;" v +optimizer_config .\configs\foodnet\fpn_r50_512x1024_80k.py /^optimizer_config = dict()$/;" v +optimizer_config .\configs\foodnet\fpn_r50_512x1024_80k_RM.py /^optimizer_config = dict()$/;" v +optimizer_config .\configs\fp16\deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py /^optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.)$/;" v +optimizer_config .\configs\fp16\deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py /^optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.)$/;" v +optimizer_config .\configs\fp16\fcn_r101-d8_512x1024_80k_fp16_cityscapes.py /^optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.)$/;" v +optimizer_config .\configs\fp16\pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py /^optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.)$/;" v +os .\.dev\gather_models.py /^import os$/;" i +os .\.dev\gather_models.py /^import os.path as osp$/;" i +os .\.dev\upload_modelzoo.py /^import os$/;" i +os .\.dev\upload_modelzoo.py /^import os.path as osp$/;" i +os .\docs\conf.py /^import os$/;" i +os .\docs\stat.py /^import os.path as osp$/;" i +os .\mmseg\apis\test.py /^import os.path as osp$/;" i +os .\mmseg\core\evaluation\eval_hooks.py /^import os.path as osp$/;" i +os .\mmseg\datasets\chase_db1.py /^import os.path as osp$/;" i +os .\mmseg\datasets\cityscapes.py /^import os.path as osp$/;" i +os .\mmseg\datasets\custom.py /^import os$/;" i +os .\mmseg\datasets\custom.py /^import os.path as osp$/;" i +os .\mmseg\datasets\drive.py /^import os.path as osp$/;" i +os .\mmseg\datasets\hrf.py /^import os.path as osp$/;" i +os .\mmseg\datasets\pascal_context.py /^import os.path as osp$/;" i +os .\mmseg\datasets\pipelines\loading.py /^import os.path as osp$/;" i +os .\mmseg\datasets\stare.py /^import os.path as osp$/;" i +os .\mmseg\datasets\voc.py /^import os.path as osp$/;" i +os .\mmseg\models\backbones\helpers.py /^import os$/;" i +os .\tests\test_config.py /^import os$/;" i +os .\tests\test_data\test_dataset.py /^import os.path as osp$/;" i +os .\tests\test_data\test_dataset_builder.py /^import os.path as osp$/;" i +os .\tests\test_data\test_loading.py /^import os.path as osp$/;" i +os .\tests\test_data\test_transform.py /^import os.path as osp$/;" i +os .\tests\test_data\test_tta.py /^import os.path as osp$/;" i +os .\tests\test_inference.py /^import os.path as osp$/;" i +os .\tools\convert_datasets\chase_db1.py /^import os$/;" i +os .\tools\convert_datasets\chase_db1.py /^import os.path as osp$/;" i +os .\tools\convert_datasets\cityscapes.py /^import os.path as osp$/;" i +os .\tools\convert_datasets\drive.py /^import os$/;" i +os .\tools\convert_datasets\drive.py /^import os.path as osp$/;" i +os .\tools\convert_datasets\hrf.py /^import os$/;" i +os .\tools\convert_datasets\hrf.py /^import os.path as osp$/;" i +os .\tools\convert_datasets\pascal_context.py /^import os.path as osp$/;" i +os .\tools\convert_datasets\stare.py /^import os$/;" i +os .\tools\convert_datasets\stare.py /^import os.path as osp$/;" i +os .\tools\convert_datasets\voc_aug.py /^import os.path as osp$/;" i +os .\tools\test.py /^import os$/;" i +os .\tools\train.py /^import os$/;" i +os .\tools\train.py /^import os.path as osp$/;" i +osp .\.dev\gather_models.py /^import os.path as osp$/;" i +osp .\.dev\upload_modelzoo.py /^import os.path as osp$/;" i +osp .\docs\stat.py /^import os.path as osp$/;" i +osp .\mmseg\apis\test.py /^import os.path as osp$/;" i +osp .\mmseg\core\evaluation\eval_hooks.py /^import os.path as osp$/;" i +osp .\mmseg\datasets\chase_db1.py /^import os.path as osp$/;" i +osp .\mmseg\datasets\cityscapes.py /^import os.path as osp$/;" i +osp .\mmseg\datasets\custom.py /^import os.path as osp$/;" i +osp .\mmseg\datasets\drive.py /^import os.path as osp$/;" i +osp .\mmseg\datasets\hrf.py /^import os.path as osp$/;" i +osp .\mmseg\datasets\pascal_context.py /^import os.path as osp$/;" i +osp .\mmseg\datasets\pipelines\loading.py /^import os.path as osp$/;" i +osp .\mmseg\datasets\stare.py /^import os.path as osp$/;" i +osp .\mmseg\datasets\voc.py /^import os.path as osp$/;" i +osp .\tests\test_data\test_dataset.py /^import os.path as osp$/;" i +osp .\tests\test_data\test_dataset_builder.py /^import os.path as osp$/;" i +osp .\tests\test_data\test_loading.py /^import os.path as osp$/;" i +osp .\tests\test_data\test_transform.py /^import os.path as osp$/;" i +osp .\tests\test_data\test_tta.py /^import os.path as osp$/;" i +osp .\tests\test_inference.py /^import os.path as osp$/;" i +osp .\tools\convert_datasets\chase_db1.py /^import os.path as osp$/;" i +osp .\tools\convert_datasets\cityscapes.py /^import os.path as osp$/;" i +osp .\tools\convert_datasets\drive.py /^import os.path as osp$/;" i +osp .\tools\convert_datasets\hrf.py /^import os.path as osp$/;" i +osp .\tools\convert_datasets\pascal_context.py /^import os.path as osp$/;" i +osp .\tools\convert_datasets\stare.py /^import os.path as osp$/;" i +osp .\tools\convert_datasets\voc_aug.py /^import os.path as osp$/;" i +osp .\tools\train.py /^import os.path as osp$/;" i +oss2 .\.dev\upload_modelzoo.py /^import oss2$/;" i +out_channels .\configs\_base_\models\fpn_r50.py /^ out_channels=256,$/;" v +out_channels .\configs\_base_\models\pointrend_r50.py /^ out_channels=256,$/;" v +out_indices .\configs\_base_\models\ann_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\apcnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\ccnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\danet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\deeplabv3_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\dmnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\dnl_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\emanet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\encnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\fast_scnn.py /^ out_indices=(0, 1, 2),$/;" v +out_indices .\configs\_base_\models\fcn_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\fpn_r50.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\gcnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\lraspp_m-v3-d8.py /^ out_indices=(1, 3, 16),$/;" v +out_indices .\configs\_base_\models\nonlocal_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\ocrnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\pointrend_r50.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\psanet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\pspnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\_base_\models\upernet_r50.py /^ out_indices=(0, 1, 2, 3),$/;" v +out_indices .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ out_indices=(1, 2, 4, 6)),$/;" v +out_indices .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ out_indices=(1, 2, 4, 6)),$/;" v +out_indices .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ out_indices=(1, 2, 4, 6)),$/;" v +out_indices .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ out_indices=(1, 2, 4, 6)),$/;" v +out_indices .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ out_indices=(1, 2, 4, 6)),$/;" v +out_indices .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ out_indices=(1, 2, 4, 6)),$/;" v +out_indices .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ out_indices=(1, 2, 4, 6)),$/;" v +out_indices .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ out_indices=(1, 2, 4, 6)),$/;" v +out_indices .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ out_indices=(0, 1, 12),$/;" v +out_indices .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ out_indices=(0, 1, 12),$/;" v +output_file .\tools\pytorch2onnx.py /^ output_file=args.output_file,$/;" v +pam_channels .\configs\_base_\models\danet_r50-d8.py /^ pam_channels=64,$/;" v +pam_cls_seg .\mmseg\models\decode_heads\da_head.py /^ def pam_cls_seg(self, feat):$/;" m class:DAHead +paper .\docs\stat.py /^ paper = set([(papertype, title)])$/;" v +papertype .\docs\stat.py /^ papertype = _papertype[0]$/;" v +paramwise_cfg .\configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ paramwise_cfg=dict($/;" v +paramwise_cfg .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)})$/;" v +paramwise_cfg .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)})$/;" v +paramwise_cfg .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)})$/;" v +paramwise_cfg .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)})$/;" v +parse .\mmseg\models\backbones\layers\helpers.py /^ def parse(x):$/;" f function:_ntuple +parse .\mmseg\models\decode_heads\layers\helpers.py /^ def parse(x):$/;" f function:_ntuple +parse_args .\.dev\gather_models.py /^def parse_args():$/;" f +parse_args .\.dev\upload_modelzoo.py /^def parse_args():$/;" f +parse_args .\tools\benchmark.py /^def parse_args():$/;" f +parse_args .\tools\convert_datasets\chase_db1.py /^def parse_args():$/;" f +parse_args .\tools\convert_datasets\cityscapes.py /^def parse_args():$/;" f +parse_args .\tools\convert_datasets\drive.py /^def parse_args():$/;" f +parse_args .\tools\convert_datasets\hrf.py /^def parse_args():$/;" f +parse_args .\tools\convert_datasets\pascal_context.py /^def parse_args():$/;" f +parse_args .\tools\convert_datasets\stare.py /^def parse_args():$/;" f +parse_args .\tools\convert_datasets\voc_aug.py /^def parse_args():$/;" f +parse_args .\tools\get_flops.py /^def parse_args():$/;" f +parse_args .\tools\print_config.py /^def parse_args():$/;" f +parse_args .\tools\publish_model.py /^def parse_args():$/;" f +parse_args .\tools\pytorch2onnx.py /^def parse_args():$/;" f +parse_args .\tools\test.py /^def parse_args():$/;" f +parse_args .\tools\train.py /^def parse_args():$/;" f +parse_line .\setup.py /^ def parse_line(line):$/;" f function:parse_requirements +parse_require_file .\setup.py /^ def parse_require_file(fpath):$/;" f function:parse_requirements +parse_requirements .\setup.py /^def parse_requirements(fname='requirements.txt', with_version=True):$/;" f +parse_version_info .\mmseg\version.py /^def parse_version_info(version_str):$/;" f +partial .\mmseg\datasets\builder.py /^from functools import partial$/;" i +partial .\mmseg\models\backbones\pvt.py /^from functools import partial$/;" i +partial .\mmseg\models\backbones\pvt_dia.py /^from functools import partial$/;" i +partial .\mmseg\models\backbones\vit.py /^from functools import partial$/;" i +partial .\mmseg\models\backbones\vit_mla.py /^from functools import partial$/;" i +partial .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^from functools import partial$/;" i +partial .\mmseg\models\decode_heads\vit_mla_head.py /^from functools import partial$/;" i +partial .\mmseg\models\decode_heads\vit_up_head.py /^from functools import partial$/;" i +partial .\tools\convert_datasets\pascal_context.py /^from functools import partial$/;" i +partial .\tools\convert_datasets\voc_aug.py /^from functools import partial$/;" i +partial .\tools\pytorch2onnx.py /^from functools import partial$/;" i +patch .\tests\test_data\test_dataset.py /^from unittest.mock import MagicMock, patch$/;" i +patch .\tests\test_eval_hook.py /^from unittest.mock import MagicMock, patch$/;" i +patch .\tests\test_models\test_forward.py /^from unittest.mock import patch$/;" i +patch .\tests\test_models\test_heads.py /^from unittest.mock import patch$/;" i +patch_size .\configs\_base_\models\setr_mla.py /^ patch_size=16, $/;" v +patch_size .\configs\_base_\models\setr_naive_pup.py /^ patch_size=16,$/;" v +patch_size .\configs\foodnet\ccnet_vit_768x768_80k.py /^ patch_size=16, $/;" v +pickle .\mmseg\apis\test.py /^import pickle$/;" i +pipeline .\configs\_base_\datasets\FoodSeg103.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\_base_\datasets\FoodSeg103.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\_base_\datasets\FoodSeg103.py /^ pipeline=train_pipeline),$/;" v +pipeline .\configs\_base_\datasets\ade20k.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\_base_\datasets\ade20k.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\_base_\datasets\ade20k.py /^ pipeline=train_pipeline),$/;" v +pipeline .\configs\_base_\datasets\chase_db1.py /^ pipeline=train_pipeline)),$/;" v +pipeline .\configs\_base_\datasets\chase_db1.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\_base_\datasets\chase_db1.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\_base_\datasets\cityscapes.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\_base_\datasets\cityscapes.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\_base_\datasets\cityscapes.py /^ pipeline=train_pipeline),$/;" v +pipeline .\configs\_base_\datasets\drive.py /^ pipeline=train_pipeline)),$/;" v +pipeline .\configs\_base_\datasets\drive.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\_base_\datasets\drive.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\_base_\datasets\hrf.py /^ pipeline=train_pipeline)),$/;" v +pipeline .\configs\_base_\datasets\hrf.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\_base_\datasets\hrf.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\_base_\datasets\pascal_context.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\_base_\datasets\pascal_context.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\_base_\datasets\pascal_context.py /^ pipeline=train_pipeline),$/;" v +pipeline .\configs\_base_\datasets\pascal_voc12.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\_base_\datasets\pascal_voc12.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\_base_\datasets\pascal_voc12.py /^ pipeline=train_pipeline),$/;" v +pipeline .\configs\_base_\datasets\stare.py /^ pipeline=train_pipeline)),$/;" v +pipeline .\configs\_base_\datasets\stare.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\_base_\datasets\stare.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ pipeline=test_pipeline))$/;" v +pipeline .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ pipeline=test_pipeline),$/;" v +pipeline .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ pipeline=train_pipeline),$/;" v +platform .\mmseg\datasets\builder.py /^import platform$/;" i +plt .\mmseg\apis\inference.py /^import matplotlib.pyplot as plt$/;" i +point_sample .\mmseg\models\decode_heads\point_head.py /^from mmcv.ops import point_sample$/;" i +policy .\configs\_base_\schedules\schedule_80k_step.py /^ policy='step',$/;" v +pool_scales .\configs\_base_\models\apcnet_r50-d8.py /^ pool_scales=(1, 2, 3, 6),$/;" v +pool_scales .\configs\_base_\models\pspnet_r50-d8.py /^ pool_scales=(1, 2, 3, 6),$/;" v +pool_scales .\configs\_base_\models\pspnet_unet_s5-d16.py /^ pool_scales=(1, 2, 3, 6),$/;" v +pool_scales .\configs\_base_\models\upernet_r50.py /^ pool_scales=(1, 2, 3, 6),$/;" v +pooling_type .\configs\_base_\models\gcnet_r50-d8.py /^ pooling_type='att',$/;" v +pos_embed_interp .\configs\_base_\models\setr_mla.py /^ pos_embed_interp=True,$/;" v +pos_embed_interp .\configs\_base_\models\setr_naive_pup.py /^ pos_embed_interp=True,$/;" v +pos_embed_interp .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ pos_embed_interp=True, $/;" v +pos_embed_interp .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ pos_embed_interp=True, $/;" v +pos_embed_interp .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ pos_embed_interp=True, $/;" v +pos_embed_interp .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ pos_embed_interp=True, $/;" v +pos_embed_interp .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ pos_embed_interp=True, $/;" v +pos_embed_interp .\configs\foodnet\ccnet_vit_768x768_80k.py /^ pos_embed_interp=True,$/;" v +pre_pipeline .\mmseg\datasets\custom.py /^ def pre_pipeline(self, results):$/;" m class:CustomDataset +prepare_test_img .\mmseg\datasets\custom.py /^ def prepare_test_img(self, idx):$/;" m class:CustomDataset +prepare_train_img .\mmseg\datasets\custom.py /^ def prepare_train_img(self, idx):$/;" m class:CustomDataset +pretrained .\configs\_base_\models\ann_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\apcnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\ccnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\danet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\deeplabv3_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ pretrained=None,$/;" v +pretrained .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\dmnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\dnl_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\emanet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\encnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\fcn_hr18.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18',$/;" v +pretrained .\configs\_base_\models\fcn_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\fcn_unet_s5-d16.py /^ pretrained=None,$/;" v +pretrained .\configs\_base_\models\fpn_r50.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\gcnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\nonlocal_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\ocrnet_hr18.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18',$/;" v +pretrained .\configs\_base_\models\ocrnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\pointrend_r50.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\psanet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\pspnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\_base_\models\pspnet_unet_s5-d16.py /^ pretrained=None,$/;" v +pretrained .\configs\_base_\models\upernet_r50.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +pretrained .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet101_v1c',$/;" v +pretrained .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet101_v1c',$/;" v +pretrained .\configs\deeplabv3\deeplabv3_r101b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +pretrained .\configs\deeplabv3\deeplabv3_r101b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +pretrained .\configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +pretrained .\configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +pretrained .\configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +pretrained .\configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +pretrained .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet101_v1c',$/;" v +pretrained .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet101_v1c',$/;" v +pretrained .\configs\deeplabv3plus\deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +pretrained .\configs\deeplabv3plus\deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +pretrained .\configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +pretrained .\configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +pretrained .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +pretrained .\configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +pretrained .\configs\fcn\fcn_r101b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +pretrained .\configs\fcn\fcn_r101b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +pretrained .\configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +pretrained .\configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +pretrained .\configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +pretrained .\configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +pretrained .\configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +pretrained .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +pretrained .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +pretrained .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +pretrained .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +pretrained .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +pretrained .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +pretrained .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +pretrained .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ pretrained='open-mmlab:\/\/contrib\/mobilenet_v3_small',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +pretrained .\configs\pspnet\pspnet_r101b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +pretrained .\configs\pspnet\pspnet_r101b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +pretrained .\configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +pretrained .\configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +pretrained .\configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +pretrained .\configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +pretrained .\configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +pretrained .\configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +pretrained .\configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +pretrained .\configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +pretrained .\configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +pretrained .\configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +pretrained .\configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +pretrained .\configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +print_log .\mmseg\datasets\cityscapes.py /^from mmcv.utils import print_log$/;" i +print_log .\mmseg\datasets\custom.py /^from mmcv.utils import print_log$/;" i +process_checkpoint .\.dev\gather_models.py /^def process_checkpoint(in_file, out_file):$/;" f +process_checkpoint .\tools\publish_model.py /^def process_checkpoint(in_file, out_file):$/;" f +project .\docs\conf.py /^project = 'MMSegmentation'$/;" v +project_channels .\configs\_base_\models\ann_r50-d8.py /^ project_channels=256,$/;" v +psa_softmax .\configs\_base_\models\psanet_r50-d8.py /^ psa_softmax=True,$/;" v +psa_type .\configs\_base_\models\psanet_r50-d8.py /^ psa_type='bi-direction',$/;" v +psp_forward .\mmseg\models\decode_heads\uper_head.py /^ def psp_forward(self, inputs):$/;" m class:UPerHead +pthfile .\tests\test_model.py /^pthfile = r'\/SEG\/mmsegmentation\/pretrained_model\/recipe1MP_R50.pth'$/;" v +pvt_large .\mmseg\models\backbones\pvt.py /^class pvt_large(PyramidVisionTransformer):$/;" c +pvt_small .\mmseg\models\backbones\__init__.py /^from .pvt import pvt_small, pvt_small_f4, pvt_tiny$/;" i +pvt_small .\mmseg\models\backbones\pvt.py /^class pvt_small(PyramidVisionTransformer):$/;" c +pvt_small_dia .\mmseg\models\backbones\__init__.py /^from .pvt_dia import pvt_small_dia$/;" i +pvt_small_dia .\mmseg\models\backbones\pvt_dia.py /^class pvt_small_dia(PyramidVisionTransformer):$/;" c +pvt_small_f4 .\mmseg\models\backbones\__init__.py /^from .pvt import pvt_small, pvt_small_f4, pvt_tiny$/;" i +pvt_small_f4 .\mmseg\models\backbones\pvt.py /^class pvt_small_f4(PyramidVisionTransformer):$/;" c +pvt_tiny .\mmseg\models\backbones\__init__.py /^from .pvt import pvt_small, pvt_small_f4, pvt_tiny$/;" i +pvt_tiny .\mmseg\models\backbones\pvt.py /^class pvt_tiny(PyramidVisionTransformer):$/;" c +pvt_tiny_dia .\mmseg\models\backbones\pvt_dia.py /^class pvt_tiny_dia(PyramidVisionTransformer):$/;" c +pytest .\tests\test_data\test_dataset.py /^import pytest$/;" i +pytest .\tests\test_data\test_dataset_builder.py /^import pytest$/;" i +pytest .\tests\test_data\test_transform.py /^import pytest$/;" i +pytest .\tests\test_data\test_tta.py /^import pytest$/;" i +pytest .\tests\test_eval_hook.py /^import pytest$/;" i +pytest .\tests\test_models\test_backbone.py /^import pytest$/;" i +pytest .\tests\test_models\test_forward.py /^import pytest$/;" i +pytest .\tests\test_models\test_heads.py /^import pytest$/;" i +pytest .\tests\test_models\test_losses.py /^import pytest$/;" i +pytest .\tests\test_models\test_unet.py /^import pytest$/;" i +pytest .\tests\test_sampler.py /^import pytest$/;" i +pytest .\tests\test_utils\test_inverted_residual_module.py /^import pytest$/;" i +pytest .\tests\test_utils\test_se_layer.py /^import pytest$/;" i +pytorch2onnx .\tools\pytorch2onnx.py /^def pytorch2onnx(model,$/;" f +query_scales .\configs\_base_\models\ann_r50-d8.py /^ query_scales=(1, ),$/;" v +radix .\configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ radix=2,$/;" v +radix .\configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ radix=2,$/;" v +radix .\configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ radix=2,$/;" v +radix .\configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ radix=2,$/;" v +radix .\configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ radix=2,$/;" v +radix .\configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ radix=2,$/;" v +radix .\configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ radix=2,$/;" v +radix .\configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ radix=2,$/;" v +random .\mmseg\apis\train.py /^import random$/;" i +random .\mmseg\datasets\builder.py /^import random$/;" i +random .\mmseg\datasets\pipelines\transforms.py /^from numpy import random$/;" i +random_sample .\mmseg\datasets\pipelines\transforms.py /^ def random_sample(img_scales):$/;" m class:Resize +random_sample_ratio .\mmseg\datasets\pipelines\transforms.py /^ def random_sample_ratio(img_scale, ratio_range):$/;" m class:Resize +random_select .\mmseg\datasets\pipelines\transforms.py /^ def random_select(img_scales):$/;" m class:Resize +ratio .\configs\_base_\models\gcnet_r50-d8.py /^ ratio=1 \/ 4.,$/;" v +re .\docs\stat.py /^import re$/;" i +re .\mmseg\models\backbones\helpers.py /^import re$/;" i +re .\setup.py /^ import re$/;" i +readme .\setup.py /^def readme():$/;" f +recurrence .\configs\_base_\models\ccnet_r50-d8.py /^ recurrence=2,$/;" v +reduce .\mmseg\datasets\custom.py /^from functools import reduce$/;" i +reduce_loss .\mmseg\models\losses\__init__.py /^from .utils import reduce_loss, weight_reduce_loss, weighted_loss$/;" i +reduce_loss .\mmseg\models\losses\utils.py /^def reduce_loss(loss, reduction):$/;" f +reduce_loss .\tests\test_models\test_losses.py /^from mmseg.models.losses import Accuracy, reduce_loss, weight_reduce_loss$/;" i +reduce_mean .\mmseg\models\decode_heads\ema_head.py /^def reduce_mean(tensor):$/;" f +reduction .\configs\_base_\models\dnl_r50-d8.py /^ reduction=2,$/;" v +reduction .\configs\_base_\models\nonlocal_r50-d8.py /^ reduction=2,$/;" v +reduction_factor .\configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ reduction_factor=4,$/;" v +reduction_factor .\configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ reduction_factor=4,$/;" v +reduction_factor .\configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ reduction_factor=4,$/;" v +reduction_factor .\configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ reduction_factor=4,$/;" v +reduction_factor .\configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ reduction_factor=4,$/;" v +reduction_factor .\configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ reduction_factor=4,$/;" v +reduction_factor .\configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ reduction_factor=4,$/;" v +reduction_factor .\configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ reduction_factor=4,$/;" v +reductions .\configs\_base_\models\cgnet.py /^ reductions=(8, 16)),$/;" v +register_extra_symbolics .\tools\pytorch2onnx.py /^from mmcv.onnx import register_extra_symbolics$/;" i +register_model .\mmseg\models\backbones\pvt.py /^from timm.models.registry import register_model$/;" i +register_model .\mmseg\models\backbones\pvt_dia.py /^from timm.models.registry import register_model$/;" i +release .\docs\conf.py /^release = get_version()$/;" v +relpath .\tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +repeat .\mmseg\models\backbones\layers\helpers.py /^from itertools import repeat$/;" i +repeat .\mmseg\models\decode_heads\layers\helpers.py /^from itertools import repeat$/;" i +reset_drop_path .\mmseg\models\backbones\pvt.py /^ def reset_drop_path(self, drop_path_rate):$/;" m class:PyramidVisionTransformer +reset_drop_path .\mmseg\models\backbones\pvt_dia.py /^ def reset_drop_path(self, drop_path_rate):$/;" m class:PyramidVisionTransformer +resize .\mmseg\models\backbones\fast_scnn.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\backbones\hrnet.py /^from mmseg.ops import Upsample, resize$/;" i +resize .\mmseg\models\decode_heads\apc_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\aspp_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\decode_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\enc_head.py /^from mmseg.ops import Encoding, resize$/;" i +resize .\mmseg\models\decode_heads\fpn_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\lraspp_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\ocr_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\point_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\psa_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\psp_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\sep_aspp_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\decode_heads\uper_head.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\segmentors\cascade_encoder_decoder.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\models\segmentors\encoder_decoder.py /^from mmseg.ops import resize$/;" i +resize .\mmseg\ops\__init__.py /^from .wrappers import Upsample, resize$/;" i +resize .\mmseg\ops\wrappers.py /^def resize(input,$/;" f +resource .\mmseg\datasets\builder.py /^ import resource$/;" i +results2img .\mmseg\datasets\cityscapes.py /^ def results2img(self, results, imgfile_prefix, to_label_id):$/;" m class:CityscapesDataset +resume_from .\configs\_base_\default_runtime.py /^resume_from = None$/;" v +return_counts .\docs\stat.py /^ return_counts=True)$/;" v +rlimit .\mmseg\datasets\builder.py /^ rlimit = resource.getrlimit(resource.RLIMIT_NOFILE)$/;" v +rt .\tools\pytorch2onnx.py /^import onnxruntime as rt$/;" i +runner .\configs\_base_\schedules\schedule_160k.py /^runner = dict(type='IterBasedRunner', max_iters=160000)$/;" v +runner .\configs\_base_\schedules\schedule_20k.py /^runner = dict(type='IterBasedRunner', max_iters=20000)$/;" v +runner .\configs\_base_\schedules\schedule_40k.py /^runner = dict(type='IterBasedRunner', max_iters=40000)$/;" v +runner .\configs\_base_\schedules\schedule_80k.py /^runner = dict(type='IterBasedRunner', max_iters=80000)$/;" v +runner .\configs\_base_\schedules\schedule_80k_step.py /^runner = dict(type='IterBasedRunner', max_iters=80000)$/;" v +runner .\configs\foodnet\fpn_r50_512x1024_80k.py /^runner = dict(type='IterBasedRunner', max_iters=80000)$/;" v +runner .\configs\foodnet\fpn_r50_512x1024_80k_RM.py /^runner = dict(type='IterBasedRunner', max_iters=80000)$/;" v +runner .\configs\mobilenet_v3\lraspp_m-v3-d8_512x1024_320k_cityscapes.py /^runner = dict(type='IterBasedRunner', max_iters=320000)$/;" v +runner .\configs\mobilenet_v3\lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py /^runner = dict(type='IterBasedRunner', max_iters=320000)$/;" v +runner .\tests\test_eval_hook.py /^import mmcv.runner$/;" i +sample .\mmseg\core\seg\sampler\base_pixel_sampler.py /^ def sample(self, seg_logit, seg_label):$/;" m class:BasePixelSampler +sample .\mmseg\core\seg\sampler\ohem_pixel_sampler.py /^ def sample(self, seg_logit, seg_label):$/;" m class:OHEMPixelSampler +sampler .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ sampler=dict(type='OHEMPixelSampler', min_kept=100000)))$/;" v +sampler .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ sampler=dict(type='OHEMPixelSampler', min_kept=100000)))$/;" v +sampler .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ sampler=dict(type='OHEMPixelSampler', min_kept=100000)))$/;" v +sampler .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ sampler=dict(type='OHEMPixelSampler', min_kept=100000)))$/;" v +samples_per_gpu .\configs\_base_\datasets\FoodSeg103.py /^ samples_per_gpu=2,$/;" v +samples_per_gpu .\configs\_base_\datasets\ade20k.py /^ samples_per_gpu=4,$/;" v +samples_per_gpu .\configs\_base_\datasets\chase_db1.py /^ samples_per_gpu=4,$/;" v +samples_per_gpu .\configs\_base_\datasets\cityscapes.py /^ samples_per_gpu=2,$/;" v +samples_per_gpu .\configs\_base_\datasets\drive.py /^ samples_per_gpu=4,$/;" v +samples_per_gpu .\configs\_base_\datasets\hrf.py /^ samples_per_gpu=4,$/;" v +samples_per_gpu .\configs\_base_\datasets\pascal_context.py /^ samples_per_gpu=4,$/;" v +samples_per_gpu .\configs\_base_\datasets\pascal_voc12.py /^ samples_per_gpu=4,$/;" v +samples_per_gpu .\configs\_base_\datasets\stare.py /^ samples_per_gpu=4,$/;" v +samples_per_gpu .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ samples_per_gpu=8,$/;" v +samples_per_gpu .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ samples_per_gpu=8,$/;" v +saturation .\mmseg\datasets\pipelines\transforms.py /^ def saturation(self, img):$/;" m class:PhotoMetricDistortion +scale_factor .\configs\_base_\models\pointrend_r50.py /^ scale_factor=2))$/;" v +scaled_l2 .\mmseg\ops\encoding.py /^ def scaled_l2(x, codewords, scale):$/;" m class:Encoding +scatter .\mmseg\apis\inference.py /^from mmcv.parallel import collate, scatter$/;" i +segmentor .\tools\pytorch2onnx.py /^ segmentor = _convert_batchnorm(segmentor)$/;" v +segmentor .\tools\pytorch2onnx.py /^ segmentor = build_segmentor($/;" v +serialization .\tools\pytorch2onnx.py /^import torch.serialization$/;" i +set_random_seed .\mmseg\apis\__init__.py /^from .train import get_root_logger, set_random_seed, train_segmentor$/;" i +set_random_seed .\mmseg\apis\train.py /^def set_random_seed(seed, deterministic=False):$/;" f +set_random_seed .\tools\train.py /^from mmseg.apis import set_random_seed, train_segmentor$/;" i +setup .\docs\conf.py /^def setup(app):$/;" f +setup .\setup.py /^from setuptools import find_packages, setup$/;" i +setup_class .\tests\test_data\test_loading.py /^ def setup_class(cls):$/;" m class:TestLoading +show .\tools\pytorch2onnx.py /^ show=args.show,$/;" v +show_result .\mmseg\models\segmentors\base.py /^ def show_result(self,$/;" m class:BaseSegmentor +show_result_pyplot .\demo\image_demo.py /^from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +show_result_pyplot .\mmseg\apis\__init__.py /^from .inference import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +show_result_pyplot .\mmseg\apis\inference.py /^def show_result_pyplot(model, img, result, palette=None, fig_size=(15, 10)):$/;" f +shrink_factor .\configs\_base_\models\psanet_r50-d8.py /^ shrink_factor=2,$/;" v +shutil .\.dev\gather_models.py /^import shutil$/;" i +shutil .\mmseg\apis\test.py /^import shutil$/;" i +simple_test .\mmseg\models\segmentors\base.py /^ def simple_test(self, img, img_meta, **kwargs):$/;" m class:BaseSegmentor +simple_test .\mmseg\models\segmentors\encoder_decoder.py /^ def simple_test(self, img, img_meta, rescale=True):$/;" m class:EncoderDecoder +single_gpu_test .\mmseg\apis\__init__.py /^from .test import multi_gpu_test, single_gpu_test$/;" i +single_gpu_test .\mmseg\apis\test.py /^def single_gpu_test(model,$/;" f +single_gpu_test .\mmseg\core\evaluation\eval_hooks.py /^ from mmseg.apis import single_gpu_test$/;" i +single_gpu_test .\tests\test_eval_hook.py /^from mmseg.apis import single_gpu_test$/;" i +single_gpu_test .\tools\test.py /^from mmseg.apis import multi_gpu_test, single_gpu_test$/;" i +slide_inference .\mmseg\models\segmentors\encoder_decoder.py /^ def slide_inference(self, img, img_meta, rescale):$/;" m class:EncoderDecoder +soft_limit .\mmseg\datasets\builder.py /^ soft_limit = min(4096, hard_limit)$/;" v +source_suffix .\docs\conf.py /^source_suffix = {$/;" v +split .\configs\_base_\datasets\pascal_context.py /^ split='ImageSets\/SegmentationContext\/train.txt',$/;" v +split .\configs\_base_\datasets\pascal_context.py /^ split='ImageSets\/SegmentationContext\/val.txt',$/;" v +split .\configs\_base_\datasets\pascal_voc12.py /^ split='ImageSets\/Segmentation\/train.txt',$/;" v +split .\configs\_base_\datasets\pascal_voc12.py /^ split='ImageSets\/Segmentation\/val.txt',$/;" v +split .\configs\_base_\datasets\pascal_voc12_aug.py /^ split=[$/;" v +stage1 .\configs\_base_\models\fcn_hr18.py /^ stage1=dict($/;" v +stage1 .\configs\_base_\models\ocrnet_hr18.py /^ stage1=dict($/;" v +stage1 .\configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage1 .\configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 .\configs\_base_\models\fcn_hr18.py /^ stage2=dict($/;" v +stage2 .\configs\_base_\models\ocrnet_hr18.py /^ stage2=dict($/;" v +stage2 .\configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage2 .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 .\configs\_base_\models\fcn_hr18.py /^ stage3=dict($/;" v +stage3 .\configs\_base_\models\ocrnet_hr18.py /^ stage3=dict($/;" v +stage3 .\configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage3 .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 .\configs\_base_\models\fcn_hr18.py /^ stage4=dict($/;" v +stage4 .\configs\_base_\models\ocrnet_hr18.py /^ stage4=dict($/;" v +stage4 .\configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +stage4 .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stage4 .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +stats .\docs\stat.py /^stats = []$/;" v +stem_channels .\configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ stem_channels=128,$/;" v +stem_channels .\configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ stem_channels=128,$/;" v +stem_channels .\configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ stem_channels=128,$/;" v +stem_channels .\configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ stem_channels=128,$/;" v +stem_channels .\configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ stem_channels=128,$/;" v +stem_channels .\configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ stem_channels=128,$/;" v +stem_channels .\configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ stem_channels=128,$/;" v +stem_channels .\configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ stem_channels=128,$/;" v +step .\configs\_base_\schedules\schedule_80k_step.py /^ step=[40000, 60000], $/;" v +step .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ step=[40000, 60000],$/;" v +strides .\configs\_base_\models\ann_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\apcnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\ccnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\danet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\deeplabv3_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ strides=(1, 1, 1, 1, 1),$/;" v +strides .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\dmnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\dnl_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\emanet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\encnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\fcn_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\fcn_unet_s5-d16.py /^ strides=(1, 1, 1, 1, 1),$/;" v +strides .\configs\_base_\models\fpn_r50.py /^ strides=(1, 2, 2, 2),$/;" v +strides .\configs\_base_\models\gcnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\nonlocal_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\ocrnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\pointrend_r50.py /^ strides=(1, 2, 2, 2),$/;" v +strides .\configs\_base_\models\psanet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\pspnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +strides .\configs\_base_\models\pspnet_unet_s5-d16.py /^ strides=(1, 1, 1, 1, 1),$/;" v +strides .\configs\_base_\models\upernet_r50.py /^ strides=(1, 2, 2, 2),$/;" v +strides .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ strides=(1, 2, 2, 1),$/;" v +strides .\configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1),$/;" v +strides .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ strides=(1, 2, 2, 1),$/;" v +strides .\configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1),$/;" v +strides .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +strides .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +strides .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +strides .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +strides .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +strides .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +strides .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +strides .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +style .\configs\_base_\models\ann_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\apcnet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\ccnet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\danet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\deeplabv3_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\dmnet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\dnl_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\emanet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\encnet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\fcn_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\fpn_r50.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\gcnet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\nonlocal_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\ocrnet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\pointrend_r50.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\psanet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\pspnet_r50-d8.py /^ style='pytorch',$/;" v +style .\configs\_base_\models\upernet_r50.py /^ style='pytorch',$/;" v +subdivision_num_points .\configs\_base_\models\pointrend_r50.py /^ subdivision_num_points=8196,$/;" v +subdivision_steps .\configs\_base_\models\pointrend_r50.py /^ subdivision_steps=2,$/;" v +subprocess .\.dev\gather_models.py /^import subprocess$/;" i +subprocess .\docs\conf.py /^import subprocess$/;" i +subprocess .\tools\publish_model.py /^import subprocess$/;" i +sys .\docs\conf.py /^import sys$/;" i +sys .\mmseg\models\backbones\helpers.py /^import sys$/;" i +sys .\setup.py /^ import sys$/;" i +tarfile .\tools\convert_datasets\stare.py /^import tarfile$/;" i +tempfile .\mmseg\apis\test.py /^import tempfile$/;" i +tempfile .\mmseg\datasets\cityscapes.py /^import tempfile$/;" i +tempfile .\tests\test_data\test_loading.py /^import tempfile$/;" i +tempfile .\tests\test_eval_hook.py /^import tempfile$/;" i +tempfile .\tools\convert_datasets\chase_db1.py /^import tempfile$/;" i +tempfile .\tools\convert_datasets\drive.py /^import tempfile$/;" i +tempfile .\tools\convert_datasets\hrf.py /^import tempfile$/;" i +tempfile .\tools\convert_datasets\stare.py /^import tempfile$/;" i +templates_path .\docs\conf.py /^templates_path = ['_templates']$/;" v +tensor2imgs .\mmseg\apis\test.py /^from mmcv.image import tensor2imgs$/;" i +test .\configs\_base_\datasets\FoodSeg103.py /^ test=dict($/;" v +test .\configs\_base_\datasets\Recipe1M_768x768.py /^ test=dict(pipeline=test_pipeline))$/;" v +test .\configs\_base_\datasets\ade20k.py /^ test=dict($/;" v +test .\configs\_base_\datasets\chase_db1.py /^ test=dict($/;" v +test .\configs\_base_\datasets\cityscapes.py /^ test=dict($/;" v +test .\configs\_base_\datasets\cityscapes_769x769.py /^ test=dict(pipeline=test_pipeline))$/;" v +test .\configs\_base_\datasets\drive.py /^ test=dict($/;" v +test .\configs\_base_\datasets\hrf.py /^ test=dict($/;" v +test .\configs\_base_\datasets\pascal_context.py /^ test=dict($/;" v +test .\configs\_base_\datasets\pascal_voc12.py /^ test=dict($/;" v +test .\configs\_base_\datasets\stare.py /^ test=dict($/;" v +test .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ test=dict($/;" v +test .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ test=dict(pipeline=test_pipeline))$/;" v +test_CLAHE .\tests\test_data\test_transform.py /^def test_CLAHE():$/;" f +test_accuracy .\tests\test_models\test_losses.py /^def test_accuracy():$/;" f +test_adjust_gamma .\tests\test_data\test_transform.py /^def test_adjust_gamma():$/;" f +test_ann_forward .\tests\test_models\test_forward.py /^def test_ann_forward():$/;" f +test_ann_head .\tests\test_models\test_heads.py /^def test_ann_head():$/;" f +test_apc_head .\tests\test_models\test_heads.py /^def test_apc_head():$/;" f +test_aspp_head .\tests\test_models\test_heads.py /^def test_aspp_head():$/;" f +test_build_dataloader .\tests\test_data\test_dataset_builder.py /^def test_build_dataloader():$/;" f +test_build_dataset .\tests\test_data\test_dataset_builder.py /^def test_build_dataset():$/;" f +test_cascade_encoder_decoder .\tests\test_models\test_segmentor.py /^def test_cascade_encoder_decoder():$/;" f +test_cc_head .\tests\test_models\test_heads.py /^def test_cc_head():$/;" f +test_ccnet_forward .\tests\test_models\test_forward.py /^def test_ccnet_forward():$/;" f +test_ce_loss .\tests\test_models\test_losses.py /^def test_ce_loss():$/;" f +test_cfg .\configs\_base_\models\ann_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\apcnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\ccnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\cgnet.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\danet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\deeplabv3_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ test_cfg=dict(mode='slide', crop_size=256, stride=170))$/;" v +test_cfg .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\dmnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\dnl_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\emanet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\encnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\fast_scnn.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\fcn_hr18.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\fcn_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\fcn_unet_s5-d16.py /^ test_cfg=dict(mode='slide', crop_size=256, stride=170))$/;" v +test_cfg .\configs\_base_\models\fpn_r50.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\gcnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\lraspp_m-v3-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\nonlocal_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\ocrnet_hr18.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\ocrnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\pointrend_r50.py /^ test_cfg=dict($/;" v +test_cfg .\configs\_base_\models\psanet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\pspnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\_base_\models\pspnet_unet_s5-d16.py /^ test_cfg=dict(mode='slide', crop_size=256, stride=170))$/;" v +test_cfg .\configs\_base_\models\setr_mla.py /^test_cfg = dict(mode='whole')$/;" v +test_cfg .\configs\_base_\models\setr_naive_pup.py /^test_cfg = dict(mode='whole')$/;" v +test_cfg .\configs\_base_\models\upernet_r50.py /^ test_cfg=dict(mode='whole'))$/;" v +test_cfg .\configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +test_cfg .\configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +test_cfg .\configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +test_cfg .\configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +test_cfg .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +test_cfg .\configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +test_cfg .\configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +test_cfg .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +test_cfg .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +test_cfg .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +test_cfg .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +test_cfg .\configs\foodnet\ccnet_vit_768x768_80k.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +test_cfg .\configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +test_cfg .\configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +test_cfg .\configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^test_cfg = dict(mode='slide', crop_size=(480, 480), stride=(320, 320))$/;" v +test_cfg .\configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^test_cfg = dict(mode='slide', crop_size=(480, 480), stride=(320, 320))$/;" v +test_cfg .\configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cfg .\configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +test_cgnet_GlobalContextExtractor .\tests\test_models\test_backbone.py /^def test_cgnet_GlobalContextExtractor():$/;" f +test_cgnet_backbone .\tests\test_models\test_backbone.py /^def test_cgnet_backbone():$/;" f +test_cgnet_context_guided_block .\tests\test_models\test_backbone.py /^def test_cgnet_context_guided_block():$/;" f +test_classes .\tests\test_data\test_dataset.py /^def test_classes():$/;" f +test_config_build_segmentor .\tests\test_config.py /^def test_config_build_segmentor():$/;" f +test_config_data_pipeline .\tests\test_config.py /^def test_config_data_pipeline():$/;" f +test_custom_classes_override_default .\tests\test_data\test_dataset.py /^def test_custom_classes_override_default(dataset, classes):$/;" f +test_custom_dataset .\tests\test_data\test_dataset.py /^def test_custom_dataset():$/;" f +test_custom_dataset_custom_palette .\tests\test_data\test_dataset.py /^def test_custom_dataset_custom_palette():$/;" f +test_custom_dataset_random_palette_is_generated .\tests\test_data\test_dataset.py /^def test_custom_dataset_random_palette_is_generated():$/;" f +test_da_head .\tests\test_models\test_heads.py /^def test_da_head():$/;" f +test_danet_forward .\tests\test_models\test_forward.py /^def test_danet_forward():$/;" f +test_dataset_wrapper .\tests\test_data\test_dataset.py /^def test_dataset_wrapper():$/;" f +test_decode_head .\tests\test_models\test_heads.py /^def test_decode_head():$/;" f +test_deconv_module .\tests\test_models\test_unet.py /^def test_deconv_module():$/;" f +test_deeplabv3_forward .\tests\test_models\test_forward.py /^def test_deeplabv3_forward():$/;" f +test_deeplabv3plus_forward .\tests\test_models\test_forward.py /^def test_deeplabv3plus_forward():$/;" f +test_dist_eval_hook .\tests\test_eval_hook.py /^def test_dist_eval_hook():$/;" f +test_dist_eval_hook_epoch .\tests\test_eval_hook.py /^def test_dist_eval_hook_epoch():$/;" f +test_dm_head .\tests\test_models\test_heads.py /^def test_dm_head():$/;" f +test_dnl_head .\tests\test_models\test_heads.py /^def test_dnl_head():$/;" f +test_dnlnet_forward .\tests\test_models\test_forward.py /^def test_dnlnet_forward():$/;" f +test_dw_aspp_head .\tests\test_models\test_heads.py /^def test_dw_aspp_head():$/;" f +test_emanet_forward .\tests\test_models\test_forward.py /^def test_emanet_forward():$/;" f +test_emanet_head .\tests\test_models\test_heads.py /^def test_emanet_head():$/;" f +test_enc_head .\tests\test_models\test_heads.py /^def test_enc_head():$/;" f +test_encnet_forward .\tests\test_models\test_forward.py /^def test_encnet_forward():$/;" f +test_encoder_decoder .\tests\test_models\test_segmentor.py /^def test_encoder_decoder():$/;" f +test_epoch_eval_hook .\tests\test_eval_hook.py /^def test_epoch_eval_hook():$/;" f +test_fastscnn_backbone .\tests\test_models\test_backbone.py /^def test_fastscnn_backbone():$/;" f +test_fcn_forward .\tests\test_models\test_forward.py /^def test_fcn_forward():$/;" f +test_fcn_head .\tests\test_models\test_heads.py /^def test_fcn_head():$/;" f +test_flip .\tests\test_data\test_transform.py /^def test_flip():$/;" f +test_fpn .\tests\test_models\test_necks.py /^def test_fpn():$/;" f +test_gc_head .\tests\test_models\test_heads.py /^def test_gc_head():$/;" f +test_gcnet_forward .\tests\test_models\test_forward.py /^def test_gcnet_forward():$/;" f +test_hrnet_forward .\tests\test_models\test_forward.py /^def test_hrnet_forward():$/;" f +test_interp_conv .\tests\test_models\test_unet.py /^def test_interp_conv():$/;" f +test_inv_residual .\tests\test_utils\test_inverted_residual_module.py /^def test_inv_residual():$/;" f +test_inv_residualv3 .\tests\test_utils\test_inverted_residual_module.py /^def test_inv_residualv3():$/;" f +test_iter_eval_hook .\tests\test_eval_hook.py /^def test_iter_eval_hook():$/;" f +test_load_img .\tests\test_data\test_loading.py /^ def test_load_img(self):$/;" m class:TestLoading +test_load_seg .\tests\test_data\test_loading.py /^ def test_load_seg(self):$/;" m class:TestLoading +test_load_seg_custom_classes .\tests\test_data\test_loading.py /^ def test_load_seg_custom_classes(self):$/;" m class:TestLoading +test_lovasz_loss .\tests\test_models\test_losses.py /^def test_lovasz_loss():$/;" f +test_lraspp_head .\tests\test_models\test_heads.py /^def test_lraspp_head():$/;" f +test_make_divisible .\tests\test_utils\test_make_divisible.py /^def test_make_divisible():$/;" f +test_mean_dice .\tests\test_metrics.py /^def test_mean_dice():$/;" f +test_mean_iou .\tests\test_metrics.py /^def test_mean_iou():$/;" f +test_metrics .\tests\test_metrics.py /^def test_metrics():$/;" f +test_mobilenet_v2_forward .\tests\test_models\test_forward.py /^def test_mobilenet_v2_forward():$/;" f +test_mobilenet_v3 .\tests\test_models\test_backbone.py /^def test_mobilenet_v3():$/;" f +test_multi_scale_flip_aug .\tests\test_data\test_tta.py /^def test_multi_scale_flip_aug():$/;" f +test_nl_head .\tests\test_models\test_heads.py /^def test_nl_head():$/;" f +test_nonlocal_net_forward .\tests\test_models\test_forward.py /^def test_nonlocal_net_forward():$/;" f +test_normalize .\tests\test_data\test_transform.py /^def test_normalize():$/;" f +test_ocr_head .\tests\test_models\test_heads.py /^def test_ocr_head():$/;" f +test_ocrnet_forward .\tests\test_models\test_forward.py /^def test_ocrnet_forward():$/;" f +test_ohem_sampler .\tests\test_sampler.py /^def test_ohem_sampler():$/;" f +test_pad .\tests\test_data\test_transform.py /^def test_pad():$/;" f +test_palette .\tests\test_data\test_dataset.py /^def test_palette():$/;" f +test_pipeline .\configs\_base_\datasets\FoodSeg103.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\Recipe1M_768x768.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\ade20k.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\chase_db1.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\cityscapes.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\cityscapes_769x769.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\drive.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\hrf.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\pascal_context.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\pascal_voc12.py /^test_pipeline = [$/;" v +test_pipeline .\configs\_base_\datasets\stare.py /^test_pipeline = [$/;" v +test_pipeline .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^test_pipeline = [$/;" v +test_pipeline .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^test_pipeline = [$/;" v +test_point_head .\tests\test_models\test_heads.py /^def test_point_head():$/;" f +test_point_rend_forward .\tests\test_models\test_forward.py /^def test_point_rend_forward():$/;" f +test_psa_head .\tests\test_models\test_heads.py /^def test_psa_head():$/;" f +test_psanet_forward .\tests\test_models\test_forward.py /^def test_psanet_forward():$/;" f +test_psp_head .\tests\test_models\test_heads.py /^def test_psp_head():$/;" f +test_pspnet_forward .\tests\test_models\test_forward.py /^def test_pspnet_forward():$/;" f +test_random_crop .\tests\test_data\test_transform.py /^def test_random_crop():$/;" f +test_renext_bottleneck .\tests\test_models\test_backbone.py /^def test_renext_bottleneck():$/;" f +test_rerange .\tests\test_data\test_transform.py /^def test_rerange():$/;" f +test_resize .\tests\test_data\test_transform.py /^def test_resize():$/;" f +test_resnest_backbone .\tests\test_models\test_backbone.py /^def test_resnest_backbone():$/;" f +test_resnest_bottleneck .\tests\test_models\test_backbone.py /^def test_resnest_bottleneck():$/;" f +test_resnet_backbone .\tests\test_models\test_backbone.py /^def test_resnet_backbone():$/;" f +test_resnet_basic_block .\tests\test_models\test_backbone.py /^def test_resnet_basic_block():$/;" f +test_resnet_bottleneck .\tests\test_models\test_backbone.py /^def test_resnet_bottleneck():$/;" f +test_resnet_res_layer .\tests\test_models\test_backbone.py /^def test_resnet_res_layer():$/;" f +test_resnext_backbone .\tests\test_models\test_backbone.py /^def test_resnext_backbone():$/;" f +test_rgb2gray .\tests\test_data\test_transform.py /^def test_rgb2gray():$/;" f +test_rotate .\tests\test_data\test_transform.py /^def test_rotate():$/;" f +test_se_layer .\tests\test_utils\test_se_layer.py /^def test_se_layer():$/;" f +test_seg_rescale .\tests\test_data\test_transform.py /^def test_seg_rescale():$/;" f +test_sem_fpn_forward .\tests\test_models\test_forward.py /^def test_sem_fpn_forward():$/;" f +test_sep_fcn_head .\tests\test_models\test_heads.py /^def test_sep_fcn_head():$/;" f +test_test_time_augmentation_on_cpu .\tests\test_inference.py /^def test_test_time_augmentation_on_cpu():$/;" f +test_unet .\tests\test_models\test_unet.py /^def test_unet():$/;" f +test_unet_basic_conv_block .\tests\test_models\test_unet.py /^def test_unet_basic_conv_block():$/;" f +test_up_conv_block .\tests\test_models\test_unet.py /^def test_up_conv_block():$/;" f +test_uper_head .\tests\test_models\test_heads.py /^def test_uper_head():$/;" f +test_upernet_forward .\tests\test_models\test_forward.py /^def test_upernet_forward():$/;" f +test_utils .\tests\test_models\test_losses.py /^def test_utils():$/;" f +time .\tools\benchmark.py /^import time$/;" i +time .\tools\train.py /^import time$/;" i +times .\configs\_base_\datasets\chase_db1.py /^ times=40000,$/;" v +times .\configs\_base_\datasets\drive.py /^ times=40000,$/;" v +times .\configs\_base_\datasets\hrf.py /^ times=40000,$/;" v +times .\configs\_base_\datasets\stare.py /^ times=40000,$/;" v +title .\docs\stat.py /^ title = content.split('\\n')[0].replace('#', '').strip()$/;" v +titles .\docs\stat.py /^titles = []$/;" v +to_1D .\mmseg\models\backbones\vit.py /^ def to_1D(self, x):$/;" m class:VisionTransformer +to_1tuple .\mmseg\models\backbones\layers\helpers.py /^to_1tuple = _ntuple(1)$/;" v +to_1tuple .\mmseg\models\decode_heads\layers\helpers.py /^to_1tuple = _ntuple(1)$/;" v +to_2D .\mmseg\models\backbones\vit.py /^ def to_2D(self, x):$/;" m class:VisionTransformer +to_2D .\mmseg\models\backbones\vit_mla.py /^ def to_2D(self, x):$/;" m class:Conv_MLA +to_2D .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^ def to_2D(self, x):$/;" m class:VIT_MLA_AUXIHead +to_2tuple .\mmseg\models\backbones\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_2tuple .\mmseg\models\backbones\layers\helpers.py /^to_2tuple = _ntuple(2)$/;" v +to_2tuple .\mmseg\models\backbones\pvt.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +to_2tuple .\mmseg\models\backbones\pvt_dia.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +to_2tuple .\mmseg\models\backbones\vit.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +to_2tuple .\mmseg\models\backbones\vit_mla.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +to_2tuple .\mmseg\models\decode_heads\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_2tuple .\mmseg\models\decode_heads\layers\helpers.py /^to_2tuple = _ntuple(2)$/;" v +to_2tuple .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +to_2tuple .\mmseg\models\decode_heads\vit_mla_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +to_2tuple .\mmseg\models\decode_heads\vit_up_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +to_3tuple .\mmseg\models\backbones\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_3tuple .\mmseg\models\backbones\layers\helpers.py /^to_3tuple = _ntuple(3)$/;" v +to_3tuple .\mmseg\models\decode_heads\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_3tuple .\mmseg\models\decode_heads\layers\helpers.py /^to_3tuple = _ntuple(3)$/;" v +to_4tuple .\mmseg\models\backbones\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_4tuple .\mmseg\models\backbones\layers\helpers.py /^to_4tuple = _ntuple(4)$/;" v +to_4tuple .\mmseg\models\decode_heads\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_4tuple .\mmseg\models\decode_heads\layers\helpers.py /^to_4tuple = _ntuple(4)$/;" v +to_cuda .\tests\test_models\test_heads.py /^def to_cuda(module, data):$/;" f +to_ntuple .\mmseg\models\backbones\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_ntuple .\mmseg\models\backbones\layers\helpers.py /^to_ntuple = _ntuple$/;" v +to_ntuple .\mmseg\models\decode_heads\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_ntuple .\mmseg\models\decode_heads\layers\helpers.py /^to_ntuple = _ntuple$/;" v +to_tensor .\mmseg\datasets\pipelines\formating.py /^def to_tensor(data):$/;" f +torch .\.dev\gather_models.py /^import torch$/;" i +torch .\mmseg\apis\inference.py /^import torch$/;" i +torch .\mmseg\apis\test.py /^import torch$/;" i +torch .\mmseg\apis\test.py /^import torch.distributed as dist$/;" i +torch .\mmseg\apis\train.py /^import torch$/;" i +torch .\mmseg\core\seg\sampler\ohem_pixel_sampler.py /^import torch$/;" i +torch .\mmseg\core\seg\sampler\ohem_pixel_sampler.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\datasets\pipelines\formating.py /^import torch$/;" i +torch .\mmseg\models\backbones\cgnet.py /^import torch$/;" i +torch .\mmseg\models\backbones\cgnet.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\cgnet.py /^import torch.utils.checkpoint as cp$/;" i +torch .\mmseg\models\backbones\fast_scnn.py /^import torch$/;" i +torch .\mmseg\models\backbones\fast_scnn.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\helpers.py /^import torch$/;" i +torch .\mmseg\models\backbones\helpers.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\helpers.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\backbones\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +torch .\mmseg\models\backbones\hrnet.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\layers\drop.py /^import torch$/;" i +torch .\mmseg\models\backbones\layers\drop.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\layers\drop.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\backbones\layers\weight_init.py /^import torch$/;" i +torch .\mmseg\models\backbones\mobilenet_v2.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\mobilenet_v3.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\pvt.py /^import torch$/;" i +torch .\mmseg\models\backbones\pvt.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\pvt.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\backbones\pvt_dia.py /^import torch$/;" i +torch .\mmseg\models\backbones\pvt_dia.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\pvt_dia.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\backbones\resnest.py /^import torch$/;" i +torch .\mmseg\models\backbones\resnest.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\resnest.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\backbones\resnest.py /^import torch.utils.checkpoint as cp$/;" i +torch .\mmseg\models\backbones\resnet.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\resnet.py /^import torch.utils.checkpoint as cp$/;" i +torch .\mmseg\models\backbones\unet.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\unet.py /^import torch.utils.checkpoint as cp$/;" i +torch .\mmseg\models\backbones\vit.py /^import torch$/;" i +torch .\mmseg\models\backbones\vit.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\vit.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\backbones\vit_mla.py /^import torch$/;" i +torch .\mmseg\models\backbones\vit_mla.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\backbones\vit_mla.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\ann_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\ann_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\apc_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\apc_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\apc_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\aspp_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\aspp_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\cc_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\da_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\da_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\decode_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\decode_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\dm_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\dm_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\dm_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\dnl_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\ema_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\ema_head.py /^import torch.distributed as dist$/;" i +torch .\mmseg\models\decode_heads\ema_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\ema_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\enc_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\enc_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\enc_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\fcn_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\fcn_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\fpn_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\gc_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\helpers.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\helpers.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\helpers.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +torch .\mmseg\models\decode_heads\layers\drop.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\layers\drop.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\layers\drop.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\layers\weight_init.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\lraspp_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\lraspp_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\nl_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\ocr_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\ocr_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\ocr_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\point_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\point_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\psa_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\psa_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\psa_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\psp_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\psp_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\sep_aspp_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\sep_aspp_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\uper_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\uper_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\vit_mla_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\decode_heads\vit_up_head.py /^import torch$/;" i +torch .\mmseg\models\decode_heads\vit_up_head.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\decode_heads\vit_up_head.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\losses\accuracy.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\losses\cross_entropy_loss.py /^import torch$/;" i +torch .\mmseg\models\losses\cross_entropy_loss.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\losses\cross_entropy_loss.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\losses\lovasz_loss.py /^import torch$/;" i +torch .\mmseg\models\losses\lovasz_loss.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\losses\lovasz_loss.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\losses\utils.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\necks\fpn.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\necks\fpn.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\segmentors\base.py /^import torch$/;" i +torch .\mmseg\models\segmentors\base.py /^import torch.distributed as dist$/;" i +torch .\mmseg\models\segmentors\base.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\segmentors\encoder_decoder.py /^import torch$/;" i +torch .\mmseg\models\segmentors\encoder_decoder.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\segmentors\encoder_decoder.py /^import torch.nn.functional as F$/;" i +torch .\mmseg\models\utils\se_layer.py /^import torch.nn as nn$/;" i +torch .\mmseg\models\utils\self_attention_block.py /^import torch$/;" i +torch .\mmseg\models\utils\up_conv_block.py /^import torch$/;" i +torch .\mmseg\models\utils\up_conv_block.py /^import torch.nn as nn$/;" i +torch .\mmseg\ops\encoding.py /^import torch$/;" i +torch .\mmseg\ops\wrappers.py /^import torch$/;" i +torch .\mmseg\ops\wrappers.py /^import torch.nn as nn$/;" i +torch .\mmseg\ops\wrappers.py /^import torch.nn.functional as F$/;" i +torch .\tests\test_eval_hook.py /^import torch$/;" i +torch .\tests\test_eval_hook.py /^import torch.nn as nn$/;" i +torch .\tests\test_model.py /^import torch$/;" i +torch .\tests\test_models\test_backbone.py /^import torch$/;" i +torch .\tests\test_models\test_forward.py /^import torch$/;" i +torch .\tests\test_models\test_forward.py /^import torch.nn as nn$/;" i +torch .\tests\test_models\test_heads.py /^import torch$/;" i +torch .\tests\test_models\test_losses.py /^import torch$/;" i +torch .\tests\test_models\test_necks.py /^import torch$/;" i +torch .\tests\test_models\test_segmentor.py /^import torch$/;" i +torch .\tests\test_models\test_unet.py /^import torch$/;" i +torch .\tests\test_sampler.py /^import torch$/;" i +torch .\tests\test_utils\test_inverted_residual_module.py /^import torch$/;" i +torch .\tests\test_utils\test_se_layer.py /^import torch$/;" i +torch .\tools\benchmark.py /^import torch$/;" i +torch .\tools\publish_model.py /^import torch$/;" i +torch .\tools\pytorch2onnx.py /^import torch$/;" i +torch .\tools\pytorch2onnx.py /^import torch._C$/;" i +torch .\tools\pytorch2onnx.py /^import torch.serialization$/;" i +torch .\tools\test.py /^import torch$/;" i +torch .\tools\train.py /^import torch$/;" i +total_intersect_and_union .\mmseg\core\evaluation\metrics.py /^def total_intersect_and_union(results,$/;" f +total_iters .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^total_iters = 60000$/;" v +total_iters .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^total_iters = 60000$/;" v +train .\configs\_base_\datasets\FoodSeg103.py /^ train=dict($/;" v +train .\configs\_base_\datasets\Recipe1M_768x768.py /^ train=dict(pipeline=train_pipeline),$/;" v +train .\configs\_base_\datasets\ade20k.py /^ train=dict($/;" v +train .\configs\_base_\datasets\chase_db1.py /^ train=dict($/;" v +train .\configs\_base_\datasets\cityscapes.py /^ train=dict($/;" v +train .\configs\_base_\datasets\cityscapes_769x769.py /^ train=dict(pipeline=train_pipeline),$/;" v +train .\configs\_base_\datasets\drive.py /^ train=dict($/;" v +train .\configs\_base_\datasets\hrf.py /^ train=dict($/;" v +train .\configs\_base_\datasets\pascal_context.py /^ train=dict($/;" v +train .\configs\_base_\datasets\pascal_voc12.py /^ train=dict($/;" v +train .\configs\_base_\datasets\pascal_voc12_aug.py /^ train=dict($/;" v +train .\configs\_base_\datasets\stare.py /^ train=dict($/;" v +train .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ train=dict($/;" v +train .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ train=dict(pipeline=train_pipeline),$/;" v +train .\mmseg\models\backbones\cgnet.py /^ def train(self, mode=True):$/;" m class:CGNet +train .\mmseg\models\backbones\hrnet.py /^ def train(self, mode=True):$/;" m class:HRNet +train .\mmseg\models\backbones\mobilenet_v2.py /^ def train(self, mode=True):$/;" m class:MobileNetV2 +train .\mmseg\models\backbones\mobilenet_v3.py /^ def train(self, mode=True):$/;" m class:MobileNetV3 +train .\mmseg\models\backbones\resnet.py /^ def train(self, mode=True):$/;" m class:ResNet +train .\mmseg\models\backbones\unet.py /^ def train(self, mode=True):$/;" m class:UNet +train_cfg .\configs\_base_\models\ann_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\apcnet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\ccnet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\cgnet.py /^ train_cfg=dict(sampler=None),$/;" v +train_cfg .\configs\_base_\models\danet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\deeplabv3_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\dmnet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\dnl_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\emanet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\encnet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\fast_scnn.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\fcn_hr18.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\fcn_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\fcn_unet_s5-d16.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\fpn_r50.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\gcnet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\lraspp_m-v3-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\nonlocal_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\ocrnet_hr18.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\ocrnet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\pointrend_r50.py /^ train_cfg=dict($/;" v +train_cfg .\configs\_base_\models\psanet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\pspnet_r50-d8.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\pspnet_unet_s5-d16.py /^ train_cfg=dict(),$/;" v +train_cfg .\configs\_base_\models\setr_mla.py /^train_cfg = dict()$/;" v +train_cfg .\configs\_base_\models\setr_naive_pup.py /^train_cfg = dict()$/;" v +train_cfg .\configs\_base_\models\upernet_r50.py /^ train_cfg=dict(),$/;" v +train_pipeline .\configs\_base_\datasets\FoodSeg103.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\Recipe1M_768x768.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\ade20k.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\chase_db1.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\cityscapes.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\cityscapes_769x769.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\drive.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\hrf.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\pascal_context.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\pascal_voc12.py /^train_pipeline = [$/;" v +train_pipeline .\configs\_base_\datasets\stare.py /^train_pipeline = [$/;" v +train_pipeline .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^train_pipeline = [$/;" v +train_pipeline .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^train_pipeline = [$/;" v +train_segmentor .\mmseg\apis\__init__.py /^from .train import get_root_logger, set_random_seed, train_segmentor$/;" i +train_segmentor .\mmseg\apis\train.py /^def train_segmentor(model,$/;" f +train_segmentor .\tools\train.py /^from mmseg.apis import set_random_seed, train_segmentor$/;" i +train_step .\mmseg\models\segmentors\base.py /^ def train_step(self, data_batch, optimizer, **kwargs):$/;" m class:BaseSegmentor +train_step .\tests\test_eval_hook.py /^ def train_step(self, data_batch, optimizer):$/;" m class:ExampleModel +transforms .\configs\_base_\datasets\FoodSeg103.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\Recipe1M_768x768.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\ade20k.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\chase_db1.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\cityscapes.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\cityscapes_769x769.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\drive.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\hrf.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\pascal_context.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\pascal_voc12.py /^ transforms=[$/;" v +transforms .\configs\_base_\datasets\stare.py /^ transforms=[$/;" v +transforms .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ transforms=[$/;" v +transforms .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ transforms=[$/;" v +trunc_normal_ .\mmseg\models\backbones\layers\__init__.py /^from .weight_init import trunc_normal_/;" i +trunc_normal_ .\mmseg\models\backbones\layers\weight_init.py /^def trunc_normal_(tensor, mean=0., std=1., a=-2., b=2.):$/;" f +trunc_normal_ .\mmseg\models\backbones\pvt.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +trunc_normal_ .\mmseg\models\backbones\pvt_dia.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +trunc_normal_ .\mmseg\models\backbones\vit.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +trunc_normal_ .\mmseg\models\backbones\vit_mla.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +trunc_normal_ .\mmseg\models\decode_heads\layers\__init__.py /^from .weight_init import trunc_normal_/;" i +trunc_normal_ .\mmseg\models\decode_heads\layers\weight_init.py /^def trunc_normal_(tensor, mean=0., std=1., a=-2., b=2.):$/;" f +trunc_normal_ .\mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +trunc_normal_ .\mmseg\models\decode_heads\vit_mla_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +trunc_normal_ .\mmseg\models\decode_heads\vit_up_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +type .\configs\_base_\datasets\FoodSeg103.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\FoodSeg103.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\Recipe1M_768x768.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\ade20k.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\ade20k.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\chase_db1.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\chase_db1.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\chase_db1.py /^ type='RepeatDataset',$/;" v +type .\configs\_base_\datasets\chase_db1.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\cityscapes.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\cityscapes.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\cityscapes_769x769.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\drive.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\drive.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\drive.py /^ type='RepeatDataset',$/;" v +type .\configs\_base_\datasets\drive.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\hrf.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\hrf.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\hrf.py /^ type='RepeatDataset',$/;" v +type .\configs\_base_\datasets\hrf.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\pascal_context.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\pascal_context.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\pascal_voc12.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\pascal_voc12.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\stare.py /^ type=dataset_type,$/;" v +type .\configs\_base_\datasets\stare.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\_base_\datasets\stare.py /^ type='RepeatDataset',$/;" v +type .\configs\_base_\datasets\stare.py /^ type=dataset_type,$/;" v +type .\configs\_base_\models\ann_r50-d8.py /^ type='ANNHead',$/;" v +type .\configs\_base_\models\ann_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\ann_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\ann_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\apcnet_r50-d8.py /^ type='APCHead',$/;" v +type .\configs\_base_\models\apcnet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\apcnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\apcnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\ccnet_r50-d8.py /^ type='CCHead',$/;" v +type .\configs\_base_\models\ccnet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\ccnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\ccnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\cgnet.py /^ type='CrossEntropyLoss',$/;" v +type .\configs\_base_\models\cgnet.py /^ type='CGNet',$/;" v +type .\configs\_base_\models\cgnet.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\cgnet.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\danet_r50-d8.py /^ type='DAHead',$/;" v +type .\configs\_base_\models\danet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\danet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\danet_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\deeplabv3_r50-d8.py /^ type='ASPPHead',$/;" v +type .\configs\_base_\models\deeplabv3_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\deeplabv3_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\deeplabv3_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ type='ASPPHead',$/;" v +type .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ type='UNet',$/;" v +type .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ type='DepthwiseSeparableASPPHead',$/;" v +type .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\deeplabv3plus_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\dmnet_r50-d8.py /^ type='DMHead',$/;" v +type .\configs\_base_\models\dmnet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\dmnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\dmnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\dnl_r50-d8.py /^ type='DNLHead',$/;" v +type .\configs\_base_\models\dnl_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\dnl_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\dnl_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\emanet_r50-d8.py /^ type='EMAHead',$/;" v +type .\configs\_base_\models\emanet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\emanet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\emanet_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\encnet_r50-d8.py /^ type='EncHead',$/;" v +type .\configs\_base_\models\encnet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\encnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\encnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\fast_scnn.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\fast_scnn.py /^ type='DepthwiseSeparableFCNHead',$/;" v +type .\configs\_base_\models\fast_scnn.py /^ type='FastSCNN',$/;" v +type .\configs\_base_\models\fast_scnn.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\fcn_hr18.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\fcn_hr18.py /^ type='HRNet',$/;" v +type .\configs\_base_\models\fcn_hr18.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\fcn_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\fcn_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\fcn_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\fcn_unet_s5-d16.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\fcn_unet_s5-d16.py /^ type='UNet',$/;" v +type .\configs\_base_\models\fcn_unet_s5-d16.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\fpn_r50.py /^ type='FPN',$/;" v +type .\configs\_base_\models\fpn_r50.py /^ type='FPNHead',$/;" v +type .\configs\_base_\models\fpn_r50.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\fpn_r50.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\gcnet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\gcnet_r50-d8.py /^ type='GCHead',$/;" v +type .\configs\_base_\models\gcnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\gcnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\lraspp_m-v3-d8.py /^ type='LRASPPHead',$/;" v +type .\configs\_base_\models\lraspp_m-v3-d8.py /^ type='MobileNetV3',$/;" v +type .\configs\_base_\models\lraspp_m-v3-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\nonlocal_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\nonlocal_r50-d8.py /^ type='NLHead',$/;" v +type .\configs\_base_\models\nonlocal_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\nonlocal_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\ocrnet_hr18.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\ocrnet_hr18.py /^ type='OCRHead',$/;" v +type .\configs\_base_\models\ocrnet_hr18.py /^ type='HRNet',$/;" v +type .\configs\_base_\models\ocrnet_hr18.py /^ type='CascadeEncoderDecoder',$/;" v +type .\configs\_base_\models\ocrnet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\ocrnet_r50-d8.py /^ type='OCRHead',$/;" v +type .\configs\_base_\models\ocrnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\ocrnet_r50-d8.py /^ type='CascadeEncoderDecoder',$/;" v +type .\configs\_base_\models\pointrend_r50.py /^ type='FPNHead',$/;" v +type .\configs\_base_\models\pointrend_r50.py /^ type='PointHead',$/;" v +type .\configs\_base_\models\pointrend_r50.py /^ type='FPN',$/;" v +type .\configs\_base_\models\pointrend_r50.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\pointrend_r50.py /^ type='CascadeEncoderDecoder',$/;" v +type .\configs\_base_\models\psanet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\psanet_r50-d8.py /^ type='PSAHead',$/;" v +type .\configs\_base_\models\psanet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\psanet_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\pspnet_r50-d8.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\pspnet_r50-d8.py /^ type='PSPHead',$/;" v +type .\configs\_base_\models\pspnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\pspnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\pspnet_unet_s5-d16.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\pspnet_unet_s5-d16.py /^ type='PSPHead',$/;" v +type .\configs\_base_\models\pspnet_unet_s5-d16.py /^ type='UNet',$/;" v +type .\configs\_base_\models\pspnet_unet_s5-d16.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\setr_mla.py /^ type='VIT_MLA',$/;" v +type .\configs\_base_\models\setr_mla.py /^ type='VIT_MLAHead',$/;" v +type .\configs\_base_\models\setr_mla.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\setr_naive_pup.py /^ type='VisionTransformer',$/;" v +type .\configs\_base_\models\setr_naive_pup.py /^ type='VisionTransformerUpHead',$/;" v +type .\configs\_base_\models\setr_naive_pup.py /^ type='EncoderDecoder',$/;" v +type .\configs\_base_\models\upernet_r50.py /^ type='FCNHead',$/;" v +type .\configs\_base_\models\upernet_r50.py /^ type='ResNetV1c',$/;" v +type .\configs\_base_\models\upernet_r50.py /^ type='UPerHead',$/;" v +type .\configs\_base_\models\upernet_r50.py /^ type='EncoderDecoder',$/;" v +type .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ type=dataset_type,$/;" v +type .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ type='MultiScaleFlipAug',$/;" v +type .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ type='VIT_MLA_AUXIHead',$/;" v +type .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ type='VIT_MLA_AUXIHead',$/;" v +type .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ type='VIT_MLA_AUXIHead',$/;" v +type .\configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ type='VIT_MLA_AUXIHead',$/;" v +type .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ type='VisionTransformerUpHead',$/;" v +type .\configs\foodnet\ccnet_vit_768x768_80k.py /^ type='VisionTransformer',$/;" v +type .\configs\foodnet\ccnet_vit_768x768_80k.py /^ type='EncoderDecoder',$/;" v +type .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ type='MobileNetV2',$/;" v +type .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ type='MobileNetV2',$/;" v +type .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ type='MobileNetV2',$/;" v +type .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ type='MobileNetV2',$/;" v +type .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ type='MobileNetV2',$/;" v +type .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ type='MobileNetV2',$/;" v +type .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ type='MobileNetV2',$/;" v +type .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ type='MobileNetV2',$/;" v +type .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ type='LRASPPHead',$/;" v +type .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ type='MobileNetV3',$/;" v +type .\configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ type='EncoderDecoder',$/;" v +type .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ type='LRASPPHead',$/;" v +type .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ type='MobileNetV3',$/;" v +type .\configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ type='EncoderDecoder',$/;" v +type .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ type='OCRHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ type='FCNHead',$/;" v +type .\configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ type='OCRHead',$/;" v +type .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ type='FPNHead',$/;" v +type .\configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ type='PointHead',$/;" v +type .\configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ type='ResNeSt',$/;" v +type .\configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ type='ResNeSt',$/;" v +type .\configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ type='ResNeSt',$/;" v +type .\configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ type='ResNeSt',$/;" v +type .\configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ type='ResNeSt',$/;" v +type .\configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ type='ResNeSt',$/;" v +type .\configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ type='ResNeSt',$/;" v +type .\configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ type='ResNeSt',$/;" v +un_gz .\tools\convert_datasets\stare.py /^def un_gz(src, dst):$/;" f +upsample_cfg .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ upsample_cfg=dict(type='InterpConv'),$/;" v +upsample_cfg .\configs\_base_\models\fcn_unet_s5-d16.py /^ upsample_cfg=dict(type='InterpConv'),$/;" v +upsample_cfg .\configs\_base_\models\pspnet_unet_s5-d16.py /^ upsample_cfg=dict(type='InterpConv'),$/;" v +upsampling_method .\configs\_base_\models\setr_naive_pup.py /^ upsampling_method='bilinear',$/;" v +upsampling_method .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ upsampling_method='bilinear',$/;" v +upsampling_method .\configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ upsampling_method='bilinear', $/;" v +url .\docs\stat.py /^ url = osp.dirname(f.replace('..\/', url_prefix))$/;" v +url_prefix .\docs\stat.py /^url_prefix = 'https:\/\/github.com\/open-mmlab\/mmsegmentation\/blob\/master\/'$/;" v +urlparse .\mmseg\models\backbones\helpers.py /^from urllib.parse import urlparse # noqa: F401$/;" i +use_scale .\configs\_base_\models\dnl_r50-d8.py /^ use_scale=True,$/;" v +use_scale .\configs\_base_\models\nonlocal_r50-d8.py /^ use_scale=True,$/;" v +use_se_loss .\configs\_base_\models\encnet_r50-d8.py /^ use_se_loss=True,$/;" v +use_sigmoid .\configs\_base_\models\cgnet.py /^ use_sigmoid=False,$/;" v +utils .\mmseg\models\backbones\cgnet.py /^import torch.utils.checkpoint as cp$/;" i +utils .\mmseg\models\backbones\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +utils .\mmseg\models\backbones\resnest.py /^import torch.utils.checkpoint as cp$/;" i +utils .\mmseg\models\backbones\resnet.py /^import torch.utils.checkpoint as cp$/;" i +utils .\mmseg\models\backbones\unet.py /^import torch.utils.checkpoint as cp$/;" i +utils .\mmseg\models\decode_heads\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +val .\configs\_base_\datasets\FoodSeg103.py /^ val=dict($/;" v +val .\configs\_base_\datasets\Recipe1M_768x768.py /^ val=dict(pipeline=test_pipeline),$/;" v +val .\configs\_base_\datasets\ade20k.py /^ val=dict($/;" v +val .\configs\_base_\datasets\chase_db1.py /^ val=dict($/;" v +val .\configs\_base_\datasets\cityscapes.py /^ val=dict($/;" v +val .\configs\_base_\datasets\cityscapes_769x769.py /^ val=dict(pipeline=test_pipeline),$/;" v +val .\configs\_base_\datasets\drive.py /^ val=dict($/;" v +val .\configs\_base_\datasets\hrf.py /^ val=dict($/;" v +val .\configs\_base_\datasets\pascal_context.py /^ val=dict($/;" v +val .\configs\_base_\datasets\pascal_voc12.py /^ val=dict($/;" v +val .\configs\_base_\datasets\stare.py /^ val=dict($/;" v +val .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ val=dict($/;" v +val .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ val=dict(pipeline=test_pipeline),$/;" v +val_step .\mmseg\models\segmentors\base.py /^ def val_step(self, data_batch, **kwargs):$/;" m class:BaseSegmentor +verify .\tools\pytorch2onnx.py /^ verify=args.verify)$/;" v +version_file .\docs\conf.py /^version_file = '..\/mmseg\/version.py'$/;" v +version_file .\setup.py /^version_file = 'mmseg\/version.py'$/;" v +version_info .\mmseg\__init__.py /^from .version import __version__, version_info$/;" i +version_info .\mmseg\version.py /^version_info = parse_version_info(__version__)$/;" v +voc_classes .\mmseg\core\evaluation\class_names.py /^def voc_classes():$/;" f +voc_palette .\mmseg\core\evaluation\class_names.py /^def voc_palette():$/;" f +warnings .\mmseg\apis\train.py /^import warnings$/;" i +warnings .\mmseg\datasets\pipelines\test_time_aug.py /^import warnings$/;" i +warnings .\mmseg\models\backbones\helpers.py /^import warnings$/;" i +warnings .\mmseg\models\backbones\layers\weight_init.py /^import warnings$/;" i +warnings .\mmseg\models\builder.py /^import warnings$/;" i +warnings .\mmseg\models\decode_heads\layers\weight_init.py /^import warnings$/;" i +warnings .\mmseg\models\segmentors\base.py /^import warnings$/;" i +warnings .\mmseg\ops\wrappers.py /^import warnings$/;" i +weight_reduce_loss .\mmseg\models\losses\__init__.py /^from .utils import reduce_loss, weight_reduce_loss, weighted_loss$/;" i +weight_reduce_loss .\mmseg\models\losses\cross_entropy_loss.py /^from .utils import weight_reduce_loss$/;" i +weight_reduce_loss .\mmseg\models\losses\lovasz_loss.py /^from .utils import weight_reduce_loss$/;" i +weight_reduce_loss .\mmseg\models\losses\utils.py /^def weight_reduce_loss(loss, weight=None, reduction='mean', avg_factor=None):$/;" f +weight_reduce_loss .\tests\test_models\test_losses.py /^from mmseg.models.losses import Accuracy, reduce_loss, weight_reduce_loss$/;" i +weighted_loss .\mmseg\models\losses\__init__.py /^from .utils import reduce_loss, weight_reduce_loss, weighted_loss$/;" i +weighted_loss .\mmseg\models\losses\utils.py /^def weighted_loss(loss_func):$/;" f +whole_inference .\mmseg\models\segmentors\encoder_decoder.py /^ def whole_inference(self, img, img_meta, rescale):$/;" m class:EncoderDecoder +widen_factor .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ widen_factor=1.,$/;" v +widen_factor .\configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ widen_factor=1.,$/;" v +widen_factor .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ widen_factor=1.,$/;" v +widen_factor .\configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ widen_factor=1.,$/;" v +widen_factor .\configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ widen_factor=1.,$/;" v +widen_factor .\configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ widen_factor=1.,$/;" v +widen_factor .\configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ widen_factor=1.,$/;" v +widen_factor .\configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ widen_factor=1.,$/;" v +with_auxiliary_head .\mmseg\models\segmentors\base.py /^ def with_auxiliary_head(self):$/;" m class:BaseSegmentor +with_cp .\configs\_base_\models\deeplabv3_unet_s5-d16.py /^ with_cp=False,$/;" v +with_cp .\configs\_base_\models\fcn_unet_s5-d16.py /^ with_cp=False,$/;" v +with_cp .\configs\_base_\models\pspnet_unet_s5-d16.py /^ with_cp=False,$/;" v +with_decode_head .\mmseg\models\segmentors\base.py /^ def with_decode_head(self):$/;" m class:BaseSegmentor +with_neck .\mmseg\models\segmentors\base.py /^ def with_neck(self):$/;" m class:BaseSegmentor +worker_init_fn .\mmseg\datasets\builder.py /^def worker_init_fn(worker_id, num_workers, rank, seed):$/;" f +workers_per_gpu .\configs\_base_\datasets\FoodSeg103.py /^ workers_per_gpu=2,$/;" v +workers_per_gpu .\configs\_base_\datasets\ade20k.py /^ workers_per_gpu=4,$/;" v +workers_per_gpu .\configs\_base_\datasets\chase_db1.py /^ workers_per_gpu=4,$/;" v +workers_per_gpu .\configs\_base_\datasets\cityscapes.py /^ workers_per_gpu=2,$/;" v +workers_per_gpu .\configs\_base_\datasets\drive.py /^ workers_per_gpu=4,$/;" v +workers_per_gpu .\configs\_base_\datasets\hrf.py /^ workers_per_gpu=4,$/;" v +workers_per_gpu .\configs\_base_\datasets\pascal_context.py /^ workers_per_gpu=4,$/;" v +workers_per_gpu .\configs\_base_\datasets\pascal_voc12.py /^ workers_per_gpu=4,$/;" v +workers_per_gpu .\configs\_base_\datasets\stare.py /^ workers_per_gpu=4,$/;" v +workers_per_gpu .\configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ workers_per_gpu=8,$/;" v +workers_per_gpu .\configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ workers_per_gpu=8,$/;" v +workflow .\configs\_base_\default_runtime.py /^workflow = [('train', 1)]$/;" v +wrapper .\mmseg\models\losses\utils.py /^ def wrapper(pred,$/;" f function:weighted_loss +xavier_init .\mmseg\models\necks\fpn.py /^from mmcv.cnn import ConvModule, xavier_init$/;" i +zipfile .\mmseg\models\backbones\helpers.py /^import zipfile$/;" i +zipfile .\tools\convert_datasets\chase_db1.py /^import zipfile$/;" i +zipfile .\tools\convert_datasets\drive.py /^import zipfile$/;" i +zipfile .\tools\convert_datasets\hrf.py /^import zipfile$/;" i diff --git a/.tags_sorted_by_file b/.tags_sorted_by_file new file mode 100644 index 0000000000000000000000000000000000000000..e8030a12c49274a2649e6a5904cce7a2fb91fe51 --- /dev/null +++ b/.tags_sorted_by_file @@ -0,0 +1,5568 @@ +RESULTS_LUT dev\gather_models.py /^RESULTS_LUT = ['mIoU', 'mAcc', 'aAcc']$/;" v +argparse dev\gather_models.py /^import argparse$/;" i +get_final_iter dev\gather_models.py /^def get_final_iter(config):$/;" f +get_final_results dev\gather_models.py /^def get_final_results(log_json_path, iter_num):$/;" f +glob dev\gather_models.py /^import glob$/;" i +json dev\gather_models.py /^import json$/;" i +main dev\gather_models.py /^def main():$/;" f +mmcv dev\gather_models.py /^import mmcv$/;" i +os dev\gather_models.py /^import os$/;" i +os dev\gather_models.py /^import os.path as osp$/;" i +osp dev\gather_models.py /^import os.path as osp$/;" i +parse_args dev\gather_models.py /^def parse_args():$/;" f +process_checkpoint dev\gather_models.py /^def process_checkpoint(in_file, out_file):$/;" f +shutil dev\gather_models.py /^import shutil$/;" i +subprocess dev\gather_models.py /^import subprocess$/;" i +torch dev\gather_models.py /^import torch$/;" i +ACCESS_KEY_ID dev\upload_modelzoo.py /^ACCESS_KEY_ID = os.getenv('OSS_ACCESS_KEY_ID', None)$/;" v +ACCESS_KEY_SECRET dev\upload_modelzoo.py /^ACCESS_KEY_SECRET = os.getenv('OSS_ACCESS_KEY_SECRET', None)$/;" v +BUCKET_NAME dev\upload_modelzoo.py /^BUCKET_NAME = 'openmmlab'$/;" v +ENDPOINT dev\upload_modelzoo.py /^ENDPOINT = 'https:\/\/oss-accelerate.aliyuncs.com'$/;" v +argparse dev\upload_modelzoo.py /^import argparse$/;" i +main dev\upload_modelzoo.py /^def main():$/;" f +os dev\upload_modelzoo.py /^import os$/;" i +os dev\upload_modelzoo.py /^import os.path as osp$/;" i +osp dev\upload_modelzoo.py /^import os.path as osp$/;" i +oss2 dev\upload_modelzoo.py /^import oss2$/;" i +parse_args dev\upload_modelzoo.py /^def parse_args():$/;" f +ann_dir configs\_base_\datasets\FoodSeg103.py /^ ann_dir='ann_dir\/test',$/;" v +ann_dir configs\_base_\datasets\FoodSeg103.py /^ ann_dir='ann_dir\/train',$/;" v +crop_size configs\_base_\datasets\FoodSeg103.py /^crop_size = (512, 1024)$/;" v +data configs\_base_\datasets\FoodSeg103.py /^data = dict($/;" v +data_root configs\_base_\datasets\FoodSeg103.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\FoodSeg103.py /^data_root = '.\/data\/Recipe1M\/'$/;" v +dataset_type configs\_base_\datasets\FoodSeg103.py /^dataset_type = 'CustomDataset'$/;" v +flip configs\_base_\datasets\FoodSeg103.py /^ flip=False,$/;" v +img_dir configs\_base_\datasets\FoodSeg103.py /^ img_dir='img_dir\/test',$/;" v +img_dir configs\_base_\datasets\FoodSeg103.py /^ img_dir='img_dir\/train',$/;" v +img_norm_cfg configs\_base_\datasets\FoodSeg103.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\FoodSeg103.py /^ img_scale=(2048, 1024),$/;" v +pipeline configs\_base_\datasets\FoodSeg103.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\_base_\datasets\FoodSeg103.py /^ pipeline=test_pipeline),$/;" v +pipeline configs\_base_\datasets\FoodSeg103.py /^ pipeline=train_pipeline),$/;" v +samples_per_gpu configs\_base_\datasets\FoodSeg103.py /^ samples_per_gpu=2,$/;" v +test configs\_base_\datasets\FoodSeg103.py /^ test=dict($/;" v +test_pipeline configs\_base_\datasets\FoodSeg103.py /^test_pipeline = [$/;" v +train configs\_base_\datasets\FoodSeg103.py /^ train=dict($/;" v +train_pipeline configs\_base_\datasets\FoodSeg103.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\FoodSeg103.py /^ transforms=[$/;" v +type configs\_base_\datasets\FoodSeg103.py /^ type='MultiScaleFlipAug',$/;" v +type configs\_base_\datasets\FoodSeg103.py /^ type=dataset_type,$/;" v +val configs\_base_\datasets\FoodSeg103.py /^ val=dict($/;" v +workers_per_gpu configs\_base_\datasets\FoodSeg103.py /^ workers_per_gpu=2,$/;" v +_base_ configs\_base_\datasets\Recipe1M_768x768.py /^_base_ = '.\/Recipe1M.py'$/;" v +crop_size configs\_base_\datasets\Recipe1M_768x768.py /^crop_size = (768, 768)$/;" v +data configs\_base_\datasets\Recipe1M_768x768.py /^data = dict($/;" v +flip configs\_base_\datasets\Recipe1M_768x768.py /^ flip=False,$/;" v +img_norm_cfg configs\_base_\datasets\Recipe1M_768x768.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\Recipe1M_768x768.py /^ img_scale=(2049, 1025),$/;" v +test configs\_base_\datasets\Recipe1M_768x768.py /^ test=dict(pipeline=test_pipeline))$/;" v +test_pipeline configs\_base_\datasets\Recipe1M_768x768.py /^test_pipeline = [$/;" v +train configs\_base_\datasets\Recipe1M_768x768.py /^ train=dict(pipeline=train_pipeline),$/;" v +train_pipeline configs\_base_\datasets\Recipe1M_768x768.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\Recipe1M_768x768.py /^ transforms=[$/;" v +type configs\_base_\datasets\Recipe1M_768x768.py /^ type='MultiScaleFlipAug',$/;" v +val configs\_base_\datasets\Recipe1M_768x768.py /^ val=dict(pipeline=test_pipeline),$/;" v +ann_dir configs\_base_\datasets\ade20k.py /^ ann_dir='annotations\/training',$/;" v +ann_dir configs\_base_\datasets\ade20k.py /^ ann_dir='annotations\/validation',$/;" v +crop_size configs\_base_\datasets\ade20k.py /^crop_size = (512, 512)$/;" v +data configs\_base_\datasets\ade20k.py /^data = dict($/;" v +data_root configs\_base_\datasets\ade20k.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\ade20k.py /^data_root = 'data\/ade\/ADEChallengeData2016'$/;" v +dataset_type configs\_base_\datasets\ade20k.py /^dataset_type = 'ADE20KDataset'$/;" v +flip configs\_base_\datasets\ade20k.py /^ flip=False,$/;" v +img_dir configs\_base_\datasets\ade20k.py /^ img_dir='images\/training',$/;" v +img_dir configs\_base_\datasets\ade20k.py /^ img_dir='images\/validation',$/;" v +img_norm_cfg configs\_base_\datasets\ade20k.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\ade20k.py /^ img_scale=(2048, 512),$/;" v +pipeline configs\_base_\datasets\ade20k.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\_base_\datasets\ade20k.py /^ pipeline=test_pipeline),$/;" v +pipeline configs\_base_\datasets\ade20k.py /^ pipeline=train_pipeline),$/;" v +samples_per_gpu configs\_base_\datasets\ade20k.py /^ samples_per_gpu=4,$/;" v +test configs\_base_\datasets\ade20k.py /^ test=dict($/;" v +test_pipeline configs\_base_\datasets\ade20k.py /^test_pipeline = [$/;" v +train configs\_base_\datasets\ade20k.py /^ train=dict($/;" v +train_pipeline configs\_base_\datasets\ade20k.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\ade20k.py /^ transforms=[$/;" v +type configs\_base_\datasets\ade20k.py /^ type='MultiScaleFlipAug',$/;" v +type configs\_base_\datasets\ade20k.py /^ type=dataset_type,$/;" v +val configs\_base_\datasets\ade20k.py /^ val=dict($/;" v +workers_per_gpu configs\_base_\datasets\ade20k.py /^ workers_per_gpu=4,$/;" v +ann_dir configs\_base_\datasets\chase_db1.py /^ ann_dir='annotations\/training',$/;" v +ann_dir configs\_base_\datasets\chase_db1.py /^ ann_dir='annotations\/validation',$/;" v +crop_size configs\_base_\datasets\chase_db1.py /^crop_size = (128, 128)$/;" v +data configs\_base_\datasets\chase_db1.py /^data = dict($/;" v +data_root configs\_base_\datasets\chase_db1.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\chase_db1.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\chase_db1.py /^data_root = 'data\/CHASE_DB1'$/;" v +dataset configs\_base_\datasets\chase_db1.py /^ dataset=dict($/;" v +dataset_type configs\_base_\datasets\chase_db1.py /^dataset_type = 'ChaseDB1Dataset'$/;" v +flip configs\_base_\datasets\chase_db1.py /^ flip=False,$/;" v +img_dir configs\_base_\datasets\chase_db1.py /^ img_dir='images\/training',$/;" v +img_dir configs\_base_\datasets\chase_db1.py /^ img_dir='images\/validation',$/;" v +img_norm_cfg configs\_base_\datasets\chase_db1.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\chase_db1.py /^ img_scale=img_scale,$/;" v +img_scale configs\_base_\datasets\chase_db1.py /^img_scale = (960, 999)$/;" v +pipeline configs\_base_\datasets\chase_db1.py /^ pipeline=train_pipeline)),$/;" v +pipeline configs\_base_\datasets\chase_db1.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\_base_\datasets\chase_db1.py /^ pipeline=test_pipeline),$/;" v +samples_per_gpu configs\_base_\datasets\chase_db1.py /^ samples_per_gpu=4,$/;" v +test configs\_base_\datasets\chase_db1.py /^ test=dict($/;" v +test_pipeline configs\_base_\datasets\chase_db1.py /^test_pipeline = [$/;" v +times configs\_base_\datasets\chase_db1.py /^ times=40000,$/;" v +train configs\_base_\datasets\chase_db1.py /^ train=dict($/;" v +train_pipeline configs\_base_\datasets\chase_db1.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\chase_db1.py /^ transforms=[$/;" v +type configs\_base_\datasets\chase_db1.py /^ type=dataset_type,$/;" v +type configs\_base_\datasets\chase_db1.py /^ type='MultiScaleFlipAug',$/;" v +type configs\_base_\datasets\chase_db1.py /^ type='RepeatDataset',$/;" v +type configs\_base_\datasets\chase_db1.py /^ type=dataset_type,$/;" v +val configs\_base_\datasets\chase_db1.py /^ val=dict($/;" v +workers_per_gpu configs\_base_\datasets\chase_db1.py /^ workers_per_gpu=4,$/;" v +ann_dir configs\_base_\datasets\cityscapes.py /^ ann_dir='gtFine\/train',$/;" v +ann_dir configs\_base_\datasets\cityscapes.py /^ ann_dir='gtFine\/val',$/;" v +crop_size configs\_base_\datasets\cityscapes.py /^crop_size = (512, 1024)$/;" v +data configs\_base_\datasets\cityscapes.py /^data = dict($/;" v +data_root configs\_base_\datasets\cityscapes.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\cityscapes.py /^data_root = 'data\/cityscapes\/'$/;" v +dataset_type configs\_base_\datasets\cityscapes.py /^dataset_type = 'CityscapesDataset'$/;" v +flip configs\_base_\datasets\cityscapes.py /^ flip=False,$/;" v +img_dir configs\_base_\datasets\cityscapes.py /^ img_dir='leftImg8bit\/train',$/;" v +img_dir configs\_base_\datasets\cityscapes.py /^ img_dir='leftImg8bit\/val',$/;" v +img_norm_cfg configs\_base_\datasets\cityscapes.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\cityscapes.py /^ img_scale=(2048, 1024),$/;" v +pipeline configs\_base_\datasets\cityscapes.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\_base_\datasets\cityscapes.py /^ pipeline=test_pipeline),$/;" v +pipeline configs\_base_\datasets\cityscapes.py /^ pipeline=train_pipeline),$/;" v +samples_per_gpu configs\_base_\datasets\cityscapes.py /^ samples_per_gpu=2,$/;" v +test configs\_base_\datasets\cityscapes.py /^ test=dict($/;" v +test_pipeline configs\_base_\datasets\cityscapes.py /^test_pipeline = [$/;" v +train configs\_base_\datasets\cityscapes.py /^ train=dict($/;" v +train_pipeline configs\_base_\datasets\cityscapes.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\cityscapes.py /^ transforms=[$/;" v +type configs\_base_\datasets\cityscapes.py /^ type='MultiScaleFlipAug',$/;" v +type configs\_base_\datasets\cityscapes.py /^ type=dataset_type,$/;" v +val configs\_base_\datasets\cityscapes.py /^ val=dict($/;" v +workers_per_gpu configs\_base_\datasets\cityscapes.py /^ workers_per_gpu=2,$/;" v +_base_ configs\_base_\datasets\cityscapes_769x769.py /^_base_ = '.\/cityscapes.py'$/;" v +crop_size configs\_base_\datasets\cityscapes_769x769.py /^crop_size = (769, 769)$/;" v +data configs\_base_\datasets\cityscapes_769x769.py /^data = dict($/;" v +flip configs\_base_\datasets\cityscapes_769x769.py /^ flip=False,$/;" v +img_norm_cfg configs\_base_\datasets\cityscapes_769x769.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\cityscapes_769x769.py /^ img_scale=(2049, 1025),$/;" v +test configs\_base_\datasets\cityscapes_769x769.py /^ test=dict(pipeline=test_pipeline))$/;" v +test_pipeline configs\_base_\datasets\cityscapes_769x769.py /^test_pipeline = [$/;" v +train configs\_base_\datasets\cityscapes_769x769.py /^ train=dict(pipeline=train_pipeline),$/;" v +train_pipeline configs\_base_\datasets\cityscapes_769x769.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\cityscapes_769x769.py /^ transforms=[$/;" v +type configs\_base_\datasets\cityscapes_769x769.py /^ type='MultiScaleFlipAug',$/;" v +val configs\_base_\datasets\cityscapes_769x769.py /^ val=dict(pipeline=test_pipeline),$/;" v +ann_dir configs\_base_\datasets\drive.py /^ ann_dir='annotations\/training',$/;" v +ann_dir configs\_base_\datasets\drive.py /^ ann_dir='annotations\/validation',$/;" v +crop_size configs\_base_\datasets\drive.py /^crop_size = (64, 64)$/;" v +data configs\_base_\datasets\drive.py /^data = dict($/;" v +data_root configs\_base_\datasets\drive.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\drive.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\drive.py /^data_root = 'data\/DRIVE'$/;" v +dataset configs\_base_\datasets\drive.py /^ dataset=dict($/;" v +dataset_type configs\_base_\datasets\drive.py /^dataset_type = 'DRIVEDataset'$/;" v +flip configs\_base_\datasets\drive.py /^ flip=False,$/;" v +img_dir configs\_base_\datasets\drive.py /^ img_dir='images\/training',$/;" v +img_dir configs\_base_\datasets\drive.py /^ img_dir='images\/validation',$/;" v +img_norm_cfg configs\_base_\datasets\drive.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\drive.py /^ img_scale=img_scale,$/;" v +img_scale configs\_base_\datasets\drive.py /^img_scale = (584, 565)$/;" v +pipeline configs\_base_\datasets\drive.py /^ pipeline=train_pipeline)),$/;" v +pipeline configs\_base_\datasets\drive.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\_base_\datasets\drive.py /^ pipeline=test_pipeline),$/;" v +samples_per_gpu configs\_base_\datasets\drive.py /^ samples_per_gpu=4,$/;" v +test configs\_base_\datasets\drive.py /^ test=dict($/;" v +test_pipeline configs\_base_\datasets\drive.py /^test_pipeline = [$/;" v +times configs\_base_\datasets\drive.py /^ times=40000,$/;" v +train configs\_base_\datasets\drive.py /^ train=dict($/;" v +train_pipeline configs\_base_\datasets\drive.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\drive.py /^ transforms=[$/;" v +type configs\_base_\datasets\drive.py /^ type=dataset_type,$/;" v +type configs\_base_\datasets\drive.py /^ type='MultiScaleFlipAug',$/;" v +type configs\_base_\datasets\drive.py /^ type='RepeatDataset',$/;" v +type configs\_base_\datasets\drive.py /^ type=dataset_type,$/;" v +val configs\_base_\datasets\drive.py /^ val=dict($/;" v +workers_per_gpu configs\_base_\datasets\drive.py /^ workers_per_gpu=4,$/;" v +ann_dir configs\_base_\datasets\hrf.py /^ ann_dir='annotations\/training',$/;" v +ann_dir configs\_base_\datasets\hrf.py /^ ann_dir='annotations\/validation',$/;" v +crop_size configs\_base_\datasets\hrf.py /^crop_size = (256, 256)$/;" v +data configs\_base_\datasets\hrf.py /^data = dict($/;" v +data_root configs\_base_\datasets\hrf.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\hrf.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\hrf.py /^data_root = 'data\/HRF'$/;" v +dataset configs\_base_\datasets\hrf.py /^ dataset=dict($/;" v +dataset_type configs\_base_\datasets\hrf.py /^dataset_type = 'HRFDataset'$/;" v +flip configs\_base_\datasets\hrf.py /^ flip=False,$/;" v +img_dir configs\_base_\datasets\hrf.py /^ img_dir='images\/training',$/;" v +img_dir configs\_base_\datasets\hrf.py /^ img_dir='images\/validation',$/;" v +img_norm_cfg configs\_base_\datasets\hrf.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\hrf.py /^ img_scale=img_scale,$/;" v +img_scale configs\_base_\datasets\hrf.py /^img_scale = (2336, 3504)$/;" v +pipeline configs\_base_\datasets\hrf.py /^ pipeline=train_pipeline)),$/;" v +pipeline configs\_base_\datasets\hrf.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\_base_\datasets\hrf.py /^ pipeline=test_pipeline),$/;" v +samples_per_gpu configs\_base_\datasets\hrf.py /^ samples_per_gpu=4,$/;" v +test configs\_base_\datasets\hrf.py /^ test=dict($/;" v +test_pipeline configs\_base_\datasets\hrf.py /^test_pipeline = [$/;" v +times configs\_base_\datasets\hrf.py /^ times=40000,$/;" v +train configs\_base_\datasets\hrf.py /^ train=dict($/;" v +train_pipeline configs\_base_\datasets\hrf.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\hrf.py /^ transforms=[$/;" v +type configs\_base_\datasets\hrf.py /^ type=dataset_type,$/;" v +type configs\_base_\datasets\hrf.py /^ type='MultiScaleFlipAug',$/;" v +type configs\_base_\datasets\hrf.py /^ type='RepeatDataset',$/;" v +type configs\_base_\datasets\hrf.py /^ type=dataset_type,$/;" v +val configs\_base_\datasets\hrf.py /^ val=dict($/;" v +workers_per_gpu configs\_base_\datasets\hrf.py /^ workers_per_gpu=4,$/;" v +ann_dir configs\_base_\datasets\pascal_context.py /^ ann_dir='SegmentationClassContext',$/;" v +crop_size configs\_base_\datasets\pascal_context.py /^crop_size = (480, 480)$/;" v +data configs\_base_\datasets\pascal_context.py /^data = dict($/;" v +data_root configs\_base_\datasets\pascal_context.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\pascal_context.py /^data_root = 'data\/VOCdevkit\/VOC2010\/'$/;" v +dataset_type configs\_base_\datasets\pascal_context.py /^dataset_type = 'PascalContextDataset'$/;" v +flip configs\_base_\datasets\pascal_context.py /^ flip=False,$/;" v +img_dir configs\_base_\datasets\pascal_context.py /^ img_dir='JPEGImages',$/;" v +img_norm_cfg configs\_base_\datasets\pascal_context.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\pascal_context.py /^ img_scale=img_scale,$/;" v +img_scale configs\_base_\datasets\pascal_context.py /^img_scale = (520, 520)$/;" v +pipeline configs\_base_\datasets\pascal_context.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\_base_\datasets\pascal_context.py /^ pipeline=test_pipeline),$/;" v +pipeline configs\_base_\datasets\pascal_context.py /^ pipeline=train_pipeline),$/;" v +samples_per_gpu configs\_base_\datasets\pascal_context.py /^ samples_per_gpu=4,$/;" v +split configs\_base_\datasets\pascal_context.py /^ split='ImageSets\/SegmentationContext\/train.txt',$/;" v +split configs\_base_\datasets\pascal_context.py /^ split='ImageSets\/SegmentationContext\/val.txt',$/;" v +test configs\_base_\datasets\pascal_context.py /^ test=dict($/;" v +test_pipeline configs\_base_\datasets\pascal_context.py /^test_pipeline = [$/;" v +train configs\_base_\datasets\pascal_context.py /^ train=dict($/;" v +train_pipeline configs\_base_\datasets\pascal_context.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\pascal_context.py /^ transforms=[$/;" v +type configs\_base_\datasets\pascal_context.py /^ type='MultiScaleFlipAug',$/;" v +type configs\_base_\datasets\pascal_context.py /^ type=dataset_type,$/;" v +val configs\_base_\datasets\pascal_context.py /^ val=dict($/;" v +workers_per_gpu configs\_base_\datasets\pascal_context.py /^ workers_per_gpu=4,$/;" v +ann_dir configs\_base_\datasets\pascal_voc12.py /^ ann_dir='SegmentationClass',$/;" v +crop_size configs\_base_\datasets\pascal_voc12.py /^crop_size = (512, 512)$/;" v +data configs\_base_\datasets\pascal_voc12.py /^data = dict($/;" v +data_root configs\_base_\datasets\pascal_voc12.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\pascal_voc12.py /^data_root = 'data\/VOCdevkit\/VOC2012'$/;" v +dataset_type configs\_base_\datasets\pascal_voc12.py /^dataset_type = 'PascalVOCDataset'$/;" v +flip configs\_base_\datasets\pascal_voc12.py /^ flip=False,$/;" v +img_dir configs\_base_\datasets\pascal_voc12.py /^ img_dir='JPEGImages',$/;" v +img_norm_cfg configs\_base_\datasets\pascal_voc12.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\pascal_voc12.py /^ img_scale=(2048, 512),$/;" v +pipeline configs\_base_\datasets\pascal_voc12.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\_base_\datasets\pascal_voc12.py /^ pipeline=test_pipeline),$/;" v +pipeline configs\_base_\datasets\pascal_voc12.py /^ pipeline=train_pipeline),$/;" v +samples_per_gpu configs\_base_\datasets\pascal_voc12.py /^ samples_per_gpu=4,$/;" v +split configs\_base_\datasets\pascal_voc12.py /^ split='ImageSets\/Segmentation\/train.txt',$/;" v +split configs\_base_\datasets\pascal_voc12.py /^ split='ImageSets\/Segmentation\/val.txt',$/;" v +test configs\_base_\datasets\pascal_voc12.py /^ test=dict($/;" v +test_pipeline configs\_base_\datasets\pascal_voc12.py /^test_pipeline = [$/;" v +train configs\_base_\datasets\pascal_voc12.py /^ train=dict($/;" v +train_pipeline configs\_base_\datasets\pascal_voc12.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\pascal_voc12.py /^ transforms=[$/;" v +type configs\_base_\datasets\pascal_voc12.py /^ type='MultiScaleFlipAug',$/;" v +type configs\_base_\datasets\pascal_voc12.py /^ type=dataset_type,$/;" v +val configs\_base_\datasets\pascal_voc12.py /^ val=dict($/;" v +workers_per_gpu configs\_base_\datasets\pascal_voc12.py /^ workers_per_gpu=4,$/;" v +_base_ configs\_base_\datasets\pascal_voc12_aug.py /^_base_ = '.\/pascal_voc12.py'$/;" v +ann_dir configs\_base_\datasets\pascal_voc12_aug.py /^ ann_dir=['SegmentationClass', 'SegmentationClassAug'],$/;" v +data configs\_base_\datasets\pascal_voc12_aug.py /^data = dict($/;" v +split configs\_base_\datasets\pascal_voc12_aug.py /^ split=[$/;" v +train configs\_base_\datasets\pascal_voc12_aug.py /^ train=dict($/;" v +ann_dir configs\_base_\datasets\stare.py /^ ann_dir='annotations\/training',$/;" v +ann_dir configs\_base_\datasets\stare.py /^ ann_dir='annotations\/validation',$/;" v +crop_size configs\_base_\datasets\stare.py /^crop_size = (128, 128)$/;" v +data configs\_base_\datasets\stare.py /^data = dict($/;" v +data_root configs\_base_\datasets\stare.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\stare.py /^ data_root=data_root,$/;" v +data_root configs\_base_\datasets\stare.py /^data_root = 'data\/STARE'$/;" v +dataset configs\_base_\datasets\stare.py /^ dataset=dict($/;" v +dataset_type configs\_base_\datasets\stare.py /^dataset_type = 'STAREDataset'$/;" v +flip configs\_base_\datasets\stare.py /^ flip=False,$/;" v +img_dir configs\_base_\datasets\stare.py /^ img_dir='images\/training',$/;" v +img_dir configs\_base_\datasets\stare.py /^ img_dir='images\/validation',$/;" v +img_norm_cfg configs\_base_\datasets\stare.py /^img_norm_cfg = dict($/;" v +img_scale configs\_base_\datasets\stare.py /^ img_scale=img_scale,$/;" v +img_scale configs\_base_\datasets\stare.py /^img_scale = (605, 700)$/;" v +pipeline configs\_base_\datasets\stare.py /^ pipeline=train_pipeline)),$/;" v +pipeline configs\_base_\datasets\stare.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\_base_\datasets\stare.py /^ pipeline=test_pipeline),$/;" v +samples_per_gpu configs\_base_\datasets\stare.py /^ samples_per_gpu=4,$/;" v +test configs\_base_\datasets\stare.py /^ test=dict($/;" v +test_pipeline configs\_base_\datasets\stare.py /^test_pipeline = [$/;" v +times configs\_base_\datasets\stare.py /^ times=40000,$/;" v +train configs\_base_\datasets\stare.py /^ train=dict($/;" v +train_pipeline configs\_base_\datasets\stare.py /^train_pipeline = [$/;" v +transforms configs\_base_\datasets\stare.py /^ transforms=[$/;" v +type configs\_base_\datasets\stare.py /^ type=dataset_type,$/;" v +type configs\_base_\datasets\stare.py /^ type='MultiScaleFlipAug',$/;" v +type configs\_base_\datasets\stare.py /^ type='RepeatDataset',$/;" v +type configs\_base_\datasets\stare.py /^ type=dataset_type,$/;" v +val configs\_base_\datasets\stare.py /^ val=dict($/;" v +workers_per_gpu configs\_base_\datasets\stare.py /^ workers_per_gpu=4,$/;" v +cudnn_benchmark configs\_base_\default_runtime.py /^cudnn_benchmark = True$/;" v +dist_params configs\_base_\default_runtime.py /^dist_params = dict(backend='nccl')$/;" v +hooks configs\_base_\default_runtime.py /^ hooks=[$/;" v +interval configs\_base_\default_runtime.py /^ interval=50,$/;" v +load_from configs\_base_\default_runtime.py /^load_from = None$/;" v +log_config configs\_base_\default_runtime.py /^log_config = dict($/;" v +log_level configs\_base_\default_runtime.py /^log_level = 'INFO'$/;" v +resume_from configs\_base_\default_runtime.py /^resume_from = None$/;" v +workflow configs\_base_\default_runtime.py /^workflow = [('train', 1)]$/;" v +align_corners configs\_base_\models\ann_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\ann_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\ann_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\ann_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\ann_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\ann_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\ann_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\ann_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\ann_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\ann_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\ann_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\ann_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\ann_r50-d8.py /^ in_channels=[1024, 2048],$/;" v +in_index configs\_base_\models\ann_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\ann_r50-d8.py /^ in_index=[2, 3],$/;" v +key_pool_scales configs\_base_\models\ann_r50-d8.py /^ key_pool_scales=(1, 3, 6, 8),$/;" v +loss_decode configs\_base_\models\ann_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\ann_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\ann_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\ann_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\ann_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\ann_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\ann_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\ann_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\ann_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\ann_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +project_channels configs\_base_\models\ann_r50-d8.py /^ project_channels=256,$/;" v +query_scales configs\_base_\models\ann_r50-d8.py /^ query_scales=(1, ),$/;" v +strides configs\_base_\models\ann_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\ann_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\ann_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\ann_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\ann_r50-d8.py /^ type='ANNHead',$/;" v +type configs\_base_\models\ann_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\ann_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\ann_r50-d8.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\apcnet_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\apcnet_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\apcnet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\apcnet_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\apcnet_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\apcnet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\apcnet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\apcnet_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\apcnet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\apcnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\apcnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\apcnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\apcnet_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\apcnet_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\apcnet_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\apcnet_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\apcnet_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\apcnet_r50-d8.py /^ norm_cfg=dict(type='SyncBN', requires_grad=True),$/;" v +norm_cfg configs\_base_\models\apcnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\apcnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\apcnet_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\apcnet_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\apcnet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\apcnet_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\apcnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pool_scales configs\_base_\models\apcnet_r50-d8.py /^ pool_scales=(1, 2, 3, 6),$/;" v +pretrained configs\_base_\models\apcnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\apcnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\apcnet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\apcnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\apcnet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\apcnet_r50-d8.py /^ type='APCHead',$/;" v +type configs\_base_\models\apcnet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\apcnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\apcnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\ccnet_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\ccnet_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\ccnet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\ccnet_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\ccnet_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\ccnet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\ccnet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\ccnet_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\ccnet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\ccnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\ccnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\ccnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\ccnet_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\ccnet_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\ccnet_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\ccnet_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\ccnet_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\ccnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\ccnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\ccnet_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\ccnet_r50-d8.py /^ num_classes=104,$/;" v +num_convs configs\_base_\models\ccnet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\ccnet_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\ccnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\ccnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +recurrence configs\_base_\models\ccnet_r50-d8.py /^ recurrence=2,$/;" v +strides configs\_base_\models\ccnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\ccnet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\ccnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\ccnet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\ccnet_r50-d8.py /^ type='CCHead',$/;" v +type configs\_base_\models\ccnet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\ccnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\ccnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +backbone configs\_base_\models\cgnet.py /^ backbone=dict($/;" v +channels configs\_base_\models\cgnet.py /^ channels=256,$/;" v +class_weight configs\_base_\models\cgnet.py /^ class_weight=[$/;" v +concat_input configs\_base_\models\cgnet.py /^ concat_input=False,$/;" v +decode_head configs\_base_\models\cgnet.py /^ decode_head=dict($/;" v +dilations configs\_base_\models\cgnet.py /^ dilations=(2, 4),$/;" v +dropout_ratio configs\_base_\models\cgnet.py /^ dropout_ratio=0,$/;" v +in_channels configs\_base_\models\cgnet.py /^ in_channels=256,$/;" v +in_channels configs\_base_\models\cgnet.py /^ in_channels=3,$/;" v +in_index configs\_base_\models\cgnet.py /^ in_index=2,$/;" v +loss_decode configs\_base_\models\cgnet.py /^ loss_decode=dict($/;" v +loss_weight configs\_base_\models\cgnet.py /^ loss_weight=1.0,$/;" v +model configs\_base_\models\cgnet.py /^model = dict($/;" v +norm_cfg configs\_base_\models\cgnet.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\cgnet.py /^norm_cfg = dict(type='SyncBN', eps=1e-03, requires_grad=True)$/;" v +num_blocks configs\_base_\models\cgnet.py /^ num_blocks=(3, 21),$/;" v +num_channels configs\_base_\models\cgnet.py /^ num_channels=(32, 64, 128),$/;" v +num_classes configs\_base_\models\cgnet.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\cgnet.py /^ num_convs=0,$/;" v +reductions configs\_base_\models\cgnet.py /^ reductions=(8, 16)),$/;" v +test_cfg configs\_base_\models\cgnet.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\cgnet.py /^ train_cfg=dict(sampler=None),$/;" v +type configs\_base_\models\cgnet.py /^ type='CrossEntropyLoss',$/;" v +type configs\_base_\models\cgnet.py /^ type='CGNet',$/;" v +type configs\_base_\models\cgnet.py /^ type='FCNHead',$/;" v +type configs\_base_\models\cgnet.py /^ type='EncoderDecoder',$/;" v +use_sigmoid configs\_base_\models\cgnet.py /^ use_sigmoid=False,$/;" v +align_corners configs\_base_\models\danet_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\danet_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\danet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\danet_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\danet_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\danet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\danet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\danet_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\danet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\danet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\danet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\danet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\danet_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\danet_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\danet_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\danet_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\danet_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\danet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\danet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\danet_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\danet_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\danet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\danet_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\danet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pam_channels configs\_base_\models\danet_r50-d8.py /^ pam_channels=64,$/;" v +pretrained configs\_base_\models\danet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\danet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\danet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\danet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\danet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\danet_r50-d8.py /^ type='DAHead',$/;" v +type configs\_base_\models\danet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\danet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\danet_r50-d8.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\deeplabv3_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\deeplabv3_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\deeplabv3_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\deeplabv3_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\deeplabv3_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\deeplabv3_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\deeplabv3_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\deeplabv3_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\deeplabv3_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\deeplabv3_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations configs\_base_\models\deeplabv3_r50-d8.py /^ dilations=(1, 12, 24, 36),$/;" v +dropout_ratio configs\_base_\models\deeplabv3_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\deeplabv3_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\deeplabv3_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\deeplabv3_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\deeplabv3_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\deeplabv3_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\deeplabv3_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\deeplabv3_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\deeplabv3_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\deeplabv3_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\deeplabv3_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\deeplabv3_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\deeplabv3_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\deeplabv3_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\deeplabv3_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\deeplabv3_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\deeplabv3_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\deeplabv3_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\deeplabv3_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\deeplabv3_r50-d8.py /^ type='ASPPHead',$/;" v +type configs\_base_\models\deeplabv3_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\deeplabv3_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\deeplabv3_r50-d8.py /^ type='EncoderDecoder',$/;" v +act_cfg configs\_base_\models\deeplabv3_unet_s5-d16.py /^ act_cfg=dict(type='ReLU'),$/;" v +align_corners configs\_base_\models\deeplabv3_unet_s5-d16.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\deeplabv3_unet_s5-d16.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\deeplabv3_unet_s5-d16.py /^ backbone=dict($/;" v +base_channels configs\_base_\models\deeplabv3_unet_s5-d16.py /^ base_channels=64,$/;" v +channels configs\_base_\models\deeplabv3_unet_s5-d16.py /^ channels=16,$/;" v +channels configs\_base_\models\deeplabv3_unet_s5-d16.py /^ channels=64,$/;" v +concat_input configs\_base_\models\deeplabv3_unet_s5-d16.py /^ concat_input=False,$/;" v +conv_cfg configs\_base_\models\deeplabv3_unet_s5-d16.py /^ conv_cfg=None,$/;" v +dec_dilations configs\_base_\models\deeplabv3_unet_s5-d16.py /^ dec_dilations=(1, 1, 1, 1),$/;" v +dec_num_convs configs\_base_\models\deeplabv3_unet_s5-d16.py /^ dec_num_convs=(2, 2, 2, 2),$/;" v +decode_head configs\_base_\models\deeplabv3_unet_s5-d16.py /^ decode_head=dict($/;" v +dilations configs\_base_\models\deeplabv3_unet_s5-d16.py /^ dilations=(1, 12, 24, 36),$/;" v +downsamples configs\_base_\models\deeplabv3_unet_s5-d16.py /^ downsamples=(True, True, True, True),$/;" v +dropout_ratio configs\_base_\models\deeplabv3_unet_s5-d16.py /^ dropout_ratio=0.1,$/;" v +enc_dilations configs\_base_\models\deeplabv3_unet_s5-d16.py /^ enc_dilations=(1, 1, 1, 1, 1),$/;" v +enc_num_convs configs\_base_\models\deeplabv3_unet_s5-d16.py /^ enc_num_convs=(2, 2, 2, 2, 2),$/;" v +in_channels configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_channels=128,$/;" v +in_channels configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_channels=3,$/;" v +in_channels configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_channels=64,$/;" v +in_index configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_index=3,$/;" v +in_index configs\_base_\models\deeplabv3_unet_s5-d16.py /^ in_index=4,$/;" v +loss_decode configs\_base_\models\deeplabv3_unet_s5-d16.py /^ loss_decode=dict($/;" v +model configs\_base_\models\deeplabv3_unet_s5-d16.py /^model = dict($/;" v +norm_cfg configs\_base_\models\deeplabv3_unet_s5-d16.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\deeplabv3_unet_s5-d16.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\deeplabv3_unet_s5-d16.py /^ norm_eval=False),$/;" v +num_classes configs\_base_\models\deeplabv3_unet_s5-d16.py /^ num_classes=2,$/;" v +num_convs configs\_base_\models\deeplabv3_unet_s5-d16.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\deeplabv3_unet_s5-d16.py /^ num_stages=5,$/;" v +pretrained configs\_base_\models\deeplabv3_unet_s5-d16.py /^ pretrained=None,$/;" v +strides configs\_base_\models\deeplabv3_unet_s5-d16.py /^ strides=(1, 1, 1, 1, 1),$/;" v +test_cfg configs\_base_\models\deeplabv3_unet_s5-d16.py /^ test_cfg=dict(mode='slide', crop_size=256, stride=170))$/;" v +train_cfg configs\_base_\models\deeplabv3_unet_s5-d16.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\deeplabv3_unet_s5-d16.py /^ type='ASPPHead',$/;" v +type configs\_base_\models\deeplabv3_unet_s5-d16.py /^ type='FCNHead',$/;" v +type configs\_base_\models\deeplabv3_unet_s5-d16.py /^ type='UNet',$/;" v +type configs\_base_\models\deeplabv3_unet_s5-d16.py /^ type='EncoderDecoder',$/;" v +upsample_cfg configs\_base_\models\deeplabv3_unet_s5-d16.py /^ upsample_cfg=dict(type='InterpConv'),$/;" v +with_cp configs\_base_\models\deeplabv3_unet_s5-d16.py /^ with_cp=False,$/;" v +align_corners configs\_base_\models\deeplabv3plus_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\deeplabv3plus_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\deeplabv3plus_r50-d8.py /^ backbone=dict($/;" v +c1_channels configs\_base_\models\deeplabv3plus_r50-d8.py /^ c1_channels=48,$/;" v +c1_in_channels configs\_base_\models\deeplabv3plus_r50-d8.py /^ c1_in_channels=256,$/;" v +channels configs\_base_\models\deeplabv3plus_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\deeplabv3plus_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\deeplabv3plus_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\deeplabv3plus_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\deeplabv3plus_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\deeplabv3plus_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\deeplabv3plus_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dilations configs\_base_\models\deeplabv3plus_r50-d8.py /^ dilations=(1, 12, 24, 36),$/;" v +dropout_ratio configs\_base_\models\deeplabv3plus_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\deeplabv3plus_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\deeplabv3plus_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\deeplabv3plus_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\deeplabv3plus_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\deeplabv3plus_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\deeplabv3plus_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\deeplabv3plus_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\deeplabv3plus_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\deeplabv3plus_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\deeplabv3plus_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\deeplabv3plus_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\deeplabv3plus_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\deeplabv3plus_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\deeplabv3plus_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\deeplabv3plus_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\deeplabv3plus_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\deeplabv3plus_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\deeplabv3plus_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\deeplabv3plus_r50-d8.py /^ type='DepthwiseSeparableASPPHead',$/;" v +type configs\_base_\models\deeplabv3plus_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\deeplabv3plus_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\deeplabv3plus_r50-d8.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\dmnet_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\dmnet_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\dmnet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\dmnet_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\dmnet_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\dmnet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\dmnet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\dmnet_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\dmnet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\dmnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\dmnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +filter_sizes configs\_base_\models\dmnet_r50-d8.py /^ filter_sizes=(1, 3, 5, 7),$/;" v +in_channels configs\_base_\models\dmnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\dmnet_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\dmnet_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\dmnet_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\dmnet_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\dmnet_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\dmnet_r50-d8.py /^ norm_cfg=dict(type='SyncBN', requires_grad=True),$/;" v +norm_cfg configs\_base_\models\dmnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\dmnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\dmnet_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\dmnet_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\dmnet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\dmnet_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\dmnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\dmnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\dmnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\dmnet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\dmnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\dmnet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\dmnet_r50-d8.py /^ type='DMHead',$/;" v +type configs\_base_\models\dmnet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\dmnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\dmnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\dnl_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\dnl_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\dnl_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\dnl_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\dnl_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\dnl_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\dnl_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\dnl_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\dnl_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\dnl_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\dnl_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\dnl_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\dnl_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\dnl_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\dnl_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\dnl_r50-d8.py /^ loss_decode=dict($/;" v +mode configs\_base_\models\dnl_r50-d8.py /^ mode='embedded_gaussian',$/;" v +model configs\_base_\models\dnl_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\dnl_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\dnl_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\dnl_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\dnl_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\dnl_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\dnl_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\dnl_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\dnl_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +reduction configs\_base_\models\dnl_r50-d8.py /^ reduction=2,$/;" v +strides configs\_base_\models\dnl_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\dnl_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\dnl_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\dnl_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\dnl_r50-d8.py /^ type='DNLHead',$/;" v +type configs\_base_\models\dnl_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\dnl_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\dnl_r50-d8.py /^ type='EncoderDecoder',$/;" v +use_scale configs\_base_\models\dnl_r50-d8.py /^ use_scale=True,$/;" v +align_corners configs\_base_\models\emanet_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\emanet_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\emanet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\emanet_r50-d8.py /^ channels=256,$/;" v +concat_input configs\_base_\models\emanet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\emanet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\emanet_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\emanet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\emanet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\emanet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +ema_channels configs\_base_\models\emanet_r50-d8.py /^ ema_channels=512,$/;" v +in_channels configs\_base_\models\emanet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\emanet_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\emanet_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\emanet_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\emanet_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\emanet_r50-d8.py /^model = dict($/;" v +momentum configs\_base_\models\emanet_r50-d8.py /^ momentum=0.1,$/;" v +norm_cfg configs\_base_\models\emanet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\emanet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\emanet_r50-d8.py /^ norm_eval=False,$/;" v +num_bases configs\_base_\models\emanet_r50-d8.py /^ num_bases=64,$/;" v +num_classes configs\_base_\models\emanet_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\emanet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\emanet_r50-d8.py /^ num_stages=3,$/;" v +num_stages configs\_base_\models\emanet_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\emanet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\emanet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\emanet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\emanet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\emanet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\emanet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\emanet_r50-d8.py /^ type='EMAHead',$/;" v +type configs\_base_\models\emanet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\emanet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\emanet_r50-d8.py /^ type='EncoderDecoder',$/;" v +add_lateral configs\_base_\models\encnet_r50-d8.py /^ add_lateral=False,$/;" v +align_corners configs\_base_\models\encnet_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\encnet_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\encnet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\encnet_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\encnet_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\encnet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\encnet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\encnet_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\encnet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\encnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\encnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\encnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\encnet_r50-d8.py /^ in_channels=[512, 1024, 2048],$/;" v +in_index configs\_base_\models\encnet_r50-d8.py /^ in_index=(1, 2, 3),$/;" v +in_index configs\_base_\models\encnet_r50-d8.py /^ in_index=2,$/;" v +loss_decode configs\_base_\models\encnet_r50-d8.py /^ loss_decode=dict($/;" v +loss_se_decode configs\_base_\models\encnet_r50-d8.py /^ loss_se_decode=dict($/;" v +model configs\_base_\models\encnet_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\encnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\encnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\encnet_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\encnet_r50-d8.py /^ num_classes=19,$/;" v +num_codes configs\_base_\models\encnet_r50-d8.py /^ num_codes=32,$/;" v +num_convs configs\_base_\models\encnet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\encnet_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\encnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\encnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\encnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\encnet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\encnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\encnet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\encnet_r50-d8.py /^ type='EncHead',$/;" v +type configs\_base_\models\encnet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\encnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\encnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +use_se_loss configs\_base_\models\encnet_r50-d8.py /^ use_se_loss=True,$/;" v +align_corners configs\_base_\models\fast_scnn.py /^ align_corners=False,$/;" v +align_corners configs\_base_\models\fast_scnn.py /^ align_corners=False),$/;" v +align_corners configs\_base_\models\fast_scnn.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\fast_scnn.py /^ auxiliary_head=[$/;" v +backbone configs\_base_\models\fast_scnn.py /^ backbone=dict($/;" v +channels configs\_base_\models\fast_scnn.py /^ channels=32,$/;" v +channels configs\_base_\models\fast_scnn.py /^ channels=128,$/;" v +concat_input configs\_base_\models\fast_scnn.py /^ concat_input=False,$/;" v +concat_input configs\_base_\models\fast_scnn.py /^ concat_input=False,$/;" v +decode_head configs\_base_\models\fast_scnn.py /^ decode_head=dict($/;" v +downsample_dw_channels configs\_base_\models\fast_scnn.py /^ downsample_dw_channels=(32, 48),$/;" v +fusion_out_channels configs\_base_\models\fast_scnn.py /^ fusion_out_channels=128,$/;" v +global_block_channels configs\_base_\models\fast_scnn.py /^ global_block_channels=(64, 96, 128),$/;" v +global_block_strides configs\_base_\models\fast_scnn.py /^ global_block_strides=(2, 2, 1),$/;" v +global_in_channels configs\_base_\models\fast_scnn.py /^ global_in_channels=64,$/;" v +global_out_channels configs\_base_\models\fast_scnn.py /^ global_out_channels=128,$/;" v +higher_in_channels configs\_base_\models\fast_scnn.py /^ higher_in_channels=64,$/;" v +in_channels configs\_base_\models\fast_scnn.py /^ in_channels=128,$/;" v +in_channels configs\_base_\models\fast_scnn.py /^ in_channels=64,$/;" v +in_channels configs\_base_\models\fast_scnn.py /^ in_channels=128,$/;" v +in_index configs\_base_\models\fast_scnn.py /^ in_index=-2,$/;" v +in_index configs\_base_\models\fast_scnn.py /^ in_index=-3,$/;" v +in_index configs\_base_\models\fast_scnn.py /^ in_index=-1,$/;" v +loss_decode configs\_base_\models\fast_scnn.py /^ loss_decode=dict($/;" v +loss_decode configs\_base_\models\fast_scnn.py /^ loss_decode=dict($/;" v +lower_in_channels configs\_base_\models\fast_scnn.py /^ lower_in_channels=128,$/;" v +model configs\_base_\models\fast_scnn.py /^model = dict($/;" v +norm_cfg configs\_base_\models\fast_scnn.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\fast_scnn.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\fast_scnn.py /^norm_cfg = dict(type='SyncBN', requires_grad=True, momentum=0.01)$/;" v +num_classes configs\_base_\models\fast_scnn.py /^ num_classes=19,$/;" v +num_classes configs\_base_\models\fast_scnn.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\fast_scnn.py /^ num_convs=1,$/;" v +out_indices configs\_base_\models\fast_scnn.py /^ out_indices=(0, 1, 2),$/;" v +test_cfg configs\_base_\models\fast_scnn.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\fast_scnn.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\fast_scnn.py /^ type='FCNHead',$/;" v +type configs\_base_\models\fast_scnn.py /^ type='DepthwiseSeparableFCNHead',$/;" v +type configs\_base_\models\fast_scnn.py /^ type='FastSCNN',$/;" v +type configs\_base_\models\fast_scnn.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\fcn_hr18.py /^ align_corners=False,$/;" v +backbone configs\_base_\models\fcn_hr18.py /^ backbone=dict($/;" v +block configs\_base_\models\fcn_hr18.py /^ block='BASIC',$/;" v +block configs\_base_\models\fcn_hr18.py /^ block='BOTTLENECK',$/;" v +channels configs\_base_\models\fcn_hr18.py /^ channels=sum([18, 36, 72, 144]),$/;" v +concat_input configs\_base_\models\fcn_hr18.py /^ concat_input=False,$/;" v +decode_head configs\_base_\models\fcn_hr18.py /^ decode_head=dict($/;" v +dropout_ratio configs\_base_\models\fcn_hr18.py /^ dropout_ratio=-1,$/;" v +extra configs\_base_\models\fcn_hr18.py /^ extra=dict($/;" v +in_channels configs\_base_\models\fcn_hr18.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_index configs\_base_\models\fcn_hr18.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\_base_\models\fcn_hr18.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\_base_\models\fcn_hr18.py /^ kernel_size=1,$/;" v +loss_decode configs\_base_\models\fcn_hr18.py /^ loss_decode=dict($/;" v +model configs\_base_\models\fcn_hr18.py /^model = dict($/;" v +norm_cfg configs\_base_\models\fcn_hr18.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\fcn_hr18.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\fcn_hr18.py /^ norm_eval=False,$/;" v +num_blocks configs\_base_\models\fcn_hr18.py /^ num_blocks=(4, ),$/;" v +num_blocks configs\_base_\models\fcn_hr18.py /^ num_blocks=(4, 4),$/;" v +num_blocks configs\_base_\models\fcn_hr18.py /^ num_blocks=(4, 4, 4),$/;" v +num_blocks configs\_base_\models\fcn_hr18.py /^ num_blocks=(4, 4, 4, 4),$/;" v +num_branches configs\_base_\models\fcn_hr18.py /^ num_branches=1,$/;" v +num_branches configs\_base_\models\fcn_hr18.py /^ num_branches=2,$/;" v +num_branches configs\_base_\models\fcn_hr18.py /^ num_branches=3,$/;" v +num_branches configs\_base_\models\fcn_hr18.py /^ num_branches=4,$/;" v +num_channels configs\_base_\models\fcn_hr18.py /^ num_channels=(18, 36)),$/;" v +num_channels configs\_base_\models\fcn_hr18.py /^ num_channels=(18, 36, 72)),$/;" v +num_channels configs\_base_\models\fcn_hr18.py /^ num_channels=(18, 36, 72, 144)))),$/;" v +num_channels configs\_base_\models\fcn_hr18.py /^ num_channels=(64, )),$/;" v +num_classes configs\_base_\models\fcn_hr18.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\fcn_hr18.py /^ num_convs=1,$/;" v +num_modules configs\_base_\models\fcn_hr18.py /^ num_modules=1,$/;" v +num_modules configs\_base_\models\fcn_hr18.py /^ num_modules=3,$/;" v +num_modules configs\_base_\models\fcn_hr18.py /^ num_modules=4,$/;" v +pretrained configs\_base_\models\fcn_hr18.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18',$/;" v +stage1 configs\_base_\models\fcn_hr18.py /^ stage1=dict($/;" v +stage2 configs\_base_\models\fcn_hr18.py /^ stage2=dict($/;" v +stage3 configs\_base_\models\fcn_hr18.py /^ stage3=dict($/;" v +stage4 configs\_base_\models\fcn_hr18.py /^ stage4=dict($/;" v +test_cfg configs\_base_\models\fcn_hr18.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\fcn_hr18.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\fcn_hr18.py /^ type='FCNHead',$/;" v +type configs\_base_\models\fcn_hr18.py /^ type='HRNet',$/;" v +type configs\_base_\models\fcn_hr18.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\fcn_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\fcn_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\fcn_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\fcn_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\fcn_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\fcn_r50-d8.py /^ concat_input=False,$/;" v +concat_input configs\_base_\models\fcn_r50-d8.py /^ concat_input=True,$/;" v +contract_dilation configs\_base_\models\fcn_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\fcn_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\fcn_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\fcn_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\fcn_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\fcn_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\fcn_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\fcn_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\fcn_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\fcn_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\fcn_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\fcn_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\fcn_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\fcn_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\fcn_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\fcn_r50-d8.py /^ num_convs=1,$/;" v +num_convs configs\_base_\models\fcn_r50-d8.py /^ num_convs=2,$/;" v +num_stages configs\_base_\models\fcn_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\fcn_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\fcn_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\fcn_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\fcn_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\fcn_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\fcn_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\fcn_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\fcn_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\fcn_r50-d8.py /^ type='EncoderDecoder',$/;" v +act_cfg configs\_base_\models\fcn_unet_s5-d16.py /^ act_cfg=dict(type='ReLU'),$/;" v +align_corners configs\_base_\models\fcn_unet_s5-d16.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\fcn_unet_s5-d16.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\fcn_unet_s5-d16.py /^ backbone=dict($/;" v +base_channels configs\_base_\models\fcn_unet_s5-d16.py /^ base_channels=64,$/;" v +channels configs\_base_\models\fcn_unet_s5-d16.py /^ channels=64,$/;" v +concat_input configs\_base_\models\fcn_unet_s5-d16.py /^ concat_input=False,$/;" v +conv_cfg configs\_base_\models\fcn_unet_s5-d16.py /^ conv_cfg=None,$/;" v +dec_dilations configs\_base_\models\fcn_unet_s5-d16.py /^ dec_dilations=(1, 1, 1, 1),$/;" v +dec_num_convs configs\_base_\models\fcn_unet_s5-d16.py /^ dec_num_convs=(2, 2, 2, 2),$/;" v +decode_head configs\_base_\models\fcn_unet_s5-d16.py /^ decode_head=dict($/;" v +downsamples configs\_base_\models\fcn_unet_s5-d16.py /^ downsamples=(True, True, True, True),$/;" v +dropout_ratio configs\_base_\models\fcn_unet_s5-d16.py /^ dropout_ratio=0.1,$/;" v +enc_dilations configs\_base_\models\fcn_unet_s5-d16.py /^ enc_dilations=(1, 1, 1, 1, 1),$/;" v +enc_num_convs configs\_base_\models\fcn_unet_s5-d16.py /^ enc_num_convs=(2, 2, 2, 2, 2),$/;" v +in_channels configs\_base_\models\fcn_unet_s5-d16.py /^ in_channels=128,$/;" v +in_channels configs\_base_\models\fcn_unet_s5-d16.py /^ in_channels=3,$/;" v +in_channels configs\_base_\models\fcn_unet_s5-d16.py /^ in_channels=64,$/;" v +in_index configs\_base_\models\fcn_unet_s5-d16.py /^ in_index=3,$/;" v +in_index configs\_base_\models\fcn_unet_s5-d16.py /^ in_index=4,$/;" v +loss_decode configs\_base_\models\fcn_unet_s5-d16.py /^ loss_decode=dict($/;" v +model configs\_base_\models\fcn_unet_s5-d16.py /^model = dict($/;" v +norm_cfg configs\_base_\models\fcn_unet_s5-d16.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\fcn_unet_s5-d16.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\fcn_unet_s5-d16.py /^ norm_eval=False),$/;" v +num_classes configs\_base_\models\fcn_unet_s5-d16.py /^ num_classes=2,$/;" v +num_convs configs\_base_\models\fcn_unet_s5-d16.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\fcn_unet_s5-d16.py /^ num_stages=5,$/;" v +pretrained configs\_base_\models\fcn_unet_s5-d16.py /^ pretrained=None,$/;" v +strides configs\_base_\models\fcn_unet_s5-d16.py /^ strides=(1, 1, 1, 1, 1),$/;" v +test_cfg configs\_base_\models\fcn_unet_s5-d16.py /^ test_cfg=dict(mode='slide', crop_size=256, stride=170))$/;" v +train_cfg configs\_base_\models\fcn_unet_s5-d16.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\fcn_unet_s5-d16.py /^ type='FCNHead',$/;" v +type configs\_base_\models\fcn_unet_s5-d16.py /^ type='UNet',$/;" v +type configs\_base_\models\fcn_unet_s5-d16.py /^ type='EncoderDecoder',$/;" v +upsample_cfg configs\_base_\models\fcn_unet_s5-d16.py /^ upsample_cfg=dict(type='InterpConv'),$/;" v +with_cp configs\_base_\models\fcn_unet_s5-d16.py /^ with_cp=False,$/;" v +align_corners configs\_base_\models\fpn_r50.py /^ align_corners=False,$/;" v +backbone configs\_base_\models\fpn_r50.py /^ backbone=dict($/;" v +channels configs\_base_\models\fpn_r50.py /^ channels=128,$/;" v +contract_dilation configs\_base_\models\fpn_r50.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\fpn_r50.py /^ decode_head=dict($/;" v +depth configs\_base_\models\fpn_r50.py /^ depth=50,$/;" v +dilations configs\_base_\models\fpn_r50.py /^ dilations=(1, 1, 1, 1),$/;" v +dropout_ratio configs\_base_\models\fpn_r50.py /^ dropout_ratio=0.1,$/;" v +feature_strides configs\_base_\models\fpn_r50.py /^ feature_strides=[4, 8, 16, 32],$/;" v +in_channels configs\_base_\models\fpn_r50.py /^ in_channels=[256, 256, 256, 256],$/;" v +in_channels configs\_base_\models\fpn_r50.py /^ in_channels=[256, 512, 1024, 2048],$/;" v +in_index configs\_base_\models\fpn_r50.py /^ in_index=[0, 1, 2, 3],$/;" v +loss_decode configs\_base_\models\fpn_r50.py /^ loss_decode=dict($/;" v +model configs\_base_\models\fpn_r50.py /^model = dict($/;" v +neck configs\_base_\models\fpn_r50.py /^ neck=dict($/;" v +norm_cfg configs\_base_\models\fpn_r50.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\fpn_r50.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\fpn_r50.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\fpn_r50.py /^ num_classes=19,$/;" v +num_outs configs\_base_\models\fpn_r50.py /^ num_outs=4),$/;" v +num_stages configs\_base_\models\fpn_r50.py /^ num_stages=4,$/;" v +out_channels configs\_base_\models\fpn_r50.py /^ out_channels=256,$/;" v +out_indices configs\_base_\models\fpn_r50.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\fpn_r50.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\fpn_r50.py /^ strides=(1, 2, 2, 2),$/;" v +style configs\_base_\models\fpn_r50.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\fpn_r50.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\fpn_r50.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\fpn_r50.py /^ type='FPN',$/;" v +type configs\_base_\models\fpn_r50.py /^ type='FPNHead',$/;" v +type configs\_base_\models\fpn_r50.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\fpn_r50.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\gcnet_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\gcnet_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\gcnet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\gcnet_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\gcnet_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\gcnet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\gcnet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\gcnet_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\gcnet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\gcnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\gcnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +fusion_types configs\_base_\models\gcnet_r50-d8.py /^ fusion_types=('channel_add', ),$/;" v +in_channels configs\_base_\models\gcnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\gcnet_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\gcnet_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\gcnet_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\gcnet_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\gcnet_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\gcnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\gcnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\gcnet_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\gcnet_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\gcnet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\gcnet_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\gcnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pooling_type configs\_base_\models\gcnet_r50-d8.py /^ pooling_type='att',$/;" v +pretrained configs\_base_\models\gcnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +ratio configs\_base_\models\gcnet_r50-d8.py /^ ratio=1 \/ 4.,$/;" v +strides configs\_base_\models\gcnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\gcnet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\gcnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\gcnet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\gcnet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\gcnet_r50-d8.py /^ type='GCHead',$/;" v +type configs\_base_\models\gcnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\gcnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +act_cfg configs\_base_\models\lraspp_m-v3-d8.py /^ act_cfg=dict(type='ReLU'),$/;" v +align_corners configs\_base_\models\lraspp_m-v3-d8.py /^ align_corners=False,$/;" v +arch configs\_base_\models\lraspp_m-v3-d8.py /^ arch='large',$/;" v +backbone configs\_base_\models\lraspp_m-v3-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\lraspp_m-v3-d8.py /^ channels=128,$/;" v +decode_head configs\_base_\models\lraspp_m-v3-d8.py /^ decode_head=dict($/;" v +dropout_ratio configs\_base_\models\lraspp_m-v3-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\lraspp_m-v3-d8.py /^ in_channels=(16, 24, 960),$/;" v +in_index configs\_base_\models\lraspp_m-v3-d8.py /^ in_index=(0, 1, 2),$/;" v +input_transform configs\_base_\models\lraspp_m-v3-d8.py /^ input_transform='multiple_select',$/;" v +loss_decode configs\_base_\models\lraspp_m-v3-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\lraspp_m-v3-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\lraspp_m-v3-d8.py /^ norm_cfg=norm_cfg),$/;" v +norm_cfg configs\_base_\models\lraspp_m-v3-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\lraspp_m-v3-d8.py /^norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True)$/;" v +num_classes configs\_base_\models\lraspp_m-v3-d8.py /^ num_classes=19,$/;" v +out_indices configs\_base_\models\lraspp_m-v3-d8.py /^ out_indices=(1, 3, 16),$/;" v +test_cfg configs\_base_\models\lraspp_m-v3-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\lraspp_m-v3-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\lraspp_m-v3-d8.py /^ type='LRASPPHead',$/;" v +type configs\_base_\models\lraspp_m-v3-d8.py /^ type='MobileNetV3',$/;" v +type configs\_base_\models\lraspp_m-v3-d8.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\nonlocal_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\nonlocal_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\nonlocal_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\nonlocal_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\nonlocal_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\nonlocal_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\nonlocal_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\nonlocal_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\nonlocal_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\nonlocal_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\nonlocal_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\nonlocal_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\nonlocal_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\nonlocal_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\nonlocal_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\nonlocal_r50-d8.py /^ loss_decode=dict($/;" v +mode configs\_base_\models\nonlocal_r50-d8.py /^ mode='embedded_gaussian',$/;" v +model configs\_base_\models\nonlocal_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\nonlocal_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\nonlocal_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\nonlocal_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\nonlocal_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\nonlocal_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\nonlocal_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\nonlocal_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\nonlocal_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +reduction configs\_base_\models\nonlocal_r50-d8.py /^ reduction=2,$/;" v +strides configs\_base_\models\nonlocal_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\nonlocal_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\nonlocal_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\nonlocal_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\nonlocal_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\nonlocal_r50-d8.py /^ type='NLHead',$/;" v +type configs\_base_\models\nonlocal_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\nonlocal_r50-d8.py /^ type='EncoderDecoder',$/;" v +use_scale configs\_base_\models\nonlocal_r50-d8.py /^ use_scale=True,$/;" v +align_corners configs\_base_\models\ocrnet_hr18.py /^ align_corners=False,$/;" v +backbone configs\_base_\models\ocrnet_hr18.py /^ backbone=dict($/;" v +block configs\_base_\models\ocrnet_hr18.py /^ block='BASIC',$/;" v +block configs\_base_\models\ocrnet_hr18.py /^ block='BOTTLENECK',$/;" v +channels configs\_base_\models\ocrnet_hr18.py /^ channels=512,$/;" v +channels configs\_base_\models\ocrnet_hr18.py /^ channels=sum([18, 36, 72, 144]),$/;" v +concat_input configs\_base_\models\ocrnet_hr18.py /^ concat_input=False,$/;" v +decode_head configs\_base_\models\ocrnet_hr18.py /^ decode_head=[$/;" v +dropout_ratio configs\_base_\models\ocrnet_hr18.py /^ dropout_ratio=-1,$/;" v +extra configs\_base_\models\ocrnet_hr18.py /^ extra=dict($/;" v +in_channels configs\_base_\models\ocrnet_hr18.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_index configs\_base_\models\ocrnet_hr18.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\_base_\models\ocrnet_hr18.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\_base_\models\ocrnet_hr18.py /^ kernel_size=1,$/;" v +loss_decode configs\_base_\models\ocrnet_hr18.py /^ loss_decode=dict($/;" v +model configs\_base_\models\ocrnet_hr18.py /^model = dict($/;" v +norm_cfg configs\_base_\models\ocrnet_hr18.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\ocrnet_hr18.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\ocrnet_hr18.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\ocrnet_hr18.py /^ norm_eval=False,$/;" v +num_blocks configs\_base_\models\ocrnet_hr18.py /^ num_blocks=(4, ),$/;" v +num_blocks configs\_base_\models\ocrnet_hr18.py /^ num_blocks=(4, 4),$/;" v +num_blocks configs\_base_\models\ocrnet_hr18.py /^ num_blocks=(4, 4, 4),$/;" v +num_blocks configs\_base_\models\ocrnet_hr18.py /^ num_blocks=(4, 4, 4, 4),$/;" v +num_branches configs\_base_\models\ocrnet_hr18.py /^ num_branches=1,$/;" v +num_branches configs\_base_\models\ocrnet_hr18.py /^ num_branches=2,$/;" v +num_branches configs\_base_\models\ocrnet_hr18.py /^ num_branches=3,$/;" v +num_branches configs\_base_\models\ocrnet_hr18.py /^ num_branches=4,$/;" v +num_channels configs\_base_\models\ocrnet_hr18.py /^ num_channels=(18, 36)),$/;" v +num_channels configs\_base_\models\ocrnet_hr18.py /^ num_channels=(18, 36, 72)),$/;" v +num_channels configs\_base_\models\ocrnet_hr18.py /^ num_channels=(18, 36, 72, 144)))),$/;" v +num_channels configs\_base_\models\ocrnet_hr18.py /^ num_channels=(64, )),$/;" v +num_classes configs\_base_\models\ocrnet_hr18.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\ocrnet_hr18.py /^ num_convs=1,$/;" v +num_modules configs\_base_\models\ocrnet_hr18.py /^ num_modules=1,$/;" v +num_modules configs\_base_\models\ocrnet_hr18.py /^ num_modules=3,$/;" v +num_modules configs\_base_\models\ocrnet_hr18.py /^ num_modules=4,$/;" v +num_stages configs\_base_\models\ocrnet_hr18.py /^ num_stages=2,$/;" v +ocr_channels configs\_base_\models\ocrnet_hr18.py /^ ocr_channels=256,$/;" v +pretrained configs\_base_\models\ocrnet_hr18.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18',$/;" v +stage1 configs\_base_\models\ocrnet_hr18.py /^ stage1=dict($/;" v +stage2 configs\_base_\models\ocrnet_hr18.py /^ stage2=dict($/;" v +stage3 configs\_base_\models\ocrnet_hr18.py /^ stage3=dict($/;" v +stage4 configs\_base_\models\ocrnet_hr18.py /^ stage4=dict($/;" v +test_cfg configs\_base_\models\ocrnet_hr18.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\ocrnet_hr18.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\ocrnet_hr18.py /^ type='FCNHead',$/;" v +type configs\_base_\models\ocrnet_hr18.py /^ type='OCRHead',$/;" v +type configs\_base_\models\ocrnet_hr18.py /^ type='HRNet',$/;" v +type configs\_base_\models\ocrnet_hr18.py /^ type='CascadeEncoderDecoder',$/;" v +align_corners configs\_base_\models\ocrnet_r50-d8.py /^ align_corners=False,$/;" v +backbone configs\_base_\models\ocrnet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\ocrnet_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\ocrnet_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\ocrnet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\ocrnet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\ocrnet_r50-d8.py /^ decode_head=[$/;" v +depth configs\_base_\models\ocrnet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\ocrnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\ocrnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\ocrnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\ocrnet_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\ocrnet_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\ocrnet_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\ocrnet_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\ocrnet_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\ocrnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\ocrnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\ocrnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\ocrnet_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\ocrnet_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\ocrnet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\ocrnet_r50-d8.py /^ num_stages=4,$/;" v +num_stages configs\_base_\models\ocrnet_r50-d8.py /^ num_stages=2,$/;" v +ocr_channels configs\_base_\models\ocrnet_r50-d8.py /^ ocr_channels=256,$/;" v +out_indices configs\_base_\models\ocrnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\ocrnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\ocrnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\ocrnet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\ocrnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\ocrnet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\ocrnet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\ocrnet_r50-d8.py /^ type='OCRHead',$/;" v +type configs\_base_\models\ocrnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\ocrnet_r50-d8.py /^ type='CascadeEncoderDecoder',$/;" v +align_corners configs\_base_\models\pointrend_r50.py /^ align_corners=False,$/;" v +backbone configs\_base_\models\pointrend_r50.py /^ backbone=dict($/;" v +channels configs\_base_\models\pointrend_r50.py /^ channels=128,$/;" v +channels configs\_base_\models\pointrend_r50.py /^ channels=256,$/;" v +coarse_pred_each_layer configs\_base_\models\pointrend_r50.py /^ coarse_pred_each_layer=True,$/;" v +contract_dilation configs\_base_\models\pointrend_r50.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\pointrend_r50.py /^ decode_head=[$/;" v +depth configs\_base_\models\pointrend_r50.py /^ depth=50,$/;" v +dilations configs\_base_\models\pointrend_r50.py /^ dilations=(1, 1, 1, 1),$/;" v +dropout_ratio configs\_base_\models\pointrend_r50.py /^ dropout_ratio=-1,$/;" v +feature_strides configs\_base_\models\pointrend_r50.py /^ feature_strides=[4, 8, 16, 32],$/;" v +in_channels configs\_base_\models\pointrend_r50.py /^ in_channels=[256, 256, 256, 256],$/;" v +in_channels configs\_base_\models\pointrend_r50.py /^ in_channels=[256],$/;" v +in_channels configs\_base_\models\pointrend_r50.py /^ in_channels=[256, 512, 1024, 2048],$/;" v +in_index configs\_base_\models\pointrend_r50.py /^ in_index=[0, 1, 2, 3],$/;" v +in_index configs\_base_\models\pointrend_r50.py /^ in_index=[0],$/;" v +loss_decode configs\_base_\models\pointrend_r50.py /^ loss_decode=dict($/;" v +mode configs\_base_\models\pointrend_r50.py /^ mode='whole',$/;" v +model configs\_base_\models\pointrend_r50.py /^model = dict($/;" v +neck configs\_base_\models\pointrend_r50.py /^ neck=dict($/;" v +norm_cfg configs\_base_\models\pointrend_r50.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\pointrend_r50.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\pointrend_r50.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\pointrend_r50.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\pointrend_r50.py /^ num_classes=19,$/;" v +num_fcs configs\_base_\models\pointrend_r50.py /^ num_fcs=3,$/;" v +num_outs configs\_base_\models\pointrend_r50.py /^ num_outs=4),$/;" v +num_stages configs\_base_\models\pointrend_r50.py /^ num_stages=4,$/;" v +num_stages configs\_base_\models\pointrend_r50.py /^ num_stages=2,$/;" v +out_channels configs\_base_\models\pointrend_r50.py /^ out_channels=256,$/;" v +out_indices configs\_base_\models\pointrend_r50.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\pointrend_r50.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +scale_factor configs\_base_\models\pointrend_r50.py /^ scale_factor=2))$/;" v +strides configs\_base_\models\pointrend_r50.py /^ strides=(1, 2, 2, 2),$/;" v +style configs\_base_\models\pointrend_r50.py /^ style='pytorch',$/;" v +subdivision_num_points configs\_base_\models\pointrend_r50.py /^ subdivision_num_points=8196,$/;" v +subdivision_steps configs\_base_\models\pointrend_r50.py /^ subdivision_steps=2,$/;" v +test_cfg configs\_base_\models\pointrend_r50.py /^ test_cfg=dict($/;" v +train_cfg configs\_base_\models\pointrend_r50.py /^ train_cfg=dict($/;" v +type configs\_base_\models\pointrend_r50.py /^ type='FPNHead',$/;" v +type configs\_base_\models\pointrend_r50.py /^ type='PointHead',$/;" v +type configs\_base_\models\pointrend_r50.py /^ type='FPN',$/;" v +type configs\_base_\models\pointrend_r50.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\pointrend_r50.py /^ type='CascadeEncoderDecoder',$/;" v +align_corners configs\_base_\models\psanet_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\psanet_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\psanet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\psanet_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\psanet_r50-d8.py /^ channels=512,$/;" v +compact configs\_base_\models\psanet_r50-d8.py /^ compact=False,$/;" v +concat_input configs\_base_\models\psanet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\psanet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\psanet_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\psanet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\psanet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\psanet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\psanet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\psanet_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\psanet_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\psanet_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\psanet_r50-d8.py /^ loss_decode=dict($/;" v +mask_size configs\_base_\models\psanet_r50-d8.py /^ mask_size=(97, 97),$/;" v +model configs\_base_\models\psanet_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\psanet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\psanet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\psanet_r50-d8.py /^ norm_eval=False,$/;" v +normalization_factor configs\_base_\models\psanet_r50-d8.py /^ normalization_factor=1.0,$/;" v +num_classes configs\_base_\models\psanet_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\psanet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\psanet_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\psanet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pretrained configs\_base_\models\psanet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +psa_softmax configs\_base_\models\psanet_r50-d8.py /^ psa_softmax=True,$/;" v +psa_type configs\_base_\models\psanet_r50-d8.py /^ psa_type='bi-direction',$/;" v +shrink_factor configs\_base_\models\psanet_r50-d8.py /^ shrink_factor=2,$/;" v +strides configs\_base_\models\psanet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\psanet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\psanet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\psanet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\psanet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\psanet_r50-d8.py /^ type='PSAHead',$/;" v +type configs\_base_\models\psanet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\psanet_r50-d8.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\pspnet_r50-d8.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\pspnet_r50-d8.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\pspnet_r50-d8.py /^ backbone=dict($/;" v +channels configs\_base_\models\pspnet_r50-d8.py /^ channels=256,$/;" v +channels configs\_base_\models\pspnet_r50-d8.py /^ channels=512,$/;" v +concat_input configs\_base_\models\pspnet_r50-d8.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\pspnet_r50-d8.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\pspnet_r50-d8.py /^ decode_head=dict($/;" v +depth configs\_base_\models\pspnet_r50-d8.py /^ depth=50,$/;" v +dilations configs\_base_\models\pspnet_r50-d8.py /^ dilations=(1, 1, 2, 4),$/;" v +dropout_ratio configs\_base_\models\pspnet_r50-d8.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\pspnet_r50-d8.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\pspnet_r50-d8.py /^ in_channels=2048,$/;" v +in_index configs\_base_\models\pspnet_r50-d8.py /^ in_index=2,$/;" v +in_index configs\_base_\models\pspnet_r50-d8.py /^ in_index=3,$/;" v +loss_decode configs\_base_\models\pspnet_r50-d8.py /^ loss_decode=dict($/;" v +model configs\_base_\models\pspnet_r50-d8.py /^model = dict($/;" v +norm_cfg configs\_base_\models\pspnet_r50-d8.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\pspnet_r50-d8.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\pspnet_r50-d8.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\pspnet_r50-d8.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\pspnet_r50-d8.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\pspnet_r50-d8.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\pspnet_r50-d8.py /^ out_indices=(0, 1, 2, 3),$/;" v +pool_scales configs\_base_\models\pspnet_r50-d8.py /^ pool_scales=(1, 2, 3, 6),$/;" v +pretrained configs\_base_\models\pspnet_r50-d8.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\pspnet_r50-d8.py /^ strides=(1, 2, 1, 1),$/;" v +style configs\_base_\models\pspnet_r50-d8.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\pspnet_r50-d8.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\pspnet_r50-d8.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\pspnet_r50-d8.py /^ type='FCNHead',$/;" v +type configs\_base_\models\pspnet_r50-d8.py /^ type='PSPHead',$/;" v +type configs\_base_\models\pspnet_r50-d8.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\pspnet_r50-d8.py /^ type='EncoderDecoder',$/;" v +act_cfg configs\_base_\models\pspnet_unet_s5-d16.py /^ act_cfg=dict(type='ReLU'),$/;" v +align_corners configs\_base_\models\pspnet_unet_s5-d16.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\pspnet_unet_s5-d16.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\pspnet_unet_s5-d16.py /^ backbone=dict($/;" v +base_channels configs\_base_\models\pspnet_unet_s5-d16.py /^ base_channels=64,$/;" v +channels configs\_base_\models\pspnet_unet_s5-d16.py /^ channels=16,$/;" v +channels configs\_base_\models\pspnet_unet_s5-d16.py /^ channels=64,$/;" v +concat_input configs\_base_\models\pspnet_unet_s5-d16.py /^ concat_input=False,$/;" v +conv_cfg configs\_base_\models\pspnet_unet_s5-d16.py /^ conv_cfg=None,$/;" v +dec_dilations configs\_base_\models\pspnet_unet_s5-d16.py /^ dec_dilations=(1, 1, 1, 1),$/;" v +dec_num_convs configs\_base_\models\pspnet_unet_s5-d16.py /^ dec_num_convs=(2, 2, 2, 2),$/;" v +decode_head configs\_base_\models\pspnet_unet_s5-d16.py /^ decode_head=dict($/;" v +downsamples configs\_base_\models\pspnet_unet_s5-d16.py /^ downsamples=(True, True, True, True),$/;" v +dropout_ratio configs\_base_\models\pspnet_unet_s5-d16.py /^ dropout_ratio=0.1,$/;" v +enc_dilations configs\_base_\models\pspnet_unet_s5-d16.py /^ enc_dilations=(1, 1, 1, 1, 1),$/;" v +enc_num_convs configs\_base_\models\pspnet_unet_s5-d16.py /^ enc_num_convs=(2, 2, 2, 2, 2),$/;" v +in_channels configs\_base_\models\pspnet_unet_s5-d16.py /^ in_channels=128,$/;" v +in_channels configs\_base_\models\pspnet_unet_s5-d16.py /^ in_channels=3,$/;" v +in_channels configs\_base_\models\pspnet_unet_s5-d16.py /^ in_channels=64,$/;" v +in_index configs\_base_\models\pspnet_unet_s5-d16.py /^ in_index=3,$/;" v +in_index configs\_base_\models\pspnet_unet_s5-d16.py /^ in_index=4,$/;" v +loss_decode configs\_base_\models\pspnet_unet_s5-d16.py /^ loss_decode=dict($/;" v +model configs\_base_\models\pspnet_unet_s5-d16.py /^model = dict($/;" v +norm_cfg configs\_base_\models\pspnet_unet_s5-d16.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\pspnet_unet_s5-d16.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\pspnet_unet_s5-d16.py /^ norm_eval=False),$/;" v +num_classes configs\_base_\models\pspnet_unet_s5-d16.py /^ num_classes=2,$/;" v +num_convs configs\_base_\models\pspnet_unet_s5-d16.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\pspnet_unet_s5-d16.py /^ num_stages=5,$/;" v +pool_scales configs\_base_\models\pspnet_unet_s5-d16.py /^ pool_scales=(1, 2, 3, 6),$/;" v +pretrained configs\_base_\models\pspnet_unet_s5-d16.py /^ pretrained=None,$/;" v +strides configs\_base_\models\pspnet_unet_s5-d16.py /^ strides=(1, 1, 1, 1, 1),$/;" v +test_cfg configs\_base_\models\pspnet_unet_s5-d16.py /^ test_cfg=dict(mode='slide', crop_size=256, stride=170))$/;" v +train_cfg configs\_base_\models\pspnet_unet_s5-d16.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\pspnet_unet_s5-d16.py /^ type='FCNHead',$/;" v +type configs\_base_\models\pspnet_unet_s5-d16.py /^ type='PSPHead',$/;" v +type configs\_base_\models\pspnet_unet_s5-d16.py /^ type='UNet',$/;" v +type configs\_base_\models\pspnet_unet_s5-d16.py /^ type='EncoderDecoder',$/;" v +upsample_cfg configs\_base_\models\pspnet_unet_s5-d16.py /^ upsample_cfg=dict(type='InterpConv'),$/;" v +with_cp configs\_base_\models\pspnet_unet_s5-d16.py /^ with_cp=False,$/;" v +align_corners configs\_base_\models\setr_mla.py /^ align_corners=False,$/;" v +backbone configs\_base_\models\setr_mla.py /^ backbone=dict($/;" v +channels configs\_base_\models\setr_mla.py /^ channels=512,$/;" v +decode_head configs\_base_\models\setr_mla.py /^ decode_head=dict($/;" v +depth configs\_base_\models\setr_mla.py /^ depth=24,$/;" v +drop_rate configs\_base_\models\setr_mla.py /^ drop_rate=0.1,$/;" v +embed_dim configs\_base_\models\setr_mla.py /^ embed_dim=1024,$/;" v +img_size configs\_base_\models\setr_mla.py /^ img_size=768,$/;" v +in_channels configs\_base_\models\setr_mla.py /^ in_channels=1024,$/;" v +in_chans configs\_base_\models\setr_mla.py /^ in_chans=3,$/;" v +loss_decode configs\_base_\models\setr_mla.py /^ loss_decode=dict($/;" v +mla_channels configs\_base_\models\setr_mla.py /^ mla_channels=256,$/;" v +mla_index configs\_base_\models\setr_mla.py /^ mla_index=(5,11,17,23)$/;" v +mlahead_channels configs\_base_\models\setr_mla.py /^ mlahead_channels=128,$/;" v +model configs\_base_\models\setr_mla.py /^model = dict($/;" v +model_name configs\_base_\models\setr_mla.py /^ model_name='vit_large_patch16_384',$/;" v +norm_cfg configs\_base_\models\setr_mla.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\setr_mla.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\_base_\models\setr_mla.py /^ num_classes=19,$/;" v +num_heads configs\_base_\models\setr_mla.py /^ num_heads=16, $/;" v +patch_size configs\_base_\models\setr_mla.py /^ patch_size=16, $/;" v +pos_embed_interp configs\_base_\models\setr_mla.py /^ pos_embed_interp=True,$/;" v +test_cfg configs\_base_\models\setr_mla.py /^test_cfg = dict(mode='whole')$/;" v +train_cfg configs\_base_\models\setr_mla.py /^train_cfg = dict()$/;" v +type configs\_base_\models\setr_mla.py /^ type='VIT_MLA',$/;" v +type configs\_base_\models\setr_mla.py /^ type='VIT_MLAHead',$/;" v +type configs\_base_\models\setr_mla.py /^ type='EncoderDecoder',$/;" v +align_corners configs\_base_\models\setr_naive_pup.py /^ align_corners=False,$/;" v +backbone configs\_base_\models\setr_naive_pup.py /^ backbone=dict($/;" v +channels configs\_base_\models\setr_naive_pup.py /^ channels=512,$/;" v +decode_head configs\_base_\models\setr_naive_pup.py /^ decode_head=dict($/;" v +depth configs\_base_\models\setr_naive_pup.py /^ depth=24,$/;" v +drop_rate configs\_base_\models\setr_naive_pup.py /^ drop_rate=0.1,$/;" v +embed_dim configs\_base_\models\setr_naive_pup.py /^ embed_dim=1024,$/;" v +img_size configs\_base_\models\setr_naive_pup.py /^ img_size=768,$/;" v +in_channels configs\_base_\models\setr_naive_pup.py /^ in_channels=1024,$/;" v +in_chans configs\_base_\models\setr_naive_pup.py /^ in_chans=3,$/;" v +in_index configs\_base_\models\setr_naive_pup.py /^ in_index=23,$/;" v +loss_decode configs\_base_\models\setr_naive_pup.py /^ loss_decode=dict($/;" v +model configs\_base_\models\setr_naive_pup.py /^model = dict($/;" v +model_name configs\_base_\models\setr_naive_pup.py /^ model_name='vit_base_patch16_224',$/;" v +norm_cfg configs\_base_\models\setr_naive_pup.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\setr_naive_pup.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\_base_\models\setr_naive_pup.py /^ num_classes=19,$/;" v +num_conv configs\_base_\models\setr_naive_pup.py /^ num_conv=2,$/;" v +num_heads configs\_base_\models\setr_naive_pup.py /^ num_heads=16,$/;" v +patch_size configs\_base_\models\setr_naive_pup.py /^ patch_size=16,$/;" v +pos_embed_interp configs\_base_\models\setr_naive_pup.py /^ pos_embed_interp=True,$/;" v +test_cfg configs\_base_\models\setr_naive_pup.py /^test_cfg = dict(mode='whole')$/;" v +train_cfg configs\_base_\models\setr_naive_pup.py /^train_cfg = dict()$/;" v +type configs\_base_\models\setr_naive_pup.py /^ type='VisionTransformer',$/;" v +type configs\_base_\models\setr_naive_pup.py /^ type='VisionTransformerUpHead',$/;" v +type configs\_base_\models\setr_naive_pup.py /^ type='EncoderDecoder',$/;" v +upsampling_method configs\_base_\models\setr_naive_pup.py /^ upsampling_method='bilinear',$/;" v +align_corners configs\_base_\models\upernet_r50.py /^ align_corners=False,$/;" v +auxiliary_head configs\_base_\models\upernet_r50.py /^ auxiliary_head=dict($/;" v +backbone configs\_base_\models\upernet_r50.py /^ backbone=dict($/;" v +channels configs\_base_\models\upernet_r50.py /^ channels=256,$/;" v +channels configs\_base_\models\upernet_r50.py /^ channels=512,$/;" v +concat_input configs\_base_\models\upernet_r50.py /^ concat_input=False,$/;" v +contract_dilation configs\_base_\models\upernet_r50.py /^ contract_dilation=True),$/;" v +decode_head configs\_base_\models\upernet_r50.py /^ decode_head=dict($/;" v +depth configs\_base_\models\upernet_r50.py /^ depth=50,$/;" v +dilations configs\_base_\models\upernet_r50.py /^ dilations=(1, 1, 1, 1),$/;" v +dropout_ratio configs\_base_\models\upernet_r50.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\_base_\models\upernet_r50.py /^ in_channels=1024,$/;" v +in_channels configs\_base_\models\upernet_r50.py /^ in_channels=[256, 512, 1024, 2048],$/;" v +in_index configs\_base_\models\upernet_r50.py /^ in_index=2,$/;" v +in_index configs\_base_\models\upernet_r50.py /^ in_index=[0, 1, 2, 3],$/;" v +loss_decode configs\_base_\models\upernet_r50.py /^ loss_decode=dict($/;" v +model configs\_base_\models\upernet_r50.py /^model = dict($/;" v +norm_cfg configs\_base_\models\upernet_r50.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\_base_\models\upernet_r50.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +norm_eval configs\_base_\models\upernet_r50.py /^ norm_eval=False,$/;" v +num_classes configs\_base_\models\upernet_r50.py /^ num_classes=19,$/;" v +num_convs configs\_base_\models\upernet_r50.py /^ num_convs=1,$/;" v +num_stages configs\_base_\models\upernet_r50.py /^ num_stages=4,$/;" v +out_indices configs\_base_\models\upernet_r50.py /^ out_indices=(0, 1, 2, 3),$/;" v +pool_scales configs\_base_\models\upernet_r50.py /^ pool_scales=(1, 2, 3, 6),$/;" v +pretrained configs\_base_\models\upernet_r50.py /^ pretrained='open-mmlab:\/\/resnet50_v1c',$/;" v +strides configs\_base_\models\upernet_r50.py /^ strides=(1, 2, 2, 2),$/;" v +style configs\_base_\models\upernet_r50.py /^ style='pytorch',$/;" v +test_cfg configs\_base_\models\upernet_r50.py /^ test_cfg=dict(mode='whole'))$/;" v +train_cfg configs\_base_\models\upernet_r50.py /^ train_cfg=dict(),$/;" v +type configs\_base_\models\upernet_r50.py /^ type='FCNHead',$/;" v +type configs\_base_\models\upernet_r50.py /^ type='ResNetV1c',$/;" v +type configs\_base_\models\upernet_r50.py /^ type='UPerHead',$/;" v +type configs\_base_\models\upernet_r50.py /^ type='EncoderDecoder',$/;" v +checkpoint_config configs\_base_\schedules\schedule_160k.py /^checkpoint_config = dict(by_epoch=False, interval=16000)$/;" v +evaluation configs\_base_\schedules\schedule_160k.py /^evaluation = dict(interval=16000, metric='mIoU')$/;" v +lr_config configs\_base_\schedules\schedule_160k.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +optimizer configs\_base_\schedules\schedule_160k.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer_config configs\_base_\schedules\schedule_160k.py /^optimizer_config = dict()$/;" v +runner configs\_base_\schedules\schedule_160k.py /^runner = dict(type='IterBasedRunner', max_iters=160000)$/;" v +checkpoint_config configs\_base_\schedules\schedule_20k.py /^checkpoint_config = dict(by_epoch=False, interval=2000)$/;" v +evaluation configs\_base_\schedules\schedule_20k.py /^evaluation = dict(interval=2000, metric='mIoU')$/;" v +lr_config configs\_base_\schedules\schedule_20k.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +optimizer configs\_base_\schedules\schedule_20k.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer_config configs\_base_\schedules\schedule_20k.py /^optimizer_config = dict()$/;" v +runner configs\_base_\schedules\schedule_20k.py /^runner = dict(type='IterBasedRunner', max_iters=20000)$/;" v +checkpoint_config configs\_base_\schedules\schedule_40k.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +evaluation configs\_base_\schedules\schedule_40k.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +lr_config configs\_base_\schedules\schedule_40k.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +optimizer configs\_base_\schedules\schedule_40k.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer_config configs\_base_\schedules\schedule_40k.py /^optimizer_config = dict()$/;" v +runner configs\_base_\schedules\schedule_40k.py /^runner = dict(type='IterBasedRunner', max_iters=40000)$/;" v +checkpoint_config configs\_base_\schedules\schedule_80k.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +evaluation configs\_base_\schedules\schedule_80k.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +lr_config configs\_base_\schedules\schedule_80k.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +optimizer configs\_base_\schedules\schedule_80k.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer_config configs\_base_\schedules\schedule_80k.py /^optimizer_config = dict()$/;" v +runner configs\_base_\schedules\schedule_80k.py /^runner = dict(type='IterBasedRunner', max_iters=80000)$/;" v +by_epoch configs\_base_\schedules\schedule_80k_step.py /^ by_epoch=False)$/;" v +checkpoint_config configs\_base_\schedules\schedule_80k_step.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +evaluation configs\_base_\schedules\schedule_80k_step.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +lr_config configs\_base_\schedules\schedule_80k_step.py /^lr_config = dict($/;" v +optimizer configs\_base_\schedules\schedule_80k_step.py /^optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)$/;" v +optimizer_config configs\_base_\schedules\schedule_80k_step.py /^optimizer_config = dict()$/;" v +policy configs\_base_\schedules\schedule_80k_step.py /^ policy='step',$/;" v +runner configs\_base_\schedules\schedule_80k_step.py /^runner = dict(type='IterBasedRunner', max_iters=80000)$/;" v +step configs\_base_\schedules\schedule_80k_step.py /^ step=[40000, 60000], $/;" v +_base_ configs\ann\ann_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/ann_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\ann\ann_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ann\ann_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/ann_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\ann\ann_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ann\ann_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/ann_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\ann\ann_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ann\ann_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/ann_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\ann\ann_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ann\ann_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/ann_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\ann\ann_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ann\ann_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/ann_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\ann\ann_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ann\ann_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/ann_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\ann\ann_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ann\ann_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/ann_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\ann\ann_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ann\ann_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\ann\ann_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\ann\ann_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\ann\ann_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\ann\ann_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\ann\ann_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\ann\ann_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\ann\ann_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\ann\ann_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\ann\ann_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\ann\ann_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\ann\ann_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\ann\ann_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\ann\ann_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\ann\ann_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\ann\ann_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\apcnet\apcnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/apcnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\apcnet\apcnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\apcnet\apcnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/apcnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\apcnet\apcnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\apcnet\apcnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/apcnet_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\apcnet\apcnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\apcnet\apcnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/apcnet_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\apcnet\apcnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\apcnet\apcnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/apcnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\apcnet\apcnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\apcnet\apcnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/apcnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\apcnet\apcnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\apcnet\apcnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\apcnet\apcnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\apcnet\apcnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\apcnet\apcnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\apcnet\apcnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\apcnet\apcnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\apcnet\apcnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\apcnet\apcnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\apcnet\apcnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\apcnet\apcnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\ccnet\ccnet_r101-d8_512x1024_40k_Recipe1M.py /^_base_ = ['..\/_base_\/datasets\/Recipe1M.py',$/;" v +_base_ configs\ccnet\ccnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/ccnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\ccnet\ccnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ccnet\ccnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/ccnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\ccnet\ccnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ccnet\ccnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/ccnet_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\ccnet\ccnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ccnet\ccnet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/ccnet_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\ccnet\ccnet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ccnet\ccnet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/ccnet_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\ccnet\ccnet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ccnet\ccnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/ccnet_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\ccnet\ccnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ccnet\ccnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/ccnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\ccnet\ccnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ccnet\ccnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/ccnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\ccnet\ccnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ccnet\ccnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\ccnet\ccnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\ccnet\ccnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\ccnet\ccnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\ccnet\ccnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\ccnet\ccnet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\ccnet\ccnet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\ccnet\ccnet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\ccnet\ccnet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\ccnet\ccnet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\ccnet\ccnet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\ccnet\ccnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\ccnet\ccnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\ccnet\ccnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\ccnet\ccnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\ccnet\ccnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^_base_ = ['..\/_base_\/models\/cgnet.py', '..\/_base_\/default_runtime.py']$/;" v +ann_dir configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ ann_dir='gtFine\/train',$/;" v +ann_dir configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ ann_dir='gtFine\/val',$/;" v +checkpoint_config configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +crop_size configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^crop_size = (512, 1024)$/;" v +data configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^data = dict($/;" v +data_root configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ data_root=data_root,$/;" v +data_root configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^data_root = 'data\/cityscapes\/'$/;" v +dataset_type configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^dataset_type = 'CityscapesDataset'$/;" v +evaluation configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +flip configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ flip=False,$/;" v +img_dir configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ img_dir='leftImg8bit\/train',$/;" v +img_dir configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ img_dir='leftImg8bit\/val',$/;" v +img_norm_cfg configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^img_norm_cfg = dict($/;" v +img_scale configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ img_scale=(2048, 1024),$/;" v +lr_config configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +optimizer configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005)$/;" v +optimizer_config configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^optimizer_config = dict()$/;" v +pipeline configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ pipeline=test_pipeline))$/;" v +pipeline configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ pipeline=test_pipeline),$/;" v +pipeline configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ pipeline=train_pipeline),$/;" v +samples_per_gpu configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ samples_per_gpu=8,$/;" v +test configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ test=dict($/;" v +test_pipeline configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^test_pipeline = [$/;" v +total_iters configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^total_iters = 60000$/;" v +train configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ train=dict($/;" v +train_pipeline configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^train_pipeline = [$/;" v +transforms configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ transforms=[$/;" v +type configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ type='MultiScaleFlipAug',$/;" v +type configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ type=dataset_type,$/;" v +val configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ val=dict($/;" v +workers_per_gpu configs\cgnet\cgnet_512x1024_60k_cityscapes.py /^ workers_per_gpu=8,$/;" v +_base_ configs\cgnet\cgnet_680x680_60k_cityscapes.py /^_base_ = [$/;" v +checkpoint_config configs\cgnet\cgnet_680x680_60k_cityscapes.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +crop_size configs\cgnet\cgnet_680x680_60k_cityscapes.py /^crop_size = (680, 680)$/;" v +data configs\cgnet\cgnet_680x680_60k_cityscapes.py /^data = dict($/;" v +evaluation configs\cgnet\cgnet_680x680_60k_cityscapes.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +flip configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ flip=False,$/;" v +img_norm_cfg configs\cgnet\cgnet_680x680_60k_cityscapes.py /^img_norm_cfg = dict($/;" v +img_scale configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ img_scale=(2048, 1024),$/;" v +lr_config configs\cgnet\cgnet_680x680_60k_cityscapes.py /^lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)$/;" v +optimizer configs\cgnet\cgnet_680x680_60k_cityscapes.py /^optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005)$/;" v +optimizer_config configs\cgnet\cgnet_680x680_60k_cityscapes.py /^optimizer_config = dict()$/;" v +samples_per_gpu configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ samples_per_gpu=8,$/;" v +test configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ test=dict(pipeline=test_pipeline))$/;" v +test_pipeline configs\cgnet\cgnet_680x680_60k_cityscapes.py /^test_pipeline = [$/;" v +total_iters configs\cgnet\cgnet_680x680_60k_cityscapes.py /^total_iters = 60000$/;" v +train configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ train=dict(pipeline=train_pipeline),$/;" v +train_pipeline configs\cgnet\cgnet_680x680_60k_cityscapes.py /^train_pipeline = [$/;" v +transforms configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ transforms=[$/;" v +type configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ type='MultiScaleFlipAug',$/;" v +val configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ val=dict(pipeline=test_pipeline),$/;" v +workers_per_gpu configs\cgnet\cgnet_680x680_60k_cityscapes.py /^ workers_per_gpu=8,$/;" v +_base_ configs\danet\danet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/danet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\danet\danet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\danet\danet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/danet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\danet\danet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\danet\danet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/danet_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\danet\danet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\danet\danet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/danet_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\danet\danet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\danet\danet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/danet_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\danet\danet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\danet\danet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/danet_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\danet\danet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\danet\danet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/danet_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\danet\danet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\danet\danet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/danet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\danet\danet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\danet\danet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\danet\danet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\danet\danet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\danet\danet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\danet\danet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\danet\danet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\danet\danet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\danet\danet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\danet\danet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\danet\danet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\danet\danet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\danet\danet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\danet\danet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\danet\danet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\danet\danet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\danet\danet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_40k_cityscapes.py'$/;" v +backbone configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ decode_head=dict($/;" v +depth configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ depth=101,$/;" v +dilations configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ dilations=(1, 1, 1, 2),$/;" v +dilations configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ dilations=(1, 6, 12, 18),$/;" v +model configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^model = dict($/;" v +multi_grid configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ multi_grid=(1, 2, 4)),$/;" v +pretrained configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet101_v1c',$/;" v +sampler configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ sampler=dict(type='OHEMPixelSampler', min_kept=100000)))$/;" v +strides configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py /^ strides=(1, 2, 2, 1),$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +backbone configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +depth configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ depth=101,$/;" v +dilations configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2),$/;" v +dilations configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ dilations=(1, 6, 12, 18),$/;" v +model configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^model = dict($/;" v +multi_grid configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ multi_grid=(1, 2, 4)),$/;" v +pretrained configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet101_v1c',$/;" v +sampler configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ sampler=dict(type='OHEMPixelSampler', min_kept=100000)))$/;" v +strides configs\deeplabv3\deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1),$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_480x480_40k_pascal_context.py /^_base_ = '.\/deeplabv3_r50-d8_480x480_40k_pascal_context.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_480x480_40k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_480x480_80k_pascal_context.py /^_base_ = '.\/deeplabv3_r50-d8_480x480_80k_pascal_context.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_480x480_80k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/deeplabv3_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/deeplabv3_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/deeplabv3_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/deeplabv3_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\deeplabv3\deeplabv3_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3\deeplabv3_r101b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +backbone configs\deeplabv3\deeplabv3_r101b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +model configs\deeplabv3\deeplabv3_r101b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3\deeplabv3_r101b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +_base_ configs\deeplabv3\deeplabv3_r101b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +backbone configs\deeplabv3\deeplabv3_r101b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +model configs\deeplabv3\deeplabv3_r101b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3\deeplabv3_r101b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +_base_ configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +auxiliary_head configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +channels configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3\deeplabv3_r18-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +_base_ configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +auxiliary_head configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +channels configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3\deeplabv3_r18-d8_769x769_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +_base_ configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +auxiliary_head configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +channels configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3\deeplabv3_r18b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +_base_ configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +auxiliary_head configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +channels configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3\deeplabv3_r18b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^_base_ = [$/;" v +auxiliary_head configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^ auxiliary_head=dict(num_classes=60),$/;" v +decode_head configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +model configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^model = dict($/;" v +optimizer configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\deeplabv3\deeplabv3_r50-d8_480x480_40k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^_base_ = [$/;" v +auxiliary_head configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^ auxiliary_head=dict(num_classes=60),$/;" v +decode_head configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +model configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^model = dict($/;" v +optimizer configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\deeplabv3\deeplabv3_r50-d8_480x480_80k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\deeplabv3\deeplabv3_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\deeplabv3\deeplabv3_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\deeplabv3\deeplabv3_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\deeplabv3\deeplabv3_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\deeplabv3\deeplabv3_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\deeplabv3\deeplabv3_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\deeplabv3\deeplabv3_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\deeplabv3\deeplabv3_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\deeplabv3\deeplabv3_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\deeplabv3\deeplabv3_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\deeplabv3\deeplabv3_r50b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\deeplabv3\deeplabv3_r50b-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +_base_ configs\deeplabv3\deeplabv3_r50b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\deeplabv3\deeplabv3_r50b-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py'$/;" v +backbone configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ decode_head=dict($/;" v +depth configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ depth=101,$/;" v +dilations configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ dilations=(1, 1, 1, 2),$/;" v +dilations configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ dilations=(1, 6, 12, 18),$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^model = dict($/;" v +multi_grid configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ multi_grid=(1, 2, 4)),$/;" v +pretrained configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet101_v1c',$/;" v +sampler configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ sampler=dict(type='OHEMPixelSampler', min_kept=100000)))$/;" v +strides configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py /^ strides=(1, 2, 2, 1),$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +backbone configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +depth configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ depth=101,$/;" v +dilations configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2),$/;" v +dilations configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ dilations=(1, 6, 12, 18),$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^model = dict($/;" v +multi_grid configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ multi_grid=(1, 2, 4)),$/;" v +pretrained configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet101_v1c',$/;" v +sampler configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ sampler=dict(type='OHEMPixelSampler', min_kept=100000)))$/;" v +strides configs\deeplabv3plus\deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1),$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_480x480_40k_pascal_context.py /^_base_ = '.\/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_480x480_40k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_480x480_80k_pascal_context.py /^_base_ = '.\/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_480x480_80k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +backbone configs\deeplabv3plus\deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3plus\deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +backbone configs\deeplabv3plus\deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +model configs\deeplabv3plus\deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3plus\deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +auxiliary_head configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +c1_channels configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ c1_channels=12,$/;" v +c1_in_channels configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ c1_in_channels=64,$/;" v +channels configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3plus\deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +auxiliary_head configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +c1_channels configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ c1_channels=12,$/;" v +c1_in_channels configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ c1_in_channels=64,$/;" v +channels configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3plus\deeplabv3plus_r18-d8_769x769_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +auxiliary_head configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +c1_channels configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ c1_channels=12,$/;" v +c1_in_channels configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ c1_in_channels=64,$/;" v +channels configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3plus\deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +auxiliary_head configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +c1_channels configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ c1_channels=12,$/;" v +c1_in_channels configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ c1_in_channels=64,$/;" v +channels configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\deeplabv3plus\deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^_base_ = [$/;" v +auxiliary_head configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^ auxiliary_head=dict(num_classes=60),$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^model = dict($/;" v +optimizer configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_40k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^_base_ = [$/;" v +auxiliary_head configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^ auxiliary_head=dict(num_classes=60),$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^model = dict($/;" v +optimizer configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\deeplabv3plus\deeplabv3plus_r50-d8_480x480_80k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\deeplabv3plus\deeplabv3plus_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +_base_ configs\deeplabv3plus\deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\deeplabv3plus\deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +_base_ configs\dmnet\dmnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/dmnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\dmnet\dmnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dmnet\dmnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/dmnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\dmnet\dmnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dmnet\dmnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/dmnet_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\dmnet\dmnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dmnet\dmnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/dmnet_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\dmnet\dmnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dmnet\dmnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/dmnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\dmnet\dmnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dmnet\dmnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/dmnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\dmnet\dmnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dmnet\dmnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\dmnet\dmnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\dmnet\dmnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\dmnet\dmnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\dmnet\dmnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\dmnet\dmnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\dmnet\dmnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\dmnet\dmnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\dmnet\dmnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\dmnet\dmnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\dnlnet\dnl_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/dnl_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\dnlnet\dnl_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dnlnet\dnl_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/dnl_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\dnlnet\dnl_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dnlnet\dnl_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/dnl_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\dnlnet\dnl_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dnlnet\dnl_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/dnl_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\dnlnet\dnl_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dnlnet\dnl_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/dnl_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\dnlnet\dnl_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dnlnet\dnl_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/dnl_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\dnlnet\dnl_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\dnlnet\dnl_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\dnlnet\dnl_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\dnlnet\dnl_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\dnlnet\dnl_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\dnlnet\dnl_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\dnlnet\dnl_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\dnlnet\dnl_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\dnlnet\dnl_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\dnlnet\dnl_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +custom_keys configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ custom_keys=dict(theta=dict(wd_mult=0.), phi=dict(wd_mult=0.))))$/;" v +decode_head configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +optimizer configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^optimizer = dict($/;" v +paramwise_cfg configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ paramwise_cfg=dict($/;" v +test_cfg configs\dnlnet\dnl_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\emanet\emanet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/emanet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\emanet\emanet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\emanet\emanet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/emanet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\emanet\emanet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\emanet\emanet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\emanet\emanet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\encnet\encnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/encnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\encnet\encnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\encnet\encnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/encnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\encnet\encnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\encnet\encnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/encnet_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\encnet\encnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\encnet\encnet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/encnet_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\encnet\encnet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\encnet\encnet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/encnet_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\encnet\encnet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\encnet\encnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/encnet_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\encnet\encnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\encnet\encnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/encnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\encnet\encnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\encnet\encnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/encnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\encnet\encnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\encnet\encnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\encnet\encnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\encnet\encnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\encnet\encnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\encnet\encnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\encnet\encnet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\encnet\encnet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\encnet\encnet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\encnet\encnet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\encnet\encnet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\encnet\encnet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\encnet\encnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\encnet\encnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\encnet\encnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\encnet\encnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\encnet\encnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +auxiliary_head configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^ auxiliary_head=dict(num_classes=150))$/;" v +backbone configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^ backbone=dict(stem_channels=128),$/;" v +decode_head configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150),$/;" v +model configs\encnet\encnet_r50s-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\fastscnn\fast_scnn_4x8_80k_lr0.12_cityscapes.py /^_base_ = [$/;" v +data configs\fastscnn\fast_scnn_4x8_80k_lr0.12_cityscapes.py /^data = dict(samples_per_gpu=2, workers_per_gpu=4)$/;" v +optimizer configs\fastscnn\fast_scnn_4x8_80k_lr0.12_cityscapes.py /^optimizer = dict(type='SGD', lr=0.12, momentum=0.9, weight_decay=4e-5)$/;" v +_base_ configs\fcn\fcn_r101-d8_480x480_40k_pascal_context.py /^_base_ = '.\/fcn_r50-d8_480x480_40k_pascal_context.py'$/;" v +model configs\fcn\fcn_r101-d8_480x480_40k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101-d8_480x480_80k_pascal_context.py /^_base_ = '.\/fcn_r50-d8_480x480_80k_pascal_context.py'$/;" v +model configs\fcn\fcn_r101-d8_480x480_80k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\fcn\fcn_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\fcn\fcn_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/fcn_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\fcn\fcn_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/fcn_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\fcn\fcn_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/fcn_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\fcn\fcn_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/fcn_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\fcn\fcn_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\fcn\fcn_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\fcn\fcn_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\fcn\fcn_r101b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +backbone configs\fcn\fcn_r101b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +model configs\fcn\fcn_r101b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\fcn\fcn_r101b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +_base_ configs\fcn\fcn_r101b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +backbone configs\fcn\fcn_r101b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +model configs\fcn\fcn_r101b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\fcn\fcn_r101b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +_base_ configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +auxiliary_head configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +channels configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\fcn\fcn_r18-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +_base_ configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +auxiliary_head configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +channels configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\fcn\fcn_r18-d8_769x769_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +_base_ configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +auxiliary_head configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +channels configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\fcn\fcn_r18b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +_base_ configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +auxiliary_head configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +channels configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\fcn\fcn_r18b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +_base_ configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^_base_ = [$/;" v +decode_head configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +model configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^model = dict($/;" v +optimizer configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\fcn\fcn_r50-d8_480x480_40k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +_base_ configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^_base_ = [$/;" v +decode_head configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +model configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^model = dict($/;" v +optimizer configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\fcn\fcn_r50-d8_480x480_80k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +_base_ configs\fcn\fcn_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\fcn\fcn_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\fcn\fcn_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\fcn\fcn_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\fcn\fcn_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\fcn\fcn_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\fcn\fcn_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\fcn\fcn_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\fcn\fcn_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\fcn\fcn_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\fcn\fcn_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\fcn\fcn_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\fcn\fcn_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\fcn\fcn_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\fcn\fcn_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\fcn\fcn_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\fcn\fcn_r50b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\fcn\fcn_r50b-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +_base_ configs\fcn\fcn_r50b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/fcn_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\fcn\fcn_r50b-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +_base_ configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^_base_ = [$/;" v +align_corners configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ align_corners=False,$/;" v +auxiliary_head configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ auxiliary_head=[$/;" v +backbone configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ backbone=dict($/;" v +channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ channels=512,$/;" v +crop_size configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^crop_size = (768, 768)$/;" v +data configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^data = dict(samples_per_gpu=1)$/;" v +decode_head configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104),$/;" v +depth configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ depth=12,$/;" v +drop_rate configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ drop_rate=0.,$/;" v +embed_dim configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ embed_dim=768,$/;" v +find_unused_parameters configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^find_unused_parameters = True$/;" v +img_size configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ img_size=768,$/;" v +in_channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_channels=256,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_index=0,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_index=1,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_index=2,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ in_index=3,$/;" v +loss_decode configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ loss_decode=dict($/;" v +mla_channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ mla_channels=256,$/;" v +mla_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ mla_index=(5,7,9,11)$/;" v +model configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^model = dict($/;" v +model_name configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ model_name='vit_base_patch16_384',$/;" v +num_classes configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ num_classes=104,$/;" v +num_heads configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ num_heads=12,$/;" v +optimizer configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^optimizer = dict(lr=0.002, weight_decay=0.0,$/;" v +paramwise_cfg configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)})$/;" v +pos_embed_interp configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ pos_embed_interp=True, $/;" v +test_cfg configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +type configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base.py /^ type='VIT_MLA_AUXIHead',$/;" v +_base_ configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^_base_ = [$/;" v +align_corners configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ align_corners=False,$/;" v +auxiliary_head configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ auxiliary_head=[$/;" v +backbone configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ backbone=dict($/;" v +channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ channels=512,$/;" v +crop_size configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^crop_size = (768, 768)$/;" v +data configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^data = dict(samples_per_gpu=1)$/;" v +decode_head configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104),$/;" v +depth configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ depth=12,$/;" v +drop_rate configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ drop_rate=0.,$/;" v +embed_dim configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ embed_dim=768,$/;" v +find_unused_parameters configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^find_unused_parameters = True$/;" v +img_size configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ img_size=768,$/;" v +in_channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_channels=256,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=0,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=1,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=2,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=3,$/;" v +loss_decode configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ loss_decode=dict($/;" v +mla_channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ mla_channels=256,$/;" v +mla_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ mla_index=(5,7,9,11)$/;" v +model configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^model = dict($/;" v +model_name configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ model_name='vit_base_patch16_224',$/;" v +num_classes configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_classes=104,$/;" v +num_heads configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_heads=12,$/;" v +optimizer configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^optimizer = dict(lr=0.002, weight_decay=0.0,$/;" v +paramwise_cfg configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)})$/;" v +pos_embed_interp configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ pos_embed_interp=True, $/;" v +test_cfg configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +type configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224.py /^ type='VIT_MLA_AUXIHead',$/;" v +_base_ configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^_base_ = [$/;" v +align_corners configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ align_corners=False,$/;" v +auxiliary_head configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ auxiliary_head=[$/;" v +backbone configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ backbone=dict($/;" v +by_epoch configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ by_epoch=False)$/;" v +channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ channels=512,$/;" v +crop_size configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^crop_size = (768, 768)$/;" v +data configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^data = dict(samples_per_gpu=1)$/;" v +decode_head configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104),$/;" v +depth configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ depth=12,$/;" v +drop_rate configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ drop_rate=0.,$/;" v +embed_dim configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ embed_dim=768,$/;" v +find_unused_parameters configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^find_unused_parameters = True$/;" v +img_size configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ img_size=768,$/;" v +in_channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_channels=256,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_index=0,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_index=1,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_index=2,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ in_index=3,$/;" v +loss_decode configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ loss_decode=dict($/;" v +lr_config configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^lr_config = dict(policy='step', $/;" v +mla_channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ mla_channels=256,$/;" v +mla_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ mla_index=(5,7,9,11)$/;" v +model configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^model = dict($/;" v +model_name configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ model_name='vit_base_patch16_224',$/;" v +num_classes configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ num_classes=104,$/;" v +num_heads configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ num_heads=12,$/;" v +optimizer configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^optimizer = dict(lr=0.002, weight_decay=0.0,$/;" v +paramwise_cfg configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)})$/;" v +pos_embed_interp configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ pos_embed_interp=True, $/;" v +step configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ step=[40000, 60000],$/;" v +test_cfg configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +type configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_base_224_step.py /^ type='VIT_MLA_AUXIHead',$/;" v +_base_ configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^_base_ = [$/;" v +align_corners configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ align_corners=False,$/;" v +auxiliary_head configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ auxiliary_head=[$/;" v +backbone configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ backbone=dict($/;" v +channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ channels=512,$/;" v +checkpoint_config configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +crop_size configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^crop_size = (768, 768)$/;" v +data configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^data = dict(samples_per_gpu=1)$/;" v +decode_head configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104),$/;" v +drop_rate configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ drop_rate=0.,$/;" v +evaluation configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^evaluation = dict(interval=80000, metric='mIoU')$/;" v +find_unused_parameters configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^find_unused_parameters = True$/;" v +img_size configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ img_size=768,$/;" v +in_channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_channels=256,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_index=0,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_index=1,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_index=2,$/;" v +in_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ in_index=3,$/;" v +loss_decode configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ loss_decode=dict($/;" v +mla_channels configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ mla_channels=256,$/;" v +mla_index configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ mla_index=(5,11,17,23)$/;" v +model configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^model = dict($/;" v +num_classes configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ num_classes=104,$/;" v +optimizer configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^optimizer = dict(lr=0.002, weight_decay=0.0,$/;" v +paramwise_cfg configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)})$/;" v +pos_embed_interp configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ pos_embed_interp=True, $/;" v +test_cfg configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +type configs\foodnet\SETR_MLA_768x768_80k_Recipe1M_bs_8_large.py /^ type='VIT_MLA_AUXIHead',$/;" v +_base_ configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^_base_ = [$/;" v +align_corners configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ align_corners=False,$/;" v +align_corners configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ align_corners=False, $/;" v +align_corners configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ align_corners=False,$/;" v +auxiliary_head configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ auxiliary_head=[$/;" v +backbone configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ backbone=dict($/;" v +channels configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ channels=512,$/;" v +channels configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ channels=512,$/;" v +crop_size configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^crop_size = (768, 768)$/;" v +data configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^data = dict(samples_per_gpu=1)$/;" v +decode_head configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ decode_head=dict($/;" v +depth configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ depth=12,$/;" v +drop_rate configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ drop_rate=0.$/;" v +embed_dim configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ embed_dim=768,$/;" v +embed_dim configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ embed_dim=768,$/;" v +find_unused_parameters configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^find_unused_parameters = True$/;" v +img_size configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ img_size=768,$/;" v +img_size configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ img_size=768, $/;" v +in_channels configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_channels=768,$/;" v +in_channels configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_channels=768,$/;" v +in_index configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=5,$/;" v +in_index configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=7,$/;" v +in_index configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=9,$/;" v +in_index configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ in_index=11,$/;" v +loss_decode configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ loss_decode=dict($/;" v +model configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^model = dict($/;" v +model_name configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ model_name='vit_base_patch16_224',$/;" v +norm_cfg configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_classes=104,$/;" v +num_classes configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_classes=104,$/;" v +num_conv configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_conv=2,$/;" v +num_conv configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_conv=2, $/;" v +num_heads configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ num_heads=12,$/;" v +optimizer configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^optimizer = dict(lr=0.01, weight_decay=0.0, paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)}))$/;" v +pos_embed_interp configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ pos_embed_interp=True, $/;" v +test_cfg configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +type configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ type='VisionTransformerUpHead',$/;" v +upsampling_method configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ upsampling_method='bilinear',$/;" v +upsampling_method configs\foodnet\SETR_Naive_768x768_80k_Recipe1M_bs_8_base_224.py /^ upsampling_method='bilinear', $/;" v +_base_ configs\foodnet\ccnet_r50-d8_512x1024_80k.py /^_base_ = [$/;" v +_base_ configs\foodnet\ccnet_r50-d8_512x1024_80k_RM.py /^_base_ = [$/;" v +model configs\foodnet\ccnet_r50-d8_512x1024_80k_RM.py /^model = dict(pretrained='.\/pretrained_model\/recipe1M_R50_LSTM.pth', backbone=dict(type='ResNet'))$/;" v +_base_ configs\foodnet\ccnet_vit_768x768_80k.py /^_base_ = [$/;" v +align_corners configs\foodnet\ccnet_vit_768x768_80k.py /^ align_corners=False,$/;" v +auxiliary_head configs\foodnet\ccnet_vit_768x768_80k.py /^ auxiliary_head=dict($/;" v +backbone configs\foodnet\ccnet_vit_768x768_80k.py /^ backbone=dict($/;" v +crop_size configs\foodnet\ccnet_vit_768x768_80k.py /^crop_size = (768, 768)$/;" v +data configs\foodnet\ccnet_vit_768x768_80k.py /^data = dict(samples_per_gpu=1)$/;" v +decode_head configs\foodnet\ccnet_vit_768x768_80k.py /^ decode_head=dict($/;" v +depth configs\foodnet\ccnet_vit_768x768_80k.py /^ depth=12,$/;" v +drop_rate configs\foodnet\ccnet_vit_768x768_80k.py /^ drop_rate=0.0,$/;" v +embed_dim configs\foodnet\ccnet_vit_768x768_80k.py /^ embed_dim=768,$/;" v +find_unused_parameters configs\foodnet\ccnet_vit_768x768_80k.py /^find_unused_parameters = True$/;" v +img_size configs\foodnet\ccnet_vit_768x768_80k.py /^ img_size=768,$/;" v +in_channels configs\foodnet\ccnet_vit_768x768_80k.py /^ in_channels=768,$/;" v +in_chans configs\foodnet\ccnet_vit_768x768_80k.py /^ in_chans=3,$/;" v +in_index configs\foodnet\ccnet_vit_768x768_80k.py /^ in_index=11,$/;" v +in_index configs\foodnet\ccnet_vit_768x768_80k.py /^ in_index=9,$/;" v +model configs\foodnet\ccnet_vit_768x768_80k.py /^model = dict($/;" v +model_name configs\foodnet\ccnet_vit_768x768_80k.py /^ model_name='vit_large_patch16_224',$/;" v +norm_cfg configs\foodnet\ccnet_vit_768x768_80k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\foodnet\ccnet_vit_768x768_80k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\foodnet\ccnet_vit_768x768_80k.py /^ num_classes=104,$/;" v +num_heads configs\foodnet\ccnet_vit_768x768_80k.py /^ num_heads=12, $/;" v +patch_size configs\foodnet\ccnet_vit_768x768_80k.py /^ patch_size=16, $/;" v +pos_embed_interp configs\foodnet\ccnet_vit_768x768_80k.py /^ pos_embed_interp=True,$/;" v +test_cfg configs\foodnet\ccnet_vit_768x768_80k.py /^test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512))$/;" v +type configs\foodnet\ccnet_vit_768x768_80k.py /^ type='VisionTransformer',$/;" v +type configs\foodnet\ccnet_vit_768x768_80k.py /^ type='EncoderDecoder',$/;" v +_base_ configs\foodnet\fpn_r50_512x1024_80k.py /^_base_ = [$/;" v +checkpoint_config configs\foodnet\fpn_r50_512x1024_80k.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +evaluation configs\foodnet\fpn_r50_512x1024_80k.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +model configs\foodnet\fpn_r50_512x1024_80k.py /^model = dict(decode_head=dict(num_classes=104))$/;" v +optimizer_config configs\foodnet\fpn_r50_512x1024_80k.py /^optimizer_config = dict()$/;" v +runner configs\foodnet\fpn_r50_512x1024_80k.py /^runner = dict(type='IterBasedRunner', max_iters=80000)$/;" v +_base_ configs\foodnet\fpn_r50_512x1024_80k_RM.py /^_base_ = [$/;" v +backbone configs\foodnet\fpn_r50_512x1024_80k_RM.py /^ backbone=dict(type='ResNet'), $/;" v +checkpoint_config configs\foodnet\fpn_r50_512x1024_80k_RM.py /^checkpoint_config = dict(by_epoch=False, interval=4000)$/;" v +decode_head configs\foodnet\fpn_r50_512x1024_80k_RM.py /^ decode_head=dict(num_classes=104))$/;" v +evaluation configs\foodnet\fpn_r50_512x1024_80k_RM.py /^evaluation = dict(interval=4000, metric='mIoU')$/;" v +model configs\foodnet\fpn_r50_512x1024_80k_RM.py /^model = dict(pretrained='.\/pretrained_model\/recipe1M_R50_LSTM.pth', $/;" v +optimizer_config configs\foodnet\fpn_r50_512x1024_80k_RM.py /^optimizer_config = dict()$/;" v +runner configs\foodnet\fpn_r50_512x1024_80k_RM.py /^runner = dict(type='IterBasedRunner', max_iters=80000)$/;" v +_base_ configs\fp16\deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x1024_80k_cityscapes.py'$/;" v +optimizer_config configs\fp16\deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py /^optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.)$/;" v +_base_ configs\fp16\deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py'$/;" v +optimizer_config configs\fp16\deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py /^optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.)$/;" v +_base_ configs\fp16\fcn_r101-d8_512x1024_80k_fp16_cityscapes.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x1024_80k_cityscapes.py'$/;" v +optimizer_config configs\fp16\fcn_r101-d8_512x1024_80k_fp16_cityscapes.py /^optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.)$/;" v +_base_ configs\fp16\pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x1024_80k_cityscapes.py'$/;" v +optimizer_config configs\fp16\pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py /^optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.)$/;" v +_base_ configs\gcnet\gcnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/gcnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\gcnet\gcnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\gcnet\gcnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/gcnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\gcnet\gcnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\gcnet\gcnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/gcnet_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\gcnet\gcnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\gcnet\gcnet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/gcnet_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\gcnet\gcnet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\gcnet\gcnet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/gcnet_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\gcnet\gcnet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\gcnet\gcnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/gcnet_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\gcnet\gcnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\gcnet\gcnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/gcnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\gcnet\gcnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\gcnet\gcnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/gcnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\gcnet\gcnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\gcnet\gcnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\gcnet\gcnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\gcnet\gcnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\gcnet\gcnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\gcnet\gcnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\gcnet\gcnet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\gcnet\gcnet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\gcnet\gcnet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\gcnet\gcnet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\gcnet\gcnet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\gcnet\gcnet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\gcnet\gcnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\gcnet\gcnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\gcnet\gcnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\gcnet\gcnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\gcnet\gcnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^_base_ = [$/;" v +decode_head configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +model configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^model = dict($/;" v +optimizer configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\hrnet\fcn_hr18_480x480_40k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +_base_ configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^_base_ = [$/;" v +decode_head configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60),$/;" v +model configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^model = dict($/;" v +optimizer configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\hrnet\fcn_hr18_480x480_80k_pascal_context.py /^ test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320)))$/;" v +_base_ configs\hrnet\fcn_hr18_512x1024_160k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\hrnet\fcn_hr18_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\hrnet\fcn_hr18_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\hrnet\fcn_hr18_512x512_160k_ade20k.py /^_base_ = [$/;" v +model configs\hrnet\fcn_hr18_512x512_160k_ade20k.py /^model = dict(decode_head=dict(num_classes=150))$/;" v +_base_ configs\hrnet\fcn_hr18_512x512_20k_voc12aug.py /^_base_ = [$/;" v +model configs\hrnet\fcn_hr18_512x512_20k_voc12aug.py /^model = dict(decode_head=dict(num_classes=21))$/;" v +_base_ configs\hrnet\fcn_hr18_512x512_40k_voc12aug.py /^_base_ = [$/;" v +model configs\hrnet\fcn_hr18_512x512_40k_voc12aug.py /^model = dict(decode_head=dict(num_classes=21))$/;" v +_base_ configs\hrnet\fcn_hr18_512x512_80k_ade20k.py /^_base_ = [$/;" v +model configs\hrnet\fcn_hr18_512x512_80k_ade20k.py /^model = dict(decode_head=dict(num_classes=150))$/;" v +_base_ configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^_base_ = '.\/fcn_hr18_480x480_40k_pascal_context.py'$/;" v +backbone configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ backbone=dict($/;" v +extra configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\hrnet\fcn_hr18s_480x480_40k_pascal_context.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^_base_ = '.\/fcn_hr18_480x480_80k_pascal_context.py'$/;" v +backbone configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ backbone=dict($/;" v +extra configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\hrnet\fcn_hr18s_480x480_80k_pascal_context.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_160k_cityscapes.py'$/;" v +backbone configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ backbone=dict($/;" v +extra configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\hrnet\fcn_hr18s_512x1024_160k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_40k_cityscapes.py'$/;" v +backbone configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +extra configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\hrnet\fcn_hr18s_512x1024_40k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_80k_cityscapes.py'$/;" v +backbone configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +extra configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\hrnet\fcn_hr18s_512x1024_80k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^_base_ = '.\/fcn_hr18_512x512_160k_ade20k.py'$/;" v +backbone configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ backbone=dict($/;" v +extra configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\hrnet\fcn_hr18s_512x512_160k_ade20k.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^_base_ = '.\/fcn_hr18_512x512_20k_voc12aug.py'$/;" v +backbone configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ backbone=dict($/;" v +extra configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\hrnet\fcn_hr18s_512x512_20k_voc12aug.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^_base_ = '.\/fcn_hr18_512x512_40k_voc12aug.py'$/;" v +backbone configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ backbone=dict($/;" v +extra configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\hrnet\fcn_hr18s_512x512_40k_voc12aug.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^_base_ = '.\/fcn_hr18_512x512_80k_ade20k.py'$/;" v +backbone configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ backbone=dict($/;" v +extra configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\hrnet\fcn_hr18s_512x512_80k_ade20k.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^_base_ = '.\/fcn_hr18_480x480_40k_pascal_context.py'$/;" v +backbone configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ backbone=dict($/;" v +decode_head configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ decode_head=dict($/;" v +extra configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\hrnet\fcn_hr48_480x480_40k_pascal_context.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +_base_ configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^_base_ = '.\/fcn_hr18_480x480_80k_pascal_context.py'$/;" v +backbone configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ backbone=dict($/;" v +decode_head configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ decode_head=dict($/;" v +extra configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\hrnet\fcn_hr48_480x480_80k_pascal_context.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +_base_ configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_160k_cityscapes.py'$/;" v +backbone configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ decode_head=dict($/;" v +extra configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +_base_ configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_40k_cityscapes.py'$/;" v +backbone configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ decode_head=dict($/;" v +extra configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\hrnet\fcn_hr48_512x1024_40k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +_base_ configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^_base_ = '.\/fcn_hr18_512x1024_80k_cityscapes.py'$/;" v +backbone configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +extra configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\hrnet\fcn_hr48_512x1024_80k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +_base_ configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^_base_ = '.\/fcn_hr18_512x512_160k_ade20k.py'$/;" v +backbone configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ backbone=dict($/;" v +decode_head configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ decode_head=dict($/;" v +extra configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\hrnet\fcn_hr48_512x512_160k_ade20k.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +_base_ configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^_base_ = '.\/fcn_hr18_512x512_20k_voc12aug.py'$/;" v +backbone configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ backbone=dict($/;" v +decode_head configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ decode_head=dict($/;" v +extra configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\hrnet\fcn_hr48_512x512_20k_voc12aug.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +_base_ configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^_base_ = '.\/fcn_hr18_512x512_40k_voc12aug.py'$/;" v +backbone configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ backbone=dict($/;" v +decode_head configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ decode_head=dict($/;" v +extra configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\hrnet\fcn_hr48_512x512_40k_voc12aug.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +_base_ configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^_base_ = '.\/fcn_hr18_512x512_80k_ade20k.py'$/;" v +backbone configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ backbone=dict($/;" v +decode_head configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ decode_head=dict($/;" v +extra configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ extra=dict($/;" v +model configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^model = dict($/;" v +pretrained configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\hrnet\fcn_hr48_512x512_80k_ade20k.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +_base_ configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_delete_ configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ _delete_=True,$/;" v +auxiliary_head configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=96))$/;" v +backbone configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ decode_head=dict(in_channels=320),$/;" v +dilations configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +model configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +out_indices configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ out_indices=(1, 2, 4, 6)),$/;" v +pretrained configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +strides configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +type configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ type='MobileNetV2',$/;" v +widen_factor configs\mobilenet_v2\deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py /^ widen_factor=1.,$/;" v +_base_ configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x512_160k_ade20k.py'$/;" v +_delete_ configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ _delete_=True,$/;" v +auxiliary_head configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(in_channels=96))$/;" v +backbone configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +decode_head configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ decode_head=dict(in_channels=320),$/;" v +dilations configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +model configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^model = dict($/;" v +out_indices configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ out_indices=(1, 2, 4, 6)),$/;" v +pretrained configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +strides configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +type configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ type='MobileNetV2',$/;" v +widen_factor configs\mobilenet_v2\deeplabv3_m-v2-d8_512x512_160k_ade20k.py /^ widen_factor=1.,$/;" v +_base_ configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_delete_ configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ _delete_=True,$/;" v +auxiliary_head configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=96))$/;" v +backbone configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ decode_head=dict(in_channels=320, c1_in_channels=24),$/;" v +dilations configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +model configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +out_indices configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ out_indices=(1, 2, 4, 6)),$/;" v +pretrained configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +strides configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +type configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ type='MobileNetV2',$/;" v +widen_factor configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py /^ widen_factor=1.,$/;" v +_base_ configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x512_160k_ade20k.py'$/;" v +_delete_ configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ _delete_=True,$/;" v +auxiliary_head configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(in_channels=96))$/;" v +backbone configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +decode_head configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ decode_head=dict(in_channels=320, c1_in_channels=24),$/;" v +dilations configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +model configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^model = dict($/;" v +out_indices configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ out_indices=(1, 2, 4, 6)),$/;" v +pretrained configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +strides configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +type configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ type='MobileNetV2',$/;" v +widen_factor configs\mobilenet_v2\deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py /^ widen_factor=1.,$/;" v +_base_ configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_delete_ configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ _delete_=True,$/;" v +auxiliary_head configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=96))$/;" v +backbone configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ decode_head=dict(in_channels=320),$/;" v +dilations configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +model configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +out_indices configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ out_indices=(1, 2, 4, 6)),$/;" v +pretrained configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +strides configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +type configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ type='MobileNetV2',$/;" v +widen_factor configs\mobilenet_v2\fcn_m-v2-d8_512x1024_80k_cityscapes.py /^ widen_factor=1.,$/;" v +_base_ configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x512_160k_ade20k.py'$/;" v +_delete_ configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ _delete_=True,$/;" v +auxiliary_head configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(in_channels=96))$/;" v +backbone configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +decode_head configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ decode_head=dict(in_channels=320),$/;" v +dilations configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +model configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^model = dict($/;" v +out_indices configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ out_indices=(1, 2, 4, 6)),$/;" v +pretrained configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +strides configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +type configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ type='MobileNetV2',$/;" v +widen_factor configs\mobilenet_v2\fcn_m-v2-d8_512x512_160k_ade20k.py /^ widen_factor=1.,$/;" v +_base_ configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x1024_80k_cityscapes.py'$/;" v +_delete_ configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ _delete_=True,$/;" v +auxiliary_head configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=96))$/;" v +backbone configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +decode_head configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ decode_head=dict(in_channels=320),$/;" v +dilations configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +model configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +out_indices configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ out_indices=(1, 2, 4, 6)),$/;" v +pretrained configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +strides configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +type configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ type='MobileNetV2',$/;" v +widen_factor configs\mobilenet_v2\pspnet_m-v2-d8_512x1024_80k_cityscapes.py /^ widen_factor=1.,$/;" v +_base_ configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x512_160k_ade20k.py'$/;" v +_delete_ configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ _delete_=True,$/;" v +auxiliary_head configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(in_channels=96))$/;" v +backbone configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +decode_head configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ decode_head=dict(in_channels=320),$/;" v +dilations configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ dilations=(1, 1, 1, 2, 2, 4, 4),$/;" v +model configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^model = dict($/;" v +out_indices configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ out_indices=(1, 2, 4, 6)),$/;" v +pretrained configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ pretrained='mmcls:\/\/mobilenet_v2',$/;" v +strides configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ strides=(1, 2, 2, 1, 1, 1, 1),$/;" v +type configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ type='MobileNetV2',$/;" v +widen_factor configs\mobilenet_v2\pspnet_m-v2-d8_512x512_160k_ade20k.py /^ widen_factor=1.,$/;" v +_base_ configs\mobilenet_v3\lraspp_m-v3-d8_512x1024_320k_cityscapes.py /^_base_ = [$/;" v +data configs\mobilenet_v3\lraspp_m-v3-d8_512x1024_320k_cityscapes.py /^data = dict(samples_per_gpu=4, workers_per_gpu=4)$/;" v +model configs\mobilenet_v3\lraspp_m-v3-d8_512x1024_320k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/contrib\/mobilenet_v3_large')$/;" v +runner configs\mobilenet_v3\lraspp_m-v3-d8_512x1024_320k_cityscapes.py /^runner = dict(type='IterBasedRunner', max_iters=320000)$/;" v +_base_ configs\mobilenet_v3\lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py /^_base_ = [$/;" v +data configs\mobilenet_v3\lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py /^data = dict(samples_per_gpu=4, workers_per_gpu=4)$/;" v +runner configs\mobilenet_v3\lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py /^runner = dict(type='IterBasedRunner', max_iters=320000)$/;" v +_base_ configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^_base_ = '.\/lraspp_m-v3-d8_512x1024_320k_cityscapes.py'$/;" v +act_cfg configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ act_cfg=dict(type='ReLU'),$/;" v +align_corners configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ align_corners=False,$/;" v +arch configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ arch='small',$/;" v +backbone configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ backbone=dict($/;" v +channels configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ decode_head=dict($/;" v +dropout_ratio configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ in_channels=(16, 16, 576),$/;" v +in_index configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ in_index=(0, 1, 2),$/;" v +input_transform configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ input_transform='multiple_select',$/;" v +loss_decode configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ loss_decode=dict($/;" v +model configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^model = dict($/;" v +norm_cfg configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ norm_cfg=norm_cfg),$/;" v +norm_cfg configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True)$/;" v +num_classes configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ num_classes=19,$/;" v +out_indices configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ out_indices=(0, 1, 12),$/;" v +pretrained configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ pretrained='open-mmlab:\/\/contrib\/mobilenet_v3_small',$/;" v +type configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ type='LRASPPHead',$/;" v +type configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ type='MobileNetV3',$/;" v +type configs\mobilenet_v3\lraspp_m-v3s-d8_512x1024_320k_cityscapes.py /^ type='EncoderDecoder',$/;" v +_base_ configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^_base_ = '.\/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py'$/;" v +act_cfg configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ act_cfg=dict(type='ReLU'),$/;" v +align_corners configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ align_corners=False,$/;" v +arch configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ arch='small',$/;" v +backbone configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ backbone=dict($/;" v +channels configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ decode_head=dict($/;" v +dropout_ratio configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ dropout_ratio=0.1,$/;" v +in_channels configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ in_channels=(16, 16, 576),$/;" v +in_index configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ in_index=(0, 1, 2),$/;" v +input_transform configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ input_transform='multiple_select',$/;" v +loss_decode configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ loss_decode=dict($/;" v +model configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^model = dict($/;" v +norm_cfg configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ norm_cfg=norm_cfg),$/;" v +norm_cfg configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True)$/;" v +num_classes configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ num_classes=19,$/;" v +out_indices configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ out_indices=(0, 1, 12),$/;" v +type configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ type='LRASPPHead',$/;" v +type configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ type='MobileNetV3',$/;" v +type configs\mobilenet_v3\lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py /^ type='EncoderDecoder',$/;" v +_base_ configs\nonlocal_net\nonlocal_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/nonlocal_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\nonlocal_net\nonlocal_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\nonlocal_net\nonlocal_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/nonlocal_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\nonlocal_net\nonlocal_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\nonlocal_net\nonlocal_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/nonlocal_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\nonlocal_net\nonlocal_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\nonlocal_net\nonlocal_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/nonlocal_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\nonlocal_net\nonlocal_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\nonlocal_net\nonlocal_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/nonlocal_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\nonlocal_net\nonlocal_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\nonlocal_net\nonlocal_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/nonlocal_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\nonlocal_net\nonlocal_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\nonlocal_net\nonlocal_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/nonlocal_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\nonlocal_net\nonlocal_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\nonlocal_net\nonlocal_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/nonlocal_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\nonlocal_net\nonlocal_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\nonlocal_net\nonlocal_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\nonlocal_net\nonlocal_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\nonlocal_net\nonlocal_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\nonlocal_net\nonlocal_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\nonlocal_net\nonlocal_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\nonlocal_net\nonlocal_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\nonlocal_net\nonlocal_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\nonlocal_net\nonlocal_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\nonlocal_net\nonlocal_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\nonlocal_net\nonlocal_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\nonlocal_net\nonlocal_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\nonlocal_net\nonlocal_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\nonlocal_net\nonlocal_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\nonlocal_net\nonlocal_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\nonlocal_net\nonlocal_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\nonlocal_net\nonlocal_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\ocrnet\ocrnet_hr18_512x1024_160k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\ocrnet\ocrnet_hr18_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\ocrnet\ocrnet_hr18_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^_base_ = [$/;" v +align_corners configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ align_corners=False,$/;" v +channels configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ channels=sum([18, 36, 72, 144]),$/;" v +concat_input configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ concat_input=False,$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ dropout_ratio=-1,$/;" v +in_channels configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_index configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^model = dict(decode_head=[$/;" v +norm_cfg configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ num_classes=150,$/;" v +num_convs configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ ocr_channels=256,$/;" v +type configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr18_512x512_160k_ade20k.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^_base_ = [$/;" v +align_corners configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ align_corners=False,$/;" v +channels configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ channels=sum([18, 36, 72, 144]),$/;" v +concat_input configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ concat_input=False,$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ dropout_ratio=-1,$/;" v +in_channels configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_index configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^model = dict(decode_head=[$/;" v +norm_cfg configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ num_classes=21,$/;" v +num_convs configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ ocr_channels=256,$/;" v +type configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr18_512x512_20k_voc12aug.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^_base_ = [$/;" v +align_corners configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ align_corners=False,$/;" v +channels configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ channels=sum([18, 36, 72, 144]),$/;" v +concat_input configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ concat_input=False,$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ dropout_ratio=-1,$/;" v +in_channels configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_index configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^model = dict(decode_head=[$/;" v +norm_cfg configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ num_classes=21,$/;" v +num_convs configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ ocr_channels=256,$/;" v +type configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr18_512x512_40k_voc12aug.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^_base_ = [$/;" v +align_corners configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ align_corners=False,$/;" v +channels configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ channels=sum([18, 36, 72, 144]),$/;" v +concat_input configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ concat_input=False,$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ dropout_ratio=-1,$/;" v +in_channels configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ in_channels=[18, 36, 72, 144],$/;" v +in_index configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^model = dict(decode_head=[$/;" v +norm_cfg configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ num_classes=150,$/;" v +num_convs configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ ocr_channels=256,$/;" v +type configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr18_512x512_80k_ade20k.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_160k_cityscapes.py'$/;" v +backbone configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ backbone=dict($/;" v +extra configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ extra=dict($/;" v +model configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^model = dict($/;" v +pretrained configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\ocrnet\ocrnet_hr18s_512x1024_160k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_40k_cityscapes.py'$/;" v +backbone configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +extra configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ extra=dict($/;" v +model configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^model = dict($/;" v +pretrained configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\ocrnet\ocrnet_hr18s_512x1024_40k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_80k_cityscapes.py'$/;" v +backbone configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +extra configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ extra=dict($/;" v +model configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\ocrnet\ocrnet_hr18s_512x1024_80k_cityscapes.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^_base_ = '.\/ocrnet_hr18_512x512_160k_ade20k.py'$/;" v +backbone configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ backbone=dict($/;" v +extra configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ extra=dict($/;" v +model configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^model = dict($/;" v +pretrained configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\ocrnet\ocrnet_hr18s_512x512_160k_ade20k.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^_base_ = '.\/ocrnet_hr18_512x512_20k_voc12aug.py'$/;" v +backbone configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ backbone=dict($/;" v +extra configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ extra=dict($/;" v +model configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^model = dict($/;" v +pretrained configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\ocrnet\ocrnet_hr18s_512x512_20k_voc12aug.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^_base_ = '.\/ocrnet_hr18_512x512_40k_voc12aug.py'$/;" v +backbone configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ backbone=dict($/;" v +extra configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ extra=dict($/;" v +model configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^model = dict($/;" v +pretrained configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\ocrnet\ocrnet_hr18s_512x512_40k_voc12aug.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^_base_ = '.\/ocrnet_hr18_512x512_80k_ade20k.py'$/;" v +backbone configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ backbone=dict($/;" v +extra configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ extra=dict($/;" v +model configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^model = dict($/;" v +pretrained configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w18_small',$/;" v +stage1 configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ stage1=dict(num_blocks=(2, )),$/;" v +stage2 configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ stage2=dict(num_blocks=(2, 2)),$/;" v +stage3 configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ stage3=dict(num_modules=3, num_blocks=(2, 2, 2)),$/;" v +stage4 configs\ocrnet\ocrnet_hr18s_512x512_80k_ade20k.py /^ stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2)))))$/;" v +_base_ configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_160k_cityscapes.py'$/;" v +align_corners configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ align_corners=False,$/;" v +backbone configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ backbone=dict($/;" v +channels configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ channels=sum([48, 96, 192, 384]),$/;" v +concat_input configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ concat_input=False,$/;" v +decode_head configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ decode_head=[$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ dropout_ratio=-1,$/;" v +extra configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ extra=dict($/;" v +in_channels configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_index configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^model = dict($/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ num_classes=19,$/;" v +num_convs configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ ocr_channels=256,$/;" v +pretrained configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +type configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr48_512x1024_160k_cityscapes.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_40k_cityscapes.py'$/;" v +align_corners configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ align_corners=False,$/;" v +backbone configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ backbone=dict($/;" v +channels configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ channels=sum([48, 96, 192, 384]),$/;" v +concat_input configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ concat_input=False,$/;" v +decode_head configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ decode_head=[$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ dropout_ratio=-1,$/;" v +extra configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ extra=dict($/;" v +in_channels configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_index configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^model = dict($/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ num_classes=19,$/;" v +num_convs configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ ocr_channels=256,$/;" v +pretrained configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +type configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr48_512x1024_40k_cityscapes.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^_base_ = '.\/ocrnet_hr18_512x1024_80k_cityscapes.py'$/;" v +align_corners configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ align_corners=False,$/;" v +backbone configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +channels configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ channels=sum([48, 96, 192, 384]),$/;" v +concat_input configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ concat_input=False,$/;" v +decode_head configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ decode_head=[$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ dropout_ratio=-1,$/;" v +extra configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ extra=dict($/;" v +in_channels configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_index configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^model = dict($/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ num_classes=19,$/;" v +num_convs configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ ocr_channels=256,$/;" v +pretrained configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +type configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr48_512x1024_80k_cityscapes.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^_base_ = '.\/ocrnet_hr18_512x512_160k_ade20k.py'$/;" v +align_corners configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ align_corners=False,$/;" v +backbone configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ backbone=dict($/;" v +channels configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ channels=sum([48, 96, 192, 384]),$/;" v +concat_input configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ concat_input=False,$/;" v +decode_head configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ decode_head=[$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ dropout_ratio=-1,$/;" v +extra configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ extra=dict($/;" v +in_channels configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_index configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^model = dict($/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ num_classes=150,$/;" v +num_convs configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ ocr_channels=256,$/;" v +pretrained configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +type configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr48_512x512_160k_ade20k.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^_base_ = '.\/ocrnet_hr18_512x512_20k_voc12aug.py'$/;" v +align_corners configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ align_corners=False,$/;" v +backbone configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ backbone=dict($/;" v +channels configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ channels=sum([48, 96, 192, 384]),$/;" v +concat_input configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ concat_input=False,$/;" v +decode_head configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ decode_head=[$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ dropout_ratio=-1,$/;" v +extra configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ extra=dict($/;" v +in_channels configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_index configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^model = dict($/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ num_classes=21,$/;" v +num_convs configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ ocr_channels=256,$/;" v +pretrained configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +type configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr48_512x512_20k_voc12aug.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^_base_ = '.\/ocrnet_hr18_512x512_40k_voc12aug.py'$/;" v +align_corners configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ align_corners=False,$/;" v +backbone configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ backbone=dict($/;" v +channels configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ channels=sum([48, 96, 192, 384]),$/;" v +concat_input configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ concat_input=False,$/;" v +decode_head configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ decode_head=[$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ dropout_ratio=-1,$/;" v +extra configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ extra=dict($/;" v +in_channels configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_index configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^model = dict($/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ num_classes=21,$/;" v +num_convs configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ ocr_channels=256,$/;" v +pretrained configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +type configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr48_512x512_40k_voc12aug.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^_base_ = '.\/ocrnet_hr18_512x512_80k_ade20k.py'$/;" v +align_corners configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ align_corners=False,$/;" v +backbone configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ backbone=dict($/;" v +channels configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ channels=512,$/;" v +channels configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ channels=sum([48, 96, 192, 384]),$/;" v +concat_input configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ concat_input=False,$/;" v +decode_head configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ decode_head=[$/;" v +dropout_ratio configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ dropout_ratio=-1,$/;" v +extra configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ extra=dict($/;" v +in_channels configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ in_channels=[48, 96, 192, 384],$/;" v +in_index configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ in_index=(0, 1, 2, 3),$/;" v +input_transform configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ input_transform='resize_concat',$/;" v +kernel_size configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ kernel_size=1,$/;" v +loss_decode configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ loss_decode=dict($/;" v +model configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^model = dict($/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ num_classes=150,$/;" v +num_convs configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ num_convs=1,$/;" v +ocr_channels configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ ocr_channels=256,$/;" v +pretrained configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ pretrained='open-mmlab:\/\/msra\/hrnetv2_w48',$/;" v +stage2 configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ stage2=dict(num_channels=(48, 96)),$/;" v +stage3 configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ stage3=dict(num_channels=(48, 96, 192)),$/;" v +stage4 configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ stage4=dict(num_channels=(48, 96, 192, 384)))),$/;" v +type configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ type='FCNHead',$/;" v +type configs\ocrnet\ocrnet_hr48_512x512_80k_ade20k.py /^ type='OCRHead',$/;" v +_base_ configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py /^_base_ = [$/;" v +lr_config configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py /^lr_config = dict(min_lr=2e-4)$/;" v +model configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +optimizer configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py /^optimizer = dict(lr=0.02)$/;" v +_base_ configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py /^_base_ = [$/;" v +model configs\ocrnet\ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\ocrnet\ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py /^_base_ = [$/;" v +lr_config configs\ocrnet\ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py /^lr_config = dict(min_lr=2e-4)$/;" v +model configs\ocrnet\ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +optimizer configs\ocrnet\ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py /^optimizer = dict(lr=0.02)$/;" v +_base_ configs\point_rend\pointrend_r101_512x1024_80k_cityscapes.py /^_base_ = '.\/pointrend_r50_512x1024_80k_cityscapes.py'$/;" v +model configs\point_rend\pointrend_r101_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\point_rend\pointrend_r101_512x512_160k_ade20k.py /^_base_ = '.\/pointrend_r50_512x512_160k_ade20k.py'$/;" v +model configs\point_rend\pointrend_r101_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\point_rend\pointrend_r50_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +lr_config configs\point_rend\pointrend_r50_512x1024_80k_cityscapes.py /^lr_config = dict(warmup='linear', warmup_iters=200)$/;" v +_base_ configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^_base_ = [$/;" v +align_corners configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ align_corners=False,$/;" v +channels configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ channels=128,$/;" v +channels configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ channels=256,$/;" v +coarse_pred_each_layer configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ coarse_pred_each_layer=True,$/;" v +dropout_ratio configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ dropout_ratio=-1,$/;" v +feature_strides configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ feature_strides=[4, 8, 16, 32],$/;" v +in_channels configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ in_channels=[256, 256, 256, 256],$/;" v +in_channels configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ in_channels=[256],$/;" v +in_index configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ in_index=[0, 1, 2, 3],$/;" v +in_index configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ in_index=[0],$/;" v +loss_decode configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ loss_decode=dict($/;" v +lr_config configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^lr_config = dict(warmup='linear', warmup_iters=200)$/;" v +model configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^model = dict(decode_head=[$/;" v +norm_cfg configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ norm_cfg=norm_cfg,$/;" v +norm_cfg configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^norm_cfg = dict(type='SyncBN', requires_grad=True)$/;" v +num_classes configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ num_classes=150,$/;" v +num_fcs configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ num_fcs=3,$/;" v +type configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ type='FPNHead',$/;" v +type configs\point_rend\pointrend_r50_512x512_160k_ade20k.py /^ type='PointHead',$/;" v +_base_ configs\psanet\psanet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/psanet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\psanet\psanet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\psanet\psanet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/psanet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\psanet\psanet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\psanet\psanet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/psanet_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\psanet\psanet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\psanet\psanet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/psanet_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\psanet\psanet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\psanet\psanet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/psanet_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\psanet\psanet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\psanet\psanet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/psanet_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\psanet\psanet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\psanet\psanet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/psanet_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\psanet\psanet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\psanet\psanet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/psanet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\psanet\psanet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\psanet\psanet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\psanet\psanet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\psanet\psanet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +auxiliary_head configs\psanet\psanet_r50-d8_512x512_160k_ade20k.py /^ auxiliary_head=dict(num_classes=150))$/;" v +decode_head configs\psanet\psanet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(mask_size=(66, 66), num_classes=150),$/;" v +model configs\psanet\psanet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\psanet\psanet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\psanet\psanet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\psanet\psanet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\psanet\psanet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\psanet\psanet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\psanet\psanet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\psanet\psanet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +auxiliary_head configs\psanet\psanet_r50-d8_512x512_80k_ade20k.py /^ auxiliary_head=dict(num_classes=150))$/;" v +decode_head configs\psanet\psanet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(mask_size=(66, 66), num_classes=150),$/;" v +model configs\psanet\psanet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\psanet\psanet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\psanet\psanet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_480x480_40k_pascal_context.py /^_base_ = '.\/pspnet_r50-d8_480x480_40k_pascal_context.py'$/;" v +model configs\pspnet\pspnet_r101-d8_480x480_40k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_480x480_80k_pascal_context.py /^_base_ = '.\/pspnet_r50-d8_480x480_80k_pascal_context.py'$/;" v +model configs\pspnet\pspnet_r101-d8_480x480_80k_pascal_context.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_512x1024_40k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_40k_cityscapes.py'$/;" v +model configs\pspnet\pspnet_r101-d8_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\pspnet\pspnet_r101-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_512x512_160k_ade20k.py /^_base_ = '.\/pspnet_r50-d8_512x512_160k_ade20k.py'$/;" v +model configs\pspnet\pspnet_r101-d8_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_512x512_20k_voc12aug.py /^_base_ = '.\/pspnet_r50-d8_512x512_20k_voc12aug.py'$/;" v +model configs\pspnet\pspnet_r101-d8_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_512x512_40k_voc12aug.py /^_base_ = '.\/pspnet_r50-d8_512x512_40k_voc12aug.py'$/;" v +model configs\pspnet\pspnet_r101-d8_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_512x512_80k_ade20k.py /^_base_ = '.\/pspnet_r50-d8_512x512_80k_ade20k.py'$/;" v +model configs\pspnet\pspnet_r101-d8_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_769x769_40k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_40k_cityscapes.py'$/;" v +model configs\pspnet\pspnet_r101-d8_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\pspnet\pspnet_r101-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\pspnet\pspnet_r101b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +backbone configs\pspnet\pspnet_r101b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +model configs\pspnet\pspnet_r101b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\pspnet\pspnet_r101b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +_base_ configs\pspnet\pspnet_r101b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +backbone configs\pspnet\pspnet_r101b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=101))$/;" v +model configs\pspnet\pspnet_r101b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\pspnet\pspnet_r101b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet101',$/;" v +_base_ configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +auxiliary_head configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +channels configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\pspnet\pspnet_r18-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +_base_ configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +auxiliary_head configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ backbone=dict(depth=18),$/;" v +channels configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\pspnet\pspnet_r18-d8_769x769_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnet18_v1c',$/;" v +_base_ configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +auxiliary_head configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +channels configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\pspnet\pspnet_r18b-d8_512x1024_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +_base_ configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +auxiliary_head configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(in_channels=256, channels=64))$/;" v +backbone configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ backbone=dict(type='ResNet', depth=18),$/;" v +channels configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ channels=128,$/;" v +decode_head configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ decode_head=dict($/;" v +in_channels configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ in_channels=512,$/;" v +model configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\pspnet\pspnet_r18b-d8_769x769_80k_cityscapes.py /^ pretrained='torchvision:\/\/resnet18',$/;" v +_base_ configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^_base_ = [$/;" v +decode_head configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^ decode_head=dict(num_classes=60), auxiliary_head=dict(num_classes=60))$/;" v +model configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^model = dict($/;" v +optimizer configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\pspnet\pspnet_r50-d8_480x480_40k_pascal_context.py /^test_cfg = dict(mode='slide', crop_size=(480, 480), stride=(320, 320))$/;" v +_base_ configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^_base_ = [$/;" v +decode_head configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^ decode_head=dict(num_classes=60), auxiliary_head=dict(num_classes=60))$/;" v +model configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^model = dict($/;" v +optimizer configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001)$/;" v +test_cfg configs\pspnet\pspnet_r50-d8_480x480_80k_pascal_context.py /^test_cfg = dict(mode='slide', crop_size=(480, 480), stride=(320, 320))$/;" v +_base_ configs\pspnet\pspnet_r50-d8_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\pspnet\pspnet_r50-d8_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\pspnet\pspnet_r50-d8_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\pspnet\pspnet_r50-d8_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\pspnet\pspnet_r50-d8_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\pspnet\pspnet_r50-d8_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\pspnet\pspnet_r50-d8_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\pspnet\pspnet_r50-d8_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\pspnet\pspnet_r50-d8_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\pspnet\pspnet_r50-d8_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\pspnet\pspnet_r50-d8_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\pspnet\pspnet_r50-d8_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\pspnet\pspnet_r50-d8_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\pspnet\pspnet_r50-d8_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\pspnet\pspnet_r50-d8_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\pspnet\pspnet_r50-d8_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\pspnet\pspnet_r50b-d8_512x1024_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_512x1024_80k_cityscapes.py'$/;" v +model configs\pspnet\pspnet_r50b-d8_512x1024_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +_base_ configs\pspnet\pspnet_r50b-d8_769x769_80k_cityscapes.py /^_base_ = '.\/pspnet_r50-d8_769x769_80k_cityscapes.py'$/;" v +model configs\pspnet\pspnet_r50b-d8_769x769_80k_cityscapes.py /^model = dict(pretrained='torchvision:\/\/resnet50', backbone=dict(type='ResNet'))$/;" v +_base_ configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x1024_80k_cityscapes.py'$/;" v +avg_down_stride configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ avg_down_stride=True))$/;" v +backbone configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +model configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +radix configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ radix=2,$/;" v +reduction_factor configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ reduction_factor=4,$/;" v +stem_channels configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ stem_channels=128,$/;" v +type configs\resnest\deeplabv3_s101-d8_512x1024_80k_cityscapes.py /^ type='ResNeSt',$/;" v +_base_ configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^_base_ = '..\/deeplabv3\/deeplabv3_r101-d8_512x512_160k_ade20k.py'$/;" v +avg_down_stride configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ avg_down_stride=True))$/;" v +backbone configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +model configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^model = dict($/;" v +pretrained configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +radix configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ radix=2,$/;" v +reduction_factor configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ reduction_factor=4,$/;" v +stem_channels configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ stem_channels=128,$/;" v +type configs\resnest\deeplabv3_s101-d8_512x512_160k_ade20k.py /^ type='ResNeSt',$/;" v +_base_ configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py'$/;" v +avg_down_stride configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ avg_down_stride=True))$/;" v +backbone configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +model configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +radix configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ radix=2,$/;" v +reduction_factor configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ reduction_factor=4,$/;" v +stem_channels configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ stem_channels=128,$/;" v +type configs\resnest\deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py /^ type='ResNeSt',$/;" v +_base_ configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^_base_ = '..\/deeplabv3plus\/deeplabv3plus_r101-d8_512x512_160k_ade20k.py'$/;" v +avg_down_stride configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ avg_down_stride=True))$/;" v +backbone configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +model configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^model = dict($/;" v +pretrained configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +radix configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ radix=2,$/;" v +reduction_factor configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ reduction_factor=4,$/;" v +stem_channels configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ stem_channels=128,$/;" v +type configs\resnest\deeplabv3plus_s101-d8_512x512_160k_ade20k.py /^ type='ResNeSt',$/;" v +_base_ configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x1024_80k_cityscapes.py'$/;" v +avg_down_stride configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ avg_down_stride=True))$/;" v +backbone configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +model configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +radix configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ radix=2,$/;" v +reduction_factor configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ reduction_factor=4,$/;" v +stem_channels configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ stem_channels=128,$/;" v +type configs\resnest\fcn_s101-d8_512x1024_80k_cityscapes.py /^ type='ResNeSt',$/;" v +_base_ configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^_base_ = '..\/fcn\/fcn_r101-d8_512x512_160k_ade20k.py'$/;" v +avg_down_stride configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ avg_down_stride=True))$/;" v +backbone configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +model configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^model = dict($/;" v +pretrained configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +radix configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ radix=2,$/;" v +reduction_factor configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ reduction_factor=4,$/;" v +stem_channels configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ stem_channels=128,$/;" v +type configs\resnest\fcn_s101-d8_512x512_160k_ade20k.py /^ type='ResNeSt',$/;" v +_base_ configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x1024_80k_cityscapes.py'$/;" v +avg_down_stride configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ avg_down_stride=True))$/;" v +backbone configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ backbone=dict($/;" v +model configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^model = dict($/;" v +pretrained configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +radix configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ radix=2,$/;" v +reduction_factor configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ reduction_factor=4,$/;" v +stem_channels configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ stem_channels=128,$/;" v +type configs\resnest\pspnet_s101-d8_512x1024_80k_cityscapes.py /^ type='ResNeSt',$/;" v +_base_ configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^_base_ = '..\/pspnet\/pspnet_r101-d8_512x512_160k_ade20k.py'$/;" v +avg_down_stride configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ avg_down_stride=True))$/;" v +backbone configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ backbone=dict($/;" v +model configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^model = dict($/;" v +pretrained configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ pretrained='open-mmlab:\/\/resnest101',$/;" v +radix configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ radix=2,$/;" v +reduction_factor configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ reduction_factor=4,$/;" v +stem_channels configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ stem_channels=128,$/;" v +type configs\resnest\pspnet_s101-d8_512x512_160k_ade20k.py /^ type='ResNeSt',$/;" v +_base_ configs\sem_fpn\fpn_r101_512x1024_80k_cityscapes.py /^_base_ = '.\/fpn_r50_512x1024_80k_cityscapes.py'$/;" v +model configs\sem_fpn\fpn_r101_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\sem_fpn\fpn_r101_512x512_160k_ade20k.py /^_base_ = '.\/fpn_r50_512x512_160k_ade20k.py'$/;" v +model configs\sem_fpn\fpn_r101_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\sem_fpn\fpn_r50_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\sem_fpn\fpn_r50_512x512_160k_ade20k.py /^_base_ = [$/;" v +model configs\sem_fpn\fpn_r50_512x512_160k_ade20k.py /^model = dict(decode_head=dict(num_classes=150))$/;" v +_base_ configs\unet\deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py /^_base_ = [$/;" v +evaluation configs\unet\deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +_base_ configs\unet\deeplabv3_unet_s5-d16_128x128_40k_stare.py /^_base_ = [$/;" v +evaluation configs\unet\deeplabv3_unet_s5-d16_128x128_40k_stare.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\deeplabv3_unet_s5-d16_128x128_40k_stare.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +_base_ configs\unet\deeplabv3_unet_s5-d16_256x256_40k_hrf.py /^_base_ = [$/;" v +evaluation configs\unet\deeplabv3_unet_s5-d16_256x256_40k_hrf.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\deeplabv3_unet_s5-d16_256x256_40k_hrf.py /^model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170)))$/;" v +_base_ configs\unet\deeplabv3_unet_s5-d16_64x64_40k_drive.py /^_base_ = [$/;" v +evaluation configs\unet\deeplabv3_unet_s5-d16_64x64_40k_drive.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\deeplabv3_unet_s5-d16_64x64_40k_drive.py /^model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42)))$/;" v +_base_ configs\unet\fcn_unet_s5-d16_128x128_40k_chase_db1.py /^_base_ = [$/;" v +evaluation configs\unet\fcn_unet_s5-d16_128x128_40k_chase_db1.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\fcn_unet_s5-d16_128x128_40k_chase_db1.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +_base_ configs\unet\fcn_unet_s5-d16_128x128_40k_stare.py /^_base_ = [$/;" v +evaluation configs\unet\fcn_unet_s5-d16_128x128_40k_stare.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\fcn_unet_s5-d16_128x128_40k_stare.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +_base_ configs\unet\fcn_unet_s5-d16_256x256_40k_hrf.py /^_base_ = [$/;" v +evaluation configs\unet\fcn_unet_s5-d16_256x256_40k_hrf.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\fcn_unet_s5-d16_256x256_40k_hrf.py /^model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170)))$/;" v +_base_ configs\unet\fcn_unet_s5-d16_64x64_40k_drive.py /^_base_ = [$/;" v +evaluation configs\unet\fcn_unet_s5-d16_64x64_40k_drive.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\fcn_unet_s5-d16_64x64_40k_drive.py /^model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42)))$/;" v +_base_ configs\unet\pspnet_unet_s5-d16_128x128_40k_chase_db1.py /^_base_ = [$/;" v +evaluation configs\unet\pspnet_unet_s5-d16_128x128_40k_chase_db1.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\pspnet_unet_s5-d16_128x128_40k_chase_db1.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +_base_ configs\unet\pspnet_unet_s5-d16_128x128_40k_stare.py /^_base_ = [$/;" v +evaluation configs\unet\pspnet_unet_s5-d16_128x128_40k_stare.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\pspnet_unet_s5-d16_128x128_40k_stare.py /^model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85)))$/;" v +_base_ configs\unet\pspnet_unet_s5-d16_256x256_40k_hrf.py /^_base_ = [$/;" v +evaluation configs\unet\pspnet_unet_s5-d16_256x256_40k_hrf.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\pspnet_unet_s5-d16_256x256_40k_hrf.py /^model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170)))$/;" v +_base_ configs\unet\pspnet_unet_s5-d16_64x64_40k_drive.py /^_base_ = [$/;" v +evaluation configs\unet\pspnet_unet_s5-d16_64x64_40k_drive.py /^evaluation = dict(metric='mDice')$/;" v +model configs\unet\pspnet_unet_s5-d16_64x64_40k_drive.py /^model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42)))$/;" v +_base_ configs\upernet\upernet_r101_512x1024_40k_cityscapes.py /^_base_ = '.\/upernet_r50_512x1024_40k_cityscapes.py'$/;" v +model configs\upernet\upernet_r101_512x1024_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\upernet\upernet_r101_512x1024_80k_cityscapes.py /^_base_ = '.\/upernet_r50_512x1024_80k_cityscapes.py'$/;" v +model configs\upernet\upernet_r101_512x1024_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\upernet\upernet_r101_512x512_160k_ade20k.py /^_base_ = '.\/upernet_r50_512x512_160k_ade20k.py'$/;" v +model configs\upernet\upernet_r101_512x512_160k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\upernet\upernet_r101_512x512_20k_voc12aug.py /^_base_ = '.\/upernet_r50_512x512_20k_voc12aug.py'$/;" v +model configs\upernet\upernet_r101_512x512_20k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\upernet\upernet_r101_512x512_40k_voc12aug.py /^_base_ = '.\/upernet_r50_512x512_40k_voc12aug.py'$/;" v +model configs\upernet\upernet_r101_512x512_40k_voc12aug.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\upernet\upernet_r101_512x512_80k_ade20k.py /^_base_ = '.\/upernet_r50_512x512_80k_ade20k.py'$/;" v +model configs\upernet\upernet_r101_512x512_80k_ade20k.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\upernet\upernet_r101_769x769_40k_cityscapes.py /^_base_ = '.\/upernet_r50_769x769_40k_cityscapes.py'$/;" v +model configs\upernet\upernet_r101_769x769_40k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\upernet\upernet_r101_769x769_80k_cityscapes.py /^_base_ = '.\/upernet_r50_769x769_80k_cityscapes.py'$/;" v +model configs\upernet\upernet_r101_769x769_80k_cityscapes.py /^model = dict(pretrained='open-mmlab:\/\/resnet101_v1c', backbone=dict(depth=101))$/;" v +_base_ configs\upernet\upernet_r50_512x1024_40k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\upernet\upernet_r50_512x1024_80k_cityscapes.py /^_base_ = [$/;" v +_base_ configs\upernet\upernet_r50_512x512_160k_ade20k.py /^_base_ = [$/;" v +decode_head configs\upernet\upernet_r50_512x512_160k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\upernet\upernet_r50_512x512_160k_ade20k.py /^model = dict($/;" v +_base_ configs\upernet\upernet_r50_512x512_20k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\upernet\upernet_r50_512x512_20k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\upernet\upernet_r50_512x512_20k_voc12aug.py /^model = dict($/;" v +_base_ configs\upernet\upernet_r50_512x512_40k_voc12aug.py /^_base_ = [$/;" v +decode_head configs\upernet\upernet_r50_512x512_40k_voc12aug.py /^ decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))$/;" v +model configs\upernet\upernet_r50_512x512_40k_voc12aug.py /^model = dict($/;" v +_base_ configs\upernet\upernet_r50_512x512_80k_ade20k.py /^_base_ = [$/;" v +decode_head configs\upernet\upernet_r50_512x512_80k_ade20k.py /^ decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150))$/;" v +model configs\upernet\upernet_r50_512x512_80k_ade20k.py /^model = dict($/;" v +_base_ configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^model = dict($/;" v +test_cfg configs\upernet\upernet_r50_769x769_40k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +_base_ configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^_base_ = [$/;" v +auxiliary_head configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^ auxiliary_head=dict(align_corners=True),$/;" v +decode_head configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^ decode_head=dict(align_corners=True),$/;" v +model configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^model = dict($/;" v +test_cfg configs\upernet\upernet_r50_769x769_80k_cityscapes.py /^ test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513)))$/;" v +ArgumentParser demo\image_demo.py /^from argparse import ArgumentParser$/;" i +get_palette demo\image_demo.py /^from mmseg.core.evaluation import get_palette$/;" i +inference_segmentor demo\image_demo.py /^from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +init_segmentor demo\image_demo.py /^from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +main demo\image_demo.py /^def main():$/;" f +show_result_pyplot demo\image_demo.py /^from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +author docs\conf.py /^author = 'MMSegmentation Authors'$/;" v +autodoc_mock_imports docs\conf.py /^autodoc_mock_imports = ['matplotlib', 'pycocotools', 'mmseg.version']$/;" v +builder_inited_handler docs\conf.py /^def builder_inited_handler(app):$/;" f +copyright docs\conf.py /^copyright = '2020-2020, OpenMMLab'$/;" v +exclude_patterns docs\conf.py /^exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']$/;" v +extensions docs\conf.py /^extensions = [$/;" v +get_version docs\conf.py /^def get_version():$/;" f +html_static_path docs\conf.py /^html_static_path = ['_static']$/;" v +html_theme docs\conf.py /^html_theme = 'sphinx_rtd_theme'$/;" v +master_doc docs\conf.py /^master_doc = 'index'$/;" v +os docs\conf.py /^import os$/;" i +project docs\conf.py /^project = 'MMSegmentation'$/;" v +release docs\conf.py /^release = get_version()$/;" v +setup docs\conf.py /^def setup(app):$/;" f +source_suffix docs\conf.py /^source_suffix = {$/;" v +subprocess docs\conf.py /^import subprocess$/;" i +sys docs\conf.py /^import sys$/;" i +templates_path docs\conf.py /^templates_path = ['_templates']$/;" v +version_file docs\conf.py /^version_file = '..\/mmseg\/version.py'$/;" v +BUILDDIR docs\make.bat /^set BUILDDIR=_build$/;" v +SOURCEDIR docs\make.bat /^set SOURCEDIR=.$/;" v +SPHINXBUILD docs\make.bat /^ set SPHINXBUILD=sphinx-build$/;" v +end docs\make.bat /^:end$/;" l +help docs\make.bat /^:help$/;" l +_papertype docs\stat.py /^ _papertype = [x for x in re.findall(r'\\[([A-Z]+)\\]', content)]$/;" v +allpapers docs\stat.py /^allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats])$/;" v +ckpts docs\stat.py /^ ckpts = set(x.lower().strip()$/;" v +content docs\stat.py /^ content = content_file.read()$/;" v +countstr docs\stat.py /^countstr = '\\n'.join($/;" v +files docs\stat.py /^files = sorted(glob.glob('..\/configs\/*\/README.md'))$/;" v +func docs\stat.py /^import functools as func$/;" i +glob docs\stat.py /^import glob$/;" i +msglist docs\stat.py /^msglist = '\\n'.join(x for _, _, x in stats)$/;" v +np docs\stat.py /^import numpy as np$/;" i +num_ckpts docs\stat.py /^num_ckpts = 0$/;" v +os docs\stat.py /^import os.path as osp$/;" i +osp docs\stat.py /^import os.path as osp$/;" i +paper docs\stat.py /^ paper = set([(papertype, title)])$/;" v +papertype docs\stat.py /^ papertype = _papertype[0]$/;" v +re docs\stat.py /^import re$/;" i +return_counts docs\stat.py /^ return_counts=True)$/;" v +stats docs\stat.py /^stats = []$/;" v +title docs\stat.py /^ title = content.split('\\n')[0].replace('#', '').strip()$/;" v +titles docs\stat.py /^titles = []$/;" v +url docs\stat.py /^ url = osp.dirname(f.replace('..\/', url_prefix))$/;" v +url_prefix docs\stat.py /^url_prefix = 'https:\/\/github.com\/open-mmlab\/mmsegmentation\/blob\/master\/'$/;" v +MMCV_MAX mmseg\__init__.py /^MMCV_MAX = '1.3.0'$/;" v +MMCV_MIN mmseg\__init__.py /^MMCV_MIN = '1.1.4'$/;" v +__all__ mmseg\__init__.py /^__all__ = ['__version__', 'version_info']$/;" v +__version__ mmseg\__init__.py /^from .version import __version__, version_info$/;" i +digit_version mmseg\__init__.py /^def digit_version(version_str):$/;" f +mmcv mmseg\__init__.py /^import mmcv$/;" i +mmcv_max_version mmseg\__init__.py /^mmcv_max_version = digit_version(MMCV_MAX)$/;" v +mmcv_min_version mmseg\__init__.py /^mmcv_min_version = digit_version(MMCV_MIN)$/;" v +mmcv_version mmseg\__init__.py /^mmcv_version = digit_version(mmcv.__version__)$/;" v +version_info mmseg\__init__.py /^from .version import __version__, version_info$/;" i +__all__ mmseg\apis\__init__.py /^__all__ = [$/;" v +get_root_logger mmseg\apis\__init__.py /^from .train import get_root_logger, set_random_seed, train_segmentor$/;" i +inference_segmentor mmseg\apis\__init__.py /^from .inference import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +init_segmentor mmseg\apis\__init__.py /^from .inference import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +multi_gpu_test mmseg\apis\__init__.py /^from .test import multi_gpu_test, single_gpu_test$/;" i +set_random_seed mmseg\apis\__init__.py /^from .train import get_root_logger, set_random_seed, train_segmentor$/;" i +show_result_pyplot mmseg\apis\__init__.py /^from .inference import inference_segmentor, init_segmentor, show_result_pyplot$/;" i +single_gpu_test mmseg\apis\__init__.py /^from .test import multi_gpu_test, single_gpu_test$/;" i +train_segmentor mmseg\apis\__init__.py /^from .train import get_root_logger, set_random_seed, train_segmentor$/;" i +Compose mmseg\apis\inference.py /^from mmseg.datasets.pipelines import Compose$/;" i +LoadImage mmseg\apis\inference.py /^class LoadImage:$/;" c +__call__ mmseg\apis\inference.py /^ def __call__(self, results):$/;" m class:LoadImage file: +build_segmentor mmseg\apis\inference.py /^from mmseg.models import build_segmentor$/;" i +collate mmseg\apis\inference.py /^from mmcv.parallel import collate, scatter$/;" i +inference_segmentor mmseg\apis\inference.py /^def inference_segmentor(model, img):$/;" f +init_segmentor mmseg\apis\inference.py /^def init_segmentor(config, checkpoint=None, device='cuda:0'):$/;" f +load_checkpoint mmseg\apis\inference.py /^from mmcv.runner import load_checkpoint$/;" i +matplotlib mmseg\apis\inference.py /^import matplotlib.pyplot as plt$/;" i +mmcv mmseg\apis\inference.py /^import mmcv$/;" i +plt mmseg\apis\inference.py /^import matplotlib.pyplot as plt$/;" i +scatter mmseg\apis\inference.py /^from mmcv.parallel import collate, scatter$/;" i +show_result_pyplot mmseg\apis\inference.py /^def show_result_pyplot(model, img, result, palette=None, fig_size=(15, 10)):$/;" f +torch mmseg\apis\inference.py /^import torch$/;" i +collect_results_cpu mmseg\apis\test.py /^def collect_results_cpu(result_part, size, tmpdir=None):$/;" f +collect_results_gpu mmseg\apis\test.py /^def collect_results_gpu(result_part, size):$/;" f +dist mmseg\apis\test.py /^import torch.distributed as dist$/;" i +get_dist_info mmseg\apis\test.py /^from mmcv.runner import get_dist_info$/;" i +mmcv mmseg\apis\test.py /^import mmcv$/;" i +multi_gpu_test mmseg\apis\test.py /^def multi_gpu_test(model,$/;" f +np mmseg\apis\test.py /^import numpy as np$/;" i +np2tmp mmseg\apis\test.py /^def np2tmp(array, temp_file_name=None):$/;" f +os mmseg\apis\test.py /^import os.path as osp$/;" i +osp mmseg\apis\test.py /^import os.path as osp$/;" i +pickle mmseg\apis\test.py /^import pickle$/;" i +shutil mmseg\apis\test.py /^import shutil$/;" i +single_gpu_test mmseg\apis\test.py /^def single_gpu_test(model,$/;" f +tempfile mmseg\apis\test.py /^import tempfile$/;" i +tensor2imgs mmseg\apis\test.py /^from mmcv.image import tensor2imgs$/;" i +torch mmseg\apis\test.py /^import torch$/;" i +torch mmseg\apis\test.py /^import torch.distributed as dist$/;" i +DistEvalHook mmseg\apis\train.py /^from mmseg.core import DistEvalHook, EvalHook$/;" i +EvalHook mmseg\apis\train.py /^from mmseg.core import DistEvalHook, EvalHook$/;" i +MMDataParallel mmseg\apis\train.py /^from mmcv.parallel import MMDataParallel, MMDistributedDataParallel$/;" i +MMDistributedDataParallel mmseg\apis\train.py /^from mmcv.parallel import MMDataParallel, MMDistributedDataParallel$/;" i +build_dataloader mmseg\apis\train.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_dataset mmseg\apis\train.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_optimizer mmseg\apis\train.py /^from mmcv.runner import build_optimizer, build_runner$/;" i +build_runner mmseg\apis\train.py /^from mmcv.runner import build_optimizer, build_runner$/;" i +get_root_logger mmseg\apis\train.py /^from mmseg.utils import get_root_logger$/;" i +np mmseg\apis\train.py /^import numpy as np$/;" i +random mmseg\apis\train.py /^import random$/;" i +set_random_seed mmseg\apis\train.py /^def set_random_seed(seed, deterministic=False):$/;" f +torch mmseg\apis\train.py /^import torch$/;" i +train_segmentor mmseg\apis\train.py /^def train_segmentor(model,$/;" f +warnings mmseg\apis\train.py /^import warnings$/;" i +F401 mmseg\core\__init__.py /^from .evaluation import * # noqa: F401, F403$/;" i +F401 mmseg\core\__init__.py /^from .seg import * # noqa: F401, F403$/;" i +F401 mmseg\core\__init__.py /^from .utils import * # noqa: F401, F403$/;" i +F403 mmseg\core\__init__.py /^from .evaluation import * # noqa: F401, F403$/;" i +F403 mmseg\core\__init__.py /^from .seg import * # noqa: F401, F403$/;" i +F403 mmseg\core\__init__.py /^from .utils import * # noqa: F401, F403$/;" i +noqa mmseg\core\__init__.py /^from .evaluation import * # noqa: F401, F403$/;" i +noqa mmseg\core\__init__.py /^from .seg import * # noqa: F401, F403$/;" i +noqa mmseg\core\__init__.py /^from .utils import * # noqa: F401, F403$/;" i +DistEvalHook mmseg\core\evaluation\__init__.py /^from .eval_hooks import DistEvalHook, EvalHook$/;" i +EvalHook mmseg\core\evaluation\__init__.py /^from .eval_hooks import DistEvalHook, EvalHook$/;" i +__all__ mmseg\core\evaluation\__init__.py /^__all__ = [$/;" v +eval_metrics mmseg\core\evaluation\__init__.py /^from .metrics import eval_metrics, mean_dice, mean_iou$/;" i +get_classes mmseg\core\evaluation\__init__.py /^from .class_names import get_classes, get_palette$/;" i +get_palette mmseg\core\evaluation\__init__.py /^from .class_names import get_classes, get_palette$/;" i +mean_dice mmseg\core\evaluation\__init__.py /^from .metrics import eval_metrics, mean_dice, mean_iou$/;" i +mean_iou mmseg\core\evaluation\__init__.py /^from .metrics import eval_metrics, mean_dice, mean_iou$/;" i +ade_classes mmseg\core\evaluation\class_names.py /^def ade_classes():$/;" f +ade_palette mmseg\core\evaluation\class_names.py /^def ade_palette():$/;" f +cityscapes_classes mmseg\core\evaluation\class_names.py /^def cityscapes_classes():$/;" f +cityscapes_palette mmseg\core\evaluation\class_names.py /^def cityscapes_palette():$/;" f +dataset_aliases mmseg\core\evaluation\class_names.py /^dataset_aliases = {$/;" v +get_classes mmseg\core\evaluation\class_names.py /^def get_classes(dataset):$/;" f +get_palette mmseg\core\evaluation\class_names.py /^def get_palette(dataset):$/;" f +mmcv mmseg\core\evaluation\class_names.py /^import mmcv$/;" i +voc_classes mmseg\core\evaluation\class_names.py /^def voc_classes():$/;" f +voc_palette mmseg\core\evaluation\class_names.py /^def voc_palette():$/;" f +DataLoader mmseg\core\evaluation\eval_hooks.py /^from torch.utils.data import DataLoader$/;" i +DistEvalHook mmseg\core\evaluation\eval_hooks.py /^class DistEvalHook(EvalHook):$/;" c +EvalHook mmseg\core\evaluation\eval_hooks.py /^class EvalHook(Hook):$/;" c +Hook mmseg\core\evaluation\eval_hooks.py /^from mmcv.runner import Hook$/;" i +__init__ mmseg\core\evaluation\eval_hooks.py /^ def __init__(self, dataloader, interval=1, by_epoch=False, **eval_kwargs):$/;" m class:EvalHook +__init__ mmseg\core\evaluation\eval_hooks.py /^ def __init__(self,$/;" m class:DistEvalHook +after_train_epoch mmseg\core\evaluation\eval_hooks.py /^ def after_train_epoch(self, runner):$/;" m class:DistEvalHook +after_train_epoch mmseg\core\evaluation\eval_hooks.py /^ def after_train_epoch(self, runner):$/;" m class:EvalHook +after_train_iter mmseg\core\evaluation\eval_hooks.py /^ def after_train_iter(self, runner):$/;" m class:DistEvalHook +after_train_iter mmseg\core\evaluation\eval_hooks.py /^ def after_train_iter(self, runner):$/;" m class:EvalHook +evaluate mmseg\core\evaluation\eval_hooks.py /^ def evaluate(self, runner, results):$/;" m class:EvalHook +multi_gpu_test mmseg\core\evaluation\eval_hooks.py /^ from mmseg.apis import multi_gpu_test$/;" i +os mmseg\core\evaluation\eval_hooks.py /^import os.path as osp$/;" i +osp mmseg\core\evaluation\eval_hooks.py /^import os.path as osp$/;" i +single_gpu_test mmseg\core\evaluation\eval_hooks.py /^ from mmseg.apis import single_gpu_test$/;" i +eval_metrics mmseg\core\evaluation\metrics.py /^def eval_metrics(results,$/;" f +intersect_and_union mmseg\core\evaluation\metrics.py /^def intersect_and_union(pred_label,$/;" f +mean_dice mmseg\core\evaluation\metrics.py /^def mean_dice(results,$/;" f +mean_iou mmseg\core\evaluation\metrics.py /^def mean_iou(results,$/;" f +mmcv mmseg\core\evaluation\metrics.py /^import mmcv$/;" i +np mmseg\core\evaluation\metrics.py /^import numpy as np$/;" i +total_intersect_and_union mmseg\core\evaluation\metrics.py /^def total_intersect_and_union(results,$/;" f +BasePixelSampler mmseg\core\seg\__init__.py /^from .sampler import BasePixelSampler, OHEMPixelSampler$/;" i +OHEMPixelSampler mmseg\core\seg\__init__.py /^from .sampler import BasePixelSampler, OHEMPixelSampler$/;" i +__all__ mmseg\core\seg\__init__.py /^__all__ = ['build_pixel_sampler', 'BasePixelSampler', 'OHEMPixelSampler']$/;" v +build_pixel_sampler mmseg\core\seg\__init__.py /^from .builder import build_pixel_sampler$/;" i +PIXEL_SAMPLERS mmseg\core\seg\builder.py /^PIXEL_SAMPLERS = Registry('pixel sampler')$/;" v +Registry mmseg\core\seg\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +build_from_cfg mmseg\core\seg\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +build_pixel_sampler mmseg\core\seg\builder.py /^def build_pixel_sampler(cfg, **default_args):$/;" f +BasePixelSampler mmseg\core\seg\sampler\__init__.py /^from .base_pixel_sampler import BasePixelSampler$/;" i +OHEMPixelSampler mmseg\core\seg\sampler\__init__.py /^from .ohem_pixel_sampler import OHEMPixelSampler$/;" i +__all__ mmseg\core\seg\sampler\__init__.py /^__all__ = ['BasePixelSampler', 'OHEMPixelSampler']$/;" v +ABCMeta mmseg\core\seg\sampler\base_pixel_sampler.py /^from abc import ABCMeta, abstractmethod$/;" i +BasePixelSampler mmseg\core\seg\sampler\base_pixel_sampler.py /^class BasePixelSampler(metaclass=ABCMeta):$/;" c +__init__ mmseg\core\seg\sampler\base_pixel_sampler.py /^ def __init__(self, **kwargs):$/;" m class:BasePixelSampler +abstractmethod mmseg\core\seg\sampler\base_pixel_sampler.py /^from abc import ABCMeta, abstractmethod$/;" i +sample mmseg\core\seg\sampler\base_pixel_sampler.py /^ def sample(self, seg_logit, seg_label):$/;" m class:BasePixelSampler +BasePixelSampler mmseg\core\seg\sampler\ohem_pixel_sampler.py /^from .base_pixel_sampler import BasePixelSampler$/;" i +F mmseg\core\seg\sampler\ohem_pixel_sampler.py /^import torch.nn.functional as F$/;" i +OHEMPixelSampler mmseg\core\seg\sampler\ohem_pixel_sampler.py /^class OHEMPixelSampler(BasePixelSampler):$/;" c +PIXEL_SAMPLERS mmseg\core\seg\sampler\ohem_pixel_sampler.py /^from ..builder import PIXEL_SAMPLERS$/;" i +__init__ mmseg\core\seg\sampler\ohem_pixel_sampler.py /^ def __init__(self, context, thresh=None, min_kept=100000):$/;" m class:OHEMPixelSampler +nn mmseg\core\seg\sampler\ohem_pixel_sampler.py /^import torch.nn.functional as F$/;" i +sample mmseg\core\seg\sampler\ohem_pixel_sampler.py /^ def sample(self, seg_logit, seg_label):$/;" m class:OHEMPixelSampler +torch mmseg\core\seg\sampler\ohem_pixel_sampler.py /^import torch$/;" i +torch mmseg\core\seg\sampler\ohem_pixel_sampler.py /^import torch.nn.functional as F$/;" i +__all__ mmseg\core\utils\__init__.py /^__all__ = ['add_prefix']$/;" v +add_prefix mmseg\core\utils\__init__.py /^from .misc import add_prefix$/;" i +add_prefix mmseg\core\utils\misc.py /^def add_prefix(inputs, prefix):$/;" f +ADE20KDataset mmseg\datasets\__init__.py /^from .ade import ADE20KDataset$/;" i +ChaseDB1Dataset mmseg\datasets\__init__.py /^from .chase_db1 import ChaseDB1Dataset$/;" i +CityscapesDataset mmseg\datasets\__init__.py /^from .cityscapes import CityscapesDataset$/;" i +ConcatDataset mmseg\datasets\__init__.py /^from .dataset_wrappers import ConcatDataset, RepeatDataset$/;" i +CustomDataset mmseg\datasets\__init__.py /^from .custom import CustomDataset$/;" i +DATASETS mmseg\datasets\__init__.py /^from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset$/;" i +DRIVEDataset mmseg\datasets\__init__.py /^from .drive import DRIVEDataset$/;" i +HRFDataset mmseg\datasets\__init__.py /^from .hrf import HRFDataset$/;" i +PIPELINES mmseg\datasets\__init__.py /^from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset$/;" i +PascalContextDataset mmseg\datasets\__init__.py /^from .pascal_context import PascalContextDataset$/;" i +PascalVOCDataset mmseg\datasets\__init__.py /^from .voc import PascalVOCDataset$/;" i +RepeatDataset mmseg\datasets\__init__.py /^from .dataset_wrappers import ConcatDataset, RepeatDataset$/;" i +STAREDataset mmseg\datasets\__init__.py /^from .stare import STAREDataset$/;" i +__all__ mmseg\datasets\__init__.py /^__all__ = [$/;" v +build_dataloader mmseg\datasets\__init__.py /^from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset$/;" i +build_dataset mmseg\datasets\__init__.py /^from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset$/;" i +ADE20KDataset mmseg\datasets\ade.py /^class ADE20KDataset(CustomDataset):$/;" c +CLASSES mmseg\datasets\ade.py /^ CLASSES = ($/;" v class:ADE20KDataset +CustomDataset mmseg\datasets\ade.py /^from .custom import CustomDataset$/;" i +DATASETS mmseg\datasets\ade.py /^from .builder import DATASETS$/;" i +PALETTE mmseg\datasets\ade.py /^ PALETTE = [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50],$/;" v class:ADE20KDataset +__init__ mmseg\datasets\ade.py /^ def __init__(self, **kwargs):$/;" m class:ADE20KDataset +ConcatDataset mmseg\datasets\builder.py /^ from .dataset_wrappers import ConcatDataset$/;" i +ConcatDataset mmseg\datasets\builder.py /^ from .dataset_wrappers import ConcatDataset, RepeatDataset$/;" i +DATASETS mmseg\datasets\builder.py /^DATASETS = Registry('dataset')$/;" v +DataLoader mmseg\datasets\builder.py /^from mmcv.utils.parrots_wrapper import DataLoader, PoolDataLoader$/;" i +DistributedSampler mmseg\datasets\builder.py /^from torch.utils.data import DistributedSampler$/;" i +PIPELINES mmseg\datasets\builder.py /^PIPELINES = Registry('pipeline')$/;" v +PoolDataLoader mmseg\datasets\builder.py /^from mmcv.utils.parrots_wrapper import DataLoader, PoolDataLoader$/;" i +Registry mmseg\datasets\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +RepeatDataset mmseg\datasets\builder.py /^ from .dataset_wrappers import ConcatDataset, RepeatDataset$/;" i +_concat_dataset mmseg\datasets\builder.py /^def _concat_dataset(cfg, default_args=None):$/;" f +build_dataloader mmseg\datasets\builder.py /^def build_dataloader(dataset,$/;" f +build_dataset mmseg\datasets\builder.py /^def build_dataset(cfg, default_args=None):$/;" f +build_from_cfg mmseg\datasets\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +collate mmseg\datasets\builder.py /^from mmcv.parallel import collate$/;" i +copy mmseg\datasets\builder.py /^import copy$/;" i +get_dist_info mmseg\datasets\builder.py /^from mmcv.runner import get_dist_info$/;" i +hard_limit mmseg\datasets\builder.py /^ hard_limit = rlimit[1]$/;" v +np mmseg\datasets\builder.py /^import numpy as np$/;" i +partial mmseg\datasets\builder.py /^from functools import partial$/;" i +platform mmseg\datasets\builder.py /^import platform$/;" i +random mmseg\datasets\builder.py /^import random$/;" i +resource mmseg\datasets\builder.py /^ import resource$/;" i +rlimit mmseg\datasets\builder.py /^ rlimit = resource.getrlimit(resource.RLIMIT_NOFILE)$/;" v +soft_limit mmseg\datasets\builder.py /^ soft_limit = min(4096, hard_limit)$/;" v +worker_init_fn mmseg\datasets\builder.py /^def worker_init_fn(worker_id, num_workers, rank, seed):$/;" f +CLASSES mmseg\datasets\chase_db1.py /^ CLASSES = ('background', 'vessel')$/;" v class:ChaseDB1Dataset +ChaseDB1Dataset mmseg\datasets\chase_db1.py /^class ChaseDB1Dataset(CustomDataset):$/;" c +CustomDataset mmseg\datasets\chase_db1.py /^from .custom import CustomDataset$/;" i +DATASETS mmseg\datasets\chase_db1.py /^from .builder import DATASETS$/;" i +PALETTE mmseg\datasets\chase_db1.py /^ PALETTE = [[120, 120, 120], [6, 230, 230]]$/;" v class:ChaseDB1Dataset +__init__ mmseg\datasets\chase_db1.py /^ def __init__(self, **kwargs):$/;" m class:ChaseDB1Dataset +os mmseg\datasets\chase_db1.py /^import os.path as osp$/;" i +osp mmseg\datasets\chase_db1.py /^import os.path as osp$/;" i +CLASSES mmseg\datasets\cityscapes.py /^ CLASSES = ('road', 'sidewalk', 'building', 'wall', 'fence', 'pole',$/;" v class:CityscapesDataset +CSEval mmseg\datasets\cityscapes.py /^ import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa$/;" i +CSLabels mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +CSLabels mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +CityscapesDataset mmseg\datasets\cityscapes.py /^class CityscapesDataset(CustomDataset):$/;" c +CustomDataset mmseg\datasets\cityscapes.py /^from .custom import CustomDataset$/;" i +DATASETS mmseg\datasets\cityscapes.py /^from .builder import DATASETS$/;" i +Image mmseg\datasets\cityscapes.py /^from PIL import Image$/;" i +PALETTE mmseg\datasets\cityscapes.py /^ PALETTE = [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156],$/;" v class:CityscapesDataset +__init__ mmseg\datasets\cityscapes.py /^ def __init__(self, **kwargs):$/;" m class:CityscapesDataset +_convert_to_label_id mmseg\datasets\cityscapes.py /^ def _convert_to_label_id(result):$/;" m class:CityscapesDataset +_evaluate_cityscapes mmseg\datasets\cityscapes.py /^ def _evaluate_cityscapes(self, results, logger, imgfile_prefix):$/;" m class:CityscapesDataset +cityscapesscripts mmseg\datasets\cityscapes.py /^ import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa$/;" i +cityscapesscripts mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +cityscapesscripts mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +evaluate mmseg\datasets\cityscapes.py /^ def evaluate(self,$/;" m class:CityscapesDataset +evaluation mmseg\datasets\cityscapes.py /^ import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa$/;" i +format_results mmseg\datasets\cityscapes.py /^ def format_results(self, results, imgfile_prefix=None, to_label_id=True):$/;" m class:CityscapesDataset +helpers mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +helpers mmseg\datasets\cityscapes.py /^ import cityscapesscripts.helpers.labels as CSLabels$/;" i +mmcv mmseg\datasets\cityscapes.py /^import mmcv$/;" i +noqa mmseg\datasets\cityscapes.py /^ import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa$/;" i +np mmseg\datasets\cityscapes.py /^import numpy as np$/;" i +os mmseg\datasets\cityscapes.py /^import os.path as osp$/;" i +osp mmseg\datasets\cityscapes.py /^import os.path as osp$/;" i +print_log mmseg\datasets\cityscapes.py /^from mmcv.utils import print_log$/;" i +results2img mmseg\datasets\cityscapes.py /^ def results2img(self, results, imgfile_prefix, to_label_id):$/;" m class:CityscapesDataset +tempfile mmseg\datasets\cityscapes.py /^import tempfile$/;" i +AsciiTable mmseg\datasets\custom.py /^from terminaltables import AsciiTable$/;" i +CLASSES mmseg\datasets\custom.py /^ CLASSES = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,$/;" v class:CustomDataset +Compose mmseg\datasets\custom.py /^from .pipelines import Compose$/;" i +CustomDataset mmseg\datasets\custom.py /^class CustomDataset(Dataset):$/;" c +DATASETS mmseg\datasets\custom.py /^from .builder import DATASETS$/;" i +Dataset mmseg\datasets\custom.py /^from torch.utils.data import Dataset$/;" i +PALETTE mmseg\datasets\custom.py /^ PALETTE = [[0, 0, 0], [40, 100, 150], [80, 150, 200], [120, 200, 10], [160, 10, 60],$/;" v class:CustomDataset +__getitem__ mmseg\datasets\custom.py /^ def __getitem__(self, idx):$/;" m class:CustomDataset file: +__init__ mmseg\datasets\custom.py /^ def __init__(self,$/;" m class:CustomDataset +__len__ mmseg\datasets\custom.py /^ def __len__(self):$/;" m class:CustomDataset file: +eval_metrics mmseg\datasets\custom.py /^from mmseg.core import eval_metrics$/;" i +evaluate mmseg\datasets\custom.py /^ def evaluate(self,$/;" m class:CustomDataset +format_results mmseg\datasets\custom.py /^ def format_results(self, results, **kwargs):$/;" m class:CustomDataset +get_ann_info mmseg\datasets\custom.py /^ def get_ann_info(self, idx):$/;" m class:CustomDataset +get_classes_and_palette mmseg\datasets\custom.py /^ def get_classes_and_palette(self, classes=None, palette=None):$/;" m class:CustomDataset +get_gt_seg_maps mmseg\datasets\custom.py /^ def get_gt_seg_maps(self, efficient_test=False):$/;" m class:CustomDataset +get_palette_for_custom_classes mmseg\datasets\custom.py /^ def get_palette_for_custom_classes(self, class_names, palette=None):$/;" m class:CustomDataset +get_root_logger mmseg\datasets\custom.py /^from mmseg.utils import get_root_logger$/;" i +load_annotations mmseg\datasets\custom.py /^ def load_annotations(self, img_dir, img_suffix, ann_dir, seg_map_suffix,$/;" m class:CustomDataset +mmcv mmseg\datasets\custom.py /^import mmcv$/;" i +np mmseg\datasets\custom.py /^import numpy as np$/;" i +os mmseg\datasets\custom.py /^import os$/;" i +os mmseg\datasets\custom.py /^import os.path as osp$/;" i +osp mmseg\datasets\custom.py /^import os.path as osp$/;" i +pre_pipeline mmseg\datasets\custom.py /^ def pre_pipeline(self, results):$/;" m class:CustomDataset +prepare_test_img mmseg\datasets\custom.py /^ def prepare_test_img(self, idx):$/;" m class:CustomDataset +prepare_train_img mmseg\datasets\custom.py /^ def prepare_train_img(self, idx):$/;" m class:CustomDataset +print_log mmseg\datasets\custom.py /^from mmcv.utils import print_log$/;" i +reduce mmseg\datasets\custom.py /^from functools import reduce$/;" i +ConcatDataset mmseg\datasets\dataset_wrappers.py /^class ConcatDataset(_ConcatDataset):$/;" c +DATASETS mmseg\datasets\dataset_wrappers.py /^from .builder import DATASETS$/;" i +RepeatDataset mmseg\datasets\dataset_wrappers.py /^class RepeatDataset(object):$/;" c +_ConcatDataset mmseg\datasets\dataset_wrappers.py /^from torch.utils.data.dataset import ConcatDataset as _ConcatDataset$/;" i +__getitem__ mmseg\datasets\dataset_wrappers.py /^ def __getitem__(self, idx):$/;" m class:RepeatDataset file: +__init__ mmseg\datasets\dataset_wrappers.py /^ def __init__(self, dataset, times):$/;" m class:RepeatDataset +__init__ mmseg\datasets\dataset_wrappers.py /^ def __init__(self, datasets):$/;" m class:ConcatDataset +__len__ mmseg\datasets\dataset_wrappers.py /^ def __len__(self):$/;" m class:RepeatDataset file: +CLASSES mmseg\datasets\drive.py /^ CLASSES = ('background', 'vessel')$/;" v class:DRIVEDataset +CustomDataset mmseg\datasets\drive.py /^from .custom import CustomDataset$/;" i +DATASETS mmseg\datasets\drive.py /^from .builder import DATASETS$/;" i +DRIVEDataset mmseg\datasets\drive.py /^class DRIVEDataset(CustomDataset):$/;" c +PALETTE mmseg\datasets\drive.py /^ PALETTE = [[120, 120, 120], [6, 230, 230]]$/;" v class:DRIVEDataset +__init__ mmseg\datasets\drive.py /^ def __init__(self, **kwargs):$/;" m class:DRIVEDataset +os mmseg\datasets\drive.py /^import os.path as osp$/;" i +osp mmseg\datasets\drive.py /^import os.path as osp$/;" i +CLASSES mmseg\datasets\hrf.py /^ CLASSES = ('background', 'vessel')$/;" v class:HRFDataset +CustomDataset mmseg\datasets\hrf.py /^from .custom import CustomDataset$/;" i +DATASETS mmseg\datasets\hrf.py /^from .builder import DATASETS$/;" i +HRFDataset mmseg\datasets\hrf.py /^class HRFDataset(CustomDataset):$/;" c +PALETTE mmseg\datasets\hrf.py /^ PALETTE = [[120, 120, 120], [6, 230, 230]]$/;" v class:HRFDataset +__init__ mmseg\datasets\hrf.py /^ def __init__(self, **kwargs):$/;" m class:HRFDataset +os mmseg\datasets\hrf.py /^import os.path as osp$/;" i +osp mmseg\datasets\hrf.py /^import os.path as osp$/;" i +CLASSES mmseg\datasets\pascal_context.py /^ CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle',$/;" v class:PascalContextDataset +CustomDataset mmseg\datasets\pascal_context.py /^from .custom import CustomDataset$/;" i +DATASETS mmseg\datasets\pascal_context.py /^from .builder import DATASETS$/;" i +PALETTE mmseg\datasets\pascal_context.py /^ PALETTE = [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50],$/;" v class:PascalContextDataset +PascalContextDataset mmseg\datasets\pascal_context.py /^class PascalContextDataset(CustomDataset):$/;" c +__init__ mmseg\datasets\pascal_context.py /^ def __init__(self, split, **kwargs):$/;" m class:PascalContextDataset +os mmseg\datasets\pascal_context.py /^import os.path as osp$/;" i +osp mmseg\datasets\pascal_context.py /^import os.path as osp$/;" i +AdjustGamma mmseg\datasets\pipelines\__init__.py /^from .transforms import (CLAHE, AdjustGamma, Normalize, Pad,$/;" i +CLAHE mmseg\datasets\pipelines\__init__.py /^from .transforms import (CLAHE, AdjustGamma, Normalize, Pad,$/;" i +Collect mmseg\datasets\pipelines\__init__.py /^from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor,$/;" i +Compose mmseg\datasets\pipelines\__init__.py /^from .compose import Compose$/;" i +ImageToTensor mmseg\datasets\pipelines\__init__.py /^from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor,$/;" i +LoadAnnotations mmseg\datasets\pipelines\__init__.py /^from .loading import LoadAnnotations, LoadImageFromFile$/;" i +LoadImageFromFile mmseg\datasets\pipelines\__init__.py /^from .loading import LoadAnnotations, LoadImageFromFile$/;" i +MultiScaleFlipAug mmseg\datasets\pipelines\__init__.py /^from .test_time_aug import MultiScaleFlipAug$/;" i +Normalize mmseg\datasets\pipelines\__init__.py /^from .transforms import (CLAHE, AdjustGamma, Normalize, Pad,$/;" i +Pad mmseg\datasets\pipelines\__init__.py /^from .transforms import (CLAHE, AdjustGamma, Normalize, Pad,$/;" i +ToDataContainer mmseg\datasets\pipelines\__init__.py /^from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor,$/;" i +ToTensor mmseg\datasets\pipelines\__init__.py /^from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor,$/;" i +__all__ mmseg\datasets\pipelines\__init__.py /^__all__ = [$/;" v +Compose mmseg\datasets\pipelines\compose.py /^class Compose(object):$/;" c +PIPELINES mmseg\datasets\pipelines\compose.py /^from ..builder import PIPELINES$/;" i +__call__ mmseg\datasets\pipelines\compose.py /^ def __call__(self, data):$/;" m class:Compose file: +__init__ mmseg\datasets\pipelines\compose.py /^ def __init__(self, transforms):$/;" m class:Compose +__repr__ mmseg\datasets\pipelines\compose.py /^ def __repr__(self):$/;" m class:Compose file: +build_from_cfg mmseg\datasets\pipelines\compose.py /^from mmcv.utils import build_from_cfg$/;" i +collections mmseg\datasets\pipelines\compose.py /^import collections$/;" i +Collect mmseg\datasets\pipelines\formating.py /^class Collect(object):$/;" c +DC mmseg\datasets\pipelines\formating.py /^from mmcv.parallel import DataContainer as DC$/;" i +DefaultFormatBundle mmseg\datasets\pipelines\formating.py /^class DefaultFormatBundle(object):$/;" c +ImageToTensor mmseg\datasets\pipelines\formating.py /^class ImageToTensor(object):$/;" c +PIPELINES mmseg\datasets\pipelines\formating.py /^from ..builder import PIPELINES$/;" i +Sequence mmseg\datasets\pipelines\formating.py /^from collections.abc import Sequence$/;" i +ToDataContainer mmseg\datasets\pipelines\formating.py /^class ToDataContainer(object):$/;" c +ToTensor mmseg\datasets\pipelines\formating.py /^class ToTensor(object):$/;" c +Transpose mmseg\datasets\pipelines\formating.py /^class Transpose(object):$/;" c +__call__ mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:Collect file: +__call__ mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:DefaultFormatBundle file: +__call__ mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:ImageToTensor file: +__call__ mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:ToDataContainer file: +__call__ mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:ToTensor file: +__call__ mmseg\datasets\pipelines\formating.py /^ def __call__(self, results):$/;" m class:Transpose file: +__init__ mmseg\datasets\pipelines\formating.py /^ def __init__(self, keys):$/;" m class:ImageToTensor +__init__ mmseg\datasets\pipelines\formating.py /^ def __init__(self, keys):$/;" m class:ToTensor +__init__ mmseg\datasets\pipelines\formating.py /^ def __init__(self, keys, order):$/;" m class:Transpose +__init__ mmseg\datasets\pipelines\formating.py /^ def __init__(self,$/;" m class:Collect +__init__ mmseg\datasets\pipelines\formating.py /^ def __init__(self,$/;" m class:ToDataContainer +__repr__ mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:Collect file: +__repr__ mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:DefaultFormatBundle file: +__repr__ mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:ImageToTensor file: +__repr__ mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:ToDataContainer file: +__repr__ mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:ToTensor file: +__repr__ mmseg\datasets\pipelines\formating.py /^ def __repr__(self):$/;" m class:Transpose file: +mmcv mmseg\datasets\pipelines\formating.py /^import mmcv$/;" i +np mmseg\datasets\pipelines\formating.py /^import numpy as np$/;" i +to_tensor mmseg\datasets\pipelines\formating.py /^def to_tensor(data):$/;" f +torch mmseg\datasets\pipelines\formating.py /^import torch$/;" i +LoadAnnotations mmseg\datasets\pipelines\loading.py /^class LoadAnnotations(object):$/;" c +LoadImageFromFile mmseg\datasets\pipelines\loading.py /^class LoadImageFromFile(object):$/;" c +PIPELINES mmseg\datasets\pipelines\loading.py /^from ..builder import PIPELINES$/;" i +__call__ mmseg\datasets\pipelines\loading.py /^ def __call__(self, results):$/;" m class:LoadAnnotations file: +__call__ mmseg\datasets\pipelines\loading.py /^ def __call__(self, results):$/;" m class:LoadImageFromFile file: +__init__ mmseg\datasets\pipelines\loading.py /^ def __init__(self,$/;" m class:LoadAnnotations +__init__ mmseg\datasets\pipelines\loading.py /^ def __init__(self,$/;" m class:LoadImageFromFile +__repr__ mmseg\datasets\pipelines\loading.py /^ def __repr__(self):$/;" m class:LoadAnnotations file: +__repr__ mmseg\datasets\pipelines\loading.py /^ def __repr__(self):$/;" m class:LoadImageFromFile file: +mmcv mmseg\datasets\pipelines\loading.py /^import mmcv$/;" i +np mmseg\datasets\pipelines\loading.py /^import numpy as np$/;" i +os mmseg\datasets\pipelines\loading.py /^import os.path as osp$/;" i +osp mmseg\datasets\pipelines\loading.py /^import os.path as osp$/;" i +Compose mmseg\datasets\pipelines\test_time_aug.py /^from .compose import Compose$/;" i +MultiScaleFlipAug mmseg\datasets\pipelines\test_time_aug.py /^class MultiScaleFlipAug(object):$/;" c +PIPELINES mmseg\datasets\pipelines\test_time_aug.py /^from ..builder import PIPELINES$/;" i +__call__ mmseg\datasets\pipelines\test_time_aug.py /^ def __call__(self, results):$/;" m class:MultiScaleFlipAug file: +__init__ mmseg\datasets\pipelines\test_time_aug.py /^ def __init__(self,$/;" m class:MultiScaleFlipAug +__repr__ mmseg\datasets\pipelines\test_time_aug.py /^ def __repr__(self):$/;" m class:MultiScaleFlipAug file: +mmcv mmseg\datasets\pipelines\test_time_aug.py /^import mmcv$/;" i +warnings mmseg\datasets\pipelines\test_time_aug.py /^import warnings$/;" i +AdjustGamma mmseg\datasets\pipelines\transforms.py /^class AdjustGamma(object):$/;" c +CLAHE mmseg\datasets\pipelines\transforms.py /^class CLAHE(object):$/;" c +Normalize mmseg\datasets\pipelines\transforms.py /^class Normalize(object):$/;" c +PIPELINES mmseg\datasets\pipelines\transforms.py /^from ..builder import PIPELINES$/;" i +Pad mmseg\datasets\pipelines\transforms.py /^class Pad(object):$/;" c +PhotoMetricDistortion mmseg\datasets\pipelines\transforms.py /^class PhotoMetricDistortion(object):$/;" c +RGB2Gray mmseg\datasets\pipelines\transforms.py /^class RGB2Gray(object):$/;" c +RandomCrop mmseg\datasets\pipelines\transforms.py /^class RandomCrop(object):$/;" c +RandomFlip mmseg\datasets\pipelines\transforms.py /^class RandomFlip(object):$/;" c +RandomRotate mmseg\datasets\pipelines\transforms.py /^class RandomRotate(object):$/;" c +Rerange mmseg\datasets\pipelines\transforms.py /^class Rerange(object):$/;" c +Resize mmseg\datasets\pipelines\transforms.py /^class Resize(object):$/;" c +SegRescale mmseg\datasets\pipelines\transforms.py /^class SegRescale(object):$/;" c +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:AdjustGamma file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:CLAHE file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:Normalize file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:Pad file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:PhotoMetricDistortion file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:RGB2Gray file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:RandomCrop file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:RandomFlip file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:RandomRotate file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:Rerange file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:Resize file: +__call__ mmseg\datasets\pipelines\transforms.py /^ def __call__(self, results):$/;" m class:SegRescale file: +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self, clip_limit=40.0, tile_grid_size=(8, 8)):$/;" m class:CLAHE +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self, crop_size, cat_max_ratio=1., ignore_index=255):$/;" m class:RandomCrop +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self, gamma=1.0):$/;" m class:AdjustGamma +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self, mean, std, to_rgb=True):$/;" m class:Normalize +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self, min_value=0, max_value=255):$/;" m class:Rerange +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self, out_channels=None, weights=(0.299, 0.587, 0.114)):$/;" m class:RGB2Gray +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self, prob=None, direction='horizontal'):$/;" m class:RandomFlip +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self, scale_factor=1):$/;" m class:SegRescale +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self,$/;" m class:Pad +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self,$/;" m class:PhotoMetricDistortion +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self,$/;" m class:RandomRotate +__init__ mmseg\datasets\pipelines\transforms.py /^ def __init__(self,$/;" m class:Resize +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:AdjustGamma file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:CLAHE file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:Normalize file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:Pad file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:PhotoMetricDistortion file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:RGB2Gray file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:RandomCrop file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:RandomFlip file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:RandomRotate file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:Rerange file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:Resize file: +__repr__ mmseg\datasets\pipelines\transforms.py /^ def __repr__(self):$/;" m class:SegRescale file: +_pad_img mmseg\datasets\pipelines\transforms.py /^ def _pad_img(self, results):$/;" m class:Pad +_pad_seg mmseg\datasets\pipelines\transforms.py /^ def _pad_seg(self, results):$/;" m class:Pad +_random_scale mmseg\datasets\pipelines\transforms.py /^ def _random_scale(self, results):$/;" m class:Resize +_resize_img mmseg\datasets\pipelines\transforms.py /^ def _resize_img(self, results):$/;" m class:Resize +_resize_seg mmseg\datasets\pipelines\transforms.py /^ def _resize_seg(self, results):$/;" m class:Resize +brightness mmseg\datasets\pipelines\transforms.py /^ def brightness(self, img):$/;" m class:PhotoMetricDistortion +contrast mmseg\datasets\pipelines\transforms.py /^ def contrast(self, img):$/;" m class:PhotoMetricDistortion +convert mmseg\datasets\pipelines\transforms.py /^ def convert(self, img, alpha=1, beta=0):$/;" m class:PhotoMetricDistortion +crop mmseg\datasets\pipelines\transforms.py /^ def crop(self, img, crop_bbox):$/;" m class:RandomCrop +deprecated_api_warning mmseg\datasets\pipelines\transforms.py /^from mmcv.utils import deprecated_api_warning, is_tuple_of$/;" i +get_crop_bbox mmseg\datasets\pipelines\transforms.py /^ def get_crop_bbox(self, img):$/;" m class:RandomCrop +hue mmseg\datasets\pipelines\transforms.py /^ def hue(self, img):$/;" m class:PhotoMetricDistortion +is_tuple_of mmseg\datasets\pipelines\transforms.py /^from mmcv.utils import deprecated_api_warning, is_tuple_of$/;" i +mmcv mmseg\datasets\pipelines\transforms.py /^import mmcv$/;" i +np mmseg\datasets\pipelines\transforms.py /^import numpy as np$/;" i +random mmseg\datasets\pipelines\transforms.py /^from numpy import random$/;" i +random_sample mmseg\datasets\pipelines\transforms.py /^ def random_sample(img_scales):$/;" m class:Resize +random_sample_ratio mmseg\datasets\pipelines\transforms.py /^ def random_sample_ratio(img_scale, ratio_range):$/;" m class:Resize +random_select mmseg\datasets\pipelines\transforms.py /^ def random_select(img_scales):$/;" m class:Resize +saturation mmseg\datasets\pipelines\transforms.py /^ def saturation(self, img):$/;" m class:PhotoMetricDistortion +CLASSES mmseg\datasets\stare.py /^ CLASSES = ('background', 'vessel')$/;" v class:STAREDataset +CustomDataset mmseg\datasets\stare.py /^from .custom import CustomDataset$/;" i +DATASETS mmseg\datasets\stare.py /^from .builder import DATASETS$/;" i +PALETTE mmseg\datasets\stare.py /^ PALETTE = [[120, 120, 120], [6, 230, 230]]$/;" v class:STAREDataset +STAREDataset mmseg\datasets\stare.py /^class STAREDataset(CustomDataset):$/;" c +__init__ mmseg\datasets\stare.py /^ def __init__(self, **kwargs):$/;" m class:STAREDataset +os mmseg\datasets\stare.py /^import os.path as osp$/;" i +osp mmseg\datasets\stare.py /^import os.path as osp$/;" i +CLASSES mmseg\datasets\voc.py /^ CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle',$/;" v class:PascalVOCDataset +CustomDataset mmseg\datasets\voc.py /^from .custom import CustomDataset$/;" i +DATASETS mmseg\datasets\voc.py /^from .builder import DATASETS$/;" i +PALETTE mmseg\datasets\voc.py /^ PALETTE = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128],$/;" v class:PascalVOCDataset +PascalVOCDataset mmseg\datasets\voc.py /^class PascalVOCDataset(CustomDataset):$/;" c +__init__ mmseg\datasets\voc.py /^ def __init__(self, split, **kwargs):$/;" m class:PascalVOCDataset +os mmseg\datasets\voc.py /^import os.path as osp$/;" i +osp mmseg\datasets\voc.py /^import os.path as osp$/;" i +BACKBONES mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +F401 mmseg\models\__init__.py /^from .backbones import * # noqa: F401,F403$/;" i +F401 mmseg\models\__init__.py /^from .decode_heads import * # noqa: F401,F403$/;" i +F401 mmseg\models\__init__.py /^from .losses import * # noqa: F401,F403$/;" i +F401 mmseg\models\__init__.py /^from .necks import * # noqa: F401,F403$/;" i +F401 mmseg\models\__init__.py /^from .segmentors import * # noqa: F401,F403$/;" i +F403 mmseg\models\__init__.py /^from .backbones import * # noqa: F401,F403$/;" i +F403 mmseg\models\__init__.py /^from .decode_heads import * # noqa: F401,F403$/;" i +F403 mmseg\models\__init__.py /^from .losses import * # noqa: F401,F403$/;" i +F403 mmseg\models\__init__.py /^from .necks import * # noqa: F401,F403$/;" i +F403 mmseg\models\__init__.py /^from .segmentors import * # noqa: F401,F403$/;" i +HEADS mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +LOSSES mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +SEGMENTORS mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +__all__ mmseg\models\__init__.py /^__all__ = [$/;" v +build_backbone mmseg\models\__init__.py /^from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone,$/;" i +noqa mmseg\models\__init__.py /^from .backbones import * # noqa: F401,F403$/;" i +noqa mmseg\models\__init__.py /^from .decode_heads import * # noqa: F401,F403$/;" i +noqa mmseg\models\__init__.py /^from .losses import * # noqa: F401,F403$/;" i +noqa mmseg\models\__init__.py /^from .necks import * # noqa: F401,F403$/;" i +noqa mmseg\models\__init__.py /^from .segmentors import * # noqa: F401,F403$/;" i +CGNet mmseg\models\backbones\__init__.py /^from .cgnet import CGNet$/;" i +FastSCNN mmseg\models\backbones\__init__.py /^from .fast_scnn import FastSCNN$/;" i +HRNet mmseg\models\backbones\__init__.py /^from .hrnet import HRNet$/;" i +MobileNetV2 mmseg\models\backbones\__init__.py /^from .mobilenet_v2 import MobileNetV2$/;" i +MobileNetV3 mmseg\models\backbones\__init__.py /^from .mobilenet_v3 import MobileNetV3$/;" i +ResNeSt mmseg\models\backbones\__init__.py /^from .resnest import ResNeSt$/;" i +ResNeXt mmseg\models\backbones\__init__.py /^from .resnext import ResNeXt$/;" i +ResNet mmseg\models\backbones\__init__.py /^from .resnet import ResNet, ResNetV1c, ResNetV1d$/;" i +ResNetV1c mmseg\models\backbones\__init__.py /^from .resnet import ResNet, ResNetV1c, ResNetV1d$/;" i +ResNetV1d mmseg\models\backbones\__init__.py /^from .resnet import ResNet, ResNetV1c, ResNetV1d$/;" i +UNet mmseg\models\backbones\__init__.py /^from .unet import UNet$/;" i +VIT_MLA mmseg\models\backbones\__init__.py /^from .vit_mla import VIT_MLA$/;" i +VisionTransformer mmseg\models\backbones\__init__.py /^from .vit import VisionTransformer$/;" i +__all__ mmseg\models\backbones\__init__.py /^__all__ = [$/;" v +pvt_small mmseg\models\backbones\__init__.py /^from .pvt import pvt_small, pvt_small_f4, pvt_tiny$/;" i +pvt_small_dia mmseg\models\backbones\__init__.py /^from .pvt_dia import pvt_small_dia$/;" i +pvt_small_f4 mmseg\models\backbones\__init__.py /^from .pvt import pvt_small, pvt_small_f4, pvt_tiny$/;" i +pvt_tiny mmseg\models\backbones\__init__.py /^from .pvt import pvt_small, pvt_small_f4, pvt_tiny$/;" i +BACKBONES mmseg\models\backbones\cgnet.py /^from ..builder import BACKBONES$/;" i +CGNet mmseg\models\backbones\cgnet.py /^class CGNet(nn.Module):$/;" c +ContextGuidedBlock mmseg\models\backbones\cgnet.py /^class ContextGuidedBlock(nn.Module):$/;" c +ConvModule mmseg\models\backbones\cgnet.py /^from mmcv.cnn import (ConvModule, build_conv_layer, build_norm_layer,$/;" i +GlobalContextExtractor mmseg\models\backbones\cgnet.py /^class GlobalContextExtractor(nn.Module):$/;" c +InputInjection mmseg\models\backbones\cgnet.py /^class InputInjection(nn.Module):$/;" c +_BatchNorm mmseg\models\backbones\cgnet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +__init__ mmseg\models\backbones\cgnet.py /^ def __init__(self, channel, reduction=16, with_cp=False):$/;" m class:GlobalContextExtractor +__init__ mmseg\models\backbones\cgnet.py /^ def __init__(self, num_downsampling):$/;" m class:InputInjection +__init__ mmseg\models\backbones\cgnet.py /^ def __init__(self,$/;" m class:CGNet +__init__ mmseg\models\backbones\cgnet.py /^ def __init__(self,$/;" m class:ContextGuidedBlock +_inner_forward mmseg\models\backbones\cgnet.py /^ def _inner_forward(x):$/;" f function:ContextGuidedBlock.forward +_inner_forward mmseg\models\backbones\cgnet.py /^ def _inner_forward(x):$/;" f function:GlobalContextExtractor.forward +build_conv_layer mmseg\models\backbones\cgnet.py /^from mmcv.cnn import (ConvModule, build_conv_layer, build_norm_layer,$/;" i +build_norm_layer mmseg\models\backbones\cgnet.py /^from mmcv.cnn import (ConvModule, build_conv_layer, build_norm_layer,$/;" i +cp mmseg\models\backbones\cgnet.py /^import torch.utils.checkpoint as cp$/;" i +forward mmseg\models\backbones\cgnet.py /^ def forward(self, x):$/;" m class:CGNet +forward mmseg\models\backbones\cgnet.py /^ def forward(self, x):$/;" m class:ContextGuidedBlock +forward mmseg\models\backbones\cgnet.py /^ def forward(self, x):$/;" m class:GlobalContextExtractor +forward mmseg\models\backbones\cgnet.py /^ def forward(self, x):$/;" m class:InputInjection +get_root_logger mmseg\models\backbones\cgnet.py /^from mmseg.utils import get_root_logger$/;" i +init_weights mmseg\models\backbones\cgnet.py /^ def init_weights(self, pretrained=None):$/;" m class:CGNet +load_checkpoint mmseg\models\backbones\cgnet.py /^from mmcv.runner import load_checkpoint$/;" i +nn mmseg\models\backbones\cgnet.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\cgnet.py /^import torch$/;" i +torch mmseg\models\backbones\cgnet.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\cgnet.py /^import torch.utils.checkpoint as cp$/;" i +train mmseg\models\backbones\cgnet.py /^ def train(self, mode=True):$/;" m class:CGNet +utils mmseg\models\backbones\cgnet.py /^import torch.utils.checkpoint as cp$/;" i +BACKBONES mmseg\models\backbones\fast_scnn.py /^from ..builder import BACKBONES$/;" i +ConvModule mmseg\models\backbones\fast_scnn.py /^from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, constant_init,$/;" i +DepthwiseSeparableConvModule mmseg\models\backbones\fast_scnn.py /^from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, constant_init,$/;" i +FastSCNN mmseg\models\backbones\fast_scnn.py /^class FastSCNN(nn.Module):$/;" c +FeatureFusionModule mmseg\models\backbones\fast_scnn.py /^class FeatureFusionModule(nn.Module):$/;" c +GlobalFeatureExtractor mmseg\models\backbones\fast_scnn.py /^class GlobalFeatureExtractor(nn.Module):$/;" c +InvertedResidual mmseg\models\backbones\fast_scnn.py /^from ..utils.inverted_residual import InvertedResidual$/;" i +LearningToDownsample mmseg\models\backbones\fast_scnn.py /^class LearningToDownsample(nn.Module):$/;" c +PPM mmseg\models\backbones\fast_scnn.py /^from mmseg.models.decode_heads.psp_head import PPM$/;" i +_BatchNorm mmseg\models\backbones\fast_scnn.py /^from torch.nn.modules.batchnorm import _BatchNorm$/;" i +__init__ mmseg\models\backbones\fast_scnn.py /^ def __init__(self,$/;" m class:FastSCNN +__init__ mmseg\models\backbones\fast_scnn.py /^ def __init__(self,$/;" m class:FeatureFusionModule +__init__ mmseg\models\backbones\fast_scnn.py /^ def __init__(self,$/;" m class:GlobalFeatureExtractor +__init__ mmseg\models\backbones\fast_scnn.py /^ def __init__(self,$/;" m class:LearningToDownsample +_make_layer mmseg\models\backbones\fast_scnn.py /^ def _make_layer(self,$/;" m class:GlobalFeatureExtractor +constant_init mmseg\models\backbones\fast_scnn.py /^from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, constant_init,$/;" i +forward mmseg\models\backbones\fast_scnn.py /^ def forward(self, higher_res_feature, lower_res_feature):$/;" m class:FeatureFusionModule +forward mmseg\models\backbones\fast_scnn.py /^ def forward(self, x):$/;" m class:FastSCNN +forward mmseg\models\backbones\fast_scnn.py /^ def forward(self, x):$/;" m class:GlobalFeatureExtractor +forward mmseg\models\backbones\fast_scnn.py /^ def forward(self, x):$/;" m class:LearningToDownsample +init_weights mmseg\models\backbones\fast_scnn.py /^ def init_weights(self, pretrained=None):$/;" m class:FastSCNN +nn mmseg\models\backbones\fast_scnn.py /^import torch.nn as nn$/;" i +resize mmseg\models\backbones\fast_scnn.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\backbones\fast_scnn.py /^import torch$/;" i +torch mmseg\models\backbones\fast_scnn.py /^import torch.nn as nn$/;" i +F mmseg\models\backbones\helpers.py /^import torch.nn.functional as F$/;" i +F401 mmseg\models\backbones\helpers.py /^from urllib.parse import urlparse # noqa: F401$/;" i +HASH_REGEX mmseg\models\backbones\helpers.py /^HASH_REGEX = re.compile(r'-([a-f0-9]*)\\.')$/;" v +_logger mmseg\models\backbones\helpers.py /^_logger = logging.getLogger(__name__)$/;" v +errno mmseg\models\backbones\helpers.py /^import errno$/;" i +load_pretrained mmseg\models\backbones\helpers.py /^def load_pretrained(model, cfg=None, num_classes=1000, in_chans=3, filter_fn=None, strict=True, pos_embed_interp=False, num_patches=576, align_corners=False):$/;" f +load_state_dict_from_url mmseg\models\backbones\helpers.py /^def load_state_dict_from_url(url, model_dir=None, file_name=None, check_hash=False, progress=True, map_location=None):$/;" f +logging mmseg\models\backbones\helpers.py /^import logging$/;" i +math mmseg\models\backbones\helpers.py /^import math$/;" i +model_zoo mmseg\models\backbones\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +nn mmseg\models\backbones\helpers.py /^import torch.nn as nn$/;" i +nn mmseg\models\backbones\helpers.py /^import torch.nn.functional as F$/;" i +noqa mmseg\models\backbones\helpers.py /^from urllib.parse import urlparse # noqa: F401$/;" i +os mmseg\models\backbones\helpers.py /^import os$/;" i +re mmseg\models\backbones\helpers.py /^import re$/;" i +sys mmseg\models\backbones\helpers.py /^import sys$/;" i +torch mmseg\models\backbones\helpers.py /^import torch$/;" i +torch mmseg\models\backbones\helpers.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\helpers.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\backbones\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +urlparse mmseg\models\backbones\helpers.py /^from urllib.parse import urlparse # noqa: F401$/;" i +utils mmseg\models\backbones\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +warnings mmseg\models\backbones\helpers.py /^import warnings$/;" i +zipfile mmseg\models\backbones\helpers.py /^import zipfile$/;" i +BACKBONES mmseg\models\backbones\hrnet.py /^from ..builder import BACKBONES$/;" i +BasicBlock mmseg\models\backbones\hrnet.py /^from .resnet import BasicBlock, Bottleneck$/;" i +Bottleneck mmseg\models\backbones\hrnet.py /^from .resnet import BasicBlock, Bottleneck$/;" i +HRModule mmseg\models\backbones\hrnet.py /^class HRModule(nn.Module):$/;" c +HRNet mmseg\models\backbones\hrnet.py /^class HRNet(nn.Module):$/;" c +Upsample mmseg\models\backbones\hrnet.py /^from mmseg.ops import Upsample, resize$/;" i +_BatchNorm mmseg\models\backbones\hrnet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +__init__ mmseg\models\backbones\hrnet.py /^ def __init__(self,$/;" m class:HRModule +__init__ mmseg\models\backbones\hrnet.py /^ def __init__(self,$/;" m class:HRNet +_check_branches mmseg\models\backbones\hrnet.py /^ def _check_branches(self, num_branches, num_blocks, in_channels,$/;" m class:HRModule +_make_branches mmseg\models\backbones\hrnet.py /^ def _make_branches(self, num_branches, block, num_blocks, num_channels):$/;" m class:HRModule +_make_fuse_layers mmseg\models\backbones\hrnet.py /^ def _make_fuse_layers(self):$/;" m class:HRModule +_make_layer mmseg\models\backbones\hrnet.py /^ def _make_layer(self, block, inplanes, planes, blocks, stride=1):$/;" m class:HRNet +_make_one_branch mmseg\models\backbones\hrnet.py /^ def _make_one_branch(self,$/;" m class:HRModule +_make_stage mmseg\models\backbones\hrnet.py /^ def _make_stage(self, layer_config, in_channels, multiscale_output=True):$/;" m class:HRNet +_make_transition_layer mmseg\models\backbones\hrnet.py /^ def _make_transition_layer(self, num_channels_pre_layer,$/;" m class:HRNet +blocks_dict mmseg\models\backbones\hrnet.py /^ blocks_dict = {'BASIC': BasicBlock, 'BOTTLENECK': Bottleneck}$/;" v class:HRNet +build_conv_layer mmseg\models\backbones\hrnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, constant_init,$/;" i +build_norm_layer mmseg\models\backbones\hrnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, constant_init,$/;" i +constant_init mmseg\models\backbones\hrnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, constant_init,$/;" i +forward mmseg\models\backbones\hrnet.py /^ def forward(self, x):$/;" m class:HRModule +forward mmseg\models\backbones\hrnet.py /^ def forward(self, x):$/;" m class:HRNet +get_root_logger mmseg\models\backbones\hrnet.py /^from mmseg.utils import get_root_logger$/;" i +init_weights mmseg\models\backbones\hrnet.py /^ def init_weights(self, pretrained=None):$/;" m class:HRNet +load_checkpoint mmseg\models\backbones\hrnet.py /^from mmcv.runner import load_checkpoint$/;" i +nn mmseg\models\backbones\hrnet.py /^import torch.nn as nn$/;" i +norm1 mmseg\models\backbones\hrnet.py /^ def norm1(self):$/;" m class:HRNet +norm2 mmseg\models\backbones\hrnet.py /^ def norm2(self):$/;" m class:HRNet +resize mmseg\models\backbones\hrnet.py /^from mmseg.ops import Upsample, resize$/;" i +torch mmseg\models\backbones\hrnet.py /^import torch.nn as nn$/;" i +train mmseg\models\backbones\hrnet.py /^ def train(self, mode=True):$/;" m class:HRNet +DropBlock2d mmseg\models\backbones\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +DropPath mmseg\models\backbones\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +drop_block_2d mmseg\models\backbones\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +drop_path mmseg\models\backbones\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +to_2tuple mmseg\models\backbones\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_3tuple mmseg\models\backbones\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_4tuple mmseg\models\backbones\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_ntuple mmseg\models\backbones\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +trunc_normal_ mmseg\models\backbones\layers\__init__.py /^from .weight_init import trunc_normal_/;" i +DropBlock2d mmseg\models\backbones\layers\drop.py /^class DropBlock2d(nn.Module):$/;" c +DropPath mmseg\models\backbones\layers\drop.py /^class DropPath(nn.Module):$/;" c +F mmseg\models\backbones\layers\drop.py /^import torch.nn.functional as F$/;" i +__init__ mmseg\models\backbones\layers\drop.py /^ def __init__(self, drop_prob=None):$/;" m class:DropPath +__init__ mmseg\models\backbones\layers\drop.py /^ def __init__(self,$/;" m class:DropBlock2d +drop_block_2d mmseg\models\backbones\layers\drop.py /^def drop_block_2d($/;" f +drop_block_fast_2d mmseg\models\backbones\layers\drop.py /^def drop_block_fast_2d($/;" f +drop_path mmseg\models\backbones\layers\drop.py /^def drop_path(x, drop_prob: float = 0., training: bool = False):$/;" f +forward mmseg\models\backbones\layers\drop.py /^ def forward(self, x):$/;" m class:DropBlock2d +forward mmseg\models\backbones\layers\drop.py /^ def forward(self, x):$/;" m class:DropPath +nn mmseg\models\backbones\layers\drop.py /^import torch.nn as nn$/;" i +nn mmseg\models\backbones\layers\drop.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\backbones\layers\drop.py /^import torch$/;" i +torch mmseg\models\backbones\layers\drop.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\layers\drop.py /^import torch.nn.functional as F$/;" i +_ntuple mmseg\models\backbones\layers\helpers.py /^def _ntuple(n):$/;" f +container_abcs mmseg\models\backbones\layers\helpers.py /^from torch._six import container_abcs$/;" i +parse mmseg\models\backbones\layers\helpers.py /^ def parse(x):$/;" f function:_ntuple +repeat mmseg\models\backbones\layers\helpers.py /^from itertools import repeat$/;" i +to_1tuple mmseg\models\backbones\layers\helpers.py /^to_1tuple = _ntuple(1)$/;" v +to_2tuple mmseg\models\backbones\layers\helpers.py /^to_2tuple = _ntuple(2)$/;" v +to_3tuple mmseg\models\backbones\layers\helpers.py /^to_3tuple = _ntuple(3)$/;" v +to_4tuple mmseg\models\backbones\layers\helpers.py /^to_4tuple = _ntuple(4)$/;" v +to_ntuple mmseg\models\backbones\layers\helpers.py /^to_ntuple = _ntuple$/;" v +_no_grad_trunc_normal_ mmseg\models\backbones\layers\weight_init.py /^def _no_grad_trunc_normal_(tensor, mean, std, a, b):$/;" f +math mmseg\models\backbones\layers\weight_init.py /^import math$/;" i +norm_cdf mmseg\models\backbones\layers\weight_init.py /^ def norm_cdf(x):$/;" f function:_no_grad_trunc_normal_ +torch mmseg\models\backbones\layers\weight_init.py /^import torch$/;" i +trunc_normal_ mmseg\models\backbones\layers\weight_init.py /^def trunc_normal_(tensor, mean=0., std=1., a=-2., b=2.):$/;" f +warnings mmseg\models\backbones\layers\weight_init.py /^import warnings$/;" i +BACKBONES mmseg\models\backbones\mobilenet_v2.py /^from ..builder import BACKBONES$/;" i +ConvModule mmseg\models\backbones\mobilenet_v2.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +InvertedResidual mmseg\models\backbones\mobilenet_v2.py /^from ..utils import InvertedResidual, make_divisible$/;" i +MobileNetV2 mmseg\models\backbones\mobilenet_v2.py /^class MobileNetV2(nn.Module):$/;" c +_BatchNorm mmseg\models\backbones\mobilenet_v2.py /^from torch.nn.modules.batchnorm import _BatchNorm$/;" i +__init__ mmseg\models\backbones\mobilenet_v2.py /^ def __init__(self,$/;" m class:MobileNetV2 +_freeze_stages mmseg\models\backbones\mobilenet_v2.py /^ def _freeze_stages(self):$/;" m class:MobileNetV2 +arch_settings mmseg\models\backbones\mobilenet_v2.py /^ arch_settings = [[1, 16, 1], [6, 24, 2], [6, 32, 3], [6, 64, 4],$/;" v class:MobileNetV2 +constant_init mmseg\models\backbones\mobilenet_v2.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +forward mmseg\models\backbones\mobilenet_v2.py /^ def forward(self, x):$/;" m class:MobileNetV2 +init_weights mmseg\models\backbones\mobilenet_v2.py /^ def init_weights(self, pretrained=None):$/;" m class:MobileNetV2 +kaiming_init mmseg\models\backbones\mobilenet_v2.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +load_checkpoint mmseg\models\backbones\mobilenet_v2.py /^from mmcv.runner import load_checkpoint$/;" i +logging mmseg\models\backbones\mobilenet_v2.py /^import logging$/;" i +make_divisible mmseg\models\backbones\mobilenet_v2.py /^from ..utils import InvertedResidual, make_divisible$/;" i +make_layer mmseg\models\backbones\mobilenet_v2.py /^ def make_layer(self, out_channels, num_blocks, stride, dilation,$/;" m class:MobileNetV2 +nn mmseg\models\backbones\mobilenet_v2.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\mobilenet_v2.py /^import torch.nn as nn$/;" i +train mmseg\models\backbones\mobilenet_v2.py /^ def train(self, mode=True):$/;" m class:MobileNetV2 +BACKBONES mmseg\models\backbones\mobilenet_v3.py /^from ..builder import BACKBONES$/;" i +Conv2dAdaptivePadding mmseg\models\backbones\mobilenet_v3.py /^from mmcv.cnn.bricks import Conv2dAdaptivePadding$/;" i +ConvModule mmseg\models\backbones\mobilenet_v3.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +InvertedResidual mmseg\models\backbones\mobilenet_v3.py /^from ..utils import InvertedResidualV3 as InvertedResidual$/;" i +MobileNetV3 mmseg\models\backbones\mobilenet_v3.py /^class MobileNetV3(nn.Module):$/;" c +_BatchNorm mmseg\models\backbones\mobilenet_v3.py /^from torch.nn.modules.batchnorm import _BatchNorm$/;" i +__init__ mmseg\models\backbones\mobilenet_v3.py /^ def __init__(self,$/;" m class:MobileNetV3 +_freeze_stages mmseg\models\backbones\mobilenet_v3.py /^ def _freeze_stages(self):$/;" m class:MobileNetV3 +_make_layer mmseg\models\backbones\mobilenet_v3.py /^ def _make_layer(self):$/;" m class:MobileNetV3 +arch_settings mmseg\models\backbones\mobilenet_v3.py /^ arch_settings = {$/;" v class:MobileNetV3 +constant_init mmseg\models\backbones\mobilenet_v3.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +forward mmseg\models\backbones\mobilenet_v3.py /^ def forward(self, x):$/;" m class:MobileNetV3 +init_weights mmseg\models\backbones\mobilenet_v3.py /^ def init_weights(self, pretrained=None):$/;" m class:MobileNetV3 +kaiming_init mmseg\models\backbones\mobilenet_v3.py /^from mmcv.cnn import ConvModule, constant_init, kaiming_init$/;" i +load_checkpoint mmseg\models\backbones\mobilenet_v3.py /^from mmcv.runner import load_checkpoint$/;" i +logging mmseg\models\backbones\mobilenet_v3.py /^import logging$/;" i +mmcv mmseg\models\backbones\mobilenet_v3.py /^import mmcv$/;" i +nn mmseg\models\backbones\mobilenet_v3.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\mobilenet_v3.py /^import torch.nn as nn$/;" i +train mmseg\models\backbones\mobilenet_v3.py /^ def train(self, mode=True):$/;" m class:MobileNetV3 +Attention mmseg\models\backbones\pvt.py /^class Attention(nn.Module):$/;" c +BACKBONES mmseg\models\backbones\pvt.py /^from ..builder import BACKBONES$/;" i +Block mmseg\models\backbones\pvt.py /^class Block(nn.Module):$/;" c +DropPath mmseg\models\backbones\pvt.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +F mmseg\models\backbones\pvt.py /^import torch.nn.functional as F$/;" i +Mlp mmseg\models\backbones\pvt.py /^class Mlp(nn.Module):$/;" c +PatchEmbed mmseg\models\backbones\pvt.py /^class PatchEmbed(nn.Module):$/;" c +PyramidVisionTransformer mmseg\models\backbones\pvt.py /^class PyramidVisionTransformer(nn.Module):$/;" c +__init__ mmseg\models\backbones\pvt.py /^ def __init__(self, **kwargs):$/;" m class:pvt_large +__init__ mmseg\models\backbones\pvt.py /^ def __init__(self, **kwargs):$/;" m class:pvt_small +__init__ mmseg\models\backbones\pvt.py /^ def __init__(self, **kwargs):$/;" m class:pvt_small_f4 +__init__ mmseg\models\backbones\pvt.py /^ def __init__(self, **kwargs):$/;" m class:pvt_tiny +__init__ mmseg\models\backbones\pvt.py /^ def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,$/;" m class:Block +__init__ mmseg\models\backbones\pvt.py /^ def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0., sr_ratio=1):$/;" m class:Attention +__init__ mmseg\models\backbones\pvt.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):$/;" m class:PatchEmbed +__init__ mmseg\models\backbones\pvt.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, num_classes=1000, embed_dims=[64, 128, 256, 512],$/;" m class:PyramidVisionTransformer +__init__ mmseg\models\backbones\pvt.py /^ def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):$/;" m class:Mlp +_cfg mmseg\models\backbones\pvt.py /^from timm.models.vision_transformer import _cfg$/;" i +_conv_filter mmseg\models\backbones\pvt.py /^def _conv_filter(state_dict, patch_size=16):$/;" f +_get_pos_embed mmseg\models\backbones\pvt.py /^ def _get_pos_embed(self, pos_embed, patch_embed, H, W):$/;" m class:PyramidVisionTransformer +_init_weights mmseg\models\backbones\pvt.py /^ def _init_weights(self, m):$/;" m class:PyramidVisionTransformer +forward mmseg\models\backbones\pvt.py /^ def forward(self, x):$/;" m class:Mlp +forward mmseg\models\backbones\pvt.py /^ def forward(self, x):$/;" m class:PatchEmbed +forward mmseg\models\backbones\pvt.py /^ def forward(self, x):$/;" m class:PyramidVisionTransformer +forward mmseg\models\backbones\pvt.py /^ def forward(self, x, H, W):$/;" m class:Attention +forward mmseg\models\backbones\pvt.py /^ def forward(self, x, H, W):$/;" m class:Block +forward_features mmseg\models\backbones\pvt.py /^ def forward_features(self, x):$/;" m class:PyramidVisionTransformer +get_root_logger mmseg\models\backbones\pvt.py /^from mmseg.utils import get_root_logger$/;" i +init_weights mmseg\models\backbones\pvt.py /^ def init_weights(self, pretrained=None):$/;" m class:PyramidVisionTransformer +load_checkpoint mmseg\models\backbones\pvt.py /^from mmcv.runner import load_checkpoint$/;" i +nn mmseg\models\backbones\pvt.py /^import torch.nn as nn$/;" i +nn mmseg\models\backbones\pvt.py /^import torch.nn.functional as F$/;" i +partial mmseg\models\backbones\pvt.py /^from functools import partial$/;" i +pvt_large mmseg\models\backbones\pvt.py /^class pvt_large(PyramidVisionTransformer):$/;" c +pvt_small mmseg\models\backbones\pvt.py /^class pvt_small(PyramidVisionTransformer):$/;" c +pvt_small_f4 mmseg\models\backbones\pvt.py /^class pvt_small_f4(PyramidVisionTransformer):$/;" c +pvt_tiny mmseg\models\backbones\pvt.py /^class pvt_tiny(PyramidVisionTransformer):$/;" c +register_model mmseg\models\backbones\pvt.py /^from timm.models.registry import register_model$/;" i +reset_drop_path mmseg\models\backbones\pvt.py /^ def reset_drop_path(self, drop_path_rate):$/;" m class:PyramidVisionTransformer +to_2tuple mmseg\models\backbones\pvt.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +torch mmseg\models\backbones\pvt.py /^import torch$/;" i +torch mmseg\models\backbones\pvt.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\pvt.py /^import torch.nn.functional as F$/;" i +trunc_normal_ mmseg\models\backbones\pvt.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +Attention mmseg\models\backbones\pvt_dia.py /^class Attention(nn.Module):$/;" c +BACKBONES mmseg\models\backbones\pvt_dia.py /^from ..builder import BACKBONES$/;" i +Block mmseg\models\backbones\pvt_dia.py /^class Block(nn.Module):$/;" c +DropPath mmseg\models\backbones\pvt_dia.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +F mmseg\models\backbones\pvt_dia.py /^import torch.nn.functional as F$/;" i +Mlp mmseg\models\backbones\pvt_dia.py /^class Mlp(nn.Module):$/;" c +PatchEmbed mmseg\models\backbones\pvt_dia.py /^class PatchEmbed(nn.Module):$/;" c +PyramidVisionTransformer mmseg\models\backbones\pvt_dia.py /^class PyramidVisionTransformer(nn.Module):$/;" c +__init__ mmseg\models\backbones\pvt_dia.py /^ def __init__(self, **kwargs):$/;" m class:pvt_small_dia +__init__ mmseg\models\backbones\pvt_dia.py /^ def __init__(self, **kwargs):$/;" m class:pvt_tiny_dia +__init__ mmseg\models\backbones\pvt_dia.py /^ def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,$/;" m class:Block +__init__ mmseg\models\backbones\pvt_dia.py /^ def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0., sr_ratio=1):$/;" m class:Attention +__init__ mmseg\models\backbones\pvt_dia.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768, dilation=1):$/;" m class:PatchEmbed +__init__ mmseg\models\backbones\pvt_dia.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, num_classes=1000, embed_dims=[64, 128, 256, 512],$/;" m class:PyramidVisionTransformer +__init__ mmseg\models\backbones\pvt_dia.py /^ def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):$/;" m class:Mlp +_cfg mmseg\models\backbones\pvt_dia.py /^from timm.models.vision_transformer import _cfg$/;" i +_conv_filter mmseg\models\backbones\pvt_dia.py /^def _conv_filter(state_dict, patch_size=16):$/;" f +_get_pos_embed mmseg\models\backbones\pvt_dia.py /^ def _get_pos_embed(self, pos_embed, patch_embed, H, W):$/;" m class:PyramidVisionTransformer +_init_weights mmseg\models\backbones\pvt_dia.py /^ def _init_weights(self, m):$/;" m class:PyramidVisionTransformer +forward mmseg\models\backbones\pvt_dia.py /^ def forward(self, x):$/;" m class:Mlp +forward mmseg\models\backbones\pvt_dia.py /^ def forward(self, x):$/;" m class:PatchEmbed +forward mmseg\models\backbones\pvt_dia.py /^ def forward(self, x):$/;" m class:PyramidVisionTransformer +forward mmseg\models\backbones\pvt_dia.py /^ def forward(self, x, H, W):$/;" m class:Attention +forward mmseg\models\backbones\pvt_dia.py /^ def forward(self, x, H, W):$/;" m class:Block +forward_features mmseg\models\backbones\pvt_dia.py /^ def forward_features(self, x):$/;" m class:PyramidVisionTransformer +get_root_logger mmseg\models\backbones\pvt_dia.py /^from mmseg.utils import get_root_logger$/;" i +init_weights mmseg\models\backbones\pvt_dia.py /^ def init_weights(self, pretrained=None):$/;" m class:PyramidVisionTransformer +load_checkpoint mmseg\models\backbones\pvt_dia.py /^from mmcv.runner import load_checkpoint$/;" i +nn mmseg\models\backbones\pvt_dia.py /^import torch.nn as nn$/;" i +nn mmseg\models\backbones\pvt_dia.py /^import torch.nn.functional as F$/;" i +partial mmseg\models\backbones\pvt_dia.py /^from functools import partial$/;" i +pvt_small_dia mmseg\models\backbones\pvt_dia.py /^class pvt_small_dia(PyramidVisionTransformer):$/;" c +pvt_tiny_dia mmseg\models\backbones\pvt_dia.py /^class pvt_tiny_dia(PyramidVisionTransformer):$/;" c +register_model mmseg\models\backbones\pvt_dia.py /^from timm.models.registry import register_model$/;" i +reset_drop_path mmseg\models\backbones\pvt_dia.py /^ def reset_drop_path(self, drop_path_rate):$/;" m class:PyramidVisionTransformer +to_2tuple mmseg\models\backbones\pvt_dia.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +torch mmseg\models\backbones\pvt_dia.py /^import torch$/;" i +torch mmseg\models\backbones\pvt_dia.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\pvt_dia.py /^import torch.nn.functional as F$/;" i +trunc_normal_ mmseg\models\backbones\pvt_dia.py /^from timm.models.layers import DropPath, to_2tuple, trunc_normal_$/;" i +BACKBONES mmseg\models\backbones\resnest.py /^from ..builder import BACKBONES$/;" i +Bottleneck mmseg\models\backbones\resnest.py /^class Bottleneck(_Bottleneck):$/;" c +F mmseg\models\backbones\resnest.py /^import torch.nn.functional as F$/;" i +RSoftmax mmseg\models\backbones\resnest.py /^class RSoftmax(nn.Module):$/;" c +ResLayer mmseg\models\backbones\resnest.py /^from ..utils import ResLayer$/;" i +ResNeSt mmseg\models\backbones\resnest.py /^class ResNeSt(ResNetV1d):$/;" c +ResNetV1d mmseg\models\backbones\resnest.py /^from .resnet import ResNetV1d$/;" i +SplitAttentionConv2d mmseg\models\backbones\resnest.py /^class SplitAttentionConv2d(nn.Module):$/;" c +_Bottleneck mmseg\models\backbones\resnest.py /^from .resnet import Bottleneck as _Bottleneck$/;" i +__init__ mmseg\models\backbones\resnest.py /^ def __init__(self, radix, groups):$/;" m class:RSoftmax +__init__ mmseg\models\backbones\resnest.py /^ def __init__(self,$/;" m class:Bottleneck +__init__ mmseg\models\backbones\resnest.py /^ def __init__(self,$/;" m class:ResNeSt +__init__ mmseg\models\backbones\resnest.py /^ def __init__(self,$/;" m class:SplitAttentionConv2d +_inner_forward mmseg\models\backbones\resnest.py /^ def _inner_forward(x):$/;" f function:Bottleneck.forward +arch_settings mmseg\models\backbones\resnest.py /^ arch_settings = {$/;" v class:ResNeSt +build_conv_layer mmseg\models\backbones\resnest.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +build_norm_layer mmseg\models\backbones\resnest.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +cp mmseg\models\backbones\resnest.py /^import torch.utils.checkpoint as cp$/;" i +expansion mmseg\models\backbones\resnest.py /^ expansion = 4$/;" v class:Bottleneck +forward mmseg\models\backbones\resnest.py /^ def forward(self, x):$/;" m class:Bottleneck +forward mmseg\models\backbones\resnest.py /^ def forward(self, x):$/;" m class:RSoftmax +forward mmseg\models\backbones\resnest.py /^ def forward(self, x):$/;" m class:SplitAttentionConv2d +make_res_layer mmseg\models\backbones\resnest.py /^ def make_res_layer(self, **kwargs):$/;" m class:ResNeSt +math mmseg\models\backbones\resnest.py /^import math$/;" i +nn mmseg\models\backbones\resnest.py /^import torch.nn as nn$/;" i +nn mmseg\models\backbones\resnest.py /^import torch.nn.functional as F$/;" i +norm0 mmseg\models\backbones\resnest.py /^ def norm0(self):$/;" m class:SplitAttentionConv2d +norm1 mmseg\models\backbones\resnest.py /^ def norm1(self):$/;" m class:SplitAttentionConv2d +torch mmseg\models\backbones\resnest.py /^import torch$/;" i +torch mmseg\models\backbones\resnest.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\resnest.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\backbones\resnest.py /^import torch.utils.checkpoint as cp$/;" i +utils mmseg\models\backbones\resnest.py /^import torch.utils.checkpoint as cp$/;" i +BACKBONES mmseg\models\backbones\resnet.py /^from ..builder import BACKBONES$/;" i +BasicBlock mmseg\models\backbones\resnet.py /^class BasicBlock(nn.Module):$/;" c +Bottleneck mmseg\models\backbones\resnet.py /^class Bottleneck(nn.Module):$/;" c +ResLayer mmseg\models\backbones\resnet.py /^from ..utils import ResLayer$/;" i +ResNet mmseg\models\backbones\resnet.py /^class ResNet(nn.Module):$/;" c +ResNetV1c mmseg\models\backbones\resnet.py /^class ResNetV1c(ResNet):$/;" c +ResNetV1d mmseg\models\backbones\resnet.py /^class ResNetV1d(ResNet):$/;" c +_BatchNorm mmseg\models\backbones\resnet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +__init__ mmseg\models\backbones\resnet.py /^ def __init__(self, **kwargs):$/;" m class:ResNetV1c +__init__ mmseg\models\backbones\resnet.py /^ def __init__(self, **kwargs):$/;" m class:ResNetV1d +__init__ mmseg\models\backbones\resnet.py /^ def __init__(self,$/;" m class:BasicBlock +__init__ mmseg\models\backbones\resnet.py /^ def __init__(self,$/;" m class:Bottleneck +__init__ mmseg\models\backbones\resnet.py /^ def __init__(self,$/;" m class:ResNet +_freeze_stages mmseg\models\backbones\resnet.py /^ def _freeze_stages(self):$/;" m class:ResNet +_inner_forward mmseg\models\backbones\resnet.py /^ def _inner_forward(x):$/;" f function:BasicBlock.forward +_inner_forward mmseg\models\backbones\resnet.py /^ def _inner_forward(x):$/;" f function:Bottleneck.forward +_make_stem_layer mmseg\models\backbones\resnet.py /^ def _make_stem_layer(self, in_channels, stem_channels):$/;" m class:ResNet +arch_settings mmseg\models\backbones\resnet.py /^ arch_settings = {$/;" v class:ResNet +build_conv_layer mmseg\models\backbones\resnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, build_plugin_layer,$/;" i +build_norm_layer mmseg\models\backbones\resnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, build_plugin_layer,$/;" i +build_plugin_layer mmseg\models\backbones\resnet.py /^from mmcv.cnn import (build_conv_layer, build_norm_layer, build_plugin_layer,$/;" i +cp mmseg\models\backbones\resnet.py /^import torch.utils.checkpoint as cp$/;" i +expansion mmseg\models\backbones\resnet.py /^ expansion = 1$/;" v class:BasicBlock +expansion mmseg\models\backbones\resnet.py /^ expansion = 4$/;" v class:Bottleneck +forward mmseg\models\backbones\resnet.py /^ def forward(self, x):$/;" m class:BasicBlock +forward mmseg\models\backbones\resnet.py /^ def forward(self, x):$/;" m class:Bottleneck +forward mmseg\models\backbones\resnet.py /^ def forward(self, x):$/;" m class:ResNet +forward_plugin mmseg\models\backbones\resnet.py /^ def forward_plugin(self, x, plugin_names):$/;" m class:Bottleneck +get_root_logger mmseg\models\backbones\resnet.py /^from mmseg.utils import get_root_logger$/;" i +init_weights mmseg\models\backbones\resnet.py /^ def init_weights(self, pretrained=None):$/;" m class:ResNet +load_checkpoint mmseg\models\backbones\resnet.py /^from mmcv.runner import load_checkpoint$/;" i +make_block_plugins mmseg\models\backbones\resnet.py /^ def make_block_plugins(self, in_channels, plugins):$/;" m class:Bottleneck +make_res_layer mmseg\models\backbones\resnet.py /^ def make_res_layer(self, **kwargs):$/;" m class:ResNet +make_stage_plugins mmseg\models\backbones\resnet.py /^ def make_stage_plugins(self, plugins, stage_idx):$/;" m class:ResNet +nn mmseg\models\backbones\resnet.py /^import torch.nn as nn$/;" i +norm1 mmseg\models\backbones\resnet.py /^ def norm1(self):$/;" m class:BasicBlock +norm1 mmseg\models\backbones\resnet.py /^ def norm1(self):$/;" m class:Bottleneck +norm1 mmseg\models\backbones\resnet.py /^ def norm1(self):$/;" m class:ResNet +norm2 mmseg\models\backbones\resnet.py /^ def norm2(self):$/;" m class:BasicBlock +norm2 mmseg\models\backbones\resnet.py /^ def norm2(self):$/;" m class:Bottleneck +norm3 mmseg\models\backbones\resnet.py /^ def norm3(self):$/;" m class:Bottleneck +torch mmseg\models\backbones\resnet.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\resnet.py /^import torch.utils.checkpoint as cp$/;" i +train mmseg\models\backbones\resnet.py /^ def train(self, mode=True):$/;" m class:ResNet +utils mmseg\models\backbones\resnet.py /^import torch.utils.checkpoint as cp$/;" i +BACKBONES mmseg\models\backbones\resnext.py /^from ..builder import BACKBONES$/;" i +Bottleneck mmseg\models\backbones\resnext.py /^class Bottleneck(_Bottleneck):$/;" c +ResLayer mmseg\models\backbones\resnext.py /^from ..utils import ResLayer$/;" i +ResNeXt mmseg\models\backbones\resnext.py /^class ResNeXt(ResNet):$/;" c +ResNet mmseg\models\backbones\resnext.py /^from .resnet import ResNet$/;" i +_Bottleneck mmseg\models\backbones\resnext.py /^from .resnet import Bottleneck as _Bottleneck$/;" i +__init__ mmseg\models\backbones\resnext.py /^ def __init__(self, groups=1, base_width=4, **kwargs):$/;" m class:ResNeXt +__init__ mmseg\models\backbones\resnext.py /^ def __init__(self,$/;" m class:Bottleneck +arch_settings mmseg\models\backbones\resnext.py /^ arch_settings = {$/;" v class:ResNeXt +build_conv_layer mmseg\models\backbones\resnext.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +build_norm_layer mmseg\models\backbones\resnext.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +make_res_layer mmseg\models\backbones\resnext.py /^ def make_res_layer(self, **kwargs):$/;" m class:ResNeXt +math mmseg\models\backbones\resnext.py /^import math$/;" i +BACKBONES mmseg\models\backbones\unet.py /^from ..builder import BACKBONES$/;" i +BasicConvBlock mmseg\models\backbones\unet.py /^class BasicConvBlock(nn.Module):$/;" c +ConvModule mmseg\models\backbones\unet.py /^from mmcv.cnn import (UPSAMPLE_LAYERS, ConvModule, build_activation_layer,$/;" i +DeconvModule mmseg\models\backbones\unet.py /^class DeconvModule(nn.Module):$/;" c +InterpConv mmseg\models\backbones\unet.py /^class InterpConv(nn.Module):$/;" c +UNet mmseg\models\backbones\unet.py /^class UNet(nn.Module):$/;" c +UPSAMPLE_LAYERS mmseg\models\backbones\unet.py /^from mmcv.cnn import (UPSAMPLE_LAYERS, ConvModule, build_activation_layer,$/;" i +UpConvBlock mmseg\models\backbones\unet.py /^from ..utils import UpConvBlock$/;" i +_BatchNorm mmseg\models\backbones\unet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +__init__ mmseg\models\backbones\unet.py /^ def __init__(self,$/;" m class:BasicConvBlock +__init__ mmseg\models\backbones\unet.py /^ def __init__(self,$/;" m class:DeconvModule +__init__ mmseg\models\backbones\unet.py /^ def __init__(self,$/;" m class:InterpConv +__init__ mmseg\models\backbones\unet.py /^ def __init__(self,$/;" m class:UNet +_check_input_devisible mmseg\models\backbones\unet.py /^ def _check_input_devisible(self, x):$/;" m class:UNet +build_activation_layer mmseg\models\backbones\unet.py /^from mmcv.cnn import (UPSAMPLE_LAYERS, ConvModule, build_activation_layer,$/;" i +cp mmseg\models\backbones\unet.py /^import torch.utils.checkpoint as cp$/;" i +forward mmseg\models\backbones\unet.py /^ def forward(self, x):$/;" m class:BasicConvBlock +forward mmseg\models\backbones\unet.py /^ def forward(self, x):$/;" m class:DeconvModule +forward mmseg\models\backbones\unet.py /^ def forward(self, x):$/;" m class:InterpConv +forward mmseg\models\backbones\unet.py /^ def forward(self, x):$/;" m class:UNet +get_root_logger mmseg\models\backbones\unet.py /^from mmseg.utils import get_root_logger$/;" i +init_weights mmseg\models\backbones\unet.py /^ def init_weights(self, pretrained=None):$/;" m class:UNet +load_checkpoint mmseg\models\backbones\unet.py /^from mmcv.runner import load_checkpoint$/;" i +nn mmseg\models\backbones\unet.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\unet.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\unet.py /^import torch.utils.checkpoint as cp$/;" i +train mmseg\models\backbones\unet.py /^ def train(self, mode=True):$/;" m class:UNet +utils mmseg\models\backbones\unet.py /^import torch.utils.checkpoint as cp$/;" i +Attention mmseg\models\backbones\vit.py /^class Attention(nn.Module):$/;" c +BACKBONES mmseg\models\backbones\vit.py /^from ..builder import BACKBONES$/;" i +Block mmseg\models\backbones\vit.py /^class Block(nn.Module):$/;" c +DropPath mmseg\models\backbones\vit.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +F mmseg\models\backbones\vit.py /^import torch.nn.functional as F$/;" i +HybridEmbed mmseg\models\backbones\vit.py /^class HybridEmbed(nn.Module):$/;" c +Mlp mmseg\models\backbones\vit.py /^class Mlp(nn.Module):$/;" c +PatchEmbed mmseg\models\backbones\vit.py /^class PatchEmbed(nn.Module):$/;" c +VisionTransformer mmseg\models\backbones\vit.py /^class VisionTransformer(nn.Module):$/;" c +__init__ mmseg\models\backbones\vit.py /^ def __init__(self, backbone, img_size=224, feature_size=None, in_chans=3, embed_dim=768):$/;" m class:HybridEmbed +__init__ mmseg\models\backbones\vit.py /^ def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,$/;" m class:Block +__init__ mmseg\models\backbones\vit.py /^ def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):$/;" m class:Attention +__init__ mmseg\models\backbones\vit.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):$/;" m class:PatchEmbed +__init__ mmseg\models\backbones\vit.py /^ def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):$/;" m class:Mlp +__init__ mmseg\models\backbones\vit.py /^ def __init__(self, model_name='vit_large_patch16_384', img_size=384, patch_size=16, in_chans=3, embed_dim=1024, depth=24,$/;" m class:VisionTransformer +_cfg mmseg\models\backbones\vit.py /^def _cfg(url='', **kwargs):$/;" f +_conv_filter mmseg\models\backbones\vit.py /^ def _conv_filter(self, state_dict, patch_size=16):$/;" m class:VisionTransformer +build_norm_layer mmseg\models\backbones\vit.py /^from mmcv.cnn import build_norm_layer$/;" i +default_cfgs mmseg\models\backbones\vit.py /^default_cfgs = {$/;" v +forward mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:Attention +forward mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:Block +forward mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:HybridEmbed +forward mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:Mlp +forward mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:PatchEmbed +forward mmseg\models\backbones\vit.py /^ def forward(self, x):$/;" m class:VisionTransformer +init_weights mmseg\models\backbones\vit.py /^ def init_weights(self, pretrained=None):$/;" m class:VisionTransformer +load_pretrained mmseg\models\backbones\vit.py /^from .helpers import load_pretrained$/;" i +math mmseg\models\backbones\vit.py /^import math$/;" i +nn mmseg\models\backbones\vit.py /^import torch.nn as nn$/;" i +nn mmseg\models\backbones\vit.py /^import torch.nn.functional as F$/;" i +no_weight_decay mmseg\models\backbones\vit.py /^ def no_weight_decay(self):$/;" m class:VisionTransformer +partial mmseg\models\backbones\vit.py /^from functools import partial$/;" i +to_1D mmseg\models\backbones\vit.py /^ def to_1D(self, x):$/;" m class:VisionTransformer +to_2D mmseg\models\backbones\vit.py /^ def to_2D(self, x):$/;" m class:VisionTransformer +to_2tuple mmseg\models\backbones\vit.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +torch mmseg\models\backbones\vit.py /^import torch$/;" i +torch mmseg\models\backbones\vit.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\vit.py /^import torch.nn.functional as F$/;" i +trunc_normal_ mmseg\models\backbones\vit.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +Attention mmseg\models\backbones\vit_mla.py /^class Attention(nn.Module):$/;" c +BACKBONES mmseg\models\backbones\vit_mla.py /^from ..builder import BACKBONES$/;" i +Block mmseg\models\backbones\vit_mla.py /^class Block(nn.Module):$/;" c +Conv_MLA mmseg\models\backbones\vit_mla.py /^class Conv_MLA(nn.Module):$/;" c +DropPath mmseg\models\backbones\vit_mla.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +F mmseg\models\backbones\vit_mla.py /^import torch.nn.functional as F$/;" i +HybridEmbed mmseg\models\backbones\vit_mla.py /^class HybridEmbed(nn.Module):$/;" c +Mlp mmseg\models\backbones\vit_mla.py /^class Mlp(nn.Module):$/;" c +PatchEmbed mmseg\models\backbones\vit_mla.py /^class PatchEmbed(nn.Module):$/;" c +VIT_MLA mmseg\models\backbones\vit_mla.py /^class VIT_MLA(nn.Module):$/;" c +__init__ mmseg\models\backbones\vit_mla.py /^ def __init__(self, backbone, img_size=224, feature_size=None, in_chans=3, embed_dim=768):$/;" m class:HybridEmbed +__init__ mmseg\models\backbones\vit_mla.py /^ def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,$/;" m class:Block +__init__ mmseg\models\backbones\vit_mla.py /^ def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):$/;" m class:Attention +__init__ mmseg\models\backbones\vit_mla.py /^ def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):$/;" m class:PatchEmbed +__init__ mmseg\models\backbones\vit_mla.py /^ def __init__(self, in_channels=1024, mla_channels=256, norm_cfg=None):$/;" m class:Conv_MLA +__init__ mmseg\models\backbones\vit_mla.py /^ def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):$/;" m class:Mlp +__init__ mmseg\models\backbones\vit_mla.py /^ def __init__(self, model_name='vit_large_patch16_384', img_size=384, patch_size=16, in_chans=3, embed_dim=1024, depth=24,$/;" m class:VIT_MLA +_cfg mmseg\models\backbones\vit_mla.py /^def _cfg(url='', **kwargs):$/;" f +_conv_filter mmseg\models\backbones\vit_mla.py /^ def _conv_filter(self, state_dict, patch_size=16):$/;" m class:VIT_MLA +build_norm_layer mmseg\models\backbones\vit_mla.py /^from mmcv.cnn import build_norm_layer$/;" i +default_cfgs mmseg\models\backbones\vit_mla.py /^default_cfgs = {$/;" v +forward mmseg\models\backbones\vit_mla.py /^ def forward(self, res2, res3, res4, res5):$/;" m class:Conv_MLA +forward mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:Attention +forward mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:Block +forward mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:HybridEmbed +forward mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:Mlp +forward mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:PatchEmbed +forward mmseg\models\backbones\vit_mla.py /^ def forward(self, x):$/;" m class:VIT_MLA +init_weights mmseg\models\backbones\vit_mla.py /^ def init_weights(self, pretrained=None):$/;" m class:VIT_MLA +load_pretrained mmseg\models\backbones\vit_mla.py /^from .helpers import load_pretrained$/;" i +math mmseg\models\backbones\vit_mla.py /^import math$/;" i +nn mmseg\models\backbones\vit_mla.py /^import torch.nn as nn$/;" i +nn mmseg\models\backbones\vit_mla.py /^import torch.nn.functional as F$/;" i +no_weight_decay mmseg\models\backbones\vit_mla.py /^ def no_weight_decay(self):$/;" m class:VIT_MLA +partial mmseg\models\backbones\vit_mla.py /^from functools import partial$/;" i +to_2D mmseg\models\backbones\vit_mla.py /^ def to_2D(self, x):$/;" m class:Conv_MLA +to_2tuple mmseg\models\backbones\vit_mla.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +torch mmseg\models\backbones\vit_mla.py /^import torch$/;" i +torch mmseg\models\backbones\vit_mla.py /^import torch.nn as nn$/;" i +torch mmseg\models\backbones\vit_mla.py /^import torch.nn.functional as F$/;" i +trunc_normal_ mmseg\models\backbones\vit_mla.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +BACKBONES mmseg\models\builder.py /^BACKBONES = Registry('backbone')$/;" v +HEADS mmseg\models\builder.py /^HEADS = Registry('head')$/;" v +LOSSES mmseg\models\builder.py /^LOSSES = Registry('loss')$/;" v +NECKS mmseg\models\builder.py /^NECKS = Registry('neck')$/;" v +Registry mmseg\models\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +SEGMENTORS mmseg\models\builder.py /^SEGMENTORS = Registry('segmentor')$/;" v +build mmseg\models\builder.py /^def build(cfg, registry, default_args=None):$/;" f +build_backbone mmseg\models\builder.py /^def build_backbone(cfg):$/;" f +build_from_cfg mmseg\models\builder.py /^from mmcv.utils import Registry, build_from_cfg$/;" i +build_head mmseg\models\builder.py /^def build_head(cfg):$/;" f +build_loss mmseg\models\builder.py /^def build_loss(cfg):$/;" f +build_neck mmseg\models\builder.py /^def build_neck(cfg):$/;" f +build_segmentor mmseg\models\builder.py /^def build_segmentor(cfg, train_cfg=None, test_cfg=None):$/;" f +nn mmseg\models\builder.py /^from torch import nn$/;" i +warnings mmseg\models\builder.py /^import warnings$/;" i +ANNHead mmseg\models\decode_heads\__init__.py /^from .ann_head import ANNHead$/;" i +APCHead mmseg\models\decode_heads\__init__.py /^from .apc_head import APCHead$/;" i +ASPPHead mmseg\models\decode_heads\__init__.py /^from .aspp_head import ASPPHead$/;" i +CCHead mmseg\models\decode_heads\__init__.py /^from .cc_head import CCHead$/;" i +DAHead mmseg\models\decode_heads\__init__.py /^from .da_head import DAHead$/;" i +DMHead mmseg\models\decode_heads\__init__.py /^from .dm_head import DMHead$/;" i +DNLHead mmseg\models\decode_heads\__init__.py /^from .dnl_head import DNLHead$/;" i +DepthwiseSeparableASPPHead mmseg\models\decode_heads\__init__.py /^from .sep_aspp_head import DepthwiseSeparableASPPHead$/;" i +DepthwiseSeparableFCNHead mmseg\models\decode_heads\__init__.py /^from .sep_fcn_head import DepthwiseSeparableFCNHead$/;" i +EMAHead mmseg\models\decode_heads\__init__.py /^from .ema_head import EMAHead$/;" i +EncHead mmseg\models\decode_heads\__init__.py /^from .enc_head import EncHead$/;" i +FCNHead mmseg\models\decode_heads\__init__.py /^from .fcn_head import FCNHead$/;" i +FPNHead mmseg\models\decode_heads\__init__.py /^from .fpn_head import FPNHead$/;" i +GCHead mmseg\models\decode_heads\__init__.py /^from .gc_head import GCHead$/;" i +LRASPPHead mmseg\models\decode_heads\__init__.py /^from .lraspp_head import LRASPPHead$/;" i +NLHead mmseg\models\decode_heads\__init__.py /^from .nl_head import NLHead$/;" i +OCRHead mmseg\models\decode_heads\__init__.py /^from .ocr_head import OCRHead$/;" i +PSAHead mmseg\models\decode_heads\__init__.py /^from .psa_head import PSAHead$/;" i +PSPHead mmseg\models\decode_heads\__init__.py /^from .psp_head import PSPHead$/;" i +PointHead mmseg\models\decode_heads\__init__.py /^from .point_head import PointHead$/;" i +UPerHead mmseg\models\decode_heads\__init__.py /^from .uper_head import UPerHead$/;" i +VIT_MLAHead mmseg\models\decode_heads\__init__.py /^from .vit_mla_head import VIT_MLAHead$/;" i +VIT_MLA_AUXIHead mmseg\models\decode_heads\__init__.py /^from .vit_mla_auxi_head import VIT_MLA_AUXIHead$/;" i +VisionTransformerUpHead mmseg\models\decode_heads\__init__.py /^from .vit_up_head import VisionTransformerUpHead$/;" i +__all__ mmseg\models\decode_heads\__init__.py /^__all__ = [$/;" v +AFNB mmseg\models\decode_heads\ann_head.py /^class AFNB(nn.Module):$/;" c +ANNHead mmseg\models\decode_heads\ann_head.py /^class ANNHead(BaseDecodeHead):$/;" c +APNB mmseg\models\decode_heads\ann_head.py /^class APNB(nn.Module):$/;" c +BaseDecodeHead mmseg\models\decode_heads\ann_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\ann_head.py /^from mmcv.cnn import ConvModule$/;" i +HEADS mmseg\models\decode_heads\ann_head.py /^from ..builder import HEADS$/;" i +PPMConcat mmseg\models\decode_heads\ann_head.py /^class PPMConcat(nn.ModuleList):$/;" c +SelfAttentionBlock mmseg\models\decode_heads\ann_head.py /^class SelfAttentionBlock(_SelfAttentionBlock):$/;" c +_SelfAttentionBlock mmseg\models\decode_heads\ann_head.py /^from ..utils import SelfAttentionBlock as _SelfAttentionBlock$/;" i +__init__ mmseg\models\decode_heads\ann_head.py /^ def __init__(self, in_channels, channels, out_channels, query_scales,$/;" m class:APNB +__init__ mmseg\models\decode_heads\ann_head.py /^ def __init__(self, low_in_channels, high_in_channels, channels,$/;" m class:AFNB +__init__ mmseg\models\decode_heads\ann_head.py /^ def __init__(self, low_in_channels, high_in_channels, channels,$/;" m class:SelfAttentionBlock +__init__ mmseg\models\decode_heads\ann_head.py /^ def __init__(self, pool_scales=(1, 3, 6, 8)):$/;" m class:PPMConcat +__init__ mmseg\models\decode_heads\ann_head.py /^ def __init__(self,$/;" m class:ANNHead +forward mmseg\models\decode_heads\ann_head.py /^ def forward(self, feats):$/;" m class:APNB +forward mmseg\models\decode_heads\ann_head.py /^ def forward(self, feats):$/;" m class:PPMConcat +forward mmseg\models\decode_heads\ann_head.py /^ def forward(self, inputs):$/;" m class:ANNHead +forward mmseg\models\decode_heads\ann_head.py /^ def forward(self, low_feats, high_feats):$/;" m class:AFNB +nn mmseg\models\decode_heads\ann_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\ann_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\ann_head.py /^import torch.nn as nn$/;" i +ACM mmseg\models\decode_heads\apc_head.py /^class ACM(nn.Module):$/;" c +APCHead mmseg\models\decode_heads\apc_head.py /^class APCHead(BaseDecodeHead):$/;" c +BaseDecodeHead mmseg\models\decode_heads\apc_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\apc_head.py /^from mmcv.cnn import ConvModule$/;" i +F mmseg\models\decode_heads\apc_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\apc_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\apc_head.py /^ def __init__(self, pool_scale, fusion, in_channels, channels, conv_cfg,$/;" m class:ACM +__init__ mmseg\models\decode_heads\apc_head.py /^ def __init__(self, pool_scales=(1, 2, 3, 6), fusion=True, **kwargs):$/;" m class:APCHead +forward mmseg\models\decode_heads\apc_head.py /^ def forward(self, inputs):$/;" m class:APCHead +forward mmseg\models\decode_heads\apc_head.py /^ def forward(self, x):$/;" m class:ACM +nn mmseg\models\decode_heads\apc_head.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\apc_head.py /^import torch.nn.functional as F$/;" i +resize mmseg\models\decode_heads\apc_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\apc_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\apc_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\apc_head.py /^import torch.nn.functional as F$/;" i +ASPPHead mmseg\models\decode_heads\aspp_head.py /^class ASPPHead(BaseDecodeHead):$/;" c +ASPPModule mmseg\models\decode_heads\aspp_head.py /^class ASPPModule(nn.ModuleList):$/;" c +BaseDecodeHead mmseg\models\decode_heads\aspp_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\aspp_head.py /^from mmcv.cnn import ConvModule$/;" i +HEADS mmseg\models\decode_heads\aspp_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\aspp_head.py /^ def __init__(self, dilations, in_channels, channels, conv_cfg, norm_cfg,$/;" m class:ASPPModule +__init__ mmseg\models\decode_heads\aspp_head.py /^ def __init__(self, dilations=(1, 6, 12, 18), **kwargs):$/;" m class:ASPPHead +forward mmseg\models\decode_heads\aspp_head.py /^ def forward(self, inputs):$/;" m class:ASPPHead +forward mmseg\models\decode_heads\aspp_head.py /^ def forward(self, x):$/;" m class:ASPPModule +nn mmseg\models\decode_heads\aspp_head.py /^import torch.nn as nn$/;" i +resize mmseg\models\decode_heads\aspp_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\aspp_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\aspp_head.py /^import torch.nn as nn$/;" i +ABCMeta mmseg\models\decode_heads\cascade_decode_head.py /^from abc import ABCMeta, abstractmethod$/;" i +BaseCascadeDecodeHead mmseg\models\decode_heads\cascade_decode_head.py /^class BaseCascadeDecodeHead(BaseDecodeHead, metaclass=ABCMeta):$/;" c +BaseDecodeHead mmseg\models\decode_heads\cascade_decode_head.py /^from .decode_head import BaseDecodeHead$/;" i +__init__ mmseg\models\decode_heads\cascade_decode_head.py /^ def __init__(self, *args, **kwargs):$/;" m class:BaseCascadeDecodeHead +abstractmethod mmseg\models\decode_heads\cascade_decode_head.py /^from abc import ABCMeta, abstractmethod$/;" i +forward mmseg\models\decode_heads\cascade_decode_head.py /^ def forward(self, inputs, prev_output):$/;" m class:BaseCascadeDecodeHead +forward_test mmseg\models\decode_heads\cascade_decode_head.py /^ def forward_test(self, inputs, prev_output, img_metas, test_cfg):$/;" m class:BaseCascadeDecodeHead +forward_train mmseg\models\decode_heads\cascade_decode_head.py /^ def forward_train(self, inputs, prev_output, img_metas, gt_semantic_seg,$/;" m class:BaseCascadeDecodeHead +CCHead mmseg\models\decode_heads\cc_head.py /^class CCHead(FCNHead):$/;" c +CrissCrossAttention mmseg\models\decode_heads\cc_head.py /^ CrissCrossAttention = None$/;" v +CrissCrossAttention mmseg\models\decode_heads\cc_head.py /^ from mmcv.ops import CrissCrossAttention$/;" i +FCNHead mmseg\models\decode_heads\cc_head.py /^from .fcn_head import FCNHead$/;" i +HEADS mmseg\models\decode_heads\cc_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\cc_head.py /^ def __init__(self, recurrence=2, **kwargs):$/;" m class:CCHead +forward mmseg\models\decode_heads\cc_head.py /^ def forward(self, inputs):$/;" m class:CCHead +torch mmseg\models\decode_heads\cc_head.py /^import torch$/;" i +BaseDecodeHead mmseg\models\decode_heads\da_head.py /^from .decode_head import BaseDecodeHead$/;" i +CAM mmseg\models\decode_heads\da_head.py /^class CAM(nn.Module):$/;" c +ConvModule mmseg\models\decode_heads\da_head.py /^from mmcv.cnn import ConvModule, Scale$/;" i +DAHead mmseg\models\decode_heads\da_head.py /^class DAHead(BaseDecodeHead):$/;" c +F mmseg\models\decode_heads\da_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\da_head.py /^from ..builder import HEADS$/;" i +PAM mmseg\models\decode_heads\da_head.py /^class PAM(_SelfAttentionBlock):$/;" c +Scale mmseg\models\decode_heads\da_head.py /^from mmcv.cnn import ConvModule, Scale$/;" i +_SelfAttentionBlock mmseg\models\decode_heads\da_head.py /^from ..utils import SelfAttentionBlock as _SelfAttentionBlock$/;" i +__init__ mmseg\models\decode_heads\da_head.py /^ def __init__(self):$/;" m class:CAM +__init__ mmseg\models\decode_heads\da_head.py /^ def __init__(self, in_channels, channels):$/;" m class:PAM +__init__ mmseg\models\decode_heads\da_head.py /^ def __init__(self, pam_channels, **kwargs):$/;" m class:DAHead +add_prefix mmseg\models\decode_heads\da_head.py /^from mmseg.core import add_prefix$/;" i +cam_cls_seg mmseg\models\decode_heads\da_head.py /^ def cam_cls_seg(self, feat):$/;" m class:DAHead +forward mmseg\models\decode_heads\da_head.py /^ def forward(self, inputs):$/;" m class:DAHead +forward mmseg\models\decode_heads\da_head.py /^ def forward(self, x):$/;" m class:CAM +forward mmseg\models\decode_heads\da_head.py /^ def forward(self, x):$/;" m class:PAM +forward_test mmseg\models\decode_heads\da_head.py /^ def forward_test(self, inputs, img_metas, test_cfg):$/;" m class:DAHead +losses mmseg\models\decode_heads\da_head.py /^ def losses(self, seg_logit, seg_label):$/;" m class:DAHead +nn mmseg\models\decode_heads\da_head.py /^from torch import nn$/;" i +nn mmseg\models\decode_heads\da_head.py /^import torch.nn.functional as F$/;" i +pam_cls_seg mmseg\models\decode_heads\da_head.py /^ def pam_cls_seg(self, feat):$/;" m class:DAHead +torch mmseg\models\decode_heads\da_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\da_head.py /^import torch.nn.functional as F$/;" i +ABCMeta mmseg\models\decode_heads\decode_head.py /^from abc import ABCMeta, abstractmethod$/;" i +BaseDecodeHead mmseg\models\decode_heads\decode_head.py /^class BaseDecodeHead(nn.Module, metaclass=ABCMeta):$/;" c +__init__ mmseg\models\decode_heads\decode_head.py /^ def __init__(self,$/;" m class:BaseDecodeHead +_init_inputs mmseg\models\decode_heads\decode_head.py /^ def _init_inputs(self, in_channels, in_index, input_transform):$/;" m class:BaseDecodeHead +_transform_inputs mmseg\models\decode_heads\decode_head.py /^ def _transform_inputs(self, inputs):$/;" m class:BaseDecodeHead +abstractmethod mmseg\models\decode_heads\decode_head.py /^from abc import ABCMeta, abstractmethod$/;" i +accuracy mmseg\models\decode_heads\decode_head.py /^from ..losses import accuracy$/;" i +auto_fp16 mmseg\models\decode_heads\decode_head.py /^from mmcv.runner import auto_fp16, force_fp32$/;" i +build_loss mmseg\models\decode_heads\decode_head.py /^from ..builder import build_loss$/;" i +build_pixel_sampler mmseg\models\decode_heads\decode_head.py /^from mmseg.core import build_pixel_sampler$/;" i +cls_seg mmseg\models\decode_heads\decode_head.py /^ def cls_seg(self, feat):$/;" m class:BaseDecodeHead +extra_repr mmseg\models\decode_heads\decode_head.py /^ def extra_repr(self):$/;" m class:BaseDecodeHead +force_fp32 mmseg\models\decode_heads\decode_head.py /^from mmcv.runner import auto_fp16, force_fp32$/;" i +forward mmseg\models\decode_heads\decode_head.py /^ def forward(self, inputs):$/;" m class:BaseDecodeHead +forward_test mmseg\models\decode_heads\decode_head.py /^ def forward_test(self, inputs, img_metas, test_cfg):$/;" m class:BaseDecodeHead +forward_train mmseg\models\decode_heads\decode_head.py /^ def forward_train(self, inputs, img_metas, gt_semantic_seg, train_cfg):$/;" m class:BaseDecodeHead +init_weights mmseg\models\decode_heads\decode_head.py /^ def init_weights(self):$/;" m class:BaseDecodeHead +losses mmseg\models\decode_heads\decode_head.py /^ def losses(self, seg_logit, seg_label):$/;" m class:BaseDecodeHead +nn mmseg\models\decode_heads\decode_head.py /^import torch.nn as nn$/;" i +normal_init mmseg\models\decode_heads\decode_head.py /^from mmcv.cnn import normal_init$/;" i +resize mmseg\models\decode_heads\decode_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\decode_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\decode_head.py /^import torch.nn as nn$/;" i +BaseDecodeHead mmseg\models\decode_heads\dm_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\dm_head.py /^from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer$/;" i +DCM mmseg\models\decode_heads\dm_head.py /^class DCM(nn.Module):$/;" c +DMHead mmseg\models\decode_heads\dm_head.py /^class DMHead(BaseDecodeHead):$/;" c +F mmseg\models\decode_heads\dm_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\dm_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\dm_head.py /^ def __init__(self, filter_size, fusion, in_channels, channels, conv_cfg,$/;" m class:DCM +__init__ mmseg\models\decode_heads\dm_head.py /^ def __init__(self, filter_sizes=(1, 3, 5, 7), fusion=False, **kwargs):$/;" m class:DMHead +build_activation_layer mmseg\models\decode_heads\dm_head.py /^from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer$/;" i +build_norm_layer mmseg\models\decode_heads\dm_head.py /^from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer$/;" i +forward mmseg\models\decode_heads\dm_head.py /^ def forward(self, inputs):$/;" m class:DMHead +forward mmseg\models\decode_heads\dm_head.py /^ def forward(self, x):$/;" m class:DCM +nn mmseg\models\decode_heads\dm_head.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\dm_head.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\decode_heads\dm_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\dm_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\dm_head.py /^import torch.nn.functional as F$/;" i +DNLHead mmseg\models\decode_heads\dnl_head.py /^class DNLHead(FCNHead):$/;" c +DisentangledNonLocal2d mmseg\models\decode_heads\dnl_head.py /^class DisentangledNonLocal2d(NonLocal2d):$/;" c +FCNHead mmseg\models\decode_heads\dnl_head.py /^from .fcn_head import FCNHead$/;" i +HEADS mmseg\models\decode_heads\dnl_head.py /^from ..builder import HEADS$/;" i +NonLocal2d mmseg\models\decode_heads\dnl_head.py /^from mmcv.cnn import NonLocal2d$/;" i +__init__ mmseg\models\decode_heads\dnl_head.py /^ def __init__(self, *arg, temperature, **kwargs):$/;" m class:DisentangledNonLocal2d +__init__ mmseg\models\decode_heads\dnl_head.py /^ def __init__(self,$/;" m class:DNLHead +embedded_gaussian mmseg\models\decode_heads\dnl_head.py /^ def embedded_gaussian(self, theta_x, phi_x):$/;" m class:DisentangledNonLocal2d +forward mmseg\models\decode_heads\dnl_head.py /^ def forward(self, inputs):$/;" m class:DNLHead +forward mmseg\models\decode_heads\dnl_head.py /^ def forward(self, x):$/;" m class:DisentangledNonLocal2d +nn mmseg\models\decode_heads\dnl_head.py /^from torch import nn$/;" i +torch mmseg\models\decode_heads\dnl_head.py /^import torch$/;" i +BaseDecodeHead mmseg\models\decode_heads\ema_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\ema_head.py /^from mmcv.cnn import ConvModule$/;" i +EMAHead mmseg\models\decode_heads\ema_head.py /^class EMAHead(BaseDecodeHead):$/;" c +EMAModule mmseg\models\decode_heads\ema_head.py /^class EMAModule(nn.Module):$/;" c +F mmseg\models\decode_heads\ema_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\ema_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\ema_head.py /^ def __init__(self, channels, num_bases, num_stages, momentum):$/;" m class:EMAModule +__init__ mmseg\models\decode_heads\ema_head.py /^ def __init__(self,$/;" m class:EMAHead +dist mmseg\models\decode_heads\ema_head.py /^import torch.distributed as dist$/;" i +forward mmseg\models\decode_heads\ema_head.py /^ def forward(self, feats):$/;" m class:EMAModule +forward mmseg\models\decode_heads\ema_head.py /^ def forward(self, inputs):$/;" m class:EMAHead +math mmseg\models\decode_heads\ema_head.py /^import math$/;" i +nn mmseg\models\decode_heads\ema_head.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\ema_head.py /^import torch.nn.functional as F$/;" i +reduce_mean mmseg\models\decode_heads\ema_head.py /^def reduce_mean(tensor):$/;" f +torch mmseg\models\decode_heads\ema_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\ema_head.py /^import torch.distributed as dist$/;" i +torch mmseg\models\decode_heads\ema_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\ema_head.py /^import torch.nn.functional as F$/;" i +BaseDecodeHead mmseg\models\decode_heads\enc_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\enc_head.py /^from mmcv.cnn import ConvModule, build_norm_layer$/;" i +EncHead mmseg\models\decode_heads\enc_head.py /^class EncHead(BaseDecodeHead):$/;" c +EncModule mmseg\models\decode_heads\enc_head.py /^class EncModule(nn.Module):$/;" c +Encoding mmseg\models\decode_heads\enc_head.py /^from mmseg.ops import Encoding, resize$/;" i +F mmseg\models\decode_heads\enc_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\enc_head.py /^from ..builder import HEADS, build_loss$/;" i +__init__ mmseg\models\decode_heads\enc_head.py /^ def __init__(self, in_channels, num_codes, conv_cfg, norm_cfg, act_cfg):$/;" m class:EncModule +__init__ mmseg\models\decode_heads\enc_head.py /^ def __init__(self,$/;" m class:EncHead +_convert_to_onehot_labels mmseg\models\decode_heads\enc_head.py /^ def _convert_to_onehot_labels(seg_label, num_classes):$/;" m class:EncHead +build_loss mmseg\models\decode_heads\enc_head.py /^from ..builder import HEADS, build_loss$/;" i +build_norm_layer mmseg\models\decode_heads\enc_head.py /^from mmcv.cnn import ConvModule, build_norm_layer$/;" i +forward mmseg\models\decode_heads\enc_head.py /^ def forward(self, inputs):$/;" m class:EncHead +forward mmseg\models\decode_heads\enc_head.py /^ def forward(self, x):$/;" m class:EncModule +forward_test mmseg\models\decode_heads\enc_head.py /^ def forward_test(self, inputs, img_metas, test_cfg):$/;" m class:EncHead +losses mmseg\models\decode_heads\enc_head.py /^ def losses(self, seg_logit, seg_label):$/;" m class:EncHead +nn mmseg\models\decode_heads\enc_head.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\enc_head.py /^import torch.nn.functional as F$/;" i +resize mmseg\models\decode_heads\enc_head.py /^from mmseg.ops import Encoding, resize$/;" i +torch mmseg\models\decode_heads\enc_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\enc_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\enc_head.py /^import torch.nn.functional as F$/;" i +BaseDecodeHead mmseg\models\decode_heads\fcn_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\fcn_head.py /^from mmcv.cnn import ConvModule$/;" i +FCNHead mmseg\models\decode_heads\fcn_head.py /^class FCNHead(BaseDecodeHead):$/;" c +HEADS mmseg\models\decode_heads\fcn_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\fcn_head.py /^ def __init__(self,$/;" m class:FCNHead +forward mmseg\models\decode_heads\fcn_head.py /^ def forward(self, inputs):$/;" m class:FCNHead +nn mmseg\models\decode_heads\fcn_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\fcn_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\fcn_head.py /^import torch.nn as nn$/;" i +BaseDecodeHead mmseg\models\decode_heads\fpn_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\fpn_head.py /^from mmcv.cnn import ConvModule$/;" i +FPNHead mmseg\models\decode_heads\fpn_head.py /^class FPNHead(BaseDecodeHead):$/;" c +HEADS mmseg\models\decode_heads\fpn_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\fpn_head.py /^ def __init__(self, feature_strides, **kwargs):$/;" m class:FPNHead +forward mmseg\models\decode_heads\fpn_head.py /^ def forward(self, inputs):$/;" m class:FPNHead +nn mmseg\models\decode_heads\fpn_head.py /^import torch.nn as nn$/;" i +np mmseg\models\decode_heads\fpn_head.py /^import numpy as np$/;" i +resize mmseg\models\decode_heads\fpn_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\fpn_head.py /^import torch.nn as nn$/;" i +ContextBlock mmseg\models\decode_heads\gc_head.py /^from mmcv.cnn import ContextBlock$/;" i +FCNHead mmseg\models\decode_heads\gc_head.py /^from .fcn_head import FCNHead$/;" i +GCHead mmseg\models\decode_heads\gc_head.py /^class GCHead(FCNHead):$/;" c +HEADS mmseg\models\decode_heads\gc_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\gc_head.py /^ def __init__(self,$/;" m class:GCHead +forward mmseg\models\decode_heads\gc_head.py /^ def forward(self, inputs):$/;" m class:GCHead +torch mmseg\models\decode_heads\gc_head.py /^import torch$/;" i +F mmseg\models\decode_heads\helpers.py /^import torch.nn.functional as F$/;" i +_logger mmseg\models\decode_heads\helpers.py /^_logger = logging.getLogger(__name__)$/;" v +load_pretrained mmseg\models\decode_heads\helpers.py /^def load_pretrained(model, cfg=None, num_classes=1000, in_chans=3, filter_fn=None, strict=True, pos_embed_interp=False, num_patches=576, align_corners=False):$/;" f +logging mmseg\models\decode_heads\helpers.py /^import logging$/;" i +math mmseg\models\decode_heads\helpers.py /^import math$/;" i +model_zoo mmseg\models\decode_heads\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +nn mmseg\models\decode_heads\helpers.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\helpers.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\decode_heads\helpers.py /^import torch$/;" i +torch mmseg\models\decode_heads\helpers.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\helpers.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\decode_heads\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +utils mmseg\models\decode_heads\helpers.py /^import torch.utils.model_zoo as model_zoo$/;" i +DropBlock2d mmseg\models\decode_heads\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +DropPath mmseg\models\decode_heads\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +drop_block_2d mmseg\models\decode_heads\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +drop_path mmseg\models\decode_heads\layers\__init__.py /^from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path$/;" i +to_2tuple mmseg\models\decode_heads\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_3tuple mmseg\models\decode_heads\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_4tuple mmseg\models\decode_heads\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +to_ntuple mmseg\models\decode_heads\layers\__init__.py /^from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple$/;" i +trunc_normal_ mmseg\models\decode_heads\layers\__init__.py /^from .weight_init import trunc_normal_/;" i +DropBlock2d mmseg\models\decode_heads\layers\drop.py /^class DropBlock2d(nn.Module):$/;" c +DropPath mmseg\models\decode_heads\layers\drop.py /^class DropPath(nn.Module):$/;" c +F mmseg\models\decode_heads\layers\drop.py /^import torch.nn.functional as F$/;" i +__init__ mmseg\models\decode_heads\layers\drop.py /^ def __init__(self, drop_prob=None):$/;" m class:DropPath +__init__ mmseg\models\decode_heads\layers\drop.py /^ def __init__(self,$/;" m class:DropBlock2d +drop_block_2d mmseg\models\decode_heads\layers\drop.py /^def drop_block_2d($/;" f +drop_block_fast_2d mmseg\models\decode_heads\layers\drop.py /^def drop_block_fast_2d($/;" f +drop_path mmseg\models\decode_heads\layers\drop.py /^def drop_path(x, drop_prob: float = 0., training: bool = False):$/;" f +forward mmseg\models\decode_heads\layers\drop.py /^ def forward(self, x):$/;" m class:DropBlock2d +forward mmseg\models\decode_heads\layers\drop.py /^ def forward(self, x):$/;" m class:DropPath +nn mmseg\models\decode_heads\layers\drop.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\layers\drop.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\decode_heads\layers\drop.py /^import torch$/;" i +torch mmseg\models\decode_heads\layers\drop.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\layers\drop.py /^import torch.nn.functional as F$/;" i +_ntuple mmseg\models\decode_heads\layers\helpers.py /^def _ntuple(n):$/;" f +container_abcs mmseg\models\decode_heads\layers\helpers.py /^from torch._six import container_abcs$/;" i +parse mmseg\models\decode_heads\layers\helpers.py /^ def parse(x):$/;" f function:_ntuple +repeat mmseg\models\decode_heads\layers\helpers.py /^from itertools import repeat$/;" i +to_1tuple mmseg\models\decode_heads\layers\helpers.py /^to_1tuple = _ntuple(1)$/;" v +to_2tuple mmseg\models\decode_heads\layers\helpers.py /^to_2tuple = _ntuple(2)$/;" v +to_3tuple mmseg\models\decode_heads\layers\helpers.py /^to_3tuple = _ntuple(3)$/;" v +to_4tuple mmseg\models\decode_heads\layers\helpers.py /^to_4tuple = _ntuple(4)$/;" v +to_ntuple mmseg\models\decode_heads\layers\helpers.py /^to_ntuple = _ntuple$/;" v +_no_grad_trunc_normal_ mmseg\models\decode_heads\layers\weight_init.py /^def _no_grad_trunc_normal_(tensor, mean, std, a, b):$/;" f +math mmseg\models\decode_heads\layers\weight_init.py /^import math$/;" i +norm_cdf mmseg\models\decode_heads\layers\weight_init.py /^ def norm_cdf(x):$/;" f function:_no_grad_trunc_normal_ +torch mmseg\models\decode_heads\layers\weight_init.py /^import torch$/;" i +trunc_normal_ mmseg\models\decode_heads\layers\weight_init.py /^def trunc_normal_(tensor, mean=0., std=1., a=-2., b=2.):$/;" f +warnings mmseg\models\decode_heads\layers\weight_init.py /^import warnings$/;" i +BaseDecodeHead mmseg\models\decode_heads\lraspp_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\lraspp_head.py /^from mmcv.cnn import ConvModule$/;" i +HEADS mmseg\models\decode_heads\lraspp_head.py /^from ..builder import HEADS$/;" i +LRASPPHead mmseg\models\decode_heads\lraspp_head.py /^class LRASPPHead(BaseDecodeHead):$/;" c +__init__ mmseg\models\decode_heads\lraspp_head.py /^ def __init__(self, branch_channels=(32, 64), **kwargs):$/;" m class:LRASPPHead +forward mmseg\models\decode_heads\lraspp_head.py /^ def forward(self, inputs):$/;" m class:LRASPPHead +is_tuple_of mmseg\models\decode_heads\lraspp_head.py /^from mmcv import is_tuple_of$/;" i +nn mmseg\models\decode_heads\lraspp_head.py /^import torch.nn as nn$/;" i +resize mmseg\models\decode_heads\lraspp_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\lraspp_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\lraspp_head.py /^import torch.nn as nn$/;" i +FCNHead mmseg\models\decode_heads\nl_head.py /^from .fcn_head import FCNHead$/;" i +HEADS mmseg\models\decode_heads\nl_head.py /^from ..builder import HEADS$/;" i +NLHead mmseg\models\decode_heads\nl_head.py /^class NLHead(FCNHead):$/;" c +NonLocal2d mmseg\models\decode_heads\nl_head.py /^from mmcv.cnn import NonLocal2d$/;" i +__init__ mmseg\models\decode_heads\nl_head.py /^ def __init__(self,$/;" m class:NLHead +forward mmseg\models\decode_heads\nl_head.py /^ def forward(self, inputs):$/;" m class:NLHead +torch mmseg\models\decode_heads\nl_head.py /^import torch$/;" i +BaseCascadeDecodeHead mmseg\models\decode_heads\ocr_head.py /^from .cascade_decode_head import BaseCascadeDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\ocr_head.py /^from mmcv.cnn import ConvModule$/;" i +F mmseg\models\decode_heads\ocr_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\ocr_head.py /^from ..builder import HEADS$/;" i +OCRHead mmseg\models\decode_heads\ocr_head.py /^class OCRHead(BaseCascadeDecodeHead):$/;" c +ObjectAttentionBlock mmseg\models\decode_heads\ocr_head.py /^class ObjectAttentionBlock(_SelfAttentionBlock):$/;" c +SpatialGatherModule mmseg\models\decode_heads\ocr_head.py /^class SpatialGatherModule(nn.Module):$/;" c +_SelfAttentionBlock mmseg\models\decode_heads\ocr_head.py /^from ..utils import SelfAttentionBlock as _SelfAttentionBlock$/;" i +__init__ mmseg\models\decode_heads\ocr_head.py /^ def __init__(self, in_channels, channels, scale, conv_cfg, norm_cfg,$/;" m class:ObjectAttentionBlock +__init__ mmseg\models\decode_heads\ocr_head.py /^ def __init__(self, ocr_channels, scale=1, **kwargs):$/;" m class:OCRHead +__init__ mmseg\models\decode_heads\ocr_head.py /^ def __init__(self, scale):$/;" m class:SpatialGatherModule +forward mmseg\models\decode_heads\ocr_head.py /^ def forward(self, feats, probs):$/;" m class:SpatialGatherModule +forward mmseg\models\decode_heads\ocr_head.py /^ def forward(self, inputs, prev_output):$/;" m class:OCRHead +forward mmseg\models\decode_heads\ocr_head.py /^ def forward(self, query_feats, key_feats):$/;" m class:ObjectAttentionBlock +nn mmseg\models\decode_heads\ocr_head.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\ocr_head.py /^import torch.nn.functional as F$/;" i +resize mmseg\models\decode_heads\ocr_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\ocr_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\ocr_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\ocr_head.py /^import torch.nn.functional as F$/;" i +BaseCascadeDecodeHead mmseg\models\decode_heads\point_head.py /^from .cascade_decode_head import BaseCascadeDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\point_head.py /^from mmcv.cnn import ConvModule, normal_init$/;" i +HEADS mmseg\models\decode_heads\point_head.py /^from mmseg.models.builder import HEADS$/;" i +PointHead mmseg\models\decode_heads\point_head.py /^class PointHead(BaseCascadeDecodeHead):$/;" c +__init__ mmseg\models\decode_heads\point_head.py /^ def __init__(self,$/;" m class:PointHead +_get_coarse_point_feats mmseg\models\decode_heads\point_head.py /^ def _get_coarse_point_feats(self, prev_output, points):$/;" m class:PointHead +_get_fine_grained_point_feats mmseg\models\decode_heads\point_head.py /^ def _get_fine_grained_point_feats(self, x, points):$/;" m class:PointHead +accuracy mmseg\models\decode_heads\point_head.py /^from ..losses import accuracy$/;" i +calculate_uncertainty mmseg\models\decode_heads\point_head.py /^def calculate_uncertainty(seg_logits):$/;" f +cls_seg mmseg\models\decode_heads\point_head.py /^ def cls_seg(self, feat):$/;" m class:PointHead +forward mmseg\models\decode_heads\point_head.py /^ def forward(self, fine_grained_point_feats, coarse_point_feats):$/;" m class:PointHead +forward_test mmseg\models\decode_heads\point_head.py /^ def forward_test(self, inputs, prev_output, img_metas, test_cfg):$/;" m class:PointHead +forward_train mmseg\models\decode_heads\point_head.py /^ def forward_train(self, inputs, prev_output, img_metas, gt_semantic_seg,$/;" m class:PointHead +get_points_test mmseg\models\decode_heads\point_head.py /^ def get_points_test(self, seg_logits, uncertainty_func, cfg):$/;" m class:PointHead +get_points_train mmseg\models\decode_heads\point_head.py /^ def get_points_train(self, seg_logits, uncertainty_func, cfg):$/;" m class:PointHead +init_weights mmseg\models\decode_heads\point_head.py /^ def init_weights(self):$/;" m class:PointHead +losses mmseg\models\decode_heads\point_head.py /^ def losses(self, point_logits, point_label):$/;" m class:PointHead +nn mmseg\models\decode_heads\point_head.py /^import torch.nn as nn$/;" i +normal_init mmseg\models\decode_heads\point_head.py /^from mmcv.cnn import ConvModule, normal_init$/;" i +point_sample mmseg\models\decode_heads\point_head.py /^from mmcv.ops import point_sample$/;" i +resize mmseg\models\decode_heads\point_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\point_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\point_head.py /^import torch.nn as nn$/;" i +BaseDecodeHead mmseg\models\decode_heads\psa_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\psa_head.py /^from mmcv.cnn import ConvModule$/;" i +F mmseg\models\decode_heads\psa_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\psa_head.py /^from ..builder import HEADS$/;" i +PSAHead mmseg\models\decode_heads\psa_head.py /^class PSAHead(BaseDecodeHead):$/;" c +PSAMask mmseg\models\decode_heads\psa_head.py /^ PSAMask = None$/;" v +PSAMask mmseg\models\decode_heads\psa_head.py /^ from mmcv.ops import PSAMask$/;" i +__init__ mmseg\models\decode_heads\psa_head.py /^ def __init__(self,$/;" m class:PSAHead +forward mmseg\models\decode_heads\psa_head.py /^ def forward(self, inputs):$/;" m class:PSAHead +nn mmseg\models\decode_heads\psa_head.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\psa_head.py /^import torch.nn.functional as F$/;" i +resize mmseg\models\decode_heads\psa_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\psa_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\psa_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\psa_head.py /^import torch.nn.functional as F$/;" i +BaseDecodeHead mmseg\models\decode_heads\psp_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\psp_head.py /^from mmcv.cnn import ConvModule$/;" i +HEADS mmseg\models\decode_heads\psp_head.py /^from ..builder import HEADS$/;" i +PPM mmseg\models\decode_heads\psp_head.py /^class PPM(nn.ModuleList):$/;" c +PSPHead mmseg\models\decode_heads\psp_head.py /^class PSPHead(BaseDecodeHead):$/;" c +__init__ mmseg\models\decode_heads\psp_head.py /^ def __init__(self, pool_scales, in_channels, channels, conv_cfg, norm_cfg,$/;" m class:PPM +__init__ mmseg\models\decode_heads\psp_head.py /^ def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs):$/;" m class:PSPHead +forward mmseg\models\decode_heads\psp_head.py /^ def forward(self, inputs):$/;" m class:PSPHead +forward mmseg\models\decode_heads\psp_head.py /^ def forward(self, x):$/;" m class:PPM +nn mmseg\models\decode_heads\psp_head.py /^import torch.nn as nn$/;" i +resize mmseg\models\decode_heads\psp_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\psp_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\psp_head.py /^import torch.nn as nn$/;" i +ASPPHead mmseg\models\decode_heads\sep_aspp_head.py /^from .aspp_head import ASPPHead, ASPPModule$/;" i +ASPPModule mmseg\models\decode_heads\sep_aspp_head.py /^from .aspp_head import ASPPHead, ASPPModule$/;" i +ConvModule mmseg\models\decode_heads\sep_aspp_head.py /^from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule$/;" i +DepthwiseSeparableASPPHead mmseg\models\decode_heads\sep_aspp_head.py /^class DepthwiseSeparableASPPHead(ASPPHead):$/;" c +DepthwiseSeparableASPPModule mmseg\models\decode_heads\sep_aspp_head.py /^class DepthwiseSeparableASPPModule(ASPPModule):$/;" c +DepthwiseSeparableConvModule mmseg\models\decode_heads\sep_aspp_head.py /^from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule$/;" i +HEADS mmseg\models\decode_heads\sep_aspp_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\sep_aspp_head.py /^ def __init__(self, **kwargs):$/;" m class:DepthwiseSeparableASPPModule +__init__ mmseg\models\decode_heads\sep_aspp_head.py /^ def __init__(self, c1_in_channels, c1_channels, **kwargs):$/;" m class:DepthwiseSeparableASPPHead +forward mmseg\models\decode_heads\sep_aspp_head.py /^ def forward(self, inputs):$/;" m class:DepthwiseSeparableASPPHead +nn mmseg\models\decode_heads\sep_aspp_head.py /^import torch.nn as nn$/;" i +resize mmseg\models\decode_heads\sep_aspp_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\sep_aspp_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\sep_aspp_head.py /^import torch.nn as nn$/;" i +DepthwiseSeparableConvModule mmseg\models\decode_heads\sep_fcn_head.py /^from mmcv.cnn import DepthwiseSeparableConvModule$/;" i +DepthwiseSeparableFCNHead mmseg\models\decode_heads\sep_fcn_head.py /^class DepthwiseSeparableFCNHead(FCNHead):$/;" c +FCNHead mmseg\models\decode_heads\sep_fcn_head.py /^from .fcn_head import FCNHead$/;" i +HEADS mmseg\models\decode_heads\sep_fcn_head.py /^from ..builder import HEADS$/;" i +__init__ mmseg\models\decode_heads\sep_fcn_head.py /^ def __init__(self, **kwargs):$/;" m class:DepthwiseSeparableFCNHead +BaseDecodeHead mmseg\models\decode_heads\uper_head.py /^from .decode_head import BaseDecodeHead$/;" i +ConvModule mmseg\models\decode_heads\uper_head.py /^from mmcv.cnn import ConvModule$/;" i +HEADS mmseg\models\decode_heads\uper_head.py /^from ..builder import HEADS$/;" i +PPM mmseg\models\decode_heads\uper_head.py /^from .psp_head import PPM$/;" i +UPerHead mmseg\models\decode_heads\uper_head.py /^class UPerHead(BaseDecodeHead):$/;" c +__init__ mmseg\models\decode_heads\uper_head.py /^ def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs):$/;" m class:UPerHead +forward mmseg\models\decode_heads\uper_head.py /^ def forward(self, inputs):$/;" m class:UPerHead +nn mmseg\models\decode_heads\uper_head.py /^import torch.nn as nn$/;" i +psp_forward mmseg\models\decode_heads\uper_head.py /^ def psp_forward(self, inputs):$/;" m class:UPerHead +resize mmseg\models\decode_heads\uper_head.py /^from mmseg.ops import resize$/;" i +torch mmseg\models\decode_heads\uper_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\uper_head.py /^import torch.nn as nn$/;" i +BaseDecodeHead mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .decode_head import BaseDecodeHead$/;" i +Block mmseg\models\decode_heads\vit_mla_auxi_head.py /^from ..backbones.vit import Block$/;" i +DropPath mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +F mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\vit_mla_auxi_head.py /^from ..builder import HEADS$/;" i +VIT_MLA_AUXIHead mmseg\models\decode_heads\vit_mla_auxi_head.py /^class VIT_MLA_AUXIHead(BaseDecodeHead):$/;" c +__init__ mmseg\models\decode_heads\vit_mla_auxi_head.py /^ def __init__(self, img_size=768, **kwargs):$/;" m class:VIT_MLA_AUXIHead +build_norm_layer mmseg\models\decode_heads\vit_mla_auxi_head.py /^from mmcv.cnn import build_norm_layer$/;" i +forward mmseg\models\decode_heads\vit_mla_auxi_head.py /^ def forward(self, x):$/;" m class:VIT_MLA_AUXIHead +load_pretrained mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .helpers import load_pretrained$/;" i +math mmseg\models\decode_heads\vit_mla_auxi_head.py /^import math$/;" i +nn mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn.functional as F$/;" i +partial mmseg\models\decode_heads\vit_mla_auxi_head.py /^from functools import partial$/;" i +to_2D mmseg\models\decode_heads\vit_mla_auxi_head.py /^ def to_2D(self, x):$/;" m class:VIT_MLA_AUXIHead +to_2tuple mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +torch mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\vit_mla_auxi_head.py /^import torch.nn.functional as F$/;" i +trunc_normal_ mmseg\models\decode_heads\vit_mla_auxi_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +BaseDecodeHead mmseg\models\decode_heads\vit_mla_head.py /^from .decode_head import BaseDecodeHead$/;" i +Block mmseg\models\decode_heads\vit_mla_head.py /^from ..backbones.vit import Block$/;" i +DropPath mmseg\models\decode_heads\vit_mla_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +F mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\vit_mla_head.py /^from ..builder import HEADS$/;" i +MLAHead mmseg\models\decode_heads\vit_mla_head.py /^class MLAHead(nn.Module):$/;" c +VIT_MLAHead mmseg\models\decode_heads\vit_mla_head.py /^class VIT_MLAHead(BaseDecodeHead):$/;" c +__init__ mmseg\models\decode_heads\vit_mla_head.py /^ def __init__(self, img_size=768, mla_channels=256, mlahead_channels=128, $/;" m class:VIT_MLAHead +__init__ mmseg\models\decode_heads\vit_mla_head.py /^ def __init__(self, mla_channels=256, mlahead_channels=128, norm_cfg=None):$/;" m class:MLAHead +build_norm_layer mmseg\models\decode_heads\vit_mla_head.py /^from mmcv.cnn import build_norm_layer$/;" i +forward mmseg\models\decode_heads\vit_mla_head.py /^ def forward(self, inputs):$/;" m class:VIT_MLAHead +forward mmseg\models\decode_heads\vit_mla_head.py /^ def forward(self, mla_p2, mla_p3, mla_p4, mla_p5):$/;" m class:MLAHead +load_pretrained mmseg\models\decode_heads\vit_mla_head.py /^from .helpers import load_pretrained$/;" i +math mmseg\models\decode_heads\vit_mla_head.py /^import math$/;" i +nn mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn.functional as F$/;" i +partial mmseg\models\decode_heads\vit_mla_head.py /^from functools import partial$/;" i +to_2tuple mmseg\models\decode_heads\vit_mla_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +torch mmseg\models\decode_heads\vit_mla_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\vit_mla_head.py /^import torch.nn.functional as F$/;" i +trunc_normal_ mmseg\models\decode_heads\vit_mla_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +BaseDecodeHead mmseg\models\decode_heads\vit_up_head.py /^from .decode_head import BaseDecodeHead$/;" i +Block mmseg\models\decode_heads\vit_up_head.py /^from ..backbones.vit import Block$/;" i +DropPath mmseg\models\decode_heads\vit_up_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +F mmseg\models\decode_heads\vit_up_head.py /^import torch.nn.functional as F$/;" i +HEADS mmseg\models\decode_heads\vit_up_head.py /^from ..builder import HEADS$/;" i +VisionTransformerUpHead mmseg\models\decode_heads\vit_up_head.py /^class VisionTransformerUpHead(BaseDecodeHead):$/;" c +__init__ mmseg\models\decode_heads\vit_up_head.py /^ def __init__(self, img_size=768, embed_dim=1024, $/;" m class:VisionTransformerUpHead +build_norm_layer mmseg\models\decode_heads\vit_up_head.py /^from mmcv.cnn import build_norm_layer$/;" i +forward mmseg\models\decode_heads\vit_up_head.py /^ def forward(self, x):$/;" m class:VisionTransformerUpHead +init_weights mmseg\models\decode_heads\vit_up_head.py /^ def init_weights(self):$/;" m class:VisionTransformerUpHead +load_pretrained mmseg\models\decode_heads\vit_up_head.py /^from .helpers import load_pretrained$/;" i +math mmseg\models\decode_heads\vit_up_head.py /^import math$/;" i +nn mmseg\models\decode_heads\vit_up_head.py /^import torch.nn as nn$/;" i +nn mmseg\models\decode_heads\vit_up_head.py /^import torch.nn.functional as F$/;" i +partial mmseg\models\decode_heads\vit_up_head.py /^from functools import partial$/;" i +to_2tuple mmseg\models\decode_heads\vit_up_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +torch mmseg\models\decode_heads\vit_up_head.py /^import torch$/;" i +torch mmseg\models\decode_heads\vit_up_head.py /^import torch.nn as nn$/;" i +torch mmseg\models\decode_heads\vit_up_head.py /^import torch.nn.functional as F$/;" i +trunc_normal_ mmseg\models\decode_heads\vit_up_head.py /^from .layers import DropPath, to_2tuple, trunc_normal_$/;" i +Accuracy mmseg\models\losses\__init__.py /^from .accuracy import Accuracy, accuracy$/;" i +CrossEntropyLoss mmseg\models\losses\__init__.py /^from .cross_entropy_loss import (CrossEntropyLoss, binary_cross_entropy,$/;" i +LovaszLoss mmseg\models\losses\__init__.py /^from .lovasz_loss import LovaszLoss$/;" i +__all__ mmseg\models\losses\__init__.py /^__all__ = [$/;" v +accuracy mmseg\models\losses\__init__.py /^from .accuracy import Accuracy, accuracy$/;" i +binary_cross_entropy mmseg\models\losses\__init__.py /^from .cross_entropy_loss import (CrossEntropyLoss, binary_cross_entropy,$/;" i +reduce_loss mmseg\models\losses\__init__.py /^from .utils import reduce_loss, weight_reduce_loss, weighted_loss$/;" i +weight_reduce_loss mmseg\models\losses\__init__.py /^from .utils import reduce_loss, weight_reduce_loss, weighted_loss$/;" i +weighted_loss mmseg\models\losses\__init__.py /^from .utils import reduce_loss, weight_reduce_loss, weighted_loss$/;" i +Accuracy mmseg\models\losses\accuracy.py /^class Accuracy(nn.Module):$/;" c +__init__ mmseg\models\losses\accuracy.py /^ def __init__(self, topk=(1, ), thresh=None):$/;" m class:Accuracy +accuracy mmseg\models\losses\accuracy.py /^def accuracy(pred, target, topk=1, thresh=None):$/;" f +forward mmseg\models\losses\accuracy.py /^ def forward(self, pred, target):$/;" m class:Accuracy +nn mmseg\models\losses\accuracy.py /^import torch.nn as nn$/;" i +torch mmseg\models\losses\accuracy.py /^import torch.nn as nn$/;" i +CrossEntropyLoss mmseg\models\losses\cross_entropy_loss.py /^class CrossEntropyLoss(nn.Module):$/;" c +F mmseg\models\losses\cross_entropy_loss.py /^import torch.nn.functional as F$/;" i +LOSSES mmseg\models\losses\cross_entropy_loss.py /^from ..builder import LOSSES$/;" i +__init__ mmseg\models\losses\cross_entropy_loss.py /^ def __init__(self,$/;" m class:CrossEntropyLoss +_expand_onehot_labels mmseg\models\losses\cross_entropy_loss.py /^def _expand_onehot_labels(labels, label_weights, target_shape, ignore_index):$/;" f +binary_cross_entropy mmseg\models\losses\cross_entropy_loss.py /^def binary_cross_entropy(pred,$/;" f +cross_entropy mmseg\models\losses\cross_entropy_loss.py /^def cross_entropy(pred,$/;" f +forward mmseg\models\losses\cross_entropy_loss.py /^ def forward(self,$/;" m class:CrossEntropyLoss +mask_cross_entropy mmseg\models\losses\cross_entropy_loss.py /^def mask_cross_entropy(pred,$/;" f +nn mmseg\models\losses\cross_entropy_loss.py /^import torch.nn as nn$/;" i +nn mmseg\models\losses\cross_entropy_loss.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\losses\cross_entropy_loss.py /^import torch$/;" i +torch mmseg\models\losses\cross_entropy_loss.py /^import torch.nn as nn$/;" i +torch mmseg\models\losses\cross_entropy_loss.py /^import torch.nn.functional as F$/;" i +weight_reduce_loss mmseg\models\losses\cross_entropy_loss.py /^from .utils import weight_reduce_loss$/;" i +F mmseg\models\losses\lovasz_loss.py /^import torch.nn.functional as F$/;" i +LOSSES mmseg\models\losses\lovasz_loss.py /^from ..builder import LOSSES$/;" i +LovaszLoss mmseg\models\losses\lovasz_loss.py /^class LovaszLoss(nn.Module):$/;" c +__init__ mmseg\models\losses\lovasz_loss.py /^ def __init__(self,$/;" m class:LovaszLoss +c mmseg\models\losses\lovasz_loss.py /^ fg = (labels == c).float() # foreground for class c$/;" c function:lovasz_softmax_flat +class_pred mmseg\models\losses\lovasz_loss.py /^ class_pred = probs[:, 0]$/;" v class:lovasz_softmax_flat.c +class_pred mmseg\models\losses\lovasz_loss.py /^ class_pred = probs[:, c]$/;" v class:lovasz_softmax_flat.c +flatten_binary_logits mmseg\models\losses\lovasz_loss.py /^def flatten_binary_logits(logits, labels, ignore_index=None):$/;" f +flatten_probs mmseg\models\losses\lovasz_loss.py /^def flatten_probs(probs, labels, ignore_index=None):$/;" f +forward mmseg\models\losses\lovasz_loss.py /^ def forward(self,$/;" m class:LovaszLoss +lovasz_grad mmseg\models\losses\lovasz_loss.py /^def lovasz_grad(gt_sorted):$/;" f +lovasz_hinge mmseg\models\losses\lovasz_loss.py /^def lovasz_hinge(logits,$/;" f +lovasz_hinge_flat mmseg\models\losses\lovasz_loss.py /^def lovasz_hinge_flat(logits, labels):$/;" f +lovasz_softmax mmseg\models\losses\lovasz_loss.py /^def lovasz_softmax(probs,$/;" f +lovasz_softmax_flat mmseg\models\losses\lovasz_loss.py /^def lovasz_softmax_flat(probs, labels, classes='present', class_weight=None):$/;" f +mmcv mmseg\models\losses\lovasz_loss.py /^import mmcv$/;" i +nn mmseg\models\losses\lovasz_loss.py /^import torch.nn as nn$/;" i +nn mmseg\models\losses\lovasz_loss.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\losses\lovasz_loss.py /^import torch$/;" i +torch mmseg\models\losses\lovasz_loss.py /^import torch.nn as nn$/;" i +torch mmseg\models\losses\lovasz_loss.py /^import torch.nn.functional as F$/;" i +weight_reduce_loss mmseg\models\losses\lovasz_loss.py /^from .utils import weight_reduce_loss$/;" i +F mmseg\models\losses\utils.py /^import torch.nn.functional as F$/;" i +functools mmseg\models\losses\utils.py /^import functools$/;" i +nn mmseg\models\losses\utils.py /^import torch.nn.functional as F$/;" i +reduce_loss mmseg\models\losses\utils.py /^def reduce_loss(loss, reduction):$/;" f +torch mmseg\models\losses\utils.py /^import torch.nn.functional as F$/;" i +weight_reduce_loss mmseg\models\losses\utils.py /^def weight_reduce_loss(loss, weight=None, reduction='mean', avg_factor=None):$/;" f +weighted_loss mmseg\models\losses\utils.py /^def weighted_loss(loss_func):$/;" f +wrapper mmseg\models\losses\utils.py /^ def wrapper(pred,$/;" f function:weighted_loss +FPN mmseg\models\necks\__init__.py /^from .fpn import FPN$/;" i +__all__ mmseg\models\necks\__init__.py /^__all__ = ['FPN']$/;" v +ConvModule mmseg\models\necks\fpn.py /^from mmcv.cnn import ConvModule, xavier_init$/;" i +F mmseg\models\necks\fpn.py /^import torch.nn.functional as F$/;" i +FPN mmseg\models\necks\fpn.py /^class FPN(nn.Module):$/;" c +NECKS mmseg\models\necks\fpn.py /^from ..builder import NECKS$/;" i +__init__ mmseg\models\necks\fpn.py /^ def __init__(self,$/;" m class:FPN +forward mmseg\models\necks\fpn.py /^ def forward(self, inputs):$/;" m class:FPN +init_weights mmseg\models\necks\fpn.py /^ def init_weights(self):$/;" m class:FPN +nn mmseg\models\necks\fpn.py /^import torch.nn as nn$/;" i +nn mmseg\models\necks\fpn.py /^import torch.nn.functional as F$/;" i +torch mmseg\models\necks\fpn.py /^import torch.nn as nn$/;" i +torch mmseg\models\necks\fpn.py /^import torch.nn.functional as F$/;" i +xavier_init mmseg\models\necks\fpn.py /^from mmcv.cnn import ConvModule, xavier_init$/;" i +CascadeEncoderDecoder mmseg\models\segmentors\__init__.py /^from .cascade_encoder_decoder import CascadeEncoderDecoder$/;" i +EncoderDecoder mmseg\models\segmentors\__init__.py /^from .encoder_decoder import EncoderDecoder$/;" i +__all__ mmseg\models\segmentors\__init__.py /^__all__ = ['EncoderDecoder', 'CascadeEncoderDecoder']$/;" v +ABCMeta mmseg\models\segmentors\base.py /^from abc import ABCMeta, abstractmethod$/;" i +BaseSegmentor mmseg\models\segmentors\base.py /^class BaseSegmentor(nn.Module):$/;" c +OrderedDict mmseg\models\segmentors\base.py /^from collections import OrderedDict$/;" i +__init__ mmseg\models\segmentors\base.py /^ def __init__(self):$/;" m class:BaseSegmentor +__metaclass__ mmseg\models\segmentors\base.py /^ __metaclass__ = ABCMeta$/;" v class:BaseSegmentor +_parse_losses mmseg\models\segmentors\base.py /^ def _parse_losses(losses):$/;" m class:BaseSegmentor +abstractmethod mmseg\models\segmentors\base.py /^from abc import ABCMeta, abstractmethod$/;" i +aug_test mmseg\models\segmentors\base.py /^ def aug_test(self, imgs, img_metas, **kwargs):$/;" m class:BaseSegmentor +auto_fp16 mmseg\models\segmentors\base.py /^from mmcv.runner import auto_fp16$/;" i +dist mmseg\models\segmentors\base.py /^import torch.distributed as dist$/;" i +encode_decode mmseg\models\segmentors\base.py /^ def encode_decode(self, img, img_metas):$/;" m class:BaseSegmentor +extract_feat mmseg\models\segmentors\base.py /^ def extract_feat(self, imgs):$/;" m class:BaseSegmentor +forward mmseg\models\segmentors\base.py /^ def forward(self, img, img_metas, return_loss=True, **kwargs):$/;" m class:BaseSegmentor +forward_test mmseg\models\segmentors\base.py /^ def forward_test(self, imgs, img_metas, **kwargs):$/;" m class:BaseSegmentor +forward_train mmseg\models\segmentors\base.py /^ def forward_train(self, imgs, img_metas, **kwargs):$/;" m class:BaseSegmentor +init_weights mmseg\models\segmentors\base.py /^ def init_weights(self, pretrained=None):$/;" m class:BaseSegmentor +logging mmseg\models\segmentors\base.py /^import logging$/;" i +mmcv mmseg\models\segmentors\base.py /^import mmcv$/;" i +nn mmseg\models\segmentors\base.py /^import torch.nn as nn$/;" i +np mmseg\models\segmentors\base.py /^import numpy as np$/;" i +show_result mmseg\models\segmentors\base.py /^ def show_result(self,$/;" m class:BaseSegmentor +simple_test mmseg\models\segmentors\base.py /^ def simple_test(self, img, img_meta, **kwargs):$/;" m class:BaseSegmentor +torch mmseg\models\segmentors\base.py /^import torch$/;" i +torch mmseg\models\segmentors\base.py /^import torch.distributed as dist$/;" i +torch mmseg\models\segmentors\base.py /^import torch.nn as nn$/;" i +train_step mmseg\models\segmentors\base.py /^ def train_step(self, data_batch, optimizer, **kwargs):$/;" m class:BaseSegmentor +val_step mmseg\models\segmentors\base.py /^ def val_step(self, data_batch, **kwargs):$/;" m class:BaseSegmentor +warnings mmseg\models\segmentors\base.py /^import warnings$/;" i +with_auxiliary_head mmseg\models\segmentors\base.py /^ def with_auxiliary_head(self):$/;" m class:BaseSegmentor +with_decode_head mmseg\models\segmentors\base.py /^ def with_decode_head(self):$/;" m class:BaseSegmentor +with_neck mmseg\models\segmentors\base.py /^ def with_neck(self):$/;" m class:BaseSegmentor +CascadeEncoderDecoder mmseg\models\segmentors\cascade_encoder_decoder.py /^class CascadeEncoderDecoder(EncoderDecoder):$/;" c +EncoderDecoder mmseg\models\segmentors\cascade_encoder_decoder.py /^from .encoder_decoder import EncoderDecoder$/;" i +SEGMENTORS mmseg\models\segmentors\cascade_encoder_decoder.py /^from ..builder import SEGMENTORS$/;" i +__init__ mmseg\models\segmentors\cascade_encoder_decoder.py /^ def __init__(self,$/;" m class:CascadeEncoderDecoder +_decode_head_forward_train mmseg\models\segmentors\cascade_encoder_decoder.py /^ def _decode_head_forward_train(self, x, img_metas, gt_semantic_seg):$/;" m class:CascadeEncoderDecoder +_init_decode_head mmseg\models\segmentors\cascade_encoder_decoder.py /^ def _init_decode_head(self, decode_head):$/;" m class:CascadeEncoderDecoder +add_prefix mmseg\models\segmentors\cascade_encoder_decoder.py /^from mmseg.core import add_prefix$/;" i +builder mmseg\models\segmentors\cascade_encoder_decoder.py /^from .. import builder$/;" i +encode_decode mmseg\models\segmentors\cascade_encoder_decoder.py /^ def encode_decode(self, img, img_metas):$/;" m class:CascadeEncoderDecoder +init_weights mmseg\models\segmentors\cascade_encoder_decoder.py /^ def init_weights(self, pretrained=None):$/;" m class:CascadeEncoderDecoder +nn mmseg\models\segmentors\cascade_encoder_decoder.py /^from torch import nn$/;" i +resize mmseg\models\segmentors\cascade_encoder_decoder.py /^from mmseg.ops import resize$/;" i +BaseSegmentor mmseg\models\segmentors\encoder_decoder.py /^from .base import BaseSegmentor$/;" i +EncoderDecoder mmseg\models\segmentors\encoder_decoder.py /^class EncoderDecoder(BaseSegmentor):$/;" c +F mmseg\models\segmentors\encoder_decoder.py /^import torch.nn.functional as F$/;" i +SEGMENTORS mmseg\models\segmentors\encoder_decoder.py /^from ..builder import SEGMENTORS$/;" i +__init__ mmseg\models\segmentors\encoder_decoder.py /^ def __init__(self,$/;" m class:EncoderDecoder +_auxiliary_head_forward_train mmseg\models\segmentors\encoder_decoder.py /^ def _auxiliary_head_forward_train(self, x, img_metas, gt_semantic_seg):$/;" m class:EncoderDecoder +_decode_head_forward_test mmseg\models\segmentors\encoder_decoder.py /^ def _decode_head_forward_test(self, x, img_metas):$/;" m class:EncoderDecoder +_decode_head_forward_train mmseg\models\segmentors\encoder_decoder.py /^ def _decode_head_forward_train(self, x, img_metas, gt_semantic_seg):$/;" m class:EncoderDecoder +_init_auxiliary_head mmseg\models\segmentors\encoder_decoder.py /^ def _init_auxiliary_head(self, auxiliary_head):$/;" m class:EncoderDecoder +_init_decode_head mmseg\models\segmentors\encoder_decoder.py /^ def _init_decode_head(self, decode_head):$/;" m class:EncoderDecoder +add_prefix mmseg\models\segmentors\encoder_decoder.py /^from mmseg.core import add_prefix$/;" i +aug_test mmseg\models\segmentors\encoder_decoder.py /^ def aug_test(self, imgs, img_metas, rescale=True):$/;" m class:EncoderDecoder +builder mmseg\models\segmentors\encoder_decoder.py /^from .. import builder$/;" i +encode_decode mmseg\models\segmentors\encoder_decoder.py /^ def encode_decode(self, img, img_metas):$/;" m class:EncoderDecoder +extract_feat mmseg\models\segmentors\encoder_decoder.py /^ def extract_feat(self, img):$/;" m class:EncoderDecoder +forward_dummy mmseg\models\segmentors\encoder_decoder.py /^ def forward_dummy(self, img):$/;" m class:EncoderDecoder +forward_train mmseg\models\segmentors\encoder_decoder.py /^ def forward_train(self, img, img_metas, gt_semantic_seg):$/;" m class:EncoderDecoder +inference mmseg\models\segmentors\encoder_decoder.py /^ def inference(self, img, img_meta, rescale):$/;" m class:EncoderDecoder +init_weights mmseg\models\segmentors\encoder_decoder.py /^ def init_weights(self, pretrained=None):$/;" m class:EncoderDecoder +nn mmseg\models\segmentors\encoder_decoder.py /^import torch.nn as nn$/;" i +nn mmseg\models\segmentors\encoder_decoder.py /^import torch.nn.functional as F$/;" i +resize mmseg\models\segmentors\encoder_decoder.py /^from mmseg.ops import resize$/;" i +simple_test mmseg\models\segmentors\encoder_decoder.py /^ def simple_test(self, img, img_meta, rescale=True):$/;" m class:EncoderDecoder +slide_inference mmseg\models\segmentors\encoder_decoder.py /^ def slide_inference(self, img, img_meta, rescale):$/;" m class:EncoderDecoder +torch mmseg\models\segmentors\encoder_decoder.py /^import torch$/;" i +torch mmseg\models\segmentors\encoder_decoder.py /^import torch.nn as nn$/;" i +torch mmseg\models\segmentors\encoder_decoder.py /^import torch.nn.functional as F$/;" i +whole_inference mmseg\models\segmentors\encoder_decoder.py /^ def whole_inference(self, img, img_meta, rescale):$/;" m class:EncoderDecoder +InvertedResidual mmseg\models\utils\__init__.py /^from .inverted_residual import InvertedResidual, InvertedResidualV3$/;" i +InvertedResidualV3 mmseg\models\utils\__init__.py /^from .inverted_residual import InvertedResidual, InvertedResidualV3$/;" i +ResLayer mmseg\models\utils\__init__.py /^from .res_layer import ResLayer$/;" i +SelfAttentionBlock mmseg\models\utils\__init__.py /^from .self_attention_block import SelfAttentionBlock$/;" i +UpConvBlock mmseg\models\utils\__init__.py /^from .up_conv_block import UpConvBlock$/;" i +__all__ mmseg\models\utils\__init__.py /^__all__ = [$/;" v +make_divisible mmseg\models\utils\__init__.py /^from .make_divisible import make_divisible$/;" i +ConvModule mmseg\models\utils\inverted_residual.py /^from mmcv.cnn import ConvModule$/;" i +InvertedResidual mmseg\models\utils\inverted_residual.py /^class InvertedResidual(nn.Module):$/;" c +InvertedResidualV3 mmseg\models\utils\inverted_residual.py /^class InvertedResidualV3(nn.Module):$/;" c +SELayer mmseg\models\utils\inverted_residual.py /^from .se_layer import SELayer$/;" i +__init__ mmseg\models\utils\inverted_residual.py /^ def __init__(self,$/;" m class:InvertedResidual +__init__ mmseg\models\utils\inverted_residual.py /^ def __init__(self,$/;" m class:InvertedResidualV3 +_inner_forward mmseg\models\utils\inverted_residual.py /^ def _inner_forward(x):$/;" f function:InvertedResidual.forward +_inner_forward mmseg\models\utils\inverted_residual.py /^ def _inner_forward(x):$/;" f function:InvertedResidualV3.forward +cp mmseg\models\utils\inverted_residual.py /^from torch.utils import checkpoint as cp$/;" i +forward mmseg\models\utils\inverted_residual.py /^ def forward(self, x):$/;" m class:InvertedResidual +forward mmseg\models\utils\inverted_residual.py /^ def forward(self, x):$/;" m class:InvertedResidualV3 +nn mmseg\models\utils\inverted_residual.py /^from torch import nn as nn$/;" i +make_divisible mmseg\models\utils\make_divisible.py /^def make_divisible(value, divisor, min_value=None, min_ratio=0.9):$/;" f +ResLayer mmseg\models\utils\res_layer.py /^class ResLayer(nn.Sequential):$/;" c +__init__ mmseg\models\utils\res_layer.py /^ def __init__(self,$/;" m class:ResLayer +build_conv_layer mmseg\models\utils\res_layer.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +build_norm_layer mmseg\models\utils\res_layer.py /^from mmcv.cnn import build_conv_layer, build_norm_layer$/;" i +nn mmseg\models\utils\res_layer.py /^from torch import nn as nn$/;" i +ConvModule mmseg\models\utils\se_layer.py /^from mmcv.cnn import ConvModule$/;" i +SELayer mmseg\models\utils\se_layer.py /^class SELayer(nn.Module):$/;" c +__init__ mmseg\models\utils\se_layer.py /^ def __init__(self,$/;" m class:SELayer +forward mmseg\models\utils\se_layer.py /^ def forward(self, x):$/;" m class:SELayer +make_divisible mmseg\models\utils\se_layer.py /^from .make_divisible import make_divisible$/;" i +mmcv mmseg\models\utils\se_layer.py /^import mmcv$/;" i +nn mmseg\models\utils\se_layer.py /^import torch.nn as nn$/;" i +torch mmseg\models\utils\se_layer.py /^import torch.nn as nn$/;" i +ConvModule mmseg\models\utils\self_attention_block.py /^from mmcv.cnn import ConvModule, constant_init$/;" i +F mmseg\models\utils\self_attention_block.py /^from torch.nn import functional as F$/;" i +SelfAttentionBlock mmseg\models\utils\self_attention_block.py /^class SelfAttentionBlock(nn.Module):$/;" c +__init__ mmseg\models\utils\self_attention_block.py /^ def __init__(self, key_in_channels, query_in_channels, channels,$/;" m class:SelfAttentionBlock +build_project mmseg\models\utils\self_attention_block.py /^ def build_project(self, in_channels, channels, num_convs, use_conv_module,$/;" m class:SelfAttentionBlock +constant_init mmseg\models\utils\self_attention_block.py /^from mmcv.cnn import ConvModule, constant_init$/;" i +forward mmseg\models\utils\self_attention_block.py /^ def forward(self, query_feats, key_feats):$/;" m class:SelfAttentionBlock +init_weights mmseg\models\utils\self_attention_block.py /^ def init_weights(self):$/;" m class:SelfAttentionBlock +nn mmseg\models\utils\self_attention_block.py /^from torch import nn as nn$/;" i +torch mmseg\models\utils\self_attention_block.py /^import torch$/;" i +ConvModule mmseg\models\utils\up_conv_block.py /^from mmcv.cnn import ConvModule, build_upsample_layer$/;" i +UpConvBlock mmseg\models\utils\up_conv_block.py /^class UpConvBlock(nn.Module):$/;" c +__init__ mmseg\models\utils\up_conv_block.py /^ def __init__(self,$/;" m class:UpConvBlock +build_upsample_layer mmseg\models\utils\up_conv_block.py /^from mmcv.cnn import ConvModule, build_upsample_layer$/;" i +forward mmseg\models\utils\up_conv_block.py /^ def forward(self, skip, x):$/;" m class:UpConvBlock +nn mmseg\models\utils\up_conv_block.py /^import torch.nn as nn$/;" i +torch mmseg\models\utils\up_conv_block.py /^import torch$/;" i +torch mmseg\models\utils\up_conv_block.py /^import torch.nn as nn$/;" i +Encoding mmseg\ops\__init__.py /^from .encoding import Encoding$/;" i +Upsample mmseg\ops\__init__.py /^from .wrappers import Upsample, resize$/;" i +__all__ mmseg\ops\__init__.py /^__all__ = ['Upsample', 'resize', 'Encoding']$/;" v +resize mmseg\ops\__init__.py /^from .wrappers import Upsample, resize$/;" i +Encoding mmseg\ops\encoding.py /^class Encoding(nn.Module):$/;" c +F mmseg\ops\encoding.py /^from torch.nn import functional as F$/;" i +__init__ mmseg\ops\encoding.py /^ def __init__(self, channels, num_codes):$/;" m class:Encoding +__repr__ mmseg\ops\encoding.py /^ def __repr__(self):$/;" m class:Encoding file: +aggregate mmseg\ops\encoding.py /^ def aggregate(assigment_weights, x, codewords):$/;" m class:Encoding +forward mmseg\ops\encoding.py /^ def forward(self, x):$/;" m class:Encoding +nn mmseg\ops\encoding.py /^from torch import nn as nn$/;" i +scaled_l2 mmseg\ops\encoding.py /^ def scaled_l2(x, codewords, scale):$/;" m class:Encoding +torch mmseg\ops\encoding.py /^import torch$/;" i +F mmseg\ops\wrappers.py /^import torch.nn.functional as F$/;" i +Upsample mmseg\ops\wrappers.py /^class Upsample(nn.Module):$/;" c +__init__ mmseg\ops\wrappers.py /^ def __init__(self,$/;" m class:Upsample +forward mmseg\ops\wrappers.py /^ def forward(self, x):$/;" m class:Upsample +nn mmseg\ops\wrappers.py /^import torch.nn as nn$/;" i +nn mmseg\ops\wrappers.py /^import torch.nn.functional as F$/;" i +resize mmseg\ops\wrappers.py /^def resize(input,$/;" f +torch mmseg\ops\wrappers.py /^import torch$/;" i +torch mmseg\ops\wrappers.py /^import torch.nn as nn$/;" i +torch mmseg\ops\wrappers.py /^import torch.nn.functional as F$/;" i +warnings mmseg\ops\wrappers.py /^import warnings$/;" i +__all__ mmseg\utils\__init__.py /^__all__ = ['get_root_logger', 'collect_env']$/;" v +collect_env mmseg\utils\__init__.py /^from .collect_env import collect_env$/;" i +get_root_logger mmseg\utils\__init__.py /^from .logger import get_root_logger$/;" i +collect_base_env mmseg\utils\collect_env.py /^from mmcv.utils import collect_env as collect_base_env$/;" i +collect_env mmseg\utils\collect_env.py /^def collect_env():$/;" f +get_git_hash mmseg\utils\collect_env.py /^from mmcv.utils import get_git_hash$/;" i +mmseg mmseg\utils\collect_env.py /^import mmseg$/;" i +get_logger mmseg\utils\logger.py /^from mmcv.utils import get_logger$/;" i +get_root_logger mmseg\utils\logger.py /^def get_root_logger(log_file=None, log_level=logging.INFO):$/;" f +logging mmseg\utils\logger.py /^import logging$/;" i +__version__ mmseg\version.py /^__version__ = '0.11.0'$/;" v +parse_version_info mmseg\version.py /^def parse_version_info(version_str):$/;" f +version_info mmseg\version.py /^version_info = parse_version_info(__version__)$/;" v +exists setup.py /^ from os.path import exists$/;" i +find_packages setup.py /^from setuptools import find_packages, setup$/;" i +gen_packages_items setup.py /^ def gen_packages_items():$/;" f function:parse_requirements +get_version setup.py /^def get_version():$/;" f +parse_line setup.py /^ def parse_line(line):$/;" f function:parse_requirements +parse_require_file setup.py /^ def parse_require_file(fpath):$/;" f function:parse_requirements +parse_requirements setup.py /^def parse_requirements(fname='requirements.txt', with_version=True):$/;" f +re setup.py /^ import re$/;" i +readme setup.py /^def readme():$/;" f +setup setup.py /^from setuptools import find_packages, setup$/;" i +sys setup.py /^ import sys$/;" i +version_file setup.py /^version_file = 'mmseg\/version.py'$/;" v +Compose tests\test_config.py /^ from mmseg.datasets.pipelines import Compose$/;" i +Config tests\test_config.py /^ from mmcv import Config$/;" i +Config tests\test_config.py /^from mmcv import Config$/;" i +_check_decode_head tests\test_config.py /^def _check_decode_head(decode_head_cfg, decode_head):$/;" f +_get_config_directory tests\test_config.py /^def _get_config_directory():$/;" f +build_segmentor tests\test_config.py /^from mmseg.models import build_segmentor$/;" i +dirname tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +exists tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +glob tests\test_config.py /^ import glob$/;" i +glob tests\test_config.py /^import glob$/;" i +isdir tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +join tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +mmseg tests\test_config.py /^ import mmseg$/;" i +nn tests\test_config.py /^from torch import nn$/;" i +np tests\test_config.py /^ import numpy as np$/;" i +os tests\test_config.py /^import os$/;" i +relpath tests\test_config.py /^from os.path import dirname, exists, isdir, join, relpath$/;" i +test_config_build_segmentor tests\test_config.py /^def test_config_build_segmentor():$/;" f +test_config_data_pipeline tests\test_config.py /^def test_config_data_pipeline():$/;" f +ADE20KDataset tests\test_data\test_dataset.py /^from mmseg.datasets import (DATASETS, ADE20KDataset, CityscapesDataset,$/;" i +CityscapesDataset tests\test_data\test_dataset.py /^from mmseg.datasets import (DATASETS, ADE20KDataset, CityscapesDataset,$/;" i +DATASETS tests\test_data\test_dataset.py /^from mmseg.datasets import (DATASETS, ADE20KDataset, CityscapesDataset,$/;" i +MagicMock tests\test_data\test_dataset.py /^from unittest.mock import MagicMock, patch$/;" i +get_classes tests\test_data\test_dataset.py /^from mmseg.core.evaluation import get_classes, get_palette$/;" i +get_palette tests\test_data\test_dataset.py /^from mmseg.core.evaluation import get_classes, get_palette$/;" i +np tests\test_data\test_dataset.py /^import numpy as np$/;" i +os tests\test_data\test_dataset.py /^import os.path as osp$/;" i +osp tests\test_data\test_dataset.py /^import os.path as osp$/;" i +patch tests\test_data\test_dataset.py /^from unittest.mock import MagicMock, patch$/;" i +pytest tests\test_data\test_dataset.py /^import pytest$/;" i +test_classes tests\test_data\test_dataset.py /^def test_classes():$/;" f +test_custom_classes_override_default tests\test_data\test_dataset.py /^def test_custom_classes_override_default(dataset, classes):$/;" f +test_custom_dataset tests\test_data\test_dataset.py /^def test_custom_dataset():$/;" f +test_custom_dataset_custom_palette tests\test_data\test_dataset.py /^def test_custom_dataset_custom_palette():$/;" f +test_custom_dataset_random_palette_is_generated tests\test_data\test_dataset.py /^def test_custom_dataset_random_palette_is_generated():$/;" f +test_dataset_wrapper tests\test_data\test_dataset.py /^def test_dataset_wrapper():$/;" f +test_palette tests\test_data\test_dataset.py /^def test_palette():$/;" f +ConcatDataset tests\test_data\test_dataset_builder.py /^from mmseg.datasets import (DATASETS, ConcatDataset, build_dataloader,$/;" i +DATASETS tests\test_data\test_dataset_builder.py /^from mmseg.datasets import (DATASETS, ConcatDataset, build_dataloader,$/;" i +DistributedSampler tests\test_data\test_dataset_builder.py /^from torch.utils.data import (DistributedSampler, RandomSampler,$/;" i +RandomSampler tests\test_data\test_dataset_builder.py /^from torch.utils.data import (DistributedSampler, RandomSampler,$/;" i +ToyDataset tests\test_data\test_dataset_builder.py /^class ToyDataset(object):$/;" c +__init__ tests\test_data\test_dataset_builder.py /^ def __init__(self, cnt=0):$/;" m class:ToyDataset +__item__ tests\test_data\test_dataset_builder.py /^ def __item__(self, idx):$/;" m class:ToyDataset file: +__len__ tests\test_data\test_dataset_builder.py /^ def __len__(self):$/;" m class:ToyDataset file: +build_dataloader tests\test_data\test_dataset_builder.py /^from mmseg.datasets import (DATASETS, ConcatDataset, build_dataloader,$/;" i +math tests\test_data\test_dataset_builder.py /^import math$/;" i +os tests\test_data\test_dataset_builder.py /^import os.path as osp$/;" i +osp tests\test_data\test_dataset_builder.py /^import os.path as osp$/;" i +pytest tests\test_data\test_dataset_builder.py /^import pytest$/;" i +test_build_dataloader tests\test_data\test_dataset_builder.py /^def test_build_dataloader():$/;" f +test_build_dataset tests\test_data\test_dataset_builder.py /^def test_build_dataset():$/;" f +LoadAnnotations tests\test_data\test_loading.py /^from mmseg.datasets.pipelines import LoadAnnotations, LoadImageFromFile$/;" i +LoadImageFromFile tests\test_data\test_loading.py /^from mmseg.datasets.pipelines import LoadAnnotations, LoadImageFromFile$/;" i +TestLoading tests\test_data\test_loading.py /^class TestLoading(object):$/;" c +copy tests\test_data\test_loading.py /^import copy$/;" i +mmcv tests\test_data\test_loading.py /^import mmcv$/;" i +np tests\test_data\test_loading.py /^import numpy as np$/;" i +os tests\test_data\test_loading.py /^import os.path as osp$/;" i +osp tests\test_data\test_loading.py /^import os.path as osp$/;" i +setup_class tests\test_data\test_loading.py /^ def setup_class(cls):$/;" m class:TestLoading +tempfile tests\test_data\test_loading.py /^import tempfile$/;" i +test_load_img tests\test_data\test_loading.py /^ def test_load_img(self):$/;" m class:TestLoading +test_load_seg tests\test_data\test_loading.py /^ def test_load_seg(self):$/;" m class:TestLoading +test_load_seg_custom_classes tests\test_data\test_loading.py /^ def test_load_seg_custom_classes(self):$/;" m class:TestLoading +Image tests\test_data\test_transform.py /^from PIL import Image$/;" i +PIPELINES tests\test_data\test_transform.py /^from mmseg.datasets.builder import PIPELINES$/;" i +build_from_cfg tests\test_data\test_transform.py /^from mmcv.utils import build_from_cfg$/;" i +copy tests\test_data\test_transform.py /^import copy$/;" i +mmcv tests\test_data\test_transform.py /^import mmcv$/;" i +np tests\test_data\test_transform.py /^import numpy as np$/;" i +os tests\test_data\test_transform.py /^import os.path as osp$/;" i +osp tests\test_data\test_transform.py /^import os.path as osp$/;" i +pytest tests\test_data\test_transform.py /^import pytest$/;" i +test_CLAHE tests\test_data\test_transform.py /^def test_CLAHE():$/;" f +test_adjust_gamma tests\test_data\test_transform.py /^def test_adjust_gamma():$/;" f +test_flip tests\test_data\test_transform.py /^def test_flip():$/;" f +test_normalize tests\test_data\test_transform.py /^def test_normalize():$/;" f +test_pad tests\test_data\test_transform.py /^def test_pad():$/;" f +test_random_crop tests\test_data\test_transform.py /^def test_random_crop():$/;" f +test_rerange tests\test_data\test_transform.py /^def test_rerange():$/;" f +test_resize tests\test_data\test_transform.py /^def test_resize():$/;" f +test_rgb2gray tests\test_data\test_transform.py /^def test_rgb2gray():$/;" f +test_rotate tests\test_data\test_transform.py /^def test_rotate():$/;" f +test_seg_rescale tests\test_data\test_transform.py /^def test_seg_rescale():$/;" f +PIPELINES tests\test_data\test_tta.py /^from mmseg.datasets.builder import PIPELINES$/;" i +build_from_cfg tests\test_data\test_tta.py /^from mmcv.utils import build_from_cfg$/;" i +mmcv tests\test_data\test_tta.py /^import mmcv$/;" i +os tests\test_data\test_tta.py /^import os.path as osp$/;" i +osp tests\test_data\test_tta.py /^import os.path as osp$/;" i +pytest tests\test_data\test_tta.py /^import pytest$/;" i +test_multi_scale_flip_aug tests\test_data\test_tta.py /^def test_multi_scale_flip_aug():$/;" f +DataLoader tests\test_eval_hook.py /^from torch.utils.data import DataLoader, Dataset$/;" i +Dataset tests\test_eval_hook.py /^from torch.utils.data import DataLoader, Dataset$/;" i +DistEvalHook tests\test_eval_hook.py /^from mmseg.core import DistEvalHook, EvalHook$/;" i +EvalHook tests\test_eval_hook.py /^from mmseg.core import DistEvalHook, EvalHook$/;" i +ExampleDataset tests\test_eval_hook.py /^class ExampleDataset(Dataset):$/;" c +ExampleModel tests\test_eval_hook.py /^class ExampleModel(nn.Module):$/;" c +MagicMock tests\test_eval_hook.py /^from unittest.mock import MagicMock, patch$/;" i +__getitem__ tests\test_eval_hook.py /^ def __getitem__(self, idx):$/;" m class:ExampleDataset file: +__init__ tests\test_eval_hook.py /^ def __init__(self):$/;" m class:ExampleModel +__len__ tests\test_eval_hook.py /^ def __len__(self):$/;" m class:ExampleDataset file: +forward tests\test_eval_hook.py /^ def forward(self, img, img_metas, test_mode=False, **kwargs):$/;" m class:ExampleModel +logging tests\test_eval_hook.py /^import logging$/;" i +mmcv tests\test_eval_hook.py /^import mmcv.runner$/;" i +multi_gpu_test tests\test_eval_hook.py /^def multi_gpu_test(model, data_loader, tmpdir=None, gpu_collect=False):$/;" f +nn tests\test_eval_hook.py /^import torch.nn as nn$/;" i +obj_from_dict tests\test_eval_hook.py /^from mmcv.runner import obj_from_dict$/;" i +patch tests\test_eval_hook.py /^from unittest.mock import MagicMock, patch$/;" i +pytest tests\test_eval_hook.py /^import pytest$/;" i +runner tests\test_eval_hook.py /^import mmcv.runner$/;" i +single_gpu_test tests\test_eval_hook.py /^from mmseg.apis import single_gpu_test$/;" i +tempfile tests\test_eval_hook.py /^import tempfile$/;" i +test_dist_eval_hook tests\test_eval_hook.py /^def test_dist_eval_hook():$/;" f +test_dist_eval_hook_epoch tests\test_eval_hook.py /^def test_dist_eval_hook_epoch():$/;" f +test_epoch_eval_hook tests\test_eval_hook.py /^def test_epoch_eval_hook():$/;" f +test_iter_eval_hook tests\test_eval_hook.py /^def test_iter_eval_hook():$/;" f +torch tests\test_eval_hook.py /^import torch$/;" i +torch tests\test_eval_hook.py /^import torch.nn as nn$/;" i +train_step tests\test_eval_hook.py /^ def train_step(self, data_batch, optimizer):$/;" m class:ExampleModel +inference_segmentor tests\test_inference.py /^from mmseg.apis import inference_segmentor, init_segmentor$/;" i +init_segmentor tests\test_inference.py /^from mmseg.apis import inference_segmentor, init_segmentor$/;" i +mmcv tests\test_inference.py /^import mmcv$/;" i +os tests\test_inference.py /^import os.path as osp$/;" i +osp tests\test_inference.py /^import os.path as osp$/;" i +test_test_time_augmentation_on_cpu tests\test_inference.py /^def test_test_time_augmentation_on_cpu():$/;" f +eval_metrics tests\test_metrics.py /^from mmseg.core.evaluation import eval_metrics, mean_dice, mean_iou$/;" i +get_confusion_matrix tests\test_metrics.py /^def get_confusion_matrix(pred_label, label, num_classes, ignore_index):$/;" f +legacy_mean_dice tests\test_metrics.py /^def legacy_mean_dice(results, gt_seg_maps, num_classes, ignore_index):$/;" f +legacy_mean_iou tests\test_metrics.py /^def legacy_mean_iou(results, gt_seg_maps, num_classes, ignore_index):$/;" f +mean_dice tests\test_metrics.py /^from mmseg.core.evaluation import eval_metrics, mean_dice, mean_iou$/;" i +mean_iou tests\test_metrics.py /^from mmseg.core.evaluation import eval_metrics, mean_dice, mean_iou$/;" i +np tests\test_metrics.py /^import numpy as np$/;" i +test_mean_dice tests\test_metrics.py /^def test_mean_dice():$/;" f +test_mean_iou tests\test_metrics.py /^def test_mean_iou():$/;" f +test_metrics tests\test_metrics.py /^def test_metrics():$/;" f +net tests\test_model.py /^net=torch.load(pthfile)$/;" v +pthfile tests\test_model.py /^pthfile = r'\/SEG\/mmsegmentation\/pretrained_model\/recipe1MP_R50.pth'$/;" v +torch tests\test_model.py /^import torch$/;" i +AvgPool2d tests\test_models\test_backbone.py /^from torch.nn.modules import AvgPool2d, GroupNorm$/;" i +BasicBlock tests\test_models\test_backbone.py /^from mmseg.models.backbones.resnet import BasicBlock, Bottleneck$/;" i +Bottleneck tests\test_models\test_backbone.py /^from mmseg.models.backbones.resnet import BasicBlock, Bottleneck$/;" i +BottleneckS tests\test_models\test_backbone.py /^from mmseg.models.backbones.resnest import Bottleneck as BottleneckS$/;" i +BottleneckX tests\test_models\test_backbone.py /^from mmseg.models.backbones.resnext import Bottleneck as BottleneckX$/;" i +CGNet tests\test_models\test_backbone.py /^from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt,$/;" i +ContextGuidedBlock tests\test_models\test_backbone.py /^from mmseg.models.backbones.cgnet import (ContextGuidedBlock,$/;" i +DeformConv2dPack tests\test_models\test_backbone.py /^from mmcv.ops import DeformConv2dPack$/;" i +FastSCNN tests\test_models\test_backbone.py /^from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt,$/;" i +GroupNorm tests\test_models\test_backbone.py /^from torch.nn.modules import AvgPool2d, GroupNorm$/;" i +MobileNetV3 tests\test_models\test_backbone.py /^from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt,$/;" i +ResLayer tests\test_models\test_backbone.py /^from mmseg.models.utils import ResLayer$/;" i +ResNeSt tests\test_models\test_backbone.py /^from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt,$/;" i +_BatchNorm tests\test_models\test_backbone.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +all_zeros tests\test_models\test_backbone.py /^def all_zeros(modules):$/;" f +check_norm_state tests\test_models\test_backbone.py /^def check_norm_state(modules, train_state):$/;" f +is_block tests\test_models\test_backbone.py /^def is_block(modules):$/;" f +is_norm tests\test_models\test_backbone.py /^def is_norm(modules):$/;" f +pytest tests\test_models\test_backbone.py /^import pytest$/;" i +test_cgnet_GlobalContextExtractor tests\test_models\test_backbone.py /^def test_cgnet_GlobalContextExtractor():$/;" f +test_cgnet_backbone tests\test_models\test_backbone.py /^def test_cgnet_backbone():$/;" f +test_cgnet_context_guided_block tests\test_models\test_backbone.py /^def test_cgnet_context_guided_block():$/;" f +test_fastscnn_backbone tests\test_models\test_backbone.py /^def test_fastscnn_backbone():$/;" f +test_mobilenet_v3 tests\test_models\test_backbone.py /^def test_mobilenet_v3():$/;" f +test_renext_bottleneck tests\test_models\test_backbone.py /^def test_renext_bottleneck():$/;" f +test_resnest_backbone tests\test_models\test_backbone.py /^def test_resnest_backbone():$/;" f +test_resnest_bottleneck tests\test_models\test_backbone.py /^def test_resnest_bottleneck():$/;" f +test_resnet_backbone tests\test_models\test_backbone.py /^def test_resnet_backbone():$/;" f +test_resnet_basic_block tests\test_models\test_backbone.py /^def test_resnet_basic_block():$/;" f +test_resnet_bottleneck tests\test_models\test_backbone.py /^def test_resnet_bottleneck():$/;" f +test_resnet_res_layer tests\test_models\test_backbone.py /^def test_resnet_res_layer():$/;" f +test_resnext_backbone tests\test_models\test_backbone.py /^def test_resnext_backbone():$/;" f +torch tests\test_models\test_backbone.py /^import torch$/;" i +Config tests\test_models\test_forward.py /^ from mmcv import Config$/;" i +SyncBatchNorm tests\test_models\test_forward.py /^from mmcv.utils.parrots_wrapper import SyncBatchNorm, _BatchNorm$/;" i +_BatchNorm tests\test_models\test_forward.py /^from mmcv.utils.parrots_wrapper import SyncBatchNorm, _BatchNorm$/;" i +_check_input_dim tests\test_models\test_forward.py /^def _check_input_dim(self, inputs):$/;" f +_convert_batchnorm tests\test_models\test_forward.py /^def _convert_batchnorm(module):$/;" f +_demo_mm_inputs tests\test_models\test_forward.py /^def _demo_mm_inputs(input_shape=(2, 3, 8, 16), num_classes=10):$/;" f +_get_config_directory tests\test_models\test_forward.py /^def _get_config_directory():$/;" f +_get_config_module tests\test_models\test_forward.py /^def _get_config_module(fname):$/;" f +_get_segmentor_cfg tests\test_models\test_forward.py /^def _get_segmentor_cfg(fname):$/;" f +_test_encoder_decoder_forward tests\test_models\test_forward.py /^def _test_encoder_decoder_forward(cfg_file):$/;" f +build_segmentor tests\test_models\test_forward.py /^ from mmseg.models import build_segmentor$/;" i +copy tests\test_models\test_forward.py /^import copy$/;" i +dirname tests\test_models\test_forward.py /^from os.path import dirname, exists, join$/;" i +exists tests\test_models\test_forward.py /^from os.path import dirname, exists, join$/;" i +get_world_size tests\test_models\test_forward.py /^def get_world_size(process_group):$/;" f +join tests\test_models\test_forward.py /^from os.path import dirname, exists, join$/;" i +mmseg tests\test_models\test_forward.py /^ import mmseg$/;" i +nn tests\test_models\test_forward.py /^import torch.nn as nn$/;" i +np tests\test_models\test_forward.py /^import numpy as np$/;" i +patch tests\test_models\test_forward.py /^from unittest.mock import patch$/;" i +pytest tests\test_models\test_forward.py /^import pytest$/;" i +test_ann_forward tests\test_models\test_forward.py /^def test_ann_forward():$/;" f +test_ccnet_forward tests\test_models\test_forward.py /^def test_ccnet_forward():$/;" f +test_danet_forward tests\test_models\test_forward.py /^def test_danet_forward():$/;" f +test_deeplabv3_forward tests\test_models\test_forward.py /^def test_deeplabv3_forward():$/;" f +test_deeplabv3plus_forward tests\test_models\test_forward.py /^def test_deeplabv3plus_forward():$/;" f +test_dnlnet_forward tests\test_models\test_forward.py /^def test_dnlnet_forward():$/;" f +test_emanet_forward tests\test_models\test_forward.py /^def test_emanet_forward():$/;" f +test_encnet_forward tests\test_models\test_forward.py /^def test_encnet_forward():$/;" f +test_fcn_forward tests\test_models\test_forward.py /^def test_fcn_forward():$/;" f +test_gcnet_forward tests\test_models\test_forward.py /^def test_gcnet_forward():$/;" f +test_hrnet_forward tests\test_models\test_forward.py /^def test_hrnet_forward():$/;" f +test_mobilenet_v2_forward tests\test_models\test_forward.py /^def test_mobilenet_v2_forward():$/;" f +test_nonlocal_net_forward tests\test_models\test_forward.py /^def test_nonlocal_net_forward():$/;" f +test_ocrnet_forward tests\test_models\test_forward.py /^def test_ocrnet_forward():$/;" f +test_point_rend_forward tests\test_models\test_forward.py /^def test_point_rend_forward():$/;" f +test_psanet_forward tests\test_models\test_forward.py /^def test_psanet_forward():$/;" f +test_pspnet_forward tests\test_models\test_forward.py /^def test_pspnet_forward():$/;" f +test_sem_fpn_forward tests\test_models\test_forward.py /^def test_sem_fpn_forward():$/;" f +test_upernet_forward tests\test_models\test_forward.py /^def test_upernet_forward():$/;" f +torch tests\test_models\test_forward.py /^import torch$/;" i +torch tests\test_models\test_forward.py /^import torch.nn as nn$/;" i +ANNHead tests\test_models\test_heads.py /^from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead,$/;" i +APCHead tests\test_models\test_heads.py /^from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead,$/;" i +ASPPHead tests\test_models\test_heads.py /^from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead,$/;" i +BaseDecodeHead tests\test_models\test_heads.py /^from mmseg.models.decode_heads.decode_head import BaseDecodeHead$/;" i +CCHead tests\test_models\test_heads.py /^from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead,$/;" i +ConfigDict tests\test_models\test_heads.py /^from mmcv.utils import ConfigDict$/;" i +ConvModule tests\test_models\test_heads.py /^from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule$/;" i +DepthwiseSeparableConvModule tests\test_models\test_heads.py /^from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule$/;" i +SyncBatchNorm tests\test_models\test_heads.py /^from mmcv.utils.parrots_wrapper import SyncBatchNorm$/;" i +_conv_has_norm tests\test_models\test_heads.py /^def _conv_has_norm(module, sync_bn):$/;" f +patch tests\test_models\test_heads.py /^from unittest.mock import patch$/;" i +pytest tests\test_models\test_heads.py /^import pytest$/;" i +test_ann_head tests\test_models\test_heads.py /^def test_ann_head():$/;" f +test_apc_head tests\test_models\test_heads.py /^def test_apc_head():$/;" f +test_aspp_head tests\test_models\test_heads.py /^def test_aspp_head():$/;" f +test_cc_head tests\test_models\test_heads.py /^def test_cc_head():$/;" f +test_da_head tests\test_models\test_heads.py /^def test_da_head():$/;" f +test_decode_head tests\test_models\test_heads.py /^def test_decode_head():$/;" f +test_dm_head tests\test_models\test_heads.py /^def test_dm_head():$/;" f +test_dnl_head tests\test_models\test_heads.py /^def test_dnl_head():$/;" f +test_dw_aspp_head tests\test_models\test_heads.py /^def test_dw_aspp_head():$/;" f +test_emanet_head tests\test_models\test_heads.py /^def test_emanet_head():$/;" f +test_enc_head tests\test_models\test_heads.py /^def test_enc_head():$/;" f +test_fcn_head tests\test_models\test_heads.py /^def test_fcn_head():$/;" f +test_gc_head tests\test_models\test_heads.py /^def test_gc_head():$/;" f +test_lraspp_head tests\test_models\test_heads.py /^def test_lraspp_head():$/;" f +test_nl_head tests\test_models\test_heads.py /^def test_nl_head():$/;" f +test_ocr_head tests\test_models\test_heads.py /^def test_ocr_head():$/;" f +test_point_head tests\test_models\test_heads.py /^def test_point_head():$/;" f +test_psa_head tests\test_models\test_heads.py /^def test_psa_head():$/;" f +test_psp_head tests\test_models\test_heads.py /^def test_psp_head():$/;" f +test_sep_fcn_head tests\test_models\test_heads.py /^def test_sep_fcn_head():$/;" f +test_uper_head tests\test_models\test_heads.py /^def test_uper_head():$/;" f +to_cuda tests\test_models\test_heads.py /^def to_cuda(module, data):$/;" f +torch tests\test_models\test_heads.py /^import torch$/;" i +Accuracy tests\test_models\test_losses.py /^from mmseg.models.losses import Accuracy, reduce_loss, weight_reduce_loss$/;" i +build_loss tests\test_models\test_losses.py /^ from mmseg.models import build_loss$/;" i +np tests\test_models\test_losses.py /^import numpy as np$/;" i +pytest tests\test_models\test_losses.py /^import pytest$/;" i +reduce_loss tests\test_models\test_losses.py /^from mmseg.models.losses import Accuracy, reduce_loss, weight_reduce_loss$/;" i +test_accuracy tests\test_models\test_losses.py /^def test_accuracy():$/;" f +test_ce_loss tests\test_models\test_losses.py /^def test_ce_loss():$/;" f +test_lovasz_loss tests\test_models\test_losses.py /^def test_lovasz_loss():$/;" f +test_utils tests\test_models\test_losses.py /^def test_utils():$/;" f +torch tests\test_models\test_losses.py /^import torch$/;" i +weight_reduce_loss tests\test_models\test_losses.py /^from mmseg.models.losses import Accuracy, reduce_loss, weight_reduce_loss$/;" i +FPN tests\test_models\test_necks.py /^from mmseg.models import FPN$/;" i +test_fpn tests\test_models\test_necks.py /^def test_fpn():$/;" f +torch tests\test_models\test_necks.py /^import torch$/;" i +BACKBONES tests\test_models\test_segmentor.py /^from mmseg.models import BACKBONES, HEADS, build_segmentor$/;" i +BaseCascadeDecodeHead tests\test_models\test_segmentor.py /^from mmseg.models.decode_heads.cascade_decode_head import BaseCascadeDecodeHead$/;" i +BaseDecodeHead tests\test_models\test_segmentor.py /^from mmseg.models.decode_heads.decode_head import BaseDecodeHead$/;" i +ConfigDict tests\test_models\test_segmentor.py /^from mmcv import ConfigDict$/;" i +ExampleBackbone tests\test_models\test_segmentor.py /^class ExampleBackbone(nn.Module):$/;" c +ExampleCascadeDecodeHead tests\test_models\test_segmentor.py /^class ExampleCascadeDecodeHead(BaseCascadeDecodeHead):$/;" c +ExampleDecodeHead tests\test_models\test_segmentor.py /^class ExampleDecodeHead(BaseDecodeHead):$/;" c +HEADS tests\test_models\test_segmentor.py /^from mmseg.models import BACKBONES, HEADS, build_segmentor$/;" i +__init__ tests\test_models\test_segmentor.py /^ def __init__(self):$/;" m class:ExampleBackbone +__init__ tests\test_models\test_segmentor.py /^ def __init__(self):$/;" m class:ExampleCascadeDecodeHead +__init__ tests\test_models\test_segmentor.py /^ def __init__(self):$/;" m class:ExampleDecodeHead +_demo_mm_inputs tests\test_models\test_segmentor.py /^def _demo_mm_inputs(input_shape=(1, 3, 8, 16), num_classes=10):$/;" f +_segmentor_forward_train_test tests\test_models\test_segmentor.py /^def _segmentor_forward_train_test(segmentor):$/;" f +build_segmentor tests\test_models\test_segmentor.py /^from mmseg.models import BACKBONES, HEADS, build_segmentor$/;" i +forward tests\test_models\test_segmentor.py /^ def forward(self, inputs):$/;" m class:ExampleDecodeHead +forward tests\test_models\test_segmentor.py /^ def forward(self, inputs, prev_out):$/;" m class:ExampleCascadeDecodeHead +forward tests\test_models\test_segmentor.py /^ def forward(self, x):$/;" m class:ExampleBackbone +init_weights tests\test_models\test_segmentor.py /^ def init_weights(self, pretrained=None):$/;" m class:ExampleBackbone +nn tests\test_models\test_segmentor.py /^from torch import nn$/;" i +np tests\test_models\test_segmentor.py /^import numpy as np$/;" i +test_cascade_encoder_decoder tests\test_models\test_segmentor.py /^def test_cascade_encoder_decoder():$/;" f +test_encoder_decoder tests\test_models\test_segmentor.py /^def test_encoder_decoder():$/;" f +torch tests\test_models\test_segmentor.py /^import torch$/;" i +BasicConvBlock tests\test_models\test_unet.py /^from mmseg.models.backbones.unet import (BasicConvBlock, DeconvModule,$/;" i +ConvModule tests\test_models\test_unet.py /^from mmcv.cnn import ConvModule$/;" i +DeconvModule tests\test_models\test_unet.py /^from mmseg.models.backbones.unet import (BasicConvBlock, DeconvModule,$/;" i +_BatchNorm tests\test_models\test_unet.py /^from mmcv.utils.parrots_wrapper import _BatchNorm$/;" i +check_norm_state tests\test_models\test_unet.py /^def check_norm_state(modules, train_state):$/;" f +nn tests\test_models\test_unet.py /^from torch import nn$/;" i +pytest tests\test_models\test_unet.py /^import pytest$/;" i +test_deconv_module tests\test_models\test_unet.py /^def test_deconv_module():$/;" f +test_interp_conv tests\test_models\test_unet.py /^def test_interp_conv():$/;" f +test_unet tests\test_models\test_unet.py /^def test_unet():$/;" f +test_unet_basic_conv_block tests\test_models\test_unet.py /^def test_unet_basic_conv_block():$/;" f +test_up_conv_block tests\test_models\test_unet.py /^def test_up_conv_block():$/;" f +torch tests\test_models\test_unet.py /^import torch$/;" i +FCNHead tests\test_sampler.py /^from mmseg.models.decode_heads import FCNHead$/;" i +OHEMPixelSampler tests\test_sampler.py /^from mmseg.core import OHEMPixelSampler$/;" i +_context_for_ohem tests\test_sampler.py /^def _context_for_ohem():$/;" f +pytest tests\test_sampler.py /^import pytest$/;" i +test_ohem_sampler tests\test_sampler.py /^def test_ohem_sampler():$/;" f +torch tests\test_sampler.py /^import torch$/;" i +InvertedResidual tests\test_utils\test_inverted_residual_module.py /^from mmseg.models.utils import InvertedResidual, InvertedResidualV3$/;" i +InvertedResidualV3 tests\test_utils\test_inverted_residual_module.py /^from mmseg.models.utils import InvertedResidual, InvertedResidualV3$/;" i +mmcv tests\test_utils\test_inverted_residual_module.py /^import mmcv$/;" i +pytest tests\test_utils\test_inverted_residual_module.py /^import pytest$/;" i +test_inv_residual tests\test_utils\test_inverted_residual_module.py /^def test_inv_residual():$/;" f +test_inv_residualv3 tests\test_utils\test_inverted_residual_module.py /^def test_inv_residualv3():$/;" f +torch tests\test_utils\test_inverted_residual_module.py /^import torch$/;" i +make_divisible tests\test_utils\test_make_divisible.py /^from mmseg.models.utils import make_divisible$/;" i +test_make_divisible tests\test_utils\test_make_divisible.py /^def test_make_divisible():$/;" f +SELayer tests\test_utils\test_se_layer.py /^from mmseg.models.utils.se_layer import SELayer$/;" i +mmcv tests\test_utils\test_se_layer.py /^import mmcv$/;" i +pytest tests\test_utils\test_se_layer.py /^import pytest$/;" i +test_se_layer tests\test_utils\test_se_layer.py /^def test_se_layer():$/;" f +torch tests\test_utils\test_se_layer.py /^import torch$/;" i +Config tools\benchmark.py /^from mmcv import Config$/;" i +MMDataParallel tools\benchmark.py /^from mmcv.parallel import MMDataParallel$/;" i +argparse tools\benchmark.py /^import argparse$/;" i +build_dataloader tools\benchmark.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_dataset tools\benchmark.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_segmentor tools\benchmark.py /^from mmseg.models import build_segmentor$/;" i +load_checkpoint tools\benchmark.py /^from mmcv.runner import load_checkpoint$/;" i +main tools\benchmark.py /^def main():$/;" f +parse_args tools\benchmark.py /^def parse_args():$/;" f +time tools\benchmark.py /^import time$/;" i +torch tools\benchmark.py /^import torch$/;" i +CHASE_DB1_LEN tools\convert_datasets\chase_db1.py /^CHASE_DB1_LEN = 28 * 3$/;" v +TRAINING_LEN tools\convert_datasets\chase_db1.py /^TRAINING_LEN = 60$/;" v +argparse tools\convert_datasets\chase_db1.py /^import argparse$/;" i +main tools\convert_datasets\chase_db1.py /^def main():$/;" f +mmcv tools\convert_datasets\chase_db1.py /^import mmcv$/;" i +os tools\convert_datasets\chase_db1.py /^import os$/;" i +os tools\convert_datasets\chase_db1.py /^import os.path as osp$/;" i +osp tools\convert_datasets\chase_db1.py /^import os.path as osp$/;" i +parse_args tools\convert_datasets\chase_db1.py /^def parse_args():$/;" f +tempfile tools\convert_datasets\chase_db1.py /^import tempfile$/;" i +zipfile tools\convert_datasets\chase_db1.py /^import zipfile$/;" i +argparse tools\convert_datasets\cityscapes.py /^import argparse$/;" i +convert_json_to_label tools\convert_datasets\cityscapes.py /^def convert_json_to_label(json_file):$/;" f +json2labelImg tools\convert_datasets\cityscapes.py /^from cityscapesscripts.preparation.json2labelImg import json2labelImg$/;" i +main tools\convert_datasets\cityscapes.py /^def main():$/;" f +mmcv tools\convert_datasets\cityscapes.py /^import mmcv$/;" i +os tools\convert_datasets\cityscapes.py /^import os.path as osp$/;" i +osp tools\convert_datasets\cityscapes.py /^import os.path as osp$/;" i +parse_args tools\convert_datasets\cityscapes.py /^def parse_args():$/;" f +argparse tools\convert_datasets\drive.py /^import argparse$/;" i +cv2 tools\convert_datasets\drive.py /^import cv2$/;" i +main tools\convert_datasets\drive.py /^def main():$/;" f +mmcv tools\convert_datasets\drive.py /^import mmcv$/;" i +os tools\convert_datasets\drive.py /^import os$/;" i +os tools\convert_datasets\drive.py /^import os.path as osp$/;" i +osp tools\convert_datasets\drive.py /^import os.path as osp$/;" i +parse_args tools\convert_datasets\drive.py /^def parse_args():$/;" f +tempfile tools\convert_datasets\drive.py /^import tempfile$/;" i +zipfile tools\convert_datasets\drive.py /^import zipfile$/;" i +HRF_LEN tools\convert_datasets\hrf.py /^HRF_LEN = 15$/;" v +TRAINING_LEN tools\convert_datasets\hrf.py /^TRAINING_LEN = 5$/;" v +argparse tools\convert_datasets\hrf.py /^import argparse$/;" i +main tools\convert_datasets\hrf.py /^def main():$/;" f +mmcv tools\convert_datasets\hrf.py /^import mmcv$/;" i +os tools\convert_datasets\hrf.py /^import os$/;" i +os tools\convert_datasets\hrf.py /^import os.path as osp$/;" i +osp tools\convert_datasets\hrf.py /^import os.path as osp$/;" i +parse_args tools\convert_datasets\hrf.py /^def parse_args():$/;" f +tempfile tools\convert_datasets\hrf.py /^import tempfile$/;" i +zipfile tools\convert_datasets\hrf.py /^import zipfile$/;" i +Detail tools\convert_datasets\pascal_context.py /^from detail import Detail$/;" i +Image tools\convert_datasets\pascal_context.py /^from PIL import Image$/;" i +_class_to_index tools\convert_datasets\pascal_context.py /^ def _class_to_index(mask, _mapping, _key):$/;" f function:generate_labels +_key tools\convert_datasets\pascal_context.py /^_key = np.array(range(len(_mapping))).astype('uint8')$/;" v +_mapping tools\convert_datasets\pascal_context.py /^_mapping = np.sort($/;" v +argparse tools\convert_datasets\pascal_context.py /^import argparse$/;" i +generate_labels tools\convert_datasets\pascal_context.py /^def generate_labels(img_id, detail, out_dir):$/;" f +main tools\convert_datasets\pascal_context.py /^def main():$/;" f +mmcv tools\convert_datasets\pascal_context.py /^import mmcv$/;" i +np tools\convert_datasets\pascal_context.py /^import numpy as np$/;" i +os tools\convert_datasets\pascal_context.py /^import os.path as osp$/;" i +osp tools\convert_datasets\pascal_context.py /^import os.path as osp$/;" i +parse_args tools\convert_datasets\pascal_context.py /^def parse_args():$/;" f +partial tools\convert_datasets\pascal_context.py /^from functools import partial$/;" i +STARE_LEN tools\convert_datasets\stare.py /^STARE_LEN = 20$/;" v +TRAINING_LEN tools\convert_datasets\stare.py /^TRAINING_LEN = 10$/;" v +argparse tools\convert_datasets\stare.py /^import argparse$/;" i +gzip tools\convert_datasets\stare.py /^import gzip$/;" i +main tools\convert_datasets\stare.py /^def main():$/;" f +mmcv tools\convert_datasets\stare.py /^import mmcv$/;" i +os tools\convert_datasets\stare.py /^import os$/;" i +os tools\convert_datasets\stare.py /^import os.path as osp$/;" i +osp tools\convert_datasets\stare.py /^import os.path as osp$/;" i +parse_args tools\convert_datasets\stare.py /^def parse_args():$/;" f +tarfile tools\convert_datasets\stare.py /^import tarfile$/;" i +tempfile tools\convert_datasets\stare.py /^import tempfile$/;" i +un_gz tools\convert_datasets\stare.py /^def un_gz(src, dst):$/;" f +AUG_LEN tools\convert_datasets\voc_aug.py /^AUG_LEN = 10582$/;" v +Image tools\convert_datasets\voc_aug.py /^from PIL import Image$/;" i +argparse tools\convert_datasets\voc_aug.py /^import argparse$/;" i +convert_mat tools\convert_datasets\voc_aug.py /^def convert_mat(mat_file, in_dir, out_dir):$/;" f +generate_aug_list tools\convert_datasets\voc_aug.py /^def generate_aug_list(merged_list, excluded_list):$/;" f +loadmat tools\convert_datasets\voc_aug.py /^from scipy.io import loadmat$/;" i +main tools\convert_datasets\voc_aug.py /^def main():$/;" f +mmcv tools\convert_datasets\voc_aug.py /^import mmcv$/;" i +np tools\convert_datasets\voc_aug.py /^import numpy as np$/;" i +os tools\convert_datasets\voc_aug.py /^import os.path as osp$/;" i +osp tools\convert_datasets\voc_aug.py /^import os.path as osp$/;" i +parse_args tools\convert_datasets\voc_aug.py /^def parse_args():$/;" f +partial tools\convert_datasets\voc_aug.py /^from functools import partial$/;" i +Config tools\get_flops.py /^from mmcv import Config$/;" i +argparse tools\get_flops.py /^import argparse$/;" i +build_segmentor tools\get_flops.py /^from mmseg.models import build_segmentor$/;" i +get_model_complexity_info tools\get_flops.py /^from mmcv.cnn import get_model_complexity_info$/;" i +main tools\get_flops.py /^def main():$/;" f +parse_args tools\get_flops.py /^def parse_args():$/;" f +Config tools\print_config.py /^from mmcv import Config, DictAction$/;" i +DictAction tools\print_config.py /^from mmcv import Config, DictAction$/;" i +argparse tools\print_config.py /^import argparse$/;" i +main tools\print_config.py /^def main():$/;" f +parse_args tools\print_config.py /^def parse_args():$/;" f +argparse tools\publish_model.py /^import argparse$/;" i +main tools\publish_model.py /^def main():$/;" f +parse_args tools\publish_model.py /^def parse_args():$/;" f +process_checkpoint tools\publish_model.py /^def process_checkpoint(in_file, out_file):$/;" f +subprocess tools\publish_model.py /^import subprocess$/;" i +torch tools\publish_model.py /^import torch$/;" i +_C tools\pytorch2onnx.py /^import torch._C$/;" i +_convert_batchnorm tools\pytorch2onnx.py /^def _convert_batchnorm(module):$/;" f +_demo_mm_inputs tools\pytorch2onnx.py /^def _demo_mm_inputs(input_shape, num_classes):$/;" f +argparse tools\pytorch2onnx.py /^import argparse$/;" i +args tools\pytorch2onnx.py /^ args = parse_args()$/;" v +build_segmentor tools\pytorch2onnx.py /^from mmseg.models import build_segmentor$/;" i +cfg tools\pytorch2onnx.py /^ cfg = mmcv.Config.fromfile(args.config)$/;" v +input_shape tools\pytorch2onnx.py /^ input_shape = ($/;" v +input_shape tools\pytorch2onnx.py /^ input_shape = (1, 3, args.shape[0], args.shape[0])$/;" v +load_checkpoint tools\pytorch2onnx.py /^from mmcv.runner import load_checkpoint$/;" i +mmcv tools\pytorch2onnx.py /^import mmcv$/;" i +nn tools\pytorch2onnx.py /^from torch import nn$/;" i +np tools\pytorch2onnx.py /^import numpy as np$/;" i +onnx tools\pytorch2onnx.py /^ import onnx$/;" i +opset_version tools\pytorch2onnx.py /^ opset_version=args.opset_version,$/;" v +output_file tools\pytorch2onnx.py /^ output_file=args.output_file,$/;" v +parse_args tools\pytorch2onnx.py /^def parse_args():$/;" f +partial tools\pytorch2onnx.py /^from functools import partial$/;" i +pytorch2onnx tools\pytorch2onnx.py /^def pytorch2onnx(model,$/;" f +register_extra_symbolics tools\pytorch2onnx.py /^from mmcv.onnx import register_extra_symbolics$/;" i +rt tools\pytorch2onnx.py /^import onnxruntime as rt$/;" i +segmentor tools\pytorch2onnx.py /^ segmentor = _convert_batchnorm(segmentor)$/;" v +segmentor tools\pytorch2onnx.py /^ segmentor = build_segmentor($/;" v +serialization tools\pytorch2onnx.py /^import torch.serialization$/;" i +show tools\pytorch2onnx.py /^ show=args.show,$/;" v +torch tools\pytorch2onnx.py /^import torch$/;" i +torch tools\pytorch2onnx.py /^import torch._C$/;" i +torch tools\pytorch2onnx.py /^import torch.serialization$/;" i +verify tools\pytorch2onnx.py /^ verify=args.verify)$/;" v +DictAction tools\test.py /^from mmcv.utils import DictAction$/;" i +MMDataParallel tools\test.py /^from mmcv.parallel import MMDataParallel, MMDistributedDataParallel$/;" i +MMDistributedDataParallel tools\test.py /^from mmcv.parallel import MMDataParallel, MMDistributedDataParallel$/;" i +argparse tools\test.py /^import argparse$/;" i +build_dataloader tools\test.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_dataset tools\test.py /^from mmseg.datasets import build_dataloader, build_dataset$/;" i +build_segmentor tools\test.py /^from mmseg.models import build_segmentor$/;" i +get_dist_info tools\test.py /^from mmcv.runner import get_dist_info, init_dist, load_checkpoint$/;" i +init_dist tools\test.py /^from mmcv.runner import get_dist_info, init_dist, load_checkpoint$/;" i +load_checkpoint tools\test.py /^from mmcv.runner import get_dist_info, init_dist, load_checkpoint$/;" i +main tools\test.py /^def main():$/;" f +mmcv tools\test.py /^import mmcv$/;" i +multi_gpu_test tools\test.py /^from mmseg.apis import multi_gpu_test, single_gpu_test$/;" i +os tools\test.py /^import os$/;" i +parse_args tools\test.py /^def parse_args():$/;" f +single_gpu_test tools\test.py /^from mmseg.apis import multi_gpu_test, single_gpu_test$/;" i +torch tools\test.py /^import torch$/;" i +Config tools\train.py /^from mmcv.utils import Config, DictAction, get_git_hash$/;" i +DictAction tools\train.py /^from mmcv.utils import Config, DictAction, get_git_hash$/;" i +__version__ tools\train.py /^from mmseg import __version__$/;" i +argparse tools\train.py /^import argparse$/;" i +build_dataset tools\train.py /^from mmseg.datasets import build_dataset$/;" i +build_segmentor tools\train.py /^from mmseg.models import build_segmentor$/;" i +collect_env tools\train.py /^from mmseg.utils import collect_env, get_root_logger$/;" i +copy tools\train.py /^import copy$/;" i +get_git_hash tools\train.py /^from mmcv.utils import Config, DictAction, get_git_hash$/;" i +get_root_logger tools\train.py /^from mmseg.utils import collect_env, get_root_logger$/;" i +init_dist tools\train.py /^from mmcv.runner import init_dist$/;" i +main tools\train.py /^def main():$/;" f +mmcv tools\train.py /^import mmcv$/;" i +os tools\train.py /^import os$/;" i +os tools\train.py /^import os.path as osp$/;" i +osp tools\train.py /^import os.path as osp$/;" i +parse_args tools\train.py /^def parse_args():$/;" f +set_random_seed tools\train.py /^from mmseg.apis import set_random_seed, train_segmentor$/;" i +time tools\train.py /^import time$/;" i +torch tools\train.py /^import torch$/;" i +train_segmentor tools\train.py /^from mmseg.apis import set_random_seed, train_segmentor$/;" i +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_PROGRAM_VERSION 5.8 // +!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ +!_TAG_PROGRAM_NAME Exuberant Ctags // +!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..38e625bf59f9ba58f16f758bebaad865030c1e3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,203 @@ +Copyright 2020 The MMSegmentation Authors. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 The MMSegmentation Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..86b4b4f432ccf21e8599feb20909390c52ec477d --- /dev/null +++ b/README.md @@ -0,0 +1,141 @@ +<<<<<<< HEAD +<<<<<<< HEAD +# A Large-Scale Benchmark for Food Image Segmentation + +By [Xiongwei Wu](http://xiongweiwu.github.io/), [Xin Fu](https://xinfu607.github.io/), Ying Liu, [Ee-Peng Lim](http://www.mysmu.edu/faculty/eplim/), [Steven C.H. Hoi](https://sites.google.com/view/stevenhoi/home/), [Qianru Sun](https://qianrusun.com/). + + +
+ +
+
+ +## Introduction + +We build a new food image dataset FoodSeg103 containing 7,118 images. We annotate these images with 104 ingredient classes and each image has an average of 6 ingredient labels and pixel-wise masks. +In addition, we propose a multi-modality pre-training approach called ReLeM that explicitly equips a segmentation model with rich and semantic food knowledge. + +In this software, we use three popular semantic segmentation methods (i.e., Dilated Convolution based, Feature Pyramid based, and Vision Transformer based) as baselines, and evaluate them as well as ReLeM on our new datasets. We believe that the FoodSeg103 and the pre-trained models using ReLeM can serve as a benchmark to facilitate future works on fine-grained food image understanding. + +Please refer our [paper](https://arxiv.org/abs/2105.05409) and our [homepage](https://xiongweiwu.github.io/foodseg103.html) for more details. + +## License + +This project is released under the [Apache 2.0 license](LICENSE). + + +## Installation + +Please refer to [get_started.md](docs/get_started.md#installation) for installation. + +## Dataset + +Please download the file from [url](https://research.larc.smu.edu.sg/downloads/datarepo/FoodSeg103.zip) and unzip the data in ./data folder (./data/FoodSeg103/), with passwd: LARCdataset9947 + +## Leaderboard + +Please refer to [leaderboard](https://paperswithcode.com/dataset/foodseg103) in paperwithcode website. + +## Benchmark and model zoo + +:exclamation::exclamation::exclamation: **We have finished the course so the models are available again. Please download the trained models from THIS [link](https://smu-my.sharepoint.com/:u:/g/personal/xwwu_smu_edu_sg/EWBcCC3QrO9LthKX66QCzyoBhFU7PHXKcHhh1lgIC98uKw?e=bHT7vM):eyes: .** + +Encoder | Decoder | Crop Size | Batch Size |mIoU | mAcc +--- |:---:|:---:|:---:|:---:|:---: +R-50 | [FPN](https://arxiv.org/abs/1901.02446) | 512x1024 | 8 | 27.8 | 38.2 +ReLeM-R-50 | FPN | 512x1024 | 8 | 29.1 | 39.8 +R-50 | [CCNet](https://arxiv.org/abs/1811.11721) | 512x1024 | 8 | 35.5 | 45.3 +ReLeM-R-50 | CCNet | 512x1024 | 8 | 36.8 | 47.4 +[PVT-S](https://arxiv.org/abs/2102.12122) | FPN | 512x1024 | 8 | 31.3 | 43.0 +ReLeM-PVT-S | FPN | 512x1024 | 8 | 32.0 | 44.1 +[ViT-16/B](https://openreview.net/forum?id=YicbFdNTTy) | [Naive](https://arxiv.org/abs/2012.15840) | 768x768 | 4 | 41.3 | 52.7 +ReLeM-ViT-16/B | Naive | 768x768 | 4 | 43.9 | 57.0 +ViT-16/B | PUP | 768x768 | 4 | 38.5 | 49.1 +ReLeM-ViT-16/B | PUP | 768x768 | 4 | 42.5 | 53.9 +ViT-16/B | [MLA](https://arxiv.org/abs/2012.15840) | 768x768 | 4 | 45.1 | 57.4 +ReLeM-ViT-16/B | MLA | 768x768 | 4 | 43.3 | 55.9 +[ViT-16/L](https://openreview.net/forum?id=YicbFdNTTy) | MLA | 768x768 | 4 | 44.5 | 56.6 +[Swin-S](https://arxiv.org/abs/2103.14030) | [UperNet](https://arxiv.org/abs/1807.10221) | 512x1024 | 8 | 41.6 | 53.6 +[Swin-B](https://arxiv.org/abs/2103.14030) | UperNet | 512x1024 | 8 | 41.2 | 53.9 + + +[1] *We do not include the implementation of [swin](https://arxiv.org/abs/2103.14030) in this software. You can use the official [implementation](https://github.com/SwinTransformer/Swin-Transformer-Semantic-Segmentation) based on our provided models.* \ +[2] *We use Step-wise learning policy to train PVT model since we found this policy can yield higher performance, and for other baselines we adopt the default settings.* \ +[3] *We use Recipe1M to train ReLeM-PVT-S while other ReLeM models are trained with Recipe1M+ due to time limitation.* + + + +## Train & Test + +Train script: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-300} tools/train.py --config [config] --work-dir [work-dir] --launcher pytorch +``` + +Exmaple: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-300} tools/train.py --config configs/foodnet/SETR_Naive_768x768_80k_base_RM.py --work-dir checkpoints/SETR_Naive_ReLeM --launcher pytorch +``` + +Test script: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-999} tools/test.py [config] [weights] --launcher pytorch --eval mIoU +``` + +Example: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-999} tools/test.py checkpoints/SETR_Naive_ReLeM/SETR_Naive_768x768_80k_base_RM.py checkpoints/SETR_Naive_ReLeM/iter_80000.pth --launcher pytorch --eval mIoU +``` + +## ReLeM +We train recipe information based on the implementation of [im2recipe](https://github.com/torralba-lab/im2recipe-Pytorch) with small modifications, which is trained on [Recipe1M+](http://pic2recipe.csail.mit.edu/) dataset (test images of FoodSeg103 are removed). I may upload the lmdb file later due to the huge datasize (>35G). + +It takes about 2~3 weeks to train a ReLeM ViT-Base model with 8 Tesla-V100 cards, so I strongly recommend you use my pre-trained models([link](https://drive.google.com/drive/folders/1LRCHxeMuCXMb68I1XFI8q-aQ2cCyUx_r?usp=sharing)). + + +## Citation + +If you find this project useful in your research, please consider cite: + +```latex +@inproceedings{wu2021foodseg, + title={A Large-Scale Benchmark for Food Image Segmentation}, + author={Wu, Xiongwei and Fu, Xin and Liu, Ying and Lim, Ee-Peng and Hoi, Steven CH and Sun, Qianru}, + booktitle={Proceedings of ACM international conference on Multimedia}, + year={2021} +} +``` + +## Other Issues + +If you meet other issues in using the software, you can check the original mmsegmentation (see [doc](https://mmsegmentation.readthedocs.io/) for more details). + + +## Acknowledgement + +The segmentation software in this project was developed mainly by extending the [segmentation](https://github.com/open-mmlab/mmsegmentation/). + +======= +======= +>>>>>>> f406c34c024e7549cfd031b9b7f8682c3107c813 +--- +title: ReLeM FoodSeg103 Demo +emoji: 📚 +colorFrom: pink +colorTo: pink +sdk: gradio +sdk_version: 5.49.1 +app_file: app.py +pinned: false +license: apache-2.0 +--- + +Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +<<<<<<< HEAD +>>>>>>> f406c34c024e7549cfd031b9b7f8682c3107c813 +======= +>>>>>>> f406c34c024e7549cfd031b9b7f8682c3107c813 diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..5f5dd754e06754584ce2d987e916e87b17921cad --- /dev/null +++ b/app.py @@ -0,0 +1,84 @@ +import gradio as gr +import torch +from PIL import Image +import numpy as np + +# --- 1. Load Custom Model Utilities --- +# NOTE: These imports MUST match the files you copied from the GitHub repo. +# Example imports - adjust these if the model files are deeper in subfolders! +try: + from mmseg.apis import init_segmentor, inference_segmentor # Core MMSeg functions + from mmseg.datasets import build_dataloader, build_dataset # Utilities + # You might also need to copy config files, e.g., to 'configs/relem/' +except ImportError: + print("MMSegmentation utilities not found. Ensure files were copied correctly.") + + +# --- 2. CONFIGURATION --- +# Define the paths for the files you placed in the repository +WEIGHTS_PATH = "R50_ReLeM.pth" +CONFIG_FILE = "configs/foodnet/SETR_Naive_768x768_80k_base_RM.py" # Replace with actual config file from the repo + +# --- 3. Model Loading Function --- +@torch.no_grad() +def load_relem_model(): + """Initializes the segmentation model and loads the pre-trained weights.""" + try: + # 1. Initialize the segmentor using MMSegmentation's utility + # This requires the config file and the checkpoint path + model = init_segmentor( + CONFIG_FILE, + checkpoint=WEIGHTS_PATH, + device='cuda:0' if torch.cuda.is_available() else 'cpu' + ) + model.eval() + print("ReLeM Model loaded successfully!") + return model + except Exception as e: + print(f"Error loading model: {e}") + # Return a flag if loading fails + return None + +# Load the model once when the Space starts +RELEM_MODEL = load_relem_model() + + +# --- 4. Inference Function for Gradio --- +def segment_food(input_image: Image.Image): + """Takes a PIL Image and returns a segmentation mask image.""" + + if RELEM_MODEL is None: + return "Error: Model failed to load. Check logs for details." + + try: + # Use MMSegmentation's inference pipeline + # The input is usually a filepath, so we need to save and then load + + # 1. Save input image temporarily + temp_path = "/tmp/input_img.png" + input_image.save(temp_path) + + # 2. Run Inference + result = inference_segmentor(RELEM_MODEL, temp_path) + + # 3. Post-process the result (usually a numpy array) into a color mask image + # The result is a segmentation map (array of class IDs). + # We use a simple utility to convert the ID map to a visible color mask. + seg_mask_array = result[0] + color_mask = Image.fromarray(seg_mask_array.astype(np.uint8)).convert("L") + # NOTE: Full color mapping requires the class labels/palette, which you must also copy from the repo. + + return color_mask + + except Exception as e: + return f"Inference failed: {e}" + +# --- 5. GRADIO INTERFACE --- +gr.Interface( + fn=segment_food, + inputs=gr.Image(type="pil", label="Upload Food Image"), + outputs=gr.Image(type="pil", label="ReLeM Segmentation Mask"), + title="ReLeM (FoodSeg103) Segmentation Demo", + description="Custom deployment of the ReLeM PyTorch model. **NOTE:** Model loading requires the full code/config structure from the GitHub repo.", + allow_flagging="never" +).launch() \ No newline at end of file diff --git a/checkpoints b/checkpoints new file mode 100644 index 0000000000000000000000000000000000000000..88a8114e6c98bc4b67781884748628c76ee8e2e1 --- /dev/null +++ b/checkpoints @@ -0,0 +1 @@ +../checkpoints/ \ No newline at end of file diff --git a/configs/_base_/datasets/FoodSeg103.py b/configs/_base_/datasets/FoodSeg103.py new file mode 100644 index 0000000000000000000000000000000000000000..0db467e549045162fd9a1a9a4fee01f612ea8fc1 --- /dev/null +++ b/configs/_base_/datasets/FoodSeg103.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'CustomDataset' +data_root = './data/FoodSeg103/Images' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='img_dir/train', + ann_dir='ann_dir/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/FoodSeg103_768x768.py b/configs/_base_/datasets/FoodSeg103_768x768.py new file mode 100644 index 0000000000000000000000000000000000000000..4ebbc01579714ab10899114407b58d0a5fedfcd0 --- /dev/null +++ b/configs/_base_/datasets/FoodSeg103_768x768.py @@ -0,0 +1,36 @@ +# dataset settings +_base_ = './FoodSeg103.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (768, 768) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2049, 1025), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/ade20k.py b/configs/_base_/datasets/ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..efc8b4bb20c981f3db6df7eb52b3dc0744c94cc0 --- /dev/null +++ b/configs/_base_/datasets/ade20k.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'ADE20KDataset' +data_root = 'data/ade/ADEChallengeData2016' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', reduce_zero_label=True), + dict(type='Resize', img_scale=(2048, 512), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 512), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/chase_db1.py b/configs/_base_/datasets/chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..298594ea925f87f22b37094a2ec50e370aec96a0 --- /dev/null +++ b/configs/_base_/datasets/chase_db1.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'ChaseDB1Dataset' +data_root = 'data/CHASE_DB1' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_scale = (960, 999) +crop_size = (128, 128) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/cityscapes.py b/configs/_base_/datasets/cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f21867c63e1835f6fceb61f066e802fd8fd2a735 --- /dev/null +++ b/configs/_base_/datasets/cityscapes.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/train', + ann_dir='gtFine/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/cityscapes_769x769.py b/configs/_base_/datasets/cityscapes_769x769.py new file mode 100644 index 0000000000000000000000000000000000000000..336c7b254fe392b4703039fec86a83acdbd2e1a5 --- /dev/null +++ b/configs/_base_/datasets/cityscapes_769x769.py @@ -0,0 +1,35 @@ +_base_ = './cityscapes.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (769, 769) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2049, 1025), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/drive.py b/configs/_base_/datasets/drive.py new file mode 100644 index 0000000000000000000000000000000000000000..06e8ff606e0d2a4514ec8b7d2c6c436a32efcbf4 --- /dev/null +++ b/configs/_base_/datasets/drive.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'DRIVEDataset' +data_root = 'data/DRIVE' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_scale = (584, 565) +crop_size = (64, 64) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/hrf.py b/configs/_base_/datasets/hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..242d790eb1b83e75cf6b7eaa7a35c674099311ad --- /dev/null +++ b/configs/_base_/datasets/hrf.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'HRFDataset' +data_root = 'data/HRF' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_scale = (2336, 3504) +crop_size = (256, 256) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/pascal_context.py b/configs/_base_/datasets/pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..ff65bad1b86d7e3a5980bb5b9fc55798dc8df5f4 --- /dev/null +++ b/configs/_base_/datasets/pascal_context.py @@ -0,0 +1,60 @@ +# dataset settings +dataset_type = 'PascalContextDataset' +data_root = 'data/VOCdevkit/VOC2010/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +img_scale = (520, 520) +crop_size = (480, 480) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClassContext', + split='ImageSets/SegmentationContext/train.txt', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClassContext', + split='ImageSets/SegmentationContext/val.txt', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClassContext', + split='ImageSets/SegmentationContext/val.txt', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/pascal_voc12.py b/configs/_base_/datasets/pascal_voc12.py new file mode 100644 index 0000000000000000000000000000000000000000..ba1d42d0c5781f56dc177d860d856bb34adce555 --- /dev/null +++ b/configs/_base_/datasets/pascal_voc12.py @@ -0,0 +1,57 @@ +# dataset settings +dataset_type = 'PascalVOCDataset' +data_root = 'data/VOCdevkit/VOC2012' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 512) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 512), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 512), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClass', + split='ImageSets/Segmentation/train.txt', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClass', + split='ImageSets/Segmentation/val.txt', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='JPEGImages', + ann_dir='SegmentationClass', + split='ImageSets/Segmentation/val.txt', + pipeline=test_pipeline)) diff --git a/configs/_base_/datasets/pascal_voc12_aug.py b/configs/_base_/datasets/pascal_voc12_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..3f23b6717d53ad29f02dd15046802a2631a5076b --- /dev/null +++ b/configs/_base_/datasets/pascal_voc12_aug.py @@ -0,0 +1,9 @@ +_base_ = './pascal_voc12.py' +# dataset settings +data = dict( + train=dict( + ann_dir=['SegmentationClass', 'SegmentationClassAug'], + split=[ + 'ImageSets/Segmentation/train.txt', + 'ImageSets/Segmentation/aug.txt' + ])) diff --git a/configs/_base_/datasets/stare.py b/configs/_base_/datasets/stare.py new file mode 100644 index 0000000000000000000000000000000000000000..3f71b25488cc11a6b4d582ac52b5a24e1ad1cf8e --- /dev/null +++ b/configs/_base_/datasets/stare.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'STAREDataset' +data_root = 'data/STARE' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_scale = (605, 700) +crop_size = (128, 128) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=img_scale, ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict( + type='RepeatDataset', + times=40000, + dataset=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/training', + ann_dir='annotations/training', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='images/validation', + ann_dir='annotations/validation', + pipeline=test_pipeline)) diff --git a/configs/_base_/default_runtime.py b/configs/_base_/default_runtime.py new file mode 100644 index 0000000000000000000000000000000000000000..b564cc4e7e7d9a67dacaaddecb100e4d8f5c005b --- /dev/null +++ b/configs/_base_/default_runtime.py @@ -0,0 +1,14 @@ +# yapf:disable +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook', by_epoch=False), + # dict(type='TensorboardLoggerHook') + ]) +# yapf:enable +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True diff --git a/configs/_base_/models/ann_r50-d8.py b/configs/_base_/models/ann_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..a2cb653827e44e6015b3b83bc578003e614a6aa1 --- /dev/null +++ b/configs/_base_/models/ann_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='ANNHead', + in_channels=[1024, 2048], + in_index=[2, 3], + channels=512, + project_channels=256, + query_scales=(1, ), + key_pool_scales=(1, 3, 6, 8), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/apcnet_r50-d8.py b/configs/_base_/models/apcnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..c8f5316cbcf3896ba9de7ca2c801eba512f01d5e --- /dev/null +++ b/configs/_base_/models/apcnet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='APCHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/ccnet_r50-d8.py b/configs/_base_/models/ccnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..4fc3d8f875049b0a2ea5c8a0e1ab442b96bee73c --- /dev/null +++ b/configs/_base_/models/ccnet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='CCHead', + in_channels=2048, + in_index=3, + channels=512, + recurrence=2, + dropout_ratio=0.1, + num_classes=104, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=104, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/cgnet.py b/configs/_base_/models/cgnet.py new file mode 100644 index 0000000000000000000000000000000000000000..eff8d9458c877c5db894957e0b1b4597e40da6ab --- /dev/null +++ b/configs/_base_/models/cgnet.py @@ -0,0 +1,35 @@ +# model settings +norm_cfg = dict(type='SyncBN', eps=1e-03, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='CGNet', + norm_cfg=norm_cfg, + in_channels=3, + num_channels=(32, 64, 128), + num_blocks=(3, 21), + dilations=(2, 4), + reductions=(8, 16)), + decode_head=dict( + type='FCNHead', + in_channels=256, + in_index=2, + channels=256, + num_convs=0, + concat_input=False, + dropout_ratio=0, + num_classes=19, + norm_cfg=norm_cfg, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + class_weight=[ + 2.5959933, 6.7415504, 3.5354059, 9.8663225, 9.690899, 9.369352, + 10.289121, 9.953208, 4.3097677, 9.490387, 7.674431, 9.396905, + 10.347791, 6.3927646, 10.226669, 10.241062, 10.280587, + 10.396974, 10.055647 + ])), + # model training and testing settings + train_cfg=dict(sampler=None), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/danet_r50-d8.py b/configs/_base_/models/danet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..2c934939fac48525f22ad86f489a041dd7db7d09 --- /dev/null +++ b/configs/_base_/models/danet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DAHead', + in_channels=2048, + in_index=3, + channels=512, + pam_channels=64, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/deeplabv3_r50-d8.py b/configs/_base_/models/deeplabv3_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..d7a43bee01422ad4795dd27874e0cd4bb6cbfecf --- /dev/null +++ b/configs/_base_/models/deeplabv3_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='ASPPHead', + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/deeplabv3_unet_s5-d16.py b/configs/_base_/models/deeplabv3_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..0cd262999d8b2cb8e14a5c32190ae73f479d8e81 --- /dev/null +++ b/configs/_base_/models/deeplabv3_unet_s5-d16.py @@ -0,0 +1,50 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='ASPPHead', + in_channels=64, + in_index=4, + channels=16, + dilations=(1, 12, 24, 36), + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/configs/_base_/models/deeplabv3plus_r50-d8.py b/configs/_base_/models/deeplabv3plus_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..050e39e091d816df9028d23aa3ecf9db74e441e1 --- /dev/null +++ b/configs/_base_/models/deeplabv3plus_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DepthwiseSeparableASPPHead', + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + c1_in_channels=256, + c1_channels=48, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/dmnet_r50-d8.py b/configs/_base_/models/dmnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..d22ba52640bebd805b3b8d07025e276dfb023759 --- /dev/null +++ b/configs/_base_/models/dmnet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DMHead', + in_channels=2048, + in_index=3, + channels=512, + filter_sizes=(1, 3, 5, 7), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/dnl_r50-d8.py b/configs/_base_/models/dnl_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..edb4c174c51e34c103737ba39bfc48bf831e561d --- /dev/null +++ b/configs/_base_/models/dnl_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DNLHead', + in_channels=2048, + in_index=3, + channels=512, + dropout_ratio=0.1, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/emanet_r50-d8.py b/configs/_base_/models/emanet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..26adcd430926de0862204a71d345f2543167f27b --- /dev/null +++ b/configs/_base_/models/emanet_r50-d8.py @@ -0,0 +1,47 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='EMAHead', + in_channels=2048, + in_index=3, + channels=256, + ema_channels=512, + num_bases=64, + num_stages=3, + momentum=0.1, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/encnet_r50-d8.py b/configs/_base_/models/encnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..be777123a886503172a95fe0719e956a147bbd68 --- /dev/null +++ b/configs/_base_/models/encnet_r50-d8.py @@ -0,0 +1,48 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='EncHead', + in_channels=[512, 1024, 2048], + in_index=(1, 2, 3), + channels=512, + num_codes=32, + use_se_loss=True, + add_lateral=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_se_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.2)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fast_scnn.py b/configs/_base_/models/fast_scnn.py new file mode 100644 index 0000000000000000000000000000000000000000..32fdeb659355a5ce5ef2cc7c2f30742703811cdf --- /dev/null +++ b/configs/_base_/models/fast_scnn.py @@ -0,0 +1,57 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True, momentum=0.01) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='FastSCNN', + downsample_dw_channels=(32, 48), + global_in_channels=64, + global_block_channels=(64, 96, 128), + global_block_strides=(2, 2, 1), + global_out_channels=128, + higher_in_channels=64, + lower_in_channels=128, + fusion_out_channels=128, + out_indices=(0, 1, 2), + norm_cfg=norm_cfg, + align_corners=False), + decode_head=dict( + type='DepthwiseSeparableFCNHead', + in_channels=128, + channels=128, + concat_input=False, + num_classes=19, + in_index=-1, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), + auxiliary_head=[ + dict( + type='FCNHead', + in_channels=128, + channels=32, + num_convs=1, + num_classes=19, + in_index=-2, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), + dict( + type='FCNHead', + in_channels=64, + channels=32, + num_convs=1, + num_classes=19, + in_index=-3, + norm_cfg=norm_cfg, + concat_input=False, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.4)), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fcn_hr18.py b/configs/_base_/models/fcn_hr18.py new file mode 100644 index 0000000000000000000000000000000000000000..c3e299bc89ada56ca14bbffcbdb08a586b8ed9e9 --- /dev/null +++ b/configs/_base_/models/fcn_hr18.py @@ -0,0 +1,52 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://msra/hrnetv2_w18', + backbone=dict( + type='HRNet', + norm_cfg=norm_cfg, + norm_eval=False, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(18, 36)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(18, 36, 72)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(18, 36, 72, 144)))), + decode_head=dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + channels=sum([18, 36, 72, 144]), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fcn_r50-d8.py b/configs/_base_/models/fcn_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..5e98f6cc918b6146fc6d613c6918e825ef1355c3 --- /dev/null +++ b/configs/_base_/models/fcn_r50-d8.py @@ -0,0 +1,45 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='FCNHead', + in_channels=2048, + in_index=3, + channels=512, + num_convs=2, + concat_input=True, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fcn_unet_s5-d16.py b/configs/_base_/models/fcn_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..a33e7972877f902d0e7d18401ca675e3e4e60a18 --- /dev/null +++ b/configs/_base_/models/fcn_unet_s5-d16.py @@ -0,0 +1,51 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='FCNHead', + in_channels=64, + in_index=4, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/configs/_base_/models/fpn_r50.py b/configs/_base_/models/fpn_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..86ab327db92e44c14822d65f1c9277cb007f17c1 --- /dev/null +++ b/configs/_base_/models/fpn_r50.py @@ -0,0 +1,36 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=4), + decode_head=dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/gcnet_r50-d8.py b/configs/_base_/models/gcnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..3d2ad69f5c22adfe79d5fdabf920217628987166 --- /dev/null +++ b/configs/_base_/models/gcnet_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='GCHead', + in_channels=2048, + in_index=3, + channels=512, + ratio=1 / 4., + pooling_type='att', + fusion_types=('channel_add', ), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/lraspp_m-v3-d8.py b/configs/_base_/models/lraspp_m-v3-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..93258242a90695cc94a7c6bd41562d6a75988771 --- /dev/null +++ b/configs/_base_/models/lraspp_m-v3-d8.py @@ -0,0 +1,25 @@ +# model settings +norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='MobileNetV3', + arch='large', + out_indices=(1, 3, 16), + norm_cfg=norm_cfg), + decode_head=dict( + type='LRASPPHead', + in_channels=(16, 24, 960), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/nonlocal_r50-d8.py b/configs/_base_/models/nonlocal_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..5674a39854cafd1f2e363bac99c58ccae62f24da --- /dev/null +++ b/configs/_base_/models/nonlocal_r50-d8.py @@ -0,0 +1,46 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='NLHead', + in_channels=2048, + in_index=3, + channels=512, + dropout_ratio=0.1, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/ocrnet_hr18.py b/configs/_base_/models/ocrnet_hr18.py new file mode 100644 index 0000000000000000000000000000000000000000..c60f62a7cdf3f5c5096a7a7e725e8268fddcb057 --- /dev/null +++ b/configs/_base_/models/ocrnet_hr18.py @@ -0,0 +1,68 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='CascadeEncoderDecoder', + num_stages=2, + pretrained='open-mmlab://msra/hrnetv2_w18', + backbone=dict( + type='HRNet', + norm_cfg=norm_cfg, + norm_eval=False, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(18, 36)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(18, 36, 72)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(18, 36, 72, 144)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/ocrnet_r50-d8.py b/configs/_base_/models/ocrnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..615aa3ff703942b6c22b2d6e9642504dd3e41ebd --- /dev/null +++ b/configs/_base_/models/ocrnet_r50-d8.py @@ -0,0 +1,47 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='CascadeEncoderDecoder', + num_stages=2, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=[ + dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=2048, + in_index=3, + channels=512, + ocr_channels=256, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ], + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/pointrend_r50.py b/configs/_base_/models/pointrend_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..9d323dbf9466d41e0800aa57ef84045f3d874bdf --- /dev/null +++ b/configs/_base_/models/pointrend_r50.py @@ -0,0 +1,56 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='CascadeEncoderDecoder', + num_stages=2, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=4), + decode_head=[ + dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=-1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='PointHead', + in_channels=[256], + in_index=[0], + channels=256, + num_fcs=3, + coarse_pred_each_layer=True, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ], + # model training and testing settings + train_cfg=dict( + num_points=2048, oversample_ratio=3, importance_sample_ratio=0.75), + test_cfg=dict( + mode='whole', + subdivision_steps=2, + subdivision_num_points=8196, + scale_factor=2)) diff --git a/configs/_base_/models/psanet_r50-d8.py b/configs/_base_/models/psanet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..689513fa9d2a40f14bf0ae4ae61f38f0dcc1b3da --- /dev/null +++ b/configs/_base_/models/psanet_r50-d8.py @@ -0,0 +1,49 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSAHead', + in_channels=2048, + in_index=3, + channels=512, + mask_size=(97, 97), + psa_type='bi-direction', + compact=False, + shrink_factor=2, + normalization_factor=1.0, + psa_softmax=True, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/pspnet_r50-d8.py b/configs/_base_/models/pspnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..f451e08ad2eb0732dcb806b1851eb978d4acf136 --- /dev/null +++ b/configs/_base_/models/pspnet_r50-d8.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/pspnet_unet_s5-d16.py b/configs/_base_/models/pspnet_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..fcff9ec4f41fad158344ecd77313dc14564f3682 --- /dev/null +++ b/configs/_base_/models/pspnet_unet_s5-d16.py @@ -0,0 +1,50 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='PSPHead', + in_channels=64, + in_index=4, + channels=16, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=64, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=2, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/configs/_base_/models/setr_mla.py b/configs/_base_/models/setr_mla.py new file mode 100644 index 0000000000000000000000000000000000000000..2e1750599f9ab574efd4531d13558ce710eb93c8 --- /dev/null +++ b/configs/_base_/models/setr_mla.py @@ -0,0 +1,38 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='VIT_MLA', + model_name='vit_large_patch16_384', + img_size=768, + patch_size=16, + in_chans=3, + embed_dim=1024, + depth=24, + num_heads=16, + num_classes=19, + drop_rate=0.1, + norm_cfg=norm_cfg, + pos_embed_interp=True, + align_corners=False, + mla_channels=256, + mla_index=(5,11,17,23) + ), + decode_head=dict( + type='VIT_MLAHead', + in_channels=1024, + channels=512, + img_size=768, + mla_channels=256, + mlahead_channels=128, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) +# model training and testing settings +train_cfg = dict() +test_cfg = dict(mode='whole') + + diff --git a/configs/_base_/models/setr_naive_pup.py b/configs/_base_/models/setr_naive_pup.py new file mode 100644 index 0000000000000000000000000000000000000000..b6a962f9d7e760f847626d32533d76fd1eac3d5b --- /dev/null +++ b/configs/_base_/models/setr_naive_pup.py @@ -0,0 +1,36 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='VisionTransformer', + model_name='vit_base_patch16_224', + img_size=768, + patch_size=16, + in_chans=3, + embed_dim=1024, + depth=24, + num_heads=16, + num_classes=19, + drop_rate=0.1, + norm_cfg=norm_cfg, + pos_embed_interp=True, + align_corners=False, + ), + decode_head=dict( + type='VisionTransformerUpHead', + in_channels=1024, + channels=512, + in_index=23, + img_size=768, + embed_dim=1024, + num_classes=19, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) +# model training and testing settings +train_cfg = dict() +test_cfg = dict(mode='whole') diff --git a/configs/_base_/models/upernet_r50.py b/configs/_base_/models/upernet_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..10974962fdd7136031fd06de1700f497d355ceaa --- /dev/null +++ b/configs/_base_/models/upernet_r50.py @@ -0,0 +1,44 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='UPerHead', + in_channels=[256, 512, 1024, 2048], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/schedules/schedule_160k.py b/configs/_base_/schedules/schedule_160k.py new file mode 100644 index 0000000000000000000000000000000000000000..52603890b10f25faf8eec9f9e5a4468fae09b811 --- /dev/null +++ b/configs/_base_/schedules/schedule_160k.py @@ -0,0 +1,9 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +runner = dict(type='IterBasedRunner', max_iters=160000) +checkpoint_config = dict(by_epoch=False, interval=16000) +evaluation = dict(interval=16000, metric='mIoU') diff --git a/configs/_base_/schedules/schedule_20k.py b/configs/_base_/schedules/schedule_20k.py new file mode 100644 index 0000000000000000000000000000000000000000..bf780a1b6f6521833c6a5859675147824efa599d --- /dev/null +++ b/configs/_base_/schedules/schedule_20k.py @@ -0,0 +1,9 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +runner = dict(type='IterBasedRunner', max_iters=20000) +checkpoint_config = dict(by_epoch=False, interval=2000) +evaluation = dict(interval=2000, metric='mIoU') diff --git a/configs/_base_/schedules/schedule_40k.py b/configs/_base_/schedules/schedule_40k.py new file mode 100644 index 0000000000000000000000000000000000000000..cdbf841abcb26eed87bf76ab816aff4bae0630ee --- /dev/null +++ b/configs/_base_/schedules/schedule_40k.py @@ -0,0 +1,9 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +runner = dict(type='IterBasedRunner', max_iters=40000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') diff --git a/configs/_base_/schedules/schedule_80k.py b/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..751963703002309741da12d9060beae1d1be4a96 --- /dev/null +++ b/configs/_base_/schedules/schedule_80k.py @@ -0,0 +1,9 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict() + +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') diff --git a/configs/ann/README.md b/configs/ann/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7fc1648311d8f6789fd2ed99789973afbb940531 --- /dev/null +++ b/configs/ann/README.md @@ -0,0 +1,52 @@ +# Asymmetric Non-local Neural Networks for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{annn, + author = {Zhen Zhu and + Mengde Xu and + Song Bai and + Tengteng Huang and + Xiang Bai}, + title = {Asymmetric Non-local Neural Networks for Semantic Segmentation}, + booktitle={International Conference on Computer Vision}, + year = {2019}, + url = {http://arxiv.org/abs/1908.07678}, +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ANN | R-50-D8 | 512x1024 | 40000 | 6 | 3.71 | 77.40 | 78.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211-049fc292.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_40k_cityscapes/ann_r50-d8_512x1024_40k_cityscapes_20200605_095211.log.json) | +| ANN | R-101-D8 | 512x1024 | 40000 | 9.5 | 2.55 | 76.55 | 78.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_40k_cityscapes/ann_r101-d8_512x1024_40k_cityscapes_20200605_095243-adf6eece.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_40k_cityscapes/ann_r101-d8_512x1024_40k_cityscapes_20200605_095243.log.json) | +| ANN | R-50-D8 | 769x769 | 40000 | 6.8 | 1.70 | 78.89 | 80.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_40k_cityscapes/ann_r50-d8_769x769_40k_cityscapes_20200530_025712-2b46b04d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_40k_cityscapes/ann_r50-d8_769x769_40k_cityscapes_20200530_025712.log.json) | +| ANN | R-101-D8 | 769x769 | 40000 | 10.7 | 1.15 | 79.32 | 80.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_40k_cityscapes/ann_r101-d8_769x769_40k_cityscapes_20200530_025720-059bff28.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_40k_cityscapes/ann_r101-d8_769x769_40k_cityscapes_20200530_025720.log.json) | +| ANN | R-50-D8 | 512x1024 | 80000 | - | - | 77.34 | 78.65 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_80k_cityscapes/ann_r50-d8_512x1024_80k_cityscapes_20200607_101911-5a9ad545.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x1024_80k_cityscapes/ann_r50-d8_512x1024_80k_cityscapes_20200607_101911.log.json) | +| ANN | R-101-D8 | 512x1024 | 80000 | - | - | 77.14 | 78.81 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_80k_cityscapes/ann_r101-d8_512x1024_80k_cityscapes_20200607_013728-aceccc6e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x1024_80k_cityscapes/ann_r101-d8_512x1024_80k_cityscapes_20200607_013728.log.json) | +| ANN | R-50-D8 | 769x769 | 80000 | - | - | 78.88 | 80.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_80k_cityscapes/ann_r50-d8_769x769_80k_cityscapes_20200607_044426-cc7ff323.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_769x769_80k_cityscapes/ann_r50-d8_769x769_80k_cityscapes_20200607_044426.log.json) | +| ANN | R-101-D8 | 769x769 | 80000 | - | - | 78.80 | 80.34 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_80k_cityscapes/ann_r101-d8_769x769_80k_cityscapes_20200607_013713-a9d4be8d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_769x769_80k_cityscapes/ann_r101-d8_769x769_80k_cityscapes_20200607_013713.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ANN | R-50-D8 | 512x512 | 80000 | 9.1 | 21.01 | 41.01 | 42.30 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_80k_ade20k/ann_r50-d8_512x512_80k_ade20k_20200615_014818-26f75e11.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_80k_ade20k/ann_r50-d8_512x512_80k_ade20k_20200615_014818.log.json) | +| ANN | R-101-D8 | 512x512 | 80000 | 12.5 | 14.12 | 42.94 | 44.18 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_80k_ade20k/ann_r101-d8_512x512_80k_ade20k_20200615_014818-c0153543.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_80k_ade20k/ann_r101-d8_512x512_80k_ade20k_20200615_014818.log.json) | +| ANN | R-50-D8 | 512x512 | 160000 | - | - | 41.74 | 42.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_160k_ade20k/ann_r50-d8_512x512_160k_ade20k_20200615_231733-892247bc.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_160k_ade20k/ann_r50-d8_512x512_160k_ade20k_20200615_231733.log.json) | +| ANN | R-101-D8 | 512x512 | 160000 | - | - | 42.94 | 44.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_160k_ade20k/ann_r101-d8_512x512_160k_ade20k_20200615_231733-955eb1ec.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_160k_ade20k/ann_r101-d8_512x512_160k_ade20k_20200615_231733.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ANN | R-50-D8 | 512x512 | 20000 | 6 | 20.92 | 74.86 | 76.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_20k_voc12aug/ann_r50-d8_512x512_20k_voc12aug_20200617_222246-dfcb1c62.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_20k_voc12aug/ann_r50-d8_512x512_20k_voc12aug_20200617_222246.log.json) | +| ANN | R-101-D8 | 512x512 | 20000 | 9.5 | 13.94 | 77.47 | 78.70 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_20k_voc12aug/ann_r101-d8_512x512_20k_voc12aug_20200617_222246-2fad0042.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_20k_voc12aug/ann_r101-d8_512x512_20k_voc12aug_20200617_222246.log.json) | +| ANN | R-50-D8 | 512x512 | 40000 | - | - | 76.56 | 77.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_40k_voc12aug/ann_r50-d8_512x512_40k_voc12aug_20200613_231314-b5dac322.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r50-d8_512x512_40k_voc12aug/ann_r50-d8_512x512_40k_voc12aug_20200613_231314.log.json) | +| ANN | R-101-D8 | 512x512 | 40000 | - | - | 76.70 | 78.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_40k_voc12aug/ann_r101-d8_512x512_40k_voc12aug_20200613_231314-bd205bbe.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ann/ann_r101-d8_512x512_40k_voc12aug/ann_r101-d8_512x512_40k_voc12aug_20200613_231314.log.json) | diff --git a/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py b/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d494e07333217e0c6830d36d1bb58fa78b03cfb0 --- /dev/null +++ b/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py b/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1eeff0b030cf1db8c6ec9740fa65db44b2026d58 --- /dev/null +++ b/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x512_160k_ade20k.py b/configs/ann/ann_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9e43af541f6e3df3f36479e736bb0c03fc916970 --- /dev/null +++ b/configs/ann/ann_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py b/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d854f2e4223731f443369febc500dbccdc524d9d --- /dev/null +++ b/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py b/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..893c53b1ca4bf9788e4d94f0f53cfe92a93f48ce --- /dev/null +++ b/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_512x512_80k_ade20k.py b/configs/ann/ann_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a64dac670ed4d4632e7b9791ec5f8a334dcea78e --- /dev/null +++ b/configs/ann/ann_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py b/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..59508248490b3edbac1c46b4fcc7891f99655b9b --- /dev/null +++ b/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py b/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a9c712d1ccfd62ddf6f12ff01ea347ca1995013b --- /dev/null +++ b/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ann_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py b/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..00b2594ba8a1c9edc90cca7a6d7c3334fa209edc --- /dev/null +++ b/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py b/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ef7b369dd9e12b2282a30da14f99dd4547c53a7b --- /dev/null +++ b/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/ann/ann_r50-d8_512x512_160k_ade20k.py b/configs/ann/ann_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ca6bb248ac867d463c274f975c884aa80a57730f --- /dev/null +++ b/configs/ann/ann_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py b/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..071f190261c4e8f4a80a5da12a88e0cfcdfef0d8 --- /dev/null +++ b/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py b/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..82a1c9386c51fb0ada436e51702beb961a534b26 --- /dev/null +++ b/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/ann/ann_r50-d8_512x512_80k_ade20k.py b/configs/ann/ann_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5e04aa7c6ac050d119e07b715e2082f692e1a1de --- /dev/null +++ b/configs/ann/ann_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py b/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4912bdb9fb298518ae084eb7df0ad22d3e4ff84f --- /dev/null +++ b/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py b/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d1cc072b152986102286f503e3d7b92999bf414c --- /dev/null +++ b/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/ann_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/apcnet/README.md b/configs/apcnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c2ab106a29c1a135fc7a726df9f6f22536357ced --- /dev/null +++ b/configs/apcnet/README.md @@ -0,0 +1,39 @@ +# Adaptive Pyramid Context Network for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@InProceedings{He_2019_CVPR, +author = {He, Junjun and Deng, Zhongying and Zhou, Lei and Wang, Yali and Qiao, Yu}, +title = {Adaptive Pyramid Context Network for Semantic Segmentation}, +booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, +month = {June}, +year = {2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| APCNet | R-50-D8 | 512x1024 | 40000 | 7.7 | 3.57 | 78.02 | 79.26 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes/apcnet_r50-d8_512x1024_40k_cityscapes_20201214_115717-5e88fa33.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes/apcnet_r50-d8_512x1024_40k_cityscapes-20201214_115717.log.json) | +| APCNet | R-101-D8 | 512x1024 | 40000 | 11.2 | 2.15 | 79.08 | 80.34 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes/apcnet_r101-d8_512x1024_40k_cityscapes_20201214_115716-abc9d111.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes/apcnet_r101-d8_512x1024_40k_cityscapes-20201214_115716.log.json) | +| APCNet | R-50-D8 | 769x769 | 40000 | 8.7 | 1.52 | 77.89 | 79.75 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_40k_cityscapes/apcnet_r50-d8_769x769_40k_cityscapes_20201214_115717-2a2628d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_40k_cityscapes/apcnet_r50-d8_769x769_40k_cityscapes-20201214_115717.log.json) | +| APCNet | R-101-D8 | 769x769 | 40000 | 12.7 | 1.03 | 77.96 | 79.24 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_40k_cityscapes/apcnet_r101-d8_769x769_40k_cityscapes_20201214_115718-b650de90.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_40k_cityscapes/apcnet_r101-d8_769x769_40k_cityscapes-20201214_115718.log.json) | +| APCNet | R-50-D8 | 512x1024 | 80000 | - | - | 78.96 | 79.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes/apcnet_r50-d8_512x1024_80k_cityscapes_20201214_115716-987f51e3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes/apcnet_r50-d8_512x1024_80k_cityscapes-20201214_115716.log.json) | +| APCNet | R-101-D8 | 512x1024 | 80000 | - | - | 79.64 | 80.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes/apcnet_r101-d8_512x1024_80k_cityscapes_20201214_115705-b1ff208a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes/apcnet_r101-d8_512x1024_80k_cityscapes-20201214_115705.log.json) | +| APCNet | R-50-D8 | 769x769 | 80000 | - | - | 78.79 | 80.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_80k_cityscapes/apcnet_r50-d8_769x769_80k_cityscapes_20201214_115718-7ea9fa12.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_769x769_80k_cityscapes/apcnet_r50-d8_769x769_80k_cityscapes-20201214_115718.log.json) | +| APCNet | R-101-D8 | 769x769 | 80000 | - | - | 78.45 | 79.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_80k_cityscapes/apcnet_r101-d8_769x769_80k_cityscapes_20201214_115716-a7fbc2ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_769x769_80k_cityscapes/apcnet_r101-d8_769x769_80k_cityscapes-20201214_115716.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| APCNet | R-50-D8 | 512x512 | 80000 | 10.1 | 19.61 | 42.20 | 43.30 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_80k_ade20k/apcnet_r50-d8_512x512_80k_ade20k_20201214_115705-a8626293.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_80k_ade20k/apcnet_r50-d8_512x512_80k_ade20k-20201214_115705.log.json) | +| APCNet | R-101-D8 | 512x512 | 80000 | 13.6 | 13.10 | 45.54 | 46.65 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_80k_ade20k/apcnet_r101-d8_512x512_80k_ade20k_20201214_115704-c656c3fb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_80k_ade20k/apcnet_r101-d8_512x512_80k_ade20k-20201214_115704.log.json) | +| APCNet | R-50-D8 | 512x512 | 160000 | - | - | 43.40 | 43.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_160k_ade20k/apcnet_r50-d8_512x512_160k_ade20k_20201214_115706-25fb92c2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r50-d8_512x512_160k_ade20k/apcnet_r50-d8_512x512_160k_ade20k-20201214_115706.log.json) | +| APCNet | R-101-D8 | 512x512 | 160000 | - | - | 45.41 | 46.63 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_160k_ade20k/apcnet_r101-d8_512x512_160k_ade20k_20201214_115705-73f9a8d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/apcnet/apcnet_r101-d8_512x512_160k_ade20k/apcnet_r101-d8_512x512_160k_ade20k-20201214_115705.log.json) | diff --git a/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py b/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1e1cec67355abae33d518417eb96eae111f16d2b --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py b/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..04cb006ba146268e1d3278151bc6ea00a4fb1bfe --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py b/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1ce2279a0fbfd6fcc7cd20e3f552b1a39f47d943 --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py b/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8f10b98406c88256c66d3bbe241c149791d68feb --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py b/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5c44ebcaf36075e67208c5f033d1e5f9a78dda4e --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py b/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..616984575dda73a13fc5870f60ae6ffa30d6b01b --- /dev/null +++ b/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './apcnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py b/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99c61a942e4868315ce4a9404d113f73fed4a4ea --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py b/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..62a0627ae2e9bb17974068e56ee660093e944e0d --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py b/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f7821c559d2f92d23b28e07e040a54cfc425eefc --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py b/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..daafa5fbc12c3ed6c10b5234d520166f774e0f94 --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py b/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3db6140cb97da1d202fd464d01f793276effa629 --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py b/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9cac4254f37bc3755bff869a10eb3cb75db4d943 --- /dev/null +++ b/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/apcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/ccnet/README.md b/configs/ccnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..044d5896781de5824fc5a009d8c0eadf47a44e4e --- /dev/null +++ b/configs/ccnet/README.md @@ -0,0 +1,47 @@ +# CCNet: Criss-Cross Attention for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{huang2018ccnet, + title={CCNet: Criss-Cross Attention for Semantic Segmentation}, + author={Huang, Zilong and Wang, Xinggang and Huang, Lichao and Huang, Chang and Wei, Yunchao and Liu, Wenyu}, + booktitle={ICCV}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| CCNet | R-50-D8 | 512x1024 | 40000 | 6 | 3.32 | 77.76 | 78.87 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes/ccnet_r50-d8_512x1024_40k_cityscapes_20200616_142517-4123f401.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes/ccnet_r50-d8_512x1024_40k_cityscapes_20200616_142517.log.json) | +| CCNet | R-101-D8 | 512x1024 | 40000 | 9.5 | 2.31 | 76.35 | 78.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes/ccnet_r101-d8_512x1024_40k_cityscapes_20200616_142540-a3b84ba6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes/ccnet_r101-d8_512x1024_40k_cityscapes_20200616_142540.log.json) | +| CCNet | R-50-D8 | 769x769 | 40000 | 6.8 | 1.43 | 78.46 | 79.93 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_40k_cityscapes/ccnet_r50-d8_769x769_40k_cityscapes_20200616_145125-76d11884.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_40k_cityscapes/ccnet_r50-d8_769x769_40k_cityscapes_20200616_145125.log.json) | +| CCNet | R-101-D8 | 769x769 | 40000 | 10.7 | 1.01 | 76.94 | 78.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_40k_cityscapes/ccnet_r101-d8_769x769_40k_cityscapes_20200617_101428-4f57c8d0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_40k_cityscapes/ccnet_r101-d8_769x769_40k_cityscapes_20200617_101428.log.json) | +| CCNet | R-50-D8 | 512x1024 | 80000 | - | - | 79.03 | 80.16 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes/ccnet_r50-d8_512x1024_80k_cityscapes_20200617_010421-869a3423.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes/ccnet_r50-d8_512x1024_80k_cityscapes_20200617_010421.log.json) | +| CCNet | R-101-D8 | 512x1024 | 80000 | - | - | 78.87 | 79.90 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes/ccnet_r101-d8_512x1024_80k_cityscapes_20200617_203935-ffae8917.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes/ccnet_r101-d8_512x1024_80k_cityscapes_20200617_203935.log.json) | +| CCNet | R-50-D8 | 769x769 | 80000 | - | - | 79.29 | 81.08 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_80k_cityscapes/ccnet_r50-d8_769x769_80k_cityscapes_20200617_010421-73eed8ca.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_769x769_80k_cityscapes/ccnet_r50-d8_769x769_80k_cityscapes_20200617_010421.log.json) | +| CCNet | R-101-D8 | 769x769 | 80000 | - | - | 79.45 | 80.66 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_80k_cityscapes/ccnet_r101-d8_769x769_80k_cityscapes_20200618_011502-ad3cd481.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_769x769_80k_cityscapes/ccnet_r101-d8_769x769_80k_cityscapes_20200618_011502.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| CCNet | R-50-D8 | 512x512 | 80000 | 8.8 | 20.89 | 41.78 | 42.98 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_80k_ade20k/ccnet_r50-d8_512x512_80k_ade20k_20200615_014848-aa37f61e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_80k_ade20k/ccnet_r50-d8_512x512_80k_ade20k_20200615_014848.log.json) | +| CCNet | R-101-D8 | 512x512 | 80000 | 12.2 | 14.11 | 43.97 | 45.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_80k_ade20k/ccnet_r101-d8_512x512_80k_ade20k_20200615_014848-1f4929a3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_80k_ade20k/ccnet_r101-d8_512x512_80k_ade20k_20200615_014848.log.json) | +| CCNet | R-50-D8 | 512x512 | 160000 | - | - | 42.08 | 43.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_160k_ade20k/ccnet_r50-d8_512x512_160k_ade20k_20200616_084435-7c97193b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_160k_ade20k/ccnet_r50-d8_512x512_160k_ade20k_20200616_084435.log.json) | +| CCNet | R-101-D8 | 512x512 | 160000 | - | - | 43.71 | 45.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_160k_ade20k/ccnet_r101-d8_512x512_160k_ade20k_20200616_000644-e849e007.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_160k_ade20k/ccnet_r101-d8_512x512_160k_ade20k_20200616_000644.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| CCNet | R-50-D8 | 512x512 | 20000 | 6 | 20.45 | 76.17 | 77.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_20k_voc12aug/ccnet_r50-d8_512x512_20k_voc12aug_20200617_193212-fad81784.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_20k_voc12aug/ccnet_r50-d8_512x512_20k_voc12aug_20200617_193212.log.json) | +| CCNet | R-101-D8 | 512x512 | 20000 | 9.5 | 13.64 | 77.27 | 79.02 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_20k_voc12aug/ccnet_r101-d8_512x512_20k_voc12aug_20200617_193212-0007b61d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_20k_voc12aug/ccnet_r101-d8_512x512_20k_voc12aug_20200617_193212.log.json) | +| CCNet | R-50-D8 | 512x512 | 40000 | - | - | 75.96 | 77.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_40k_voc12aug/ccnet_r50-d8_512x512_40k_voc12aug_20200613_232127-c2a15f02.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r50-d8_512x512_40k_voc12aug/ccnet_r50-d8_512x512_40k_voc12aug_20200613_232127.log.json) | +| CCNet | R-101-D8 | 512x512 | 40000 | - | - | 77.87 | 78.90 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_40k_voc12aug/ccnet_r101-d8_512x512_40k_voc12aug_20200613_232127-c30da577.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ccnet/ccnet_r101-d8_512x512_40k_voc12aug/ccnet_r101-d8_512x512_40k_voc12aug_20200613_232127.log.json) | diff --git a/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py b/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py new file mode 100644 index 0000000000000000000000000000000000000000..d112e4a4248fb4733f60385a0ef338fd9bf8b56c --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py @@ -0,0 +1,2 @@ +_base_ = ['../_base_/datasets/Recipe1M.py', +'../_base_/default_runtime.py','../_base_/models/ccnet_r50-d8.py','../_base_/schedules/schedule_40k.py'] diff --git a/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py b/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d2bac38ca6760af6441ede5a04409ed495ef87f3 --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py b/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..989928ab7f98da86e291451040ff85669a9fbddb --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py b/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..c32bf48751f0a18983bff0d99310870b71801663 --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py b/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..53eb77c0cd6690668ee7c2a666bd85b9a5f7e73b --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py b/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d7eb668f39bbd22a1f42628428bc19d1645e9865 --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py b/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..029c1d525b809b61dc8e548ebe4fb26e5c68a8be --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py b/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..43f05fab05ee4e20c3509a923118fe9818543cbd --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py b/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..654f377b6f6152c9bd98d33824a39a41d7510c3f --- /dev/null +++ b/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './ccnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py b/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6a4316dde57206fe369e72fa0d32a529fe1a1932 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py b/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..16e34356e9f8566ec73e3c25c771e281d3eeb975 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py b/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1ad94d8988bb822c1571816255464126d9d5b95d --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py b/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..bbcd29ccea8dcf9f67f1cd198dacd5dab380b265 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py b/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..947b8ac8ce1ddf7906ad39788c6992df3b506d29 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py b/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1a1f49cf6b112afdadf1841571f51b98c010ddf8 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py b/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..580d59ca6995ea95a9345ef3ea574ea5b57e9cfb --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py b/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c6dac64377bb3f73fdf5c836fa9c38757f75ff76 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/cgnet/README.md b/configs/cgnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..00ba387203a257dbb485d68134c88cb43780722d --- /dev/null +++ b/configs/cgnet/README.md @@ -0,0 +1,23 @@ +# CGNet: A Light-weight Context Guided Network for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latext +@article{wu2018cgnet, + title={CGNet: A Light-weight Context Guided Network for Semantic Segmentation}, + author={Wu, Tianyi and Tang, Sheng and Zhang, Rui and Zhang, Yongdong}, + journal={arXiv preprint arXiv:1811.08201}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| CGNet | M3N21 | 680x680 | 60000 | 7.5 | 30.51 | 65.63 | 68.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes_20201101_110253-4c0b2f2d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes-20201101_110253.log.json) | +| CGNet | M3N21 | 512x1024 | 60000 | 8.3 | 31.14 | 68.27 | 70.33 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes_20201101_110254-124ea03b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes-20201101_110254.log.json) | diff --git a/configs/cgnet/cgnet_512x1024_60k_cityscapes.py b/configs/cgnet/cgnet_512x1024_60k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..11421ef9d375d01b01c333c3705d6eb6e3348ee8 --- /dev/null +++ b/configs/cgnet/cgnet_512x1024_60k_cityscapes.py @@ -0,0 +1,66 @@ +_base_ = ['../_base_/models/cgnet.py', '../_base_/default_runtime.py'] + +# optimizer +optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +total_iters = 60000 +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') + +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +img_norm_cfg = dict( + mean=[72.39239876, 82.90891754, 73.15835921], std=[1, 1, 1], to_rgb=True) +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/train', + ann_dir='gtFine/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_root=data_root, + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=test_pipeline)) diff --git a/configs/cgnet/cgnet_680x680_60k_cityscapes.py b/configs/cgnet/cgnet_680x680_60k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..2b2f8eefb7dbecf81fcd2db54644493480825246 --- /dev/null +++ b/configs/cgnet/cgnet_680x680_60k_cityscapes.py @@ -0,0 +1,50 @@ +_base_ = [ + '../_base_/models/cgnet.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py' +] + +# optimizer +optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005) +optimizer_config = dict() +# learning policy +lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) +# runtime settings +total_iters = 60000 +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') + +img_norm_cfg = dict( + mean=[72.39239876, 82.90891754, 73.15835921], std=[1, 1, 1], to_rgb=True) +crop_size = (680, 680) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=8, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/danet/README.md b/configs/danet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f49ccf96194f820f509aa9448493ba12ead91953 --- /dev/null +++ b/configs/danet/README.md @@ -0,0 +1,47 @@ +# Dual Attention Network for Scene Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{fu2018dual, + title={Dual Attention Network for Scene Segmentation}, + author={Jun Fu, Jing Liu, Haijie Tian, Yong Li, Yongjun Bao, Zhiwei Fang,and Hanqing Lu}, + booktitle={The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DANet | R-50-D8 | 512x1024 | 40000 | 7.4 | 2.66 | 78.74 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_40k_cityscapes/danet_r50-d8_512x1024_40k_cityscapes_20200605_191324-c0dbfa5f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_40k_cityscapes/danet_r50-d8_512x1024_40k_cityscapes_20200605_191324.log.json) | +| DANet | R-101-D8 | 512x1024 | 40000 | 10.9 | 1.99 | 80.52 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_40k_cityscapes/danet_r101-d8_512x1024_40k_cityscapes_20200605_200831-c57a7157.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_40k_cityscapes/danet_r101-d8_512x1024_40k_cityscapes_20200605_200831.log.json) | +| DANet | R-50-D8 | 769x769 | 40000 | 8.8 | 1.56 | 78.88 | 80.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_40k_cityscapes/danet_r50-d8_769x769_40k_cityscapes_20200530_025703-76681c60.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_40k_cityscapes/danet_r50-d8_769x769_40k_cityscapes_20200530_025703.log.json) | +| DANet | R-101-D8 | 769x769 | 40000 | 12.8 | 1.07 | 79.88 | 81.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_40k_cityscapes/danet_r101-d8_769x769_40k_cityscapes_20200530_025717-dcb7fd4e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_40k_cityscapes/danet_r101-d8_769x769_40k_cityscapes_20200530_025717.log.json) | +| DANet | R-50-D8 | 512x1024 | 80000 | - | - | 79.34 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_80k_cityscapes/danet_r50-d8_512x1024_80k_cityscapes_20200607_133029-2bfa2293.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x1024_80k_cityscapes/danet_r50-d8_512x1024_80k_cityscapes_20200607_133029.log.json) | +| DANet | R-101-D8 | 512x1024 | 80000 | - | - | 80.41 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_80k_cityscapes/danet_r101-d8_512x1024_80k_cityscapes_20200607_132918-955e6350.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x1024_80k_cityscapes/danet_r101-d8_512x1024_80k_cityscapes_20200607_132918.log.json) | +| DANet | R-50-D8 | 769x769 | 80000 | - | - | 79.27 | 80.96 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_80k_cityscapes/danet_r50-d8_769x769_80k_cityscapes_20200607_132954-495689b4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_769x769_80k_cityscapes/danet_r50-d8_769x769_80k_cityscapes_20200607_132954.log.json) | +| DANet | R-101-D8 | 769x769 | 80000 | - | - | 80.47 | 82.02 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_80k_cityscapes/danet_r101-d8_769x769_80k_cityscapes_20200607_132918-f3a929e7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_769x769_80k_cityscapes/danet_r101-d8_769x769_80k_cityscapes_20200607_132918.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DANet | R-50-D8 | 512x512 | 80000 | 11.5 | 21.20 | 41.66 | 42.90 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_80k_ade20k/danet_r50-d8_512x512_80k_ade20k_20200615_015125-edb18e08.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_80k_ade20k/danet_r50-d8_512x512_80k_ade20k_20200615_015125.log.json) | +| DANet | R-101-D8 | 512x512 | 80000 | 15 | 14.18 | 43.64 | 45.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_80k_ade20k/danet_r101-d8_512x512_80k_ade20k_20200615_015126-d0357c73.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_80k_ade20k/danet_r101-d8_512x512_80k_ade20k_20200615_015126.log.json) | +| DANet | R-50-D8 | 512x512 | 160000 | - | - | 42.45 | 43.25 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_160k_ade20k/danet_r50-d8_512x512_160k_ade20k_20200616_082340-9cb35dcd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_160k_ade20k/danet_r50-d8_512x512_160k_ade20k_20200616_082340.log.json) | +| DANet | R-101-D8 | 512x512 | 160000 | - | - | 44.17 | 45.02 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_160k_ade20k/danet_r101-d8_512x512_160k_ade20k_20200616_082348-23bf12f9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_160k_ade20k/danet_r101-d8_512x512_160k_ade20k_20200616_082348.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DANet | R-50-D8 | 512x512 | 20000 | 6.5 | 20.94 | 74.45 | 75.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_20k_voc12aug/danet_r50-d8_512x512_20k_voc12aug_20200618_070026-9e9e3ab3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_20k_voc12aug/danet_r50-d8_512x512_20k_voc12aug_20200618_070026.log.json) | +| DANet | R-101-D8 | 512x512 | 20000 | 9.9 | 13.76 | 76.02 | 77.23 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_20k_voc12aug/danet_r101-d8_512x512_20k_voc12aug_20200618_070026-d48d23b2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_20k_voc12aug/danet_r101-d8_512x512_20k_voc12aug_20200618_070026.log.json) | +| DANet | R-50-D8 | 512x512 | 40000 | - | - | 76.37 | 77.29 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_40k_voc12aug/danet_r50-d8_512x512_40k_voc12aug_20200613_235526-426e3a64.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r50-d8_512x512_40k_voc12aug/danet_r50-d8_512x512_40k_voc12aug_20200613_235526.log.json) | +| DANet | R-101-D8 | 512x512 | 40000 | - | - | 76.51 | 77.32 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_40k_voc12aug/danet_r101-d8_512x512_40k_voc12aug_20200613_223031-788e232a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/danet/danet_r101-d8_512x512_40k_voc12aug/danet_r101-d8_512x512_40k_voc12aug_20200613_223031.log.json) | diff --git a/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py b/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3bfb9bdb3064275c2ac3bf2a057ef8eb79c308df --- /dev/null +++ b/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py b/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d80b2ec160ae1c41499d45242713a99122d8adf8 --- /dev/null +++ b/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x512_160k_ade20k.py b/configs/danet/danet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0f22d0fb6362252ac02f3f152a42997c68b90343 --- /dev/null +++ b/configs/danet/danet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py b/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..709f93cba3e3bca6ce0635457ab1823b04123bf8 --- /dev/null +++ b/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py b/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..5c623eb56836760694b50f3e4e66aa0f1fc069df --- /dev/null +++ b/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_512x512_80k_ade20k.py b/configs/danet/danet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..bd31bc8f283fe8c322ee4876deadb89569dc1743 --- /dev/null +++ b/configs/danet/danet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py b/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..597d76de79610780b03cd91dba5f3a4f10147bcd --- /dev/null +++ b/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py b/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..70f9b31966128e8d9ec37859f57a7edfd8e6d1b2 --- /dev/null +++ b/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './danet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py b/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b70c5b8d49f04661e23604ca4da56a82b1b99c9 --- /dev/null +++ b/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py b/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..03734310d7338c75d48c914cb325500961c04a79 --- /dev/null +++ b/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/danet/danet_r50-d8_512x512_160k_ade20k.py b/configs/danet/danet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..22aaf857c3212d0b36b0b04e7990616025a3ef9b --- /dev/null +++ b/configs/danet/danet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py b/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..010f86f1aac1b5c827dec29f692d137dc1c399bf --- /dev/null +++ b/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py b/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..0cef0f09bfa2290d14fc3a783ea500d6c3da2931 --- /dev/null +++ b/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/danet/danet_r50-d8_512x512_80k_ade20k.py b/configs/danet/danet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..154e84890ed73fe4813dddc8c321de6cd2854fc1 --- /dev/null +++ b/configs/danet/danet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py b/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5c5b94e5a27d7f902d4bdea7ef6c4ef0b816bb99 --- /dev/null +++ b/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py b/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c7237ae03c601204dc7c03018ca17ed363090569 --- /dev/null +++ b/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/danet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3/README.md b/configs/deeplabv3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c4994f6469051efd4881546acfcefef76616332e --- /dev/null +++ b/configs/deeplabv3/README.md @@ -0,0 +1,66 @@ +# Rethinking atrous convolution for semantic image segmentation + +## Introduction + +[ALGORITHM] + +```latext +@article{chen2017rethinking, + title={Rethinking atrous convolution for semantic image segmentation}, + author={Chen, Liang-Chieh and Papandreou, George and Schroff, Florian and Adam, Hartwig}, + journal={arXiv preprint arXiv:1706.05587}, + year={2017} +} +``` + +## Results and models + +Note: `D-8` here corresponding to the output stride 8 setting for DeepLab series. + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3 | R-50-D8 | 512x1024 | 40000 | 6.1 | 2.57 | 79.09 | 80.45 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes/deeplabv3_r50-d8_512x1024_40k_cityscapes_20200605_022449-acadc2f8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes/deeplabv3_r50-d8_512x1024_40k_cityscapes_20200605_022449.log.json) | +| DeepLabV3 | R-101-D8 | 512x1024 | 40000 | 9.6 | 1.92 | 77.12 | 79.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes/deeplabv3_r101-d8_512x1024_40k_cityscapes_20200605_012241-7fd3f799.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes/deeplabv3_r101-d8_512x1024_40k_cityscapes_20200605_012241.log.json) | +| DeepLabV3 | R-50-D8 | 769x769 | 40000 | 6.9 | 1.11 | 78.58 | 79.89 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes/deeplabv3_r50-d8_769x769_40k_cityscapes_20200606_113723-7eda553c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes/deeplabv3_r50-d8_769x769_40k_cityscapes_20200606_113723.log.json) | +| DeepLabV3 | R-101-D8 | 769x769 | 40000 | 10.9 | 0.83 | 79.27 | 80.11 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes/deeplabv3_r101-d8_769x769_40k_cityscapes_20200606_113809-c64f889f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes/deeplabv3_r101-d8_769x769_40k_cityscapes_20200606_113809.log.json) | +| DeepLabV3 | R-18-D8 | 512x1024 | 80000 | 1.7 | 13.78 | 76.70 | 78.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes/deeplabv3_r18-d8_512x1024_80k_cityscapes_20201225_021506-23dffbe2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes/deeplabv3_r18-d8_512x1024_80k_cityscapes-20201225_021506.log.json) | +| DeepLabV3 | R-50-D8 | 512x1024 | 80000 | - | - | 79.32 | 80.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes/deeplabv3_r50-d8_512x1024_80k_cityscapes_20200606_113404-b92cfdd4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes/deeplabv3_r50-d8_512x1024_80k_cityscapes_20200606_113404.log.json) | +| DeepLabV3 | R-101-D8 | 512x1024 | 80000 | - | - | 80.20 | 81.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes/deeplabv3_r101-d8_512x1024_80k_cityscapes_20200606_113503-9e428899.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes/deeplabv3_r101-d8_512x1024_80k_cityscapes_20200606_113503.log.json) | +| DeepLabV3 | R-18-D8 | 769x769 | 80000 | 1.9 | 5.55 | 76.60 | 78.26 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes/deeplabv3_r18-d8_769x769_80k_cityscapes_20201225_021506-6452126a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes/deeplabv3_r18-d8_769x769_80k_cityscapes-20201225_021506.log.json) | +| DeepLabV3 | R-50-D8 | 769x769 | 80000 | - | - | 79.89 | 81.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes/deeplabv3_r50-d8_769x769_80k_cityscapes_20200606_221338-788d6228.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes/deeplabv3_r50-d8_769x769_80k_cityscapes_20200606_221338.log.json) | +| DeepLabV3 | R-101-D8 | 769x769 | 80000 | - | - | 79.67 | 80.81 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes/deeplabv3_r101-d8_769x769_80k_cityscapes_20200607_013353-60e95418.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes/deeplabv3_r101-d8_769x769_80k_cityscapes_20200607_013353.log.json) | +| DeepLabV3 | R-101-D16-MG124 | 512x1024 | 40000 | 4.7 | - 6.96 | 76.71 | 78.63 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes_20200908_005644-67b0c992.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes-20200908_005644.log.json) | +| DeepLabV3 | R-101-D16-MG124 | 512x1024 | 80000 | - | - | 78.36 | 79.84 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes_20200908_005644-57bb8425.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes-20200908_005644.log.json) | +| DeepLabV3 | R-18b-D8 | 512x1024 | 80000 | 1.6 | 13.93 | 76.26 | 77.88 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes/deeplabv3_r18b-d8_512x1024_80k_cityscapes_20201225_094144-46040cef.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes/deeplabv3_r18b-d8_512x1024_80k_cityscapes-20201225_094144.log.json) | +| DeepLabV3 | R-50b-D8 | 512x1024 | 80000 | 6.0 | 2.74 | 79.63 | 80.98 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes/deeplabv3_r50b-d8_512x1024_80k_cityscapes_20201225_155148-ec368954.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes/deeplabv3_r50b-d8_512x1024_80k_cityscapes-20201225_155148.log.json) | +| DeepLabV3 | R-101b-D8| 512x1024 | 80000 | 9.5 | 1.81 | 80.01 | 81.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes/deeplabv3_r101b-d8_512x1024_80k_cityscapes_20201226_171821-8fd49503.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes/deeplabv3_r101b-d8_512x1024_80k_cityscapes-20201226_171821.log.json) | +| DeepLabV3 | R-18b-D8 | 769x769 | 80000 | 1.8 | 5.79 | 76.63 | 77.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes/deeplabv3_r18b-d8_769x769_80k_cityscapes_20201225_094144-fdc985d9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes/deeplabv3_r18b-d8_769x769_80k_cityscapes-20201225_094144.log.json) | +| DeepLabV3 | R-50b-D8 | 769x769 | 80000 | 6.8 | 1.16 | 78.80 | 80.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes/deeplabv3_r50b-d8_769x769_80k_cityscapes_20201225_155404-87fb0cf4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes/deeplabv3_r50b-d8_769x769_80k_cityscapes-20201225_155404.log.json) | +| DeepLabV3 | R-101b-D8| 769x769 | 80000 | 10.7 | 0.82 | 79.41 | 80.73 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes/deeplabv3_r101b-d8_769x769_80k_cityscapes_20201226_190843-9142ee57.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes/deeplabv3_r101b-d8_769x769_80k_cityscapes-20201226_190843.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3 | R-50-D8 | 512x512 | 80000 | 8.9 | 14.76 | 42.42 | 43.28 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k/deeplabv3_r50-d8_512x512_80k_ade20k_20200614_185028-0bb3f844.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k/deeplabv3_r50-d8_512x512_80k_ade20k_20200614_185028.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 80000 | 12.4 | 10.14 | 44.08 | 45.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k/deeplabv3_r101-d8_512x512_80k_ade20k_20200615_021256-d89c7fa4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k/deeplabv3_r101-d8_512x512_80k_ade20k_20200615_021256.log.json) | +| DeepLabV3 | R-50-D8 | 512x512 | 160000 | - | - | 42.66 | 44.09 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k/deeplabv3_r50-d8_512x512_160k_ade20k_20200615_123227-5d0ee427.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k/deeplabv3_r50-d8_512x512_160k_ade20k_20200615_123227.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 160000 | - | - | 45.00 | 46.66 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k/deeplabv3_r101-d8_512x512_160k_ade20k_20200615_105816-b1f72b3b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k/deeplabv3_r101-d8_512x512_160k_ade20k_20200615_105816.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3 | R-50-D8 | 512x512 | 20000 | 6.1 | 13.88 | 76.17 | 77.42 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug/deeplabv3_r50-d8_512x512_20k_voc12aug_20200617_010906-596905ef.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug/deeplabv3_r50-d8_512x512_20k_voc12aug_20200617_010906.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 20000 | 9.6 | 9.81 | 78.70 | 79.95 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug/deeplabv3_r101-d8_512x512_20k_voc12aug_20200617_010932-8d13832f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug/deeplabv3_r101-d8_512x512_20k_voc12aug_20200617_010932.log.json) | +| DeepLabV3 | R-50-D8 | 512x512 | 40000 | - | - | 77.68 | 78.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug/deeplabv3_r50-d8_512x512_40k_voc12aug_20200613_161546-2ae96e7e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug/deeplabv3_r50-d8_512x512_40k_voc12aug_20200613_161546.log.json) | +| DeepLabV3 | R-101-D8 | 512x512 | 40000 | - | - | 77.92 | 79.18 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug/deeplabv3_r101-d8_512x512_40k_voc12aug_20200613_161432-0017d784.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug/deeplabv3_r101-d8_512x512_40k_voc12aug_20200613_161432.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3 | R-101-D8 | 480x480 | 40000 | 9.2 | 7.09 | 46.55 | 47.81 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context/deeplabv3_r101-d8_480x480_40k_pascal_context_20200911_204118-1aa27336.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context/deeplabv3_r101-d8_480x480_40k_pascal_context-20200911_204118.log.json) | +| DeepLabV3 | R-101-D8 | 480x480 | 80000 | - | - | 46.42 | 47.53 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context/deeplabv3_r101-d8_480x480_80k_pascal_context_20200911_170155-2a21fff3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context/deeplabv3_r101-d8_480x480_80k_pascal_context-20200911_170155.log.json) | diff --git a/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f20f260e23a95dfee9dfdceef9badab992246f53 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3_r50-d8_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..de4a8a5e9f030f1e8a8802596885186163f23eed --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py b/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0b5256f7b7b053cbe8d9e4ca2ec6139bb02387f6 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_480x480_40k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py b/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..001b7a69c15299fc1fe5b269a5accf92c5ece032 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_480x480_80k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8c707c79d659bc544d242352bcb29686eb40b004 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6804a5781369d1031f179d421a3b5a160fd575d3 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py b/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..df6f36ef7c3b71ba7979aa7a1b226b3e3ebd9bb4 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py b/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..40f5f62373e59d1c6c01ca3f57777698461127c9 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py b/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..fb2be22f8bc2e10cdfba4f58b2ad1ced913b4ea4 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py b/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..796ba3fb142394c4d93a29ba57548dca59d8d02b --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e6d58a67b3b4dddf3da42efca30fa599e623f183 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..13094a98ee9be3cf8c88370e1e111cb4dde03ec4 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5186bf614bc9ebffe47323ea61afbc9604be265b --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d185db95adc61734f11f0dcd7b6c45aa652680b0 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e084e95c70b0b7b0c9dcc3388d6b7d3d51d54b6d --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a990c076536ad9455a9203f5b6a60157f2f2f99f --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b25e725ed98324e6ea648567740dc67e0413b4f9 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fd920f0ca7c690d3d1c44f5f7be1cbea18fa14d4 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py b/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..9d493ef527bb161be98d0e4ea433104b3bb9ff48 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py b/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..71a0fda48aa2538e4d913e73e94a71564377ea50 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8e7420d24a20b662286266cac58cab4721dc8df3 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..132787db98d3fc9df5ed62e31738c82da8c279bf --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py b/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..b4a9d4e1b9123b3c965cd430237ce9fcc7018a11 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py b/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f62da1a8090da389a77d77a9887926af2a7ded49 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py b/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..492bd3dfdce331070cb9645dbe55142e9b662da1 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py b/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..78f4d0d9de3d6b8dd2b097531317956d8e3b19f1 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e35d1988f0bb7ad47a73ef1a64b73d9b40e0ba40 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..dd7c16580d0620bc854f2c6eb7c881bdcd23020a --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e742d9a5ec2b6addf829cb802de27ea1afd53301 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..332d9cfb79fb698c7867f0f80053c1fd29bf2c1d --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/deeplabv3plus/README.md b/configs/deeplabv3plus/README.md new file mode 100644 index 0000000000000000000000000000000000000000..dc02660428fe534605ae3bf9659382c282379a4e --- /dev/null +++ b/configs/deeplabv3plus/README.md @@ -0,0 +1,68 @@ +# Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{deeplabv3plus2018, + title={Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation}, + author={Liang-Chieh Chen and Yukun Zhu and George Papandreou and Florian Schroff and Hartwig Adam}, + booktitle={ECCV}, + year={2018} +} +``` + +## Results and models + +Note: +`D-8`/`D-16` here corresponding to the output stride 8/16 setting for DeepLab series. +`MG-124` stands for multi-grid dilation in the last stage of ResNet. + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3+ | R-50-D8 | 512x1024 | 40000 | 7.5 | 3.94 | 79.61 | 81.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes/deeplabv3plus_r50-d8_512x1024_40k_cityscapes_20200605_094610-d222ffcd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes/deeplabv3plus_r50-d8_512x1024_40k_cityscapes_20200605_094610.log.json) | +| DeepLabV3+ | R-101-D8 | 512x1024 | 40000 | 11 | 2.60 | 80.21 | 81.82 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes/deeplabv3plus_r101-d8_512x1024_40k_cityscapes_20200605_094614-3769eecf.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes/deeplabv3plus_r101-d8_512x1024_40k_cityscapes_20200605_094614.log.json) | +| DeepLabV3+ | R-50-D8 | 769x769 | 40000 | 8.5 | 1.72 | 78.97 | 80.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes/deeplabv3plus_r50-d8_769x769_40k_cityscapes_20200606_114143-1dcb0e3c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes/deeplabv3plus_r50-d8_769x769_40k_cityscapes_20200606_114143.log.json) | +| DeepLabV3+ | R-101-D8 | 769x769 | 40000 | 12.5 | 1.15 | 79.46 | 80.50 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes/deeplabv3plus_r101-d8_769x769_40k_cityscapes_20200606_114304-ff414b9e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes/deeplabv3plus_r101-d8_769x769_40k_cityscapes_20200606_114304.log.json) | +| DeepLabV3+ | R-18-D8 | 512x1024 | 80000 | 2.2 | 14.27 | 76.89 | 78.76 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes/deeplabv3plus_r18-d8_512x1024_80k_cityscapes_20201226_080942-cff257fe.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes/deeplabv3plus_r18-d8_512x1024_80k_cityscapes-20201226_080942.log.json) | +| DeepLabV3+ | R-50-D8 | 512x1024 | 80000 | - | - | 80.09 | 81.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes/deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049-f9fb496d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes/deeplabv3plus_r50-d8_512x1024_80k_cityscapes_20200606_114049.log.json) | +| DeepLabV3+ | R-101-D8 | 512x1024 | 80000 | - | - | 80.97 | 82.03 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143-068fcfe9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_cityscapes_20200606_114143.log.json) | +| DeepLabV3+ | R-18-D8 | 769x769 | 80000 | 2.5 | 5.74 | 76.26 | 77.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes/deeplabv3plus_r18-d8_769x769_80k_cityscapes_20201226_083346-f326e06a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes/deeplabv3plus_r18-d8_769x769_80k_cityscapes-20201226_083346.log.json) | +| DeepLabV3+ | R-50-D8 | 769x769 | 80000 | - | - | 79.83 | 81.48 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes/deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233-0e9dfdc4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes/deeplabv3plus_r50-d8_769x769_80k_cityscapes_20200606_210233.log.json) | +| DeepLabV3+ | R-101-D8 | 769x769 | 80000 | - | - | 80.98 | 82.18 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes/deeplabv3plus_r101-d8_769x769_80k_cityscapes_20200607_000405-a7573d20.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes/deeplabv3plus_r101-d8_769x769_80k_cityscapes_20200607_000405.log.json) | +| DeepLabV3+ | R-101-D16-MG124 | 512x1024 | 40000 | 5.8 | 7.48 | 79.09 | 80.36 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes_20200908_005644-cf9ce186.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes-20200908_005644.log.json) | +| DeepLabV3+ | R-101-D16-MG124 | 512x1024 | 80000 | 9.9 | - | 79.90 | 81.33 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes_20200908_005644-ee6158e0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes-20200908_005644.log.json) | +| DeepLabV3+ | R-18b-D8 | 512x1024 | 80000 | 2.1 | 14.95 | 75.87 | 77.52 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes_20201226_090828-e451abd9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes-20201226_090828.log.json) | +| DeepLabV3+ | R-50b-D8 | 512x1024 | 80000 | 7.4 | 3.94 | 80.28 | 81.44 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes_20201225_213645-a97e4e43.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes-20201225_213645.log.json) | +| DeepLabV3+ | R-101b-D8| 512x1024 | 80000 | 10.9 | 2.60 | 80.16 | 81.41 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes_20201226_190843-9c3c93a4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes-20201226_190843.log.json) | +| DeepLabV3+ | R-18b-D8 | 769x769 | 80000 | 2.4 | 5.96 | 76.36 | 78.24 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes/deeplabv3plus_r18b-d8_769x769_80k_cityscapes_20201226_151312-2c868aff.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes/deeplabv3plus_r18b-d8_769x769_80k_cityscapes-20201226_151312.log.json) | +| DeepLabV3+ | R-50b-D8 | 769x769 | 80000 | 8.4 | 1.72 | 79.41 | 80.56 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes/deeplabv3plus_r50b-d8_769x769_80k_cityscapes_20201225_224655-8b596d1c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes/deeplabv3plus_r50b-d8_769x769_80k_cityscapes-20201225_224655.log.json) | +| DeepLabV3+ | R-101b-D8| 769x769 | 80000 | 12.3 | 1.10 | 79.88 | 81.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes/deeplabv3plus_r101b-d8_769x769_80k_cityscapes_20201226_205041-227cdf7c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes/deeplabv3plus_r101b-d8_769x769_80k_cityscapes-20201226_205041.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3+ | R-50-D8 | 512x512 | 80000 | 10.6 | 21.01 | 42.72 | 43.75 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k/deeplabv3plus_r50-d8_512x512_80k_ade20k_20200614_185028-bf1400d8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k/deeplabv3plus_r50-d8_512x512_80k_ade20k_20200614_185028.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 80000 | 14.1 | 14.16 | 44.60 | 46.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k/deeplabv3plus_r101-d8_512x512_80k_ade20k_20200615_014139-d5730af7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k/deeplabv3plus_r101-d8_512x512_80k_ade20k_20200615_014139.log.json) | +| DeepLabV3+ | R-50-D8 | 512x512 | 160000 | - | - | 43.95 | 44.93 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k/deeplabv3plus_r50-d8_512x512_160k_ade20k_20200615_124504-6135c7e0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k/deeplabv3plus_r50-d8_512x512_160k_ade20k_20200615_124504.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 160000 | - | - | 45.47 | 46.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k/deeplabv3plus_r101-d8_512x512_160k_ade20k_20200615_123232-38ed86bb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k/deeplabv3plus_r101-d8_512x512_160k_ade20k_20200615_123232.log.json) | + +#### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3+ | R-50-D8 | 512x512 | 20000 | 7.6 | 21 | 75.93 | 77.50 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug/deeplabv3plus_r50-d8_512x512_20k_voc12aug_20200617_102323-aad58ef1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug/deeplabv3plus_r50-d8_512x512_20k_voc12aug_20200617_102323.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 20000 | 11 | 13.88 | 77.22 | 78.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug/deeplabv3plus_r101-d8_512x512_20k_voc12aug_20200617_102345-c7ff3d56.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug/deeplabv3plus_r101-d8_512x512_20k_voc12aug_20200617_102345.log.json) | +| DeepLabV3+ | R-50-D8 | 512x512 | 40000 | - | - | 76.81 | 77.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug/deeplabv3plus_r50-d8_512x512_40k_voc12aug_20200613_161759-e1b43aa9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug/deeplabv3plus_r50-d8_512x512_40k_voc12aug_20200613_161759.log.json) | +| DeepLabV3+ | R-101-D8 | 512x512 | 40000 | - | - | 78.62 | 79.53 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug/deeplabv3plus_r101-d8_512x512_40k_voc12aug_20200613_205333-faf03387.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug/deeplabv3plus_r101-d8_512x512_40k_voc12aug_20200613_205333.log.json) | + +#### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DeepLabV3+ | R-101-D8 | 480x480 | 40000 | - | 9.09 | 47.30 | 48.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context/deeplabv3plus_r101-d8_480x480_40k_pascal_context_20200911_165459-d3c8a29e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context/deeplabv3plus_r101-d8_480x480_40k_pascal_context-20200911_165459.log.json) | +| DeepLabV3+ | R-101-D8 | 480x480 | 80000 | - | - | 47.23 | 48.26 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context/deeplabv3plus_r101-d8_480x480_80k_pascal_context_20200911_155322-145d3ee8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context/deeplabv3plus_r101-d8_480x480_80k_pascal_context-20200911_155322.log.json) | diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..bf39d2f12b719b1c91e38bef71f0f5232543b0dc --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c53ec41baf9043029549b4893b2380372ea5ecd9 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet101_v1c', + backbone=dict( + depth=101, + dilations=(1, 1, 1, 2), + strides=(1, 2, 2, 1), + multi_grid=(1, 2, 4)), + decode_head=dict( + dilations=(1, 6, 12, 18), + sampler=dict(type='OHEMPixelSampler', min_kept=100000))) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..68e2b072e4b8d076e8c3e929dfdc73bcd24ce859 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_480x480_40k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..3a46c28608add5325ec1decf33624c3c00bff1d7 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_480x480_80k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6ce85aea5a960e76f8154a5319c7c52e98c4c45 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0ebbd3c70ee5e33c6ef4ae76b6c6a6ce828d07b4 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a75c9d3019b13d01c0dd13dae53bce3d15791d52 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ebb1a8eaee16de7443ab3e79e02a37340de511d7 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..3caa6cf8ae61d467628378d99a919c9db1253b91 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..53fd3a909585367ca59eb827c2fbbab4cdf234ea --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c3c92eb26f8fead94f5ad7ac7d7fb60d92c57114 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5ea9cdb5b639e5284cd46e02ce1b67b4729950f7 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..398d9759cafc1d01e78c138abd249808531a97b9 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..136449083f7a9efbad6df94f1acd04170147aaba --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..aff70c93e6142ddda3a874d9dfd57ec6c4cd89b3 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0172d9a87d6dc1c75bf75a9c48363eb985d389a8 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b90b292b03a80aa37b8ca236746cf7cddc4ac27e --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b49da3581d9697e726e114b1564fc58a55ef1099 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..318845de1e2124a4dff3348749ec5a13d78d686f --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..1736c2397a9b2a4b4fb12eee8175e5ee98eaf805 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), + auxiliary_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7243d0390f6394fdd528c881bb128b2c13d08037 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3304d3677f5357f1a3e343b39fcd97b238abdb5e --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1491e3b8247c9d163d6016caf2fcd8043a053b7e --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1056ad4d1e2a4f956d12f6daf506620fab27dd17 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..e36c83ba601884b81c06ee69445a94e76224c828 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..352d870bc8eab11974640c4b2d9c80dc6fbbaaf2 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e4bda3eded693bfd44a8c86ced7ae6ee9963c583 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1420b97a4bd0dc0f5451623697666012a2de635c --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..dd8e1da9c7b1d86bc8a0c834bbede9d0fd40acf5 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py b/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c0ba019136c2e4f33b015be3d82505bee2066655 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/dmnet/README.md b/configs/dmnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9b12c8d862fb7b7633c5b2f4a1c357803abdcd32 --- /dev/null +++ b/configs/dmnet/README.md @@ -0,0 +1,39 @@ +# Dynamic Multi-scale Filters for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@InProceedings{He_2019_ICCV, +author = {He, Junjun and Deng, Zhongying and Qiao, Yu}, +title = {Dynamic Multi-Scale Filters for Semantic Segmentation}, +booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, +month = {October}, +year = {2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DMNet | R-50-D8 | 512x1024 | 40000 | 7.0 | 3.66 | 77.78 | 79.14 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes/dmnet_r50-d8_512x1024_40k_cityscapes_20201214_115717-5e88fa33.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes/dmnet_r50-d8_512x1024_40k_cityscapes-20201214_115717.log.json) | +| DMNet | R-101-D8 | 512x1024 | 40000 | 10.6 | 2.54 | 78.37 | 79.72 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes/dmnet_r101-d8_512x1024_40k_cityscapes_20201214_115716-abc9d111.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes/dmnet_r101-d8_512x1024_40k_cityscapes-20201214_115716.log.json) | +| DMNet | R-50-D8 | 769x769 | 40000 | 7.9 | 1.57 | 78.49 | 80.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_40k_cityscapes/dmnet_r50-d8_769x769_40k_cityscapes_20201214_115717-2a2628d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_40k_cityscapes/dmnet_r50-d8_769x769_40k_cityscapes-20201214_115717.log.json) | +| DMNet | R-101-D8 | 769x769 | 40000 | 12.0 | 1.01 | 77.62 | 78.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_40k_cityscapes/dmnet_r101-d8_769x769_40k_cityscapes_20201214_115718-b650de90.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_40k_cityscapes/dmnet_r101-d8_769x769_40k_cityscapes-20201214_115718.log.json) | +| DMNet | R-50-D8 | 512x1024 | 80000 | - | - | 79.07 | 80.22 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes/dmnet_r50-d8_512x1024_80k_cityscapes_20201214_115716-987f51e3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes/dmnet_r50-d8_512x1024_80k_cityscapes-20201214_115716.log.json) | +| DMNet | R-101-D8 | 512x1024 | 80000 | - | - | 79.64 | 80.67 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes/dmnet_r101-d8_512x1024_80k_cityscapes_20201214_115705-b1ff208a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes/dmnet_r101-d8_512x1024_80k_cityscapes-20201214_115705.log.json) | +| DMNet | R-50-D8 | 769x769 | 80000 | - | - | 79.22 | 80.55 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_80k_cityscapes/dmnet_r50-d8_769x769_80k_cityscapes_20201214_115718-7ea9fa12.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_769x769_80k_cityscapes/dmnet_r50-d8_769x769_80k_cityscapes-20201214_115718.log.json) | +| DMNet | R-101-D8 | 769x769 | 80000 | - | - | 79.19 | 80.65 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_80k_cityscapes/dmnet_r101-d8_769x769_80k_cityscapes_20201214_115716-a7fbc2ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_769x769_80k_cityscapes/dmnet_r101-d8_769x769_80k_cityscapes-20201214_115716.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DMNet | R-50-D8 | 512x512 | 80000 | 9.4 | 20.95 | 42.37 | 43.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_80k_ade20k/dmnet_r50-d8_512x512_80k_ade20k_20201214_115705-a8626293.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_80k_ade20k/dmnet_r50-d8_512x512_80k_ade20k-20201214_115705.log.json) | +| DMNet | R-101-D8 | 512x512 | 80000 | 13.0 | 13.88 | 45.34 | 46.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_80k_ade20k/dmnet_r101-d8_512x512_80k_ade20k_20201214_115704-c656c3fb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_80k_ade20k/dmnet_r101-d8_512x512_80k_ade20k-20201214_115704.log.json) | +| DMNet | R-50-D8 | 512x512 | 160000 | - | - | 43.15 | 44.17 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_160k_ade20k/dmnet_r50-d8_512x512_160k_ade20k_20201214_115706-25fb92c2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r50-d8_512x512_160k_ade20k/dmnet_r50-d8_512x512_160k_ade20k-20201214_115706.log.json) | +| DMNet | R-101-D8 | 512x512 | 160000 | - | - | 45.42 | 46.76 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_160k_ade20k/dmnet_r101-d8_512x512_160k_ade20k_20201214_115705-73f9a8d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dmnet/dmnet_r101-d8_512x512_160k_ade20k/dmnet_r101-d8_512x512_160k_ade20k-20201214_115705.log.json) | diff --git a/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py b/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fd6897691d3f8f200783fae7bfe231735f25a11b --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py b/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..116cbdcede32bf24ad95f04291e98754011172c9 --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py b/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..d78d46c040f75d16225307d4b4151b87e6e3db29 --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py b/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9713b731a47df9c5e23d26a08ad17d03a0d5e9fe --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py b/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6b222e730073dd42df618db5660ee9d4117f3956 --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py b/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f36d490e9c9b31de7eedf735d2712e55f35db998 --- /dev/null +++ b/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dmnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py b/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1f9a917fa4223bd2428f2b2d10eac446f7ecc71a --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py b/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b38f90dc4318f23d32971e7afbf90a327768f2d --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py b/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a8fbd9beb11f3d1308ce2cd12da2a177c2d39478 --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py b/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..74f6d6a85a06e96580a3c8d5843f660c85bca5ad --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py b/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..19841547a42315164de547a4121cfd64739cf24b --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py b/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..31d95f96eb10025c2ad054cde4c81f47db21f0f2 --- /dev/null +++ b/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/dmnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/dnlnet/README.md b/configs/dnlnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..172dfe1a0f07646c5f8cc47ddd62f5cb6da85a55 --- /dev/null +++ b/configs/dnlnet/README.md @@ -0,0 +1,42 @@ +# Disentangled Non-Local Neural Networks + +## Introduction + +[ALGORITHM] + +This example is to reproduce ["Disentangled Non-Local Neural Networks"](https://arxiv.org/abs/2006.06668) for semantic segmentation. It is still in progress. + +## Citation + +```latex +@misc{yin2020disentangled, + title={Disentangled Non-Local Neural Networks}, + author={Minghao Yin and Zhuliang Yao and Yue Cao and Xiu Li and Zheng Zhang and Stephen Lin and Han Hu}, + year={2020}, + booktitle={ECCV} +} +``` + +## Results and models (in progress) + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| dnl | R-50-D8 | 512x1024 | 40000 | 7.3 | 2.56 | 78.61 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes/dnl_r50-d8_512x1024_40k_cityscapes_20200904_233629-53d4ea93.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes/dnl_r50-d8_512x1024_40k_cityscapes-20200904_233629.log.json) | +| dnl | R-101-D8 | 512x1024 | 40000 | 10.9 | 1.96 | 78.31 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes/dnl_r101-d8_512x1024_40k_cityscapes_20200904_233629-9928ffef.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes/dnl_r101-d8_512x1024_40k_cityscapes-20200904_233629.log.json) | +| dnl | R-50-D8 | 769x769 | 40000 | 9.2 | 1.50 | 78.44 | 80.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_40k_cityscapes/dnl_r50-d8_769x769_40k_cityscapes_20200820_232206-0f283785.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_40k_cityscapes/dnl_r50-d8_769x769_40k_cityscapes-20200820_232206.log.json) | +| dnl | R-101-D8 | 769x769 | 40000 | 12.6 | 1.02 | 76.39 | 77.77 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_40k_cityscapes/dnl_r101-d8_769x769_40k_cityscapes_20200820_171256-76c596df.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_40k_cityscapes/dnl_r101-d8_769x769_40k_cityscapes-20200820_171256.log.json) | +| dnl | R-50-D8 | 512x1024 | 80000 | - | - | 79.33 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes/dnl_r50-d8_512x1024_80k_cityscapes_20200904_233629-58b2f778.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes/dnl_r50-d8_512x1024_80k_cityscapes-20200904_233629.log.json) | +| dnl | R-101-D8 | 512x1024 | 80000 | - | - | 80.41 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes/dnl_r101-d8_512x1024_80k_cityscapes_20200904_233629-758e2dd4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes/dnl_r101-d8_512x1024_80k_cityscapes-20200904_233629.log.json) | +| dnl | R-50-D8 | 769x769 | 80000 | - | - | 79.36 | 80.70 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_80k_cityscapes/dnl_r50-d8_769x769_80k_cityscapes_20200820_011925-366bc4c7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_769x769_80k_cityscapes/dnl_r50-d8_769x769_80k_cityscapes-20200820_011925.log.json) | +| dnl | R-101-D8 | 769x769 | 80000 | - | - | 79.41 | 80.68 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_80k_cityscapes/dnl_r101-d8_769x769_80k_cityscapes_20200821_051111-95ff84ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_769x769_80k_cityscapes/dnl_r101-d8_769x769_80k_cityscapes-20200821_051111.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DNL | R-50-D8 | 512x512 | 80000 | 8.8 | 20.66 | 41.76 | 42.99 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_80k_ade20k/dnl_r50-d8_512x512_80k_ade20k_20200826_183354-1cf6e0c1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_80k_ade20k/dnl_r50-d8_512x512_80k_ade20k-20200826_183354.log.json) | +| DNL | R-101-D8 | 512x512 | 80000 | 12.8 | 12.54 | 43.76 | 44.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_80k_ade20k/dnl_r101-d8_512x512_80k_ade20k_20200826_183354-d820d6ea.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_80k_ade20k/dnl_r101-d8_512x512_80k_ade20k-20200826_183354.log.json) | +| DNL | R-50-D8 | 512x512 | 160000 | - | - | 41.87 | 43.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_160k_ade20k/dnl_r50-d8_512x512_160k_ade20k_20200826_183350-37837798.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r50-d8_512x512_160k_ade20k/dnl_r50-d8_512x512_160k_ade20k-20200826_183350.log.json) | +| DNL | R-101-D8 | 512x512 | 160000 | - | - | 44.25 | 45.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_160k_ade20k/dnl_r101-d8_512x512_160k_ade20k_20200826_183350-ed522c61.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/dnlnet/dnl_r101-d8_512x512_160k_ade20k/dnl_r101-d8_512x512_160k_ade20k-20200826_183350.log.json) | diff --git a/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py b/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1a36e3c80a13f91e37e4d90b7ae47c7e0d204144 --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py b/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0f2e1b6da7e63841f4429b1caed5fbe9d537c4f8 --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py b/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..aca44e478b67d5a226681c099e64fe67d93cf39b --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py b/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ebd27a1d1c6bf0e983fafed2e5659701dadb8f24 --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py b/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..575e9d01343a4563e0d3ba89b361ea8e358d2dee --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py b/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4f1b9e19411eb963d16fd2a8174529e69ecd5a1a --- /dev/null +++ b/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './dnl_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py b/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f7aa7444d4c8022563db642478beec4dc5ab0dab --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py b/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fdff93f543af6bac93949e68532daea45e437167 --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py b/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5305689d09b944f6e37aa85567ce3f29fc6974a7 --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py b/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..09604c39729abfc9015eb971069b987c8d8a82cb --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py b/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0666199b63e604b09fe8187c378589c25d0d311b --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py b/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f7b07c4f47629c07faa013b9d1eae3462d898c6f --- /dev/null +++ b/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/dnl_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) +optimizer = dict( + paramwise_cfg=dict( + custom_keys=dict(theta=dict(wd_mult=0.), phi=dict(wd_mult=0.)))) diff --git a/configs/emanet/README.md b/configs/emanet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..40df946ed446cf862847dad084324412e5aa52ee --- /dev/null +++ b/configs/emanet/README.md @@ -0,0 +1,26 @@ +# Expectation-Maximization Attention Networks for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{li2019expectation, + title={Expectation-maximization attention networks for semantic segmentation}, + author={Li, Xia and Zhong, Zhisheng and Wu, Jianlong and Yang, Yibo and Lin, Zhouchen and Liu, Hong}, + booktitle={Proceedings of the IEEE International Conference on Computer Vision}, + pages={9167--9176}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| EMANet | R-50-D8 | 512x1024 | 80000 | 5.4 | 4.58 | 77.59 | 79.44 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_512x1024_80k_cityscapes/emanet_r50-d8_512x1024_80k_cityscapes_20200901_100301-c43fcef1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_512x1024_80k_cityscapes/emanet_r50-d8_512x1024_80k_cityscapes-20200901_100301.log.json) | +| EMANet | R-101-D8 | 512x1024 | 80000 | 6.2 | 2.87 | 79.10 | 81.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_512x1024_80k_cityscapes/emanet_r101-d8_512x1024_80k_cityscapes_20200901_100301-2d970745.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_512x1024_80k_cityscapes/emanet_r101-d8_512x1024_80k_cityscapes-20200901_100301.log.json) | +| EMANet | R-50-D8 | 769x769 | 80000 | 8.9 | 1.97 | 79.33 | 80.49 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_769x769_80k_cityscapes/emanet_r50-d8_769x769_80k_cityscapes_20200901_100301-16f8de52.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r50-d8_769x769_80k_cityscapes/emanet_r50-d8_769x769_80k_cityscapes-20200901_100301.log.json) | +| EMANet | R-101-D8 | 769x769 | 80000 | 10.1 | 1.22 | 79.62 | 81.00 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_769x769_80k_cityscapes/emanet_r101-d8_769x769_80k_cityscapes_20200901_100301-47a324ce.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/emanet/emanet_r101-d8_769x769_80k_cityscapes/emanet_r101-d8_769x769_80k_cityscapes-20200901_100301.log.json) | diff --git a/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py b/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..58f28b43f55f54c7a604960735963e6b7c13b6f1 --- /dev/null +++ b/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './emanet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py b/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c5dbf20b0fcc7bc1dd077bd8b7077772251d4c1a --- /dev/null +++ b/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './emanet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py b/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..73b7788bf924be2e1588596a88f0155ddc37358e --- /dev/null +++ b/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/emanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py b/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..699aa212c3518901b2f84db3f062c16b023c7538 --- /dev/null +++ b/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/emanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/encnet/README.md b/configs/encnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6ba42f69fae5e52254b34195b6cd0ed689c5bf6c --- /dev/null +++ b/configs/encnet/README.md @@ -0,0 +1,39 @@ +# Context Encoding for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@InProceedings{Zhang_2018_CVPR, +author = {Zhang, Hang and Dana, Kristin and Shi, Jianping and Zhang, Zhongyue and Wang, Xiaogang and Tyagi, Ambrish and Agrawal, Amit}, +title = {Context Encoding for Semantic Segmentation}, +booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, +month = {June}, +year = {2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| encnet | R-50-D8 | 512x1024 | 40000 | 8.6 | 4.58 | 75.67 | 77.08 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_40k_cityscapes/encnet_r50-d8_512x1024_40k_cityscapes_20200621_220958-68638a47.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_40k_cityscapes/encnet_r50-d8_512x1024_40k_cityscapes-20200621_220958.log.json) | +| encnet | R-101-D8 | 512x1024 | 40000 | 12.1 | 2.66 | 75.81 | 77.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_40k_cityscapes/encnet_r101-d8_512x1024_40k_cityscapes_20200621_220933-35e0a3e8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_40k_cityscapes/encnet_r101-d8_512x1024_40k_cityscapes-20200621_220933.log.json) | +| encnet | R-50-D8 | 769x769 | 40000 | 9.8 | 1.82 | 76.24 | 77.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_40k_cityscapes/encnet_r50-d8_769x769_40k_cityscapes_20200621_220958-3bcd2884.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_40k_cityscapes/encnet_r50-d8_769x769_40k_cityscapes-20200621_220958.log.json) | +| encnet | R-101-D8 | 769x769 | 40000 | 13.7 | 1.26 | 74.25 | 76.25 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_40k_cityscapes/encnet_r101-d8_769x769_40k_cityscapes_20200621_220933-2fafed55.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_40k_cityscapes/encnet_r101-d8_769x769_40k_cityscapes-20200621_220933.log.json) | +| encnet | R-50-D8 | 512x1024 | 80000 | - | - | 77.94 | 79.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_80k_cityscapes/encnet_r50-d8_512x1024_80k_cityscapes_20200622_003554-fc5c5624.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x1024_80k_cityscapes/encnet_r50-d8_512x1024_80k_cityscapes-20200622_003554.log.json) | +| encnet | R-101-D8 | 512x1024 | 80000 | - | - | 78.55 | 79.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_80k_cityscapes/encnet_r101-d8_512x1024_80k_cityscapes_20200622_003555-1de64bec.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x1024_80k_cityscapes/encnet_r101-d8_512x1024_80k_cityscapes-20200622_003555.log.json) | +| encnet | R-50-D8 | 769x769 | 80000 | - | - | 77.44 | 78.72 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_80k_cityscapes/encnet_r50-d8_769x769_80k_cityscapes_20200622_003554-55096dcb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_769x769_80k_cityscapes/encnet_r50-d8_769x769_80k_cityscapes-20200622_003554.log.json) | +| encnet | R-101-D8 | 769x769 | 80000 | - | - | 76.10 | 76.97 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_80k_cityscapes/encnet_r101-d8_769x769_80k_cityscapes_20200622_003555-470ef79d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_769x769_80k_cityscapes/encnet_r101-d8_769x769_80k_cityscapes-20200622_003555.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| encnet | R-50-D8 | 512x512 | 80000 | 10.1 | 22.81 | 39.53 | 41.17 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_80k_ade20k/encnet_r50-d8_512x512_80k_ade20k_20200622_042412-44b46b04.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_80k_ade20k/encnet_r50-d8_512x512_80k_ade20k-20200622_042412.log.json) | +| encnet | R-101-D8 | 512x512 | 80000 | 13.6 | 14.87 | 42.11 | 43.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_80k_ade20k/encnet_r101-d8_512x512_80k_ade20k_20200622_101128-dd35e237.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_80k_ade20k/encnet_r101-d8_512x512_80k_ade20k-20200622_101128.log.json) | +| encnet | R-50-D8 | 512x512 | 160000 | - | - | 40.10 | 41.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_160k_ade20k/encnet_r50-d8_512x512_160k_ade20k_20200622_101059-b2db95e0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r50-d8_512x512_160k_ade20k/encnet_r50-d8_512x512_160k_ade20k-20200622_101059.log.json) | +| encnet | R-101-D8 | 512x512 | 160000 | - | - | 42.61 | 44.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_160k_ade20k/encnet_r101-d8_512x512_160k_ade20k_20200622_073348-7989641f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/encnet/encnet_r101-d8_512x512_160k_ade20k/encnet_r101-d8_512x512_160k_ade20k-20200622_073348.log.json) | diff --git a/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py b/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f34373d9ebab5ef6f4c01e3eab8a97c288495be0 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py b/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0b0207b3144460d25229e3ac4c4d0d9fc1d34292 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py b/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8fec6ba255f33d48a66a831de4571346a7a2bd2e --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py b/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..c264af998b5ef6a9e521db204205fb998cce68a9 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py b/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..8a6968ea583758191fa8e94497c7186e653c7afb --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py b/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..94151004ea88394373cf8f135b065d5056b11179 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py b/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6ade67b76ce04e1ede3ff99aab4863705cff446 --- /dev/null +++ b/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py b/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..55648c08b2c4eb78d7d5ae65482e5e5b291c058a --- /dev/null +++ b/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './encnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py b/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4ea6ed0e84f3aa7d2c7acd8dd5c459a8cd3ce45c --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py b/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d2feeef7e982550481365f8187cb1a50f0fafcc9 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py b/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..2a5dc203cc793860aae7743d16c4fb9a564ad1d8 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py b/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..9cb7952cede58165d2ed0f35d2208ad1ffb65232 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py b/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..81f3cbfbf516e833821c49deecd8f167170021f0 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py b/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..835375cb0447378fc76431158eb0b8fc011d36bc --- /dev/null +++ b/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py b/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d311e33f56ba431a882b0e7079001b0e9932a011 --- /dev/null +++ b/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py b/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7b535f3c80818ce6b692b66f18ceee8e7b181fdc --- /dev/null +++ b/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py b/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..600b701a7194ead496cc924bee897b6096e1c7ca --- /dev/null +++ b/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/encnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + backbone=dict(stem_channels=128), + decode_head=dict(num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/configs/fastscnn/README.md b/configs/fastscnn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bb87a9f7aeb8d3630aeccc04b585a4dfec9f2b7e --- /dev/null +++ b/configs/fastscnn/README.md @@ -0,0 +1,22 @@ +# Fast-SCNN for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{poudel2019fast, + title={Fast-scnn: Fast semantic segmentation network}, + author={Poudel, Rudra PK and Liwicki, Stephan and Cipolla, Roberto}, + journal={arXiv preprint arXiv:1902.04502}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|-----------|-----------|--------:|----------|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Fast-SCNN | Fast-SCNN | 512x1024 | 80000 | 8.4 | 63.61 | 69.06 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fast_scnn/fast_scnn_4x8_80k_lr0.12_cityscapes-f5096c79.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fast_scnn/fast_scnn_4x8_80k_lr0.12_cityscapes-20200807_165744.log.json) | diff --git a/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py b/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3d9c9999370c8b1c28af3063a3aded0d88c91caf --- /dev/null +++ b/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/fast_scnn.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] + +# Re-config the data sampler. +data = dict(samples_per_gpu=2, workers_per_gpu=4) + +# Re-config the optimizer. +optimizer = dict(type='SGD', lr=0.12, momentum=0.9, weight_decay=4e-5) diff --git a/configs/fcn/README.md b/configs/fcn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..95ca2ac0439c3a33ef13f2e22d7fa7a83754142b --- /dev/null +++ b/configs/fcn/README.md @@ -0,0 +1,66 @@ +# Fully Convolutional Networks for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{shelhamer2017fully, + title={Fully convolutional networks for semantic segmentation}, + author={Shelhamer, Evan and Long, Jonathan and Darrell, Trevor}, + journal={IEEE transactions on pattern analysis and machine intelligence}, + volume={39}, + number={4}, + pages={640--651}, + year={2017}, + publisher={IEEE Trans Pattern Anal Mach Intell} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-50-D8 | 512x1024 | 40000 | 5.7 | 4.17 | 72.25 | 73.36 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608-efe53f0d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_40k_cityscapes/fcn_r50-d8_512x1024_40k_cityscapes_20200604_192608.log.json) | +| FCN | R-101-D8 | 512x1024 | 40000 | 9.2 | 2.66 | 75.45 | 76.58 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_40k_cityscapes/fcn_r101-d8_512x1024_40k_cityscapes_20200604_181852-a883d3a1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_40k_cityscapes/fcn_r101-d8_512x1024_40k_cityscapes_20200604_181852.log.json) | +| FCN | R-50-D8 | 769x769 | 40000 | 6.5 | 1.80 | 71.47 | 72.54 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_40k_cityscapes/fcn_r50-d8_769x769_40k_cityscapes_20200606_113104-977b5d02.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_40k_cityscapes/fcn_r50-d8_769x769_40k_cityscapes_20200606_113104.log.json) | +| FCN | R-101-D8 | 769x769 | 40000 | 10.4 | 1.19 | 73.93 | 75.14 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_40k_cityscapes/fcn_r101-d8_769x769_40k_cityscapes_20200606_113208-7d4ab69c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_40k_cityscapes/fcn_r101-d8_769x769_40k_cityscapes_20200606_113208.log.json) | +| FCN | R-18-D8 | 512x1024 | 80000 | 1.7 | 14.65 | 71.11 | 72.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_512x1024_80k_cityscapes/fcn_r18-d8_512x1024_80k_cityscapes_20201225_021327-6c50f8b4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_512x1024_80k_cityscapes/fcn_r18-d8_512x1024_80k_cityscapes-20201225_021327.log.json) | +| FCN | R-50-D8 | 512x1024 | 80000 | - | | 73.61 | 74.24 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_80k_cityscapes/fcn_r50-d8_512x1024_80k_cityscapes_20200606_113019-03aa804d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x1024_80k_cityscapes/fcn_r50-d8_512x1024_80k_cityscapes_20200606_113019.log.json) | +| FCN | R-101-D8 | 512x1024 | 80000 | - | - | 75.13 | 75.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_80k_cityscapes/fcn_r101-d8_512x1024_80k_cityscapes_20200606_113038-3fb937eb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x1024_80k_cityscapes/fcn_r101-d8_512x1024_80k_cityscapes_20200606_113038.log.json) | +| FCN | R-18-D8 | 769x769 | 80000 | 1.9 | 6.40 | 70.80 | 73.16 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_769x769_80k_cityscapes/fcn_r18-d8_769x769_80k_cityscapes_20201225_021451-9739d1b8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18-d8_769x769_80k_cityscapes/fcn_r18-d8_769x769_80k_cityscapes-20201225_021451.log.json) | +| FCN | R-50-D8 | 769x769 | 80000 | - | - | 72.64 | 73.32 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_80k_cityscapes/fcn_r50-d8_769x769_80k_cityscapes_20200606_195749-f5caeabc.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_769x769_80k_cityscapes/fcn_r50-d8_769x769_80k_cityscapes_20200606_195749.log.json) | +| FCN | R-101-D8 | 769x769 | 80000 | - | - | 75.52 | 76.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_80k_cityscapes/fcn_r101-d8_769x769_80k_cityscapes_20200606_214354-45cbac68.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_769x769_80k_cityscapes/fcn_r101-d8_769x769_80k_cityscapes_20200606_214354.log.json) | +| FCN | R-18b-D8 | 512x1024 | 80000 | 1.6 | 16.74 | 70.24 | 72.77 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_512x1024_80k_cityscapes/fcn_r18b-d8_512x1024_80k_cityscapes_20201225_230143-92c0f445.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_512x1024_80k_cityscapes/fcn_r18b-d8_512x1024_80k_cityscapes-20201225_230143.log.json) | +| FCN | R-50b-D8 | 512x1024 | 80000 | 5.6 | 4.20 | 75.65 | 77.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_512x1024_80k_cityscapes/fcn_r50b-d8_512x1024_80k_cityscapes_20201225_094221-82957416.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_512x1024_80k_cityscapes/fcn_r50b-d8_512x1024_80k_cityscapes-20201225_094221.log.json) | +| FCN | R-101b-D8| 512x1024 | 80000 | 9.1 | 2.73 | 77.37 | 78.77 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_512x1024_80k_cityscapes/fcn_r101b-d8_512x1024_80k_cityscapes_20201226_160213-4543858f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_512x1024_80k_cityscapes/fcn_r101b-d8_512x1024_80k_cityscapes-20201226_160213.log.json) | +| FCN | R-18b-D8 | 769x769 | 80000 | 1.7 | 6.70 | 69.66 | 72.07 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_769x769_80k_cityscapes/fcn_r18b-d8_769x769_80k_cityscapes_20201226_004430-32d504e5.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r18b-d8_769x769_80k_cityscapes/fcn_r18b-d8_769x769_80k_cityscapes-20201226_004430.log.json) | +| FCN | R-50b-D8 | 769x769 | 80000 | 6.3 | 1.82 | 73.83 | 76.60 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_769x769_80k_cityscapes/fcn_r50b-d8_769x769_80k_cityscapes_20201225_094223-94552d38.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50b-d8_769x769_80k_cityscapes/fcn_r50b-d8_769x769_80k_cityscapes-20201225_094223.log.json) | +| FCN | R-101b-D8| 769x769 | 80000 | 10.3 | 1.15 | 77.02 | 78.67 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_769x769_80k_cityscapes/fcn_r101b-d8_769x769_80k_cityscapes_20201226_170012-82be37e2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101b-d8_769x769_80k_cityscapes/fcn_r101b-d8_769x769_80k_cityscapes-20201226_170012.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-50-D8 | 512x512 | 80000 | 8.5 | 23.49 | 35.94 | 37.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_80k_ade20k/fcn_r50-d8_512x512_80k_ade20k_20200614_144016-f8ac5082.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_80k_ade20k/fcn_r50-d8_512x512_80k_ade20k_20200614_144016.log.json) | +| FCN | R-101-D8 | 512x512 | 80000 | 12 | 14.78 | 39.61 | 40.83 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_80k_ade20k/fcn_r101-d8_512x512_80k_ade20k_20200615_014143-bc1809f7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_80k_ade20k/fcn_r101-d8_512x512_80k_ade20k_20200615_014143.log.json) | +| FCN | R-50-D8 | 512x512 | 160000 | - | - | 36.10 | 38.08 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_160k_ade20k/fcn_r50-d8_512x512_160k_ade20k_20200615_100713-4edbc3b4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_160k_ade20k/fcn_r50-d8_512x512_160k_ade20k_20200615_100713.log.json) | +| FCN | R-101-D8 | 512x512 | 160000 | - | - | 39.91 | 41.40 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_160k_ade20k/fcn_r101-d8_512x512_160k_ade20k_20200615_105816-fd192bd5.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_160k_ade20k/fcn_r101-d8_512x512_160k_ade20k_20200615_105816.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-50-D8 | 512x512 | 20000 | 5.7 | 23.28 | 67.08 | 69.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_20k_voc12aug/fcn_r50-d8_512x512_20k_voc12aug_20200617_010715-52dc5306.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_20k_voc12aug/fcn_r50-d8_512x512_20k_voc12aug_20200617_010715.log.json) | +| FCN | R-101-D8 | 512x512 | 20000 | 9.2 | 14.81 | 71.16 | 73.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_20k_voc12aug/fcn_r101-d8_512x512_20k_voc12aug_20200617_010842-0bb4e798.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_20k_voc12aug/fcn_r101-d8_512x512_20k_voc12aug_20200617_010842.log.json) | +| FCN | R-50-D8 | 512x512 | 40000 | - | - | 66.97 | 69.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_40k_voc12aug/fcn_r50-d8_512x512_40k_voc12aug_20200613_161222-5e2dbf40.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r50-d8_512x512_40k_voc12aug/fcn_r50-d8_512x512_40k_voc12aug_20200613_161222.log.json) | +| FCN | R-101-D8 | 512x512 | 40000 | - | - | 69.91 | 72.38 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_40k_voc12aug/fcn_r101-d8_512x512_40k_voc12aug_20200613_161240-4c8bcefd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_512x512_40k_voc12aug/fcn_r101-d8_512x512_40k_voc12aug_20200613_161240.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-101-D8 | 480x480 | 40000 | - | 9.93 | 44.14 | 45.67 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context/fcn_r101-d8_480x480_40k_pascal_context_20200911_212515-9b565a6d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_40k_pascal_context/fcn_r101-d8_480x480_40k_pascal_context-20200911_212515.log.json) | +| FCN | R-101-D8 | 480x480 | 80000 | - | - | 44.47 | 45.74 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context/fcn_r101-d8_480x480_80k_pascal_context_20200915_032644-a3828480.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fcn/fcn_r101-d8_480x480_80k_pascal_context/fcn_r101-d8_480x480_80k_pascal_context-20200915_032644.log.json) | diff --git a/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py b/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..f3a15b41054318d508e98685632921f262029de0 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_480x480_40k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py b/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..bdccfd99ba0c25646f02850483c2cdf679fdbf3d --- /dev/null +++ b/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_480x480_80k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py b/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7918dd10d05cd98dbc02f02ef1b93e3134f52357 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..528110dc73c15008869a9ad9851ef487f0c952c7 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py b/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1bf6780f2c821052692ddcb904bd10e6256c1e71 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py b/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..09a5fe5468f0155f8fd0bf2cd1574a33624d8492 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py b/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..eafefaa67565513c277c5eb42e3661a88133cb27 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py b/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6d0294530f4c817b352cb020d111e3248690ae1f --- /dev/null +++ b/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py b/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6b4cc571294fa45b4442c2bfeb9fda13a14fc5c2 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3503c76935e294c881130b309999d32f13df8839 --- /dev/null +++ b/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b9bf60fc13364ca1b7b3842664950f653426e67 --- /dev/null +++ b/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f36eb02e68707d502cbe315ff8f6f25b232dee92 --- /dev/null +++ b/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5a1d29e480cb46a763cb17d2105b3f040153d417 --- /dev/null +++ b/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6644a58dea86fd38e208abbedffe4f836e677078 --- /dev/null +++ b/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..92accfc703fc398d2845d7dc2f1d5336f24738e8 --- /dev/null +++ b/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5dd34dd2134c745275c66adc5488b4b9f68d6809 --- /dev/null +++ b/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py b/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..fdc6314f704e61d064f5fb7bdd30bc38a9e87ee5 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py b/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0870f928b82b24b8179305f6c9fc7f6013fb481e --- /dev/null +++ b/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py b/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..401c6ea7330d45d8f7604a1da63fc6e15faea424 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..990a085eda2f2dc47f1a1289bfbf2726ad8c9c4f --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py b/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9ca7fd23cedc0567a015bd5f8641a509ead6110a --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py b/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..17206a5171dcc357c589a1711afa52d87faeece0 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py b/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..8cec429c3e27ad2543b7e38fa206e6606fda4d5a --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py b/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ef194cb594eb76316324066e23e48184d8cede27 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py b/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fca98c1d9ace73a61ae395914e5960832216bf67 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7d75cd9f49343355b14c7d60bb0df0936ffe0278 --- /dev/null +++ b/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py b/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..28ef13f8d17e977f710ba9a863f182b1f80dc8cf --- /dev/null +++ b/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py b/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..106f7b6a1ece974c9f732ee813724bd8bda3bef3 --- /dev/null +++ b/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/foodnet/README.md b/configs/foodnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7aa6d7db2cdb9aa3b82537aa08396589a9511345 --- /dev/null +++ b/configs/foodnet/README.md @@ -0,0 +1,49 @@ +# Baseline for FoodSeg103 + +## Introduction + +[ALGORITHM] + +```latex +@article{xu2021foodseg, + title={A Large-Scale Benchmark for Food Image Segmentation}, + author={Wu, Xiongwei and Fu, Xin and Liu, Ying and Lim, Ee-Peng and Hoi, Steven CH and Sun, Qianru}, + journal={arXiv preprint arXiv:XXXX.XXXX}, + year={2021} +} + +@inproceedings{huang2018ccnet, + title={CCNet: Criss-Cross Attention for Semantic Segmentation}, + author={Huang, Zilong and Wang, Xinggang and Huang, Lichao and Huang, Chang and Wei, Yunchao and Liu, Wenyu}, + booktitle={ICCV}, + year={2019} +} +@inproceedings{Kirillov_2019, + title={Panoptic Feature Pyramid Networks}, + author={Kirillov, Alexander and Girshick, Ross and He, Kaiming and Dollar, Piotr}, + booktitle={CVPR}, + year={2019}, +} +@inproceedings{SETR, + title={Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers}, + author={Zheng, Sixiao and Lu, Jiachen and Zhao, Hengshuang and Zhu, Xiatian and Luo, Zekun and Wang, Yabiao and Fu, Yanwei and Feng, Jianfeng and Xiang, Tao and Torr, Philip H.S. and Zhang, Li}, + booktitle={CVPR}, + year={2021} +} + +@article{liu2021Swin, + title={Swin Transformer: Hierarchical Vision Transformer using Shifted Windows}, + author={Liu, Ze and Lin, Yutong and Cao, Yue and Hu, Han and Wei, Yixuan and Zhang, Zheng and Lin, Stephen and Guo, Baining}, + journal={arXiv preprint arXiv:2103.14030}, + year={2021} +} + +@article{wang2021pyramid, + title={Pyramid vision transformer: A versatile backbone for dense prediction without convolutions}, + author={Wang, Wenhai and Xie, Enze and Li, Xiang and Fan, Deng-Ping and Song, Kaitao and Liang, Ding and Lu, Tong and Luo, Ping and Shao, Ling}, + journal={arXiv preprint arXiv:2102.12122}, + year={2021} +} +``` + + diff --git a/configs/foodnet/SETR_MLA_768x768_80k_base.py b/configs/foodnet/SETR_MLA_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..28beb61a243849ccf09dcb18a2e3880aeb8610f4 --- /dev/null +++ b/configs/foodnet/SETR_MLA_768x768_80k_base.py @@ -0,0 +1,69 @@ +_base_ = [ + '../_base_/models/setr_mla.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + backbone=dict( + img_size=768, + model_name='vit_base_patch16_224', + embed_dim=768, + depth=12, + num_heads=12, + pos_embed_interp=True, + drop_rate=0., + mla_channels=256, + mla_index=(5,7,9,11) + ), + decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104), + auxiliary_head=[ + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=0, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=1, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=2, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=3, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.002, weight_decay=0.0, +paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)}) +) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) diff --git a/configs/foodnet/SETR_MLA_768x768_80k_base_RM.py b/configs/foodnet/SETR_MLA_768x768_80k_base_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..6f3a76d44ce1efd203c27bd586566d3793d0a57c --- /dev/null +++ b/configs/foodnet/SETR_MLA_768x768_80k_base_RM.py @@ -0,0 +1,70 @@ +_base_ = [ + '../_base_/models/setr_mla.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + backbone=dict( + img_size=768, + model_name='vit_base_patch16_224', + pretrain_weights='pretrained_model/VIT_base_224_ReLeM.pth', + embed_dim=768, + depth=12, + num_heads=12, + pos_embed_interp=True, + drop_rate=0., + mla_channels=256, + mla_index=(5,7,9,11) + ), + decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104), + auxiliary_head=[ + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=0, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=1, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=2, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=3, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.002, weight_decay=0.0, +paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)}) +) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) diff --git a/configs/foodnet/SETR_MLA_768x768_80k_large.py b/configs/foodnet/SETR_MLA_768x768_80k_large.py new file mode 100644 index 0000000000000000000000000000000000000000..caf8c3d1b462cfd9fd646291674519e255fb4532 --- /dev/null +++ b/configs/foodnet/SETR_MLA_768x768_80k_large.py @@ -0,0 +1,68 @@ +_base_ = [ + '../_base_/models/setr_mla.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + backbone=dict( + img_size=768, + pos_embed_interp=True, + drop_rate=0., + mla_channels=256, + mla_index=(5,11,17,23) + ), + decode_head=dict(img_size=768,mla_channels=256,mlahead_channels=128,num_classes=104), + auxiliary_head=[ + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=0, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=1, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=2, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VIT_MLA_AUXIHead', + in_channels=256, + channels=512, + in_index=3, + img_size=768, + num_classes=104, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.002, weight_decay=0.0, +paramwise_cfg = dict(custom_keys={'head': dict(lr_mult=10.)}) +) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) + +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=80000, metric='mIoU') diff --git a/configs/foodnet/SETR_Naive_768x768_80k_base.py b/configs/foodnet/SETR_Naive_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..a51b67876051d356294c51ec1c333c56ac5c9042 --- /dev/null +++ b/configs/foodnet/SETR_Naive_768x768_80k_base.py @@ -0,0 +1,80 @@ +_base_ = [ + '../_base_/models/setr_naive_pup.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + backbone=dict( + img_size=768, + model_name='vit_base_patch16_224', + embed_dim=768, + depth=12, + num_heads=12, + pos_embed_interp=True, + align_corners=False, + num_classes=104, + drop_rate=0. + ), + decode_head=dict( + img_size=768, + in_channels=768, + in_index=11, + channels=512, + num_classes=104, + embed_dim=768, + align_corners=False, + num_conv=2, + upsampling_method='bilinear', + ), + auxiliary_head=[ + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=5, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=7, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=9, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.01, weight_decay=0.0, paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) diff --git a/configs/foodnet/SETR_Naive_768x768_80k_base_RM.py b/configs/foodnet/SETR_Naive_768x768_80k_base_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..e171cf36329b0ce0a71fa05b13c20f0f13979ce3 --- /dev/null +++ b/configs/foodnet/SETR_Naive_768x768_80k_base_RM.py @@ -0,0 +1,81 @@ +_base_ = [ + '../_base_/models/setr_naive_pup.py', + '../_base_/datasets/FoodSeg103_768x768.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + backbone=dict( + img_size=768, + model_name='vit_base_patch16_224', + pretrain_weights='pretrained_model/VIT_base_224_ReLeM.pth', + embed_dim=768, + depth=12, + num_heads=12, + pos_embed_interp=True, + align_corners=False, + num_classes=104, + drop_rate=0. + ), + decode_head=dict( + img_size=768, + in_channels=768, + in_index=11, + channels=512, + num_classes=104, + embed_dim=768, + align_corners=False, + num_conv=2, + upsampling_method='bilinear', + ), + auxiliary_head=[ + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=5, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=7, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=9, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=norm_cfg, + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + ]) + +optimizer = dict(lr=0.01, weight_decay=0.0, paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) + +crop_size = (768, 768) +test_cfg = dict(mode='slide', crop_size=crop_size, stride=(512, 512)) +find_unused_parameters = True +data = dict(samples_per_gpu=1) diff --git a/configs/foodnet/ccnet_r50-d8_512x1024_80k.py b/configs/foodnet/ccnet_r50-d8_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..a65634569402a018ed238142ff34cce446e8ffe2 --- /dev/null +++ b/configs/foodnet/ccnet_r50-d8_512x1024_80k.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/FoodSeg103.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/foodnet/ccnet_r50-d8_512x1024_80k_RM.py b/configs/foodnet/ccnet_r50-d8_512x1024_80k_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..bf9c68ea153ac90398afe4080886ae16044f4d06 --- /dev/null +++ b/configs/foodnet/ccnet_r50-d8_512x1024_80k_RM.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/FoodSeg103.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict(pretrained='./pretrained_model/R50_ReLeM.pth', backbone=dict(type='ResNet')) diff --git a/configs/foodnet/fpn_r50_512x1024_80k.py b/configs/foodnet/fpn_r50_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..da856c77ee311eaac410e37be3f9e2268bdd1442 --- /dev/null +++ b/configs/foodnet/fpn_r50_512x1024_80k.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/FoodSeg103.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] + +model = dict(decode_head=dict(num_classes=104)) + +optimizer_config = dict() + +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') diff --git a/configs/foodnet/fpn_r50_512x1024_80k_RM.py b/configs/foodnet/fpn_r50_512x1024_80k_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..31291a171e6d0d451367094e208babf310275c2c --- /dev/null +++ b/configs/foodnet/fpn_r50_512x1024_80k_RM.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/FoodSeg103.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] + +model = dict(pretrained='./pretrained_model/R50_ReLeM.pth', + backbone=dict(type='ResNet'), + decode_head=dict(num_classes=104)) + +optimizer_config = dict() + +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') diff --git a/configs/fp16/README.md b/configs/fp16/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8d12e4d78025313fb9689bb320b07520bd7648ef --- /dev/null +++ b/configs/fp16/README.md @@ -0,0 +1,25 @@ +# Mixed Precision Training + +## Introduction + +[OTHERS] + +```latex +@article{micikevicius2017mixed, + title={Mixed precision training}, + author={Micikevicius, Paulius and Narang, Sharan and Alben, Jonah and Diamos, Gregory and Elsen, Erich and Garcia, David and Ginsburg, Boris and Houston, Michael and Kuchaiev, Oleksii and Venkatesh, Ganesh and others}, + journal={arXiv preprint arXiv:1710.03740}, + year={2017} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | R-101-D8 | 512x1024 | 80000 | 5.50 | 2.66 | 76.80 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes/fcn_r101-d8_512x1024_80k_fp16_cityscapes-50245227.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes/fcn_r101-d8_512x1024_80k_fp16_cityscapes_20200717_230921.log.json) | +| PSPNet | R-101-D8 | 512x1024 | 80000 | 5.47 | 2.68 | 79.46 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes/pspnet_r101-d8_512x1024_80k_fp16_cityscapes-ade37931.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes/pspnet_r101-d8_512x1024_80k_fp16_cityscapes_20200717_230919.log.json) | +| DeepLabV3 | R-101-D8 | 512x1024 | 80000 | 5.91 | 1.93 | 80.48 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes-bc86dc84.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes_20200717_230920.log.json) | +| DeepLabV3+ | R-101-D8 | 512x1024 | 80000 | 6.46 | 2.60 | 80.46 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes-cc58bc8d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes_20200717_230920.log.json) | diff --git a/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py b/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..60d8350e98605c2445ce8359ca9a7a1951fe0085 --- /dev/null +++ b/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py @@ -0,0 +1,3 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py' +# fp16 settings +optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) diff --git a/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py b/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c263d6907ec9ddfdad32b380a7d926d1391e393c --- /dev/null +++ b/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py @@ -0,0 +1,3 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py' +# fp16 settings +optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) diff --git a/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py b/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8100a8e64d780c1b9c272b57e4e171c5e1a4120b --- /dev/null +++ b/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py @@ -0,0 +1,3 @@ +_base_ = '../fcn/fcn_r101-d8_512x1024_80k_cityscapes.py' +# fp16 settings +optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) diff --git a/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py b/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..aefac2953abf65c10023599ec42c709a794935c8 --- /dev/null +++ b/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py @@ -0,0 +1,3 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py' +# fp16 settings +optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) diff --git a/configs/gcnet/README.md b/configs/gcnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b840d5bf9f844e7af89803b48a43b76b887ced36 --- /dev/null +++ b/configs/gcnet/README.md @@ -0,0 +1,48 @@ +# GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{cao2019gcnet, + title={Gcnet: Non-local networks meet squeeze-excitation networks and beyond}, + author={Cao, Yue and Xu, Jiarui and Lin, Stephen and Wei, Fangyun and Hu, Han}, + booktitle={Proceedings of the IEEE International Conference on Computer Vision Workshops}, + pages={0--0}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| GCNet | R-50-D8 | 512x1024 | 40000 | 5.8 | 3.93 | 77.69 | 78.56 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes/gcnet_r50-d8_512x1024_40k_cityscapes_20200618_074436-4b0fd17b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes/gcnet_r50-d8_512x1024_40k_cityscapes_20200618_074436.log.json) | +| GCNet | R-101-D8 | 512x1024 | 40000 | 9.2 | 2.61 | 78.28 | 79.34 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes/gcnet_r101-d8_512x1024_40k_cityscapes_20200618_074436-5e62567f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes/gcnet_r101-d8_512x1024_40k_cityscapes_20200618_074436.log.json) | +| GCNet | R-50-D8 | 769x769 | 40000 | 6.5 | 1.67 | 78.12 | 80.09 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_40k_cityscapes/gcnet_r50-d8_769x769_40k_cityscapes_20200618_182814-a26f4471.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_40k_cityscapes/gcnet_r50-d8_769x769_40k_cityscapes_20200618_182814.log.json) | +| GCNet | R-101-D8 | 769x769 | 40000 | 10.5 | 1.13 | 78.95 | 80.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_40k_cityscapes/gcnet_r101-d8_769x769_40k_cityscapes_20200619_092550-ca4f0a84.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_40k_cityscapes/gcnet_r101-d8_769x769_40k_cityscapes_20200619_092550.log.json) | +| GCNet | R-50-D8 | 512x1024 | 80000 | - | - | 78.48 | 80.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes/gcnet_r50-d8_512x1024_80k_cityscapes_20200618_074450-ef8f069b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes/gcnet_r50-d8_512x1024_80k_cityscapes_20200618_074450.log.json) | +| GCNet | R-101-D8 | 512x1024 | 80000 | - | - | 79.03 | 79.84 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes/gcnet_r101-d8_512x1024_80k_cityscapes_20200618_074450-778ebf69.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes/gcnet_r101-d8_512x1024_80k_cityscapes_20200618_074450.log.json) | +| GCNet | R-50-D8 | 769x769 | 80000 | - | - | 78.68 | 80.66 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_80k_cityscapes/gcnet_r50-d8_769x769_80k_cityscapes_20200619_092516-4839565b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_769x769_80k_cityscapes/gcnet_r50-d8_769x769_80k_cityscapes_20200619_092516.log.json) | +| GCNet | R-101-D8 | 769x769 | 80000 | - | - | 79.18 | 80.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_80k_cityscapes/gcnet_r101-d8_769x769_80k_cityscapes_20200619_092628-8e043423.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_769x769_80k_cityscapes/gcnet_r101-d8_769x769_80k_cityscapes_20200619_092628.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| GCNet | R-50-D8 | 512x512 | 80000 | 8.5 | 23.38 | 41.47 | 42.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_80k_ade20k/gcnet_r50-d8_512x512_80k_ade20k_20200614_185146-91a6da41.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_80k_ade20k/gcnet_r50-d8_512x512_80k_ade20k_20200614_185146.log.json) | +| GCNet | R-101-D8 | 512x512 | 80000 | 12 | 15.20 | 42.82 | 44.54 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_80k_ade20k/gcnet_r101-d8_512x512_80k_ade20k_20200615_020811-c3fcb6dd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_80k_ade20k/gcnet_r101-d8_512x512_80k_ade20k_20200615_020811.log.json) | +| GCNet | R-50-D8 | 512x512 | 160000 | - | - | 42.37 | 43.52 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_160k_ade20k/gcnet_r50-d8_512x512_160k_ade20k_20200615_224122-d95f3e1f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_160k_ade20k/gcnet_r50-d8_512x512_160k_ade20k_20200615_224122.log.json) | +| GCNet | R-101-D8 | 512x512 | 160000 | - | - | 43.69 | 45.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_160k_ade20k/gcnet_r101-d8_512x512_160k_ade20k_20200615_225406-615528d7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_160k_ade20k/gcnet_r101-d8_512x512_160k_ade20k_20200615_225406.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| GCNet | R-50-D8 | 512x512 | 20000 | 5.8 | 23.35 | 76.42 | 77.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_20k_voc12aug/gcnet_r50-d8_512x512_20k_voc12aug_20200617_165701-3cbfdab1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_20k_voc12aug/gcnet_r50-d8_512x512_20k_voc12aug_20200617_165701.log.json) | +| GCNet | R-101-D8 | 512x512 | 20000 | 9.2 | 14.80 | 77.41 | 78.56 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_20k_voc12aug/gcnet_r101-d8_512x512_20k_voc12aug_20200617_165713-6c720aa9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_20k_voc12aug/gcnet_r101-d8_512x512_20k_voc12aug_20200617_165713.log.json) | +| GCNet | R-50-D8 | 512x512 | 40000 | - | - | 76.24 | 77.63 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_40k_voc12aug/gcnet_r50-d8_512x512_40k_voc12aug_20200613_195105-9797336d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r50-d8_512x512_40k_voc12aug/gcnet_r50-d8_512x512_40k_voc12aug_20200613_195105.log.json) | +| GCNet | R-101-D8 | 512x512 | 40000 | - | - | 77.84 | 78.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_40k_voc12aug/gcnet_r101-d8_512x512_40k_voc12aug_20200613_185806-1e38208d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/gcnet/gcnet_r101-d8_512x512_40k_voc12aug/gcnet_r101-d8_512x512_40k_voc12aug_20200613_185806.log.json) | diff --git a/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py b/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..27bd9422dad49bc5a06f577ee45cd834bdbe3912 --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py b/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7f0f83fe39da31fe9a5b497e0481e1c79a33e764 --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py b/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9888120f65b045df1c7d4d05fb010373abf82ccf --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py b/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1b70ca8e46a0409379f5ae9809ce03de203426ad --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py b/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..b17c7a12b547ee4e1cd60d667c575eab06eb071c --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py b/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a2183fc2db1ff188b0ad5418e55f71005da926cc --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py b/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..08a6031f20234b1cc1d792ea5d4891613503a185 --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py b/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5efb61339cdbdde585f7814e9650be2e2df654ac --- /dev/null +++ b/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './gcnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py b/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..610467c07204140bf604f8dda2aa57978c565ed3 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py b/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..155e28f42194112703bb21473e5e3dd0fca40d49 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py b/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1549a4d5bf10cd3fd6e3bd57bf7a48e7e5e1ede8 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py b/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..a496204bdb061d975c40cb7ef2aaada40e020a13 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py b/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d85cf6550fea5da7cf1fa078eb4fa30e017166b4 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py b/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..89d5e1ae0f3ef44626f3b5534c504cbce7389a32 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py b/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..332495d3d7f7d7c7c0e0aca4e379cd54e2ed07de --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py b/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6d9cb1c64bcf8c3e952b6f8adc11bec0403d106 --- /dev/null +++ b/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/gcnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/hrnet/README.md b/configs/hrnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4d77cefe3e51091bc2264df8b201968addd81e8d --- /dev/null +++ b/configs/hrnet/README.md @@ -0,0 +1,59 @@ +# Deep High-Resolution Representation Learning for Human Pose Estimation + +## Introduction + +[ALGORITHM] + +```latext +@inproceedings{SunXLW19, + title={Deep High-Resolution Representation Learning for Human Pose Estimation}, + author={Ke Sun and Bin Xiao and Dong Liu and Jingdong Wang}, + booktitle={CVPR}, + year={2019} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | HRNetV2p-W18-Small | 512x1024 | 40000 | 1.7 | 23.74 | 73.86 | 75.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_40k_cityscapes/fcn_hr18s_512x1024_40k_cityscapes_20200601_014216-93db27d0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_40k_cityscapes/fcn_hr18s_512x1024_40k_cityscapes_20200601_014216.log.json) | +| FCN | HRNetV2p-W18 | 512x1024 | 40000 | 2.9 | 12.97 | 77.19 | 78.92 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_40k_cityscapes/fcn_hr18_512x1024_40k_cityscapes_20200601_014216-f196fb4e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_40k_cityscapes/fcn_hr18_512x1024_40k_cityscapes_20200601_014216.log.json) | +| FCN | HRNetV2p-W48 | 512x1024 | 40000 | 6.2 | 6.42 | 78.48 | 79.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_40k_cityscapes/fcn_hr48_512x1024_40k_cityscapes_20200601_014240-a989b146.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_40k_cityscapes/fcn_hr48_512x1024_40k_cityscapes_20200601_014240.log.json) | +| FCN | HRNetV2p-W18-Small | 512x1024 | 80000 | - | - | 75.31 | 77.48 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_80k_cityscapes/fcn_hr18s_512x1024_80k_cityscapes_20200601_202700-1462b75d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_80k_cityscapes/fcn_hr18s_512x1024_80k_cityscapes_20200601_202700.log.json) | +| FCN | HRNetV2p-W18 | 512x1024 | 80000 | - | - | 78.65 | 80.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_80k_cityscapes/fcn_hr18_512x1024_80k_cityscapes_20200601_223255-4e7b345e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_80k_cityscapes/fcn_hr18_512x1024_80k_cityscapes_20200601_223255.log.json) | +| FCN | HRNetV2p-W48 | 512x1024 | 80000 | - | - | 79.93 | 80.72 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_80k_cityscapes/fcn_hr48_512x1024_80k_cityscapes_20200601_202606-58ea95d6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_80k_cityscapes/fcn_hr48_512x1024_80k_cityscapes_20200601_202606.log.json) | +| FCN | HRNetV2p-W18-Small | 512x1024 | 160000 | - | - | 76.31 | 78.31 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_160k_cityscapes/fcn_hr18s_512x1024_160k_cityscapes_20200602_190901-4a0797ea.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x1024_160k_cityscapes/fcn_hr18s_512x1024_160k_cityscapes_20200602_190901.log.json) | +| FCN | HRNetV2p-W18 | 512x1024 | 160000 | - | - | 78.80 | 80.74 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_160k_cityscapes/fcn_hr18_512x1024_160k_cityscapes_20200602_190822-221e4a4f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x1024_160k_cityscapes/fcn_hr18_512x1024_160k_cityscapes_20200602_190822.log.json) | +| FCN | HRNetV2p-W48 | 512x1024 | 160000 | - | - | 80.65 | 81.92 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_160k_cityscapes/fcn_hr48_512x1024_160k_cityscapes_20200602_190946-59b7973e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x1024_160k_cityscapes/fcn_hr48_512x1024_160k_cityscapes_20200602_190946.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | HRNetV2p-W18-Small | 512x512 | 80000 | 3.8 | 38.66 | 31.38 | 32.45 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_ade20k/fcn_hr18s_512x512_80k_ade20k_20200614_144345-77fc814a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_80k_ade20k/fcn_hr18s_512x512_80k_ade20k_20200614_144345.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 80000 | 4.9 | 22.57 | 35.51 | 36.80 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_ade20k/fcn_hr18_512x512_80k_ade20k_20200614_185145-66f20cb7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_80k_ade20k/fcn_hr18_512x512_80k_ade20k_20200614_185145.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 80000 | 8.2 | 21.23 | 41.90 | 43.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_ade20k/fcn_hr48_512x512_80k_ade20k_20200614_193946-7ba5258d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_80k_ade20k/fcn_hr48_512x512_80k_ade20k_20200614_193946.log.json) | +| FCN | HRNetV2p-W18-Small | 512x512 | 160000 | - | - | 33.00 | 34.55 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_160k_ade20k/fcn_hr18s_512x512_160k_ade20k_20200614_214413-870f65ac.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_160k_ade20k/fcn_hr18s_512x512_160k_ade20k_20200614_214413.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 160000 | - | - | 36.79 | 38.58 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_160k_ade20k/fcn_hr18_512x512_160k_ade20k_20200614_214426-ca961836.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_160k_ade20k/fcn_hr18_512x512_160k_ade20k_20200614_214426.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 160000 | - | - | 42.02 | 43.86 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_160k_ade20k/fcn_hr48_512x512_160k_ade20k_20200614_214407-a52fc02c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_160k_ade20k/fcn_hr48_512x512_160k_ade20k_20200614_214407.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | HRNetV2p-W18-Small | 512x512 | 20000 | 1.8 | 43.36 | 65.20 | 68.55 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_20k_voc12aug/fcn_hr18s_512x512_20k_voc12aug_20200617_224503-56e36088.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_20k_voc12aug/fcn_hr18s_512x512_20k_voc12aug_20200617_224503.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 20000 | 2.9 | 23.48 | 72.30 | 74.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_20k_voc12aug/fcn_hr18_512x512_20k_voc12aug_20200617_224503-488d45f7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_20k_voc12aug/fcn_hr18_512x512_20k_voc12aug_20200617_224503.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 20000 | 6.2 | 22.05 | 75.87 | 78.58 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_20k_voc12aug/fcn_hr48_512x512_20k_voc12aug_20200617_224419-89de05cd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_20k_voc12aug/fcn_hr48_512x512_20k_voc12aug_20200617_224419.log.json) | +| FCN | HRNetV2p-W18-Small | 512x512 | 40000 | - | - | 66.61 | 70.00 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_40k_voc12aug/fcn_hr18s_512x512_40k_voc12aug_20200614_000648-4f8d6e7f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18s_512x512_40k_voc12aug/fcn_hr18s_512x512_40k_voc12aug_20200614_000648.log.json) | +| FCN | HRNetV2p-W18 | 512x512 | 40000 | - | - | 72.90 | 75.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_40k_voc12aug/fcn_hr18_512x512_40k_voc12aug_20200613_224401-1b4b76cd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr18_512x512_40k_voc12aug/fcn_hr18_512x512_40k_voc12aug_20200613_224401.log.json) | +| FCN | HRNetV2p-W48 | 512x512 | 40000 | - | - | 76.24 | 78.49 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_40k_voc12aug/fcn_hr48_512x512_40k_voc12aug_20200613_222111-1b0f18bc.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_512x512_40k_voc12aug/fcn_hr48_512x512_40k_voc12aug_20200613_222111.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | HRNetV2p-W48 | 480x480 | 40000 | 6.1 | 8.86 | 45.14 | 47.42 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context/fcn_hr48_480x480_40k_pascal_context_20200911_164852-667d00b0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_40k_pascal_context/fcn_hr48_480x480_40k_pascal_context-20200911_164852.log.json) | +| FCN | HRNetV2p-W48 | 480x480 | 80000 | - | - | 45.84 | 47.84 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context/fcn_hr48_480x480_80k_pascal_context_20200911_155322-847a6711.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/hrnet/fcn_hr48_480x480_80k_pascal_context/fcn_hr48_480x480_80k_pascal_context-20200911_155322.log.json) | diff --git a/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py b/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..5ff05aa595399d77ee51552c243e489f395a820e --- /dev/null +++ b/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py b/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..cf315a4f0e6f397768572c590a634cc1b9d298a9 --- /dev/null +++ b/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_context.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), + test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py b/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9f04e935c39b08de66629f913b30675ffff2a8fe --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] diff --git a/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py b/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99760c36d8399204ca8e35f32690bcd369676852 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py b/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a653dda19255214a1a412b645abddd3fc5c0d853 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py b/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..45ed99b6813324a58575f9bb74ce0534626e10c4 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict(decode_head=dict(num_classes=150)) diff --git a/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py b/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f06448b168af4d2dcc5a1f96e4430a7948b7e170 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' +] +model = dict(decode_head=dict(num_classes=21)) diff --git a/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py b/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d74e95943afca04ba4073e411e0b713985384129 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/pascal_voc12_aug.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(decode_head=dict(num_classes=21)) diff --git a/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py b/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..52bc9f5e91f2fdf9ce8f9e3a873902dd8db56522 --- /dev/null +++ b/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fcn_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict(decode_head=dict(num_classes=150)) diff --git a/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py b/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..d09931048f762cd2ac224d62c2fe2ed8e0e148c8 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_480x480_40k_pascal_context.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py b/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..584b7135fd95464f3d2c965440a0b92161cde09a --- /dev/null +++ b/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_480x480_80k_pascal_context.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py b/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ddbe3801f99dc21120548af85c55c7cdcfadaea2 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x1024_160k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py b/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4e31d26e093b6cb2d59b24bb3060c92bd7dccdea --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py b/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ee2831d99d859c419b158b5f828d8a84063564ea --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py b/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..22a3ce0b38f36efc96595fe1c3ef428fc1575eb0 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py b/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d0de5df75242e58ba572277d6fc5cf93675a097e --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x512_20k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py b/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..409db3c628edf63cd40e002f436884ce1fb75970 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x512_40k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py b/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a8400979b1e94dd42343de656ffbc5fbb7a07944 --- /dev/null +++ b/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = './fcn_hr18_512x512_80k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py b/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0e2d96cb6ce7249852cb1d9b36a2f24bdce00199 --- /dev/null +++ b/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_480x480_40k_pascal_context.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py b/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..e28164e3dc9d321bf0a97b37f14f3184f95a27a5 --- /dev/null +++ b/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_480x480_80k_pascal_context.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py b/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..394a61c99f038c94fce58ac9c422b7c3ee4b5f50 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x1024_160k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py b/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d37ab1d09ef51b1321ed8b3634fd99445efee543 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py b/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a9bab32b52ca41155062c7655986ed84677a8280 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py b/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..dff4fea85ced568c38d39408d459697e88ca0faa --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py b/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..a8d1deb98659d05755c6316c2aff2295afb0bb9c --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x512_20k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py b/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1084a57e978195df6d45a9a00415953ddbaeeb51 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x512_40k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py b/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7eca7fa4b8102c6225af3b484ffff5bdc7c0f201 --- /dev/null +++ b/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py @@ -0,0 +1,10 @@ +_base_ = './fcn_hr18_512x512_80k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=dict( + in_channels=[48, 96, 192, 384], channels=sum([48, 96, 192, 384]))) diff --git a/configs/mobilenet_v2/README.md b/configs/mobilenet_v2/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e0e75e028db703129551402ae9d63c6a2861dc4b --- /dev/null +++ b/configs/mobilenet_v2/README.md @@ -0,0 +1,35 @@ +# MobileNetV2: Inverted Residuals and Linear Bottlenecks + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{sandler2018mobilenetv2, + title={Mobilenetv2: Inverted residuals and linear bottlenecks}, + author={Sandler, Mark and Howard, Andrew and Zhu, Menglong and Zhmoginov, Andrey and Chen, Liang-Chieh}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={4510--4520}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | M-V2-D8 | 512x1024 | 80000 | 3.4 | 14.2 | 61.54 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes/fcn_m-v2-d8_512x1024_80k_cityscapes_20200825_124817-d24c28c1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes/fcn_m-v2-d8_512x1024_80k_cityscapes-20200825_124817.log.json) | +| PSPNet | M-V2-D8 | 512x1024 | 80000 | 3.6 | 11.2 | 70.23 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes/pspnet_m-v2-d8_512x1024_80k_cityscapes_20200825_124817-19e81d51.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes/pspnet_m-v2-d8_512x1024_80k_cityscapes-20200825_124817.log.json) | +| DeepLabV3 | M-V2-D8 | 512x1024 | 80000 | 3.9 | 8.4 | 73.84 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes/deeplabv3_m-v2-d8_512x1024_80k_cityscapes_20200825_124836-bef03590.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes/deeplabv3_m-v2-d8_512x1024_80k_cityscapes-20200825_124836.log.json) | +| DeepLabV3+ | M-V2-D8 | 512x1024 | 80000 | 5.1 | 8.4 | 75.20 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes_20200825_124836-d256dd4b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes-20200825_124836.log.json) | + +### ADE20k + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | M-V2-D8 | 512x512 | 160000 | 6.5 | 64.4 | 19.71 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k/fcn_m-v2-d8_512x512_160k_ade20k_20200825_214953-c40e1095.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k/fcn_m-v2-d8_512x512_160k_ade20k-20200825_214953.log.json) | +| PSPNet | M-V2-D8 | 512x512 | 160000 | 6.5 | 57.7 | 29.68 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k/pspnet_m-v2-d8_512x512_160k_ade20k_20200825_214953-f5942f7a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k/pspnet_m-v2-d8_512x512_160k_ade20k-20200825_214953.log.json) | +| DeepLabV3 | M-V2-D8 | 512x512 | 160000 | 6.8 | 39.9 | 34.08 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k/deeplabv3_m-v2-d8_512x512_160k_ade20k_20200825_223255-63986343.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k/deeplabv3_m-v2-d8_512x512_160k_ade20k-20200825_223255.log.json) | +| DeepLabV3+ | M-V2-D8 | 512x512 | 160000 | 8.2 | 43.1 | 34.02 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k/deeplabv3plus_m-v2-d8_512x512_160k_ade20k_20200825_223255-465a01d4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k/deeplabv3plus_m-v2-d8_512x512_160k_ade20k-20200825_223255.log.json) | diff --git a/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py b/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..267483d88ff25d75dc18c5c2d37375cd77c9639c --- /dev/null +++ b/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py b/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..e15b8cc82b09ac3e64875936cdfd0f663aaba936 --- /dev/null +++ b/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py @@ -0,0 +1,12 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py b/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d4533d79a25771905d7f1900bf7b34037885a77a --- /dev/null +++ b/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320, c1_in_channels=24), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py b/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7615a7c19a3f19635b71801a55e4544be4d215b5 --- /dev/null +++ b/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py @@ -0,0 +1,12 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320, c1_in_channels=24), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py b/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a535bd0ed8a4883134acdc52cf3f77c8d897ce82 --- /dev/null +++ b/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = '../fcn/fcn_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py b/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..c5f6ab0d62e269e44dac016eb5ac58f49c1fa292 --- /dev/null +++ b/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py @@ -0,0 +1,12 @@ +_base_ = '../fcn/fcn_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py b/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7403bee864d833bcc31160665e4b54fdd738cc13 --- /dev/null +++ b/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,12 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py b/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5b72ac830be29b865ed52adaf41f2fe800f252cc --- /dev/null +++ b/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py @@ -0,0 +1,12 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='mmcls://mobilenet_v2', + backbone=dict( + _delete_=True, + type='MobileNetV2', + widen_factor=1., + strides=(1, 2, 2, 1, 1, 1, 1), + dilations=(1, 1, 1, 2, 2, 4, 4), + out_indices=(1, 2, 4, 6)), + decode_head=dict(in_channels=320), + auxiliary_head=dict(in_channels=96)) diff --git a/configs/mobilenet_v3/README.md b/configs/mobilenet_v3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2bad2a731c63ba51ee05518af893618cf7ed94a0 --- /dev/null +++ b/configs/mobilenet_v3/README.md @@ -0,0 +1,28 @@ +# Searching for MobileNetV3 + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{Howard_2019_ICCV, + title={Searching for MobileNetV3}, + author={Howard, Andrew and Sandler, Mark and Chu, Grace and Chen, Liang-Chieh and Chen, Bo and Tan, Mingxing and Wang, Weijun and Zhu, Yukun and Pang, Ruoming and Vasudevan, Vijay and Le, Quoc V. and Adam, Hartwig}, + booktitle={The IEEE International Conference on Computer Vision (ICCV)}, + pages={1314-1324}, + month={October}, + year={2019}, + doi={10.1109/ICCV.2019.00140}} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| LRASPP | M-V3-D8 | 512x1024 | 320000 | 8.9 | 15.22 | 69.54 | 70.89 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes/lraspp_m-v3-d8_512x1024_320k_cityscapes_20201224_220337-cfe8fb07.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes/lraspp_m-v3-d8_512x1024_320k_cityscapes-20201224_220337.log.json)| +| LRASPP | M-V3-D8 (scratch) | 512x1024 | 320000 | 8.9 | 14.77 | 67.87 | 69.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes_20201224_220337-9f29cd72.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes-20201224_220337.log.json)| +| LRASPP | M-V3s-D8 | 512x1024 | 320000 | 5.3 | 23.64 | 64.11 | 66.42 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes/lraspp_m-v3s-d8_512x1024_320k_cityscapes_20201224_223935-61565b34.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes/lraspp_m-v3s-d8_512x1024_320k_cityscapes-20201224_223935.log.json)| +| LRASPP | M-V3s-D8 (scratch) | 512x1024 | 320000 | 5.3 | 24.50 | 62.74 | 65.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes_20201224_223935-03daeabb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes-20201224_223935.log.json)| diff --git a/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py b/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e59a78b48be3a0997a31524fd78e7fad5636bc82 --- /dev/null +++ b/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/lraspp_m-v3-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] + +model = dict(pretrained='open-mmlab://contrib/mobilenet_v3_large') + +# Re-config the data sampler. +data = dict(samples_per_gpu=4, workers_per_gpu=4) + +runner = dict(type='IterBasedRunner', max_iters=320000) diff --git a/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py b/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a3c5435142db6b1f81421f5fd96d07ece32b5f38 --- /dev/null +++ b/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/lraspp_m-v3-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] + +# Re-config the data sampler. +data = dict(samples_per_gpu=4, workers_per_gpu=4) + +runner = dict(type='IterBasedRunner', max_iters=320000) diff --git a/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py b/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d4e368b2a11ed6433d8f2594a2cc3184fe5ddfff --- /dev/null +++ b/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py @@ -0,0 +1,23 @@ +_base_ = './lraspp_m-v3-d8_512x1024_320k_cityscapes.py' +norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='open-mmlab://contrib/mobilenet_v3_small', + backbone=dict( + type='MobileNetV3', + arch='small', + out_indices=(0, 1, 12), + norm_cfg=norm_cfg), + decode_head=dict( + type='LRASPPHead', + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) diff --git a/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py b/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0c5f707200c5d8b6d39493762baf59023dcaad11 --- /dev/null +++ b/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py @@ -0,0 +1,22 @@ +_base_ = './lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py' +norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='MobileNetV3', + arch='small', + out_indices=(0, 1, 12), + norm_cfg=norm_cfg), + decode_head=dict( + type='LRASPPHead', + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) diff --git a/configs/nonlocal_net/README.md b/configs/nonlocal_net/README.md new file mode 100644 index 0000000000000000000000000000000000000000..76352e265a9db69640c650e192f66ab75b1f19b3 --- /dev/null +++ b/configs/nonlocal_net/README.md @@ -0,0 +1,48 @@ +# Non-local Neural Networks + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{wang2018non, + title={Non-local neural networks}, + author={Wang, Xiaolong and Girshick, Ross and Gupta, Abhinav and He, Kaiming}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={7794--7803}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|----------|----------|-----------|--------:|----------|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| NonLocal | R-50-D8 | 512x1024 | 40000 | 7.4 | 2.72 | 78.24 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes/nonlocal_r50-d8_512x1024_40k_cityscapes_20200605_210748-c75e81e3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes/nonlocal_r50-d8_512x1024_40k_cityscapes_20200605_210748.log.json) | +| NonLocal | R-101-D8 | 512x1024 | 40000 | 10.9 | 1.95 | 78.66 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes/nonlocal_r101-d8_512x1024_40k_cityscapes_20200605_210748-d63729fa.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes/nonlocal_r101-d8_512x1024_40k_cityscapes_20200605_210748.log.json) | +| NonLocal | R-50-D8 | 769x769 | 40000 | 8.9 | 1.52 | 78.33 | 79.92 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes/nonlocal_r50-d8_769x769_40k_cityscapes_20200530_045243-82ef6749.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes/nonlocal_r50-d8_769x769_40k_cityscapes_20200530_045243.log.json) | +| NonLocal | R-101-D8 | 769x769 | 40000 | 12.8 | 1.05 | 78.57 | 80.29 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes/nonlocal_r101-d8_769x769_40k_cityscapes_20200530_045348-8fe9a9dc.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes/nonlocal_r101-d8_769x769_40k_cityscapes_20200530_045348.log.json) | +| NonLocal | R-50-D8 | 512x1024 | 80000 | - | - | 78.01 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes/nonlocal_r50-d8_512x1024_80k_cityscapes_20200607_193518-d6839fae.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes/nonlocal_r50-d8_512x1024_80k_cityscapes_20200607_193518.log.json) | +| NonLocal | R-101-D8 | 512x1024 | 80000 | - | - | 78.93 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes/nonlocal_r101-d8_512x1024_80k_cityscapes_20200607_183411-32700183.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes/nonlocal_r101-d8_512x1024_80k_cityscapes_20200607_183411.log.json) | +| NonLocal | R-50-D8 | 769x769 | 80000 | - | - | 79.05 | 80.68 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes/nonlocal_r50-d8_769x769_80k_cityscapes_20200607_193506-1f9792f6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes/nonlocal_r50-d8_769x769_80k_cityscapes_20200607_193506.log.json) | +| NonLocal | R-101-D8 | 769x769 | 80000 | - | - | 79.40 | 80.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes/nonlocal_r101-d8_769x769_80k_cityscapes_20200607_183428-0e1fa4f9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes/nonlocal_r101-d8_769x769_80k_cityscapes_20200607_183428.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| NonLocal | R-50-D8 | 512x512 | 80000 | 9.1 | 21.37 | 40.75 | 42.05 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k/nonlocal_r50-d8_512x512_80k_ade20k_20200615_015801-5ae0aa33.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k/nonlocal_r50-d8_512x512_80k_ade20k_20200615_015801.log.json) | +| NonLocal | R-101-D8 | 512x512 | 80000 | 12.6 | 13.97 | 42.90 | 44.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k/nonlocal_r101-d8_512x512_80k_ade20k_20200615_015758-24105919.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k/nonlocal_r101-d8_512x512_80k_ade20k_20200615_015758.log.json) | +| NonLocal | R-50-D8 | 512x512 | 160000 | - | - | 42.03 | 43.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k/nonlocal_r50-d8_512x512_160k_ade20k_20200616_005410-baef45e3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k/nonlocal_r50-d8_512x512_160k_ade20k_20200616_005410.log.json) | +| NonLocal | R-101-D8 | 512x512 | 160000 | - | - | 43.36 | 44.83 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k/nonlocal_r101-d8_512x512_160k_ade20k_20200616_003422-affd0f8d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k/nonlocal_r101-d8_512x512_160k_ade20k_20200616_003422.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| NonLocal | R-50-D8 | 512x512 | 20000 | 6.4 | 21.21 | 76.20 | 77.12 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug/nonlocal_r50-d8_512x512_20k_voc12aug_20200617_222613-07f2a57c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug/nonlocal_r50-d8_512x512_20k_voc12aug_20200617_222613.log.json) | +| NonLocal | R-101-D8 | 512x512 | 20000 | 9.8 | 14.01 | 78.15 | 78.86 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug/nonlocal_r101-d8_512x512_20k_voc12aug_20200617_222615-948c68ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug/nonlocal_r101-d8_512x512_20k_voc12aug_20200617_222615.log.json) | +| NonLocal | R-50-D8 | 512x512 | 40000 | - | - | 76.65 | 77.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug/nonlocal_r50-d8_512x512_40k_voc12aug_20200614_000028-0139d4a9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug/nonlocal_r50-d8_512x512_40k_voc12aug_20200614_000028.log.json) | +| NonLocal | R-101-D8 | 512x512 | 40000 | - | - | 78.27 | 79.12 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug/nonlocal_r101-d8_512x512_40k_voc12aug_20200614_000028-7e5ff470.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug/nonlocal_r101-d8_512x512_40k_voc12aug_20200614_000028.log.json) | diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py b/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ef7b06dd3806c1d93be41943ab4d7d49f68ac830 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py b/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7a1e66cf1c239eac3c6a4876a35d82e7b6ccec2e --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py b/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..df9c2aca9c7c1999d74a08a58aca5d220f7df54a --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py b/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..490f9873a29f2626ad764825eec97f16ee7f9f96 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py b/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..40d9190fba223251b794c105b036e4794865f785 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py b/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0c6f60dac7b457d3b936a5f7f43eb84713c77e05 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py b/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..23e6da7f23180c2350253ea400f444c0c3064fd6 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py b/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0627e2b5a76dead859212d4cab116c160df21404 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './nonlocal_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py b/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9d4dc7390370d0ffe21e7dcb686eeff7261952c4 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py b/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b0672b687ade8d554b71fdf0bc54de9f024fa30c --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py b/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..b1adfbab882d9825a3f348ed99e401d1f164cd11 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py b/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..2e808d8072f34d09a7b0859f90261dd66c8815dd --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py b/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..66b443abec3282242c0f794a2f91e066596e7ee9 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py b/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8a7a2f509ba6627ad5ab972ac090362bbcd2ecb7 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py b/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..75adef324877d56c157b457eecbf8446aa6b192f --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py b/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a0726c293d6026898110f7fa55d5e7d2d55d7a02 --- /dev/null +++ b/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/nonlocal_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/ocrnet/README.md b/configs/ocrnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0a4c75c708330be9163dae675b0c1f84d7722728 --- /dev/null +++ b/configs/ocrnet/README.md @@ -0,0 +1,69 @@ +# Object-Contextual Representations for Semantic Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@article{YuanW18, + title={Ocnet: Object context network for scene parsing}, + author={Yuhui Yuan and Jingdong Wang}, + booktitle={arXiv preprint arXiv:1809.00916}, + year={2018} +} + +@article{YuanCW20, + title={Object-Contextual Representations for Semantic Segmentation}, + author={Yuhui Yuan and Xilin Chen and Jingdong Wang}, + booktitle={ECCV}, + year={2020} +} +``` + +## Results and models + +### Cityscapes + +#### HRNet backbone + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 40000 | 3.5 | 10.45 | 74.30 | 75.95 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes/ocrnet_hr18s_512x1024_40k_cityscapes_20200601_033304-fa2436c2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes/ocrnet_hr18s_512x1024_40k_cityscapes_20200601_033304.log.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 40000 | 4.7 | 7.50 | 77.72 | 79.49 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes/ocrnet_hr18_512x1024_40k_cityscapes_20200601_033320-401c5bdd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes/ocrnet_hr18_512x1024_40k_cityscapes_20200601_033320.log.json) | +| OCRNet | HRNetV2p-W48 | 512x1024 | 40000 | 8 | 4.22 | 80.58 | 81.79 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes/ocrnet_hr48_512x1024_40k_cityscapes_20200601_033336-55b32491.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes/ocrnet_hr48_512x1024_40k_cityscapes_20200601_033336.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 80000 | - | - | 77.16 | 78.66 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes/ocrnet_hr18s_512x1024_80k_cityscapes_20200601_222735-55979e63.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes/ocrnet_hr18s_512x1024_80k_cityscapes_20200601_222735.log.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 80000 | - | - | 78.57 | 80.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes/ocrnet_hr18_512x1024_80k_cityscapes_20200614_230521-c2e1dd4a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes/ocrnet_hr18_512x1024_80k_cityscapes_20200614_230521.log.json) | +| OCRNet | HRNetV2p-W48 | 512x1024 | 80000 | - | - | 80.70 | 81.87 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes/ocrnet_hr48_512x1024_80k_cityscapes_20200601_222752-9076bcdf.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes/ocrnet_hr48_512x1024_80k_cityscapes_20200601_222752.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x1024 | 160000 | - | - | 78.45 | 79.97 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes/ocrnet_hr18s_512x1024_160k_cityscapes_20200602_191005-f4a7af28.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes/ocrnet_hr18s_512x1024_160k_cityscapes_20200602_191005.log.json) | +| OCRNet | HRNetV2p-W18 | 512x1024 | 160000 | - | - | 79.47 | 80.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes/ocrnet_hr18_512x1024_160k_cityscapes_20200602_191001-b9172d0c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes/ocrnet_hr18_512x1024_160k_cityscapes_20200602_191001.log.json) | +| OCRNet | HRNetV2p-W48 | 512x1024 | 160000 | - | - | 81.35 | 82.70 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes/ocrnet_hr48_512x1024_160k_cityscapes_20200602_191037-dfbf1b0c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes/ocrnet_hr48_512x1024_160k_cityscapes_20200602_191037.log.json) | + +#### ResNet backbone + +| Method | Backbone | Crop Size | Batch Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------|----------|-----------|----------------|------|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OCRNet | R-101-D8 | 512x1024 | 8 | 40000 | - | - | 80.09 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes/ocrnet_r101-d8_512x1024_40k_b8_cityscapes-02ac0f13.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes/ocrnet_r101-d8_512x1024_40k_b8_cityscapes_20200717_110721.log.json) | +| OCRNet | R-101-D8 | 512x1024 | 16 | 40000 | 8.8 | 3.02 | 80.30 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes/ocrnet_r101-d8_512x1024_40k_b16_cityscapes-db500f80.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes/ocrnet_r101-d8_512x1024_40k_b16_cityscapes_20200723_193726.log.json) | +| OCRNet | R-101-D8 | 512x1024 | 16 | 80000 | 8.8 | 3.02 | 80.81 | - | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes/ocrnet_r101-d8_512x1024_80k_b16_cityscapes-78688424.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes/ocrnet_r101-d8_512x1024_80k_b16_cityscapes_20200723_192421.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OCRNet | HRNetV2p-W18-Small | 512x512 | 80000 | 6.7 | 28.98 | 35.06 | 35.80 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_80k_ade20k/ocrnet_hr18s_512x512_80k_ade20k_20200615_055600-e80b62af.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_80k_ade20k/ocrnet_hr18s_512x512_80k_ade20k_20200615_055600.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 80000 | 7.9 | 18.93 | 37.79 | 39.16 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_80k_ade20k/ocrnet_hr18_512x512_80k_ade20k_20200615_053157-d173d83b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_80k_ade20k/ocrnet_hr18_512x512_80k_ade20k_20200615_053157.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 80000 | 11.2 | 16.99 | 43.00 | 44.30 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_80k_ade20k/ocrnet_hr48_512x512_80k_ade20k_20200615_021518-d168c2d1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_80k_ade20k/ocrnet_hr48_512x512_80k_ade20k_20200615_021518.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x512 | 160000 | - | - | 37.19 | 38.40 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_160k_ade20k/ocrnet_hr18s_512x512_160k_ade20k_20200615_184505-8e913058.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_160k_ade20k/ocrnet_hr18s_512x512_160k_ade20k_20200615_184505.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 160000 | - | - | 39.32 | 40.80 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_160k_ade20k/ocrnet_hr18_512x512_160k_ade20k_20200615_200940-d8fcd9d1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_160k_ade20k/ocrnet_hr18_512x512_160k_ade20k_20200615_200940.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 160000 | - | - | 43.25 | 44.88 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_160k_ade20k/ocrnet_hr48_512x512_160k_ade20k_20200615_184705-a073726d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_160k_ade20k/ocrnet_hr48_512x512_160k_ade20k_20200615_184705.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|--------------------|-----------|--------:|----------|----------------|------:|--------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OCRNet | HRNetV2p-W18-Small | 512x512 | 20000 | 3.5 | 31.55 | 71.70 | 73.84 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug/ocrnet_hr18s_512x512_20k_voc12aug_20200617_233913-02b04fcb.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug/ocrnet_hr18s_512x512_20k_voc12aug_20200617_233913.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 20000 | 4.7 | 19.91 | 74.75 | 77.11 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_20k_voc12aug/ocrnet_hr18_512x512_20k_voc12aug_20200617_233932-8954cbb7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_20k_voc12aug/ocrnet_hr18_512x512_20k_voc12aug_20200617_233932.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 20000 | 8.1 | 17.83 | 77.72 | 79.87 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_20k_voc12aug/ocrnet_hr48_512x512_20k_voc12aug_20200617_233932-9e82080a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_20k_voc12aug/ocrnet_hr48_512x512_20k_voc12aug_20200617_233932.log.json) | +| OCRNet | HRNetV2p-W18-Small | 512x512 | 40000 | - | - | 72.76 | 74.60 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug/ocrnet_hr18s_512x512_40k_voc12aug_20200614_002025-42b587ac.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug/ocrnet_hr18s_512x512_40k_voc12aug_20200614_002025.log.json) | +| OCRNet | HRNetV2p-W18 | 512x512 | 40000 | - | - | 74.98 | 77.40 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_40k_voc12aug/ocrnet_hr18_512x512_40k_voc12aug_20200614_015958-714302be.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr18_512x512_40k_voc12aug/ocrnet_hr18_512x512_40k_voc12aug_20200614_015958.log.json) | +| OCRNet | HRNetV2p-W48 | 512x512 | 40000 | - | - | 77.14 | 79.71 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_40k_voc12aug/ocrnet_hr48_512x512_40k_voc12aug_20200614_015958-255bc5ce.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/ocrnet/ocrnet_hr48_512x512_40k_voc12aug/ocrnet_hr48_512x512_40k_voc12aug_20200614_015958.log.json) | diff --git a/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py b/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1c86eba17c46a863091d999b1a090e1237202ec5 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] diff --git a/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py b/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..2c73b3839c8c1bc859eb3b8864256a00cfd022fe --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py b/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..506ad9319a9418f50650c477698c9b5cb9bf6663 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py b/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a3c86e18ea65c6aaa36a4fb6e2708f08c7ae1698 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +]) diff --git a/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py b/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ab9d6446c9089bfae533b9dcd66e1352d81f74d0 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +]) diff --git a/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py b/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..df79a9cf13963d26384b00ced0cf5efa9f68a420 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=21, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +]) diff --git a/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py b/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6ad67722a50c2b2ece5fcb7f0dd1819061ff6b3e --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/ocrnet_hr18.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + channels=sum([18, 36, 72, 144]), + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + input_transform='resize_concat', + channels=512, + ocr_channels=256, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), +]) diff --git a/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py b/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fc7909785f743071cad2cd1032000405435f81d4 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x1024_160k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py b/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..923731f74f80c11e196f6099b1c84875686cd441 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x1024_40k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py b/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..be6bf16a2fd234f3526bf8fb8c30179f1ef9df78 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py b/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..81f3d5cb91607134bb1d844d78df7a3c411c134d --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py b/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ceb944815b5a979ddb72015295375f6fe0c31a89 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x512_20k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py b/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..70babc91c99eb99ee4f941b34ea886236531832e --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x512_40k_voc12aug.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py b/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..36e77219ac2d7ee6795db7c40ad7341749a3b1c7 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = './ocrnet_hr18_512x512_80k_ade20k.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w18_small', + backbone=dict( + extra=dict( + stage1=dict(num_blocks=(2, )), + stage2=dict(num_blocks=(2, 2)), + stage3=dict(num_modules=3, num_blocks=(2, 2, 2)), + stage4=dict(num_modules=2, num_blocks=(2, 2, 2, 2))))) diff --git a/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py b/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c094391b1dfcef2fa6278f0c181fb50c303f7a4c --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x1024_160k_cityscapes.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py b/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0aada9d8dcd792fd4fc7da8908cc11d44a9ff521 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x1024_40k_cityscapes.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py b/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b2e0094393151fa8975a0d53c48b6048b7e1929 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x1024_80k_cityscapes.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=19, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py b/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..3b3e8af9538e6ce3c929a902e3d1ee5be53469a5 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x512_160k_ade20k.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py b/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..c2dd6d1158bd31ecdd7874827fd37bffb5d26db6 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x512_20k_voc12aug.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py b/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..89e6309f55f6b939f7d79271513da4934bbacbb6 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x512_40k_voc12aug.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=21, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py b/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..04971226eb0fd6461b715358ac955dfb78102992 --- /dev/null +++ b/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py @@ -0,0 +1,39 @@ +_base_ = './ocrnet_hr18_512x512_80k_ade20k.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w48', + backbone=dict( + extra=dict( + stage2=dict(num_channels=(48, 96)), + stage3=dict(num_channels=(48, 96, 192)), + stage4=dict(num_channels=(48, 96, 192, 384)))), + decode_head=[ + dict( + type='FCNHead', + in_channels=[48, 96, 192, 384], + channels=sum([48, 96, 192, 384]), + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + kernel_size=1, + num_convs=1, + norm_cfg=norm_cfg, + concat_input=False, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + dict( + type='OCRHead', + in_channels=[48, 96, 192, 384], + channels=512, + ocr_channels=256, + input_transform='resize_concat', + in_index=(0, 1, 2, 3), + norm_cfg=norm_cfg, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + ]) diff --git a/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py b/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3dd70b74a0bf912d8a6fd39f1f26be7f7571ccd6 --- /dev/null +++ b/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ocrnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) +optimizer = dict(lr=0.02) +lr_config = dict(min_lr=2e-4) diff --git a/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py b/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e34f3432e581ff506c9d2951c98b5aad7b1be6a5 --- /dev/null +++ b/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/ocrnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py b/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..33d96c76f68b92217ed38afe9538144dfedc4fd2 --- /dev/null +++ b/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ocrnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) +optimizer = dict(lr=0.02) +lr_config = dict(min_lr=2e-4) diff --git a/configs/point_rend/README.md b/configs/point_rend/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0dea3e31f8c1eb3da33251fa1e10227ae98561e3 --- /dev/null +++ b/configs/point_rend/README.md @@ -0,0 +1,32 @@ +# PointRend: Image Segmentation as Rendering + +## Introduction + +[ALGORITHM] + +``` +@misc{alex2019pointrend, + title={PointRend: Image Segmentation as Rendering}, + author={Alexander Kirillov and Yuxin Wu and Kaiming He and Ross Girshick}, + year={2019}, + eprint={1912.08193}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|---------:|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PointRend | R-50 | 512x1024 | 80000 | 3.1 | 8.48 | 76.47 | 78.13 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x1024_80k_cityscapes/pointrend_r50_512x1024_80k_cityscapes_20200711_015821-bb1ff523.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x1024_80k_cityscapes/pointrend_r50_512x1024_80k_cityscapes-20200715_214714.log.json) | +| PointRend | R-101 | 512x1024 | 80000 | 4.2 | 7.00 | 78.30 | 79.97 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x1024_80k_cityscapes/pointrend_r101_512x1024_80k_cityscapes_20200711_170850-d0ca84be.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x1024_80k_cityscapes/pointrend_r101_512x1024_80k_cityscapes-20200715_214824.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|-----------|----------|-----------|--------:|---------:|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PointRend | R-50 | 512x512 | 160000 | 5.1 | 17.31 | 37.64 | 39.17 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x512_160k_ade20k/pointrend_r50_512x512_160k_ade20k_20200807_232644-ac3febf2.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r50_512x512_160k_ade20k/pointrend_r50_512x512_160k_ade20k-20200807_232644.log.json) | +| PointRend | R-101 | 512x512 | 160000 | 6.1 | 15.50 | 40.02 | 41.60 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x512_160k_ade20k/pointrend_r101_512x512_160k_ade20k_20200808_030852-8834902a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/point_rend/pointrend_r101_512x512_160k_ade20k/pointrend_r101_512x512_160k_ade20k-20200808_030852.log.json) | diff --git a/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py b/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a8c14c8cf91d7cbcc05065a6dc387101dff8cdf6 --- /dev/null +++ b/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pointrend_r50_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py b/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..4d1f8c8154431b056fb8371772f03dfa49ac1ad3 --- /dev/null +++ b/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './pointrend_r50_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py b/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..96cbaa48d61ee208117d074e9f06bf4218407d78 --- /dev/null +++ b/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/pointrend_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +lr_config = dict(warmup='linear', warmup_iters=200) diff --git a/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py b/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..db8c634c0f889c69ce80f86c445c493dcfdbd3c8 --- /dev/null +++ b/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/pointrend_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(decode_head=[ + dict( + type='FPNHead', + in_channels=[256, 256, 256, 256], + in_index=[0, 1, 2, 3], + feature_strides=[4, 8, 16, 32], + channels=128, + dropout_ratio=-1, + num_classes=150, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + dict( + type='PointHead', + in_channels=[256], + in_index=[0], + channels=256, + num_fcs=3, + coarse_pred_each_layer=True, + dropout_ratio=-1, + num_classes=150, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) +]) +lr_config = dict(warmup='linear', warmup_iters=200) diff --git a/configs/psanet/README.md b/configs/psanet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fcb24103b8e2dd649c0ad8938319f201e3254d19 --- /dev/null +++ b/configs/psanet/README.md @@ -0,0 +1,48 @@ +# PSANet: Point-wise Spatial Attention Network for Scene Parsing + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{zhao2018psanet, + title={Psanet: Point-wise spatial attention network for scene parsing}, + author={Zhao, Hengshuang and Zhang, Yi and Liu, Shu and Shi, Jianping and Change Loy, Chen and Lin, Dahua and Jia, Jiaya}, + booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, + pages={267--283}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSANet | R-50-D8 | 512x1024 | 40000 | 7 | 3.17 | 77.63 | 79.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_40k_cityscapes/psanet_r50-d8_512x1024_40k_cityscapes_20200606_103117-99fac37c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_40k_cityscapes/psanet_r50-d8_512x1024_40k_cityscapes_20200606_103117.log.json) | +| PSANet | R-101-D8 | 512x1024 | 40000 | 10.5 | 2.20 | 79.14 | 80.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_40k_cityscapes/psanet_r101-d8_512x1024_40k_cityscapes_20200606_001418-27b9cfa7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_40k_cityscapes/psanet_r101-d8_512x1024_40k_cityscapes_20200606_001418.log.json) | +| PSANet | R-50-D8 | 769x769 | 40000 | 7.9 | 1.40 | 77.99 | 79.64 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_40k_cityscapes/psanet_r50-d8_769x769_40k_cityscapes_20200530_033717-d5365506.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_40k_cityscapes/psanet_r50-d8_769x769_40k_cityscapes_20200530_033717.log.json) | +| PSANet | R-101-D8 | 769x769 | 40000 | 11.9 | 0.98 | 78.43 | 80.26 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_40k_cityscapes/psanet_r101-d8_769x769_40k_cityscapes_20200530_035107-997da1e6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_40k_cityscapes/psanet_r101-d8_769x769_40k_cityscapes_20200530_035107.log.json) | +| PSANet | R-50-D8 | 512x1024 | 80000 | - | - | 77.24 | 78.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_80k_cityscapes/psanet_r50-d8_512x1024_80k_cityscapes_20200606_161842-ab60a24f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x1024_80k_cityscapes/psanet_r50-d8_512x1024_80k_cityscapes_20200606_161842.log.json) | +| PSANet | R-101-D8 | 512x1024 | 80000 | - | - | 79.31 | 80.53 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_80k_cityscapes/psanet_r101-d8_512x1024_80k_cityscapes_20200606_161823-0f73a169.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x1024_80k_cityscapes/psanet_r101-d8_512x1024_80k_cityscapes_20200606_161823.log.json) | +| PSANet | R-50-D8 | 769x769 | 80000 | - | - | 79.31 | 80.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_80k_cityscapes/psanet_r50-d8_769x769_80k_cityscapes_20200606_225134-fe42f49e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_769x769_80k_cityscapes/psanet_r50-d8_769x769_80k_cityscapes_20200606_225134.log.json) | +| PSANet | R-101-D8 | 769x769 | 80000 | - | - | 79.69 | 80.89 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_80k_cityscapes/psanet_r101-d8_769x769_80k_cityscapes_20200606_214550-7665827b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_769x769_80k_cityscapes/psanet_r101-d8_769x769_80k_cityscapes_20200606_214550.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSANet | R-50-D8 | 512x512 | 80000 | 9 | 18.91 | 41.14 | 41.91 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_80k_ade20k/psanet_r50-d8_512x512_80k_ade20k_20200614_144141-835e4b97.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_80k_ade20k/psanet_r50-d8_512x512_80k_ade20k_20200614_144141.log.json) | +| PSANet | R-101-D8 | 512x512 | 80000 | 12.5 | 13.13 | 43.80 | 44.75 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_80k_ade20k/psanet_r101-d8_512x512_80k_ade20k_20200614_185117-1fab60d4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_80k_ade20k/psanet_r101-d8_512x512_80k_ade20k_20200614_185117.log.json) | +| PSANet | R-50-D8 | 512x512 | 160000 | - | - | 41.67 | 42.95 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_160k_ade20k/psanet_r50-d8_512x512_160k_ade20k_20200615_161258-148077dd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_160k_ade20k/psanet_r50-d8_512x512_160k_ade20k_20200615_161258.log.json) | +| PSANet | R-101-D8 | 512x512 | 160000 | - | - | 43.74 | 45.38 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_160k_ade20k/psanet_r101-d8_512x512_160k_ade20k_20200615_161537-dbfa564c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_160k_ade20k/psanet_r101-d8_512x512_160k_ade20k_20200615_161537.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSANet | R-50-D8 | 512x512 | 20000 | 6.9 | 18.24 | 76.39 | 77.34 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_20k_voc12aug/psanet_r50-d8_512x512_20k_voc12aug_20200617_102413-2f1bbaa1.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_20k_voc12aug/psanet_r50-d8_512x512_20k_voc12aug_20200617_102413.log.json) | +| PSANet | R-101-D8 | 512x512 | 20000 | 10.4 | 12.63 | 77.91 | 79.30 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_20k_voc12aug/psanet_r101-d8_512x512_20k_voc12aug_20200617_110624-946fef11.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_20k_voc12aug/psanet_r101-d8_512x512_20k_voc12aug_20200617_110624.log.json) | +| PSANet | R-50-D8 | 512x512 | 40000 | - | - | 76.30 | 77.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_40k_voc12aug/psanet_r50-d8_512x512_40k_voc12aug_20200613_161946-f596afb5.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r50-d8_512x512_40k_voc12aug/psanet_r50-d8_512x512_40k_voc12aug_20200613_161946.log.json) | +| PSANet | R-101-D8 | 512x512 | 40000 | - | - | 77.73 | 79.05 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_40k_voc12aug/psanet_r101-d8_512x512_40k_voc12aug_20200613_161946-1f560f9e.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/psanet/psanet_r101-d8_512x512_40k_voc12aug/psanet_r101-d8_512x512_40k_voc12aug_20200613_161946.log.json) | diff --git a/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py b/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..69d212f158552cf5a24f62174b24a9d4976477bb --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py b/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..bc25d6aaf67ccb7e9fcb44ba2d803bebfa31b160 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py b/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7f6795e5ef0e4bf1d10ee7ed4f608bf93ac24216 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py b/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1a3c43495bbf9d302216d7ddf62df75446907a36 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py b/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f62eef9773ddf41d996104de571bcda00c488e14 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py b/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f8865a7c4d795d9de3f5bc6b762b305b3cabc22f --- /dev/null +++ b/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py b/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ffc99f010903267fc7c1893f4a6b0dcd2cbe42e6 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py b/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6a9efc55ad2062facf3a568f8cdbba76c8c55950 --- /dev/null +++ b/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './psanet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py b/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6671fcb4bf8430bc0128cd93a4b8cedea1856b03 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py b/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a441013a4c1adc39fc064dbac23caaac9efdc4a6 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py b/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9c6364eb43e2abc95011205b569627ff9367d0e5 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(mask_size=(66, 66), num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py b/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..af06cb66cc808c206d6946a4b2420a6942d3dc7e --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py b/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..803c42da35eda861bf32ce0e7866cdc9fad96d0d --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py b/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0141a6d0925c2a2aa37517670a9f12ac7d3a02d4 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(mask_size=(66, 66), num_classes=150), + auxiliary_head=dict(num_classes=150)) diff --git a/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py b/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..690f8b5ef359be8a8be3a2d768aede24216a8706 --- /dev/null +++ b/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py b/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0966b4770cc649e95525c366b09801408b99567a --- /dev/null +++ b/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/psanet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/pspnet/README.md b/configs/pspnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..931cad900680281d6970626b511124704e954c43 --- /dev/null +++ b/configs/pspnet/README.md @@ -0,0 +1,62 @@ +# Pyramid Scene Parsing Network + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{zhao2017pspnet, + title={Pyramid Scene Parsing Network}, + author={Zhao, Hengshuang and Shi, Jianping and Qi, Xiaojuan and Wang, Xiaogang and Jia, Jiaya}, + booktitle={CVPR}, + year={2017} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSPNet | R-50-D8 | 512x1024 | 40000 | 6.1 | 4.07 | 77.85 | 79.18 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338.log.json) | +| PSPNet | R-101-D8 | 512x1024 | 40000 | 9.6 | 2.68 | 78.34 | 79.74 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751-467e7cf4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes/pspnet_r101-d8_512x1024_40k_cityscapes_20200604_232751.log.json) | +| PSPNet | R-50-D8 | 769x769 | 40000 | 6.9 | 1.76 | 78.26 | 79.88 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_40k_cityscapes/pspnet_r50-d8_769x769_40k_cityscapes_20200606_112725-86638686.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_40k_cityscapes/pspnet_r50-d8_769x769_40k_cityscapes_20200606_112725.log.json) | +| PSPNet | R-101-D8 | 769x769 | 40000 | 10.9 | 1.15 | 79.08 | 80.28 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_40k_cityscapes/pspnet_r101-d8_769x769_40k_cityscapes_20200606_112753-61c6f5be.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_40k_cityscapes/pspnet_r101-d8_769x769_40k_cityscapes_20200606_112753.log.json) | +| PSPNet | R-18-D8 | 512x1024 | 80000 | 1.7 | 15.71 | 74.87 | 76.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes/pspnet_r18-d8_512x1024_80k_cityscapes_20201225_021458-09ffa746.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes/pspnet_r18-d8_512x1024_80k_cityscapes-20201225_021458.log.json) | +| PSPNet | R-50-D8 | 512x1024 | 80000 | - | - | 78.55 | 79.79 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131-2376f12b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes/pspnet_r50-d8_512x1024_80k_cityscapes_20200606_112131.log.json) | +| PSPNet | R-101-D8 | 512x1024 | 80000 | - | - | 79.76 | 81.01 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes/pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211-e1e1100f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes/pspnet_r101-d8_512x1024_80k_cityscapes_20200606_112211.log.json) | +| PSPNet | R-18-D8 | 769x769 | 80000 | 1.9 | 6.20 | 75.90 | 77.86 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_769x769_80k_cityscapes/pspnet_r18-d8_769x769_80k_cityscapes_20201225_021458-3deefc62.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18-d8_769x769_80k_cityscapes/pspnet_r18-d8_769x769_80k_cityscapes-20201225_021458.log.json) | +| PSPNet | R-50-D8 | 769x769 | 80000 | - | - | 79.59 | 80.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_80k_cityscapes/pspnet_r50-d8_769x769_80k_cityscapes_20200606_210121-5ccf03dd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_769x769_80k_cityscapes/pspnet_r50-d8_769x769_80k_cityscapes_20200606_210121.log.json) | +| PSPNet | R-101-D8 | 769x769 | 80000 | - | - | 79.77 | 81.06 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_80k_cityscapes/pspnet_r101-d8_769x769_80k_cityscapes_20200606_225055-dba412fa.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_769x769_80k_cityscapes/pspnet_r101-d8_769x769_80k_cityscapes_20200606_225055.log.json) | +| PSPNet | R-18b-D8 | 512x1024 | 80000 | 1.5 | 16.28 | 74.23 | 75.79 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes/pspnet_r18b-d8_512x1024_80k_cityscapes_20201226_063116-26928a60.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes/pspnet_r18b-d8_512x1024_80k_cityscapes-20201226_063116.log.json) | +| PSPNet | R-50b-D8 | 512x1024 | 80000 | 6.0 | 4.30 | 78.22 | 79.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes/pspnet_r50b-d8_512x1024_80k_cityscapes_20201225_094315-6344287a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes/pspnet_r50b-d8_512x1024_80k_cityscapes-20201225_094315.log.json) | +| PSPNet | R-101b-D8| 512x1024 | 80000 | 9.5 | 2.76 | 79.69 | 80.79 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes_20201226_170012-3a4d38ab.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes/pspnet_r101b-d8_512x1024_80k_cityscapes-20201226_170012.log.json) | +| PSPNet | R-18b-D8 | 769x769 | 80000 | 1.7 | 6.41 | 74.92 | 76.90 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes/pspnet_r18b-d8_769x769_80k_cityscapes_20201226_080942-bf98d186.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes/pspnet_r18b-d8_769x769_80k_cityscapes-20201226_080942.log.json) | +| PSPNet | R-50b-D8 | 769x769 | 80000 | 6.8 | 1.88 | 78.50 | 79.96 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes/pspnet_r50b-d8_769x769_80k_cityscapes_20201225_094316-4c643cf6.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes/pspnet_r50b-d8_769x769_80k_cityscapes-20201225_094316.log.json) | +| PSPNet | R-101b-D8| 769x769 | 80000 | 10.8 | 1.17 | 78.87 | 80.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes/pspnet_r101b-d8_769x769_80k_cityscapes_20201226_171823-f0e7c293.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes/pspnet_r101b-d8_769x769_80k_cityscapes-20201226_171823.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSPNet | R-50-D8 | 512x512 | 80000 | 8.5 | 23.53 | 41.13 | 41.94 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_ade20k/pspnet_r50-d8_512x512_80k_ade20k_20200615_014128-15a8b914.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_80k_ade20k/pspnet_r50-d8_512x512_80k_ade20k_20200615_014128.log.json) | +| PSPNet | R-101-D8 | 512x512 | 80000 | 12 | 15.30 | 43.57 | 44.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_ade20k/pspnet_r101-d8_512x512_80k_ade20k_20200614_031423-b6e782f0.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_80k_ade20k/pspnet_r101-d8_512x512_80k_ade20k_20200614_031423.log.json) | +| PSPNet | R-50-D8 | 512x512 | 160000 | - | - | 42.48 | 43.44 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_160k_ade20k/pspnet_r50-d8_512x512_160k_ade20k_20200615_184358-1890b0bd.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_160k_ade20k/pspnet_r50-d8_512x512_160k_ade20k_20200615_184358.log.json) | +| PSPNet | R-101-D8 | 512x512 | 160000 | - | - | 44.39 | 45.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_160k_ade20k/pspnet_r101-d8_512x512_160k_ade20k_20200615_100650-967c316f.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_160k_ade20k/pspnet_r101-d8_512x512_160k_ade20k_20200615_100650.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSPNet | R-50-D8 | 512x512 | 20000 | 6.1 | 23.59 | 76.78 | 77.61 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_20k_voc12aug/pspnet_r50-d8_512x512_20k_voc12aug_20200617_101958-ed5dfbd9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_20k_voc12aug/pspnet_r50-d8_512x512_20k_voc12aug_20200617_101958.log.json) | +| PSPNet | R-101-D8 | 512x512 | 20000 | 9.6 | 15.02 | 78.47 | 79.25 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_20k_voc12aug/pspnet_r101-d8_512x512_20k_voc12aug_20200617_102003-4aef3c9a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_20k_voc12aug/pspnet_r101-d8_512x512_20k_voc12aug_20200617_102003.log.json) | +| PSPNet | R-50-D8 | 512x512 | 40000 | - | - | 77.29 | 78.48 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_40k_voc12aug/pspnet_r50-d8_512x512_40k_voc12aug_20200613_161222-ae9c1b8c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r50-d8_512x512_40k_voc12aug/pspnet_r50-d8_512x512_40k_voc12aug_20200613_161222.log.json) | +| PSPNet | R-101-D8 | 512x512 | 40000 | - | - | 78.52 | 79.57 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_40k_voc12aug/pspnet_r101-d8_512x512_40k_voc12aug_20200613_161222-bc933b18.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_512x512_40k_voc12aug/pspnet_r101-d8_512x512_40k_voc12aug_20200613_161222.log.json) | + +### Pascal Context + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PSPNet | R-101-D8 | 480x480 | 40000 | 8.8 | 9.68 | 46.60 | 47.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context/pspnet_r101-d8_480x480_40k_pascal_context_20200911_211210-bf0f5d7c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_40k_pascal_context/pspnet_r101-d8_480x480_40k_pascal_context-20200911_211210.log.json) | +| PSPNet | R-101-D8 | 480x480 | 80000 | - | - | 46.03 | 47.15 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context/pspnet_r101-d8_480x480_80k_pascal_context_20200911_190530-c86d6233.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/pspnet/pspnet_r101-d8_480x480_80k_pascal_context/pspnet_r101-d8_480x480_80k_pascal_context-20200911_190530.log.json) | diff --git a/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py b/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0b5a990604a77238375cb6d2b8298a382a457dd6 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_480x480_40k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py b/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..fda9110603d71e14cab6e537949be191f2adf6db --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_480x480_80k_pascal_context.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py b/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..38fee11bc23d8c92c529acd0c02a68204e34ab91 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9931a07bc2d137eb49b3fa4dad8f8681d4f5e943 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py b/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6107b41544378ad371cee95ee5ebc2e98ccbd9ad --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py b/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..2221b202d6c53c4b04f2431d3344379cbfe06dd7 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py b/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..15f578b6002c481ada06befc3ea66accbbdd1f66 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py b/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..fb7c3d55d57b09296ea24889b218f9a0fb997463 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py b/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c6e7e58508f31627766b8ab748bd81cd51c77eca --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..59b8c6dd5ef234334bcdfa3d5e3594b7a9989b17 --- /dev/null +++ b/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ab8a3d3e3fcc12dd41223af190e2ae04f14d1cb8 --- /dev/null +++ b/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1a7cb708e551e90a12ad4267e2af6938c353f0ba --- /dev/null +++ b/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet101', + backbone=dict(type='ResNet', depth=101)) diff --git a/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d914f93c023a6384e0e856b8608280cef589d5c6 --- /dev/null +++ b/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5893e66a41cad73e8fb24aa58dc78ef002aecca5 --- /dev/null +++ b/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..abeeedf84387d7846a8a2c10480b94c9d8405559 --- /dev/null +++ b/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..284be6d09af1806b99bee5b85286b55ce02e8cbd --- /dev/null +++ b/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict( + pretrained='torchvision://resnet18', + backbone=dict(type='ResNet', depth=18), + decode_head=dict( + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py b/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..86da94de5b32576f04240a2d02dfeccc0d6ddd45 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=60), auxiliary_head=dict(num_classes=60)) +test_cfg = dict(mode='slide', crop_size=(480, 480), stride=(320, 320)) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py b/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..cbb02714b9e252bab38b3f9d9095dabe570b9005 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=60), auxiliary_head=dict(num_classes=60)) +test_cfg = dict(mode='slide', crop_size=(480, 480), stride=(320, 320)) +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) diff --git a/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py b/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5deb5872b00a30d5c18a980c4d6c1b0d915908b9 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4e9972849d6899fe43f435284d0e0b1bc3b0e7a9 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py b/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..86584573a3d1afac73041b85516112ac21f1f17c --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py b/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..cd88154d5e0be1a519e973331e0a14ae8a7de13e --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py b/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f0c20c12f6bcf04b732dccaa4bfdba10bd10b5e6 --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py b/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..52efdf51d7d66c3205c1448c45ae281649a0901e --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py b/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..145cadb24016eeea87fccff8171c5b0dfb78f7ab --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..23a81eb7ef56a4cd8e7c9da65b86f3d0e562001a --- /dev/null +++ b/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_r50-d8.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py b/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..946bf4fc84236942a4462c2daa7637cace4e90cf --- /dev/null +++ b/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py b/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b6087dcf9f7cc04e12a2b9bcbde7abc4a56e972e --- /dev/null +++ b/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' +model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) diff --git a/configs/resnest/README.md b/configs/resnest/README.md new file mode 100644 index 0000000000000000000000000000000000000000..31bac01ec9f659d6c30f220a104c385326d3f04b --- /dev/null +++ b/configs/resnest/README.md @@ -0,0 +1,34 @@ +# ResNeSt: Split-Attention Networks + +## Introduction + +[ALGORITHM] + +```latex +@article{zhang2020resnest, +title={ResNeSt: Split-Attention Networks}, +author={Zhang, Hang and Wu, Chongruo and Zhang, Zhongyue and Zhu, Yi and Zhang, Zhi and Lin, Haibin and Sun, Yue and He, Tong and Muller, Jonas and Manmatha, R. and Li, Mu and Smola, Alexander}, +journal={arXiv preprint arXiv:2004.08955}, +year={2020} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | S-101-D8 | 512x1024 | 80000 | 11.4 | 2.39 | 77.56 | 78.98 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x1024_80k_cityscapes/fcn_s101-d8_512x1024_80k_cityscapes_20200807_140631-f8d155b3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x1024_80k_cityscapes/fcn_s101-d8_512x1024_80k_cityscapes-20200807_140631.log.json) | +| PSPNet | S-101-D8 | 512x1024 | 80000 | 11.8 | 2.52 | 78.57 | 79.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x1024_80k_cityscapes/pspnet_s101-d8_512x1024_80k_cityscapes_20200807_140631-c75f3b99.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x1024_80k_cityscapes/pspnet_s101-d8_512x1024_80k_cityscapes-20200807_140631.log.json) | +| DeepLabV3 | S-101-D8 | 512x1024 | 80000 | 11.9 | 1.88 | 79.67 | 80.51 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes/deeplabv3_s101-d8_512x1024_80k_cityscapes_20200807_144429-b73c4270.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes/deeplabv3_s101-d8_512x1024_80k_cityscapes-20200807_144429.log.json) | +| DeepLabV3+ | S-101-D8 | 512x1024 | 80000 | 13.2 | 2.36 | 79.62 | 80.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes/deeplabv3plus_s101-d8_512x1024_80k_cityscapes_20200807_144429-1239eb43.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes/deeplabv3plus_s101-d8_512x1024_80k_cityscapes-20200807_144429.log.json) | + +### ADE20k + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|------------|----------|-----------|--------:|---------:|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FCN | S-101-D8 | 512x512 | 160000 | 14.2 | 12.86 | 45.62 | 46.16 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x512_160k_ade20k/fcn_s101-d8_512x512_160k_ade20k_20200807_145416-d3160329.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/fcn_s101-d8_512x512_160k_ade20k/fcn_s101-d8_512x512_160k_ade20k-20200807_145416.log.json) | +| PSPNet | S-101-D8 | 512x512 | 160000 | 14.2 | 13.02 | 45.44 | 46.28 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x512_160k_ade20k/pspnet_s101-d8_512x512_160k_ade20k_20200807_145416-a6daa92a.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/pspnet_s101-d8_512x512_160k_ade20k/pspnet_s101-d8_512x512_160k_ade20k-20200807_145416.log.json) | +| DeepLabV3 | S-101-D8 | 512x512 | 160000 | 14.6 | 9.28 | 45.71 | 46.59 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x512_160k_ade20k/deeplabv3_s101-d8_512x512_160k_ade20k_20200807_144503-17ecabe5.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3_s101-d8_512x512_160k_ade20k/deeplabv3_s101-d8_512x512_160k_ade20k-20200807_144503.log.json) | +| DeepLabV3+ | S-101-D8 | 512x512 | 160000 | 16.2 | 11.96 | 46.47 | 47.27 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k/deeplabv3plus_s101-d8_512x512_160k_ade20k_20200807_144503-27b26226.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k/deeplabv3plus_s101-d8_512x512_160k_ade20k-20200807_144503.log.json) | diff --git a/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py b/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f98398690eb3e1e77975d7fb94ea865424aa331b --- /dev/null +++ b/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py b/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..e3924ad679cb3d7ba731322f9cdb67410baae59a --- /dev/null +++ b/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py b/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..69bef7238345cf6aabb126012af992602f910287 --- /dev/null +++ b/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py b/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..d51bccb965dafc40d7859219d132dc9467740a1b --- /dev/null +++ b/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = '../deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py b/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..33fa0252d8b4cc786f1297605c169ee6068195a4 --- /dev/null +++ b/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = '../fcn/fcn_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py b/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..dcee8c280e833825f84b944c6db21e9a43125e06 --- /dev/null +++ b/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = '../fcn/fcn_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py b/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9737849cbd7470b03ef3fcb3b1225283370eb503 --- /dev/null +++ b/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py b/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6a622eae963401e143004a62ff53071ddbf61c01 --- /dev/null +++ b/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py @@ -0,0 +1,9 @@ +_base_ = '../pspnet/pspnet_r101-d8_512x512_160k_ade20k.py' +model = dict( + pretrained='open-mmlab://resnest101', + backbone=dict( + type='ResNeSt', + stem_channels=128, + radix=2, + reduction_factor=4, + avg_down_stride=True)) diff --git a/configs/sem_fpn/README.md b/configs/sem_fpn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c73ade624817b61be2f226c6fae03d0b023c570a --- /dev/null +++ b/configs/sem_fpn/README.md @@ -0,0 +1,35 @@ +# Panoptic Feature Pyramid Networks + +## Introduction + +[ALGORITHM] + +```latex +@article{Kirillov_2019, + title={Panoptic Feature Pyramid Networks}, + ISBN={9781728132938}, + url={http://dx.doi.org/10.1109/CVPR.2019.00656}, + DOI={10.1109/cvpr.2019.00656}, + journal={2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, + publisher={IEEE}, + author={Kirillov, Alexander and Girshick, Ross and He, Kaiming and Dollar, Piotr}, + year={2019}, + month={Jun} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FPN | R-50 | 512x1024 | 80000 | 2.8 | 13.54 | 74.52 | 76.08 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x1024_80k_cityscapes/fpn_r50_512x1024_80k_cityscapes_20200717_021437-94018a0d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x1024_80k_cityscapes/fpn_r50_512x1024_80k_cityscapes-20200717_021437.log.json) | +| FPN | R-101 | 512x1024 | 80000 | 3.9 | 10.29 | 75.80 | 77.40 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x1024_80k_cityscapes/fpn_r101_512x1024_80k_cityscapes_20200717_012416-c5800d4c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x1024_80k_cityscapes/fpn_r101_512x1024_80k_cityscapes-20200717_012416.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|--------|----------|-----------|--------:|---------:|----------------|------:|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| FPN | R-50 | 512x512 | 160000 | 4.9 | 55.77 | 37.49 | 39.09 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x512_160k_ade20k/fpn_r50_512x512_160k_ade20k_20200718_131734-5b5a6ab9.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r50_512x512_160k_ade20k/fpn_r50_512x512_160k_ade20k-20200718_131734.log.json) | +| FPN | R-101 | 512x512 | 160000 | 5.9 | 40.58 | 39.35 | 40.72 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x512_160k_ade20k/fpn_r101_512x512_160k_ade20k_20200718_131734-306b5004.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/sem_fpn/fpn_r101_512x512_160k_ade20k/fpn_r101_512x512_160k_ade20k-20200718_131734.log.json) | diff --git a/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py b/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7f8710d4be4ee0664f644b9037fd4653e4655907 --- /dev/null +++ b/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './fpn_r50_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py b/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..2654096dfd78ecdd4065ac2d26cab3e2f11a9c65 --- /dev/null +++ b/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './fpn_r50_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py b/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4bf3edd825296fbbed883effc3622793e9adf071 --- /dev/null +++ b/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py b/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5cdfc8ca264c6045dcb7ad890d89f15537bef233 --- /dev/null +++ b/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/fpn_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict(decode_head=dict(num_classes=150)) diff --git a/configs/unet/README.md b/configs/unet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d815510a19ade68c4962f04b8dee2c317f1788ce --- /dev/null +++ b/configs/unet/README.md @@ -0,0 +1,50 @@ +# U-Net: Convolutional Networks for Biomedical Image Segmentation + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{ronneberger2015u, + title={U-net: Convolutional networks for biomedical image segmentation}, + author={Ronneberger, Olaf and Fischer, Philipp and Brox, Thomas}, + booktitle={International Conference on Medical image computing and computer-assisted intervention}, + pages={234--241}, + year={2015}, + organization={Springer} +} +``` + +## Results and models + +### DRIVE + +| Backbone | Head | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Dice | download | +|--------|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UNet-S5-D16 | FCN | 584x565 | 64x64 | 42x42 | 40000 | 0.680 | - | 78.67 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_64x64_40k_drive/fcn_unet_s5-d16_64x64_40k_drive_20201223_191051-26cee593.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_64x64_40k_drive/fcn_unet_s5-d16_64x64_40k_drive-20201223_191051.log.json) | +| UNet-S5-D16 | PSPNet | 584x565 | 64x64 | 42x42 | 40000 | 0.599 | - | 78.62 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_64x64_40k_drive/pspnet_unet_s5-d16_64x64_40k_drive_20201227_181818-aac73387.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_64x64_40k_drive/pspnet_unet_s5-d16_64x64_40k_drive-20201227_181818.log.json) | +| UNet-S5-D16 | DeepLabV3 | 584x565 | 64x64 | 42x42 | 40000 | 0.596 | - | 78.69 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_64x64_40k_drive/deeplabv3_unet_s5-d16_64x64_40k_drive_20201226_094047-0671ff20.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_64x64_40k_drive/deeplabv3_unet_s5-d16_64x64_40k_drive-20201226_094047.log.json) | + +### STARE + +| Backbone | Head | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Dice | download | +|--------|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UNet-S5-D16 | FCN | 605x700 | 128x128 | 85x85 | 40000 | 0.968 | - | 81.02 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_stare/fcn_unet_s5-d16_128x128_40k_stare_20201223_191051-6ea7cfda.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_stare/fcn_unet_s5-d16_128x128_40k_stare-20201223_191051.log.json) | +| UNet-S5-D16 | PSPNet | 605x700 | 128x128 | 85x85 | 40000 | 0.982 | - | 81.22 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_stare/pspnet_unet_s5-d16_128x128_40k_stare_20201227_181818-3c2923c4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_stare/pspnet_unet_s5-d16_128x128_40k_stare-20201227_181818.log.json) | +| UNet-S5-D16 | DeepLabV3 | 605x700 | 128x128 | 85x85 | 40000 | 0.999 | - | 80.93 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_stare/deeplabv3_unet_s5-d16_128x128_40k_stare_20201226_094047-93dcb93c.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_stare/deeplabv3_unet_s5-d16_128x128_40k_stare-20201226_094047.log.json) | + +### CHASE_DB1 + +| Backbone | Head | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Dice | download | +|--------|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UNet-S5-D16 | FCN | 960x999 | 128x128 | 85x85 | 40000 | 0.968 | - | 80.24 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_chase_db1/fcn_unet_s5-d16_128x128_40k_chase_db1_20201223_191051-95852f45.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_128x128_40k_chase_db1/fcn_unet_s5-d16_128x128_40k_chase_db1-20201223_191051.log.json) | +| UNet-S5-D16 | PSPNet | 960x999 | 128x128 | 85x85 | 40000 | 0.982 | - | 80.36 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1/pspnet_unet_s5-d16_128x128_40k_chase_db1_20201227_181818-68d4e609.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1/pspnet_unet_s5-d16_128x128_40k_chase_db1-20201227_181818.log.json) | +| UNet-S5-D16 | DeepLabV3 | 960x999 | 128x128 | 85x85 | 40000 | 0.999 | - | 80.47 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1/deeplabv3_unet_s5-d16_128x128_40k_chase_db1_20201226_094047-4c5aefa3.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1/deeplabv3_unet_s5-d16_128x128_40k_chase_db1-20201226_094047.log.json) | + +### HRF + +| Backbone | Head | Image Size | Crop Size | Stride | Lr schd | Mem (GB) | Inf time (fps) | Dice | download | +|--------|----------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UNet-S5-D16 | FCN | 2336x3504 | 256x256 | 170x170 | 40000 | 2.525 | - | 79.45 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_256x256_40k_hrf/fcn_unet_s5-d16_256x256_40k_hrf_20201223_173724-df3ec8c4.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/fcn_unet_s5-d16_256x256_40k_hrf/fcn_unet_s5-d16_256x256_40k_hrf-20201223_173724.log.json) | +| UNet-S5-D16 | PSPNet | 2336x3504 | 256x256 | 170x170 | 40000 | 2.588 | - | 80.07 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_256x256_40k_hrf/pspnet_unet_s5-d16_256x256_40k_hrf_20201227_181818-fdb7e29b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/pspnet_unet_s5-d16_256x256_40k_hrf/pspnet_unet_s5-d16_256x256_40k_hrf-20201227_181818.log.json) | +| UNet-S5-D16 | DeepLabV3 | 2336x3504 | 256x256 | 170x170 | 40000 | 2.604 | - | 80.21 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf/deeplabv3_unet_s5-d16_256x256_40k_hrf_20201226_094047-3a1fdf85.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf/deeplabv3_unet_s5-d16_256x256_40k_hrf-20201226_094047.log.json) | diff --git a/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py b/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..c706cf3548e311a7930e5b58299e05af30c43d98 --- /dev/null +++ b/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', + '../_base_/datasets/chase_db1.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py b/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..0ef02dcc491871f148b1ad038d281d250eb6e2f4 --- /dev/null +++ b/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', '../_base_/datasets/stare.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py b/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..118428bc44d3078517e231399b131db492f2bc7e --- /dev/null +++ b/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', '../_base_/datasets/hrf.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py b/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..1f8862a0e89243d67634f37c3aca94ca98feff5c --- /dev/null +++ b/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/deeplabv3_unet_s5-d16.py', '../_base_/datasets/drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py b/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..2bc52d96293f214adf1e3e1878746ed8bd2434f6 --- /dev/null +++ b/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/chase_db1.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py b/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..5d836c61dfd568dd4d29d876980001067dcaa200 --- /dev/null +++ b/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/stare.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py b/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..be8eec77792f4eb16475dc5ab8607fb5682f0acf --- /dev/null +++ b/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/hrf.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py b/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..80483ade4a4bc3dc5cb8805e8b74c100e872da0c --- /dev/null +++ b/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/fcn_unet_s5-d16.py', '../_base_/datasets/drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py b/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..b085a17d6bab5f4d33668bfcf232e30f2a9830fe --- /dev/null +++ b/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', + '../_base_/datasets/chase_db1.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py b/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..9d729cea699e1c845549c74b52703c9ee3273662 --- /dev/null +++ b/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', '../_base_/datasets/stare.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(128, 128), stride=(85, 85))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py b/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..f57c9166b67a18fd74f474754b3baec6584b17cf --- /dev/null +++ b/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', '../_base_/datasets/hrf.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(256, 256), stride=(170, 170))) +evaluation = dict(metric='mDice') diff --git a/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py b/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..7b5421ad6877e4b35b0a6ae6e516e577404547ce --- /dev/null +++ b/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/pspnet_unet_s5-d16.py', '../_base_/datasets/drive.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +model = dict(test_cfg=dict(crop_size=(64, 64), stride=(42, 42))) +evaluation = dict(metric='mDice') diff --git a/configs/upernet/README.md b/configs/upernet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4d53a92f9bdb67ca9e4c3974ee368ca49d84619c --- /dev/null +++ b/configs/upernet/README.md @@ -0,0 +1,48 @@ +# Unified Perceptual Parsing for Scene Understanding + +## Introduction + +[ALGORITHM] + +```latex +@inproceedings{xiao2018unified, + title={Unified perceptual parsing for scene understanding}, + author={Xiao, Tete and Liu, Yingcheng and Zhou, Bolei and Jiang, Yuning and Sun, Jian}, + booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, + pages={418--434}, + year={2018} +} +``` + +## Results and models + +### Cityscapes + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|---------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UPerNet | R-50 | 512x1024 | 40000 | 6.4 | 4.25 | 77.10 | 78.37 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_40k_cityscapes/upernet_r50_512x1024_40k_cityscapes_20200605_094827-aa54cb54.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_40k_cityscapes/upernet_r50_512x1024_40k_cityscapes_20200605_094827.log.json) | +| UPerNet | R-101 | 512x1024 | 40000 | 7.4 | 3.79 | 78.69 | 80.11 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_40k_cityscapes/upernet_r101_512x1024_40k_cityscapes_20200605_094933-ebce3b10.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_40k_cityscapes/upernet_r101_512x1024_40k_cityscapes_20200605_094933.log.json) | +| UPerNet | R-50 | 769x769 | 40000 | 7.2 | 1.76 | 77.98 | 79.70 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_40k_cityscapes/upernet_r50_769x769_40k_cityscapes_20200530_033048-92d21539.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_40k_cityscapes/upernet_r50_769x769_40k_cityscapes_20200530_033048.log.json) | +| UPerNet | R-101 | 769x769 | 40000 | 8.4 | 1.56 | 79.03 | 80.77 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_40k_cityscapes/upernet_r101_769x769_40k_cityscapes_20200530_040819-83c95d01.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_40k_cityscapes/upernet_r101_769x769_40k_cityscapes_20200530_040819.log.json) | +| UPerNet | R-50 | 512x1024 | 80000 | - | - | 78.19 | 79.19 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_80k_cityscapes/upernet_r50_512x1024_80k_cityscapes_20200607_052207-848beca8.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x1024_80k_cityscapes/upernet_r50_512x1024_80k_cityscapes_20200607_052207.log.json) | +| UPerNet | R-101 | 512x1024 | 80000 | - | - | 79.40 | 80.46 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_80k_cityscapes/upernet_r101_512x1024_80k_cityscapes_20200607_002403-f05f2345.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x1024_80k_cityscapes/upernet_r101_512x1024_80k_cityscapes_20200607_002403.log.json) | +| UPerNet | R-50 | 769x769 | 80000 | - | - | 79.39 | 80.92 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_80k_cityscapes/upernet_r50_769x769_80k_cityscapes_20200607_005107-82ae7d15.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_769x769_80k_cityscapes/upernet_r50_769x769_80k_cityscapes_20200607_005107.log.json) | +| UPerNet | R-101 | 769x769 | 80000 | - | - | 80.10 | 81.49 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_80k_cityscapes/upernet_r101_769x769_80k_cityscapes_20200607_001014-082fc334.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_769x769_80k_cityscapes/upernet_r101_769x769_80k_cityscapes_20200607_001014.log.json) | + +### ADE20K + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|---------|----------|-----------|--------:|----------|----------------|------:|--------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UPerNet | R-50 | 512x512 | 80000 | 8.1 | 23.40 | 40.70 | 41.81 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_80k_ade20k/upernet_r50_512x512_80k_ade20k_20200614_144127-ecc8377b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_80k_ade20k/upernet_r50_512x512_80k_ade20k_20200614_144127.log.json) | +| UPerNet | R-101 | 512x512 | 80000 | 9.1 | 20.34 | 42.91 | 43.96 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_80k_ade20k/upernet_r101_512x512_80k_ade20k_20200614_185117-32e4db94.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_80k_ade20k/upernet_r101_512x512_80k_ade20k_20200614_185117.log.json) | +| UPerNet | R-50 | 512x512 | 160000 | - | - | 42.05 | 42.78 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_160k_ade20k/upernet_r50_512x512_160k_ade20k_20200615_184328-8534de8d.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_160k_ade20k/upernet_r50_512x512_160k_ade20k_20200615_184328.log.json) | +| UPerNet | R-101 | 512x512 | 160000 | - | - | 43.82 | 44.85 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_160k_ade20k/upernet_r101_512x512_160k_ade20k_20200615_161951-91b32684.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_160k_ade20k/upernet_r101_512x512_160k_ade20k_20200615_161951.log.json) | + +### Pascal VOC 2012 + Aug + +| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download | +|---------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| UPerNet | R-50 | 512x512 | 20000 | 6.4 | 23.17 | 74.82 | 76.35 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_20k_voc12aug/upernet_r50_512x512_20k_voc12aug_20200617_165330-5b5890a7.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_20k_voc12aug/upernet_r50_512x512_20k_voc12aug_20200617_165330.log.json) | +| UPerNet | R-101 | 512x512 | 20000 | 7.5 | 19.98 | 77.10 | 78.29 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_20k_voc12aug/upernet_r101_512x512_20k_voc12aug_20200617_165629-f14e7f27.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_20k_voc12aug/upernet_r101_512x512_20k_voc12aug_20200617_165629.log.json) | +| UPerNet | R-50 | 512x512 | 40000 | - | - | 75.92 | 77.44 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_40k_voc12aug/upernet_r50_512x512_40k_voc12aug_20200613_162257-ca9bcc6b.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r50_512x512_40k_voc12aug/upernet_r50_512x512_40k_voc12aug_20200613_162257.log.json) | +| UPerNet | R-101 | 512x512 | 40000 | - | - | 77.43 | 78.56 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_40k_voc12aug/upernet_r101_512x512_40k_voc12aug_20200613_163549-e26476ac.pth) | [log](https://download.openmmlab.com/mmsegmentation/v0.5/upernet/upernet_r101_512x512_40k_voc12aug/upernet_r101_512x512_40k_voc12aug_20200613_163549.log.json) | diff --git a/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py b/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b90b597d831a664761d6051397d2b1862feb59c6 --- /dev/null +++ b/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x1024_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py b/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..420ca2e42836099213c1f91cb925088cfe7c1269 --- /dev/null +++ b/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x1024_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x512_160k_ade20k.py b/configs/upernet/upernet_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..146f13eb79053cc69d4934d294aad9ba723b2577 --- /dev/null +++ b/configs/upernet/upernet_r101_512x512_160k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x512_160k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x512_20k_voc12aug.py b/configs/upernet/upernet_r101_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..56345d1806482ac822d709893fe6942f44be6f74 --- /dev/null +++ b/configs/upernet/upernet_r101_512x512_20k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x512_20k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x512_40k_voc12aug.py b/configs/upernet/upernet_r101_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..0669b741b9b3e3e1a309147b920d3d2a1952ab75 --- /dev/null +++ b/configs/upernet/upernet_r101_512x512_40k_voc12aug.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x512_40k_voc12aug.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_512x512_80k_ade20k.py b/configs/upernet/upernet_r101_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..abfb9c5d9f35407d590cdc3325006b396ec52820 --- /dev/null +++ b/configs/upernet/upernet_r101_512x512_80k_ade20k.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_512x512_80k_ade20k.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_769x769_40k_cityscapes.py b/configs/upernet/upernet_r101_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e5f3a3fae18cb769fd04b0c669785c5728cf479f --- /dev/null +++ b/configs/upernet/upernet_r101_769x769_40k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_769x769_40k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r101_769x769_80k_cityscapes.py b/configs/upernet/upernet_r101_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a709165657d257df4fc76148d225261c63f88d8a --- /dev/null +++ b/configs/upernet/upernet_r101_769x769_80k_cityscapes.py @@ -0,0 +1,2 @@ +_base_ = './upernet_r50_769x769_80k_cityscapes.py' +model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py b/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d621e89ce62c06424db7c2e5f5fd00a0a2e85a61 --- /dev/null +++ b/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] diff --git a/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py b/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..95fffcc76c2ff4f61f8dd80a00d35b7875262a50 --- /dev/null +++ b/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/cityscapes.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] diff --git a/configs/upernet/upernet_r50_512x512_160k_ade20k.py b/configs/upernet/upernet_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f5dd9aa4ed59d4939bcb49ffe129a9935e303201 --- /dev/null +++ b/configs/upernet/upernet_r50_512x512_160k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/upernet/upernet_r50_512x512_20k_voc12aug.py b/configs/upernet/upernet_r50_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..95f5c09567144db47e07fc802b114bedd6a00725 --- /dev/null +++ b/configs/upernet/upernet_r50_512x512_20k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_20k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/upernet/upernet_r50_512x512_40k_voc12aug.py b/configs/upernet/upernet_r50_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..9621fd1f5c24e582b4a1eda18fcc0a13d2bcb953 --- /dev/null +++ b/configs/upernet/upernet_r50_512x512_40k_voc12aug.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) diff --git a/configs/upernet/upernet_r50_512x512_80k_ade20k.py b/configs/upernet/upernet_r50_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f561e309e3bddb439c90af930c4de5a0c7e209a7 --- /dev/null +++ b/configs/upernet/upernet_r50_512x512_80k_ade20k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) diff --git a/configs/upernet/upernet_r50_769x769_40k_cityscapes.py b/configs/upernet/upernet_r50_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..89b18aa2840d12e67339ce0b7a0561fa2ba0c6fa --- /dev/null +++ b/configs/upernet/upernet_r50_769x769_40k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/configs/upernet/upernet_r50_769x769_80k_cityscapes.py b/configs/upernet/upernet_r50_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..29af98f2ebe341998fcf93f8a5c018cabcc0c0ba --- /dev/null +++ b/configs/upernet/upernet_r50_769x769_80k_cityscapes.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/upernet_r50.py', + '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_80k.py' +] +model = dict( + decode_head=dict(align_corners=True), + auxiliary_head=dict(align_corners=True), + test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) diff --git a/demo/MMSegmentation_Tutorial.ipynb b/demo/MMSegmentation_Tutorial.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..127ad4e6a7d14d83ddca96ca519a26e5ba52eb64 --- /dev/null +++ b/demo/MMSegmentation_Tutorial.ipynb @@ -0,0 +1,1416 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "MMSegmentation Tutorial.ipynb", + "provenance": [], + "collapsed_sections": [], + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU", + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "40a3c0b2c7a44085b69b9c741df20b3e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_ec96fb4251ea4b8ea268a2bc62b9c75b", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_dae4b284c5a944639991d29f4e79fac5", + "IPY_MODEL_c78567afd0a6418781118ac9f4ecdea9" + ] + } + }, + "ec96fb4251ea4b8ea268a2bc62b9c75b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "dae4b284c5a944639991d29f4e79fac5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_32b7d27a143c41b5bb90f1d8e66a1c67", + "_dom_classes": [], + "description": "100%", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 102567401, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 102567401, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_55d75951f51c4ab89e32045c3d6db8a4" + } + }, + "c78567afd0a6418781118ac9f4ecdea9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_9d29e2d02731416d9852e9c7c08d1665", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 97.8M/97.8M [00:10<00:00, 9.75MB/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_1bb2b93526cd421aa5d5b86d678932ab" + } + }, + "32b7d27a143c41b5bb90f1d8e66a1c67": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "55d75951f51c4ab89e32045c3d6db8a4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "9d29e2d02731416d9852e9c7c08d1665": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "1bb2b93526cd421aa5d5b86d678932ab": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + } + } + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "source": [], + "metadata": { + "collapsed": false + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FVmnaxFJvsb8", + "colab_type": "text" + }, + "source": [ + "# MMSegmentation Tutorial\n", + "Welcome to MMSegmentation! \n", + "\n", + "In this tutorial, we demo\n", + "* How to do inference with MMSeg trained weight\n", + "* How to train on your own dataset and visualize the results. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QS8YHrEhbpas", + "colab_type": "text" + }, + "source": [ + "## Install MMSegmentation\n", + "This step may take several minutes. \n", + "\n", + "We use PyTorch 1.5.0 and CUDA 10.1 for this tutorial. You may install other versions by change the version number in pip install command. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "UWyLrLYaNEaL", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 170 + }, + "outputId": "35b19c63-d6f3-49e1-dcaa-aed3ecd85ed7" + }, + "source": [ + "# Check nvcc version\n", + "!nvcc -V\n", + "# Check GCC version\n", + "!gcc --version" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nvcc: NVIDIA (R) Cuda compiler driver\n", + "Copyright (c) 2005-2019 NVIDIA Corporation\n", + "Built on Sun_Jul_28_19:07:16_PDT_2019\n", + "Cuda compilation tools, release 10.1, V10.1.243\n", + "gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "Copyright (C) 2017 Free Software Foundation, Inc.\n", + "This is free software; see the source for copying conditions. There is NO\n", + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Ki3WUBjKbutg", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 340 + }, + "outputId": "69f42fab-3f44-44d0-bd62-b73836f90a3d" + }, + "source": [ + "# Install PyTorch\n", + "!pip install -U torch==1.5.0+cu101 torchvision==0.6.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html\n", + "# Install MMCV\n", + "!pip install mmcv-full==latest+torch1.5.0+cu101 -f https://download.openmmlab.com/mmcv/dist/index.html" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Looking in links: https://download.pytorch.org/whl/torch_stable.html\n", + "Requirement already up-to-date: torch==1.5.0+cu101 in /usr/local/lib/python3.6/dist-packages (1.5.0+cu101)\n", + "Requirement already up-to-date: torchvision==0.6.0+cu101 in /usr/local/lib/python3.6/dist-packages (0.6.0+cu101)\n", + "Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.6/dist-packages (from torch==1.5.0+cu101) (0.16.0)\n", + "Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.6/dist-packages (from torch==1.5.0+cu101) (1.18.5)\n", + "Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.6/dist-packages (from torchvision==0.6.0+cu101) (7.0.0)\n", + "Looking in links: https://download.openmmlab.com/mmcv/dist/index.html\n", + "Collecting mmcv-full==latest+torch1.5.0+cu101\n", + " Using cached https://download.openmmlab.com/mmcv/dist/latest/torch1.5.0/cu101/mmcv_full-latest%2Btorch1.5.0%2Bcu101-cp36-cp36m-manylinux1_x86_64.whl\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (1.18.5)\n", + "Requirement already satisfied: addict in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (2.2.1)\n", + "Requirement already satisfied: yapf in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (0.30.0)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (3.13)\n", + "Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.6/dist-packages (from mmcv-full==latest+torch1.5.0+cu101) (4.1.2.30)\n", + "Installing collected packages: mmcv-full\n", + " Found existing installation: mmcv-full 1.0.0\n", + " Uninstalling mmcv-full-1.0.0:\n", + " Successfully uninstalled mmcv-full-1.0.0\n", + "Successfully installed mmcv-full-1.0.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nR-hHRvbNJJZ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 374 + }, + "outputId": "ca6d9c48-0034-47cf-97b5-f31f529cc31c" + }, + "source": [ + "!rm -rf mmsegmentation\n", + "!git clone https://github.com/open-mmlab/mmsegmentation.git \n", + "%cd mmsegmentation\n", + "!pip install -e ." + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Cloning into 'mmsegmentation'...\n", + "remote: Enumerating objects: 485, done.\u001b[K\n", + "remote: Counting objects: 100% (485/485), done.\u001b[K\n", + "remote: Compressing objects: 100% (303/303), done.\u001b[K\n", + "remote: Total 649 (delta 280), reused 317 (delta 171), pack-reused 164\u001b[K\n", + "Receiving objects: 100% (649/649), 1.96 MiB | 3.99 MiB/s, done.\n", + "Resolving deltas: 100% (364/364), done.\n", + "/content/mmsegmentation\n", + "Obtaining file:///content/mmsegmentation\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from mmseg==0.5.0+b2724da) (3.2.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from mmseg==0.5.0+b2724da) (1.18.5)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mmseg==0.5.0+b2724da) (2.4.7)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mmseg==0.5.0+b2724da) (2.8.1)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mmseg==0.5.0+b2724da) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mmseg==0.5.0+b2724da) (0.10.0)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.1->matplotlib->mmseg==0.5.0+b2724da) (1.12.0)\n", + "Installing collected packages: mmseg\n", + " Found existing installation: mmseg 0.5.0+b2724da\n", + " Can't uninstall 'mmseg'. No files were found to uninstall.\n", + " Running setup.py develop for mmseg\n", + "Successfully installed mmseg\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mAE_h7XhPT7d", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "912ec9be-4103-40b8-91cc-4d31e9415f60" + }, + "source": [ + "# Check Pytorch installation\n", + "import torch, torchvision\n", + "print(torch.__version__, torch.cuda.is_available())\n", + "\n", + "# Check MMSegmentation installation\n", + "import mmseg\n", + "print(mmseg.__version__)" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1.5.0+cu101 True\n", + "0.5.0+b2724da\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eUcuC3dUv32I", + "colab_type": "text" + }, + "source": [ + "## Run Inference with MMSeg trained weight" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2hd41IGaiNet", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "outputId": "2834674e-deef-49d7-cd4c-db8dd1ae9733" + }, + "source": [ + "!mkdir checkpoints\n", + "!wget https://open-mmlab.s3.ap-northeast-2.amazonaws.com/mmsegmentation/models/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth -P checkpoints" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "--2020-07-09 19:13:21-- https://open-mmlab.s3.ap-northeast-2.amazonaws.com/mmsegmentation/models/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth\n", + "Resolving open-mmlab.s3.ap-northeast-2.amazonaws.com (open-mmlab.s3.ap-northeast-2.amazonaws.com)... 52.219.56.140\n", + "Connecting to open-mmlab.s3.ap-northeast-2.amazonaws.com (open-mmlab.s3.ap-northeast-2.amazonaws.com)|52.219.56.140|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 196205945 (187M) [application/x-www-form-urlencoded]\n", + "Saving to: ‘checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth’\n", + "\n", + "pspnet_r50-d8_512x1 100%[===================>] 187.12M 11.8MB/s in 18s \n", + "\n", + "2020-07-09 19:13:40 (10.4 MB/s) - ‘checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth’ saved [196205945/196205945]\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "H8Fxg8i-wHJE", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot\n", + "from mmseg.core.evaluation import get_palette" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "umk8sJ0Xuace", + "colab_type": "code", + "colab": {} + }, + "source": [ + "config_file = 'configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py'\n", + "checkpoint_file = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "nWlQFuTgudxu", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# build the model from a config file and a checkpoint file\n", + "model = init_segmentor(config_file, checkpoint_file, device='cuda:0')" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "izFv6pSRujk9", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# test a single image\n", + "img = 'demo/demo.png'\n", + "result = inference_segmentor(model, img)" + ], + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "bDcs9udgunQK", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 504 + }, + "outputId": "8221fdb1-92af-4d7c-e65b-c7adf0f5a8af" + }, + "source": [ + "# show the results\n", + "show_result_pyplot(model, img, result, get_palette('cityscapes'))" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/content/mmsegmentation/mmseg/models/segmentors/base.py:265: UserWarning: show==False and out_file is not specified, only result image will be returned\n", + " warnings.warn('show==False and out_file is not specified, only '\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ta51clKX4cwM", + "colab_type": "text" + }, + "source": [ + "## Train a semantic segmentation model on a new dataset\n", + "\n", + "To train on a customized dataset, the following steps are neccessary. \n", + "1. Add a new dataset class. \n", + "2. Create a config file accordingly. \n", + "3. Perform training and evaluation. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AcZg6x_K5Zs3", + "colab_type": "text" + }, + "source": [ + "### Add a new dataset\n", + "\n", + "Datasets in MMSegmentation require image and semantic segmentation maps to be placed in folders with the same perfix. To support a new dataset, we may need to modify the original file structure. \n", + "\n", + "In this tutorial, we give an example of converting the dataset. You may refer to [docs](https://github.com/open-mmlab/mmsegmentation/docs/tutorials/new_dataset.md) for details about dataset reorganization. \n", + "\n", + "We use [Standord Background Dataset](http://dags.stanford.edu/projects/scenedataset.html) as an example. The dataset contains 715 images chosen from existing public datasets [LabelMe](http://labelme.csail.mit.edu), [MSRC](http://research.microsoft.com/en-us/projects/objectclassrecognition), [PASCAL VOC](http://pascallin.ecs.soton.ac.uk/challenges/VOC) and [Geometric Context](http://www.cs.illinois.edu/homes/dhoiem/). Images from these datasets are mainly outdoor scenes, each containing approximately 320-by-240 pixels. \n", + "In this tutorial, we use the region annotations as labels. There are 8 classes in total, i.e. sky, tree, road, grass, water, building, mountain, and foreground object. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "TFIt7MHq5Wls", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "outputId": "5e56d5dc-4f1c-4d7c-f833-51cfdbf8d481" + }, + "source": [ + "# download and unzip\n", + "!wget http://dags.stanford.edu/data/iccv09Data.tar.gz -O standford_background.tar.gz\n", + "!tar xf standford_background.tar.gz" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "text": [ + "--2020-07-09 19:13:50-- http://dags.stanford.edu/data/iccv09Data.tar.gz\n", + "Resolving dags.stanford.edu (dags.stanford.edu)... 171.64.68.10\n", + "Connecting to dags.stanford.edu (dags.stanford.edu)|171.64.68.10|:80... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 14727974 (14M) [application/x-gzip]\n", + "Saving to: ‘standford_background.tar.gz’\n", + "\n", + "standford_backgroun 100%[===================>] 14.04M 3.22MB/s in 4.4s \n", + "\n", + "2020-07-09 19:13:55 (3.22 MB/s) - ‘standford_background.tar.gz’ saved [14727974/14727974]\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "78LIci7F9WWI", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 377 + }, + "outputId": "a7f339c7-a071-40db-f30d-44028dd2ce1c" + }, + "source": [ + "# Let's take a look at the dataset\n", + "import mmcv\n", + "import matplotlib.pyplot as plt\n", + "\n", + "img = mmcv.imread('iccv09Data/images/6000124.jpg')\n", + "plt.figure(figsize=(8, 6))\n", + "plt.imshow(mmcv.bgr2rgb(img))\n", + "plt.show()" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L5mNQuc2GsVE", + "colab_type": "text" + }, + "source": [ + "We need to convert the annotation into semantic map format as an image." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WnGZfribFHCx", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import os.path as osp\n", + "import numpy as np\n", + "from PIL import Image\n", + "# convert dataset annotation to semantic segmentation map\n", + "data_root = 'iccv09Data'\n", + "img_dir = 'images'\n", + "ann_dir = 'labels'\n", + "# define class and plaette for better visualization\n", + "classes = ('sky', 'tree', 'road', 'grass', 'water', 'bldg', 'mntn', 'fg obj')\n", + "palette = [[128, 128, 128], [129, 127, 38], [120, 69, 125], [53, 125, 34], \n", + " [0, 11, 123], [118, 20, 12], [122, 81, 25], [241, 134, 51]]\n", + "for file in mmcv.scandir(osp.join(data_root, ann_dir), suffix='.regions.txt'):\n", + " seg_map = np.loadtxt(osp.join(data_root, ann_dir, file)).astype(np.uint8)\n", + " seg_img = Image.fromarray(seg_map).convert('P')\n", + " seg_img.putpalette(np.array(palette, dtype=np.uint8))\n", + " seg_img.save(osp.join(data_root, ann_dir, file.replace('.regions.txt', \n", + " '.png')))" + ], + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "5MCSS9ABfSks", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 377 + }, + "outputId": "d093e054-8db3-40e5-a800-061de844597f" + }, + "source": [ + "# Let's take a look at the segmentation map we got\n", + "import matplotlib.patches as mpatches\n", + "img = Image.open('iccv09Data/labels/6000124.png')\n", + "plt.figure(figsize=(8, 6))\n", + "im = plt.imshow(np.array(img.convert('RGB')))\n", + "\n", + "# create a patch (proxy artist) for every color \n", + "patches = [mpatches.Patch(color=np.array(palette[i])/255., \n", + " label=classes[i]) for i in range(8)]\n", + "# put those patched as legend-handles into the legend\n", + "plt.legend(handles=patches, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., \n", + " fontsize='large')\n", + "\n", + "plt.show()" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WbeLYCp2k5hl", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# split train/val set randomly\n", + "split_dir = 'splits'\n", + "mmcv.mkdir_or_exist(osp.join(data_root, split_dir))\n", + "filename_list = [osp.splitext(filename)[0] for filename in mmcv.scandir(\n", + " osp.join(data_root, ann_dir), suffix='.png')]\n", + "with open(osp.join(data_root, split_dir, 'train.txt'), 'w') as f:\n", + " # select first 4/5 as train set\n", + " train_length = int(len(filename_list)*4/5)\n", + " f.writelines(line + '\\n' for line in filename_list[:train_length])\n", + "with open(osp.join(data_root, split_dir, 'val.txt'), 'w') as f:\n", + " # select last 1/5 as train set\n", + " f.writelines(line + '\\n' for line in filename_list[train_length:])" + ], + "execution_count": 15, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HchvmGYB_rrO", + "colab_type": "text" + }, + "source": [ + "After downloading the data, we need to implement `load_annotations` function in the new dataset class `StandfordBackgroundDataset`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "LbsWOw62_o-X", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from mmseg.datasets.builder import DATASETS\n", + "from mmseg.datasets.custom import CustomDataset\n", + "\n", + "@DATASETS.register_module()\n", + "class StandfordBackgroundDataset(CustomDataset):\n", + " CLASSES = classes\n", + " PALETTE = palette\n", + " def __init__(self, split, **kwargs):\n", + " super().__init__(img_suffix='.jpg', seg_map_suffix='.png', \n", + " split=split, **kwargs)\n", + " assert osp.exists(self.img_dir) and self.split is not None\n", + "\n", + " " + ], + "execution_count": 16, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yUVtmn3Iq3WA", + "colab_type": "text" + }, + "source": [ + "### Create a config file\n", + "In the next step, we need to modify the config for the training. To accelerate the process, we finetune the model from trained weights." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Wwnj9tRzqX_A", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from mmcv import Config\n", + "cfg = Config.fromfile('configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py')" + ], + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1y2oV5w97jQo", + "colab_type": "text" + }, + "source": [ + "Since the given config is used to train PSPNet on cityscapes dataset, we need to modify it accordingly for our new dataset. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eyKnYC1Z7iCV", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "a25241e2-431c-4944-b0b8-b9c792d5aadd" + }, + "source": [ + "from mmseg.apis import set_random_seed\n", + "\n", + "# Since we use ony one GPU, BN is used instead of SyncBN\n", + "cfg.norm_cfg = dict(type='BN', requires_grad=True)\n", + "cfg.model.backbone.norm_cfg = cfg.norm_cfg\n", + "cfg.model.decode_head.norm_cfg = cfg.norm_cfg\n", + "cfg.model.auxiliary_head.norm_cfg = cfg.norm_cfg\n", + "# modify num classes of the model in decode/auxiliary head\n", + "cfg.model.decode_head.num_classes = 8\n", + "cfg.model.auxiliary_head.num_classes = 8\n", + "\n", + "# Modify dataset type and path\n", + "cfg.dataset_type = 'StandfordBackgroundDataset'\n", + "cfg.data_root = data_root\n", + "\n", + "cfg.data.samples_per_gpu = 8\n", + "cfg.data.workers_per_gpu=8\n", + "\n", + "cfg.img_norm_cfg = dict(\n", + " mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)\n", + "cfg.crop_size = (256, 256)\n", + "cfg.train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='LoadAnnotations'),\n", + " dict(type='Resize', img_scale=(320, 240), ratio_range=(0.5, 2.0)),\n", + " dict(type='RandomCrop', crop_size=cfg.crop_size, cat_max_ratio=0.75),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(type='PhotoMetricDistortion'),\n", + " dict(type='Normalize', **cfg.img_norm_cfg),\n", + " dict(type='Pad', size=cfg.crop_size, pad_val=0, seg_pad_val=255),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(type='Collect', keys=['img', 'gt_semantic_seg']),\n", + "]\n", + "\n", + "cfg.test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(320, 240),\n", + " # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75],\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(type='Normalize', **cfg.img_norm_cfg),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img']),\n", + " ])\n", + "]\n", + "\n", + "\n", + "cfg.data.train.type = cfg.dataset_type\n", + "cfg.data.train.data_root = cfg.data_root\n", + "cfg.data.train.img_dir = img_dir\n", + "cfg.data.train.ann_dir = ann_dir\n", + "cfg.data.train.pipeline = cfg.train_pipeline\n", + "cfg.data.train.split = 'splits/train.txt'\n", + "\n", + "cfg.data.val.type = cfg.dataset_type\n", + "cfg.data.val.data_root = cfg.data_root\n", + "cfg.data.val.img_dir = img_dir\n", + "cfg.data.val.ann_dir = ann_dir\n", + "cfg.data.val.pipeline = cfg.test_pipeline\n", + "cfg.data.val.split = 'splits/val.txt'\n", + "\n", + "cfg.data.test.type = cfg.dataset_type\n", + "cfg.data.test.data_root = cfg.data_root\n", + "cfg.data.test.img_dir = img_dir\n", + "cfg.data.test.ann_dir = ann_dir\n", + "cfg.data.test.pipeline = cfg.test_pipeline\n", + "cfg.data.test.split = 'splits/val.txt'\n", + "\n", + "# We can still use the pre-trained Mask RCNN model though we do not need to\n", + "# use the mask branch\n", + "cfg.load_from = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'\n", + "\n", + "# Set up working dir to save files and logs.\n", + "cfg.work_dir = './work_dirs/tutorial'\n", + "\n", + "cfg.total_iters = 200\n", + "cfg.log_config.interval = 10\n", + "cfg.evaluation.interval = 200\n", + "cfg.checkpoint_config.interval = 200\n", + "\n", + "# Set seed to facitate reproducing the result\n", + "cfg.seed = 0\n", + "set_random_seed(0, deterministic=False)\n", + "cfg.gpu_ids = range(1)\n", + "\n", + "# Let's have a look at the final config used for training\n", + "print(f'Config:\\n{cfg.pretty_text}')" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Config:\n", + "norm_cfg = dict(type='BN', requires_grad=True)\n", + "model = dict(\n", + " type='EncoderDecoder',\n", + " pretrained='open-mmlab://resnet50_v1c',\n", + " backbone=dict(\n", + " type='ResNetV1c',\n", + " depth=50,\n", + " num_stages=4,\n", + " out_indices=(0, 1, 2, 3),\n", + " dilations=(1, 1, 2, 4),\n", + " strides=(1, 2, 1, 1),\n", + " norm_cfg=dict(type='BN', requires_grad=True),\n", + " norm_eval=False,\n", + " style='pytorch',\n", + " contract_dilation=True),\n", + " decode_head=dict(\n", + " type='PSPHead',\n", + " in_channels=2048,\n", + " in_index=3,\n", + " channels=512,\n", + " pool_scales=(1, 2, 3, 6),\n", + " dropout_ratio=0.1,\n", + " num_classes=8,\n", + " norm_cfg=dict(type='BN', requires_grad=True),\n", + " align_corners=False,\n", + " loss_decode=dict(\n", + " type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)),\n", + " auxiliary_head=dict(\n", + " type='FCNHead',\n", + " in_channels=1024,\n", + " in_index=2,\n", + " channels=256,\n", + " num_convs=1,\n", + " concat_input=False,\n", + " dropout_ratio=0.1,\n", + " num_classes=8,\n", + " norm_cfg=dict(type='BN', requires_grad=True),\n", + " align_corners=False,\n", + " loss_decode=dict(\n", + " type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)))\n", + "train_cfg = dict()\n", + "test_cfg = dict(mode='whole')\n", + "dataset_type = 'StandfordBackgroundDataset'\n", + "data_root = 'iccv09Data'\n", + "img_norm_cfg = dict(\n", + " mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)\n", + "crop_size = (256, 256)\n", + "train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='LoadAnnotations'),\n", + " dict(type='Resize', img_scale=(320, 240), ratio_range=(0.5, 2.0)),\n", + " dict(type='RandomCrop', crop_size=(256, 256), cat_max_ratio=0.75),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(type='PhotoMetricDistortion'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='Pad', size=(256, 256), pad_val=0, seg_pad_val=255),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(type='Collect', keys=['img', 'gt_semantic_seg'])\n", + "]\n", + "test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(320, 240),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + "]\n", + "data = dict(\n", + " samples_per_gpu=8,\n", + " workers_per_gpu=8,\n", + " train=dict(\n", + " type='StandfordBackgroundDataset',\n", + " data_root='iccv09Data',\n", + " img_dir='images',\n", + " ann_dir='labels',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='LoadAnnotations'),\n", + " dict(type='Resize', img_scale=(320, 240), ratio_range=(0.5, 2.0)),\n", + " dict(type='RandomCrop', crop_size=(256, 256), cat_max_ratio=0.75),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(type='PhotoMetricDistortion'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='Pad', size=(256, 256), pad_val=0, seg_pad_val=255),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(type='Collect', keys=['img', 'gt_semantic_seg'])\n", + " ],\n", + " split='splits/train.txt'),\n", + " val=dict(\n", + " type='StandfordBackgroundDataset',\n", + " data_root='iccv09Data',\n", + " img_dir='images',\n", + " ann_dir='labels',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(320, 240),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + " ],\n", + " split='splits/val.txt'),\n", + " test=dict(\n", + " type='StandfordBackgroundDataset',\n", + " data_root='iccv09Data',\n", + " img_dir='images',\n", + " ann_dir='labels',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(320, 240),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[123.675, 116.28, 103.53],\n", + " std=[58.395, 57.12, 57.375],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + " ],\n", + " split='splits/val.txt'))\n", + "log_config = dict(\n", + " interval=10, hooks=[dict(type='TextLoggerHook', by_epoch=False)])\n", + "dist_params = dict(backend='nccl')\n", + "log_level = 'INFO'\n", + "load_from = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'\n", + "resume_from = None\n", + "workflow = [('train', 1)]\n", + "cudnn_benchmark = True\n", + "optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)\n", + "optimizer_config = dict()\n", + "lr_config = dict(policy='poly', power=0.9, min_lr=0.0001, by_epoch=False)\n", + "total_iters = 200\n", + "checkpoint_config = dict(by_epoch=False, interval=200)\n", + "evaluation = dict(interval=200, metric='mIoU')\n", + "work_dir = './work_dirs/tutorial'\n", + "seed = 0\n", + "gpu_ids = range(0, 1)\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QWuH14LYF2gQ", + "colab_type": "text" + }, + "source": [ + "### Train and Evaluation" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "jYKoSfdMF12B", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 953, + "referenced_widgets": [ + "40a3c0b2c7a44085b69b9c741df20b3e", + "ec96fb4251ea4b8ea268a2bc62b9c75b", + "dae4b284c5a944639991d29f4e79fac5", + "c78567afd0a6418781118ac9f4ecdea9", + "32b7d27a143c41b5bb90f1d8e66a1c67", + "55d75951f51c4ab89e32045c3d6db8a4", + "9d29e2d02731416d9852e9c7c08d1665", + "1bb2b93526cd421aa5d5b86d678932ab" + ] + }, + "outputId": "1c0b5a11-434b-4c96-a4aa-9d685fff0856" + }, + "source": [ + "from mmseg.datasets import build_dataset\n", + "from mmseg.models import build_segmentor\n", + "from mmseg.apis import train_segmentor\n", + "\n", + "\n", + "# Build the dataset\n", + "datasets = [build_dataset(cfg.data.train)]\n", + "\n", + "# Build the detector\n", + "model = build_segmentor(\n", + " cfg.model, train_cfg=cfg.train_cfg, test_cfg=cfg.test_cfg)\n", + "# Add an attribute for visualization convenience\n", + "model.CLASSES = datasets[0].CLASSES\n", + "\n", + "# Create work_dir\n", + "mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))\n", + "train_segmentor(model, datasets, cfg, distributed=False, validate=True, \n", + " meta=dict())" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "2020-07-09 19:14:27,264 - mmseg - INFO - Loaded 572 images\n", + "Downloading: \"https://open-mmlab.s3.ap-northeast-2.amazonaws.com/pretrain/third_party/resnet50_v1c-2cccc1ad.pth\" to /root/.cache/torch/checkpoints/resnet50_v1c-2cccc1ad.pth\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "40a3c0b2c7a44085b69b9c741df20b3e", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=102567401.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "2020-07-09 19:14:39,770 - mmseg - WARNING - The model and loaded state dict do not match exactly\n", + "\n", + "unexpected key in source state_dict: fc.weight, fc.bias\n", + "\n", + "2020-07-09 19:14:39,836 - mmseg - INFO - Loaded 143 images\n", + "2020-07-09 19:14:39,837 - mmseg - INFO - load checkpoint from checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "2020-07-09 19:14:39,990 - mmseg - WARNING - The model and loaded state dict do not match exactly\n", + "\n", + "size mismatch for decode_head.conv_seg.weight: copying a param with shape torch.Size([19, 512, 1, 1]) from checkpoint, the shape in current model is torch.Size([8, 512, 1, 1]).\n", + "size mismatch for decode_head.conv_seg.bias: copying a param with shape torch.Size([19]) from checkpoint, the shape in current model is torch.Size([8]).\n", + "size mismatch for auxiliary_head.conv_seg.weight: copying a param with shape torch.Size([19, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([8, 256, 1, 1]).\n", + "size mismatch for auxiliary_head.conv_seg.bias: copying a param with shape torch.Size([19]) from checkpoint, the shape in current model is torch.Size([8]).\n", + "2020-07-09 19:14:39,994 - mmseg - INFO - Start running, host: root@71c6cf9b06c5, work_dir: /content/mmsegmentation/work_dirs/tutorial\n", + "2020-07-09 19:14:39,995 - mmseg - INFO - workflow: [('train', 1)], max: 200 iters\n", + "2020-07-09 19:14:54,192 - mmseg - INFO - Iter [10/200]\tlr: 9.598e-03, eta: 0:04:21, time: 1.379, data_time: 0.002, memory: 3772, decode.loss_seg: 1.5616, decode.acc_seg: 46.9241, aux.loss_seg: 0.6853, aux.acc_seg: 38.7292, loss: 2.2469\n", + "2020-07-09 19:15:07,556 - mmseg - INFO - Iter [20/200]\tlr: 9.149e-03, eta: 0:04:04, time: 1.336, data_time: 0.016, memory: 3772, decode.loss_seg: 0.8215, decode.acc_seg: 68.8879, aux.loss_seg: 0.5371, aux.acc_seg: 67.9098, loss: 1.3586\n", + "2020-07-09 19:15:20,914 - mmseg - INFO - Iter [30/200]\tlr: 8.698e-03, eta: 0:03:49, time: 1.336, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5890, decode.acc_seg: 66.6747, aux.loss_seg: 0.3591, aux.acc_seg: 65.8590, loss: 0.9481\n", + "2020-07-09 19:15:34,235 - mmseg - INFO - Iter [40/200]\tlr: 8.244e-03, eta: 0:03:35, time: 1.332, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5888, decode.acc_seg: 71.6006, aux.loss_seg: 0.3192, aux.acc_seg: 66.5800, loss: 0.9079\n", + "2020-07-09 19:15:47,580 - mmseg - INFO - Iter [50/200]\tlr: 7.788e-03, eta: 0:03:21, time: 1.335, data_time: 0.016, memory: 3772, decode.loss_seg: 0.7011, decode.acc_seg: 65.8105, aux.loss_seg: 0.3223, aux.acc_seg: 62.9866, loss: 1.0235\n", + "2020-07-09 19:16:00,900 - mmseg - INFO - Iter [60/200]\tlr: 7.328e-03, eta: 0:03:07, time: 1.332, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5531, decode.acc_seg: 66.3968, aux.loss_seg: 0.2624, aux.acc_seg: 63.4624, loss: 0.8156\n", + "2020-07-09 19:16:14,199 - mmseg - INFO - Iter [70/200]\tlr: 6.865e-03, eta: 0:02:54, time: 1.330, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5888, decode.acc_seg: 66.5814, aux.loss_seg: 0.2905, aux.acc_seg: 62.6161, loss: 0.8792\n", + "2020-07-09 19:16:28,148 - mmseg - INFO - Iter [80/200]\tlr: 6.398e-03, eta: 0:02:41, time: 1.395, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4988, decode.acc_seg: 69.7736, aux.loss_seg: 0.2388, aux.acc_seg: 68.5068, loss: 0.7376\n", + "2020-07-09 19:16:41,440 - mmseg - INFO - Iter [90/200]\tlr: 5.928e-03, eta: 0:02:27, time: 1.330, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5177, decode.acc_seg: 72.9874, aux.loss_seg: 0.2512, aux.acc_seg: 71.1549, loss: 0.7690\n", + "2020-07-09 19:16:54,703 - mmseg - INFO - Iter [100/200]\tlr: 5.453e-03, eta: 0:02:14, time: 1.326, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5794, decode.acc_seg: 65.9114, aux.loss_seg: 0.2557, aux.acc_seg: 65.2695, loss: 0.8351\n", + "2020-07-09 19:17:07,972 - mmseg - INFO - Iter [110/200]\tlr: 4.974e-03, eta: 0:02:00, time: 1.327, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5395, decode.acc_seg: 69.2955, aux.loss_seg: 0.2443, aux.acc_seg: 68.5840, loss: 0.7838\n", + "2020-07-09 19:17:21,227 - mmseg - INFO - Iter [120/200]\tlr: 4.489e-03, eta: 0:01:47, time: 1.326, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5568, decode.acc_seg: 70.1717, aux.loss_seg: 0.2490, aux.acc_seg: 69.4707, loss: 0.8058\n", + "2020-07-09 19:17:34,513 - mmseg - INFO - Iter [130/200]\tlr: 3.998e-03, eta: 0:01:33, time: 1.328, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5222, decode.acc_seg: 72.1791, aux.loss_seg: 0.2446, aux.acc_seg: 71.0046, loss: 0.7668\n", + "2020-07-09 19:17:47,812 - mmseg - INFO - Iter [140/200]\tlr: 3.500e-03, eta: 0:01:20, time: 1.330, data_time: 0.016, memory: 3772, decode.loss_seg: 0.5178, decode.acc_seg: 72.7657, aux.loss_seg: 0.2552, aux.acc_seg: 70.8837, loss: 0.7730\n", + "2020-07-09 19:18:01,667 - mmseg - INFO - Iter [150/200]\tlr: 2.994e-03, eta: 0:01:07, time: 1.386, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4719, decode.acc_seg: 72.4819, aux.loss_seg: 0.2263, aux.acc_seg: 69.9169, loss: 0.6982\n", + "2020-07-09 19:18:14,904 - mmseg - INFO - Iter [160/200]\tlr: 2.478e-03, eta: 0:00:53, time: 1.324, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4494, decode.acc_seg: 75.4808, aux.loss_seg: 0.2228, aux.acc_seg: 73.2249, loss: 0.6723\n", + "2020-07-09 19:18:28,151 - mmseg - INFO - Iter [170/200]\tlr: 1.949e-03, eta: 0:00:40, time: 1.325, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4412, decode.acc_seg: 72.4503, aux.loss_seg: 0.2177, aux.acc_seg: 69.9681, loss: 0.6589\n", + "2020-07-09 19:18:41,413 - mmseg - INFO - Iter [180/200]\tlr: 1.402e-03, eta: 0:00:26, time: 1.326, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4127, decode.acc_seg: 74.4395, aux.loss_seg: 0.1955, aux.acc_seg: 72.5129, loss: 0.6082\n", + "2020-07-09 19:18:54,678 - mmseg - INFO - Iter [190/200]\tlr: 8.277e-04, eta: 0:00:13, time: 1.326, data_time: 0.016, memory: 3772, decode.loss_seg: 0.4733, decode.acc_seg: 74.7937, aux.loss_seg: 0.2285, aux.acc_seg: 72.0337, loss: 0.7019\n", + "2020-07-09 19:19:07,808 - mmseg - INFO - Saving checkpoint at 200 iterations\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 143/143, 10.9 task/s, elapsed: 13s, ETA: 0s" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "2020-07-09 19:19:22,647 - mmseg - INFO - per class results:\n", + "Class IoU Acc\n", + "sky 88.67 94.28\n", + "tree 68.95 86.73\n", + "road 86.23 94.42\n", + "grass 70.01 91.35\n", + "water 62.08 68.32\n", + "bldg 81.11 88.89\n", + "mntn 0.00 0.00\n", + "fg obj 70.39 82.49\n", + "Summary:\n", + "Scope mIoU mAcc aAcc\n", + "global 65.93 75.81 87.48\n", + "\n", + "2020-07-09 19:19:22,660 - mmseg - INFO - Iter [200/200]\tlr: 1.841e-04, mIoU: 0.6593, mAcc: 0.7581, aAcc: 0.8748\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DEkWOP-NMbc_", + "colab_type": "text" + }, + "source": [ + "Inference with trained model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ekG__UfaH_OU", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 645 + }, + "outputId": "ac1eb835-19ed-48e6-8f77-e6d325b915c4" + }, + "source": [ + "img = mmcv.imread('iccv09Data/images/6000124.jpg')\n", + "\n", + "model.cfg = cfg\n", + "result = inference_segmentor(model, img)\n", + "plt.figure(figsize=(8, 6))\n", + "show_result_pyplot(model, img, result, palette)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/content/mmsegmentation/mmseg/models/segmentors/base.py:265: UserWarning: show==False and out_file is not specified, only result image will be returned\n", + " warnings.warn('show==False and out_file is not specified, only '\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + } + ] +} diff --git a/demo/image_demo.py b/demo/image_demo.py new file mode 100644 index 0000000000000000000000000000000000000000..183f23871b7ff4607066b4e29727313e575b14e4 --- /dev/null +++ b/demo/image_demo.py @@ -0,0 +1,29 @@ +from argparse import ArgumentParser + +from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot +from mmseg.core.evaluation import get_palette + + +def main(): + parser = ArgumentParser() + parser.add_argument('img', help='Image file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--palette', + default='cityscapes', + help='Color palette used for segmentation map') + args = parser.parse_args() + + # build the model from a config file and a checkpoint file + model = init_segmentor(args.config, args.checkpoint, device=args.device) + # test a single image + result = inference_segmentor(model, args.img) + # show the results + show_result_pyplot(model, args.img, result, get_palette(args.palette)) + + +if __name__ == '__main__': + main() diff --git a/demo/inference_demo.ipynb b/demo/inference_demo.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..e47d964e3c41d1db5e348d22d8ec01641c8aa88b --- /dev/null +++ b/demo/inference_demo.ipynb @@ -0,0 +1,150 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mkdir: cannot create directory ‘../checkpoints’: File exists\n", + "--2020-07-07 08:54:25-- https://open-mmlab.s3.ap-northeast-2.amazonaws.com/mmsegmentation/models/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth\n", + "Resolving open-mmlab.s3.ap-northeast-2.amazonaws.com (open-mmlab.s3.ap-northeast-2.amazonaws.com)... 52.219.58.55\n", + "Connecting to open-mmlab.s3.ap-northeast-2.amazonaws.com (open-mmlab.s3.ap-northeast-2.amazonaws.com)|52.219.58.55|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 196205945 (187M) [application/x-www-form-urlencoded]\n", + "Saving to: ‘../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth.1’\n", + "\n", + "pspnet_r50-d8_512x1 100%[===================>] 187.12M 16.5MB/s in 13s \n", + "\n", + "2020-07-07 08:54:38 (14.8 MB/s) - ‘../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth.1’ saved [196205945/196205945]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir ../checkpoints\n", + "!wget https://open-mmlab.s3.ap-northeast-2.amazonaws.com/mmsegmentation/models/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth -P ../checkpoints" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "from mmseg.apis import init_segmentor, inference_segmentor, show_result_pyplot\n", + "from mmseg.core.evaluation import get_palette" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "config_file = '../configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py'\n", + "checkpoint_file = '../checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# build the model from a config file and a checkpoint file\n", + "model = init_segmentor(config_file, checkpoint_file, device='cuda:0')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# test a single image\n", + "img = 'demo.png'\n", + "result = inference_segmentor(model, img)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/mnt/v-liubin/code/mmsegmentation/mmseg/models/segmentors/base.py:265: UserWarning: show==False and out_file is not specified, only result image will be returned\n", + " warnings.warn('show==False and out_file is not specified, only '\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# show the results\n", + "show_result_pyplot(model, img, result, get_palette('cityscapes'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "open-mmlab", + "language": "python", + "name": "open-mmlab" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..8e090f73a9e5b8aa09eee256e7876c8b4401f055 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,22 @@ +ARG PYTORCH="1.6.0" +ARG CUDA="10.1" +ARG CUDNN="7" + +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0+PTX" +ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all" +ENV CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" + +RUN apt-get update && apt-get install -y git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install mmsegmentation +RUN conda clean --all + +RUN pip install mmcv-full==latest+torch1.6.0+cu101 -f https://download.openmmlab.com/mmcv/dist/index.html +RUN git clone https://github.com/open-mmlab/mmsegmenation.git /mmsegmentation +WORKDIR /mmsegmentation +RUN pip install -r requirements/build.txt +RUN pip install --no-cache-dir -e . diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d4bb2cbb9eddb1bb1b4f366623044af8e4830919 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/api.rst b/docs/api.rst new file mode 100644 index 0000000000000000000000000000000000000000..9c14a67564029b83900001ab565954539bb7c081 --- /dev/null +++ b/docs/api.rst @@ -0,0 +1,61 @@ +API Reference +============== + +mmseg.apis +-------------- +.. automodule:: mmseg.apis + :members: + +mmseg.core +-------------- + +seg +^^^^^^^^^^ +.. automodule:: mmseg.core.seg + :members: + +evaluation +^^^^^^^^^^ +.. automodule:: mmseg.core.evaluation + :members: + +utils +^^^^^^^^^^ +.. automodule:: mmseg.core.utils + :members: + +mmseg.datasets +-------------- + +datasets +^^^^^^^^^^ +.. automodule:: mmseg.datasets + :members: + +pipelines +^^^^^^^^^^ +.. automodule:: mmseg.datasets.pipelines + :members: + +mmseg.models +-------------- + +segmentors +^^^^^^^^^^ +.. automodule:: mmseg.models.segmentors + :members: + +backbones +^^^^^^^^^^ +.. automodule:: mmseg.models.backbones + :members: + +decode_heads +^^^^^^^^^^^^ +.. automodule:: mmseg.models.decode_heads + :members: + +losses +^^^^^^^^^^ +.. automodule:: mmseg.models.losses + :members: diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000000000000000000000000000000000000..faf1df3d217d728ea84f8c4685722018ae523a72 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,157 @@ +## Changelog + +### V0.11 (02/02/2021) + +**Highlights** + +- Support memory efficient test, add more UNet models. + +**Bug Fixes** + +- Fixed TTA resize scale ([#334](https://github.com/open-mmlab/mmsegmentation/pull/334)) +- Fixed CI for pip 20.3 ([#307](https://github.com/open-mmlab/mmsegmentation/pull/307)) +- Fixed ADE20k test ([#359](https://github.com/open-mmlab/mmsegmentation/pull/359)) + +**New Features** + +- Support memory efficient test ([#330](https://github.com/open-mmlab/mmsegmentation/pull/330)) +- Add more UNet benchmarks ([#324](https://github.com/open-mmlab/mmsegmentation/pull/324)) +- Support Lovasz Loss ([#351](https://github.com/open-mmlab/mmsegmentation/pull/351)) + +**Improvements** + +- Move train_cfg/test_cfg inside model ([#341](https://github.com/open-mmlab/mmsegmentation/pull/341)) + +### V0.10 (01/01/2021) + +**Highlights** + +- Support MobileNetV3, DMNet, APCNet. Add models of ResNet18V1b, ResNet18V1c, ResNet50V1b. + +**Bug Fixes** + +- Fixed CPU TTA ([#276](https://github.com/open-mmlab/mmsegmentation/pull/276)) +- Fixed CI for pip 20.3 ([#307](https://github.com/open-mmlab/mmsegmentation/pull/307)) + +**New Features** + +- Add ResNet18V1b, ResNet18V1c, ResNet50V1b, ResNet101V1b models ([#316](https://github.com/open-mmlab/mmsegmentation/pull/316)) +- Support MobileNetV3 ([#268](https://github.com/open-mmlab/mmsegmentation/pull/268)) +- Add 4 retinal vessel segmentation benchmark ([#315](https://github.com/open-mmlab/mmsegmentation/pull/315)) +- Support DMNet ([#313](https://github.com/open-mmlab/mmsegmentation/pull/313)) +- Support APCNet ([#299](https://github.com/open-mmlab/mmsegmentation/pull/299)) + +**Improvements** + +- Refactor Documentation page ([#311](https://github.com/open-mmlab/mmsegmentation/pull/311)) +- Support resize data augmentation according to original image size ([#291](https://github.com/open-mmlab/mmsegmentation/pull/291)) + +### V0.9 (30/11/2020) + +**Highlights** + +- Support 4 medical dataset, UNet and CGNet. + +**New Features** + +- Support RandomRotate transform ([#215](https://github.com/open-mmlab/mmsegmentation/pull/215), [#260](https://github.com/open-mmlab/mmsegmentation/pull/260)) +- Support RGB2Gray transform ([#227](https://github.com/open-mmlab/mmsegmentation/pull/227)) +- Support Rerange transform ([#228](https://github.com/open-mmlab/mmsegmentation/pull/228)) +- Support ignore_index for BCE loss ([#210](https://github.com/open-mmlab/mmsegmentation/pull/210)) +- Add modelzoo statistics ([#263](https://github.com/open-mmlab/mmsegmentation/pull/263)) +- Support Dice evaluation metric ([#225](https://github.com/open-mmlab/mmsegmentation/pull/225)) +- Support Adjust Gamma transform ([#232](https://github.com/open-mmlab/mmsegmentation/pull/232)) +- Support CLAHE transform ([#229](https://github.com/open-mmlab/mmsegmentation/pull/229)) + +**Bug Fixes** + +- Fixed detail API link ([#267](https://github.com/open-mmlab/mmsegmentation/pull/267)) + +### V0.8 (03/11/2020) + +**Highlights** + +- Support 4 medical dataset, UNet and CGNet. + +**New Features** + +- Support customize runner ([#118](https://github.com/open-mmlab/mmsegmentation/pull/118)) +- Support UNet ([#161](https://github.com/open-mmlab/mmsegmentation/pull/162)) +- Support CHASE_DB1, DRIVE, STARE, HRD ([#203](https://github.com/open-mmlab/mmsegmentation/pull/203)) +- Support CGNet ([#223](https://github.com/open-mmlab/mmsegmentation/pull/223)) + +### V0.7 (07/10/2020) + +**Highlights** + +- Support Pascal Context dataset and customizing class dataset. + +**Bug Fixes** + +- Fixed CPU inference ([#153](https://github.com/open-mmlab/mmsegmentation/pull/153)) + +**New Features** + +- Add DeepLab OS16 models ([#154](https://github.com/open-mmlab/mmsegmentation/pull/154)) +- Support Pascal Context dataset ([#133](https://github.com/open-mmlab/mmsegmentation/pull/133)) +- Support customizing dataset classes ([#71](https://github.com/open-mmlab/mmsegmentation/pull/71)) +- Support customizing dataset palette ([#157](https://github.com/open-mmlab/mmsegmentation/pull/157)) + +**Improvements** + +- Support 4D tensor output in ONNX ([#150](https://github.com/open-mmlab/mmsegmentation/pull/150)) +- Remove redundancies in ONNX export ([#160](https://github.com/open-mmlab/mmsegmentation/pull/160)) +- Migrate to MMCV DepthwiseSeparableConv ([#158](https://github.com/open-mmlab/mmsegmentation/pull/158)) +- Migrate to MMCV collect_env ([#137](https://github.com/open-mmlab/mmsegmentation/pull/137)) +- Use img_prefix and seg_prefix for loading ([#153](https://github.com/open-mmlab/mmsegmentation/pull/153)) + +### V0.6 (10/09/2020) + +**Highlights** + +- Support new methods i.e. MobileNetV2, EMANet, DNL, PointRend, Semantic FPN, Fast-SCNN, ResNeSt. + +**Bug Fixes** + +- Fixed sliding inference ONNX export ([#90](https://github.com/open-mmlab/mmsegmentation/pull/90)) + +**New Features** + +- Support MobileNet v2 ([#86](https://github.com/open-mmlab/mmsegmentation/pull/86)) +- Support EMANet ([#34](https://github.com/open-mmlab/mmsegmentation/pull/34)) +- Support DNL ([#37](https://github.com/open-mmlab/mmsegmentation/pull/37)) +- Support PointRend ([#109](https://github.com/open-mmlab/mmsegmentation/pull/109)) +- Support Semantic FPN ([#94](https://github.com/open-mmlab/mmsegmentation/pull/94)) +- Support Fast-SCNN ([#58](https://github.com/open-mmlab/mmsegmentation/pull/58)) +- Support ResNeSt backbone ([#47](https://github.com/open-mmlab/mmsegmentation/pull/47)) +- Support ONNX export (experimental) ([#12](https://github.com/open-mmlab/mmsegmentation/pull/12)) + +**Improvements** + +- Support Upsample in ONNX ([#100](https://github.com/open-mmlab/mmsegmentation/pull/100)) +- Support Windows install (experimental) ([#75](https://github.com/open-mmlab/mmsegmentation/pull/75)) +- Add more OCRNet results ([#20](https://github.com/open-mmlab/mmsegmentation/pull/20)) +- Add PyTorch 1.6 CI ([#64](https://github.com/open-mmlab/mmsegmentation/pull/64)) +- Get version and githash automatically ([#55](https://github.com/open-mmlab/mmsegmentation/pull/55)) + +### v0.5.1 (11/08/2020) + +**Highlights** + +- Support FP16 and more generalized OHEM + +**Bug Fixes** + +- Fixed Pascal VOC conversion script (#19) +- Fixed OHEM weight assign bug (#54) +- Fixed palette type when palette is not given (#27) + +**New Features** + +- Support FP16 (#21) +- Generalized OHEM (#54) + +**Improvements** + +- Add load-from flag (#33) +- Fixed training tricks doc about different learning rates of model (#26) diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..f472acb30abdbcf5191926a8d89f478c1210744c --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,88 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import subprocess +import sys + +sys.path.insert(0, os.path.abspath('..')) + +# -- Project information ----------------------------------------------------- + +project = 'MMSegmentation' +copyright = '2020-2020, OpenMMLab' +author = 'MMSegmentation Authors' +version_file = '../mmseg/version.py' + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +# The full version, including alpha/beta/rc tags +release = get_version() + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'recommonmark', + 'sphinx_markdown_tables', +] + +autodoc_mock_imports = ['matplotlib', 'pycocotools', 'mmseg.version'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} + +# The master toctree document. +master_doc = 'index' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + + +def builder_inited_handler(app): + subprocess.run(['./stat.py']) + + +def setup(app): + app.connect('builder-inited', builder_inited_handler) diff --git a/docs/dataset_prepare.md b/docs/dataset_prepare.md new file mode 100644 index 0000000000000000000000000000000000000000..5407339f13909c3bf32556dc273076d8bb351ba6 --- /dev/null +++ b/docs/dataset_prepare.md @@ -0,0 +1,165 @@ +## Prepare datasets + +It is recommended to symlink the dataset root to `$MMSEGMENTATION/data`. +If your folder structure is different, you may need to change the corresponding paths in config files. + +```none +mmsegmentation +├── mmseg +├── tools +├── configs +├── data +│ ├── cityscapes +│ │ ├── leftImg8bit +│ │ │ ├── train +│ │ │ ├── val +│ │ ├── gtFine +│ │ │ ├── train +│ │ │ ├── val +│ ├── VOCdevkit +│ │ ├── VOC2012 +│ │ │ ├── JPEGImages +│ │ │ ├── SegmentationClass +│ │ │ ├── ImageSets +│ │ │ │ ├── Segmentation +│ │ ├── VOC2010 +│ │ │ ├── JPEGImages +│ │ │ ├── SegmentationClassContext +│ │ │ ├── ImageSets +│ │ │ │ ├── SegmentationContext +│ │ │ │ │ ├── train.txt +│ │ │ │ │ ├── val.txt +│ │ │ ├── trainval_merged.json +│ │ ├── VOCaug +│ │ │ ├── dataset +│ │ │ │ ├── cls +│ ├── ade +│ │ ├── ADEChallengeData2016 +│ │ │ ├── annotations +│ │ │ │ ├── training +│ │ │ │ ├── validation +│ │ │ ├── images +│ │ │ │ ├── training +│ │ │ │ ├── validation +│ ├── CHASE_DB1 +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ ├── DRIVE +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ ├── HRF +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation +│ ├── STARE +│ │ ├── images +│ │ │ ├── training +│ │ │ ├── validation +│ │ ├── annotations +│ │ │ ├── training +│ │ │ ├── validation + +``` + +### Cityscapes + +The data could be found [here](https://www.cityscapes-dataset.com/downloads/) after registration. + +By convention, `**labelTrainIds.png` are used for cityscapes training. +We provided a [scripts](https://github.com/open-mmlab/mmsegmentation/blob/master/tools/convert_datasets/cityscapes.py) based on [cityscapesscripts](https://github.com/mcordts/cityscapesScripts) +to generate `**labelTrainIds.png`. + +```shell +# --nproc means 8 process for conversion, which could be omitted as well. +python tools/convert_datasets/cityscapes.py data/cityscapes --nproc 8 +``` + +### Pascal VOC + +Pascal VOC 2012 could be downloaded from [here](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar). +Beside, most recent works on Pascal VOC dataset usually exploit extra augmentation data, which could be found [here](http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/semantic_contours/benchmark.tgz). + +If you would like to use augmented VOC dataset, please run following command to convert augmentation annotations into proper format. + +```shell +# --nproc means 8 process for conversion, which could be omitted as well. +python tools/convert_datasets/voc_aug.py data/VOCdevkit data/VOCdevkit/VOCaug --nproc 8 +``` + +Please refer to [concat dataset](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/tutorials/new_dataset.md#concatenate-dataset) for details about how to concatenate them and train them together. + +### ADE20K + +The training and validation set of ADE20K could be download from this [link](http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip). +We may also download test set from [here](http://data.csail.mit.edu/places/ADEchallenge/release_test.zip). + +### Pascal Context + +The training and validation set of Pascal Context could be download from [here](http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar). You may also download test set from [here](http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2010test.tar) after registration. + +To split the training and validation set from original dataset, you may download trainval_merged.json from [here](https://codalabuser.blob.core.windows.net/public/trainval_merged.json). + +If you would like to use Pascal Context dataset, please install [Detail](https://github.com/zhanghang1989/detail-api) and then run the following command to convert annotations into proper format. + +```shell +python tools/convert_datasets/pascal_context.py data/VOCdevkit data/VOCdevkit/VOC2010/trainval_merged.json +``` + +### CHASE DB1 + +The training and validation set of CHASE DB1 could be download from [here](https://staffnet.kingston.ac.uk/~ku15565/CHASE_DB1/assets/CHASEDB1.zip). + +To convert CHASE DB1 dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/convert_datasets/chase_db1.py /path/to/CHASEDB1.zip +``` + +The script will make directory structure automatically. + +### DRIVE + +The training and validation set of DRIVE could be download from [here](https://drive.grand-challenge.org/). Before that, you should register an account. Currently '1st_manual' is not provided officially. + +To convert DRIVE dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/convert_datasets/drive.py /path/to/training.zip /path/to/test.zip +``` + +The script will make directory structure automatically. + +### HRF + +First, download [healthy.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/healthy.zip), [glaucoma.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/glaucoma.zip), [diabetic_retinopathy.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy.zip), [healthy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/healthy_manualsegm.zip), [glaucoma_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/glaucoma_manualsegm.zip) and [diabetic_retinopathy_manualsegm.zip](https://www5.cs.fau.de/fileadmin/research/datasets/fundus-images/diabetic_retinopathy_manualsegm.zip). + +To convert HRF dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/convert_datasets/hrf.py /path/to/healthy.zip /path/to/healthy_manualsegm.zip /path/to/glaucoma.zip /path/to/glaucoma_manualsegm.zip /path/to/diabetic_retinopathy.zip /path/to/diabetic_retinopathy_manualsegm.zip +``` + +The script will make directory structure automatically. + +### STARE + +First, download [stare-images.tar](http://cecas.clemson.edu/~ahoover/stare/probing/stare-images.tar), [labels-ah.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-ah.tar) and [labels-vk.tar](http://cecas.clemson.edu/~ahoover/stare/probing/labels-vk.tar). + +To convert STARE dataset to MMSegmentation format, you should run the following command: + +```shell +python tools/convert_datasets/stare.py /path/to/stare-images.tar /path/to/labels-ah.tar /path/to/labels-vk.tar +``` + +The script will make directory structure automatically. diff --git a/docs/get_started.md b/docs/get_started.md new file mode 100644 index 0000000000000000000000000000000000000000..3182c53451dae3024a4e99aace1c766856773d66 --- /dev/null +++ b/docs/get_started.md @@ -0,0 +1,193 @@ +## Prerequisites + +- Linux or macOS (Windows is in experimental support) +- Python 3.6+ +- PyTorch 1.3+ +- CUDA 9.2+ (If you build PyTorch from source, CUDA 9.0 is also compatible) +- GCC 5+ +- [MMCV](https://mmcv.readthedocs.io/en/latest/#installation) + +Note: You need to run `pip uninstall mmcv` first if you have mmcv installed. +If mmcv and mmcv-full are both installed, there will be `ModuleNotFoundError`. + +## Installation + +a. Create a conda virtual environment and activate it. + +```shell +conda create -n open-mmlab python=3.7 -y +conda activate open-mmlab +``` + +b. Install PyTorch and torchvision following the [official instructions](https://pytorch.org/). +Here we use PyTorch 1.6.0 and CUDA 10.1. +You may also switch to other version by specifying the version number. + +```shell +conda install pytorch=1.6.0 torchvision cudatoolkit=10.1 -c pytorch +``` + +c. Install [MMCV](https://mmcv.readthedocs.io/en/latest/) following the [official instructions](https://mmcv.readthedocs.io/en/latest/#installation). +Either `mmcv` or `mmcv-full` is compatible with MMSegmentation, but for methods like CCNet and PSANet, CUDA ops in `mmcv-full` is required. + +**Install mmcv for Linux:** + +The pre-build mmcv-full (with PyTorch 1.5 and CUDA 10.1) can be installed by running: (other available versions could be found [here](https://mmcv.readthedocs.io/en/latest/#install-with-pip)) + +```shell +pip install mmcv-full==latest+torch1.5.0+cu101 -f https://download.openmmlab.com/mmcv/dist/index.html +``` + +**Install mmcv for Windows (Experimental):** + +For Windows, the installation of MMCV requires native C++ compilers, such as cl.exe. Please add the compiler to %PATH%. + +A typical path for cl.exe looks like the following if you have Windows SDK and Visual Studio installed on your computer: + +```shell +C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.26.28801\bin\Hostx86\x64 +``` + +Or you should download the cl compiler from web and then set up the path. + +Then, clone mmcv from github and install mmcv via pip: + +```shell +git clone https://github.com/open-mmlab/mmcv.git +cd mmcv +pip install -e . +``` + +Or simply: + +```shell +pip install mmcv +``` + +Currently, mmcv-full is not supported on Windows. + +d. Install MMSegmentation. + +```shell +pip install mmsegmentation # install the latest release +``` + +or + +```shell +pip install git+https://github.com/open-mmlab/mmsegmentation.git # install the master branch +``` + +Instead, if you would like to install MMSegmentation in `dev` mode, run following + +```shell +git clone https://github.com/open-mmlab/mmsegmentation.git +cd mmsegmentation +pip install -e . # or "python setup.py develop" +``` + +Note: + +1. When training or testing models on Windows, please ensure that all the '\\' in paths are replaced with '/'. Add .replace('\\', '/') to your python code wherever path strings occur. +2. The `version+git_hash` will also be saved in trained models meta, e.g. 0.5.0+c415a2e. +3. When MMsegmentation is installed on `dev` mode, any local modifications made to the code will take effect without the need to reinstall it. +4. If you would like to use `opencv-python-headless` instead of `opencv-python`, + you can install it before installing MMCV. +5. Some dependencies are optional. Simply running `pip install -e .` will only install the minimum runtime requirements. + To use optional dependencies like `cityscapessripts` either install them manually with `pip install -r requirements/optional.txt` or specify desired extras when calling `pip` (e.g. `pip install -e .[optional]`). Valid keys for the extras field are: `all`, `tests`, `build`, and `optional`. + +### A from-scratch setup script + +#### Linux + +Here is a full script for setting up mmsegmentation with conda and link the dataset path (supposing that your dataset path is $DATA_ROOT). + +```shell +conda create -n open-mmlab python=3.7 -y +conda activate open-mmlab + +conda install pytorch=1.6.0 torchvision cudatoolkit=10.1 -c pytorch +pip install mmcv-full==latest+torch1.5.0+cu101 -f https://download.openmmlab.com/mmcv/dist/index.html +git clone https://github.com/open-mmlab/mmsegmentation.git +cd mmsegmentation +pip install -e . # or "python setup.py develop" + +mkdir data +ln -s $DATA_ROOT data +``` + +#### Windows(Experimental) + +Here is a full script for setting up mmsegmentation with conda and link the dataset path (supposing that your dataset path is +%DATA_ROOT%. Notice: It must be an absolute path). + +```shell +conda create -n open-mmlab python=3.7 -y +conda activate open-mmlab + +conda install pytorch=1.6.0 torchvision cudatoolkit=10.1 -c pytorch +set PATH=full\path\to\your\cpp\compiler;%PATH% +pip install mmcv + +git clone https://github.com/open-mmlab/mmsegmentation.git +cd mmsegmentation +pip install -e . # or "python setup.py develop" + +mklink /D data %DATA_ROOT% +``` + +#### Developing with multiple MMSegmentation versions + +The train and test scripts already modify the `PYTHONPATH` to ensure the script use the MMSegmentation in the current directory. + +To use the default MMSegmentation installed in the environment rather than that you are working with, you can remove the following line in those scripts + +```shell +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH +``` + +## Verification + +To verify whether MMSegmentation and the required environment are installed correctly, we can run sample python codes to initialize a detector and inference a demo image: + +```python +from mmseg.apis import inference_segmentor, init_segmentor +import mmcv + +config_file = 'configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py' +checkpoint_file = 'checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth' + +# build the model from a config file and a checkpoint file +model = init_segmentor(config_file, checkpoint_file, device='cuda:0') + +# test a single image and show the results +img = 'test.jpg' # or img = mmcv.imread(img), which will only load it once +result = inference_segmentor(model, img) +# visualize the results in a new window +model.show_result(img, result, show=True) +# or save the visualization results to image files +model.show_result(img, result, out_file='result.jpg') + +# test a video and show the results +video = mmcv.VideoReader('video.mp4') +for frame in video: + result = inference_segmentor(model, frame) + model.show_result(frame, result, wait_time=1) +``` + +The above code is supposed to run successfully upon you finish the installation. + +We also provide a demo script to test a single image. + +```shell +python demo/image_demo.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} [--device ${DEVICE_NAME}] [--palette-thr ${PALETTE}] +``` + +Examples: + +```shell +python demo/image_demo.py demo/demo.jpg configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth --device cuda:0 --palette cityscapes +``` + +A notebook demo can be found in [demo/inference_demo.ipynb](../demo/inference_demo.ipynb). diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..94db9026574e36dbaa668023e9783ccb669b5b3a --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,57 @@ +Welcome to MMSegmenation's documentation! +======================================= + +.. toctree:: + :maxdepth: 2 + :caption: Get Started + + get_started.md + +.. toctree:: + :maxdepth: 1 + :caption: Dataset Preparation + + dataset_prepare.md + +.. toctree:: + :maxdepth: 1 + :caption: Model Zoo + + model_zoo.md + modelzoo_statistics.md + +.. toctree:: + :maxdepth: 2 + :caption: Quick Run + + train.md + inference.md + +.. toctree:: + :maxdepth: 2 + :caption: Tutorials + + tutorials/index.rst + +.. toctree:: + :maxdepth: 2 + :caption: Useful Tools and Scripts + + useful_tools.md + +.. toctree:: + :maxdepth: 2 + :caption: Notes + + changelog.md + +.. toctree:: + :caption: API Reference + + api.rst + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/docs/inference.md b/docs/inference.md new file mode 100644 index 0000000000000000000000000000000000000000..d7bc21b65acb9da4a38ade92be6ccf3c56574982 --- /dev/null +++ b/docs/inference.md @@ -0,0 +1,101 @@ +## Inference with pretrained models + +We provide testing scripts to evaluate a whole dataset (Cityscapes, PASCAL VOC, ADE20k, etc.), +and also some high-level apis for easier integration to other projects. + +### Test a dataset + +- single GPU +- single node multiple GPU +- multiple node + +You can use the following commands to test a dataset. + +```shell +# single-gpu testing +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] [--show] + +# multi-gpu testing +./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] +``` + +Optional arguments: + +- `RESULT_FILE`: Filename of the output results in pickle format. If not specified, the results will not be saved to a file. +- `EVAL_METRICS`: Items to be evaluated on the results. Allowed values depend on the dataset, e.g., `mIoU` is available for all dataset. Cityscapes could be evaluated by `cityscapes` as well as standard `mIoU` metrics. +- `--show`: If specified, segmentation results will be plotted on the images and shown in a new window. It is only applicable to single GPU testing and used for debugging and visualization. Please make sure that GUI is available in your environment, otherwise you may encounter the error like `cannot connect to X server`. +- `--show-dir`: If specified, segmentation results will be plotted on the images and saved to the specified directory. It is only applicable to single GPU testing and used for debugging and visualization. You do NOT need a GUI available in your environment for using this option. +- `--eval-options`: Optional parameters during evaluation. When `efficient_test=True`, it will save intermediate results to local files to save CPU memory. Make sure that you have enough local storage space (more than 20GB). + +Examples: + +Assume that you have already downloaded the checkpoints to the directory `checkpoints/`. + +1. Test PSPNet and visualize the results. Press any key for the next image. + + ```shell + python tools/test.py configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \ + --show + ``` + +2. Test PSPNet and save the painted images for latter visualization. + + ```shell + python tools/test.py configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \ + --show-dir psp_r50_512x1024_40ki_cityscapes_results + ``` + +3. Test PSPNet on PASCAL VOC (without saving the test results) and evaluate the mIoU. + + ```shell + python tools/test.py configs/pspnet/pspnet_r50-d8_512x1024_20k_voc12aug.py \ + checkpoints/pspnet_r50-d8_512x1024_20k_voc12aug_20200605_003338-c57ef100.pth \ + --eval mAP + ``` + +4. Test PSPNet with 4 GPUs, and evaluate the standard mIoU and cityscapes metric. + + ```shell + ./tools/dist_test.sh configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \ + 4 --out results.pkl --eval mIoU cityscapes + ``` + + Note: There is some gap (~0.1%) between cityscapes mIoU and our mIoU. The reason is that cityscapes average each class with class size by default. + We use the simple version without average for all datasets. + +5. Test PSPNet on cityscapes test split with 4 GPUs, and generate the png files to be submit to the official evaluation server. + + First, add following to config file `configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py`, + + ```python + data = dict( + test=dict( + img_dir='leftImg8bit/test', + ann_dir='gtFine/test')) + ``` + + Then run test. + + ```shell + ./tools/dist_test.sh configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py \ + checkpoints/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth \ + 4 --format-only --eval-options "imgfile_prefix=./pspnet_test_results" + ``` + + You will get png files under `./pspnet_test_results` directory. + You may run `zip -r results.zip pspnet_test_results/` and submit the zip file to [evaluation server](https://www.cityscapes-dataset.com/submit/). + +6. CPU memory efficient test DeeplabV3+ on Cityscapes (without saving the test results) and evaluate the mIoU. + + ```shell + python tools/test.py \ + configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py \ + deeplabv3plus_r18-d8_512x1024_80k_cityscapes_20201226_080942-cff257fe.pth \ + --eval-options efficient_test=True \ + --eval mIoU + ``` + + Using ```pmap``` to view CPU memory footprint, it used 2.25GB CPU memory with ```efficient_test=True``` and 11.06GB CPU memory with ```efficient_test=False``` . This optional parameter can save a lot of memory. diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000000000000000000000000000000000000..922152e96a04a242e6fc40f124261d74890617d8 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/model_zoo.md b/docs/model_zoo.md new file mode 100644 index 0000000000000000000000000000000000000000..2d4c1c2ac999c771e7048c36bd94d316457f0e50 --- /dev/null +++ b/docs/model_zoo.md @@ -0,0 +1,163 @@ +# Benchmark and Model Zoo + +## Common settings + +* We use distributed training with 4 GPUs by default. +* All pytorch-style pretrained backbones on ImageNet are train by ourselves, with the same procedure in the [paper](https://arxiv.org/pdf/1812.01187.pdf). + Our ResNet style backbone are based on ResNetV1c variant, where the 7x7 conv in the input stem is replaced with three 3x3 convs. +* For the consistency across different hardwares, we report the GPU memory as the maximum value of `torch.cuda.max_memory_allocated()` for all 4 GPUs with `torch.backends.cudnn.benchmark=False`. + Note that this value is usually less than what `nvidia-smi` shows. +* We report the inference time as the total time of network forwarding and post-processing, excluding the data loading time. + Results are obtained with the script `tools/benchmark.py` which computes the average time on 200 images with `torch.backends.cudnn.benchmark=False`. +* There are two inference modes in this framework. + + * `slide` mode: The `test_cfg` will be like `dict(mode='slide', crop_size=(769, 769), stride=(513, 513))`. + + In this mode, multiple patches will be cropped from input image, passed into network individually. + The crop size and stride between patches are specified by `crop_size` and `stride`. + The overlapping area will be merged by average + + * `whole` mode: The `test_cfg` will be like `dict(mode='whole')`. + + In this mode, the whole imaged will be passed into network directly. + + By default, we use `slide` inference for 769x769 trained model, `whole` inference for the rest. +* For input size of 8x+1 (e.g. 769), `align_corner=True` is adopted as a traditional practice. + Otherwise, for input size of 8x (e.g. 512, 1024), `align_corner=False` is adopted. + +## Baselines + +### FCN + +Please refer to [FCN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fcn) for details. + +### PSPNet + +Please refer to [PSPNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/pspnet) for details. + +### DeepLabV3 + +Please refer to [DeepLabV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3) for details. + +### PSANet + +Please refer to [PSANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/psanet) for details. + +### DeepLabV3+ + +Please refer to [DeepLabV3+](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/deeplabv3plus) for details. + +### UPerNet + +Please refer to [UPerNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/upernet) for details. + +### NonLocal Net + +Please refer to [NonLocal Net](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/nlnet) for details. + +### EncNet + +Please refer to [EncNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/encnet) for details. + +### CCNet + +Please refer to [CCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ccnet) for details. + +### DANet + +Please refer to [DANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/danet) for details. + +### APCNet + +Please refer to [APCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/apcnet) for details. + +### HRNet + +Please refer to [HRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/hrnet) for details. + +### GCNet + +Please refer to [GCNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/gcnet) for details. + +### DMNet + +Please refer to [DMNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dmnet) for details. + +### ANN + +Please refer to [ANN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ann) for details. + +### OCRNet + +Please refer to [OCRNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/ocrnet) for details. + +### Fast-SCNN + +Please refer to [Fast-SCNN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fastscnn) for details. + +### ResNeSt + +Please refer to [ResNeSt](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/resnest) for details. + +### Semantic FPN + +Please refer to [Semantic FPN](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/semfpn) for details. + +### PointRend + +Please refer to [PointRend](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/point_rend) for details. + +### MobileNetV2 + +Please refer to [MobileNetV2](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v2) for details. + +### MobileNetV3 + +Please refer to [MobileNetV3](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/mobilenet_v3) for details. + +### EMANet + +Please refer to [EMANet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/emanet) for details. + +### DNLNet + +Please refer to [DNLNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dnlnet) for details. + +### CGNet + +Please refer to [CGNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/cgnet) for details. + +### Mixed Precision (FP16) Training + +Please refer [Mixed Precision (FP16) Training](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fp16/README.md) for details. + +## Speed benchmark + +### Hardware + +* 8 NVIDIA Tesla V100 (32G) GPUs +* Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz + +### Software environment + +* Python 3.7 +* PyTorch 1.5 +* CUDA 10.1 +* CUDNN 7.6.03 +* NCCL 2.4.08 + +### Training speed + +For fair comparison, we benchmark all implementations with ResNet-101V1c. +The input size is fixed to 1024x512 with batch size 2. + +The training speed is reported as followed, in terms of second per iter (s/iter). The lower, the better. + +| Implementation | PSPNet (s/iter) | DeepLabV3+ (s/iter) | +|----------------|-----------------|---------------------| +| [MMSegmentation](https://github.com/open-mmlab/mmsegmentation) | **0.83** | **0.85** | +| [SegmenTron](https://github.com/LikeLy-Journey/SegmenTron) | 0.84 | 0.85 | +| [CASILVision](https://github.com/CSAILVision/semantic-segmentation-pytorch) | 1.15 | N/A | +| [vedaseg](https://github.com/Media-Smart/vedaseg) | 0.95 | 1.25 | + +Note: The output stride of DeepLabV3+ is 8. diff --git a/docs/stat.py b/docs/stat.py new file mode 100644 index 0000000000000000000000000000000000000000..3aaf0607004e1aa9d92001da78521afe51057034 --- /dev/null +++ b/docs/stat.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +import functools as func +import glob +import os.path as osp +import re + +import numpy as np + +url_prefix = 'https://github.com/open-mmlab/mmsegmentation/blob/master/' + +files = sorted(glob.glob('../configs/*/README.md')) + +stats = [] +titles = [] +num_ckpts = 0 + +for f in files: + url = osp.dirname(f.replace('../', url_prefix)) + + with open(f, 'r') as content_file: + content = content_file.read() + + title = content.split('\n')[0].replace('#', '').strip() + ckpts = set(x.lower().strip() + for x in re.findall(r'https?://download.*\.pth', content) + if 'mmsegmentation' in x) + if len(ckpts) == 0: + continue + + _papertype = [x for x in re.findall(r'\[([A-Z]+)\]', content)] + assert len(_papertype) > 0 + papertype = _papertype[0] + + paper = set([(papertype, title)]) + + titles.append(title) + num_ckpts += len(ckpts) + statsmsg = f""" +\t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts) +""" + stats.append((paper, ckpts, statsmsg)) + +allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats]) +msglist = '\n'.join(x for _, _, x in stats) + +papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) +countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + +modelzoo = f""" +# Model Zoo Statistics + +* Number of papers: {len(set(titles))} +{countstr} + +* Number of checkpoints: {num_ckpts} +{msglist} +""" + +with open('modelzoo_statistics.md', 'w') as f: + f.write(modelzoo) diff --git a/docs/train.md b/docs/train.md new file mode 100644 index 0000000000000000000000000000000000000000..1deac95f7d18185ff0586f81095587471eac46c4 --- /dev/null +++ b/docs/train.md @@ -0,0 +1,83 @@ +## Train a model + +MMSegmentation implements distributed training and non-distributed training, +which uses `MMDistributedDataParallel` and `MMDataParallel` respectively. + +All outputs (log files and checkpoints) will be saved to the working directory, +which is specified by `work_dir` in the config file. + +By default we evaluate the model on the validation set after some iterations, you can change the evaluation interval by adding the interval argument in the training config. + +```python +evaluation = dict(interval=4000) # This evaluate the model per 4000 iterations. +``` + +**\*Important\***: The default learning rate in config files is for 4 GPUs and 2 img/gpu (batch size = 4x2 = 8). +Equivalently, you may also use 8 GPUs and 1 imgs/gpu since all models using cross-GPU SyncBN. + +To trade speed with GPU memory, you may pass in `--options model.backbone.with_cp=True` to enable checkpoint in backbone. + +### Train with a single GPU + +```shell +python tools/train.py ${CONFIG_FILE} [optional arguments] +``` + +If you want to specify the working directory in the command, you can add an argument `--work-dir ${YOUR_WORK_DIR}`. + +### Train with multiple GPUs + +```shell +./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments] +``` + +Optional arguments are: + +- `--no-validate` (**not suggested**): By default, the codebase will perform evaluation at every k iterations during the training. To disable this behavior, use `--no-validate`. +- `--work-dir ${WORK_DIR}`: Override the working directory specified in the config file. +- `--resume-from ${CHECKPOINT_FILE}`: Resume from a previous checkpoint file (to continue the training process). +- `--load-from ${CHECKPOINT_FILE}`: Load weights from a checkpoint file (to start finetuning for another task). + +Difference between `resume-from` and `load-from`: + +- `resume-from` loads both the model weights and optimizer state including the iteration number. +- `load-from` loads only the model weights, starts the training from iteration 0. + +### Train with multiple machines + +If you run MMSegmentation on a cluster managed with [slurm](https://slurm.schedmd.com/), you can use the script `slurm_train.sh`. (This script also supports single machine training.) + +```shell +[GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} --work-dir ${WORK_DIR} +``` + +Here is an example of using 16 GPUs to train PSPNet on the dev partition. + +```shell +GPUS=16 ./tools/slurm_train.sh dev pspr50 configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py /nfs/xxxx/psp_r50_512x1024_40ki_cityscapes +``` + +You can check [slurm_train.sh](../tools/slurm_train.sh) for full arguments and environment variables. + +If you have just multiple machines connected with ethernet, you can refer to +PyTorch [launch utility](https://pytorch.org/docs/stable/distributed_deprecated.html#launch-utility). +Usually it is slow if you do not have high speed networking like InfiniBand. + +### Launch multiple jobs on a single machine + +If you launch multiple jobs on a single machine, e.g., 2 jobs of 4-GPU training on a machine with 8 GPUs, +you need to specify different ports (29500 by default) for each job to avoid communication conflict. Otherwise, there will be error message saying `RuntimeError: Address already in use`. + +If you use `dist_train.sh` to launch training jobs, you can set the port in commands with environment variable `PORT`. + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 +CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4 +``` + +If you use `slurm_train.sh` to launch training jobs, you can set the port in commands with environment variable `MASTER_PORT`. + +```shell +MASTER_PORT=29500 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} +MASTER_PORT=29501 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} +``` diff --git a/docs/tutorials/config.md b/docs/tutorials/config.md new file mode 100644 index 0000000000000000000000000000000000000000..b243c06d5b60fc09135b227235241c6583325a6b --- /dev/null +++ b/docs/tutorials/config.md @@ -0,0 +1,381 @@ +# Tutorial 1: Learn about Configs + +We incorporate modular and inheritance design into our config system, which is convenient to conduct various experiments. +If you wish to inspect the config file, you may run `python tools/print_config.py /PATH/TO/CONFIG` to see the complete config. +You may also pass `--options xxx.yyy=zzz` to see updated config. + +## Config File Structure + +There are 4 basic component types under `config/_base_`, dataset, model, schedule, default_runtime. +Many methods could be easily constructed with one of each like DeepLabV3, PSPNet. +The configs that are composed by components from `_base_` are called _primitive_. + +For all configs under the same folder, it is recommended to have only **one** _primitive_ config. All other configs should inherit from the _primitive_ config. In this way, the maximum of inheritance level is 3. + +For easy understanding, we recommend contributors to inherit from exiting methods. +For example, if some modification is made base on DeepLabV3, user may first inherit the basic DeepLabV3 structure by specifying `_base_ = ../deeplabv3/deeplabv3_r50_512x1024_40ki_cityscapes.py`, then modify the necessary fields in the config files. + +If you are building an entirely new method that does not share the structure with any of the existing methods, you may create a folder `xxxnet` under `configs`, + +Please refer to [mmcv](https://mmcv.readthedocs.io/en/latest/utils.html#config) for detailed documentation. + +## Config Name Style + +We follow the below style to name config files. Contributors are advised to follow the same style. + +``` +{model}_{backbone}_[misc]_[gpu x batch_per_gpu]_{resolution}_{schedule}_{dataset} +``` + +`{xxx}` is required field and `[yyy]` is optional. + +- `{model}`: model type like `psp`, `deeplabv3`, etc. +- `{backbone}`: backbone type like `r50` (ResNet-50), `x101` (ResNeXt-101). +- `[misc]`: miscellaneous setting/plugins of model, e.g. `dconv`, `gcb`, `attention`, `mstrain`. +- `[gpu x batch_per_gpu]`: GPUs and samples per GPU, `8x2` is used by default. +- `{schedule}`: training schedule, `20ki` means 20k iterations. +- `{dataset}`: dataset like `cityscapes`, `voc12aug`, `ade`. + +## An Example of PSPNet + +To help the users have a basic idea of a complete config and the modules in a modern semantic segmentation system, +we make brief comments on the config of PSPNet using ResNet50V1c as the following. +For more detailed usage and the corresponding alternative for each modules, please refer to the API documentation. + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) # Segmentation usually uses SyncBN +model = dict( + type='EncoderDecoder', # Name of segmentor + pretrained='open-mmlab://resnet50_v1c', # The ImageNet pretrained backbone to be loaded + backbone=dict( + type='ResNetV1c', # The type of backbone. Please refer to mmseg/backbone/resnet.py for details. + depth=50, # Depth of backbone. Normally 50, 101 are used. + num_stages=4, # Number of stages of backbone. + out_indices=(0, 1, 2, 3), # The index of output feature maps produced in each stages. + dilations=(1, 1, 2, 4), # The dilation rate of each layer. + strides=(1, 2, 1, 1), # The stride of each layer. + norm_cfg=dict( # The configuration of norm layer. + type='SyncBN', # Type of norm layer. Usually it is SyncBN. + requires_grad=True), # Whether to train the gamma and beta in norm + norm_eval=False, # Whether to freeze the statistics in BN + style='pytorch', # The style of backbone, 'pytorch' means that stride 2 layers are in 3x3 conv, 'caffe' means stride 2 layers are in 1x1 convs. + contract_dilation=True), # When dilation > 1, whether contract first layer of dilation. + decode_head=dict( + type='PSPHead', # Type of decode head. Please refer to mmseg/models/decode_heads for available options. + in_channels=2048, # Input channel of decode head. + in_index=3, # The index of feature map to select. + channels=512, # The intermediate channels of decode head. + pool_scales=(1, 2, 3, 6), # The avg pooling scales of PSPHead. Please refer to paper for details. + dropout_ratio=0.1, # The dropout ratio before final classification layer. + num_classes=19, # Number of segmentation classs. Usually 19 for cityscapes, 21 for VOC, 150 for ADE20k. + norm_cfg=dict(type='SyncBN', requires_grad=True), # The configuration of norm layer. + align_corners=False, # The align_corners argument for resize in decoding. + loss_decode=dict( # Config of loss function for the decode_head. + type='CrossEntropyLoss', # Type of loss used for segmentation. + use_sigmoid=False, # Whether use sigmoid activation for segmentation. + loss_weight=1.0)), # Loss weight of decode head. + auxiliary_head=dict( + type='FCNHead', # Type of auxiliary head. Please refer to mmseg/models/decode_heads for available options. + in_channels=1024, # Input channel of auxiliary head. + in_index=2, # The index of feature map to select. + channels=256, # The intermediate channels of decode head. + num_convs=1, # Number of convs in FCNHead. It is usually 1 in auxiliary head. + concat_input=False, # Whether concat output of convs with input before classification layer. + dropout_ratio=0.1, # The dropout ratio before final classification layer. + num_classes=19, # Number of segmentation classs. Usually 19 for cityscapes, 21 for VOC, 150 for ADE20k. + norm_cfg=dict(type='SyncBN', requires_grad=True), # The configuration of norm layer. + align_corners=False, # The align_corners argument for resize in decoding. + loss_decode=dict( # Config of loss function for the decode_head. + type='CrossEntropyLoss', # Type of loss used for segmentation. + use_sigmoid=False, # Whether use sigmoid activation for segmentation. + loss_weight=0.4))) # Loss weight of auxiliary head, which is usually 0.4 of decode head. +train_cfg = dict() # train_cfg is just a place holder for now. +test_cfg = dict(mode='whole') # The test mode, options are 'whole' and 'sliding'. 'whole': whole image fully-convolutional test. 'sliding': sliding crop window on the image. +dataset_type = 'CityscapesDataset' # Dataset type, this will be used to define the dataset. +data_root = 'data/cityscapes/' # Root path of data. +img_norm_cfg = dict( # Image normalization config to normalize the input images. + mean=[123.675, 116.28, 103.53], # Mean values used to pre-training the pre-trained backbone models. + std=[58.395, 57.12, 57.375], # Standard variance used to pre-training the pre-trained backbone models. + to_rgb=True) # The channel orders of image used to pre-training the pre-trained backbone models. +crop_size = (512, 1024) # The crop size during training. +train_pipeline = [ # Training pipeline. + dict(type='LoadImageFromFile'), # First pipeline to load images from file path. + dict(type='LoadAnnotations'), # Second pipeline to load annotations for current image. + dict(type='Resize', # Augmentation pipeline that resize the images and their annotations. + img_scale=(2048, 1024), # The largest scale of image. + ratio_range=(0.5, 2.0)), # The augmented scale range as ratio. + dict(type='RandomCrop', # Augmentation pipeline that randomly crop a patch from current image. + crop_size=(512, 1024), # The crop size of patch. + cat_max_ratio=0.75), # The max area ratio that could be occupied by single category. + dict( + type='RandomFlip', # Augmentation pipeline that flip the images and their annotations + flip_ratio=0.5), # The ratio or probability to flip + dict(type='PhotoMetricDistortion'), # Augmentation pipeline that distort current image with several photo metric methods. + dict( + type='Normalize', # Augmentation pipeline that normalize the input images + mean=[123.675, 116.28, 103.53], # These keys are the same of img_norm_cfg since the + std=[58.395, 57.12, 57.375], # keys of img_norm_cfg are used here as arguments + to_rgb=True), + dict(type='Pad', # Augmentation pipeline that pad the image to specified size. + size=(512, 1024), # The output size of padding. + pad_val=0, # The padding value for image. + seg_pad_val=255), # The padding value of 'gt_semantic_seg'. + dict(type='DefaultFormatBundle'), # Default format bundle to gather data in the pipeline + dict(type='Collect', # Pipeline that decides which keys in the data should be passed to the segmentor + keys=['img', 'gt_semantic_seg']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), # First pipeline to load images from file path + dict( + type='MultiScaleFlipAug', # An encapsulation that encapsulates the test time augmentations + img_scale=(2048, 1024), # Decides the largest scale for testing, used for the Resize pipeline + flip=False, # Whether to flip images during testing + transforms=[ + dict(type='Resize', # Use resize augmentation + keep_ratio=True), # Whether to keep the ratio between height and width, the img_scale set here will be supressed by the img_scale set above. + dict(type='RandomFlip'), # Thought RandomFlip is added in pipeline, it is not used when flip=False + dict( + type='Normalize', # Normalization config, the values are from img_norm_cfg + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', # Convert image to tensor + keys=['img']), + dict(type='Collect', # Collect pipeline that collect necessary keys for testing. + keys=['img']) + ]) +] +data = dict( + samples_per_gpu=2, # Batch size of a single GPU + workers_per_gpu=2, # Worker to pre-fetch data for each single GPU + train=dict( # Train dataset config + type='CityscapesDataset', # Type of dataset, refer to mmseg/datasets/ for details. + data_root='data/cityscapes/', # The root of dataset. + img_dir='leftImg8bit/train', # The image directory of dataset. + ann_dir='gtFine/train', # The annotation directory of dataset. + pipeline=[ # pipeline, this is passed by the train_pipeline created before. + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='Pad', size=(512, 1024), pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) + ]), + val=dict( # Validation dataset config + type='CityscapesDataset', + data_root='data/cityscapes/', + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=[ # Pipeline is passed by test_pipeline created before + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) + ]), + test=dict( + type='CityscapesDataset', + data_root='data/cityscapes/', + img_dir='leftImg8bit/val', + ann_dir='gtFine/val', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) + ])) +log_config = dict( # config to register logger hook + interval=50, # Interval to print the log + hooks=[ + # dict(type='TensorboardLoggerHook') # The Tensorboard logger is also supported + dict(type='TextLoggerHook', by_epoch=False) + ]) +dist_params = dict(backend='nccl') # Parameters to setup distributed training, the port can also be set. +log_level = 'INFO' # The level of logging. +load_from = None # load models as a pre-trained model from a given path. This will not resume training. +resume_from = None # Resume checkpoints from a given path, the training will be resumed from the iteration when the checkpoint's is saved. +workflow = [('train', 1)] # Workflow for runner. [('train', 1)] means there is only one workflow and the workflow named 'train' is executed once. The workflow trains the model by 40000 iterations according to the `runner.max_iters`. +cudnn_benchmark = True # Whether use cudnn_benchmark to speed up, which is fast for fixed input size. +optimizer = dict( # Config used to build optimizer, support all the optimizers in PyTorch whose arguments are also the same as those in PyTorch + type='SGD', # Type of optimizers, refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/optimizer/default_constructor.py#L13 for more details + lr=0.01, # Learning rate of optimizers, see detail usages of the parameters in the documentation of PyTorch + momentum=0.9, # Momentum + weight_decay=0.0005) # Weight decay of SGD +optimizer_config = dict() # Config used to build the optimizer hook, refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py#L8 for implementation details. +lr_config = dict( + policy='poly', # The policy of scheduler, also support Step, CosineAnnealing, Cyclic, etc. Refer to details of supported LrUpdater from https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py#L9. + power=0.9, # The power of polynomial decay. + min_lr=0.0001, # The minimum learning rate to stable the training. + by_epoch=False) # Whethe count by epoch or not. +runner = dict( + type='IterBasedRunner', # Type of runner to use (i.e. IterBasedRunner or EpochBasedRunner) + max_iters=40000) # Total number of iterations. For EpochBasedRunner use `max_epochs` +checkpoint_config = dict( # Config to set the checkpoint hook, Refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py for implementation. + by_epoch=False, # Whethe count by epoch or not. + interval=4000) # The save interval. +evaluation = dict( # The config to build the evaluation hook. Please refer to mmseg/core/evaulation/eval_hook.py for details. + interval=4000, # The interval of evaluation. + metric='mIoU') # The evaluation metric. + + +``` + +## FAQ + +### Ignore some fields in the base configs + +Sometimes, you may set `_delete_=True` to ignore some of fields in base configs. +You may refer to [mmcv](https://mmcv.readthedocs.io/en/latest/utils.html#inherit-from-base-config-with-ignored-fields) for simple inllustration. + +In MMSegmentation, for example, to change the backbone of PSPNet with the following config. + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='MaskRCNN', + pretrained='torchvision://resnet50', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict(...), + auxiliary_head=dict(...)) +``` + +`ResNet` and `HRNet` use different keywords to construct. + +```python +_base_ = '../pspnet/psp_r50_512x1024_40ki_cityscpaes.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w32', + backbone=dict( + _delete_=True, + type='HRNet', + norm_cfg=norm_cfg, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256)))), + decode_head=dict(...), + auxiliary_head=dict(...)) +``` + +The `_delete_=True` would replace all old keys in `backbone` field with new keys new keys. + +### Use intermediate variables in configs + +Some intermediate variables are used in the configs files, like `train_pipeline`/`test_pipeline` in datasets. +It's worth noting that when modifying intermediate variables in the children configs, user need to pass the intermediate variables into corresponding fields again. +For example, we would like to change multi scale strategy to train/test a PSPNet. `train_pipeline`/`test_pipeline` are intermediate variable we would like modify. + +```python +_base_ = '../pspnet/psp_r50_512x1024_40ki_cityscapes.py' +crop_size = (512, 1024) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(1.0, 2.0)), # change to [1., 2.] + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], # change to multi scale testing + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +``` + +We first define the new `train_pipeline`/`test_pipeline` and pass them into `data`. + +Similarly, if we would like to switch from `SyncBN` to `BN` or `MMSyncBN`, we need to substitute every `norm_cfg` in the config. + +```python +_base_ = '../pspnet/psp_r50_512x1024_40ki_cityscpaes.py' +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg), + decode_head=dict(norm_cfg=norm_cfg), + auxiliary_head=dict(norm_cfg=norm_cfg)) +``` diff --git a/docs/tutorials/customize_datasets.md b/docs/tutorials/customize_datasets.md new file mode 100644 index 0000000000000000000000000000000000000000..020d51316e15a7f6926f49d81dcd2509f5170e07 --- /dev/null +++ b/docs/tutorials/customize_datasets.md @@ -0,0 +1,172 @@ +# Tutorial 2: Customize Datasets + +## Customize datasets by reorganizing data + +The simplest way is to convert your dataset to organize your data into folders. + +An example of file structure is as followed. + +```none +├── data +│ ├── my_dataset +│ │ ├── img_dir +│ │ │ ├── train +│ │ │ │ ├── xxx{img_suffix} +│ │ │ │ ├── yyy{img_suffix} +│ │ │ │ ├── zzz{img_suffix} +│ │ │ ├── val +│ │ ├── ann_dir +│ │ │ ├── train +│ │ │ │ ├── xxx{seg_map_suffix} +│ │ │ │ ├── yyy{seg_map_suffix} +│ │ │ │ ├── zzz{seg_map_suffix} +│ │ │ ├── val + +``` + +A training pair will consist of the files with same suffix in img_dir/ann_dir. + +If `split` argument is given, only part of the files in img_dir/ann_dir will be loaded. +We may specify the prefix of files we would like to be included in the split txt. + +More specifically, for a split txt like following, + +```none +xxx +zzz +``` + +Only +`data/my_dataset/img_dir/train/xxx{img_suffix}`, +`data/my_dataset/img_dir/train/zzz{img_suffix}`, +`data/my_dataset/ann_dir/train/xxx{seg_map_suffix}`, +`data/my_dataset/ann_dir/train/zzz{seg_map_suffix}` will be loaded. + +Note: The annotations are images of shape (H, W), the value pixel should fall in range `[0, num_classes - 1]`. +You may use `'P'` mode of [pillow](https://pillow.readthedocs.io/en/stable/handbook/concepts.html#palette) to create your annotation image with color. + +## Customize datasets by mixing dataset + +MMSegmentation also supports to mix dataset for training. +Currently it supports to concat and repeat datasets. + +### Repeat dataset + +We use `RepeatDataset` as wrapper to repeat the dataset. +For example, suppose the original dataset is `Dataset_A`, to repeat it, the config looks like the following + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( # This is the original config of Dataset_A + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) +``` + +### Concatenate dataset + +There 2 ways to concatenate the dataset. + +1. If the datasets you want to concatenate are in the same type with different annotation files, + you can concatenate the dataset configs like the following. + + 1. You may concatenate two `ann_dir`. + + ```python + dataset_A_train = dict( + type='Dataset_A', + img_dir = 'img_dir', + ann_dir = ['anno_dir_1', 'anno_dir_2'], + pipeline=train_pipeline + ) + ``` + + 2. You may concatenate two `split`. + + ```python + dataset_A_train = dict( + type='Dataset_A', + img_dir = 'img_dir', + ann_dir = 'anno_dir', + split = ['split_1.txt', 'split_2.txt'], + pipeline=train_pipeline + ) + ``` + + 3. You may concatenate two `ann_dir` and `split` simultaneously. + + ```python + dataset_A_train = dict( + type='Dataset_A', + img_dir = 'img_dir', + ann_dir = ['anno_dir_1', 'anno_dir_2'], + split = ['split_1.txt', 'split_2.txt'], + pipeline=train_pipeline + ) + ``` + + In this case, `ann_dir_1` and `ann_dir_2` are corresponding to `split_1.txt` and `split_2.txt`. + +2. In case the dataset you want to concatenate is different, you can concatenate the dataset configs like the following. + + ```python + dataset_A_train = dict() + dataset_B_train = dict() + + data = dict( + imgs_per_gpu=2, + workers_per_gpu=2, + train = [ + dataset_A_train, + dataset_B_train + ], + val = dataset_A_val, + test = dataset_A_test + ) + ``` + +A more complex example that repeats `Dataset_A` and `Dataset_B` by N and M times, respectively, and then concatenates the repeated datasets is as the following. + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( + type='Dataset_A', + ... + pipeline=train_pipeline + ) +) +dataset_A_val = dict( + ... + pipeline=test_pipeline +) +dataset_A_test = dict( + ... + pipeline=test_pipeline +) +dataset_B_train = dict( + type='RepeatDataset', + times=M, + dataset=dict( + type='Dataset_B', + ... + pipeline=train_pipeline + ) +) +data = dict( + imgs_per_gpu=2, + workers_per_gpu=2, + train = [ + dataset_A_train, + dataset_B_train + ], + val = dataset_A_val, + test = dataset_A_test +) + +``` diff --git a/docs/tutorials/customize_models.md b/docs/tutorials/customize_models.md new file mode 100644 index 0000000000000000000000000000000000000000..f637fd6f0431ea0de748e39806be51d1b4849c8e --- /dev/null +++ b/docs/tutorials/customize_models.md @@ -0,0 +1,234 @@ +# Tutorial 4: Customize Models + +## Customize optimizer + +Assume you want to add a optimizer named as `MyOptimizer`, which has arguments `a`, `b`, and `c`. +You need to first implement the new optimizer in a file, e.g., in `mmseg/core/optimizer/my_optimizer.py`: + +```python +from mmcv.runner import OPTIMIZERS +from torch.optim import Optimizer + + +@OPTIMIZERS.register_module +class MyOptimizer(Optimizer): + + def __init__(self, a, b, c) + +``` + +Then add this module in `mmseg/core/optimizer/__init__.py` thus the registry will +find the new module and add it: + +```python +from .my_optimizer import MyOptimizer +``` + +Then you can use `MyOptimizer` in `optimizer` field of config files. +In the configs, the optimizers are defined by the field `optimizer` like the following: + +```python +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +``` + +To use your own optimizer, the field can be changed as + +```python +optimizer = dict(type='MyOptimizer', a=a_value, b=b_value, c=c_value) +``` + +We already support to use all the optimizers implemented by PyTorch, and the only modification is to change the `optimizer` field of config files. +For example, if you want to use `ADAM`, though the performance will drop a lot, the modification could be as the following. + +```python +optimizer = dict(type='Adam', lr=0.0003, weight_decay=0.0001) +``` + +The users can directly set arguments following the [API doc](https://pytorch.org/docs/stable/optim.html?highlight=optim#module-torch.optim) of PyTorch. + +## Customize optimizer constructor + +Some models may have some parameter-specific settings for optimization, e.g. weight decay for BatchNoarm layers. +The users can do those fine-grained parameter tuning through customizing optimizer constructor. + +``` +from mmcv.utils import build_from_cfg + +from mmcv.runner import OPTIMIZER_BUILDERS +from .cocktail_optimizer import CocktailOptimizer + + +@OPTIMIZER_BUILDERS.register_module +class CocktailOptimizerConstructor(object): + + def __init__(self, optimizer_cfg, paramwise_cfg=None): + + def __call__(self, model): + + return my_optimizer + +``` + +## Develop new components + +There are mainly 2 types of components in MMSegmentation. + +- backbone: usually stacks of convolutional network to extract feature maps, e.g., ResNet, HRNet. +- head: the component for semantic segmentation map decoding. + +### Add new backbones + +Here we show how to develop new components with an example of MobileNet. + +1. Create a new file `mmseg/models/backbones/mobilenet.py`. + +```python +import torch.nn as nn + +from ..registry import BACKBONES + + +@BACKBONES.register_module +class MobileNet(nn.Module): + + def __init__(self, arg1, arg2): + pass + + def forward(self, x): # should return a tuple + pass + + def init_weights(self, pretrained=None): + pass +``` + +2. Import the module in `mmseg/models/backbones/__init__.py`. + +```python +from .mobilenet import MobileNet +``` + +3. Use it in your config file. + +```python +model = dict( + ... + backbone=dict( + type='MobileNet', + arg1=xxx, + arg2=xxx), + ... +``` + +### Add new heads + +In MMSegmentation, we provide a base [BaseDecodeHead](https://github.com/open-mmlab/mmsegmentation/blob/master/mmseg/models/decode_heads/decode_head.py) for all segmentation head. +All newly implemented decode heads should be derived from it. +Here we show how to develop a new head with the example of [PSPNet](https://arxiv.org/abs/1612.01105) as the following. + +First, add a new decode head in `mmseg/models/decode_heads/psp_head.py`. +PSPNet implements a decode head for segmentation decode. +To implement a decode head, basically we need to implement three functions of the new module as the following. + +```python +@HEADS.register_module() +class PSPHead(BaseDecodeHead): + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super(PSPHead, self).__init__(**kwargs) + + def init_weights(self): + + def forward(self, inputs): + +``` + +Next, the users need to add the module in the `mmseg/models/decode_heads/__init__.py` thus the corresponding registry could find and load them. + +To config file of PSPNet is as the following + +```python +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='pretrain_model/resnet50_v1c_trick-2cccc1ad.pth', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='PSPHead', + in_channels=2048, + in_index=3, + channels=512, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=19, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0))) + +``` + +### Add new loss + +Assume you want to add a new loss as `MyLoss` for segmentation decode. +To add a new loss function, the users need implement it in `mmseg/models/losses/my_loss.py`. +The decorator `weighted_loss` enable the loss to be weighted for each element. + +```python +import torch +import torch.nn as nn + +from ..builder import LOSSES +from .utils import weighted_loss + +@weighted_loss +def my_loss(pred, target): + assert pred.size() == target.size() and target.numel() > 0 + loss = torch.abs(pred - target) + return loss + +@LOSSES.register_module +class MyLoss(nn.Module): + + def __init__(self, reduction='mean', loss_weight=1.0): + super(MyLoss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss = self.loss_weight * my_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss +``` + +Then the users need to add it in the `mmseg/models/losses/__init__.py`. + +```python +from .my_loss import MyLoss, my_loss + +``` + +To use it, modify the `loss_xxx` field. +Then you need to modify the `loss_decode` field in the head. +`loss_weight` could be used to balance multiple losses. + +```python +loss_decode=dict(type='MyLoss', loss_weight=1.0)) +``` diff --git a/docs/tutorials/customize_runtime.md b/docs/tutorials/customize_runtime.md new file mode 100644 index 0000000000000000000000000000000000000000..dd67ef54f639fa0b3b9a01727d16352752d30899 --- /dev/null +++ b/docs/tutorials/customize_runtime.md @@ -0,0 +1,243 @@ +# Tutorial 6: Customize Runtime Settings + +## Customize optimization settings + +### Customize optimizer supported by Pytorch + +We already support to use all the optimizers implemented by PyTorch, and the only modification is to change the `optimizer` field of config files. +For example, if you want to use `ADAM` (note that the performance could drop a lot), the modification could be as the following. + +```python +optimizer = dict(type='Adam', lr=0.0003, weight_decay=0.0001) +``` + +To modify the learning rate of the model, the users only need to modify the `lr` in the config of optimizer. The users can directly set arguments following the [API doc](https://pytorch.org/docs/stable/optim.html?highlight=optim#module-torch.optim) of PyTorch. + +### Customize self-implemented optimizer + +#### 1. Define a new optimizer + +A customized optimizer could be defined as following. + +Assume you want to add a optimizer named `MyOptimizer`, which has arguments `a`, `b`, and `c`. +You need to create a new directory named `mmseg/core/optimizer`. +And then implement the new optimizer in a file, e.g., in `mmseg/core/optimizer/my_optimizer.py`: + +```python +from .registry import OPTIMIZERS +from torch.optim import Optimizer + + +@OPTIMIZERS.register_module() +class MyOptimizer(Optimizer): + + def __init__(self, a, b, c) + +``` + +#### 2. Add the optimizer to registry + +To find the above module defined above, this module should be imported into the main namespace at first. There are two options to achieve it. + +- Modify `mmseg/core/optimizer/__init__.py` to import it. + + The newly defined module should be imported in `mmseg/core/optimizer/__init__.py` so that the registry will + find the new module and add it: + +```python +from .my_optimizer import MyOptimizer +``` + +- Use `custom_imports` in the config to manually import it + +```python +custom_imports = dict(imports=['mmseg.core.optimizer.my_optimizer'], allow_failed_imports=False) +``` + +The module `mmseg.core.optimizer.my_optimizer` will be imported at the beginning of the program and the class `MyOptimizer` is then automatically registered. +Note that only the package containing the class `MyOptimizer` should be imported. +`mmseg.core.optimizer.my_optimizer.MyOptimizer` **cannot** be imported directly. + +Actually users can use a totally different file directory structure using this importing method, as long as the module root can be located in `PYTHONPATH`. + +#### 3. Specify the optimizer in the config file + +Then you can use `MyOptimizer` in `optimizer` field of config files. +In the configs, the optimizers are defined by the field `optimizer` like the following: + +```python +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +``` + +To use your own optimizer, the field can be changed to + +```python +optimizer = dict(type='MyOptimizer', a=a_value, b=b_value, c=c_value) +``` + +### Customize optimizer constructor + +Some models may have some parameter-specific settings for optimization, e.g. weight decay for BatchNorm layers. +The users can do those fine-grained parameter tuning through customizing optimizer constructor. + +```python +from mmcv.utils import build_from_cfg + +from mmcv.runner.optimizer import OPTIMIZER_BUILDERS, OPTIMIZERS +from mmseg.utils import get_root_logger +from .my_optimizer import MyOptimizer + + +@OPTIMIZER_BUILDERS.register_module() +class MyOptimizerConstructor(object): + + def __init__(self, optimizer_cfg, paramwise_cfg=None): + + def __call__(self, model): + + return my_optimizer + +``` + +The default optimizer constructor is implemented [here](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/optimizer/default_constructor.py#L11), which could also serve as a template for new optimizer constructor. + +### Additional settings + +Tricks not implemented by the optimizer should be implemented through optimizer constructor (e.g., set parameter-wise learning rates) or hooks. We list some common settings that could stabilize the training or accelerate the training. Feel free to create PR, issue for more settings. + +- __Use gradient clip to stabilize training__: + Some models need gradient clip to clip the gradients to stabilize the training process. An example is as below: + + ```python + optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) + ``` + + If your config inherits the base config which already sets the `optimizer_config`, you might need `_delete_=True` to overide the unnecessary settings. See the [config documenetation](https://mmsegmentation.readthedocs.io/en/latest/config.html) for more details. + +- __Use momentum schedule to accelerate model convergence__: + We support momentum scheduler to modify model's momentum according to learning rate, which could make the model converge in a faster way. + Momentum scheduler is usually used with LR scheduler, for example, the following config is used in 3D detection to accelerate convergence. + For more details, please refer to the implementation of [CyclicLrUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/lr_updater.py#L327) and [CyclicMomentumUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/momentum_updater.py#L130). + + ```python + lr_config = dict( + policy='cyclic', + target_ratio=(10, 1e-4), + cyclic_times=1, + step_ratio_up=0.4, + ) + momentum_config = dict( + policy='cyclic', + target_ratio=(0.85 / 0.95, 1), + cyclic_times=1, + step_ratio_up=0.4, + ) + ``` + +## Customize training schedules + +By default we use step learning rate with 40k/80k schedule, this calls [`PolyLrUpdaterHook`](https://github.com/open-mmlab/mmcv/blob/826d3a7b68596c824fa1e2cb89b6ac274f52179c/mmcv/runner/hooks/lr_updater.py#L196) in MMCV. +We support many other learning rate schedule [here](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py), such as `CosineAnnealing` and `Poly` schedule. Here are some examples + +- Step schedule: + + ```python + lr_config = dict(policy='step', step=[9, 10]) + ``` + +- ConsineAnnealing schedule: + + ```python + lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 10, + min_lr_ratio=1e-5) + ``` + +## Customize workflow + +Workflow is a list of (phase, epochs) to specify the running order and epochs. +By default it is set to be + +```python +workflow = [('train', 1)] +``` + +which means running 1 epoch for training. +Sometimes user may want to check some metrics (e.g. loss, accuracy) about the model on the validate set. +In such case, we can set the workflow as + +```python +[('train', 1), ('val', 1)] +``` + +so that 1 epoch for training and 1 epoch for validation will be run iteratively. + +**Note**: + +1. The parameters of model will not be updated during val epoch. +2. Keyword `total_epochs` in the config only controls the number of training epochs and will not affect the validation workflow. +3. Workflows `[('train', 1), ('val', 1)]` and `[('train', 1)]` will not change the behavior of `EvalHook` because `EvalHook` is called by `after_train_epoch` and validation workflow only affect hooks that are called through `after_val_epoch`. Therefore, the only difference between `[('train', 1), ('val', 1)]` and `[('train', 1)]` is that the runner will calculate losses on validation set after each training epoch. + +## Customize hooks + +### Use hooks implemented in MMCV + +If the hook is already implemented in MMCV, you can directly modify the config to use the hook as below + +```python +custom_hooks = [ + dict(type='MyHook', a=a_value, b=b_value, priority='NORMAL') +] +``` + +### Modify default runtime hooks + +There are some common hooks that are not registerd through `custom_hooks`, they are + +- log_config +- checkpoint_config +- evaluation +- lr_config +- optimizer_config +- momentum_config + +In those hooks, only the logger hook has the `VERY_LOW` priority, others' priority are `NORMAL`. +The above-mentioned tutorials already covers how to modify `optimizer_config`, `momentum_config`, and `lr_config`. +Here we reveals how what we can do with `log_config`, `checkpoint_config`, and `evaluation`. + +#### Checkpoint config + +The MMCV runner will use `checkpoint_config` to initialize [`CheckpointHook`](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/hooks/checkpoint.py#L9). + +```python +checkpoint_config = dict(interval=1) +``` + +The users could set `max_keep_ckpts` to only save only small number of checkpoints or decide whether to store state dict of optimizer by `save_optimizer`. More details of the arguments are [here](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.CheckpointHook) + +#### Log config + +The `log_config` wraps multiple logger hooks and enables to set intervals. Now MMCV supports `WandbLoggerHook`, `MlflowLoggerHook`, and `TensorboardLoggerHook`. +The detail usages can be found in the [doc](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.LoggerHook). + +```python +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + dict(type='TensorboardLoggerHook') + ]) +``` + +#### Evaluation config + +The config of `evaluation` will be used to initialize the [`EvalHook`](https://github.com/open-mmlab/mmsegmentation/blob/e3f6f655d69b777341aec2fe8829871cc0beadcb/mmseg/core/evaluation/eval_hooks.py#L7). +Except the key `interval`, other arguments such as `metric` will be passed to the `dataset.evaluate()` + +```python +evaluation = dict(interval=1, metric='mIoU') +``` diff --git a/docs/tutorials/data_pipeline.md b/docs/tutorials/data_pipeline.md new file mode 100644 index 0000000000000000000000000000000000000000..1eecfe91d433ca897ae47a5ae9b8c5f406a3fe2b --- /dev/null +++ b/docs/tutorials/data_pipeline.md @@ -0,0 +1,171 @@ +# Tutorial 3: Customize Data Pipelines + +## Design of Data pipelines + +Following typical conventions, we use `Dataset` and `DataLoader` for data loading +with multiple workers. `Dataset` returns a dict of data items corresponding +the arguments of models' forward method. +Since the data in semantic segmentation may not be the same size, +we introduce a new `DataContainer` type in MMCV to help collect and distribute +data of different size. +See [here](https://github.com/open-mmlab/mmcv/blob/master/mmcv/parallel/data_container.py) for more details. + +The data preparation pipeline and the dataset is decomposed. Usually a dataset +defines how to process the annotations and a data pipeline defines all the steps to prepare a data dict. +A pipeline consists of a sequence of operations. Each operation takes a dict as input and also output a dict for the next transform. + +The operations are categorized into data loading, pre-processing, formatting and test-time augmentation. + +Here is an pipeline example for PSPNet. + +```python +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +crop_size = (512, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +``` + +For each operation, we list the related dict fields that are added/updated/removed. + +### Data loading + +`LoadImageFromFile` + +- add: img, img_shape, ori_shape + +`LoadAnnotations` + +- add: gt_semantic_seg, seg_fields + +### Pre-processing + +`Resize` + +- add: scale, scale_idx, pad_shape, scale_factor, keep_ratio +- update: img, img_shape, *seg_fields + +`RandomFlip` + +- add: flip +- update: img, *seg_fields + +`Pad` + +- add: pad_fixed_size, pad_size_divisor +- update: img, pad_shape, *seg_fields + +`RandomCrop` + +- update: img, pad_shape, *seg_fields + +`Normalize` + +- add: img_norm_cfg +- update: img + +`SegRescale` + +- update: gt_semantic_seg + +`PhotoMetricDistortion` + +- update: img + +### Formatting + +`ToTensor` + +- update: specified by `keys`. + +`ImageToTensor` + +- update: specified by `keys`. + +`Transpose` + +- update: specified by `keys`. + +`ToDataContainer` + +- update: specified by `fields`. + +`DefaultFormatBundle` + +- update: img, gt_semantic_seg + +`Collect` + +- add: img_meta (the keys of img_meta is specified by `meta_keys`) +- remove: all other keys except for those specified by `keys` + +### Test time augmentation + +`MultiScaleFlipAug` + +## Extend and use custom pipelines + +1. Write a new pipeline in any file, e.g., `my_pipeline.py`. It takes a dict as input and return a dict. + + ```python + from mmseg.datasets import PIPELINES + + @PIPELINES.register_module() + class MyTransform: + + def __call__(self, results): + results['dummy'] = True + return results + ``` + +2. Import the new class. + + ```python + from .my_pipeline import MyTransform + ``` + +3. Use it in config files. + + ```python + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + crop_size = (512, 1024) + train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='MyTransform'), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), + ] + ``` diff --git a/docs/tutorials/index.rst b/docs/tutorials/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..e1a67a8b44a9ac3c2bbee59304c2043467ac3f30 --- /dev/null +++ b/docs/tutorials/index.rst @@ -0,0 +1,9 @@ +.. toctree:: + :maxdepth: 2 + + config.md + customize_datasets.md + data_pipeline.md + customize_models.md + training_tricks.md + customize_runtime.md diff --git a/docs/tutorials/training_tricks.md b/docs/tutorials/training_tricks.md new file mode 100644 index 0000000000000000000000000000000000000000..98a201fa649d94525facd8237d32effd6560c658 --- /dev/null +++ b/docs/tutorials/training_tricks.md @@ -0,0 +1,52 @@ +# Tutorial 5: Training Tricks + +MMSegmentation support following training tricks out of box. + +## Different Learning Rate(LR) for Backbone and Heads + +In semantic segmentation, some methods make the LR of heads larger than backbone to achieve better performance or faster convergence. + +In MMSegmentation, you may add following lines to config to make the LR of heads 10 times of backbone. + +```python +optimizer=dict( + paramwise_cfg = dict( + custom_keys={ + 'head': dict(lr_mult=10.)})) +``` + +With this modification, the LR of any parameter group with `'head'` in name will be multiplied by 10. +You may refer to [MMCV doc](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.DefaultOptimizerConstructor) for further details. + +## Online Hard Example Mining (OHEM) + +We implement pixel sampler [here](https://github.com/open-mmlab/mmsegmentation/tree/master/mmseg/core/seg/sampler) for training sampling. +Here is an example config of training PSPNet with OHEM enabled. + +```python +_base_ = './pspnet_r50-d8_512x1024_40k_cityscapes.py' +model=dict( + decode_head=dict( + sampler=dict(type='OHEMPixelSampler', thresh=0.7, min_kept=100000)) ) +``` + +In this way, only pixels with confidence score under 0.7 are used to train. And we keep at least 100000 pixels during training. If `thresh` is not specified, pixels of top ``min_kept`` loss will be selected. + +## Class Balanced Loss + +For dataset that is not balanced in classes distribution, you may change the loss weight of each class. +Here is an example for cityscapes dataset. + +```python +_base_ = './pspnet_r50-d8_512x1024_40k_cityscapes.py' +model=dict( + decode_head=dict( + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0, + # DeepLab used this class weight for cityscapes + class_weight=[0.8373, 0.9180, 0.8660, 1.0345, 1.0166, 0.9969, 0.9754, + 1.0489, 0.8786, 1.0023, 0.9539, 0.9843, 1.1116, 0.9037, + 1.0865, 1.0955, 1.0865, 1.1529, 1.0507]))) +``` + +`class_weight` will be passed into `CrossEntropyLoss` as `weight` argument. Please refer to [PyTorch Doc](https://pytorch.org/docs/stable/nn.html?highlight=crossentropy#torch.nn.CrossEntropyLoss) for details. diff --git a/docs/useful_tools.md b/docs/useful_tools.md new file mode 100644 index 0000000000000000000000000000000000000000..514b5680ee4eff351affd3bfa169c11d5dee9b9f --- /dev/null +++ b/docs/useful_tools.md @@ -0,0 +1,64 @@ +Apart from training/testing scripts, We provide lots of useful tools under the + `tools/` directory. + +### Get the FLOPs and params (experimental) + +We provide a script adapted from [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) to compute the FLOPs and params of a given model. + +```shell +python tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +You will get the result like this. + +```none +============================== +Input shape: (3, 2048, 1024) +Flops: 1429.68 GMac +Params: 48.98 M +============================== +``` + +**Note**: This tool is still experimental and we do not guarantee that the number is correct. You may well use the result for simple comparisons, but double check it before you adopt it in technical reports or papers. + +(1) FLOPs are related to the input shape while parameters are not. The default input shape is (1, 3, 1280, 800). +(2) Some operators are not counted into FLOPs like GN and custom operators. + +### Publish a model + +Before you upload a model to AWS, you may want to +(1) convert model weights to CPU tensors, (2) delete the optimizer states and +(3) compute the hash of the checkpoint file and append the hash id to the filename. + +```shell +python tools/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME} +``` + +E.g., + +```shell +python tools/publish_model.py work_dirs/pspnet/latest.pth psp_r50_hszhao_200ep.pth +``` + +The final output filename will be `psp_r50_512x1024_40ki_cityscapes-{hash id}.pth`. + +### Convert to ONNX (experimental) + +We provide a script to convert model to [ONNX](https://github.com/onnx/onnx) format. The converted model could be visualized by tools like [Netron](https://github.com/lutzroeder/netron). Besides, we also support comparing the output results between Pytorch and ONNX model. + +```shell +python tools/pytorch2onnx.py ${CONFIG_FILE} --checkpoint ${CHECKPOINT_FILE} --output-file ${ONNX_FILE} [--shape ${INPUT_SHAPE} --verify] +``` + +**Note**: This tool is still experimental. Some customized operators are not supported for now. + +## Miscellaneous + +### Print the entire config + +`tools/print_config.py` prints the whole config verbatim, expanding all its + imports. + +```shell +python tools/print_config.py ${CONFIG} [-h] [--options ${OPTIONS [OPTIONS...]}] +``` diff --git a/mmseg/__init__.py b/mmseg/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..f301a5dc34eab89c72f89259416f2f1092f46f1e --- /dev/null +++ b/mmseg/__init__.py @@ -0,0 +1,30 @@ +import mmcv + +from .version import __version__, version_info + +MMCV_MIN = '1.1.4' +MMCV_MAX = '1.3.0' + + +def digit_version(version_str): + digit_version = [] + for x in version_str.split('.'): + if x.isdigit(): + digit_version.append(int(x)) + elif x.find('rc') != -1: + patch_version = x.split('rc') + digit_version.append(int(patch_version[0]) - 1) + digit_version.append(int(patch_version[1])) + return digit_version + + +mmcv_min_version = digit_version(MMCV_MIN) +mmcv_max_version = digit_version(MMCV_MAX) +mmcv_version = digit_version(mmcv.__version__) + + +assert (mmcv_min_version <= mmcv_version <= mmcv_max_version), \ + f'MMCV=={mmcv.__version__} is used but incompatible. ' \ + f'Please install mmcv>={mmcv_min_version}, <={mmcv_max_version}.' + +__all__ = ['__version__', 'version_info'] diff --git a/mmseg/apis/__init__.py b/mmseg/apis/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..170724be38de42daf2bc1a1910e181d68818f165 --- /dev/null +++ b/mmseg/apis/__init__.py @@ -0,0 +1,9 @@ +from .inference import inference_segmentor, init_segmentor, show_result_pyplot +from .test import multi_gpu_test, single_gpu_test +from .train import get_root_logger, set_random_seed, train_segmentor + +__all__ = [ + 'get_root_logger', 'set_random_seed', 'train_segmentor', 'init_segmentor', + 'inference_segmentor', 'multi_gpu_test', 'single_gpu_test', + 'show_result_pyplot' +] diff --git a/mmseg/apis/inference.py b/mmseg/apis/inference.py new file mode 100644 index 0000000000000000000000000000000000000000..20c20dccda2837fb54e8ceaa2aa7e74404c085f7 --- /dev/null +++ b/mmseg/apis/inference.py @@ -0,0 +1,118 @@ +import matplotlib.pyplot as plt +import mmcv +import torch +from mmcv.parallel import collate, scatter +from mmcv.runner import load_checkpoint + +from mmseg.datasets.pipelines import Compose +from mmseg.models import build_segmentor + + +def init_segmentor(config, checkpoint=None, device='cuda:0'): + """Initialize a segmentor from config file. + + Args: + config (str or :obj:`mmcv.Config`): Config file path or the config + object. + checkpoint (str, optional): Checkpoint path. If left as None, the model + will not load any weights. + device (str, optional) CPU/CUDA device option. Default 'cuda:0'. + Use 'cpu' for loading model on CPU. + Returns: + nn.Module: The constructed segmentor. + """ + if isinstance(config, str): + config = mmcv.Config.fromfile(config) + elif not isinstance(config, mmcv.Config): + raise TypeError('config must be a filename or Config object, ' + 'but got {}'.format(type(config))) + config.model.pretrained = None + config.model.train_cfg = None + model = build_segmentor(config.model, test_cfg=config.get('test_cfg')) + if checkpoint is not None: + checkpoint = load_checkpoint(model, checkpoint, map_location='cpu') + model.CLASSES = checkpoint['meta']['CLASSES'] + model.PALETTE = checkpoint['meta']['PALETTE'] + model.cfg = config # save the config in the model for convenience + model.to(device) + model.eval() + return model + + +class LoadImage: + """A simple pipeline to load image.""" + + def __call__(self, results): + """Call function to load images into results. + + Args: + results (dict): A result dict contains the file name + of the image to be read. + + Returns: + dict: ``results`` will be returned containing loaded image. + """ + + if isinstance(results['img'], str): + results['filename'] = results['img'] + results['ori_filename'] = results['img'] + else: + results['filename'] = None + results['ori_filename'] = None + img = mmcv.imread(results['img']) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + return results + + +def inference_segmentor(model, img): + """Inference image(s) with the segmentor. + + Args: + model (nn.Module): The loaded segmentor. + imgs (str/ndarray or list[str/ndarray]): Either image files or loaded + images. + + Returns: + (list[Tensor]): The segmentation result. + """ + cfg = model.cfg + device = next(model.parameters()).device # model device + # build the data pipeline + test_pipeline = [LoadImage()] + cfg.data.test.pipeline[1:] + test_pipeline = Compose(test_pipeline) + # prepare data + data = dict(img=img) + data = test_pipeline(data) + data = collate([data], samples_per_gpu=1) + if next(model.parameters()).is_cuda: + # scatter to specified GPU + data = scatter(data, [device])[0] + else: + data['img_metas'] = [i.data[0] for i in data['img_metas']] + + # forward the model + with torch.no_grad(): + result = model(return_loss=False, rescale=True, **data) + return result + + +def show_result_pyplot(model, img, result, palette=None, fig_size=(15, 10)): + """Visualize the segmentation results on the image. + + Args: + model (nn.Module): The loaded segmentor. + img (str or np.ndarray): Image filename or loaded image. + result (list): The segmentation result. + palette (list[list[int]]] | None): The palette of segmentation + map. If None is given, random palette will be generated. + Default: None + fig_size (tuple): Figure size of the pyplot figure. + """ + if hasattr(model, 'module'): + model = model.module + img = model.show_result(img, result, palette=palette, show=False) + plt.figure(figsize=fig_size) + plt.imshow(mmcv.bgr2rgb(img)) + plt.show() diff --git a/mmseg/apis/test.py b/mmseg/apis/test.py new file mode 100644 index 0000000000000000000000000000000000000000..148df7680e6abe1f9bc761bc4616cec1790e7038 --- /dev/null +++ b/mmseg/apis/test.py @@ -0,0 +1,234 @@ +import os.path as osp +import pickle +import shutil +import tempfile + +import mmcv +import numpy as np +import torch +import torch.distributed as dist +from mmcv.image import tensor2imgs +from mmcv.runner import get_dist_info + + +def np2tmp(array, temp_file_name=None): + """Save ndarray to local numpy file. + + Args: + array (ndarray): Ndarray to save. + temp_file_name (str): Numpy file name. If 'temp_file_name=None', this + function will generate a file name with tempfile.NamedTemporaryFile + to save ndarray. Default: None. + + Returns: + str: The numpy file name. + """ + + if temp_file_name is None: + temp_file_name = tempfile.NamedTemporaryFile( + suffix='.npy', delete=False).name + np.save(temp_file_name, array) + return temp_file_name + + +def single_gpu_test(model, + data_loader, + show=False, + out_dir=None, + efficient_test=False): + """Test with single GPU. + + Args: + model (nn.Module): Model to be tested. + data_loader (utils.data.Dataloader): Pytorch data loader. + show (bool): Whether show results during infernece. Default: False. + out_dir (str, optional): If specified, the results will be dumped into + the directory to save output results. + efficient_test (bool): Whether save the results as local numpy files to + save CPU memory during evaluation. Default: False. + + Returns: + list: The prediction results. + """ + + model.eval() + results = [] + dataset = data_loader.dataset + prog_bar = mmcv.ProgressBar(len(dataset)) + for i, data in enumerate(data_loader): + with torch.no_grad(): + result = model(return_loss=False, **data) + + if show or out_dir: + img_tensor = data['img'][0] + img_metas = data['img_metas'][0].data[0] + imgs = tensor2imgs(img_tensor, **img_metas[0]['img_norm_cfg']) + assert len(imgs) == len(img_metas) + + for img, img_meta in zip(imgs, img_metas): + h, w, _ = img_meta['img_shape'] + img_show = img[:h, :w, :] + + ori_h, ori_w = img_meta['ori_shape'][:-1] + img_show = mmcv.imresize(img_show, (ori_w, ori_h)) + + if out_dir: + out_file = osp.join(out_dir, img_meta['ori_filename']) + else: + out_file = None + + model.module.show_result( + img_show, + result, + palette=dataset.PALETTE, + show=show, + out_file=out_file) + + if isinstance(result, list): + if efficient_test: + result = [np2tmp(_) for _ in result] + results.extend(result) + else: + if efficient_test: + result = np2tmp(result) + results.append(result) + + batch_size = data['img'][0].size(0) + for _ in range(batch_size): + prog_bar.update() + return results + + +def multi_gpu_test(model, + data_loader, + tmpdir=None, + gpu_collect=False, + efficient_test=False): + """Test model with multiple gpus. + + This method tests model with multiple gpus and collects the results + under two different modes: gpu and cpu modes. By setting 'gpu_collect=True' + it encodes results to gpu tensors and use gpu communication for results + collection. On cpu mode it saves the results on different gpus to 'tmpdir' + and collects them by the rank 0 worker. + + Args: + model (nn.Module): Model to be tested. + data_loader (utils.data.Dataloader): Pytorch data loader. + tmpdir (str): Path of directory to save the temporary results from + different gpus under cpu mode. + gpu_collect (bool): Option to use either gpu or cpu to collect results. + efficient_test (bool): Whether save the results as local numpy files to + save CPU memory during evaluation. Default: False. + + Returns: + list: The prediction results. + """ + + model.eval() + results = [] + dataset = data_loader.dataset + rank, world_size = get_dist_info() + if rank == 0: + prog_bar = mmcv.ProgressBar(len(dataset)) + for i, data in enumerate(data_loader): + with torch.no_grad(): + result = model(return_loss=False, rescale=True, **data) + + if isinstance(result, list): + if efficient_test: + result = [np2tmp(_) for _ in result] + results.extend(result) + else: + if efficient_test: + result = np2tmp(result) + results.append(result) + + if rank == 0: + batch_size = data['img'][0].size(0) + for _ in range(batch_size * world_size): + prog_bar.update() + + # collect results from all ranks + if gpu_collect: + results = collect_results_gpu(results, len(dataset)) + else: + results = collect_results_cpu(results, len(dataset), tmpdir) + return results + + +def collect_results_cpu(result_part, size, tmpdir=None): + """Collect results with CPU.""" + rank, world_size = get_dist_info() + # create a tmp dir if it is not specified + if tmpdir is None: + MAX_LEN = 512 + # 32 is whitespace + dir_tensor = torch.full((MAX_LEN, ), + 32, + dtype=torch.uint8, + device='cuda') + if rank == 0: + tmpdir = tempfile.mkdtemp() + tmpdir = torch.tensor( + bytearray(tmpdir.encode()), dtype=torch.uint8, device='cuda') + dir_tensor[:len(tmpdir)] = tmpdir + dist.broadcast(dir_tensor, 0) + tmpdir = dir_tensor.cpu().numpy().tobytes().decode().rstrip() + else: + mmcv.mkdir_or_exist(tmpdir) + # dump the part result to the dir + mmcv.dump(result_part, osp.join(tmpdir, 'part_{}.pkl'.format(rank))) + dist.barrier() + # collect all parts + if rank != 0: + return None + else: + # load results of all parts from tmp dir + part_list = [] + for i in range(world_size): + part_file = osp.join(tmpdir, 'part_{}.pkl'.format(i)) + part_list.append(mmcv.load(part_file)) + # sort the results + ordered_results = [] + for res in zip(*part_list): + ordered_results.extend(list(res)) + # the dataloader may pad some samples + ordered_results = ordered_results[:size] + # remove tmp dir + shutil.rmtree(tmpdir) + return ordered_results + + +def collect_results_gpu(result_part, size): + """Collect results with GPU.""" + rank, world_size = get_dist_info() + # dump result part to tensor with pickle + part_tensor = torch.tensor( + bytearray(pickle.dumps(result_part)), dtype=torch.uint8, device='cuda') + # gather all result part tensor shape + shape_tensor = torch.tensor(part_tensor.shape, device='cuda') + shape_list = [shape_tensor.clone() for _ in range(world_size)] + dist.all_gather(shape_list, shape_tensor) + # padding result part tensor to max length + shape_max = torch.tensor(shape_list).max() + part_send = torch.zeros(shape_max, dtype=torch.uint8, device='cuda') + part_send[:shape_tensor[0]] = part_tensor + part_recv_list = [ + part_tensor.new_zeros(shape_max) for _ in range(world_size) + ] + # gather all result part + dist.all_gather(part_recv_list, part_send) + + if rank == 0: + part_list = [] + for recv, shape in zip(part_recv_list, shape_list): + part_list.append( + pickle.loads(recv[:shape[0]].cpu().numpy().tobytes())) + # sort the results + ordered_results = [] + for res in zip(*part_list): + ordered_results.extend(list(res)) + # the dataloader may pad some samples + ordered_results = ordered_results[:size] + return ordered_results diff --git a/mmseg/apis/train.py b/mmseg/apis/train.py new file mode 100644 index 0000000000000000000000000000000000000000..5f526df2b0f822a2d94a88265732a153bff4e4a4 --- /dev/null +++ b/mmseg/apis/train.py @@ -0,0 +1,116 @@ +import random +import warnings + +import numpy as np +import torch +from mmcv.parallel import MMDataParallel, MMDistributedDataParallel +from mmcv.runner import build_optimizer, build_runner + +from mmseg.core import DistEvalHook, EvalHook +from mmseg.datasets import build_dataloader, build_dataset +from mmseg.utils import get_root_logger + + +def set_random_seed(seed, deterministic=False): + """Set random seed. + + Args: + seed (int): Seed to be used. + deterministic (bool): Whether to set the deterministic option for + CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` + to True and `torch.backends.cudnn.benchmark` to False. + Default: False. + """ + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + +def train_segmentor(model, + dataset, + cfg, + distributed=False, + validate=False, + timestamp=None, + meta=None): + """Launch segmentor training.""" + logger = get_root_logger(cfg.log_level) + + # prepare data loaders + dataset = dataset if isinstance(dataset, (list, tuple)) else [dataset] + data_loaders = [ + build_dataloader( + ds, + cfg.data.samples_per_gpu, + cfg.data.workers_per_gpu, + # cfg.gpus will be ignored if distributed + len(cfg.gpu_ids), + dist=distributed, + seed=cfg.seed, + drop_last=True) for ds in dataset + ] + + # put model on gpus + if distributed: + find_unused_parameters = cfg.get('find_unused_parameters', False) + # Sets the `find_unused_parameters` parameter in + # torch.nn.parallel.DistributedDataParallel + model = MMDistributedDataParallel( + model.cuda(), + device_ids=[torch.cuda.current_device()], + broadcast_buffers=False, + find_unused_parameters=find_unused_parameters) + else: + model = MMDataParallel( + model.cuda(cfg.gpu_ids[0]), device_ids=cfg.gpu_ids) + + # build runner + optimizer = build_optimizer(model, cfg.optimizer) + + if cfg.get('runner') is None: + cfg.runner = {'type': 'IterBasedRunner', 'max_iters': cfg.total_iters} + warnings.warn( + 'config is now expected to have a `runner` section, ' + 'please set `runner` in your config.', UserWarning) + + runner = build_runner( + cfg.runner, + default_args=dict( + model=model, + batch_processor=None, + optimizer=optimizer, + work_dir=cfg.work_dir, + logger=logger, + meta=meta)) + + # register hooks + runner.register_training_hooks(cfg.lr_config, cfg.optimizer_config, + cfg.checkpoint_config, cfg.log_config, + cfg.get('momentum_config', None)) + + # an ugly walkaround to make the .log and .log.json filenames the same + runner.timestamp = timestamp + + # register eval hooks + if validate: + val_dataset = build_dataset(cfg.data.val, dict(test_mode=True)) + val_dataloader = build_dataloader( + val_dataset, + samples_per_gpu=1, + workers_per_gpu=cfg.data.workers_per_gpu, + dist=distributed, + shuffle=False) + eval_cfg = cfg.get('evaluation', {}) + eval_cfg['by_epoch'] = cfg.runner['type'] != 'IterBasedRunner' + eval_hook = DistEvalHook if distributed else EvalHook + runner.register_hook(eval_hook(val_dataloader, **eval_cfg)) + + if cfg.resume_from: + runner.resume(cfg.resume_from) + elif cfg.load_from: + runner.load_checkpoint(cfg.load_from) + runner.run(data_loaders, cfg.workflow) diff --git a/mmseg/core/__init__.py b/mmseg/core/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..965605587211b7bf0bd6bc3acdbb33dd49cab023 --- /dev/null +++ b/mmseg/core/__init__.py @@ -0,0 +1,3 @@ +from .evaluation import * # noqa: F401, F403 +from .seg import * # noqa: F401, F403 +from .utils import * # noqa: F401, F403 diff --git a/mmseg/core/evaluation/__init__.py b/mmseg/core/evaluation/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c58d926f06b3225f0ac93e10a3766ece6b6a8b2a --- /dev/null +++ b/mmseg/core/evaluation/__init__.py @@ -0,0 +1,8 @@ +from .class_names import get_classes, get_palette +from .eval_hooks import DistEvalHook, EvalHook +from .metrics import eval_metrics, mean_dice, mean_iou + +__all__ = [ + 'EvalHook', 'DistEvalHook', 'mean_dice', 'mean_iou', 'eval_metrics', + 'get_classes', 'get_palette' +] diff --git a/mmseg/core/evaluation/class_names.py b/mmseg/core/evaluation/class_names.py new file mode 100644 index 0000000000000000000000000000000000000000..0d8e66d54b47c200d969ec9fb0bbb642be5d12c3 --- /dev/null +++ b/mmseg/core/evaluation/class_names.py @@ -0,0 +1,152 @@ +import mmcv + + +def cityscapes_classes(): + """Cityscapes class names for external use.""" + return [ + 'road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', 'sky', + 'person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle' + ] + + +def ade_classes(): + """ADE20K class names for external use.""" + return [ + 'wall', 'building', 'sky', 'floor', 'tree', 'ceiling', 'road', 'bed ', + 'windowpane', 'grass', 'cabinet', 'sidewalk', 'person', 'earth', + 'door', 'table', 'mountain', 'plant', 'curtain', 'chair', 'car', + 'water', 'painting', 'sofa', 'shelf', 'house', 'sea', 'mirror', 'rug', + 'field', 'armchair', 'seat', 'fence', 'desk', 'rock', 'wardrobe', + 'lamp', 'bathtub', 'railing', 'cushion', 'base', 'box', 'column', + 'signboard', 'chest of drawers', 'counter', 'sand', 'sink', + 'skyscraper', 'fireplace', 'refrigerator', 'grandstand', 'path', + 'stairs', 'runway', 'case', 'pool table', 'pillow', 'screen door', + 'stairway', 'river', 'bridge', 'bookcase', 'blind', 'coffee table', + 'toilet', 'flower', 'book', 'hill', 'bench', 'countertop', 'stove', + 'palm', 'kitchen island', 'computer', 'swivel chair', 'boat', 'bar', + 'arcade machine', 'hovel', 'bus', 'towel', 'light', 'truck', 'tower', + 'chandelier', 'awning', 'streetlight', 'booth', 'television receiver', + 'airplane', 'dirt track', 'apparel', 'pole', 'land', 'bannister', + 'escalator', 'ottoman', 'bottle', 'buffet', 'poster', 'stage', 'van', + 'ship', 'fountain', 'conveyer belt', 'canopy', 'washer', 'plaything', + 'swimming pool', 'stool', 'barrel', 'basket', 'waterfall', 'tent', + 'bag', 'minibike', 'cradle', 'oven', 'ball', 'food', 'step', 'tank', + 'trade name', 'microwave', 'pot', 'animal', 'bicycle', 'lake', + 'dishwasher', 'screen', 'blanket', 'sculpture', 'hood', 'sconce', + 'vase', 'traffic light', 'tray', 'ashcan', 'fan', 'pier', 'crt screen', + 'plate', 'monitor', 'bulletin board', 'shower', 'radiator', 'glass', + 'clock', 'flag' + ] + + +def voc_classes(): + """Pascal VOC class names for external use.""" + return [ + 'background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', + 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor' + ] + + +def cityscapes_palette(): + """Cityscapes palette for external use.""" + return [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], [220, 20, 60], + [255, 0, 0], [0, 0, 142], [0, 0, 70], [0, 60, 100], [0, 80, 100], + [0, 0, 230], [119, 11, 32]] + + +def ade_palette(): + """ADE20K palette for external use.""" + return [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255], + [11, 200, 200], [255, 82, 0], [0, 255, 245], [0, 61, 255], + [0, 255, 112], [0, 255, 133], [255, 0, 0], [255, 163, 0], + [255, 102, 0], [194, 255, 0], [0, 143, 255], [51, 255, 0], + [0, 82, 255], [0, 255, 41], [0, 255, 173], [10, 0, 255], + [173, 255, 0], [0, 255, 153], [255, 92, 0], [255, 0, 255], + [255, 0, 245], [255, 0, 102], [255, 173, 0], [255, 0, 20], + [255, 184, 184], [0, 31, 255], [0, 255, 61], [0, 71, 255], + [255, 0, 204], [0, 255, 194], [0, 255, 82], [0, 10, 255], + [0, 112, 255], [51, 0, 255], [0, 194, 255], [0, 122, 255], + [0, 255, 163], [255, 153, 0], [0, 255, 10], [255, 112, 0], + [143, 255, 0], [82, 0, 255], [163, 255, 0], [255, 235, 0], + [8, 184, 170], [133, 0, 255], [0, 255, 92], [184, 0, 255], + [255, 0, 31], [0, 184, 255], [0, 214, 255], [255, 0, 112], + [92, 255, 0], [0, 224, 255], [112, 224, 255], [70, 184, 160], + [163, 0, 255], [153, 0, 255], [71, 255, 0], [255, 0, 163], + [255, 204, 0], [255, 0, 143], [0, 255, 235], [133, 255, 0], + [255, 0, 235], [245, 0, 255], [255, 0, 122], [255, 245, 0], + [10, 190, 212], [214, 255, 0], [0, 204, 255], [20, 0, 255], + [255, 255, 0], [0, 153, 255], [0, 41, 255], [0, 255, 204], + [41, 0, 255], [41, 255, 0], [173, 0, 255], [0, 245, 255], + [71, 0, 255], [122, 0, 255], [0, 255, 184], [0, 92, 255], + [184, 255, 0], [0, 133, 255], [255, 214, 0], [25, 194, 194], + [102, 255, 0], [92, 0, 255]] + + +def voc_palette(): + """Pascal VOC palette for external use.""" + return [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], + [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], + [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], + [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], + [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128]] + + +dataset_aliases = { + 'cityscapes': ['cityscapes'], + 'ade': ['ade', 'ade20k'], + 'voc': ['voc', 'pascal_voc', 'voc12', 'voc12aug'] +} + + +def get_classes(dataset): + """Get class names of a dataset.""" + alias2name = {} + for name, aliases in dataset_aliases.items(): + for alias in aliases: + alias2name[alias] = name + + if mmcv.is_str(dataset): + if dataset in alias2name: + labels = eval(alias2name[dataset] + '_classes()') + else: + raise ValueError(f'Unrecognized dataset: {dataset}') + else: + raise TypeError(f'dataset must a str, but got {type(dataset)}') + return labels + + +def get_palette(dataset): + """Get class palette (RGB) of a dataset.""" + alias2name = {} + for name, aliases in dataset_aliases.items(): + for alias in aliases: + alias2name[alias] = name + + if mmcv.is_str(dataset): + if dataset in alias2name: + labels = eval(alias2name[dataset] + '_palette()') + else: + raise ValueError(f'Unrecognized dataset: {dataset}') + else: + raise TypeError(f'dataset must a str, but got {type(dataset)}') + return labels diff --git a/mmseg/core/evaluation/eval_hooks.py b/mmseg/core/evaluation/eval_hooks.py new file mode 100644 index 0000000000000000000000000000000000000000..09c6265ece2d8a4b9656dc0f07336a059f20729b --- /dev/null +++ b/mmseg/core/evaluation/eval_hooks.py @@ -0,0 +1,107 @@ +import os.path as osp + +from mmcv.runner import Hook +from torch.utils.data import DataLoader + + +class EvalHook(Hook): + """Evaluation hook. + + Attributes: + dataloader (DataLoader): A PyTorch dataloader. + interval (int): Evaluation interval (by epochs). Default: 1. + """ + + def __init__(self, dataloader, interval=1, by_epoch=False, **eval_kwargs): + if not isinstance(dataloader, DataLoader): + raise TypeError('dataloader must be a pytorch DataLoader, but got ' + f'{type(dataloader)}') + self.dataloader = dataloader + self.interval = interval + self.by_epoch = by_epoch + self.eval_kwargs = eval_kwargs + + def after_train_iter(self, runner): + """After train epoch hook.""" + if self.by_epoch or not self.every_n_iters(runner, self.interval): + return + from mmseg.apis import single_gpu_test + runner.log_buffer.clear() + results = single_gpu_test(runner.model, self.dataloader, show=False) + self.evaluate(runner, results) + + def after_train_epoch(self, runner): + """After train epoch hook.""" + if not self.by_epoch or not self.every_n_epochs(runner, self.interval): + return + from mmseg.apis import single_gpu_test + runner.log_buffer.clear() + results = single_gpu_test(runner.model, self.dataloader, show=False) + self.evaluate(runner, results) + + def evaluate(self, runner, results): + """Call evaluate function of dataset.""" + eval_res = self.dataloader.dataset.evaluate( + results, logger=runner.logger, **self.eval_kwargs) + for name, val in eval_res.items(): + runner.log_buffer.output[name] = val + runner.log_buffer.ready = True + + +class DistEvalHook(EvalHook): + """Distributed evaluation hook. + + Attributes: + dataloader (DataLoader): A PyTorch dataloader. + interval (int): Evaluation interval (by epochs). Default: 1. + tmpdir (str | None): Temporary directory to save the results of all + processes. Default: None. + gpu_collect (bool): Whether to use gpu or cpu to collect results. + Default: False. + """ + + def __init__(self, + dataloader, + interval=1, + gpu_collect=False, + by_epoch=False, + **eval_kwargs): + if not isinstance(dataloader, DataLoader): + raise TypeError( + 'dataloader must be a pytorch DataLoader, but got {}'.format( + type(dataloader))) + self.dataloader = dataloader + self.interval = interval + self.gpu_collect = gpu_collect + self.by_epoch = by_epoch + self.eval_kwargs = eval_kwargs + + def after_train_iter(self, runner): + """After train epoch hook.""" + if self.by_epoch or not self.every_n_iters(runner, self.interval): + return + from mmseg.apis import multi_gpu_test + runner.log_buffer.clear() + results = multi_gpu_test( + runner.model, + self.dataloader, + tmpdir=osp.join(runner.work_dir, '.eval_hook'), + gpu_collect=self.gpu_collect) + if runner.rank == 0: + print('\n') + self.evaluate(runner, results) + + def after_train_epoch(self, runner): + """After train epoch hook.""" + if not self.by_epoch or not self.every_n_epochs(runner, self.interval): + return + from mmseg.apis import multi_gpu_test + runner.log_buffer.clear() + results = multi_gpu_test( + runner.model, + self.dataloader, + tmpdir=osp.join(runner.work_dir, '.eval_hook'), + gpu_collect=self.gpu_collect) + if runner.rank == 0: + print('\n') + self.evaluate(runner, results) diff --git a/mmseg/core/evaluation/metrics.py b/mmseg/core/evaluation/metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..95b096e7a3d0034c09b9116f7d5614bb4e2601b1 --- /dev/null +++ b/mmseg/core/evaluation/metrics.py @@ -0,0 +1,229 @@ +import mmcv +import numpy as np + + +def intersect_and_union(pred_label, + label, + num_classes, + ignore_index, + label_map=dict(), + reduce_zero_label=False): + """Calculate intersection and Union. + + Args: + pred_label (ndarray): Prediction segmentation map. + label (ndarray): Ground truth segmentation map. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + label_map (dict): Mapping old labels to new labels. The parameter will + work only when label is str. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. The parameter will + work only when label is str. Default: False. + + Returns: + ndarray: The intersection of prediction and ground truth histogram + on all classes. + ndarray: The union of prediction and ground truth histogram on all + classes. + ndarray: The prediction histogram on all classes. + ndarray: The ground truth histogram on all classes. + """ + + if isinstance(pred_label, str): + pred_label = np.load(pred_label) + + if isinstance(label, str): + label = mmcv.imread(label, flag='unchanged', backend='pillow') + # modify if custom classes + if label_map is not None: + for old_id, new_id in label_map.items(): + label[label == old_id] = new_id + if reduce_zero_label: + # avoid using underflow conversion + label[label == 0] = 255 + label = label - 1 + label[label == 254] = 255 + + mask = (label != ignore_index) + pred_label = pred_label[mask] + label = label[mask] + + intersect = pred_label[pred_label == label] + area_intersect, _ = np.histogram( + intersect, bins=np.arange(num_classes + 1)) + area_pred_label, _ = np.histogram( + pred_label, bins=np.arange(num_classes + 1)) + area_label, _ = np.histogram(label, bins=np.arange(num_classes + 1)) + area_union = area_pred_label + area_label - area_intersect + + return area_intersect, area_union, area_pred_label, area_label + + +def total_intersect_and_union(results, + gt_seg_maps, + num_classes, + ignore_index, + label_map=dict(), + reduce_zero_label=False): + """Calculate Total Intersection and Union. + + Args: + results (list[ndarray]): List of prediction segmentation maps. + gt_seg_maps (list[ndarray]): list of ground truth segmentation maps. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + label_map (dict): Mapping old labels to new labels. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. Default: False. + + Returns: + ndarray: The intersection of prediction and ground truth histogram + on all classes. + ndarray: The union of prediction and ground truth histogram on all + classes. + ndarray: The prediction histogram on all classes. + ndarray: The ground truth histogram on all classes. + """ + + num_imgs = len(results) + assert len(gt_seg_maps) == num_imgs + total_area_intersect = np.zeros((num_classes, ), dtype=np.float) + total_area_union = np.zeros((num_classes, ), dtype=np.float) + total_area_pred_label = np.zeros((num_classes, ), dtype=np.float) + total_area_label = np.zeros((num_classes, ), dtype=np.float) + for i in range(num_imgs): + area_intersect, area_union, area_pred_label, area_label = \ + intersect_and_union(results[i], gt_seg_maps[i], num_classes, + ignore_index, label_map, reduce_zero_label) + total_area_intersect += area_intersect + total_area_union += area_union + total_area_pred_label += area_pred_label + total_area_label += area_label + return total_area_intersect, total_area_union, \ + total_area_pred_label, total_area_label + + +def mean_iou(results, + gt_seg_maps, + num_classes, + ignore_index, + nan_to_num=None, + label_map=dict(), + reduce_zero_label=False): + """Calculate Mean Intersection and Union (mIoU) + + Args: + results (list[ndarray]): List of prediction segmentation maps. + gt_seg_maps (list[ndarray]): list of ground truth segmentation maps. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + nan_to_num (int, optional): If specified, NaN values will be replaced + by the numbers defined by the user. Default: None. + label_map (dict): Mapping old labels to new labels. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. Default: False. + + Returns: + float: Overall accuracy on all images. + ndarray: Per category accuracy, shape (num_classes, ). + ndarray: Per category IoU, shape (num_classes, ). + """ + + all_acc, acc, iou = eval_metrics( + results=results, + gt_seg_maps=gt_seg_maps, + num_classes=num_classes, + ignore_index=ignore_index, + metrics=['mIoU'], + nan_to_num=nan_to_num, + label_map=label_map, + reduce_zero_label=reduce_zero_label) + return all_acc, acc, iou + + +def mean_dice(results, + gt_seg_maps, + num_classes, + ignore_index, + nan_to_num=None, + label_map=dict(), + reduce_zero_label=False): + """Calculate Mean Dice (mDice) + + Args: + results (list[ndarray]): List of prediction segmentation maps. + gt_seg_maps (list[ndarray]): list of ground truth segmentation maps. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + nan_to_num (int, optional): If specified, NaN values will be replaced + by the numbers defined by the user. Default: None. + label_map (dict): Mapping old labels to new labels. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. Default: False. + + Returns: + float: Overall accuracy on all images. + ndarray: Per category accuracy, shape (num_classes, ). + ndarray: Per category dice, shape (num_classes, ). + """ + + all_acc, acc, dice = eval_metrics( + results=results, + gt_seg_maps=gt_seg_maps, + num_classes=num_classes, + ignore_index=ignore_index, + metrics=['mDice'], + nan_to_num=nan_to_num, + label_map=label_map, + reduce_zero_label=reduce_zero_label) + return all_acc, acc, dice + + +def eval_metrics(results, + gt_seg_maps, + num_classes, + ignore_index, + metrics=['mIoU'], + nan_to_num=None, + label_map=dict(), + reduce_zero_label=False): + """Calculate evaluation metrics + Args: + results (list[ndarray]): List of prediction segmentation maps. + gt_seg_maps (list[ndarray]): list of ground truth segmentation maps. + num_classes (int): Number of categories. + ignore_index (int): Index that will be ignored in evaluation. + metrics (list[str] | str): Metrics to be evaluated, 'mIoU' and 'mDice'. + nan_to_num (int, optional): If specified, NaN values will be replaced + by the numbers defined by the user. Default: None. + label_map (dict): Mapping old labels to new labels. Default: dict(). + reduce_zero_label (bool): Wether ignore zero label. Default: False. + Returns: + float: Overall accuracy on all images. + ndarray: Per category accuracy, shape (num_classes, ). + ndarray: Per category evalution metrics, shape (num_classes, ). + """ + + if isinstance(metrics, str): + metrics = [metrics] + allowed_metrics = ['mIoU', 'mDice'] + if not set(metrics).issubset(set(allowed_metrics)): + raise KeyError('metrics {} is not supported'.format(metrics)) + total_area_intersect, total_area_union, total_area_pred_label, \ + total_area_label = total_intersect_and_union(results, gt_seg_maps, + num_classes, ignore_index, + label_map, + reduce_zero_label) + all_acc = total_area_intersect.sum() / total_area_label.sum() + acc = total_area_intersect / total_area_label + ret_metrics = [all_acc, acc] + for metric in metrics: + if metric == 'mIoU': + iou = total_area_intersect / total_area_union + ret_metrics.append(iou) + elif metric == 'mDice': + dice = 2 * total_area_intersect / ( + total_area_pred_label + total_area_label) + ret_metrics.append(dice) + if nan_to_num is not None: + ret_metrics = [ + np.nan_to_num(metric, nan=nan_to_num) for metric in ret_metrics + ] + return ret_metrics diff --git a/mmseg/core/seg/__init__.py b/mmseg/core/seg/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..93bc129b685e4a3efca2cc891729981b2865900d --- /dev/null +++ b/mmseg/core/seg/__init__.py @@ -0,0 +1,4 @@ +from .builder import build_pixel_sampler +from .sampler import BasePixelSampler, OHEMPixelSampler + +__all__ = ['build_pixel_sampler', 'BasePixelSampler', 'OHEMPixelSampler'] diff --git a/mmseg/core/seg/builder.py b/mmseg/core/seg/builder.py new file mode 100644 index 0000000000000000000000000000000000000000..f5a117ce7b221f749d9def4b8ed97c07fe90b6e3 --- /dev/null +++ b/mmseg/core/seg/builder.py @@ -0,0 +1,8 @@ +from mmcv.utils import Registry, build_from_cfg + +PIXEL_SAMPLERS = Registry('pixel sampler') + + +def build_pixel_sampler(cfg, **default_args): + """Build pixel sampler for segmentation map.""" + return build_from_cfg(cfg, PIXEL_SAMPLERS, default_args) diff --git a/mmseg/core/seg/sampler/__init__.py b/mmseg/core/seg/sampler/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..332b242c03d1c5e80d4577df442a9a037b1816e1 --- /dev/null +++ b/mmseg/core/seg/sampler/__init__.py @@ -0,0 +1,4 @@ +from .base_pixel_sampler import BasePixelSampler +from .ohem_pixel_sampler import OHEMPixelSampler + +__all__ = ['BasePixelSampler', 'OHEMPixelSampler'] diff --git a/mmseg/core/seg/sampler/base_pixel_sampler.py b/mmseg/core/seg/sampler/base_pixel_sampler.py new file mode 100644 index 0000000000000000000000000000000000000000..db322d199ff809ef1c7962a8c979563386201549 --- /dev/null +++ b/mmseg/core/seg/sampler/base_pixel_sampler.py @@ -0,0 +1,13 @@ +from abc import ABCMeta, abstractmethod + + +class BasePixelSampler(metaclass=ABCMeta): + """Base class of pixel sampler.""" + + def __init__(self, **kwargs): + pass + + @abstractmethod + def sample(self, seg_logit, seg_label): + """Placeholder for sample function.""" + pass diff --git a/mmseg/core/seg/sampler/ohem_pixel_sampler.py b/mmseg/core/seg/sampler/ohem_pixel_sampler.py new file mode 100644 index 0000000000000000000000000000000000000000..88bb10d44026ba9f21756eaea9e550841cd59b9f --- /dev/null +++ b/mmseg/core/seg/sampler/ohem_pixel_sampler.py @@ -0,0 +1,76 @@ +import torch +import torch.nn.functional as F + +from ..builder import PIXEL_SAMPLERS +from .base_pixel_sampler import BasePixelSampler + + +@PIXEL_SAMPLERS.register_module() +class OHEMPixelSampler(BasePixelSampler): + """Online Hard Example Mining Sampler for segmentation. + + Args: + context (nn.Module): The context of sampler, subclass of + :obj:`BaseDecodeHead`. + thresh (float, optional): The threshold for hard example selection. + Below which, are prediction with low confidence. If not + specified, the hard examples will be pixels of top ``min_kept`` + loss. Default: None. + min_kept (int, optional): The minimum number of predictions to keep. + Default: 100000. + """ + + def __init__(self, context, thresh=None, min_kept=100000): + super(OHEMPixelSampler, self).__init__() + self.context = context + assert min_kept > 1 + self.thresh = thresh + self.min_kept = min_kept + + def sample(self, seg_logit, seg_label): + """Sample pixels that have high loss or with low prediction confidence. + + Args: + seg_logit (torch.Tensor): segmentation logits, shape (N, C, H, W) + seg_label (torch.Tensor): segmentation label, shape (N, 1, H, W) + + Returns: + torch.Tensor: segmentation weight, shape (N, H, W) + """ + with torch.no_grad(): + assert seg_logit.shape[2:] == seg_label.shape[2:] + assert seg_label.shape[1] == 1 + seg_label = seg_label.squeeze(1).long() + batch_kept = self.min_kept * seg_label.size(0) + valid_mask = seg_label != self.context.ignore_index + seg_weight = seg_logit.new_zeros(size=seg_label.size()) + valid_seg_weight = seg_weight[valid_mask] + if self.thresh is not None: + seg_prob = F.softmax(seg_logit, dim=1) + + tmp_seg_label = seg_label.clone().unsqueeze(1) + tmp_seg_label[tmp_seg_label == self.context.ignore_index] = 0 + seg_prob = seg_prob.gather(1, tmp_seg_label).squeeze(1) + sort_prob, sort_indices = seg_prob[valid_mask].sort() + + if sort_prob.numel() > 0: + min_threshold = sort_prob[min(batch_kept, + sort_prob.numel() - 1)] + else: + min_threshold = 0.0 + threshold = max(min_threshold, self.thresh) + valid_seg_weight[seg_prob[valid_mask] < threshold] = 1. + else: + losses = self.context.loss_decode( + seg_logit, + seg_label, + weight=None, + ignore_index=self.context.ignore_index, + reduction_override='none') + # faster than topk according to https://github.com/pytorch/pytorch/issues/22812 # noqa + _, sort_indices = losses[valid_mask].sort(descending=True) + valid_seg_weight[sort_indices[:batch_kept]] = 1. + + seg_weight[valid_mask] = valid_seg_weight + + return seg_weight diff --git a/mmseg/core/utils/__init__.py b/mmseg/core/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..f2678b321c295bcceaef945111ac3524be19d6e4 --- /dev/null +++ b/mmseg/core/utils/__init__.py @@ -0,0 +1,3 @@ +from .misc import add_prefix + +__all__ = ['add_prefix'] diff --git a/mmseg/core/utils/misc.py b/mmseg/core/utils/misc.py new file mode 100644 index 0000000000000000000000000000000000000000..eb862a82bd47c8624db3dd5c6fb6ad8a03b62466 --- /dev/null +++ b/mmseg/core/utils/misc.py @@ -0,0 +1,17 @@ +def add_prefix(inputs, prefix): + """Add prefix for dict. + + Args: + inputs (dict): The input dict with str keys. + prefix (str): The prefix to add. + + Returns: + + dict: The dict with keys updated with ``prefix``. + """ + + outputs = dict() + for name, value in inputs.items(): + outputs[f'{prefix}.{name}'] = value + + return outputs diff --git a/mmseg/datasets/__init__.py b/mmseg/datasets/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..4f248dc16b970b2e10cbd7f0352c5d648c83f6f7 --- /dev/null +++ b/mmseg/datasets/__init__.py @@ -0,0 +1,18 @@ +from .ade import ADE20KDataset +from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset +from .chase_db1 import ChaseDB1Dataset +from .cityscapes import CityscapesDataset +from .custom import CustomDataset +from .dataset_wrappers import ConcatDataset, RepeatDataset +from .drive import DRIVEDataset +from .hrf import HRFDataset +from .pascal_context import PascalContextDataset +from .stare import STAREDataset +from .voc import PascalVOCDataset + +__all__ = [ + 'CustomDataset', 'build_dataloader', 'ConcatDataset', 'RepeatDataset', + 'DATASETS', 'build_dataset', 'PIPELINES', 'CityscapesDataset', + 'PascalVOCDataset', 'ADE20KDataset', 'PascalContextDataset', + 'ChaseDB1Dataset', 'DRIVEDataset', 'HRFDataset', 'STAREDataset' +] diff --git a/mmseg/datasets/ade.py b/mmseg/datasets/ade.py new file mode 100644 index 0000000000000000000000000000000000000000..5913e43775ed4920b6934c855eb5a37c54218ebf --- /dev/null +++ b/mmseg/datasets/ade.py @@ -0,0 +1,84 @@ +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class ADE20KDataset(CustomDataset): + """ADE20K dataset. + + In segmentation map annotation for ADE20K, 0 stands for background, which + is not included in 150 categories. ``reduce_zero_label`` is fixed to True. + The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is fixed to + '.png'. + """ + CLASSES = ( + 'wall', 'building', 'sky', 'floor', 'tree', 'ceiling', 'road', 'bed ', + 'windowpane', 'grass', 'cabinet', 'sidewalk', 'person', 'earth', + 'door', 'table', 'mountain', 'plant', 'curtain', 'chair', 'car', + 'water', 'painting', 'sofa', 'shelf', 'house', 'sea', 'mirror', 'rug', + 'field', 'armchair', 'seat', 'fence', 'desk', 'rock', 'wardrobe', + 'lamp', 'bathtub', 'railing', 'cushion', 'base', 'box', 'column', + 'signboard', 'chest of drawers', 'counter', 'sand', 'sink', + 'skyscraper', 'fireplace', 'refrigerator', 'grandstand', 'path', + 'stairs', 'runway', 'case', 'pool table', 'pillow', 'screen door', + 'stairway', 'river', 'bridge', 'bookcase', 'blind', 'coffee table', + 'toilet', 'flower', 'book', 'hill', 'bench', 'countertop', 'stove', + 'palm', 'kitchen island', 'computer', 'swivel chair', 'boat', 'bar', + 'arcade machine', 'hovel', 'bus', 'towel', 'light', 'truck', 'tower', + 'chandelier', 'awning', 'streetlight', 'booth', 'television receiver', + 'airplane', 'dirt track', 'apparel', 'pole', 'land', 'bannister', + 'escalator', 'ottoman', 'bottle', 'buffet', 'poster', 'stage', 'van', + 'ship', 'fountain', 'conveyer belt', 'canopy', 'washer', 'plaything', + 'swimming pool', 'stool', 'barrel', 'basket', 'waterfall', 'tent', + 'bag', 'minibike', 'cradle', 'oven', 'ball', 'food', 'step', 'tank', + 'trade name', 'microwave', 'pot', 'animal', 'bicycle', 'lake', + 'dishwasher', 'screen', 'blanket', 'sculpture', 'hood', 'sconce', + 'vase', 'traffic light', 'tray', 'ashcan', 'fan', 'pier', 'crt screen', + 'plate', 'monitor', 'bulletin board', 'shower', 'radiator', 'glass', + 'clock', 'flag') + + PALETTE = [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255], + [11, 200, 200], [255, 82, 0], [0, 255, 245], [0, 61, 255], + [0, 255, 112], [0, 255, 133], [255, 0, 0], [255, 163, 0], + [255, 102, 0], [194, 255, 0], [0, 143, 255], [51, 255, 0], + [0, 82, 255], [0, 255, 41], [0, 255, 173], [10, 0, 255], + [173, 255, 0], [0, 255, 153], [255, 92, 0], [255, 0, 255], + [255, 0, 245], [255, 0, 102], [255, 173, 0], [255, 0, 20], + [255, 184, 184], [0, 31, 255], [0, 255, 61], [0, 71, 255], + [255, 0, 204], [0, 255, 194], [0, 255, 82], [0, 10, 255], + [0, 112, 255], [51, 0, 255], [0, 194, 255], [0, 122, 255], + [0, 255, 163], [255, 153, 0], [0, 255, 10], [255, 112, 0], + [143, 255, 0], [82, 0, 255], [163, 255, 0], [255, 235, 0], + [8, 184, 170], [133, 0, 255], [0, 255, 92], [184, 0, 255], + [255, 0, 31], [0, 184, 255], [0, 214, 255], [255, 0, 112], + [92, 255, 0], [0, 224, 255], [112, 224, 255], [70, 184, 160], + [163, 0, 255], [153, 0, 255], [71, 255, 0], [255, 0, 163], + [255, 204, 0], [255, 0, 143], [0, 255, 235], [133, 255, 0], + [255, 0, 235], [245, 0, 255], [255, 0, 122], [255, 245, 0], + [10, 190, 212], [214, 255, 0], [0, 204, 255], [20, 0, 255], + [255, 255, 0], [0, 153, 255], [0, 41, 255], [0, 255, 204], + [41, 0, 255], [41, 255, 0], [173, 0, 255], [0, 245, 255], + [71, 0, 255], [122, 0, 255], [0, 255, 184], [0, 92, 255], + [184, 255, 0], [0, 133, 255], [255, 214, 0], [25, 194, 194], + [102, 255, 0], [92, 0, 255]] + + def __init__(self, **kwargs): + super(ADE20KDataset, self).__init__( + img_suffix='.jpg', + seg_map_suffix='.png', + reduce_zero_label=True, + **kwargs) diff --git a/mmseg/datasets/builder.py b/mmseg/datasets/builder.py new file mode 100644 index 0000000000000000000000000000000000000000..f7a9926111cad3c8ab140ab8d289dbc66053517a --- /dev/null +++ b/mmseg/datasets/builder.py @@ -0,0 +1,169 @@ +import copy +import platform +import random +from functools import partial + +import numpy as np +from mmcv.parallel import collate +from mmcv.runner import get_dist_info +from mmcv.utils import Registry, build_from_cfg +from mmcv.utils.parrots_wrapper import DataLoader, PoolDataLoader +from torch.utils.data import DistributedSampler + +if platform.system() != 'Windows': + # https://github.com/pytorch/pytorch/issues/973 + import resource + rlimit = resource.getrlimit(resource.RLIMIT_NOFILE) + hard_limit = rlimit[1] + soft_limit = min(4096, hard_limit) + resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit)) + +DATASETS = Registry('dataset') +PIPELINES = Registry('pipeline') + + +def _concat_dataset(cfg, default_args=None): + """Build :obj:`ConcatDataset by.""" + from .dataset_wrappers import ConcatDataset + img_dir = cfg['img_dir'] + ann_dir = cfg.get('ann_dir', None) + split = cfg.get('split', None) + num_img_dir = len(img_dir) if isinstance(img_dir, (list, tuple)) else 1 + if ann_dir is not None: + num_ann_dir = len(ann_dir) if isinstance(ann_dir, (list, tuple)) else 1 + else: + num_ann_dir = 0 + if split is not None: + num_split = len(split) if isinstance(split, (list, tuple)) else 1 + else: + num_split = 0 + if num_img_dir > 1: + assert num_img_dir == num_ann_dir or num_ann_dir == 0 + assert num_img_dir == num_split or num_split == 0 + else: + assert num_split == num_ann_dir or num_ann_dir <= 1 + num_dset = max(num_split, num_img_dir) + + datasets = [] + for i in range(num_dset): + data_cfg = copy.deepcopy(cfg) + if isinstance(img_dir, (list, tuple)): + data_cfg['img_dir'] = img_dir[i] + if isinstance(ann_dir, (list, tuple)): + data_cfg['ann_dir'] = ann_dir[i] + if isinstance(split, (list, tuple)): + data_cfg['split'] = split[i] + datasets.append(build_dataset(data_cfg, default_args)) + + return ConcatDataset(datasets) + + +def build_dataset(cfg, default_args=None): + """Build datasets.""" + from .dataset_wrappers import ConcatDataset, RepeatDataset + if isinstance(cfg, (list, tuple)): + dataset = ConcatDataset([build_dataset(c, default_args) for c in cfg]) + elif cfg['type'] == 'RepeatDataset': + dataset = RepeatDataset( + build_dataset(cfg['dataset'], default_args), cfg['times']) + elif isinstance(cfg.get('img_dir'), (list, tuple)) or isinstance( + cfg.get('split', None), (list, tuple)): + dataset = _concat_dataset(cfg, default_args) + else: + dataset = build_from_cfg(cfg, DATASETS, default_args) + + return dataset + + +def build_dataloader(dataset, + samples_per_gpu, + workers_per_gpu, + num_gpus=1, + dist=True, + shuffle=True, + seed=None, + drop_last=False, + pin_memory=True, + dataloader_type='PoolDataLoader', + **kwargs): + """Build PyTorch DataLoader. + + In distributed training, each GPU/process has a dataloader. + In non-distributed training, there is only one dataloader for all GPUs. + + Args: + dataset (Dataset): A PyTorch dataset. + samples_per_gpu (int): Number of training samples on each GPU, i.e., + batch size of each GPU. + workers_per_gpu (int): How many subprocesses to use for data loading + for each GPU. + num_gpus (int): Number of GPUs. Only used in non-distributed training. + dist (bool): Distributed training/test or not. Default: True. + shuffle (bool): Whether to shuffle the data at every epoch. + Default: True. + seed (int | None): Seed to be used. Default: None. + drop_last (bool): Whether to drop the last incomplete batch in epoch. + Default: False + pin_memory (bool): Whether to use pin_memory in DataLoader. + Default: True + dataloader_type (str): Type of dataloader. Default: 'PoolDataLoader' + kwargs: any keyword argument to be used to initialize DataLoader + + Returns: + DataLoader: A PyTorch dataloader. + """ + rank, world_size = get_dist_info() + if dist: + sampler = DistributedSampler( + dataset, world_size, rank, shuffle=shuffle) + shuffle = False + batch_size = samples_per_gpu + num_workers = workers_per_gpu + else: + sampler = None + batch_size = num_gpus * samples_per_gpu + num_workers = num_gpus * workers_per_gpu + + init_fn = partial( + worker_init_fn, num_workers=num_workers, rank=rank, + seed=seed) if seed is not None else None + + assert dataloader_type in ( + 'DataLoader', + 'PoolDataLoader'), f'unsupported dataloader {dataloader_type}' + + if dataloader_type == 'PoolDataLoader': + dataloader = PoolDataLoader + elif dataloader_type == 'DataLoader': + dataloader = DataLoader + + data_loader = dataloader( + dataset, + batch_size=batch_size, + sampler=sampler, + num_workers=num_workers, + collate_fn=partial(collate, samples_per_gpu=samples_per_gpu), + pin_memory=pin_memory, + shuffle=shuffle, + worker_init_fn=init_fn, + drop_last=drop_last, + **kwargs) + + return data_loader + + +def worker_init_fn(worker_id, num_workers, rank, seed): + """Worker init func for dataloader. + + The seed of each worker equals to num_worker * rank + worker_id + user_seed + + Args: + worker_id (int): Worker id. + num_workers (int): Number of workers. + rank (int): The rank of current process. + seed (int): The random seed to use. + """ + + worker_seed = num_workers * rank + worker_id + seed + np.random.seed(worker_seed) + random.seed(worker_seed) diff --git a/mmseg/datasets/chase_db1.py b/mmseg/datasets/chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..8bc29bea14704a4407f83474610cbc3bef32c708 --- /dev/null +++ b/mmseg/datasets/chase_db1.py @@ -0,0 +1,27 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class ChaseDB1Dataset(CustomDataset): + """Chase_db1 dataset. + + In segmentation map annotation for Chase_db1, 0 stands for background, + which is included in 2 categories. ``reduce_zero_label`` is fixed to False. + The ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '_1stHO.png'. + """ + + CLASSES = ('background', 'vessel') + + PALETTE = [[120, 120, 120], [6, 230, 230]] + + def __init__(self, **kwargs): + super(ChaseDB1Dataset, self).__init__( + img_suffix='.png', + seg_map_suffix='_1stHO.png', + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) diff --git a/mmseg/datasets/cityscapes.py b/mmseg/datasets/cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fa9958ac1401644420d264c48cf8d807a44d7cf9 --- /dev/null +++ b/mmseg/datasets/cityscapes.py @@ -0,0 +1,217 @@ +import os.path as osp +import tempfile + +import mmcv +import numpy as np +from mmcv.utils import print_log +from PIL import Image + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class CityscapesDataset(CustomDataset): + """Cityscapes dataset. + + The ``img_suffix`` is fixed to '_leftImg8bit.png' and ``seg_map_suffix`` is + fixed to '_gtFine_labelTrainIds.png' for Cityscapes dataset. + """ + + CLASSES = ('road', 'sidewalk', 'building', 'wall', 'fence', 'pole', + 'traffic light', 'traffic sign', 'vegetation', 'terrain', 'sky', + 'person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle') + + PALETTE = [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], + [190, 153, 153], [153, 153, 153], [250, 170, 30], [220, 220, 0], + [107, 142, 35], [152, 251, 152], [70, 130, 180], [220, 20, 60], + [255, 0, 0], [0, 0, 142], [0, 0, 70], [0, 60, 100], + [0, 80, 100], [0, 0, 230], [119, 11, 32]] + + def __init__(self, **kwargs): + super(CityscapesDataset, self).__init__( + img_suffix='_leftImg8bit.png', + seg_map_suffix='_gtFine_labelTrainIds.png', + **kwargs) + + @staticmethod + def _convert_to_label_id(result): + """Convert trainId to id for cityscapes.""" + if isinstance(result, str): + result = np.load(result) + import cityscapesscripts.helpers.labels as CSLabels + result_copy = result.copy() + for trainId, label in CSLabels.trainId2label.items(): + result_copy[result == trainId] = label.id + + return result_copy + + def results2img(self, results, imgfile_prefix, to_label_id): + """Write the segmentation results to images. + + Args: + results (list[list | tuple | ndarray]): Testing results of the + dataset. + imgfile_prefix (str): The filename prefix of the png files. + If the prefix is "somepath/xxx", + the png files will be named "somepath/xxx.png". + to_label_id (bool): whether convert output to label_id for + submission + + Returns: + list[str: str]: result txt files which contains corresponding + semantic segmentation images. + """ + mmcv.mkdir_or_exist(imgfile_prefix) + result_files = [] + prog_bar = mmcv.ProgressBar(len(self)) + for idx in range(len(self)): + result = results[idx] + if to_label_id: + result = self._convert_to_label_id(result) + filename = self.img_infos[idx]['filename'] + basename = osp.splitext(osp.basename(filename))[0] + + png_filename = osp.join(imgfile_prefix, f'{basename}.png') + + output = Image.fromarray(result.astype(np.uint8)).convert('P') + import cityscapesscripts.helpers.labels as CSLabels + palette = np.zeros((len(CSLabels.id2label), 3), dtype=np.uint8) + for label_id, label in CSLabels.id2label.items(): + palette[label_id] = label.color + + output.putpalette(palette) + output.save(png_filename) + result_files.append(png_filename) + prog_bar.update() + + return result_files + + def format_results(self, results, imgfile_prefix=None, to_label_id=True): + """Format the results into dir (standard format for Cityscapes + evaluation). + + Args: + results (list): Testing results of the dataset. + imgfile_prefix (str | None): The prefix of images files. It + includes the file path and the prefix of filename, e.g., + "a/b/prefix". If not specified, a temp file will be created. + Default: None. + to_label_id (bool): whether convert output to label_id for + submission. Default: False + + Returns: + tuple: (result_files, tmp_dir), result_files is a list containing + the image paths, tmp_dir is the temporal directory created + for saving json/png files when img_prefix is not specified. + """ + + assert isinstance(results, list), 'results must be a list' + assert len(results) == len(self), ( + 'The length of results is not equal to the dataset len: ' + f'{len(results)} != {len(self)}') + + if imgfile_prefix is None: + tmp_dir = tempfile.TemporaryDirectory() + imgfile_prefix = tmp_dir.name + else: + tmp_dir = None + result_files = self.results2img(results, imgfile_prefix, to_label_id) + + return result_files, tmp_dir + + def evaluate(self, + results, + metric='mIoU', + logger=None, + imgfile_prefix=None, + efficient_test=False): + """Evaluation in Cityscapes/default protocol. + + Args: + results (list): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. + logger (logging.Logger | None | str): Logger used for printing + related information during evaluation. Default: None. + imgfile_prefix (str | None): The prefix of output image file, + for cityscapes evaluation only. It includes the file path and + the prefix of filename, e.g., "a/b/prefix". + If results are evaluated with cityscapes protocol, it would be + the prefix of output png files. The output files would be + png images under folder "a/b/prefix/xxx.png", where "xxx" is + the image name of cityscapes. If not specified, a temp file + will be created for evaluation. + Default: None. + + Returns: + dict[str, float]: Cityscapes/default metrics. + """ + + eval_results = dict() + metrics = metric.copy() if isinstance(metric, list) else [metric] + if 'cityscapes' in metrics: + eval_results.update( + self._evaluate_cityscapes(results, logger, imgfile_prefix)) + metrics.remove('cityscapes') + if len(metrics) > 0: + eval_results.update( + super(CityscapesDataset, + self).evaluate(results, metrics, logger, efficient_test)) + + return eval_results + + def _evaluate_cityscapes(self, results, logger, imgfile_prefix): + """Evaluation in Cityscapes protocol. + + Args: + results (list): Testing results of the dataset. + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + imgfile_prefix (str | None): The prefix of output image file + + Returns: + dict[str: float]: Cityscapes evaluation results. + """ + try: + import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as CSEval # noqa + except ImportError: + raise ImportError('Please run "pip install cityscapesscripts" to ' + 'install cityscapesscripts first.') + msg = 'Evaluating in Cityscapes style' + if logger is None: + msg = '\n' + msg + print_log(msg, logger=logger) + + result_files, tmp_dir = self.format_results(results, imgfile_prefix) + + if tmp_dir is None: + result_dir = imgfile_prefix + else: + result_dir = tmp_dir.name + + eval_results = dict() + print_log(f'Evaluating results under {result_dir} ...', logger=logger) + + CSEval.args.evalInstLevelScore = True + CSEval.args.predictionPath = osp.abspath(result_dir) + CSEval.args.evalPixelAccuracy = True + CSEval.args.JSONOutput = False + + seg_map_list = [] + pred_list = [] + + # when evaluating with official cityscapesscripts, + # **_gtFine_labelIds.png is used + for seg_map in mmcv.scandir( + self.ann_dir, 'gtFine_labelIds.png', recursive=True): + seg_map_list.append(osp.join(self.ann_dir, seg_map)) + pred_list.append(CSEval.getPrediction(CSEval.args, seg_map)) + + eval_results.update( + CSEval.evaluateImgLists(pred_list, seg_map_list, CSEval.args)) + + if tmp_dir is not None: + tmp_dir.cleanup() + + return eval_results diff --git a/mmseg/datasets/custom.py b/mmseg/datasets/custom.py new file mode 100644 index 0000000000000000000000000000000000000000..c65a3a3e428a3d3ca748e7cf00d186e7e1e26dd3 --- /dev/null +++ b/mmseg/datasets/custom.py @@ -0,0 +1,417 @@ +import os +import os.path as osp +from functools import reduce + +import mmcv +import numpy as np +from mmcv.utils import print_log +from terminaltables import AsciiTable +from torch.utils.data import Dataset + +from mmseg.core import eval_metrics +from mmseg.utils import get_root_logger +from .builder import DATASETS +from .pipelines import Compose + + +@DATASETS.register_module() +class CustomDataset(Dataset): + """Custom dataset for semantic segmentation. An example of file structure + is as followed. + + .. code-block:: none + + ├── data + │ ├── my_dataset + │ │ ├── img_dir + │ │ │ ├── train + │ │ │ │ ├── xxx{img_suffix} + │ │ │ │ ├── yyy{img_suffix} + │ │ │ │ ├── zzz{img_suffix} + │ │ │ ├── val + │ │ ├── ann_dir + │ │ │ ├── train + │ │ │ │ ├── xxx{seg_map_suffix} + │ │ │ │ ├── yyy{seg_map_suffix} + │ │ │ │ ├── zzz{seg_map_suffix} + │ │ │ ├── val + + The img/gt_semantic_seg pair of CustomDataset should be of the same + except suffix. A valid img/gt_semantic_seg filename pair should be like + ``xxx{img_suffix}`` and ``xxx{seg_map_suffix}`` (extension is also included + in the suffix). If split is given, then ``xxx`` is specified in txt file. + Otherwise, all files in ``img_dir/``and ``ann_dir`` will be loaded. + Please refer to ``docs/tutorials/new_dataset.md`` for more details. + + + Args: + pipeline (list[dict]): Processing pipeline + img_dir (str): Path to image directory + img_suffix (str): Suffix of images. Default: '.jpg' + ann_dir (str, optional): Path to annotation directory. Default: None + seg_map_suffix (str): Suffix of segmentation maps. Default: '.png' + split (str, optional): Split txt file. If split is specified, only + file with suffix in the splits will be loaded. Otherwise, all + images in img_dir/ann_dir will be loaded. Default: None + data_root (str, optional): Data root for img_dir/ann_dir. Default: + None. + test_mode (bool): If test_mode=True, gt wouldn't be loaded. + ignore_index (int): The label index to be ignored. Default: 255 + reduce_zero_label (bool): Whether to mark label zero as ignored. + Default: False + classes (str | Sequence[str], optional): Specify classes to load. + If is None, ``cls.CLASSES`` will be used. Default: None. + palette (Sequence[Sequence[int]]] | np.ndarray | None): + The palette of segmentation map. If None is given, and + self.PALETTE is None, random palette will be generated. + Default: None + """ + + ''' + CLASSES = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154) + ''' + CLASSES = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103) + + + PALETTE = [[0, 0, 0], [40, 100, 150], [80, 150, 200], [120, 200, 10], [160, 10, 60], + [200, 60, 110], [0, 110, 160], [40, 160, 210], [80, 210, 20], [120, 20, 70], + [160, 70, 120], [200, 120, 170], [0, 170, 220], [40, 220, 30], [80, 30, 80], + [120, 80, 130], [160, 130, 180], [200, 180, 230], [0, 230, 40], [40, 40, 90], + [80, 90, 140], [120, 140, 190], [160, 190, 0], [200, 0, 50], [0, 50, 100], + [40, 100, 150], [80, 150, 200], [120, 200, 10], [160, 10, 60], [200, 60, 110], + [0, 110, 160], [40, 160, 210], [80, 210, 20], [120, 20, 70], [160, 70, 120], + [200, 120, 170], [0, 170, 220], [40, 220, 30], [80, 30, 80], [120, 80, 130], + [160, 130, 180], [200, 180, 230], [0, 230, 40], [40, 40, 90], [80, 90, 140], + [120, 140, 190], [160, 190, 0], [200, 0, 50], [0, 50, 100], [40, 100, 150], + [80, 150, 200], [120, 200, 10], [160, 10, 60], [200, 60, 110], [0, 110, 160], + [40, 160, 210], [80, 210, 20], [120, 20, 70], [160, 70, 120], [200, 120, 170], + [0, 170, 220], [40, 220, 30], [80, 30, 80], [120, 80, 130], [160, 130, 180], + [200, 180, 230], [0, 230, 40], [40, 40, 90], [80, 90, 140], [120, 140, 190], + [160, 190, 0], [200, 0, 50], [0, 50, 100], [40, 100, 150], [80, 150, 200], + [120, 200, 10], [160, 10, 60], [200, 60, 110], [0, 110, 160], [40, 160, 210], + [80, 210, 20], [120, 20, 70], [160, 70, 120], [200, 120, 170], [0, 170, 220], + [40, 220, 30], [80, 30, 80], [120, 80, 130], [160, 130, 180], [200, 180, 230], + [0, 230, 40], [40, 40, 90], [80, 90, 140], [120, 140, 190], [160, 190, 0], + [200, 0, 50], [0, 50, 100], [40, 100, 150], [80, 150, 200], [120, 200, 10], + [160, 10, 60], [200, 60, 110], [0, 110, 160], [40, 160, 210]] + + def __init__(self, + pipeline, + img_dir, + img_suffix='.jpg', + ann_dir=None, + seg_map_suffix='.png', + split=None, + data_root=None, + test_mode=False, + ignore_index=255, + reduce_zero_label=False, + classes=None, + palette=None): + self.pipeline = Compose(pipeline) + self.img_dir = img_dir + self.img_suffix = img_suffix + self.ann_dir = ann_dir + self.seg_map_suffix = seg_map_suffix + self.split = split + self.data_root = data_root + self.test_mode = test_mode + self.ignore_index = ignore_index + self.reduce_zero_label = reduce_zero_label + self.label_map = None + self.CLASSES, self.PALETTE = self.get_classes_and_palette( + classes, palette) + + # join paths if data_root is specified + if self.data_root is not None: + if not osp.isabs(self.img_dir): + self.img_dir = osp.join(self.data_root, self.img_dir) + if not (self.ann_dir is None or osp.isabs(self.ann_dir)): + self.ann_dir = osp.join(self.data_root, self.ann_dir) + if not (self.split is None or osp.isabs(self.split)): + self.split = osp.join(self.data_root, self.split) + + # load annotations + self.img_infos = self.load_annotations(self.img_dir, self.img_suffix, + self.ann_dir, + self.seg_map_suffix, self.split) + + def __len__(self): + """Total number of samples of data.""" + return len(self.img_infos) + + def load_annotations(self, img_dir, img_suffix, ann_dir, seg_map_suffix, + split): + """Load annotation from directory. + + Args: + img_dir (str): Path to image directory + img_suffix (str): Suffix of images. + ann_dir (str|None): Path to annotation directory. + seg_map_suffix (str|None): Suffix of segmentation maps. + split (str|None): Split txt file. If split is specified, only file + with suffix in the splits will be loaded. Otherwise, all images + in img_dir/ann_dir will be loaded. Default: None + + Returns: + list[dict]: All image info of dataset. + """ + + img_infos = [] + if split is not None: + with open(split) as f: + for line in f: + img_name = line.strip() + img_info = dict(filename=img_name + img_suffix) + if ann_dir is not None: + seg_map = img_name + seg_map_suffix + img_info['ann'] = dict(seg_map=seg_map) + img_infos.append(img_info) + else: + for img in mmcv.scandir(img_dir, img_suffix, recursive=True): + img_info = dict(filename=img) + if ann_dir is not None: + seg_map = img.replace(img_suffix, seg_map_suffix) + img_info['ann'] = dict(seg_map=seg_map) + img_infos.append(img_info) + + print_log(f'Loaded {len(img_infos)} images', logger=get_root_logger()) + return img_infos + + def get_ann_info(self, idx): + """Get annotation by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + + return self.img_infos[idx]['ann'] + + def pre_pipeline(self, results): + """Prepare results dict for pipeline.""" + results['seg_fields'] = [] + results['img_prefix'] = self.img_dir + results['seg_prefix'] = self.ann_dir + if self.custom_classes: + results['label_map'] = self.label_map + + def __getitem__(self, idx): + """Get training/test data after pipeline. + + Args: + idx (int): Index of data. + + Returns: + dict: Training/test data (with annotation if `test_mode` is set + False). + """ + + if self.test_mode: + return self.prepare_test_img(idx) + else: + return self.prepare_train_img(idx) + + def prepare_train_img(self, idx): + """Get training data and annotations after pipeline. + + Args: + idx (int): Index of data. + + Returns: + dict: Training data and annotation after pipeline with new keys + introduced by pipeline. + """ + + img_info = self.img_infos[idx] + ann_info = self.get_ann_info(idx) + results = dict(img_info=img_info, ann_info=ann_info) + self.pre_pipeline(results) + return self.pipeline(results) + + def prepare_test_img(self, idx): + """Get testing data after pipeline. + + Args: + idx (int): Index of data. + + Returns: + dict: Testing data after pipeline with new keys intorduced by + piepline. + """ + + img_info = self.img_infos[idx] + results = dict(img_info=img_info) + self.pre_pipeline(results) + return self.pipeline(results) + + def format_results(self, results, **kwargs): + """Place holder to format result to dataset specific output.""" + pass + + def get_gt_seg_maps(self, efficient_test=False): + """Get ground truth segmentation maps for evaluation.""" + gt_seg_maps = [] + for img_info in self.img_infos: + seg_map = osp.join(self.ann_dir, img_info['ann']['seg_map']) + if efficient_test: + gt_seg_map = seg_map + else: + gt_seg_map = mmcv.imread( + seg_map, flag='unchanged', backend='pillow') + gt_seg_maps.append(gt_seg_map) + return gt_seg_maps + + def get_classes_and_palette(self, classes=None, palette=None): + """Get class names of current dataset. + + Args: + classes (Sequence[str] | str | None): If classes is None, use + default CLASSES defined by builtin dataset. If classes is a + string, take it as a file name. The file contains the name of + classes where each line contains one class name. If classes is + a tuple or list, override the CLASSES defined by the dataset. + palette (Sequence[Sequence[int]]] | np.ndarray | None): + The palette of segmentation map. If None is given, random + palette will be generated. Default: None + """ + if classes is None: + self.custom_classes = False + return self.CLASSES, self.PALETTE + + self.custom_classes = True + if isinstance(classes, str): + # take it as a file path + class_names = mmcv.list_from_file(classes) + elif isinstance(classes, (tuple, list)): + class_names = classes + else: + raise ValueError(f'Unsupported type {type(classes)} of classes.') + + if self.CLASSES: + if not set(classes).issubset(self.CLASSES): + raise ValueError('classes is not a subset of CLASSES.') + + # dictionary, its keys are the old label ids and its values + # are the new label ids. + # used for changing pixel labels in load_annotations. + self.label_map = {} + for i, c in enumerate(self.CLASSES): + if c not in class_names: + self.label_map[i] = -1 + else: + self.label_map[i] = classes.index(c) + + palette = self.get_palette_for_custom_classes(class_names, palette) + + return class_names, palette + + def get_palette_for_custom_classes(self, class_names, palette=None): + + if self.label_map is not None: + # return subset of palette + palette = [] + for old_id, new_id in sorted( + self.label_map.items(), key=lambda x: x[1]): + if new_id != -1: + palette.append(self.PALETTE[old_id]) + palette = type(self.PALETTE)(palette) + + elif palette is None: + if self.PALETTE is None: + palette = np.random.randint(0, 255, size=(len(class_names), 3)) + else: + palette = self.PALETTE + + return palette + + def evaluate(self, + results, + metric='mIoU', + logger=None, + efficient_test=False, + **kwargs): + """Evaluate the dataset. + + Args: + results (list): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. 'mIoU' and + 'mDice' are supported. + logger (logging.Logger | None | str): Logger used for printing + related information during evaluation. Default: None. + + Returns: + dict[str, float]: Default metrics. + """ + + if isinstance(metric, str): + metric = [metric] + allowed_metrics = ['mIoU', 'mDice'] + if not set(metric).issubset(set(allowed_metrics)): + raise KeyError('metric {} is not supported'.format(metric)) + eval_results = {} + gt_seg_maps = self.get_gt_seg_maps(efficient_test) + if self.CLASSES is None: + num_classes = len( + reduce(np.union1d, [np.unique(_) for _ in gt_seg_maps])) + else: + num_classes = len(self.CLASSES) + ret_metrics = eval_metrics( + results, + gt_seg_maps, + num_classes, + self.ignore_index, + metric, + label_map=self.label_map, + reduce_zero_label=self.reduce_zero_label) + class_table_data = [['Class'] + [m[1:] for m in metric] + ['Acc']] + if self.CLASSES is None: + class_names = tuple(range(num_classes)) + else: + class_names = self.CLASSES + ret_metrics_round = [ + np.round(ret_metric * 100, 2) for ret_metric in ret_metrics + ] + for i in range(num_classes): + class_table_data.append([class_names[i]] + + [m[i] for m in ret_metrics_round[2:]] + + [ret_metrics_round[1][i]]) + summary_table_data = [['Scope'] + + ['m' + head + for head in class_table_data[0][1:]] + ['aAcc']] + ret_metrics_mean = [ + np.round(np.nanmean(ret_metric) * 100, 2) + for ret_metric in ret_metrics + ] + summary_table_data.append(['global'] + ret_metrics_mean[2:] + + [ret_metrics_mean[1]] + + [ret_metrics_mean[0]]) + print_log('per class results:', logger) + table = AsciiTable(class_table_data) + print_log('\n' + table.table, logger=logger) + print_log('Summary:', logger) + table = AsciiTable(summary_table_data) + print_log('\n' + table.table, logger=logger) + + for i in range(1, len(summary_table_data[0])): + eval_results[summary_table_data[0] + [i]] = summary_table_data[1][i] / 100.0 + if mmcv.is_list_of(results, str): + for file_name in results: + os.remove(file_name) + return eval_results diff --git a/mmseg/datasets/dataset_wrappers.py b/mmseg/datasets/dataset_wrappers.py new file mode 100644 index 0000000000000000000000000000000000000000..d6a5e957ec3b44465432617cf6e8f0b86a8a5efa --- /dev/null +++ b/mmseg/datasets/dataset_wrappers.py @@ -0,0 +1,50 @@ +from torch.utils.data.dataset import ConcatDataset as _ConcatDataset + +from .builder import DATASETS + + +@DATASETS.register_module() +class ConcatDataset(_ConcatDataset): + """A wrapper of concatenated dataset. + + Same as :obj:`torch.utils.data.dataset.ConcatDataset`, but + concat the group flag for image aspect ratio. + + Args: + datasets (list[:obj:`Dataset`]): A list of datasets. + """ + + def __init__(self, datasets): + super(ConcatDataset, self).__init__(datasets) + self.CLASSES = datasets[0].CLASSES + self.PALETTE = datasets[0].PALETTE + + +@DATASETS.register_module() +class RepeatDataset(object): + """A wrapper of repeated dataset. + + The length of repeated dataset will be `times` larger than the original + dataset. This is useful when the data loading time is long but the dataset + is small. Using RepeatDataset can reduce the data loading time between + epochs. + + Args: + dataset (:obj:`Dataset`): The dataset to be repeated. + times (int): Repeat times. + """ + + def __init__(self, dataset, times): + self.dataset = dataset + self.times = times + self.CLASSES = dataset.CLASSES + self.PALETTE = dataset.PALETTE + self._ori_len = len(self.dataset) + + def __getitem__(self, idx): + """Get item from original dataset.""" + return self.dataset[idx % self._ori_len] + + def __len__(self): + """The length is multiplied by ``times``""" + return self.times * self._ori_len diff --git a/mmseg/datasets/drive.py b/mmseg/datasets/drive.py new file mode 100644 index 0000000000000000000000000000000000000000..3cbfda8ae74bdf26c5aef197ff2866a7c7ad0cfd --- /dev/null +++ b/mmseg/datasets/drive.py @@ -0,0 +1,27 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class DRIVEDataset(CustomDataset): + """DRIVE dataset. + + In segmentation map annotation for DRIVE, 0 stands for background, which is + included in 2 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '_manual1.png'. + """ + + CLASSES = ('background', 'vessel') + + PALETTE = [[120, 120, 120], [6, 230, 230]] + + def __init__(self, **kwargs): + super(DRIVEDataset, self).__init__( + img_suffix='.png', + seg_map_suffix='_manual1.png', + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) diff --git a/mmseg/datasets/hrf.py b/mmseg/datasets/hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..923203b51377f9344277fc561803d7a78bd2c684 --- /dev/null +++ b/mmseg/datasets/hrf.py @@ -0,0 +1,27 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class HRFDataset(CustomDataset): + """HRF dataset. + + In segmentation map annotation for HRF, 0 stands for background, which is + included in 2 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '.png'. + """ + + CLASSES = ('background', 'vessel') + + PALETTE = [[120, 120, 120], [6, 230, 230]] + + def __init__(self, **kwargs): + super(HRFDataset, self).__init__( + img_suffix='.png', + seg_map_suffix='.png', + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) diff --git a/mmseg/datasets/pascal_context.py b/mmseg/datasets/pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..ab42877f1e0c60099303a05021ea288f9c1c6e15 --- /dev/null +++ b/mmseg/datasets/pascal_context.py @@ -0,0 +1,54 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class PascalContextDataset(CustomDataset): + """PascalContext dataset. + + In segmentation map annotation for PascalContext, 0 stands for background, + which is included in 60 categories. ``reduce_zero_label`` is fixed to + False. The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is + fixed to '.png'. + + Args: + split (str): Split txt file for PascalContext. + """ + + CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', + 'bus', 'car', 'cat', 'chair', 'cow', 'table', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor', 'bag', 'bed', 'bench', 'book', 'building', + 'cabinet', 'ceiling', 'cloth', 'computer', 'cup', 'door', + 'fence', 'floor', 'flower', 'food', 'grass', 'ground', + 'keyboard', 'light', 'mountain', 'mouse', 'curtain', 'platform', + 'sign', 'plate', 'road', 'rock', 'shelves', 'sidewalk', 'sky', + 'snow', 'bedclothes', 'track', 'tree', 'truck', 'wall', 'water', + 'window', 'wood') + + PALETTE = [[120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], + [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], + [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], + [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], + [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], + [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], + [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], + [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], + [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], + [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], + [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], + [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], + [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], + [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], + [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255]] + + def __init__(self, split, **kwargs): + super(PascalContextDataset, self).__init__( + img_suffix='.jpg', + seg_map_suffix='.png', + split=split, + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) and self.split is not None diff --git a/mmseg/datasets/pipelines/__init__.py b/mmseg/datasets/pipelines/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..8b9046b07bb4ddea7a707a392b42e72db7c9df67 --- /dev/null +++ b/mmseg/datasets/pipelines/__init__.py @@ -0,0 +1,16 @@ +from .compose import Compose +from .formating import (Collect, ImageToTensor, ToDataContainer, ToTensor, + Transpose, to_tensor) +from .loading import LoadAnnotations, LoadImageFromFile +from .test_time_aug import MultiScaleFlipAug +from .transforms import (CLAHE, AdjustGamma, Normalize, Pad, + PhotoMetricDistortion, RandomCrop, RandomFlip, + RandomRotate, Rerange, Resize, RGB2Gray, SegRescale) + +__all__ = [ + 'Compose', 'to_tensor', 'ToTensor', 'ImageToTensor', 'ToDataContainer', + 'Transpose', 'Collect', 'LoadAnnotations', 'LoadImageFromFile', + 'MultiScaleFlipAug', 'Resize', 'RandomFlip', 'Pad', 'RandomCrop', + 'Normalize', 'SegRescale', 'PhotoMetricDistortion', 'RandomRotate', + 'AdjustGamma', 'CLAHE', 'Rerange', 'RGB2Gray' +] diff --git a/mmseg/datasets/pipelines/compose.py b/mmseg/datasets/pipelines/compose.py new file mode 100644 index 0000000000000000000000000000000000000000..ca48f1c935755c486edc2744e1713e2b5ba3cdc8 --- /dev/null +++ b/mmseg/datasets/pipelines/compose.py @@ -0,0 +1,51 @@ +import collections + +from mmcv.utils import build_from_cfg + +from ..builder import PIPELINES + + +@PIPELINES.register_module() +class Compose(object): + """Compose multiple transforms sequentially. + + Args: + transforms (Sequence[dict | callable]): Sequence of transform object or + config dict to be composed. + """ + + def __init__(self, transforms): + assert isinstance(transforms, collections.abc.Sequence) + self.transforms = [] + for transform in transforms: + if isinstance(transform, dict): + transform = build_from_cfg(transform, PIPELINES) + self.transforms.append(transform) + elif callable(transform): + self.transforms.append(transform) + else: + raise TypeError('transform must be callable or a dict') + + def __call__(self, data): + """Call function to apply transforms sequentially. + + Args: + data (dict): A result dict contains the data to transform. + + Returns: + dict: Transformed data. + """ + + for t in self.transforms: + data = t(data) + if data is None: + return None + return data + + def __repr__(self): + format_string = self.__class__.__name__ + '(' + for t in self.transforms: + format_string += '\n' + format_string += f' {t}' + format_string += '\n)' + return format_string diff --git a/mmseg/datasets/pipelines/formating.py b/mmseg/datasets/pipelines/formating.py new file mode 100644 index 0000000000000000000000000000000000000000..34061c1dd160d4b00aac8dbdc82dccf5c3883ce8 --- /dev/null +++ b/mmseg/datasets/pipelines/formating.py @@ -0,0 +1,288 @@ +from collections.abc import Sequence + +import mmcv +import numpy as np +import torch +from mmcv.parallel import DataContainer as DC + +from ..builder import PIPELINES + + +def to_tensor(data): + """Convert objects of various python types to :obj:`torch.Tensor`. + + Supported types are: :class:`numpy.ndarray`, :class:`torch.Tensor`, + :class:`Sequence`, :class:`int` and :class:`float`. + + Args: + data (torch.Tensor | numpy.ndarray | Sequence | int | float): Data to + be converted. + """ + + if isinstance(data, torch.Tensor): + return data + elif isinstance(data, np.ndarray): + return torch.from_numpy(data) + elif isinstance(data, Sequence) and not mmcv.is_str(data): + return torch.tensor(data) + elif isinstance(data, int): + return torch.LongTensor([data]) + elif isinstance(data, float): + return torch.FloatTensor([data]) + else: + raise TypeError(f'type {type(data)} cannot be converted to tensor.') + + +@PIPELINES.register_module() +class ToTensor(object): + """Convert some results to :obj:`torch.Tensor` by given keys. + + Args: + keys (Sequence[str]): Keys that need to be converted to Tensor. + """ + + def __init__(self, keys): + self.keys = keys + + def __call__(self, results): + """Call function to convert data in results to :obj:`torch.Tensor`. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + dict: The result dict contains the data converted + to :obj:`torch.Tensor`. + """ + + for key in self.keys: + results[key] = to_tensor(results[key]) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(keys={self.keys})' + + +@PIPELINES.register_module() +class ImageToTensor(object): + """Convert image to :obj:`torch.Tensor` by given keys. + + The dimension order of input image is (H, W, C). The pipeline will convert + it to (C, H, W). If only 2 dimension (H, W) is given, the output would be + (1, H, W). + + Args: + keys (Sequence[str]): Key of images to be converted to Tensor. + """ + + def __init__(self, keys): + self.keys = keys + + def __call__(self, results): + """Call function to convert image in results to :obj:`torch.Tensor` and + transpose the channel order. + + Args: + results (dict): Result dict contains the image data to convert. + + Returns: + dict: The result dict contains the image converted + to :obj:`torch.Tensor` and transposed to (C, H, W) order. + """ + + for key in self.keys: + img = results[key] + if len(img.shape) < 3: + img = np.expand_dims(img, -1) + results[key] = to_tensor(img.transpose(2, 0, 1)) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(keys={self.keys})' + + +@PIPELINES.register_module() +class Transpose(object): + """Transpose some results by given keys. + + Args: + keys (Sequence[str]): Keys of results to be transposed. + order (Sequence[int]): Order of transpose. + """ + + def __init__(self, keys, order): + self.keys = keys + self.order = order + + def __call__(self, results): + """Call function to convert image in results to :obj:`torch.Tensor` and + transpose the channel order. + + Args: + results (dict): Result dict contains the image data to convert. + + Returns: + dict: The result dict contains the image converted + to :obj:`torch.Tensor` and transposed to (C, H, W) order. + """ + + for key in self.keys: + results[key] = results[key].transpose(self.order) + return results + + def __repr__(self): + return self.__class__.__name__ + \ + f'(keys={self.keys}, order={self.order})' + + +@PIPELINES.register_module() +class ToDataContainer(object): + """Convert results to :obj:`mmcv.DataContainer` by given fields. + + Args: + fields (Sequence[dict]): Each field is a dict like + ``dict(key='xxx', **kwargs)``. The ``key`` in result will + be converted to :obj:`mmcv.DataContainer` with ``**kwargs``. + Default: ``(dict(key='img', stack=True), + dict(key='gt_semantic_seg'))``. + """ + + def __init__(self, + fields=(dict(key='img', + stack=True), dict(key='gt_semantic_seg'))): + self.fields = fields + + def __call__(self, results): + """Call function to convert data in results to + :obj:`mmcv.DataContainer`. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + dict: The result dict contains the data converted to + :obj:`mmcv.DataContainer`. + """ + + for field in self.fields: + field = field.copy() + key = field.pop('key') + results[key] = DC(results[key], **field) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(fields={self.fields})' + + +@PIPELINES.register_module() +class DefaultFormatBundle(object): + """Default formatting bundle. + + It simplifies the pipeline of formatting common fields, including "img" + and "gt_semantic_seg". These fields are formatted as follows. + + - img: (1)transpose, (2)to tensor, (3)to DataContainer (stack=True) + - gt_semantic_seg: (1)unsqueeze dim-0 (2)to tensor, + (3)to DataContainer (stack=True) + """ + + def __call__(self, results): + """Call function to transform and format common fields in results. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + dict: The result dict contains the data that is formatted with + default bundle. + """ + + if 'img' in results: + img = results['img'] + if len(img.shape) < 3: + img = np.expand_dims(img, -1) + img = np.ascontiguousarray(img.transpose(2, 0, 1)) + results['img'] = DC(to_tensor(img), stack=True) + if 'gt_semantic_seg' in results: + # convert to long + results['gt_semantic_seg'] = DC( + to_tensor(results['gt_semantic_seg'][None, + ...].astype(np.int64)), + stack=True) + return results + + def __repr__(self): + return self.__class__.__name__ + + +@PIPELINES.register_module() +class Collect(object): + """Collect data from the loader relevant to the specific task. + + This is usually the last stage of the data loader pipeline. Typically keys + is set to some subset of "img", "gt_semantic_seg". + + The "img_meta" item is always populated. The contents of the "img_meta" + dictionary depends on "meta_keys". By default this includes: + + - "img_shape": shape of the image input to the network as a tuple + (h, w, c). Note that images may be zero padded on the bottom/right + if the batch tensor is larger than this shape. + + - "scale_factor": a float indicating the preprocessing scale + + - "flip": a boolean indicating if image flip transform was used + + - "filename": path to the image file + + - "ori_shape": original shape of the image as a tuple (h, w, c) + + - "pad_shape": image shape after padding + + - "img_norm_cfg": a dict of normalization information: + - mean - per channel mean subtraction + - std - per channel std divisor + - to_rgb - bool indicating if bgr was converted to rgb + + Args: + keys (Sequence[str]): Keys of results to be collected in ``data``. + meta_keys (Sequence[str], optional): Meta keys to be converted to + ``mmcv.DataContainer`` and collected in ``data[img_metas]``. + Default: ``('filename', 'ori_filename', 'ori_shape', 'img_shape', + 'pad_shape', 'scale_factor', 'flip', 'flip_direction', + 'img_norm_cfg')`` + """ + + def __init__(self, + keys, + meta_keys=('filename', 'ori_filename', 'ori_shape', + 'img_shape', 'pad_shape', 'scale_factor', 'flip', + 'flip_direction', 'img_norm_cfg')): + self.keys = keys + self.meta_keys = meta_keys + + def __call__(self, results): + """Call function to collect keys in results. The keys in ``meta_keys`` + will be converted to :obj:mmcv.DataContainer. + + Args: + results (dict): Result dict contains the data to collect. + + Returns: + dict: The result dict contains the following keys + - keys in``self.keys`` + - ``img_metas`` + """ + + data = {} + img_meta = {} + for key in self.meta_keys: + img_meta[key] = results[key] + data['img_metas'] = DC(img_meta, cpu_only=True) + for key in self.keys: + data[key] = results[key] + return data + + def __repr__(self): + return self.__class__.__name__ + \ + f'(keys={self.keys}, meta_keys={self.meta_keys})' diff --git a/mmseg/datasets/pipelines/loading.py b/mmseg/datasets/pipelines/loading.py new file mode 100644 index 0000000000000000000000000000000000000000..fdfc496ba96828a435febbef958fdae499d034f7 --- /dev/null +++ b/mmseg/datasets/pipelines/loading.py @@ -0,0 +1,153 @@ +import os.path as osp + +import mmcv +import numpy as np + +from ..builder import PIPELINES + + +@PIPELINES.register_module() +class LoadImageFromFile(object): + """Load an image from file. + + Required keys are "img_prefix" and "img_info" (a dict that must contain the + key "filename"). Added or updated keys are "filename", "img", "img_shape", + "ori_shape" (same as `img_shape`), "pad_shape" (same as `img_shape`), + "scale_factor" (1.0) and "img_norm_cfg" (means=0 and stds=1). + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is an uint8 array. + Defaults to False. + color_type (str): The flag argument for :func:`mmcv.imfrombytes`. + Defaults to 'color'. + file_client_args (dict): Arguments to instantiate a FileClient. + See :class:`mmcv.fileio.FileClient` for details. + Defaults to ``dict(backend='disk')``. + imdecode_backend (str): Backend for :func:`mmcv.imdecode`. Default: + 'cv2' + """ + + def __init__(self, + to_float32=False, + color_type='color', + file_client_args=dict(backend='disk'), + imdecode_backend='cv2'): + self.to_float32 = to_float32 + self.color_type = color_type + self.file_client_args = file_client_args.copy() + self.file_client = None + self.imdecode_backend = imdecode_backend + + def __call__(self, results): + """Call functions to load image and get image meta information. + + Args: + results (dict): Result dict from :obj:`mmseg.CustomDataset`. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + if self.file_client is None: + self.file_client = mmcv.FileClient(**self.file_client_args) + + if results.get('img_prefix') is not None: + filename = osp.join(results['img_prefix'], + results['img_info']['filename']) + else: + filename = results['img_info']['filename'] + img_bytes = self.file_client.get(filename) + img = mmcv.imfrombytes( + img_bytes, flag=self.color_type, backend=self.imdecode_backend) + if self.to_float32: + img = img.astype(np.float32) + + results['filename'] = filename + results['ori_filename'] = results['img_info']['filename'] + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + num_channels = 1 if len(img.shape) < 3 else img.shape[2] + results['img_norm_cfg'] = dict( + mean=np.zeros(num_channels, dtype=np.float32), + std=np.ones(num_channels, dtype=np.float32), + to_rgb=False) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(to_float32={self.to_float32},' + repr_str += f"color_type='{self.color_type}'," + repr_str += f"imdecode_backend='{self.imdecode_backend}')" + return repr_str + + +@PIPELINES.register_module() +class LoadAnnotations(object): + """Load annotations for semantic segmentation. + + Args: + reduce_zero_label (bool): Whether reduce all label value by 1. + Usually used for datasets where 0 is background label. + Default: False. + file_client_args (dict): Arguments to instantiate a FileClient. + See :class:`mmcv.fileio.FileClient` for details. + Defaults to ``dict(backend='disk')``. + imdecode_backend (str): Backend for :func:`mmcv.imdecode`. Default: + 'pillow' + """ + + def __init__(self, + reduce_zero_label=False, + file_client_args=dict(backend='disk'), + imdecode_backend='pillow'): + self.reduce_zero_label = reduce_zero_label + self.file_client_args = file_client_args.copy() + self.file_client = None + self.imdecode_backend = imdecode_backend + + def __call__(self, results): + """Call function to load multiple types annotations. + + Args: + results (dict): Result dict from :obj:`mmseg.CustomDataset`. + + Returns: + dict: The dict contains loaded semantic segmentation annotations. + """ + + if self.file_client is None: + self.file_client = mmcv.FileClient(**self.file_client_args) + + if results.get('seg_prefix', None) is not None: + filename = osp.join(results['seg_prefix'], + results['ann_info']['seg_map']) + else: + filename = results['ann_info']['seg_map'] + img_bytes = self.file_client.get(filename) + gt_semantic_seg = mmcv.imfrombytes( + img_bytes, flag='unchanged', + backend=self.imdecode_backend).squeeze().astype(np.uint8) + # modify if custom classes + if results.get('label_map', None) is not None: + for old_id, new_id in results['label_map'].items(): + gt_semantic_seg[gt_semantic_seg == old_id] = new_id + # reduce zero_label + if self.reduce_zero_label: + # avoid using underflow conversion + gt_semantic_seg[gt_semantic_seg == 0] = 255 + gt_semantic_seg = gt_semantic_seg - 1 + gt_semantic_seg[gt_semantic_seg == 254] = 255 + results['gt_semantic_seg'] = gt_semantic_seg + results['seg_fields'].append('gt_semantic_seg') + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(reduce_zero_label={self.reduce_zero_label},' + repr_str += f"imdecode_backend='{self.imdecode_backend}')" + return repr_str diff --git a/mmseg/datasets/pipelines/test_time_aug.py b/mmseg/datasets/pipelines/test_time_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..473a12bc86b57e564c415ff8bdb1e431425370db --- /dev/null +++ b/mmseg/datasets/pipelines/test_time_aug.py @@ -0,0 +1,133 @@ +import warnings + +import mmcv + +from ..builder import PIPELINES +from .compose import Compose + + +@PIPELINES.register_module() +class MultiScaleFlipAug(object): + """Test-time augmentation with multiple scales and flipping. + + An example configuration is as followed: + + .. code-block:: + + img_scale=(2048, 1024), + img_ratios=[0.5, 1.0], + flip=True, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ] + + After MultiScaleFLipAug with above configuration, the results are wrapped + into lists of the same length as followed: + + .. code-block:: + + dict( + img=[...], + img_shape=[...], + scale=[(1024, 512), (1024, 512), (2048, 1024), (2048, 1024)] + flip=[False, True, False, True] + ... + ) + + Args: + transforms (list[dict]): Transforms to apply in each augmentation. + img_scale (None | tuple | list[tuple]): Images scales for resizing. + img_ratios (float | list[float]): Image ratios for resizing + flip (bool): Whether apply flip augmentation. Default: False. + flip_direction (str | list[str]): Flip augmentation directions, + options are "horizontal" and "vertical". If flip_direction is list, + multiple flip augmentations will be applied. + It has no effect when flip == False. Default: "horizontal". + """ + + def __init__(self, + transforms, + img_scale, + img_ratios=None, + flip=False, + flip_direction='horizontal'): + self.transforms = Compose(transforms) + if img_ratios is not None: + img_ratios = img_ratios if isinstance(img_ratios, + list) else [img_ratios] + assert mmcv.is_list_of(img_ratios, float) + if img_scale is None: + # mode 1: given img_scale=None and a range of image ratio + self.img_scale = None + assert mmcv.is_list_of(img_ratios, float) + elif isinstance(img_scale, tuple) and mmcv.is_list_of( + img_ratios, float): + assert len(img_scale) == 2 + # mode 2: given a scale and a range of image ratio + self.img_scale = [(int(img_scale[0] * ratio), + int(img_scale[1] * ratio)) + for ratio in img_ratios] + else: + # mode 3: given multiple scales + self.img_scale = img_scale if isinstance(img_scale, + list) else [img_scale] + assert mmcv.is_list_of(self.img_scale, tuple) or self.img_scale is None + self.flip = flip + self.img_ratios = img_ratios + self.flip_direction = flip_direction if isinstance( + flip_direction, list) else [flip_direction] + assert mmcv.is_list_of(self.flip_direction, str) + if not self.flip and self.flip_direction != ['horizontal']: + warnings.warn( + 'flip_direction has no effect when flip is set to False') + if (self.flip + and not any([t['type'] == 'RandomFlip' for t in transforms])): + warnings.warn( + 'flip has no effect when RandomFlip is not in transforms') + + def __call__(self, results): + """Call function to apply test time augment transforms on results. + + Args: + results (dict): Result dict contains the data to transform. + + Returns: + dict[str: list]: The augmented data, where each value is wrapped + into a list. + """ + + aug_data = [] + if self.img_scale is None and mmcv.is_list_of(self.img_ratios, float): + h, w = results['img'].shape[:2] + img_scale = [(int(w * ratio), int(h * ratio)) + for ratio in self.img_ratios] + else: + img_scale = self.img_scale + flip_aug = [False, True] if self.flip else [False] + for scale in img_scale: + for flip in flip_aug: + for direction in self.flip_direction: + _results = results.copy() + _results['scale'] = scale + _results['flip'] = flip + _results['flip_direction'] = direction + data = self.transforms(_results) + aug_data.append(data) + # list of dict to dict of list + aug_data_dict = {key: [] for key in aug_data[0]} + for data in aug_data: + for key, val in data.items(): + aug_data_dict[key].append(val) + return aug_data_dict + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(transforms={self.transforms}, ' + repr_str += f'img_scale={self.img_scale}, flip={self.flip})' + repr_str += f'flip_direction={self.flip_direction}' + return repr_str diff --git a/mmseg/datasets/pipelines/transforms.py b/mmseg/datasets/pipelines/transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..e168280adcb47724263ae9a164953b057e470724 --- /dev/null +++ b/mmseg/datasets/pipelines/transforms.py @@ -0,0 +1,890 @@ +import mmcv +import numpy as np +from mmcv.utils import deprecated_api_warning, is_tuple_of +from numpy import random + +from ..builder import PIPELINES + + +@PIPELINES.register_module() +class Resize(object): + """Resize images & seg. + + This transform resizes the input image to some scale. If the input dict + contains the key "scale", then the scale in the input dict is used, + otherwise the specified scale in the init method is used. + + ``img_scale`` can be Nong, a tuple (single-scale) or a list of tuple + (multi-scale). There are 4 multiscale modes: + + - ``ratio_range is not None``: + 1. When img_scale is None, img_scale is the shape of image in results + (img_scale = results['img'].shape[:2]) and the image is resized based + on the original size. (mode 1) + 2. When img_scale is a tuple (single-scale), randomly sample a ratio from + the ratio range and multiply it with the image scale. (mode 2) + + - ``ratio_range is None and multiscale_mode == "range"``: randomly sample a + scale from the a range. (mode 3) + + - ``ratio_range is None and multiscale_mode == "value"``: randomly sample a + scale from multiple scales. (mode 4) + + Args: + img_scale (tuple or list[tuple]): Images scales for resizing. + multiscale_mode (str): Either "range" or "value". + ratio_range (tuple[float]): (min_ratio, max_ratio) + keep_ratio (bool): Whether to keep the aspect ratio when resizing the + image. + """ + + def __init__(self, + img_scale=None, + multiscale_mode='range', + ratio_range=None, + keep_ratio=True): + if img_scale is None: + self.img_scale = None + else: + if isinstance(img_scale, list): + self.img_scale = img_scale + else: + self.img_scale = [img_scale] + assert mmcv.is_list_of(self.img_scale, tuple) + + if ratio_range is not None: + # mode 1: given img_scale=None and a range of image ratio + # mode 2: given a scale and a range of image ratio + assert self.img_scale is None or len(self.img_scale) == 1 + else: + # mode 3 and 4: given multiple scales or a range of scales + assert multiscale_mode in ['value', 'range'] + + self.multiscale_mode = multiscale_mode + self.ratio_range = ratio_range + self.keep_ratio = keep_ratio + + @staticmethod + def random_select(img_scales): + """Randomly select an img_scale from given candidates. + + Args: + img_scales (list[tuple]): Images scales for selection. + + Returns: + (tuple, int): Returns a tuple ``(img_scale, scale_dix)``, + where ``img_scale`` is the selected image scale and + ``scale_idx`` is the selected index in the given candidates. + """ + + assert mmcv.is_list_of(img_scales, tuple) + scale_idx = np.random.randint(len(img_scales)) + img_scale = img_scales[scale_idx] + return img_scale, scale_idx + + @staticmethod + def random_sample(img_scales): + """Randomly sample an img_scale when ``multiscale_mode=='range'``. + + Args: + img_scales (list[tuple]): Images scale range for sampling. + There must be two tuples in img_scales, which specify the lower + and uper bound of image scales. + + Returns: + (tuple, None): Returns a tuple ``(img_scale, None)``, where + ``img_scale`` is sampled scale and None is just a placeholder + to be consistent with :func:`random_select`. + """ + + assert mmcv.is_list_of(img_scales, tuple) and len(img_scales) == 2 + img_scale_long = [max(s) for s in img_scales] + img_scale_short = [min(s) for s in img_scales] + long_edge = np.random.randint( + min(img_scale_long), + max(img_scale_long) + 1) + short_edge = np.random.randint( + min(img_scale_short), + max(img_scale_short) + 1) + img_scale = (long_edge, short_edge) + return img_scale, None + + @staticmethod + def random_sample_ratio(img_scale, ratio_range): + """Randomly sample an img_scale when ``ratio_range`` is specified. + + A ratio will be randomly sampled from the range specified by + ``ratio_range``. Then it would be multiplied with ``img_scale`` to + generate sampled scale. + + Args: + img_scale (tuple): Images scale base to multiply with ratio. + ratio_range (tuple[float]): The minimum and maximum ratio to scale + the ``img_scale``. + + Returns: + (tuple, None): Returns a tuple ``(scale, None)``, where + ``scale`` is sampled ratio multiplied with ``img_scale`` and + None is just a placeholder to be consistent with + :func:`random_select`. + """ + + assert isinstance(img_scale, tuple) and len(img_scale) == 2 + min_ratio, max_ratio = ratio_range + assert min_ratio <= max_ratio + ratio = np.random.random_sample() * (max_ratio - min_ratio) + min_ratio + scale = int(img_scale[0] * ratio), int(img_scale[1] * ratio) + return scale, None + + def _random_scale(self, results): + """Randomly sample an img_scale according to ``ratio_range`` and + ``multiscale_mode``. + + If ``ratio_range`` is specified, a ratio will be sampled and be + multiplied with ``img_scale``. + If multiple scales are specified by ``img_scale``, a scale will be + sampled according to ``multiscale_mode``. + Otherwise, single scale will be used. + + Args: + results (dict): Result dict from :obj:`dataset`. + + Returns: + dict: Two new keys 'scale` and 'scale_idx` are added into + ``results``, which would be used by subsequent pipelines. + """ + + if self.ratio_range is not None: + if self.img_scale is None: + h, w = results['img'].shape[:2] + scale, scale_idx = self.random_sample_ratio((w, h), + self.ratio_range) + else: + scale, scale_idx = self.random_sample_ratio( + self.img_scale[0], self.ratio_range) + elif len(self.img_scale) == 1: + scale, scale_idx = self.img_scale[0], 0 + elif self.multiscale_mode == 'range': + scale, scale_idx = self.random_sample(self.img_scale) + elif self.multiscale_mode == 'value': + scale, scale_idx = self.random_select(self.img_scale) + else: + raise NotImplementedError + + results['scale'] = scale + results['scale_idx'] = scale_idx + + def _resize_img(self, results): + """Resize images with ``results['scale']``.""" + if self.keep_ratio: + img, scale_factor = mmcv.imrescale( + results['img'], results['scale'], return_scale=True) + # the w_scale and h_scale has minor difference + # a real fix should be done in the mmcv.imrescale in the future + new_h, new_w = img.shape[:2] + h, w = results['img'].shape[:2] + w_scale = new_w / w + h_scale = new_h / h + else: + img, w_scale, h_scale = mmcv.imresize( + results['img'], results['scale'], return_scale=True) + scale_factor = np.array([w_scale, h_scale, w_scale, h_scale], + dtype=np.float32) + results['img'] = img + results['img_shape'] = img.shape + results['pad_shape'] = img.shape # in case that there is no padding + results['scale_factor'] = scale_factor + results['keep_ratio'] = self.keep_ratio + + def _resize_seg(self, results): + """Resize semantic segmentation map with ``results['scale']``.""" + for key in results.get('seg_fields', []): + if self.keep_ratio: + gt_seg = mmcv.imrescale( + results[key], results['scale'], interpolation='nearest') + else: + gt_seg = mmcv.imresize( + results[key], results['scale'], interpolation='nearest') + results[key] = gt_seg + + def __call__(self, results): + """Call function to resize images, bounding boxes, masks, semantic + segmentation map. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Resized results, 'img_shape', 'pad_shape', 'scale_factor', + 'keep_ratio' keys are added into result dict. + """ + + if 'scale' not in results: + self._random_scale(results) + self._resize_img(results) + self._resize_seg(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += (f'(img_scale={self.img_scale}, ' + f'multiscale_mode={self.multiscale_mode}, ' + f'ratio_range={self.ratio_range}, ' + f'keep_ratio={self.keep_ratio})') + return repr_str + + +@PIPELINES.register_module() +class RandomFlip(object): + """Flip the image & seg. + + If the input dict contains the key "flip", then the flag will be used, + otherwise it will be randomly decided by a ratio specified in the init + method. + + Args: + prob (float, optional): The flipping probability. Default: None. + direction(str, optional): The flipping direction. Options are + 'horizontal' and 'vertical'. Default: 'horizontal'. + """ + + @deprecated_api_warning({'flip_ratio': 'prob'}, cls_name='RandomFlip') + def __init__(self, prob=None, direction='horizontal'): + self.prob = prob + self.direction = direction + if prob is not None: + assert prob >= 0 and prob <= 1 + assert direction in ['horizontal', 'vertical'] + + def __call__(self, results): + """Call function to flip bounding boxes, masks, semantic segmentation + maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Flipped results, 'flip', 'flip_direction' keys are added into + result dict. + """ + + if 'flip' not in results: + flip = True if np.random.rand() < self.prob else False + results['flip'] = flip + if 'flip_direction' not in results: + results['flip_direction'] = self.direction + if results['flip']: + # flip image + results['img'] = mmcv.imflip( + results['img'], direction=results['flip_direction']) + + # flip segs + for key in results.get('seg_fields', []): + # use copy() to make numpy stride positive + results[key] = mmcv.imflip( + results[key], direction=results['flip_direction']).copy() + return results + + def __repr__(self): + return self.__class__.__name__ + f'(prob={self.prob})' + + +@PIPELINES.register_module() +class Pad(object): + """Pad the image & mask. + + There are two padding modes: (1) pad to a fixed size and (2) pad to the + minimum size that is divisible by some number. + Added keys are "pad_shape", "pad_fixed_size", "pad_size_divisor", + + Args: + size (tuple, optional): Fixed padding size. + size_divisor (int, optional): The divisor of padded size. + pad_val (float, optional): Padding value. Default: 0. + seg_pad_val (float, optional): Padding value of segmentation map. + Default: 255. + """ + + def __init__(self, + size=None, + size_divisor=None, + pad_val=0, + seg_pad_val=255): + self.size = size + self.size_divisor = size_divisor + self.pad_val = pad_val + self.seg_pad_val = seg_pad_val + # only one of size and size_divisor should be valid + assert size is not None or size_divisor is not None + assert size is None or size_divisor is None + + def _pad_img(self, results): + """Pad images according to ``self.size``.""" + if self.size is not None: + padded_img = mmcv.impad( + results['img'], shape=self.size, pad_val=self.pad_val) + elif self.size_divisor is not None: + padded_img = mmcv.impad_to_multiple( + results['img'], self.size_divisor, pad_val=self.pad_val) + results['img'] = padded_img + results['pad_shape'] = padded_img.shape + results['pad_fixed_size'] = self.size + results['pad_size_divisor'] = self.size_divisor + + def _pad_seg(self, results): + """Pad masks according to ``results['pad_shape']``.""" + for key in results.get('seg_fields', []): + results[key] = mmcv.impad( + results[key], + shape=results['pad_shape'][:2], + pad_val=self.seg_pad_val) + + def __call__(self, results): + """Call function to pad images, masks, semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Updated result dict. + """ + + self._pad_img(results) + self._pad_seg(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(size={self.size}, size_divisor={self.size_divisor}, ' \ + f'pad_val={self.pad_val})' + return repr_str + + +@PIPELINES.register_module() +class Normalize(object): + """Normalize the image. + + Added key is "img_norm_cfg". + + Args: + mean (sequence): Mean values of 3 channels. + std (sequence): Std values of 3 channels. + to_rgb (bool): Whether to convert the image from BGR to RGB, + default is true. + """ + + def __init__(self, mean, std, to_rgb=True): + self.mean = np.array(mean, dtype=np.float32) + self.std = np.array(std, dtype=np.float32) + self.to_rgb = to_rgb + + def __call__(self, results): + """Call function to normalize images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Normalized results, 'img_norm_cfg' key is added into + result dict. + """ + + results['img'] = mmcv.imnormalize(results['img'], self.mean, self.std, + self.to_rgb) + results['img_norm_cfg'] = dict( + mean=self.mean, std=self.std, to_rgb=self.to_rgb) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(mean={self.mean}, std={self.std}, to_rgb=' \ + f'{self.to_rgb})' + return repr_str + + +@PIPELINES.register_module() +class Rerange(object): + """Rerange the image pixel value. + + Args: + min_value (float or int): Minimum value of the reranged image. + Default: 0. + max_value (float or int): Maximum value of the reranged image. + Default: 255. + """ + + def __init__(self, min_value=0, max_value=255): + assert isinstance(min_value, float) or isinstance(min_value, int) + assert isinstance(max_value, float) or isinstance(max_value, int) + assert min_value < max_value + self.min_value = min_value + self.max_value = max_value + + def __call__(self, results): + """Call function to rerange images. + + Args: + results (dict): Result dict from loading pipeline. + Returns: + dict: Reranged results. + """ + + img = results['img'] + img_min_value = np.min(img) + img_max_value = np.max(img) + + assert img_min_value < img_max_value + # rerange to [0, 1] + img = (img - img_min_value) / (img_max_value - img_min_value) + # rerange to [min_value, max_value] + img = img * (self.max_value - self.min_value) + self.min_value + results['img'] = img + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(min_value={self.min_value}, max_value={self.max_value})' + return repr_str + + +@PIPELINES.register_module() +class CLAHE(object): + """Use CLAHE method to process the image. + + See `ZUIDERVELD,K. Contrast Limited Adaptive Histogram Equalization[J]. + Graphics Gems, 1994:474-485.` for more information. + + Args: + clip_limit (float): Threshold for contrast limiting. Default: 40.0. + tile_grid_size (tuple[int]): Size of grid for histogram equalization. + Input image will be divided into equally sized rectangular tiles. + It defines the number of tiles in row and column. Default: (8, 8). + """ + + def __init__(self, clip_limit=40.0, tile_grid_size=(8, 8)): + assert isinstance(clip_limit, (float, int)) + self.clip_limit = clip_limit + assert is_tuple_of(tile_grid_size, int) + assert len(tile_grid_size) == 2 + self.tile_grid_size = tile_grid_size + + def __call__(self, results): + """Call function to Use CLAHE method process images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Processed results. + """ + + for i in range(results['img'].shape[2]): + results['img'][:, :, i] = mmcv.clahe( + np.array(results['img'][:, :, i], dtype=np.uint8), + self.clip_limit, self.tile_grid_size) + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(clip_limit={self.clip_limit}, '\ + f'tile_grid_size={self.tile_grid_size})' + return repr_str + + +@PIPELINES.register_module() +class RandomCrop(object): + """Random crop the image & seg. + + Args: + crop_size (tuple): Expected size after cropping, (h, w). + cat_max_ratio (float): The maximum ratio that single category could + occupy. + """ + + def __init__(self, crop_size, cat_max_ratio=1., ignore_index=255): + assert crop_size[0] > 0 and crop_size[1] > 0 + self.crop_size = crop_size + self.cat_max_ratio = cat_max_ratio + self.ignore_index = ignore_index + + def get_crop_bbox(self, img): + """Randomly get a crop bounding box.""" + margin_h = max(img.shape[0] - self.crop_size[0], 0) + margin_w = max(img.shape[1] - self.crop_size[1], 0) + offset_h = np.random.randint(0, margin_h + 1) + offset_w = np.random.randint(0, margin_w + 1) + crop_y1, crop_y2 = offset_h, offset_h + self.crop_size[0] + crop_x1, crop_x2 = offset_w, offset_w + self.crop_size[1] + + return crop_y1, crop_y2, crop_x1, crop_x2 + + def crop(self, img, crop_bbox): + """Crop from ``img``""" + crop_y1, crop_y2, crop_x1, crop_x2 = crop_bbox + img = img[crop_y1:crop_y2, crop_x1:crop_x2, ...] + return img + + def __call__(self, results): + """Call function to randomly crop images, semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Randomly cropped results, 'img_shape' key in result dict is + updated according to crop size. + """ + + img = results['img'] + crop_bbox = self.get_crop_bbox(img) + if self.cat_max_ratio < 1.: + # Repeat 10 times + for _ in range(10): + seg_temp = self.crop(results['gt_semantic_seg'], crop_bbox) + labels, cnt = np.unique(seg_temp, return_counts=True) + cnt = cnt[labels != self.ignore_index] + if len(cnt) > 1 and np.max(cnt) / np.sum( + cnt) < self.cat_max_ratio: + break + crop_bbox = self.get_crop_bbox(img) + + # crop the image + img = self.crop(img, crop_bbox) + img_shape = img.shape + results['img'] = img + results['img_shape'] = img_shape + + # crop semantic seg + for key in results.get('seg_fields', []): + results[key] = self.crop(results[key], crop_bbox) + + return results + + def __repr__(self): + return self.__class__.__name__ + f'(crop_size={self.crop_size})' + + +@PIPELINES.register_module() +class RandomRotate(object): + """Rotate the image & seg. + + Args: + prob (float): The rotation probability. + degree (float, tuple[float]): Range of degrees to select from. If + degree is a number instead of tuple like (min, max), + the range of degree will be (``-degree``, ``+degree``) + pad_val (float, optional): Padding value of image. Default: 0. + seg_pad_val (float, optional): Padding value of segmentation map. + Default: 255. + center (tuple[float], optional): Center point (w, h) of the rotation in + the source image. If not specified, the center of the image will be + used. Default: None. + auto_bound (bool): Whether to adjust the image size to cover the whole + rotated image. Default: False + """ + + def __init__(self, + prob, + degree, + pad_val=0, + seg_pad_val=255, + center=None, + auto_bound=False): + self.prob = prob + assert prob >= 0 and prob <= 1 + if isinstance(degree, (float, int)): + assert degree > 0, f'degree {degree} should be positive' + self.degree = (-degree, degree) + else: + self.degree = degree + assert len(self.degree) == 2, f'degree {self.degree} should be a ' \ + f'tuple of (min, max)' + self.pal_val = pad_val + self.seg_pad_val = seg_pad_val + self.center = center + self.auto_bound = auto_bound + + def __call__(self, results): + """Call function to rotate image, semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Rotated results. + """ + + rotate = True if np.random.rand() < self.prob else False + degree = np.random.uniform(min(*self.degree), max(*self.degree)) + if rotate: + # rotate image + results['img'] = mmcv.imrotate( + results['img'], + angle=degree, + border_value=self.pal_val, + center=self.center, + auto_bound=self.auto_bound) + + # rotate segs + for key in results.get('seg_fields', []): + results[key] = mmcv.imrotate( + results[key], + angle=degree, + border_value=self.seg_pad_val, + center=self.center, + auto_bound=self.auto_bound, + interpolation='nearest') + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob}, ' \ + f'degree={self.degree}, ' \ + f'pad_val={self.pal_val}, ' \ + f'seg_pad_val={self.seg_pad_val}, ' \ + f'center={self.center}, ' \ + f'auto_bound={self.auto_bound})' + return repr_str + + +@PIPELINES.register_module() +class RGB2Gray(object): + """Convert RGB image to grayscale image. + + This transform calculate the weighted mean of input image channels with + ``weights`` and then expand the channels to ``out_channels``. When + ``out_channels`` is None, the number of output channels is the same as + input channels. + + Args: + out_channels (int): Expected number of output channels after + transforming. Default: None. + weights (tuple[float]): The weights to calculate the weighted mean. + Default: (0.299, 0.587, 0.114). + """ + + def __init__(self, out_channels=None, weights=(0.299, 0.587, 0.114)): + assert out_channels is None or out_channels > 0 + self.out_channels = out_channels + assert isinstance(weights, tuple) + for item in weights: + assert isinstance(item, (float, int)) + self.weights = weights + + def __call__(self, results): + """Call function to convert RGB image to grayscale image. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with grayscale image. + """ + img = results['img'] + assert len(img.shape) == 3 + assert img.shape[2] == len(self.weights) + weights = np.array(self.weights).reshape((1, 1, -1)) + img = (img * weights).sum(2, keepdims=True) + if self.out_channels is None: + img = img.repeat(weights.shape[2], axis=2) + else: + img = img.repeat(self.out_channels, axis=2) + + results['img'] = img + results['img_shape'] = img.shape + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(out_channels={self.out_channels}, ' \ + f'weights={self.weights})' + return repr_str + + +@PIPELINES.register_module() +class AdjustGamma(object): + """Using gamma correction to process the image. + + Args: + gamma (float or int): Gamma value used in gamma correction. + Default: 1.0. + """ + + def __init__(self, gamma=1.0): + assert isinstance(gamma, float) or isinstance(gamma, int) + assert gamma > 0 + self.gamma = gamma + inv_gamma = 1.0 / gamma + self.table = np.array([(i / 255.0)**inv_gamma * 255 + for i in np.arange(256)]).astype('uint8') + + def __call__(self, results): + """Call function to process the image with gamma correction. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Processed results. + """ + + results['img'] = mmcv.lut_transform( + np.array(results['img'], dtype=np.uint8), self.table) + + return results + + def __repr__(self): + return self.__class__.__name__ + f'(gamma={self.gamma})' + + +@PIPELINES.register_module() +class SegRescale(object): + """Rescale semantic segmentation maps. + + Args: + scale_factor (float): The scale factor of the final output. + """ + + def __init__(self, scale_factor=1): + self.scale_factor = scale_factor + + def __call__(self, results): + """Call function to scale the semantic segmentation map. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with semantic segmentation map scaled. + """ + for key in results.get('seg_fields', []): + if self.scale_factor != 1: + results[key] = mmcv.imrescale( + results[key], self.scale_factor, interpolation='nearest') + return results + + def __repr__(self): + return self.__class__.__name__ + f'(scale_factor={self.scale_factor})' + + +@PIPELINES.register_module() +class PhotoMetricDistortion(object): + """Apply photometric distortion to image sequentially, every transformation + is applied with a probability of 0.5. The position of random contrast is in + second or second to last. + + 1. random brightness + 2. random contrast (mode 0) + 3. convert color from BGR to HSV + 4. random saturation + 5. random hue + 6. convert color from HSV to BGR + 7. random contrast (mode 1) + 8. randomly swap channels + + Args: + brightness_delta (int): delta of brightness. + contrast_range (tuple): range of contrast. + saturation_range (tuple): range of saturation. + hue_delta (int): delta of hue. + """ + + def __init__(self, + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18): + self.brightness_delta = brightness_delta + self.contrast_lower, self.contrast_upper = contrast_range + self.saturation_lower, self.saturation_upper = saturation_range + self.hue_delta = hue_delta + + def convert(self, img, alpha=1, beta=0): + """Multiple with alpha and add beat with clip.""" + img = img.astype(np.float32) * alpha + beta + img = np.clip(img, 0, 255) + return img.astype(np.uint8) + + def brightness(self, img): + """Brightness distortion.""" + if random.randint(2): + return self.convert( + img, + beta=random.uniform(-self.brightness_delta, + self.brightness_delta)) + return img + + def contrast(self, img): + """Contrast distortion.""" + if random.randint(2): + return self.convert( + img, + alpha=random.uniform(self.contrast_lower, self.contrast_upper)) + return img + + def saturation(self, img): + """Saturation distortion.""" + if random.randint(2): + img = mmcv.bgr2hsv(img) + img[:, :, 1] = self.convert( + img[:, :, 1], + alpha=random.uniform(self.saturation_lower, + self.saturation_upper)) + img = mmcv.hsv2bgr(img) + return img + + def hue(self, img): + """Hue distortion.""" + if random.randint(2): + img = mmcv.bgr2hsv(img) + img[:, :, + 0] = (img[:, :, 0].astype(int) + + random.randint(-self.hue_delta, self.hue_delta)) % 180 + img = mmcv.hsv2bgr(img) + return img + + def __call__(self, results): + """Call function to perform photometric distortion on images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with images distorted. + """ + + img = results['img'] + # random brightness + img = self.brightness(img) + + # mode == 0 --> do random contrast first + # mode == 1 --> do random contrast last + mode = random.randint(2) + if mode == 1: + img = self.contrast(img) + + # random saturation + img = self.saturation(img) + + # random hue + img = self.hue(img) + + # random contrast + if mode == 0: + img = self.contrast(img) + + results['img'] = img + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += (f'(brightness_delta={self.brightness_delta}, ' + f'contrast_range=({self.contrast_lower}, ' + f'{self.contrast_upper}), ' + f'saturation_range=({self.saturation_lower}, ' + f'{self.saturation_upper}), ' + f'hue_delta={self.hue_delta})') + return repr_str diff --git a/mmseg/datasets/stare.py b/mmseg/datasets/stare.py new file mode 100644 index 0000000000000000000000000000000000000000..cbd14e0920e7f6a73baff1432e5a32ccfdb0dfae --- /dev/null +++ b/mmseg/datasets/stare.py @@ -0,0 +1,27 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class STAREDataset(CustomDataset): + """STARE dataset. + + In segmentation map annotation for STARE, 0 stands for background, which is + included in 2 categories. ``reduce_zero_label`` is fixed to False. The + ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to + '.ah.png'. + """ + + CLASSES = ('background', 'vessel') + + PALETTE = [[120, 120, 120], [6, 230, 230]] + + def __init__(self, **kwargs): + super(STAREDataset, self).__init__( + img_suffix='.png', + seg_map_suffix='.ah.png', + reduce_zero_label=False, + **kwargs) + assert osp.exists(self.img_dir) diff --git a/mmseg/datasets/voc.py b/mmseg/datasets/voc.py new file mode 100644 index 0000000000000000000000000000000000000000..a8855203b14ee0dc4da9099a2945d4aedcffbcd6 --- /dev/null +++ b/mmseg/datasets/voc.py @@ -0,0 +1,29 @@ +import os.path as osp + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class PascalVOCDataset(CustomDataset): + """Pascal VOC dataset. + + Args: + split (str): Split txt file for Pascal VOC. + """ + + CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', + 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', + 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', + 'train', 'tvmonitor') + + PALETTE = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], + [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], + [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], + [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], + [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128]] + + def __init__(self, split, **kwargs): + super(PascalVOCDataset, self).__init__( + img_suffix='.jpg', seg_map_suffix='.png', split=split, **kwargs) + assert osp.exists(self.img_dir) and self.split is not None diff --git a/mmseg/models/__init__.py b/mmseg/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3cf93f8bec9cf0cef0a3bd76ca3ca92eb188f535 --- /dev/null +++ b/mmseg/models/__init__.py @@ -0,0 +1,12 @@ +from .backbones import * # noqa: F401,F403 +from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone, + build_head, build_loss, build_segmentor) +from .decode_heads import * # noqa: F401,F403 +from .losses import * # noqa: F401,F403 +from .necks import * # noqa: F401,F403 +from .segmentors import * # noqa: F401,F403 + +__all__ = [ + 'BACKBONES', 'HEADS', 'LOSSES', 'SEGMENTORS', 'build_backbone', + 'build_head', 'build_loss', 'build_segmentor' +] diff --git a/mmseg/models/backbones/__init__.py b/mmseg/models/backbones/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3af488d160df596ea0d55a40226603ee660471fb --- /dev/null +++ b/mmseg/models/backbones/__init__.py @@ -0,0 +1,19 @@ +from .cgnet import CGNet +from .fast_scnn import FastSCNN +from .hrnet import HRNet +from .mobilenet_v2 import MobileNetV2 +from .mobilenet_v3 import MobileNetV3 +from .resnest import ResNeSt +from .resnet import ResNet, ResNetV1c, ResNetV1d +from .resnext import ResNeXt +from .unet import UNet +from .pvt import pvt_small, pvt_small_f4, pvt_tiny +from .vit import VisionTransformer +from .vit_mla import VIT_MLA + +__all__ = [ + 'ResNet', 'ResNetV1c', 'ResNetV1d', 'ResNeXt', 'HRNet', 'FastSCNN', + 'ResNeSt', 'MobileNetV2', 'UNet', 'CGNet', 'MobileNetV3', + 'pvt_small', 'pvt_small_f4', 'pvt_tiny', + 'VisionTransformer', 'VIT_MLA' +] diff --git a/mmseg/models/backbones/cgnet.py b/mmseg/models/backbones/cgnet.py new file mode 100644 index 0000000000000000000000000000000000000000..968d171cd4b28b4670ef3cd01a6a407875ee478e --- /dev/null +++ b/mmseg/models/backbones/cgnet.py @@ -0,0 +1,367 @@ +import torch +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import (ConvModule, build_conv_layer, build_norm_layer, + constant_init, kaiming_init) +from mmcv.runner import load_checkpoint +from mmcv.utils.parrots_wrapper import _BatchNorm + +from mmseg.utils import get_root_logger +from ..builder import BACKBONES + + +class GlobalContextExtractor(nn.Module): + """Global Context Extractor for CGNet. + + This class is employed to refine the joFint feature of both local feature + and surrounding context. + + Args: + channel (int): Number of input feature channels. + reduction (int): Reductions for global context extractor. Default: 16. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + def __init__(self, channel, reduction=16, with_cp=False): + super(GlobalContextExtractor, self).__init__() + self.channel = channel + self.reduction = reduction + assert reduction >= 1 and channel >= reduction + self.with_cp = with_cp + self.avg_pool = nn.AdaptiveAvgPool2d(1) + self.fc = nn.Sequential( + nn.Linear(channel, channel // reduction), nn.ReLU(inplace=True), + nn.Linear(channel // reduction, channel), nn.Sigmoid()) + + def forward(self, x): + + def _inner_forward(x): + num_batch, num_channel = x.size()[:2] + y = self.avg_pool(x).view(num_batch, num_channel) + y = self.fc(y).view(num_batch, num_channel, 1, 1) + return x * y + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +class ContextGuidedBlock(nn.Module): + """Context Guided Block for CGNet. + + This class consists of four components: local feature extractor, + surrounding feature extractor, joint feature extractor and global + context extractor. + + Args: + in_channels (int): Number of input feature channels. + out_channels (int): Number of output feature channels. + dilation (int): Dilation rate for surrounding context extractor. + Default: 2. + reduction (int): Reduction for global context extractor. Default: 16. + skip_connect (bool): Add input to output or not. Default: True. + downsample (bool): Downsample the input to 1/2 or not. Default: False. + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN', requires_grad=True). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + def __init__(self, + in_channels, + out_channels, + dilation=2, + reduction=16, + skip_connect=True, + downsample=False, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='PReLU'), + with_cp=False): + super(ContextGuidedBlock, self).__init__() + self.with_cp = with_cp + self.downsample = downsample + + channels = out_channels if downsample else out_channels // 2 + if 'type' in act_cfg and act_cfg['type'] == 'PReLU': + act_cfg['num_parameters'] = channels + kernel_size = 3 if downsample else 1 + stride = 2 if downsample else 1 + padding = (kernel_size - 1) // 2 + + self.conv1x1 = ConvModule( + in_channels, + channels, + kernel_size, + stride, + padding, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + self.f_loc = build_conv_layer( + conv_cfg, + channels, + channels, + kernel_size=3, + padding=1, + groups=channels, + bias=False) + self.f_sur = build_conv_layer( + conv_cfg, + channels, + channels, + kernel_size=3, + padding=dilation, + groups=channels, + dilation=dilation, + bias=False) + + self.bn = build_norm_layer(norm_cfg, 2 * channels)[1] + self.activate = nn.PReLU(2 * channels) + + if downsample: + self.bottleneck = build_conv_layer( + conv_cfg, + 2 * channels, + out_channels, + kernel_size=1, + bias=False) + + self.skip_connect = skip_connect and not downsample + self.f_glo = GlobalContextExtractor(out_channels, reduction, with_cp) + + def forward(self, x): + + def _inner_forward(x): + out = self.conv1x1(x) + loc = self.f_loc(out) + sur = self.f_sur(out) + + joi_feat = torch.cat([loc, sur], 1) # the joint feature + joi_feat = self.bn(joi_feat) + joi_feat = self.activate(joi_feat) + if self.downsample: + joi_feat = self.bottleneck(joi_feat) # channel = out_channels + # f_glo is employed to refine the joint feature + out = self.f_glo(joi_feat) + + if self.skip_connect: + return x + out + else: + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +class InputInjection(nn.Module): + """Downsampling module for CGNet.""" + + def __init__(self, num_downsampling): + super(InputInjection, self).__init__() + self.pool = nn.ModuleList() + for i in range(num_downsampling): + self.pool.append(nn.AvgPool2d(3, stride=2, padding=1)) + + def forward(self, x): + for pool in self.pool: + x = pool(x) + return x + + +@BACKBONES.register_module() +class CGNet(nn.Module): + """CGNet backbone. + + A Light-weight Context Guided Network for Semantic Segmentation + arXiv: https://arxiv.org/abs/1811.08201 + + Args: + in_channels (int): Number of input image channels. Normally 3. + num_channels (tuple[int]): Numbers of feature channels at each stages. + Default: (32, 64, 128). + num_blocks (tuple[int]): Numbers of CG blocks at stage 1 and stage 2. + Default: (3, 21). + dilations (tuple[int]): Dilation rate for surrounding context + extractors at stage 1 and stage 2. Default: (2, 4). + reductions (tuple[int]): Reductions for global context extractors at + stage 1 and stage 2. Default: (8, 16). + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN', requires_grad=True). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='PReLU'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + def __init__(self, + in_channels=3, + num_channels=(32, 64, 128), + num_blocks=(3, 21), + dilations=(2, 4), + reductions=(8, 16), + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='PReLU'), + norm_eval=False, + with_cp=False): + + super(CGNet, self).__init__() + self.in_channels = in_channels + self.num_channels = num_channels + assert isinstance(self.num_channels, tuple) and len( + self.num_channels) == 3 + self.num_blocks = num_blocks + assert isinstance(self.num_blocks, tuple) and len(self.num_blocks) == 2 + self.dilations = dilations + assert isinstance(self.dilations, tuple) and len(self.dilations) == 2 + self.reductions = reductions + assert isinstance(self.reductions, tuple) and len(self.reductions) == 2 + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + if 'type' in self.act_cfg and self.act_cfg['type'] == 'PReLU': + self.act_cfg['num_parameters'] = num_channels[0] + self.norm_eval = norm_eval + self.with_cp = with_cp + + cur_channels = in_channels + self.stem = nn.ModuleList() + for i in range(3): + self.stem.append( + ConvModule( + cur_channels, + num_channels[0], + 3, + 2 if i == 0 else 1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + cur_channels = num_channels[0] + + self.inject_2x = InputInjection(1) # down-sample for Input, factor=2 + self.inject_4x = InputInjection(2) # down-sample for Input, factor=4 + + cur_channels += in_channels + self.norm_prelu_0 = nn.Sequential( + build_norm_layer(norm_cfg, cur_channels)[1], + nn.PReLU(cur_channels)) + + # stage 1 + self.level1 = nn.ModuleList() + for i in range(num_blocks[0]): + self.level1.append( + ContextGuidedBlock( + cur_channels if i == 0 else num_channels[1], + num_channels[1], + dilations[0], + reductions[0], + downsample=(i == 0), + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + with_cp=with_cp)) # CG block + + cur_channels = 2 * num_channels[1] + in_channels + self.norm_prelu_1 = nn.Sequential( + build_norm_layer(norm_cfg, cur_channels)[1], + nn.PReLU(cur_channels)) + + # stage 2 + self.level2 = nn.ModuleList() + for i in range(num_blocks[1]): + self.level2.append( + ContextGuidedBlock( + cur_channels if i == 0 else num_channels[2], + num_channels[2], + dilations[1], + reductions[1], + downsample=(i == 0), + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + with_cp=with_cp)) # CG block + + cur_channels = 2 * num_channels[2] + self.norm_prelu_2 = nn.Sequential( + build_norm_layer(norm_cfg, cur_channels)[1], + nn.PReLU(cur_channels)) + + def forward(self, x): + output = [] + + # stage 0 + inp_2x = self.inject_2x(x) + inp_4x = self.inject_4x(x) + for layer in self.stem: + x = layer(x) + x = self.norm_prelu_0(torch.cat([x, inp_2x], 1)) + output.append(x) + + # stage 1 + for i, layer in enumerate(self.level1): + x = layer(x) + if i == 0: + down1 = x + x = self.norm_prelu_1(torch.cat([x, down1, inp_4x], 1)) + output.append(x) + + # stage 2 + for i, layer in enumerate(self.level2): + x = layer(x) + if i == 0: + down2 = x + x = self.norm_prelu_2(torch.cat([down2, x], 1)) + output.append(x) + + return output + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, (nn.Conv2d, nn.Linear)): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + elif isinstance(m, nn.PReLU): + constant_init(m, 0) + else: + raise TypeError('pretrained must be a str or None') + + def train(self, mode=True): + """Convert the model into training mode whill keeping the normalization + layer freezed.""" + super(CGNet, self).train(mode) + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmseg/models/backbones/fast_scnn.py b/mmseg/models/backbones/fast_scnn.py new file mode 100644 index 0000000000000000000000000000000000000000..ee115ffda1b32d9ab2181541f54489168cf6a3ec --- /dev/null +++ b/mmseg/models/backbones/fast_scnn.py @@ -0,0 +1,375 @@ +import torch +import torch.nn as nn +from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, constant_init, + kaiming_init) +from torch.nn.modules.batchnorm import _BatchNorm + +from mmseg.models.decode_heads.psp_head import PPM +from mmseg.ops import resize +from ..builder import BACKBONES +from ..utils.inverted_residual import InvertedResidual + + +class LearningToDownsample(nn.Module): + """Learning to downsample module. + + Args: + in_channels (int): Number of input channels. + dw_channels (tuple[int]): Number of output channels of the first and + the second depthwise conv (dwconv) layers. + out_channels (int): Number of output channels of the whole + 'learning to downsample' module. + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + """ + + def __init__(self, + in_channels, + dw_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU')): + super(LearningToDownsample, self).__init__() + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + dw_channels1 = dw_channels[0] + dw_channels2 = dw_channels[1] + + self.conv = ConvModule( + in_channels, + dw_channels1, + 3, + stride=2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.dsconv1 = DepthwiseSeparableConvModule( + dw_channels1, + dw_channels2, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg) + self.dsconv2 = DepthwiseSeparableConvModule( + dw_channels2, + out_channels, + kernel_size=3, + stride=2, + padding=1, + norm_cfg=self.norm_cfg) + + def forward(self, x): + x = self.conv(x) + x = self.dsconv1(x) + x = self.dsconv2(x) + return x + + +class GlobalFeatureExtractor(nn.Module): + """Global feature extractor module. + + Args: + in_channels (int): Number of input channels of the GFE module. + Default: 64 + block_channels (tuple[int]): Tuple of ints. Each int specifies the + number of output channels of each Inverted Residual module. + Default: (64, 96, 128) + out_channels(int): Number of output channels of the GFE module. + Default: 128 + expand_ratio (int): Adjusts number of channels of the hidden layer + in InvertedResidual by this amount. + Default: 6 + num_blocks (tuple[int]): Tuple of ints. Each int specifies the + number of times each Inverted Residual module is repeated. + The repeated Inverted Residual modules are called a 'group'. + Default: (3, 3, 3) + strides (tuple[int]): Tuple of ints. Each int specifies + the downsampling factor of each 'group'. + Default: (2, 2, 1) + pool_scales (tuple[int]): Tuple of ints. Each int specifies + the parameter required in 'global average pooling' within PPM. + Default: (1, 2, 3, 6) + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + align_corners (bool): align_corners argument of F.interpolate. + Default: False + """ + + def __init__(self, + in_channels=64, + block_channels=(64, 96, 128), + out_channels=128, + expand_ratio=6, + num_blocks=(3, 3, 3), + strides=(2, 2, 1), + pool_scales=(1, 2, 3, 6), + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False): + super(GlobalFeatureExtractor, self).__init__() + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + assert len(block_channels) == len(num_blocks) == 3 + self.bottleneck1 = self._make_layer(in_channels, block_channels[0], + num_blocks[0], strides[0], + expand_ratio) + self.bottleneck2 = self._make_layer(block_channels[0], + block_channels[1], num_blocks[1], + strides[1], expand_ratio) + self.bottleneck3 = self._make_layer(block_channels[1], + block_channels[2], num_blocks[2], + strides[2], expand_ratio) + self.ppm = PPM( + pool_scales, + block_channels[2], + block_channels[2] // 4, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=align_corners) + self.out = ConvModule( + block_channels[2] * 2, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def _make_layer(self, + in_channels, + out_channels, + blocks, + stride=1, + expand_ratio=6): + layers = [ + InvertedResidual( + in_channels, + out_channels, + stride, + expand_ratio, + norm_cfg=self.norm_cfg) + ] + for i in range(1, blocks): + layers.append( + InvertedResidual( + out_channels, + out_channels, + 1, + expand_ratio, + norm_cfg=self.norm_cfg)) + return nn.Sequential(*layers) + + def forward(self, x): + x = self.bottleneck1(x) + x = self.bottleneck2(x) + x = self.bottleneck3(x) + x = torch.cat([x, *self.ppm(x)], dim=1) + x = self.out(x) + return x + + +class FeatureFusionModule(nn.Module): + """Feature fusion module. + + Args: + higher_in_channels (int): Number of input channels of the + higher-resolution branch. + lower_in_channels (int): Number of input channels of the + lower-resolution branch. + out_channels (int): Number of output channels. + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + align_corners (bool): align_corners argument of F.interpolate. + Default: False + """ + + def __init__(self, + higher_in_channels, + lower_in_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False): + super(FeatureFusionModule, self).__init__() + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.align_corners = align_corners + self.dwconv = ConvModule( + lower_in_channels, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.conv_lower_res = ConvModule( + out_channels, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=None) + self.conv_higher_res = ConvModule( + higher_in_channels, + out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=None) + self.relu = nn.ReLU(True) + + def forward(self, higher_res_feature, lower_res_feature): + lower_res_feature = resize( + lower_res_feature, + size=higher_res_feature.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + lower_res_feature = self.dwconv(lower_res_feature) + lower_res_feature = self.conv_lower_res(lower_res_feature) + + higher_res_feature = self.conv_higher_res(higher_res_feature) + out = higher_res_feature + lower_res_feature + return self.relu(out) + + +@BACKBONES.register_module() +class FastSCNN(nn.Module): + """Fast-SCNN Backbone. + + Args: + in_channels (int): Number of input image channels. Default: 3. + downsample_dw_channels (tuple[int]): Number of output channels after + the first conv layer & the second conv layer in + Learning-To-Downsample (LTD) module. + Default: (32, 48). + global_in_channels (int): Number of input channels of + Global Feature Extractor(GFE). + Equal to number of output channels of LTD. + Default: 64. + global_block_channels (tuple[int]): Tuple of integers that describe + the output channels for each of the MobileNet-v2 bottleneck + residual blocks in GFE. + Default: (64, 96, 128). + global_block_strides (tuple[int]): Tuple of integers + that describe the strides (downsampling factors) for each of the + MobileNet-v2 bottleneck residual blocks in GFE. + Default: (2, 2, 1). + global_out_channels (int): Number of output channels of GFE. + Default: 128. + higher_in_channels (int): Number of input channels of the higher + resolution branch in FFM. + Equal to global_in_channels. + Default: 64. + lower_in_channels (int): Number of input channels of the lower + resolution branch in FFM. + Equal to global_out_channels. + Default: 128. + fusion_out_channels (int): Number of output channels of FFM. + Default: 128. + out_indices (tuple): Tuple of indices of list + [higher_res_features, lower_res_features, fusion_output]. + Often set to (0,1,2) to enable aux. heads. + Default: (0, 1, 2). + conv_cfg (dict | None): Config of conv layers. Default: None + norm_cfg (dict | None): Config of norm layers. Default: + dict(type='BN') + act_cfg (dict): Config of activation layers. Default: + dict(type='ReLU') + align_corners (bool): align_corners argument of F.interpolate. + Default: False + """ + + def __init__(self, + in_channels=3, + downsample_dw_channels=(32, 48), + global_in_channels=64, + global_block_channels=(64, 96, 128), + global_block_strides=(2, 2, 1), + global_out_channels=128, + higher_in_channels=64, + lower_in_channels=128, + fusion_out_channels=128, + out_indices=(0, 1, 2), + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False): + + super(FastSCNN, self).__init__() + if global_in_channels != higher_in_channels: + raise AssertionError('Global Input Channels must be the same \ + with Higher Input Channels!') + elif global_out_channels != lower_in_channels: + raise AssertionError('Global Output Channels must be the same \ + with Lower Input Channels!') + + self.in_channels = in_channels + self.downsample_dw_channels1 = downsample_dw_channels[0] + self.downsample_dw_channels2 = downsample_dw_channels[1] + self.global_in_channels = global_in_channels + self.global_block_channels = global_block_channels + self.global_block_strides = global_block_strides + self.global_out_channels = global_out_channels + self.higher_in_channels = higher_in_channels + self.lower_in_channels = lower_in_channels + self.fusion_out_channels = fusion_out_channels + self.out_indices = out_indices + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.align_corners = align_corners + self.learning_to_downsample = LearningToDownsample( + in_channels, + downsample_dw_channels, + global_in_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.global_feature_extractor = GlobalFeatureExtractor( + global_in_channels, + global_block_channels, + global_out_channels, + strides=self.global_block_strides, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.feature_fusion = FeatureFusionModule( + higher_in_channels, + lower_in_channels, + fusion_out_channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + + def init_weights(self, pretrained=None): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + + def forward(self, x): + higher_res_features = self.learning_to_downsample(x) + lower_res_features = self.global_feature_extractor(higher_res_features) + fusion_output = self.feature_fusion(higher_res_features, + lower_res_features) + + outs = [higher_res_features, lower_res_features, fusion_output] + outs = [outs[i] for i in self.out_indices] + return tuple(outs) diff --git a/mmseg/models/backbones/helpers.py b/mmseg/models/backbones/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..3687f281bd6bbe5bedb58f3bdcb1bfec0b366a30 --- /dev/null +++ b/mmseg/models/backbones/helpers.py @@ -0,0 +1,137 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as model_zoo +import math +import logging +import warnings +import errno +import os +import sys +import re +import zipfile +from urllib.parse import urlparse # noqa: F401 + +HASH_REGEX = re.compile(r'-([a-f0-9]*)\.') +_logger = logging.getLogger(__name__) + + +def load_state_dict_from_url(url, model_dir=None, file_name=None, check_hash=False, progress=True, map_location=None): + # Issue warning to move data if old env is set + if os.getenv('TORCH_MODEL_ZOO'): + warnings.warn('TORCH_MODEL_ZOO is deprecated, please use env TORCH_HOME instead') + + if model_dir is None: + hub_dir = torch.hub.get_dir() + model_dir = os.path.join(hub_dir, 'checkpoints') + try: + os.makedirs(model_dir) + except OSError as e: + if e.errno == errno.EEXIST: + # Directory already exists, ignore. + pass + else: + # Unexpected OSError, re-raise. + raise + parts = urlparse(url) + filename = os.path.basename(parts.path) + if file_name is not None: + filename = file_name + cached_file = os.path.join(model_dir, filename) + if not os.path.exists(cached_file): + sys.stderr.write('Downloading: "{}" to {}\n'.format(url, cached_file)) + hash_prefix = HASH_REGEX.search(filename).group(1) if check_hash else None + torch.hub.download_url_to_file(url, cached_file, hash_prefix, progress=progress) + if zipfile.is_zipfile(cached_file): + state_dict = torch.load(cached_file, map_location=map_location)['model'] + else: + state_dict = torch.load(cached_file, map_location=map_location) + return state_dict + + +def load_pretrained(model, cfg=None, num_classes=1000, in_chans=3, filter_fn=None, strict=True, pos_embed_interp=False, num_patches=576, align_corners=False): + if cfg is None: + cfg = getattr(model, 'default_cfg') + if cfg is None or 'url' not in cfg or not cfg['url']: + _logger.warning("Pretrained model URL is invalid, using random initialization.") + return + + if 'pretrained_finetune' in cfg and cfg['pretrained_finetune']: + state_dict = torch.load(cfg['pretrained_finetune']) + print('load pre-trained weight from ' + cfg['pretrained_finetune']) + else: + state_dict = load_state_dict_from_url(cfg['url'], progress=False, map_location='cpu') + print('load pre-trained weight from imagenet21k') + + + if filter_fn is not None: + state_dict = filter_fn(state_dict) + + if in_chans == 1: + conv1_name = cfg['first_conv'] + _logger.info('Converting first conv (%s) pretrained weights from 3 to 1 channel' % conv1_name) + conv1_weight = state_dict[conv1_name + '.weight'] + # Some weights are in torch.half, ensure it's float for sum on CPU + conv1_type = conv1_weight.dtype + conv1_weight = conv1_weight.float() + O, I, J, K = conv1_weight.shape + if I > 3: + assert conv1_weight.shape[1] % 3 == 0 + # For models with space2depth stems + conv1_weight = conv1_weight.reshape(O, I // 3, 3, J, K) + conv1_weight = conv1_weight.sum(dim=2, keepdim=False) + else: + conv1_weight = conv1_weight.sum(dim=1, keepdim=True) + conv1_weight = conv1_weight.to(conv1_type) + state_dict[conv1_name + '.weight'] = conv1_weight + elif in_chans != 3: + conv1_name = cfg['first_conv'] + conv1_weight = state_dict[conv1_name + '.weight'] + conv1_type = conv1_weight.dtype + conv1_weight = conv1_weight.float() + O, I, J, K = conv1_weight.shape + if I == 3: + _logger.warning('Deleting first conv (%s) from pretrained weights.' % conv1_name) + del state_dict[conv1_name + '.weight'] + strict = False + else: + # NOTE this strategy should be better than random init, but there could be other combinations of + # the original RGB input layer weights that'd work better for specific cases. + _logger.info('Repeating first conv (%s) weights in channel dim.' % conv1_name) + repeat = int(math.ceil(in_chans / 3)) + conv1_weight = conv1_weight.repeat(1, repeat, 1, 1)[:, :in_chans, :, :] + conv1_weight *= (3 / float(in_chans)) + conv1_weight = conv1_weight.to(conv1_type) + state_dict[conv1_name + '.weight'] = conv1_weight + + classifier_name = cfg['classifier'] + if num_classes == 1000 and cfg['num_classes'] == 1001: + # special case for imagenet trained models with extra background class in pretrained weights + classifier_weight = state_dict[classifier_name + '.weight'] + state_dict[classifier_name + '.weight'] = classifier_weight[1:] + classifier_bias = state_dict[classifier_name + '.bias'] + state_dict[classifier_name + '.bias'] = classifier_bias[1:] + elif num_classes != cfg['num_classes']: + # completely discard fully connected for all other differences between pretrained and created model + del state_dict[classifier_name + '.weight'] + del state_dict[classifier_name + '.bias'] + strict = False + + + if pos_embed_interp: + n, c, hw = state_dict['pos_embed'].transpose(1, 2).shape + h = w = int(math.sqrt(hw)) + pos_embed_weight = state_dict['pos_embed'][:, (-h * w):] + pos_embed_weight = pos_embed_weight.transpose(1,2) + n, c, hw = pos_embed_weight.shape + h = w = int(math.sqrt(hw)) + pos_embed_weight = pos_embed_weight.view(n,c,h,w) + + pos_embed_weight = F.interpolate(pos_embed_weight, size=int(math.sqrt(num_patches)), mode='bilinear', align_corners=align_corners) + pos_embed_weight = pos_embed_weight.view(n,c,-1).transpose(1,2) + + cls_token_weight = state_dict['pos_embed'][:,0].unsqueeze(1) + + state_dict['pos_embed'] = torch.cat((cls_token_weight, pos_embed_weight), dim=1) + + model.load_state_dict(state_dict, strict=strict) diff --git a/mmseg/models/backbones/hrnet.py b/mmseg/models/backbones/hrnet.py new file mode 100644 index 0000000000000000000000000000000000000000..33f3ba86d884bc53d1e27dc491604dd30d317161 --- /dev/null +++ b/mmseg/models/backbones/hrnet.py @@ -0,0 +1,555 @@ +import torch.nn as nn +from mmcv.cnn import (build_conv_layer, build_norm_layer, constant_init, + kaiming_init) +from mmcv.runner import load_checkpoint +from mmcv.utils.parrots_wrapper import _BatchNorm + +from mmseg.ops import Upsample, resize +from mmseg.utils import get_root_logger +from ..builder import BACKBONES +from .resnet import BasicBlock, Bottleneck + + +class HRModule(nn.Module): + """High-Resolution Module for HRNet. + + In this module, every branch has 4 BasicBlocks/Bottlenecks. Fusion/Exchange + is in this module. + """ + + def __init__(self, + num_branches, + blocks, + num_blocks, + in_channels, + num_channels, + multiscale_output=True, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True)): + super(HRModule, self).__init__() + self._check_branches(num_branches, num_blocks, in_channels, + num_channels) + + self.in_channels = in_channels + self.num_branches = num_branches + + self.multiscale_output = multiscale_output + self.norm_cfg = norm_cfg + self.conv_cfg = conv_cfg + self.with_cp = with_cp + self.branches = self._make_branches(num_branches, blocks, num_blocks, + num_channels) + self.fuse_layers = self._make_fuse_layers() + self.relu = nn.ReLU(inplace=False) + + def _check_branches(self, num_branches, num_blocks, in_channels, + num_channels): + """Check branches configuration.""" + if num_branches != len(num_blocks): + error_msg = f'NUM_BRANCHES({num_branches}) <> NUM_BLOCKS(' \ + f'{len(num_blocks)})' + raise ValueError(error_msg) + + if num_branches != len(num_channels): + error_msg = f'NUM_BRANCHES({num_branches}) <> NUM_CHANNELS(' \ + f'{len(num_channels)})' + raise ValueError(error_msg) + + if num_branches != len(in_channels): + error_msg = f'NUM_BRANCHES({num_branches}) <> NUM_INCHANNELS(' \ + f'{len(in_channels)})' + raise ValueError(error_msg) + + def _make_one_branch(self, + branch_index, + block, + num_blocks, + num_channels, + stride=1): + """Build one branch.""" + downsample = None + if stride != 1 or \ + self.in_channels[branch_index] != \ + num_channels[branch_index] * block.expansion: + downsample = nn.Sequential( + build_conv_layer( + self.conv_cfg, + self.in_channels[branch_index], + num_channels[branch_index] * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + build_norm_layer(self.norm_cfg, num_channels[branch_index] * + block.expansion)[1]) + + layers = [] + layers.append( + block( + self.in_channels[branch_index], + num_channels[branch_index], + stride, + downsample=downsample, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + self.in_channels[branch_index] = \ + num_channels[branch_index] * block.expansion + for i in range(1, num_blocks[branch_index]): + layers.append( + block( + self.in_channels[branch_index], + num_channels[branch_index], + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + + return nn.Sequential(*layers) + + def _make_branches(self, num_branches, block, num_blocks, num_channels): + """Build multiple branch.""" + branches = [] + + for i in range(num_branches): + branches.append( + self._make_one_branch(i, block, num_blocks, num_channels)) + + return nn.ModuleList(branches) + + def _make_fuse_layers(self): + """Build fuse layer.""" + if self.num_branches == 1: + return None + + num_branches = self.num_branches + in_channels = self.in_channels + fuse_layers = [] + num_out_branches = num_branches if self.multiscale_output else 1 + for i in range(num_out_branches): + fuse_layer = [] + for j in range(num_branches): + if j > i: + fuse_layer.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[i], + kernel_size=1, + stride=1, + padding=0, + bias=False), + build_norm_layer(self.norm_cfg, in_channels[i])[1], + # we set align_corners=False for HRNet + Upsample( + scale_factor=2**(j - i), + mode='bilinear', + align_corners=False))) + elif j == i: + fuse_layer.append(None) + else: + conv_downsamples = [] + for k in range(i - j): + if k == i - j - 1: + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[i], + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + in_channels[i])[1])) + else: + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[j], + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + in_channels[j])[1], + nn.ReLU(inplace=False))) + fuse_layer.append(nn.Sequential(*conv_downsamples)) + fuse_layers.append(nn.ModuleList(fuse_layer)) + + return nn.ModuleList(fuse_layers) + + def forward(self, x): + """Forward function.""" + if self.num_branches == 1: + return [self.branches[0](x[0])] + + for i in range(self.num_branches): + x[i] = self.branches[i](x[i]) + + x_fuse = [] + for i in range(len(self.fuse_layers)): + y = 0 + for j in range(self.num_branches): + if i == j: + y += x[j] + elif j > i: + y = y + resize( + self.fuse_layers[i][j](x[j]), + size=x[i].shape[2:], + mode='bilinear', + align_corners=False) + else: + y += self.fuse_layers[i][j](x[j]) + x_fuse.append(self.relu(y)) + return x_fuse + + +@BACKBONES.register_module() +class HRNet(nn.Module): + """HRNet backbone. + + High-Resolution Representations for Labeling Pixels and Regions + arXiv: https://arxiv.org/abs/1904.04514 + + Args: + extra (dict): detailed configuration for each stage of HRNet. + in_channels (int): Number of input image channels. Normally 3. + conv_cfg (dict): dictionary to construct and config conv layer. + norm_cfg (dict): dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): whether to use zero init for last norm layer + in resblocks to let them behave as identity. + + Example: + >>> from mmseg.models import HRNet + >>> import torch + >>> extra = dict( + >>> stage1=dict( + >>> num_modules=1, + >>> num_branches=1, + >>> block='BOTTLENECK', + >>> num_blocks=(4, ), + >>> num_channels=(64, )), + >>> stage2=dict( + >>> num_modules=1, + >>> num_branches=2, + >>> block='BASIC', + >>> num_blocks=(4, 4), + >>> num_channels=(32, 64)), + >>> stage3=dict( + >>> num_modules=4, + >>> num_branches=3, + >>> block='BASIC', + >>> num_blocks=(4, 4, 4), + >>> num_channels=(32, 64, 128)), + >>> stage4=dict( + >>> num_modules=3, + >>> num_branches=4, + >>> block='BASIC', + >>> num_blocks=(4, 4, 4, 4), + >>> num_channels=(32, 64, 128, 256))) + >>> self = HRNet(extra, in_channels=1) + >>> self.eval() + >>> inputs = torch.rand(1, 1, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 32, 8, 8) + (1, 64, 4, 4) + (1, 128, 2, 2) + (1, 256, 1, 1) + """ + + blocks_dict = {'BASIC': BasicBlock, 'BOTTLENECK': Bottleneck} + + def __init__(self, + extra, + in_channels=3, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + with_cp=False, + zero_init_residual=False): + super(HRNet, self).__init__() + self.extra = extra + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.norm_eval = norm_eval + self.with_cp = with_cp + self.zero_init_residual = zero_init_residual + + # stem net + self.norm1_name, norm1 = build_norm_layer(self.norm_cfg, 64, postfix=1) + self.norm2_name, norm2 = build_norm_layer(self.norm_cfg, 64, postfix=2) + + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + 64, + kernel_size=3, + stride=2, + padding=1, + bias=False) + + self.add_module(self.norm1_name, norm1) + self.conv2 = build_conv_layer( + self.conv_cfg, + 64, + 64, + kernel_size=3, + stride=2, + padding=1, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.relu = nn.ReLU(inplace=True) + + # stage 1 + self.stage1_cfg = self.extra['stage1'] + num_channels = self.stage1_cfg['num_channels'][0] + block_type = self.stage1_cfg['block'] + num_blocks = self.stage1_cfg['num_blocks'][0] + + block = self.blocks_dict[block_type] + stage1_out_channels = num_channels * block.expansion + self.layer1 = self._make_layer(block, 64, num_channels, num_blocks) + + # stage 2 + self.stage2_cfg = self.extra['stage2'] + num_channels = self.stage2_cfg['num_channels'] + block_type = self.stage2_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition1 = self._make_transition_layer([stage1_out_channels], + num_channels) + self.stage2, pre_stage_channels = self._make_stage( + self.stage2_cfg, num_channels) + + # stage 3 + self.stage3_cfg = self.extra['stage3'] + num_channels = self.stage3_cfg['num_channels'] + block_type = self.stage3_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition2 = self._make_transition_layer(pre_stage_channels, + num_channels) + self.stage3, pre_stage_channels = self._make_stage( + self.stage3_cfg, num_channels) + + # stage 4 + self.stage4_cfg = self.extra['stage4'] + num_channels = self.stage4_cfg['num_channels'] + block_type = self.stage4_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition3 = self._make_transition_layer(pre_stage_channels, + num_channels) + self.stage4, pre_stage_channels = self._make_stage( + self.stage4_cfg, num_channels) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: the normalization layer named "norm2" """ + return getattr(self, self.norm2_name) + + def _make_transition_layer(self, num_channels_pre_layer, + num_channels_cur_layer): + """Make transition layer.""" + num_branches_cur = len(num_channels_cur_layer) + num_branches_pre = len(num_channels_pre_layer) + + transition_layers = [] + for i in range(num_branches_cur): + if i < num_branches_pre: + if num_channels_cur_layer[i] != num_channels_pre_layer[i]: + transition_layers.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + num_channels_pre_layer[i], + num_channels_cur_layer[i], + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + num_channels_cur_layer[i])[1], + nn.ReLU(inplace=True))) + else: + transition_layers.append(None) + else: + conv_downsamples = [] + for j in range(i + 1 - num_branches_pre): + in_channels = num_channels_pre_layer[-1] + out_channels = num_channels_cur_layer[i] \ + if j == i - num_branches_pre else in_channels + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels, + out_channels, + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, out_channels)[1], + nn.ReLU(inplace=True))) + transition_layers.append(nn.Sequential(*conv_downsamples)) + + return nn.ModuleList(transition_layers) + + def _make_layer(self, block, inplanes, planes, blocks, stride=1): + """Make each layer.""" + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = nn.Sequential( + build_conv_layer( + self.conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + build_norm_layer(self.norm_cfg, planes * block.expansion)[1]) + + layers = [] + layers.append( + block( + inplanes, + planes, + stride, + downsample=downsample, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append( + block( + inplanes, + planes, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + + return nn.Sequential(*layers) + + def _make_stage(self, layer_config, in_channels, multiscale_output=True): + """Make each stage.""" + num_modules = layer_config['num_modules'] + num_branches = layer_config['num_branches'] + num_blocks = layer_config['num_blocks'] + num_channels = layer_config['num_channels'] + block = self.blocks_dict[layer_config['block']] + + hr_modules = [] + for i in range(num_modules): + # multi_scale_output is only used for the last module + if not multiscale_output and i == num_modules - 1: + reset_multiscale_output = False + else: + reset_multiscale_output = True + + hr_modules.append( + HRModule( + num_branches, + block, + num_blocks, + in_channels, + num_channels, + reset_multiscale_output, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg)) + + return nn.Sequential(*hr_modules), in_channels + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + + if self.zero_init_residual: + for m in self.modules(): + if isinstance(m, Bottleneck): + constant_init(m.norm3, 0) + elif isinstance(m, BasicBlock): + constant_init(m.norm2, 0) + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x): + """Forward function.""" + + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + x = self.conv2(x) + x = self.norm2(x) + x = self.relu(x) + x = self.layer1(x) + + x_list = [] + for i in range(self.stage2_cfg['num_branches']): + if self.transition1[i] is not None: + x_list.append(self.transition1[i](x)) + else: + x_list.append(x) + y_list = self.stage2(x_list) + + x_list = [] + for i in range(self.stage3_cfg['num_branches']): + if self.transition2[i] is not None: + x_list.append(self.transition2[i](y_list[-1])) + else: + x_list.append(y_list[i]) + y_list = self.stage3(x_list) + + x_list = [] + for i in range(self.stage4_cfg['num_branches']): + if self.transition3[i] is not None: + x_list.append(self.transition3[i](y_list[-1])) + else: + x_list.append(y_list[i]) + y_list = self.stage4(x_list) + + return y_list + + def train(self, mode=True): + """Convert the model into training mode whill keeping the normalization + layer freezed.""" + super(HRNet, self).train(mode) + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmseg/models/backbones/layers/__init__.py b/mmseg/models/backbones/layers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..afd5f348b48afa6da4570255c269c73c3c73157e --- /dev/null +++ b/mmseg/models/backbones/layers/__init__.py @@ -0,0 +1,3 @@ +from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple +from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path +from .weight_init import trunc_normal_ \ No newline at end of file diff --git a/mmseg/models/backbones/layers/drop.py b/mmseg/models/backbones/layers/drop.py new file mode 100644 index 0000000000000000000000000000000000000000..6de9e3f729f7f1ca29d4511f6c64733d3169fbec --- /dev/null +++ b/mmseg/models/backbones/layers/drop.py @@ -0,0 +1,168 @@ +""" DropBlock, DropPath + +PyTorch implementations of DropBlock and DropPath (Stochastic Depth) regularization layers. + +Papers: +DropBlock: A regularization method for convolutional networks (https://arxiv.org/abs/1810.12890) + +Deep Networks with Stochastic Depth (https://arxiv.org/abs/1603.09382) + +Code: +DropBlock impl inspired by two Tensorflow impl that I liked: + - https://github.com/tensorflow/tpu/blob/master/models/official/resnet/resnet_model.py#L74 + - https://github.com/clovaai/assembled-cnn/blob/master/nets/blocks.py + +Hacked together by / Copyright 2020 Ross Wightman +""" +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def drop_block_2d( + x, drop_prob: float = 0.1, block_size: int = 7, gamma_scale: float = 1.0, + with_noise: bool = False, inplace: bool = False, batchwise: bool = False): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + + DropBlock with an experimental gaussian noise option. This layer has been tested on a few training + runs with success, but needs further validation and possibly optimization for lower runtime impact. + """ + B, C, H, W = x.shape + total_size = W * H + clipped_block_size = min(block_size, min(W, H)) + # seed_drop_rate, the gamma parameter + gamma = gamma_scale * drop_prob * total_size / clipped_block_size ** 2 / ( + (W - block_size + 1) * (H - block_size + 1)) + + # Forces the block to be inside the feature map. + w_i, h_i = torch.meshgrid(torch.arange(W).to(x.device), torch.arange(H).to(x.device)) + valid_block = ((w_i >= clipped_block_size // 2) & (w_i < W - (clipped_block_size - 1) // 2)) & \ + ((h_i >= clipped_block_size // 2) & (h_i < H - (clipped_block_size - 1) // 2)) + valid_block = torch.reshape(valid_block, (1, 1, H, W)).to(dtype=x.dtype) + + if batchwise: + # one mask for whole batch, quite a bit faster + uniform_noise = torch.rand((1, C, H, W), dtype=x.dtype, device=x.device) + else: + uniform_noise = torch.rand_like(x) + block_mask = ((2 - gamma - valid_block + uniform_noise) >= 1).to(dtype=x.dtype) + block_mask = -F.max_pool2d( + -block_mask, + kernel_size=clipped_block_size, # block_size, + stride=1, + padding=clipped_block_size // 2) + + if with_noise: + normal_noise = torch.randn((1, C, H, W), dtype=x.dtype, device=x.device) if batchwise else torch.randn_like(x) + if inplace: + x.mul_(block_mask).add_(normal_noise * (1 - block_mask)) + else: + x = x * block_mask + normal_noise * (1 - block_mask) + else: + normalize_scale = (block_mask.numel() / block_mask.to(dtype=torch.float32).sum().add(1e-7)).to(x.dtype) + if inplace: + x.mul_(block_mask * normalize_scale) + else: + x = x * block_mask * normalize_scale + return x + + +def drop_block_fast_2d( + x: torch.Tensor, drop_prob: float = 0.1, block_size: int = 7, + gamma_scale: float = 1.0, with_noise: bool = False, inplace: bool = False, batchwise: bool = False): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + + DropBlock with an experimental gaussian noise option. Simplied from above without concern for valid + block mask at edges. + """ + B, C, H, W = x.shape + total_size = W * H + clipped_block_size = min(block_size, min(W, H)) + gamma = gamma_scale * drop_prob * total_size / clipped_block_size ** 2 / ( + (W - block_size + 1) * (H - block_size + 1)) + + if batchwise: + # one mask for whole batch, quite a bit faster + block_mask = torch.rand((1, C, H, W), dtype=x.dtype, device=x.device) < gamma + else: + # mask per batch element + block_mask = torch.rand_like(x) < gamma + block_mask = F.max_pool2d( + block_mask.to(x.dtype), kernel_size=clipped_block_size, stride=1, padding=clipped_block_size // 2) + + if with_noise: + normal_noise = torch.randn((1, C, H, W), dtype=x.dtype, device=x.device) if batchwise else torch.randn_like(x) + if inplace: + x.mul_(1. - block_mask).add_(normal_noise * block_mask) + else: + x = x * (1. - block_mask) + normal_noise * block_mask + else: + block_mask = 1 - block_mask + normalize_scale = (block_mask.numel() / block_mask.to(dtype=torch.float32).sum().add(1e-7)).to(dtype=x.dtype) + if inplace: + x.mul_(block_mask * normalize_scale) + else: + x = x * block_mask * normalize_scale + return x + + +class DropBlock2d(nn.Module): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + """ + def __init__(self, + drop_prob=0.1, + block_size=7, + gamma_scale=1.0, + with_noise=False, + inplace=False, + batchwise=False, + fast=True): + super(DropBlock2d, self).__init__() + self.drop_prob = drop_prob + self.gamma_scale = gamma_scale + self.block_size = block_size + self.with_noise = with_noise + self.inplace = inplace + self.batchwise = batchwise + self.fast = fast # FIXME finish comparisons of fast vs not + + def forward(self, x): + if not self.training or not self.drop_prob: + return x + if self.fast: + return drop_block_fast_2d( + x, self.drop_prob, self.block_size, self.gamma_scale, self.with_noise, self.inplace, self.batchwise) + else: + return drop_block_2d( + x, self.drop_prob, self.block_size, self.gamma_scale, self.with_noise, self.inplace, self.batchwise) + + +def drop_path(x, drop_prob: float = 0., training: bool = False): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + + This is the same as the DropConnect impl I created for EfficientNet, etc networks, however, + the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper... + See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for + changing the layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use + 'survival rate' as the argument. + + """ + if drop_prob == 0. or not training: + return x + keep_prob = 1 - drop_prob + shape = (x.shape[0],) + (1,) * (x.ndim - 1) # work with diff dim tensors, not just 2D ConvNets + random_tensor = keep_prob + torch.rand(shape, dtype=x.dtype, device=x.device) + random_tensor.floor_() # binarize + output = x.div(keep_prob) * random_tensor + return output + + +class DropPath(nn.Module): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + """ + def __init__(self, drop_prob=None): + super(DropPath, self).__init__() + self.drop_prob = drop_prob + + def forward(self, x): + return drop_path(x, self.drop_prob, self.training) diff --git a/mmseg/models/backbones/layers/helpers.py b/mmseg/models/backbones/layers/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..65521132c6a8d911e51e8f95abfeeba2f20843b1 --- /dev/null +++ b/mmseg/models/backbones/layers/helpers.py @@ -0,0 +1,26 @@ +""" Layer/Module Helpers + +Hacked together by / Copyright 2020 Ross Wightman +""" +from itertools import repeat +from torch._six import container_abcs + + +# From PyTorch internals +def _ntuple(n): + def parse(x): + if isinstance(x, container_abcs.Iterable): + return x + return tuple(repeat(x, n)) + return parse + + +to_1tuple = _ntuple(1) +to_2tuple = _ntuple(2) +to_3tuple = _ntuple(3) +to_4tuple = _ntuple(4) +to_ntuple = _ntuple + + + + diff --git a/mmseg/models/backbones/layers/weight_init.py b/mmseg/models/backbones/layers/weight_init.py new file mode 100644 index 0000000000000000000000000000000000000000..d731029ff1708776758d9af60e5b205818940a6d --- /dev/null +++ b/mmseg/models/backbones/layers/weight_init.py @@ -0,0 +1,60 @@ +import torch +import math +import warnings + + +def _no_grad_trunc_normal_(tensor, mean, std, a, b): + # Cut & paste from PyTorch official master until it's in a few official releases - RW + # Method based on https://people.sc.fsu.edu/~jburkardt/presentations/truncated_normal.pdf + def norm_cdf(x): + # Computes standard normal cumulative distribution function + return (1. + math.erf(x / math.sqrt(2.))) / 2. + + if (mean < a - 2 * std) or (mean > b + 2 * std): + warnings.warn("mean is more than 2 std from [a, b] in nn.init.trunc_normal_. " + "The distribution of values may be incorrect.", + stacklevel=2) + + with torch.no_grad(): + # Values are generated by using a truncated uniform distribution and + # then using the inverse CDF for the normal distribution. + # Get upper and lower cdf values + l = norm_cdf((a - mean) / std) + u = norm_cdf((b - mean) / std) + + # Uniformly fill tensor with values from [l, u], then translate to + # [2l-1, 2u-1]. + tensor.uniform_(2 * l - 1, 2 * u - 1) + + # Use inverse cdf transform for normal distribution to get truncated + # standard normal + tensor.erfinv_() + + # Transform to proper mean, std + tensor.mul_(std * math.sqrt(2.)) + tensor.add_(mean) + + # Clamp to ensure it's in the proper range + tensor.clamp_(min=a, max=b) + return tensor + + +def trunc_normal_(tensor, mean=0., std=1., a=-2., b=2.): + # type: (Tensor, float, float, float, float) -> Tensor + r"""Fills the input Tensor with values drawn from a truncated + normal distribution. The values are effectively drawn from the + normal distribution :math:`\mathcal{N}(\text{mean}, \text{std}^2)` + with values outside :math:`[a, b]` redrawn until they are within + the bounds. The method used for generating the random values works + best when :math:`a \leq \text{mean} \leq b`. + Args: + tensor: an n-dimensional `torch.Tensor` + mean: the mean of the normal distribution + std: the standard deviation of the normal distribution + a: the minimum cutoff value + b: the maximum cutoff value + Examples: + >>> w = torch.empty(3, 5) + >>> nn.init.trunc_normal_(w) + """ + return _no_grad_trunc_normal_(tensor, mean, std, a, b) diff --git a/mmseg/models/backbones/mobilenet_v2.py b/mmseg/models/backbones/mobilenet_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..5820b4b13c0019d67801c5f924650e928acca72e --- /dev/null +++ b/mmseg/models/backbones/mobilenet_v2.py @@ -0,0 +1,180 @@ +import logging + +import torch.nn as nn +from mmcv.cnn import ConvModule, constant_init, kaiming_init +from mmcv.runner import load_checkpoint +from torch.nn.modules.batchnorm import _BatchNorm + +from ..builder import BACKBONES +from ..utils import InvertedResidual, make_divisible + + +@BACKBONES.register_module() +class MobileNetV2(nn.Module): + """MobileNetV2 backbone. + + Args: + widen_factor (float): Width multiplier, multiply number of + channels in each layer by this amount. Default: 1.0. + strides (Sequence[int], optional): Strides of the first block of each + layer. If not specified, default config in ``arch_setting`` will + be used. + dilations (Sequence[int]): Dilation of each layer. + out_indices (None or Sequence[int]): Output from which stages. + Default: (7, ). + frozen_stages (int): Stages to be frozen (all param fixed). + Default: -1, which means not freezing any parameters. + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU6'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + """ + + # Parameters to build layers. 3 parameters are needed to construct a + # layer, from left to right: expand_ratio, channel, num_blocks. + arch_settings = [[1, 16, 1], [6, 24, 2], [6, 32, 3], [6, 64, 4], + [6, 96, 3], [6, 160, 3], [6, 320, 1]] + + def __init__(self, + widen_factor=1., + strides=(1, 2, 2, 2, 1, 2, 1), + dilations=(1, 1, 1, 1, 1, 1, 1), + out_indices=(1, 2, 4, 6), + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU6'), + norm_eval=False, + with_cp=False): + super(MobileNetV2, self).__init__() + self.widen_factor = widen_factor + self.strides = strides + self.dilations = dilations + assert len(strides) == len(dilations) == len(self.arch_settings) + self.out_indices = out_indices + for index in out_indices: + if index not in range(0, 7): + raise ValueError('the item in out_indices must in ' + f'range(0, 8). But received {index}') + + if frozen_stages not in range(-1, 7): + raise ValueError('frozen_stages must be in range(-1, 7). ' + f'But received {frozen_stages}') + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.norm_eval = norm_eval + self.with_cp = with_cp + + self.in_channels = make_divisible(32 * widen_factor, 8) + + self.conv1 = ConvModule( + in_channels=3, + out_channels=self.in_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.layers = [] + + for i, layer_cfg in enumerate(self.arch_settings): + expand_ratio, channel, num_blocks = layer_cfg + stride = self.strides[i] + dilation = self.dilations[i] + out_channels = make_divisible(channel * widen_factor, 8) + inverted_res_layer = self.make_layer( + out_channels=out_channels, + num_blocks=num_blocks, + stride=stride, + dilation=dilation, + expand_ratio=expand_ratio) + layer_name = f'layer{i + 1}' + self.add_module(layer_name, inverted_res_layer) + self.layers.append(layer_name) + + def make_layer(self, out_channels, num_blocks, stride, dilation, + expand_ratio): + """Stack InvertedResidual blocks to build a layer for MobileNetV2. + + Args: + out_channels (int): out_channels of block. + num_blocks (int): Number of blocks. + stride (int): Stride of the first block. + dilation (int): Dilation of the first block. + expand_ratio (int): Expand the number of channels of the + hidden layer in InvertedResidual by this ratio. + """ + layers = [] + for i in range(num_blocks): + layers.append( + InvertedResidual( + self.in_channels, + out_channels, + stride if i == 0 else 1, + expand_ratio=expand_ratio, + dilation=dilation if i == 0 else 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + with_cp=self.with_cp)) + self.in_channels = out_channels + + return nn.Sequential(*layers) + + def init_weights(self, pretrained=None): + if isinstance(pretrained, str): + logger = logging.getLogger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x): + x = self.conv1(x) + + outs = [] + for i, layer_name in enumerate(self.layers): + layer = getattr(self, layer_name) + x = layer(x) + if i in self.out_indices: + outs.append(x) + + if len(outs) == 1: + return outs[0] + else: + return tuple(outs) + + def _freeze_stages(self): + if self.frozen_stages >= 0: + for param in self.conv1.parameters(): + param.requires_grad = False + for i in range(1, self.frozen_stages + 1): + layer = getattr(self, f'layer{i}') + layer.eval() + for param in layer.parameters(): + param.requires_grad = False + + def train(self, mode=True): + super(MobileNetV2, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmseg/models/backbones/mobilenet_v3.py b/mmseg/models/backbones/mobilenet_v3.py new file mode 100644 index 0000000000000000000000000000000000000000..104d8328af1536632770faa9e3d1827b1a364d5f --- /dev/null +++ b/mmseg/models/backbones/mobilenet_v3.py @@ -0,0 +1,255 @@ +import logging + +import mmcv +import torch.nn as nn +from mmcv.cnn import ConvModule, constant_init, kaiming_init +from mmcv.cnn.bricks import Conv2dAdaptivePadding +from mmcv.runner import load_checkpoint +from torch.nn.modules.batchnorm import _BatchNorm + +from ..builder import BACKBONES +from ..utils import InvertedResidualV3 as InvertedResidual + + +@BACKBONES.register_module() +class MobileNetV3(nn.Module): + """MobileNetV3 backbone. + + This backbone is the improved implementation of `Searching for MobileNetV3 + `_. + + Args: + arch (str): Architechture of mobilnetv3, from {'small', 'large'}. + Default: 'small'. + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + out_indices (tuple[int]): Output from which layer. + Default: (0, 1, 12). + frozen_stages (int): Stages to be frozen (all param fixed). + Defualt: -1, which means not freezing any parameters. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save + some memory while slowing down the training speed. + Defualt: False. + """ + # Parameters to build each block: + # [kernel size, mid channels, out channels, with_se, act type, stride] + arch_settings = { + 'small': [[3, 16, 16, True, 'ReLU', 2], # block0 layer1 os=4 + [3, 72, 24, False, 'ReLU', 2], # block1 layer2 os=8 + [3, 88, 24, False, 'ReLU', 1], + [5, 96, 40, True, 'HSwish', 2], # block2 layer4 os=16 + [5, 240, 40, True, 'HSwish', 1], + [5, 240, 40, True, 'HSwish', 1], + [5, 120, 48, True, 'HSwish', 1], # block3 layer7 os=16 + [5, 144, 48, True, 'HSwish', 1], + [5, 288, 96, True, 'HSwish', 2], # block4 layer9 os=32 + [5, 576, 96, True, 'HSwish', 1], + [5, 576, 96, True, 'HSwish', 1]], + 'large': [[3, 16, 16, False, 'ReLU', 1], # block0 layer1 os=2 + [3, 64, 24, False, 'ReLU', 2], # block1 layer2 os=4 + [3, 72, 24, False, 'ReLU', 1], + [5, 72, 40, True, 'ReLU', 2], # block2 layer4 os=8 + [5, 120, 40, True, 'ReLU', 1], + [5, 120, 40, True, 'ReLU', 1], + [3, 240, 80, False, 'HSwish', 2], # block3 layer7 os=16 + [3, 200, 80, False, 'HSwish', 1], + [3, 184, 80, False, 'HSwish', 1], + [3, 184, 80, False, 'HSwish', 1], + [3, 480, 112, True, 'HSwish', 1], # block4 layer11 os=16 + [3, 672, 112, True, 'HSwish', 1], + [5, 672, 160, True, 'HSwish', 2], # block5 layer13 os=32 + [5, 960, 160, True, 'HSwish', 1], + [5, 960, 160, True, 'HSwish', 1]] + } # yapf: disable + + def __init__(self, + arch='small', + conv_cfg=None, + norm_cfg=dict(type='BN'), + out_indices=(0, 1, 12), + frozen_stages=-1, + reduction_factor=1, + norm_eval=False, + with_cp=False): + super(MobileNetV3, self).__init__() + assert arch in self.arch_settings + assert isinstance(reduction_factor, int) and reduction_factor > 0 + assert mmcv.is_tuple_of(out_indices, int) + for index in out_indices: + if index not in range(0, len(self.arch_settings[arch]) + 2): + raise ValueError( + 'the item in out_indices must in ' + f'range(0, {len(self.arch_settings[arch])+2}). ' + f'But received {index}') + + if frozen_stages not in range(-1, len(self.arch_settings[arch]) + 2): + raise ValueError('frozen_stages must be in range(-1, ' + f'{len(self.arch_settings[arch])+2}). ' + f'But received {frozen_stages}') + self.arch = arch + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.reduction_factor = reduction_factor + self.norm_eval = norm_eval + self.with_cp = with_cp + self.layers = self._make_layer() + + def _make_layer(self): + layers = [] + + # build the first layer (layer0) + in_channels = 16 + layer = ConvModule( + in_channels=3, + out_channels=in_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=dict(type='Conv2dAdaptivePadding'), + norm_cfg=self.norm_cfg, + act_cfg=dict(type='HSwish')) + self.add_module('layer0', layer) + layers.append('layer0') + + layer_setting = self.arch_settings[self.arch] + for i, params in enumerate(layer_setting): + (kernel_size, mid_channels, out_channels, with_se, act, + stride) = params + + if self.arch == 'large' and i >= 12 or self.arch == 'small' and \ + i >= 8: + mid_channels = mid_channels // self.reduction_factor + out_channels = out_channels // self.reduction_factor + + if with_se: + se_cfg = dict( + channels=mid_channels, + ratio=4, + act_cfg=(dict(type='ReLU'), + dict(type='HSigmoid', bias=3.0, divisor=6.0))) + else: + se_cfg = None + + layer = InvertedResidual( + in_channels=in_channels, + out_channels=out_channels, + mid_channels=mid_channels, + kernel_size=kernel_size, + stride=stride, + se_cfg=se_cfg, + with_expand_conv=(in_channels != mid_channels), + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=dict(type=act), + with_cp=self.with_cp) + in_channels = out_channels + layer_name = 'layer{}'.format(i + 1) + self.add_module(layer_name, layer) + layers.append(layer_name) + + # build the last layer + # block5 layer12 os=32 for small model + # block6 layer16 os=32 for large model + layer = ConvModule( + in_channels=in_channels, + out_channels=576 if self.arch == 'small' else 960, + kernel_size=1, + stride=1, + dilation=4, + padding=0, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=dict(type='HSwish')) + layer_name = 'layer{}'.format(len(layer_setting) + 1) + self.add_module(layer_name, layer) + layers.append(layer_name) + + # next, convert backbone MobileNetV3 to a semantic segmentation version + if self.arch == 'small': + self.layer4.depthwise_conv.conv.stride = (1, 1) + self.layer9.depthwise_conv.conv.stride = (1, 1) + for i in range(4, len(layers)): + layer = getattr(self, layers[i]) + if isinstance(layer, InvertedResidual): + modified_module = layer.depthwise_conv.conv + else: + modified_module = layer.conv + + if i < 9: + modified_module.dilation = (2, 2) + pad = 2 + else: + modified_module.dilation = (4, 4) + pad = 4 + + if not isinstance(modified_module, Conv2dAdaptivePadding): + # Adjust padding + pad *= (modified_module.kernel_size[0] - 1) // 2 + modified_module.padding = (pad, pad) + else: + self.layer7.depthwise_conv.conv.stride = (1, 1) + self.layer13.depthwise_conv.conv.stride = (1, 1) + for i in range(7, len(layers)): + layer = getattr(self, layers[i]) + if isinstance(layer, InvertedResidual): + modified_module = layer.depthwise_conv.conv + else: + modified_module = layer.conv + + if i < 13: + modified_module.dilation = (2, 2) + pad = 2 + else: + modified_module.dilation = (4, 4) + pad = 4 + + if not isinstance(modified_module, Conv2dAdaptivePadding): + # Adjust padding + pad *= (modified_module.kernel_size[0] - 1) // 2 + modified_module.padding = (pad, pad) + + return layers + + def init_weights(self, pretrained=None): + if isinstance(pretrained, str): + logger = logging.getLogger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, nn.BatchNorm2d): + constant_init(m, 1) + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x): + outs = [] + for i, layer_name in enumerate(self.layers): + layer = getattr(self, layer_name) + x = layer(x) + if i in self.out_indices: + outs.append(x) + return outs + + def _freeze_stages(self): + for i in range(self.frozen_stages + 1): + layer = getattr(self, f'layer{i}') + layer.eval() + for param in layer.parameters(): + param.requires_grad = False + + def train(self, mode=True): + super(MobileNetV3, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmseg/models/backbones/pvt.py b/mmseg/models/backbones/pvt.py new file mode 100644 index 0000000000000000000000000000000000000000..cc4ac2909decc7cf9fcd7f72ffa02a83d0ead75d --- /dev/null +++ b/mmseg/models/backbones/pvt.py @@ -0,0 +1,336 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial + +from timm.models.layers import DropPath, to_2tuple, trunc_normal_ +from timm.models.registry import register_model +from timm.models.vision_transformer import _cfg +from ..builder import BACKBONES +from mmseg.utils import get_root_logger +from mmcv.runner import load_checkpoint + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0., sr_ratio=1): + super().__init__() + assert dim % num_heads == 0, f"dim {dim} should be divided by num_heads {num_heads}." + + self.dim = dim + self.num_heads = num_heads + head_dim = dim // num_heads + self.scale = qk_scale or head_dim ** -0.5 + + self.q = nn.Linear(dim, dim, bias=qkv_bias) + self.kv = nn.Linear(dim, dim * 2, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + self.sr_ratio = sr_ratio + if sr_ratio > 1: + self.sr = nn.Conv2d(dim, dim, kernel_size=sr_ratio, stride=sr_ratio) + self.norm = nn.LayerNorm(dim) + + def forward(self, x, H, W): + B, N, C = x.shape + q = self.q(x).reshape(B, N, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3) + + if self.sr_ratio > 1: + x_ = x.permute(0, 2, 1).reshape(B, C, H, W) + x_ = self.sr(x_).reshape(B, C, -1).permute(0, 2, 1) + x_ = self.norm(x_) + kv = self.kv(x_).reshape(B, -1, 2, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + else: + kv = self.kv(x).reshape(B, -1, 2, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + k, v = kv[0], kv[1] + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + + return x + + +class Block(nn.Module): + + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm, sr_ratio=1): + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = Attention( + dim, + num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, + attn_drop=attn_drop, proj_drop=drop, sr_ratio=sr_ratio) + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + def forward(self, x, H, W): + x = x + self.drop_path(self.attn(self.norm1(x), H, W)) + x = x + self.drop_path(self.mlp(self.norm2(x))) + + return x + + +class PatchEmbed(nn.Module): + """ Image to Patch Embedding + """ + + def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + + self.img_size = img_size + self.patch_size = patch_size + assert img_size[0] % patch_size[0] == 0 and img_size[1] % patch_size[1] == 0, \ + f"img_size {img_size} should be divided by patch_size {patch_size}." + self.H, self.W = img_size[0] // patch_size[0], img_size[1] // patch_size[1] + self.num_patches = self.H * self.W + self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) + self.norm = nn.LayerNorm(embed_dim) + + def forward(self, x): + B, C, H, W = x.shape + + x = self.proj(x).flatten(2).transpose(1, 2) + x = self.norm(x) + H, W = H // self.patch_size[0], W // self.patch_size[1] + + return x, (H, W) + + +class PyramidVisionTransformer(nn.Module): + def __init__(self, img_size=224, patch_size=16, in_chans=3, num_classes=1000, embed_dims=[64, 128, 256, 512], + num_heads=[1, 2, 4, 8], mlp_ratios=[4, 4, 4, 4], qkv_bias=False, qk_scale=None, drop_rate=0., + attn_drop_rate=0., drop_path_rate=0., norm_layer=nn.LayerNorm, + depths=[3, 4, 6, 3], sr_ratios=[8, 4, 2, 1], F4=False): + super().__init__() + self.num_classes = num_classes + self.depths = depths + self.F4 = F4 + + # patch_embed + self.patch_embed1 = PatchEmbed(img_size=img_size, patch_size=patch_size, in_chans=in_chans, + embed_dim=embed_dims[0]) + self.patch_embed2 = PatchEmbed(img_size=img_size // 4, patch_size=2, in_chans=embed_dims[0], + embed_dim=embed_dims[1]) + self.patch_embed3 = PatchEmbed(img_size=img_size // 8, patch_size=2, in_chans=embed_dims[1], + embed_dim=embed_dims[2]) + self.patch_embed4 = PatchEmbed(img_size=img_size // 16, patch_size=2, in_chans=embed_dims[2], + embed_dim=embed_dims[3]) + + # pos_embed + self.pos_embed1 = nn.Parameter(torch.zeros(1, self.patch_embed1.num_patches, embed_dims[0])) + self.pos_drop1 = nn.Dropout(p=drop_rate) + self.pos_embed2 = nn.Parameter(torch.zeros(1, self.patch_embed2.num_patches, embed_dims[1])) + self.pos_drop2 = nn.Dropout(p=drop_rate) + self.pos_embed3 = nn.Parameter(torch.zeros(1, self.patch_embed3.num_patches, embed_dims[2])) + self.pos_drop3 = nn.Dropout(p=drop_rate) + self.pos_embed4 = nn.Parameter(torch.zeros(1, self.patch_embed4.num_patches + 1, embed_dims[3])) + self.pos_drop4 = nn.Dropout(p=drop_rate) + + # transformer encoder + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] # stochastic depth decay rule + cur = 0 + self.block1 = nn.ModuleList([Block( + dim=embed_dims[0], num_heads=num_heads[0], mlp_ratio=mlp_ratios[0], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[0]) + for i in range(depths[0])]) + + cur += depths[0] + self.block2 = nn.ModuleList([Block( + dim=embed_dims[1], num_heads=num_heads[1], mlp_ratio=mlp_ratios[1], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[1]) + for i in range(depths[1])]) + + cur += depths[1] + self.block3 = nn.ModuleList([Block( + dim=embed_dims[2], num_heads=num_heads[2], mlp_ratio=mlp_ratios[2], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[2]) + for i in range(depths[2])]) + + cur += depths[2] + self.block4 = nn.ModuleList([Block( + dim=embed_dims[3], num_heads=num_heads[3], mlp_ratio=mlp_ratios[3], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[3]) + for i in range(depths[3])]) + + # init weights + trunc_normal_(self.pos_embed1, std=.02) + trunc_normal_(self.pos_embed2, std=.02) + trunc_normal_(self.pos_embed3, std=.02) + trunc_normal_(self.pos_embed4, std=.02) + self.apply(self._init_weights) + + def init_weights(self, pretrained=None): + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, map_location='cpu', strict=False, logger=logger) + + def reset_drop_path(self, drop_path_rate): + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(self.depths))] + cur = 0 + for i in range(self.depths[0]): + self.block1[i].drop_path.drop_prob = dpr[cur + i] + + cur += self.depths[0] + for i in range(self.depths[1]): + self.block2[i].drop_path.drop_prob = dpr[cur + i] + + cur += self.depths[1] + for i in range(self.depths[2]): + self.block3[i].drop_path.drop_prob = dpr[cur + i] + + cur += self.depths[2] + for i in range(self.depths[3]): + self.block4[i].drop_path.drop_prob = dpr[cur + i] + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + def _get_pos_embed(self, pos_embed, patch_embed, H, W): + if H * W == self.patch_embed1.num_patches: + return pos_embed + else: + return F.interpolate( + pos_embed.reshape(1, patch_embed.H, patch_embed.W, -1).permute(0, 3, 1, 2), + size=(H, W), mode="bilinear").reshape(1, -1, H * W).permute(0, 2, 1) + + def forward_features(self, x): + outs = [] + + B = x.shape[0] + + # stage 1 + x, (H, W) = self.patch_embed1(x) + pos_embed1 = self._get_pos_embed(self.pos_embed1, self.patch_embed1, H, W) + x = x + pos_embed1 + x = self.pos_drop1(x) + for blk in self.block1: + x = blk(x, H, W) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + # stage 2 + x, (H, W) = self.patch_embed2(x) + pos_embed2 = self._get_pos_embed(self.pos_embed2, self.patch_embed2, H, W) + x = x + pos_embed2 + x = self.pos_drop2(x) + for blk in self.block2: + x = blk(x, H, W) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + # stage 3 + x, (H, W) = self.patch_embed3(x) + pos_embed3 = self._get_pos_embed(self.pos_embed3, self.patch_embed3, H, W) + x = x + pos_embed3 + x = self.pos_drop3(x) + for blk in self.block3: + x = blk(x, H, W) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + # stage 4 + x, (H, W) = self.patch_embed4(x) + pos_embed4 = self._get_pos_embed(self.pos_embed4[:, 1:], self.patch_embed4, H, W) + x = x + pos_embed4 + x = self.pos_drop4(x) + for blk in self.block4: + x = blk(x, H, W) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + return outs + + def forward(self, x): + x = self.forward_features(x) + + if self.F4: + x = x[3:4] + + return x + + +def _conv_filter(state_dict, patch_size=16): + """ convert patch embedding weight from manual patchify + linear proj to conv""" + out_dict = {} + for k, v in state_dict.items(): + if 'patch_embed.proj.weight' in k: + v = v.reshape((v.shape[0], 3, patch_size, patch_size)) + out_dict[k] = v + + return out_dict + + +@BACKBONES.register_module() +class pvt_tiny(PyramidVisionTransformer): + def __init__(self, **kwargs): + super(pvt_tiny, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[8, 8, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[2, 2, 2, 2], + sr_ratios=[8, 4, 2, 1], drop_rate=0.0, drop_path_rate=0.2) + + +@BACKBONES.register_module() +class pvt_small(PyramidVisionTransformer): + def __init__(self, **kwargs): + super(pvt_small, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[8, 8, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 4, 6, 3], + sr_ratios=[8, 4, 2, 1], drop_rate=0.0, drop_path_rate=0.2) + + +@BACKBONES.register_module() +class pvt_small_f4(PyramidVisionTransformer): + def __init__(self, **kwargs): + super(pvt_small_f4, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[8, 8, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 4, 6, 3], + sr_ratios=[8, 4, 2, 1], drop_rate=0.0, drop_path_rate=0.2, F4=True) + + +@BACKBONES.register_module() +class pvt_large(PyramidVisionTransformer): + def __init__(self, **kwargs): + super(pvt_large, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[8, 8, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 8, 27, 3], + sr_ratios=[8, 4, 2, 1], drop_rate=0.0, drop_path_rate=0.2) diff --git a/mmseg/models/backbones/resnest.py b/mmseg/models/backbones/resnest.py new file mode 100644 index 0000000000000000000000000000000000000000..8931decb876e4d46407fd177a5248fe2554e4062 --- /dev/null +++ b/mmseg/models/backbones/resnest.py @@ -0,0 +1,314 @@ +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as cp +from mmcv.cnn import build_conv_layer, build_norm_layer + +from ..builder import BACKBONES +from ..utils import ResLayer +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNetV1d + + +class RSoftmax(nn.Module): + """Radix Softmax module in ``SplitAttentionConv2d``. + + Args: + radix (int): Radix of input. + groups (int): Groups of input. + """ + + def __init__(self, radix, groups): + super().__init__() + self.radix = radix + self.groups = groups + + def forward(self, x): + batch = x.size(0) + if self.radix > 1: + x = x.view(batch, self.groups, self.radix, -1).transpose(1, 2) + x = F.softmax(x, dim=1) + x = x.reshape(batch, -1) + else: + x = torch.sigmoid(x) + return x + + +class SplitAttentionConv2d(nn.Module): + """Split-Attention Conv2d in ResNeSt. + + Args: + in_channels (int): Same as nn.Conv2d. + out_channels (int): Same as nn.Conv2d. + kernel_size (int | tuple[int]): Same as nn.Conv2d. + stride (int | tuple[int]): Same as nn.Conv2d. + padding (int | tuple[int]): Same as nn.Conv2d. + dilation (int | tuple[int]): Same as nn.Conv2d. + groups (int): Same as nn.Conv2d. + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels. Default: 4. + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. Default: None. + dcn (dict): Config dict for DCN. Default: None. + """ + + def __init__(self, + in_channels, + channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + radix=2, + reduction_factor=4, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None): + super(SplitAttentionConv2d, self).__init__() + inter_channels = max(in_channels * radix // reduction_factor, 32) + self.radix = radix + self.groups = groups + self.channels = channels + self.with_dcn = dcn is not None + self.dcn = dcn + fallback_on_stride = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if self.with_dcn and not fallback_on_stride: + assert conv_cfg is None, 'conv_cfg must be None for DCN' + conv_cfg = dcn + self.conv = build_conv_layer( + conv_cfg, + in_channels, + channels * radix, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=groups * radix, + bias=False) + self.norm0_name, norm0 = build_norm_layer( + norm_cfg, channels * radix, postfix=0) + self.add_module(self.norm0_name, norm0) + self.relu = nn.ReLU(inplace=True) + self.fc1 = build_conv_layer( + None, channels, inter_channels, 1, groups=self.groups) + self.norm1_name, norm1 = build_norm_layer( + norm_cfg, inter_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.fc2 = build_conv_layer( + None, inter_channels, channels * radix, 1, groups=self.groups) + self.rsoftmax = RSoftmax(radix, groups) + + @property + def norm0(self): + """nn.Module: the normalization layer named "norm0" """ + return getattr(self, self.norm0_name) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + def forward(self, x): + x = self.conv(x) + x = self.norm0(x) + x = self.relu(x) + + batch, rchannel = x.shape[:2] + batch = x.size(0) + if self.radix > 1: + splits = x.view(batch, self.radix, -1, *x.shape[2:]) + gap = splits.sum(dim=1) + else: + gap = x + gap = F.adaptive_avg_pool2d(gap, 1) + gap = self.fc1(gap) + + gap = self.norm1(gap) + gap = self.relu(gap) + + atten = self.fc2(gap) + atten = self.rsoftmax(atten).view(batch, -1, 1, 1) + + if self.radix > 1: + attens = atten.view(batch, self.radix, -1, *atten.shape[2:]) + out = torch.sum(attens * splits, dim=1) + else: + out = atten * x + return out.contiguous() + + +class Bottleneck(_Bottleneck): + """Bottleneck block for ResNeSt. + + Args: + inplane (int): Input planes of this block. + planes (int): Middle planes of this block. + groups (int): Groups of conv2. + width_per_group (int): Width per group of conv2. 64x4d indicates + ``groups=64, width_per_group=4`` and 32x8d indicates + ``groups=32, width_per_group=8``. + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels in + SplitAttentionConv2d. Default: 4. + avg_down_stride (bool): Whether to use average pool for stride in + Bottleneck. Default: True. + kwargs (dict): Key word arguments for base class. + """ + expansion = 4 + + def __init__(self, + inplanes, + planes, + groups=1, + base_width=4, + base_channels=64, + radix=2, + reduction_factor=4, + avg_down_stride=True, + **kwargs): + """Bottleneck block for ResNeSt.""" + super(Bottleneck, self).__init__(inplanes, planes, **kwargs) + + if groups == 1: + width = self.planes + else: + width = math.floor(self.planes * + (base_width / base_channels)) * groups + + self.avg_down_stride = avg_down_stride and self.conv2_stride > 1 + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width, postfix=1) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + self.with_modulated_dcn = False + self.conv2 = SplitAttentionConv2d( + width, + width, + kernel_size=3, + stride=1 if self.avg_down_stride else self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + radix=radix, + reduction_factor=reduction_factor, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + dcn=self.dcn) + delattr(self, self.norm2_name) + + if self.avg_down_stride: + self.avd_layer = nn.AvgPool2d(3, self.conv2_stride, padding=1) + + self.conv3 = build_conv_layer( + self.conv_cfg, + width, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + def forward(self, x): + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + out = self.conv2(out) + + if self.avg_down_stride: + out = self.avd_layer(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +@BACKBONES.register_module() +class ResNeSt(ResNetV1d): + """ResNeSt backbone. + + Args: + groups (int): Number of groups of Bottleneck. Default: 1 + base_width (int): Base width of Bottleneck. Default: 4 + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels in + SplitAttentionConv2d. Default: 4. + avg_down_stride (bool): Whether to use average pool for stride in + Bottleneck. Default: True. + kwargs (dict): Keyword arguments for ResNet. + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)), + 200: (Bottleneck, (3, 24, 36, 3)) + } + + def __init__(self, + groups=1, + base_width=4, + radix=2, + reduction_factor=4, + avg_down_stride=True, + **kwargs): + self.groups = groups + self.base_width = base_width + self.radix = radix + self.reduction_factor = reduction_factor + self.avg_down_stride = avg_down_stride + super(ResNeSt, self).__init__(**kwargs) + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``.""" + return ResLayer( + groups=self.groups, + base_width=self.base_width, + base_channels=self.base_channels, + radix=self.radix, + reduction_factor=self.reduction_factor, + avg_down_stride=self.avg_down_stride, + **kwargs) diff --git a/mmseg/models/backbones/resnet.py b/mmseg/models/backbones/resnet.py new file mode 100644 index 0000000000000000000000000000000000000000..f6c4c08d4789163edc6c5e78aa8306e006fdd25e --- /dev/null +++ b/mmseg/models/backbones/resnet.py @@ -0,0 +1,688 @@ +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import (build_conv_layer, build_norm_layer, build_plugin_layer, + constant_init, kaiming_init) +from mmcv.runner import load_checkpoint +from mmcv.utils.parrots_wrapper import _BatchNorm + +from mmseg.utils import get_root_logger +from ..builder import BACKBONES +from ..utils import ResLayer + + +class BasicBlock(nn.Module): + """Basic block for ResNet.""" + + expansion = 1 + + def __init__(self, + inplanes, + planes, + stride=1, + dilation=1, + downsample=None, + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None): + super(BasicBlock, self).__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) + self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) + + self.conv1 = build_conv_layer( + conv_cfg, + inplanes, + planes, + 3, + stride=stride, + padding=dilation, + dilation=dilation, + bias=False) + self.add_module(self.norm1_name, norm1) + self.conv2 = build_conv_layer( + conv_cfg, planes, planes, 3, padding=1, bias=False) + self.add_module(self.norm2_name, norm2) + + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + self.dilation = dilation + self.with_cp = with_cp + + @property + def norm1(self): + """nn.Module: normalization layer after the first convolution layer""" + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: normalization layer after the second convolution layer""" + return getattr(self, self.norm2_name) + + def forward(self, x): + """Forward function.""" + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.norm2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + """Bottleneck block for ResNet. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if it is + "caffe", the stride-two layer is the first 1x1 conv layer. + """ + + expansion = 4 + + def __init__(self, + inplanes, + planes, + stride=1, + dilation=1, + downsample=None, + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None): + super(Bottleneck, self).__init__() + assert style in ['pytorch', 'caffe'] + assert dcn is None or isinstance(dcn, dict) + assert plugins is None or isinstance(plugins, list) + if plugins is not None: + allowed_position = ['after_conv1', 'after_conv2', 'after_conv3'] + assert all(p['position'] in allowed_position for p in plugins) + + self.inplanes = inplanes + self.planes = planes + self.stride = stride + self.dilation = dilation + self.style = style + self.with_cp = with_cp + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.dcn = dcn + self.with_dcn = dcn is not None + self.plugins = plugins + self.with_plugins = plugins is not None + + if self.with_plugins: + # collect plugins for conv1/conv2/conv3 + self.after_conv1_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv1' + ] + self.after_conv2_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv2' + ] + self.after_conv3_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv3' + ] + + if self.style == 'pytorch': + self.conv1_stride = 1 + self.conv2_stride = stride + else: + self.conv1_stride = stride + self.conv2_stride = 1 + + self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) + self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) + self.norm3_name, norm3 = build_norm_layer( + norm_cfg, planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + conv_cfg, + inplanes, + planes, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + fallback_on_stride = False + if self.with_dcn: + fallback_on_stride = dcn.pop('fallback_on_stride', False) + if not self.with_dcn or fallback_on_stride: + self.conv2 = build_conv_layer( + conv_cfg, + planes, + planes, + kernel_size=3, + stride=self.conv2_stride, + padding=dilation, + dilation=dilation, + bias=False) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + self.conv2 = build_conv_layer( + dcn, + planes, + planes, + kernel_size=3, + stride=self.conv2_stride, + padding=dilation, + dilation=dilation, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.conv3 = build_conv_layer( + conv_cfg, + planes, + planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + + if self.with_plugins: + self.after_conv1_plugin_names = self.make_block_plugins( + planes, self.after_conv1_plugins) + self.after_conv2_plugin_names = self.make_block_plugins( + planes, self.after_conv2_plugins) + self.after_conv3_plugin_names = self.make_block_plugins( + planes * self.expansion, self.after_conv3_plugins) + + def make_block_plugins(self, in_channels, plugins): + """make plugins for block. + + Args: + in_channels (int): Input channels of plugin. + plugins (list[dict]): List of plugins cfg to build. + + Returns: + list[str]: List of the names of plugin. + """ + assert isinstance(plugins, list) + plugin_names = [] + for plugin in plugins: + plugin = plugin.copy() + name, layer = build_plugin_layer( + plugin, + in_channels=in_channels, + postfix=plugin.pop('postfix', '')) + assert not hasattr(self, name), f'duplicate plugin {name}' + self.add_module(name, layer) + plugin_names.append(name) + return plugin_names + + def forward_plugin(self, x, plugin_names): + """Forward function for plugins.""" + out = x + for name in plugin_names: + out = getattr(self, name)(x) + return out + + @property + def norm1(self): + """nn.Module: normalization layer after the first convolution layer""" + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: normalization layer after the second convolution layer""" + return getattr(self, self.norm2_name) + + @property + def norm3(self): + """nn.Module: normalization layer after the third convolution layer""" + return getattr(self, self.norm3_name) + + def forward(self, x): + """Forward function.""" + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + out = self.conv2(out) + out = self.norm2(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +@BACKBONES.register_module() +class ResNet(nn.Module): + """ResNet backbone. + + Args: + depth (int): Depth of resnet, from {18, 34, 50, 101, 152}. + in_channels (int): Number of input image channels. Default" 3. + stem_channels (int): Number of stem channels. Default: 64. + base_channels (int): Number of base channels of res layer. Default: 64. + num_stages (int): Resnet stages, normally 4. + strides (Sequence[int]): Strides of the first block of each stage. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. + deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottleneck. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + -1 means not freezing any parameters. + norm_cfg (dict): Dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + plugins (list[dict]): List of plugins for stages, each dict contains: + + - cfg (dict, required): Cfg dict to build plugin. + + - position (str, required): Position inside block to insert plugin, + options: 'after_conv1', 'after_conv2', 'after_conv3'. + + - stages (tuple[bool], optional): Stages to apply plugin, length + should be same as 'num_stages' + multi_grid (Sequence[int]|None): Multi grid dilation rates of last + stage. Default: None + contract_dilation (bool): Whether contract first dilation of each layer + Default: False + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): Whether to use zero init for last norm layer + in resblocks to let them behave as identity. + + Example: + >>> from mmseg.models import ResNet + >>> import torch + >>> self = ResNet(depth=18) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 64, 8, 8) + (1, 128, 4, 4) + (1, 256, 2, 2) + (1, 512, 1, 1) + """ + + arch_settings = { + 18: (BasicBlock, (2, 2, 2, 2)), + 34: (BasicBlock, (3, 4, 6, 3)), + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, + depth, + in_channels=3, + stem_channels=64, + base_channels=64, + num_stages=4, + strides=(1, 2, 2, 2), + dilations=(1, 1, 1, 1), + out_indices=(0, 1, 2, 3), + style='pytorch', + deep_stem=False, + avg_down=False, + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + dcn=None, + stage_with_dcn=(False, False, False, False), + plugins=None, + multi_grid=None, + contract_dilation=False, + with_cp=False, + zero_init_residual=True): + super(ResNet, self).__init__() + if depth not in self.arch_settings: + raise KeyError(f'invalid depth {depth} for resnet') + self.depth = depth + self.stem_channels = stem_channels + self.base_channels = base_channels + self.num_stages = num_stages + assert num_stages >= 1 and num_stages <= 4 + self.strides = strides + self.dilations = dilations + assert len(strides) == len(dilations) == num_stages + self.out_indices = out_indices + assert max(out_indices) < num_stages + self.style = style + self.deep_stem = deep_stem + self.avg_down = avg_down + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.with_cp = with_cp + self.norm_eval = norm_eval + self.dcn = dcn + self.stage_with_dcn = stage_with_dcn + if dcn is not None: + assert len(stage_with_dcn) == num_stages + self.plugins = plugins + self.multi_grid = multi_grid + self.contract_dilation = contract_dilation + self.zero_init_residual = zero_init_residual + self.block, stage_blocks = self.arch_settings[depth] + self.stage_blocks = stage_blocks[:num_stages] + self.inplanes = stem_channels + + self._make_stem_layer(in_channels, stem_channels) + + self.res_layers = [] + for i, num_blocks in enumerate(self.stage_blocks): + stride = strides[i] + dilation = dilations[i] + dcn = self.dcn if self.stage_with_dcn[i] else None + if plugins is not None: + stage_plugins = self.make_stage_plugins(plugins, i) + else: + stage_plugins = None + # multi grid is applied to last layer only + stage_multi_grid = multi_grid if i == len( + self.stage_blocks) - 1 else None + planes = base_channels * 2**i + res_layer = self.make_res_layer( + block=self.block, + inplanes=self.inplanes, + planes=planes, + num_blocks=num_blocks, + stride=stride, + dilation=dilation, + style=self.style, + avg_down=self.avg_down, + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + dcn=dcn, + plugins=stage_plugins, + multi_grid=stage_multi_grid, + contract_dilation=contract_dilation) + self.inplanes = planes * self.block.expansion + layer_name = f'layer{i+1}' + self.add_module(layer_name, res_layer) + self.res_layers.append(layer_name) + + self._freeze_stages() + + self.feat_dim = self.block.expansion * base_channels * 2**( + len(self.stage_blocks) - 1) + + def make_stage_plugins(self, plugins, stage_idx): + """make plugins for ResNet 'stage_idx'th stage . + + Currently we support to insert 'context_block', + 'empirical_attention_block', 'nonlocal_block' into the backbone like + ResNet/ResNeXt. They could be inserted after conv1/conv2/conv3 of + Bottleneck. + + An example of plugins format could be : + >>> plugins=[ + ... dict(cfg=dict(type='xxx', arg1='xxx'), + ... stages=(False, True, True, True), + ... position='after_conv2'), + ... dict(cfg=dict(type='yyy'), + ... stages=(True, True, True, True), + ... position='after_conv3'), + ... dict(cfg=dict(type='zzz', postfix='1'), + ... stages=(True, True, True, True), + ... position='after_conv3'), + ... dict(cfg=dict(type='zzz', postfix='2'), + ... stages=(True, True, True, True), + ... position='after_conv3') + ... ] + >>> self = ResNet(depth=18) + >>> stage_plugins = self.make_stage_plugins(plugins, 0) + >>> assert len(stage_plugins) == 3 + + Suppose 'stage_idx=0', the structure of blocks in the stage would be: + conv1-> conv2->conv3->yyy->zzz1->zzz2 + Suppose 'stage_idx=1', the structure of blocks in the stage would be: + conv1-> conv2->xxx->conv3->yyy->zzz1->zzz2 + + If stages is missing, the plugin would be applied to all stages. + + Args: + plugins (list[dict]): List of plugins cfg to build. The postfix is + required if multiple same type plugins are inserted. + stage_idx (int): Index of stage to build + + Returns: + list[dict]: Plugins for current stage + """ + stage_plugins = [] + for plugin in plugins: + plugin = plugin.copy() + stages = plugin.pop('stages', None) + assert stages is None or len(stages) == self.num_stages + # whether to insert plugin into current stage + if stages is None or stages[stage_idx]: + stage_plugins.append(plugin) + + return stage_plugins + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``.""" + return ResLayer(**kwargs) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + def _make_stem_layer(self, in_channels, stem_channels): + """Make stem layer for ResNet.""" + if self.deep_stem: + self.stem = nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels, + stem_channels // 2, + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels // 2)[1], + nn.ReLU(inplace=True), + build_conv_layer( + self.conv_cfg, + stem_channels // 2, + stem_channels // 2, + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels // 2)[1], + nn.ReLU(inplace=True), + build_conv_layer( + self.conv_cfg, + stem_channels // 2, + stem_channels, + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels)[1], + nn.ReLU(inplace=True)) + else: + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + stem_channels, + kernel_size=7, + stride=2, + padding=3, + bias=False) + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, stem_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + def _freeze_stages(self): + """Freeze stages param and norm stats.""" + if self.frozen_stages >= 0: + if self.deep_stem: + self.stem.eval() + for param in self.stem.parameters(): + param.requires_grad = False + else: + self.norm1.eval() + for m in [self.conv1, self.norm1]: + for param in m.parameters(): + param.requires_grad = False + + for i in range(1, self.frozen_stages + 1): + m = getattr(self, f'layer{i}') + m.eval() + for param in m.parameters(): + param.requires_grad = False + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + + if self.dcn is not None: + for m in self.modules(): + if isinstance(m, Bottleneck) and hasattr( + m, 'conv2_offset'): + constant_init(m.conv2_offset, 0) + + if self.zero_init_residual: + for m in self.modules(): + if isinstance(m, Bottleneck): + constant_init(m.norm3, 0) + elif isinstance(m, BasicBlock): + constant_init(m.norm2, 0) + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x): + """Forward function.""" + if self.deep_stem: + x = self.stem(x) + else: + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + x = self.maxpool(x) + outs = [] + for i, layer_name in enumerate(self.res_layers): + res_layer = getattr(self, layer_name) + x = res_layer(x) + if i in self.out_indices: + outs.append(x) + return tuple(outs) + + def train(self, mode=True): + """Convert the model into training mode while keep normalization layer + freezed.""" + super(ResNet, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() + + +@BACKBONES.register_module() +class ResNetV1c(ResNet): + """ResNetV1c variant described in [1]_. + + Compared with default ResNet(ResNetV1b), ResNetV1c replaces the 7x7 conv + in the input stem with three 3x3 convs. + + References: + .. [1] https://arxiv.org/pdf/1812.01187.pdf + """ + + def __init__(self, **kwargs): + super(ResNetV1c, self).__init__( + deep_stem=True, avg_down=False, **kwargs) + + +@BACKBONES.register_module() +class ResNetV1d(ResNet): + """ResNetV1d variant described in [1]_. + + Compared with default ResNet(ResNetV1b), ResNetV1d replaces the 7x7 conv in + the input stem with three 3x3 convs. And in the downsampling block, a 2x2 + avg_pool with stride 2 is added before conv, whose stride is changed to 1. + """ + + def __init__(self, **kwargs): + super(ResNetV1d, self).__init__( + deep_stem=True, avg_down=True, **kwargs) diff --git a/mmseg/models/backbones/resnext.py b/mmseg/models/backbones/resnext.py new file mode 100644 index 0000000000000000000000000000000000000000..fa8149ce2fcbf67703248621c4f5dfb90a852379 --- /dev/null +++ b/mmseg/models/backbones/resnext.py @@ -0,0 +1,145 @@ +import math + +from mmcv.cnn import build_conv_layer, build_norm_layer + +from ..builder import BACKBONES +from ..utils import ResLayer +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNet + + +class Bottleneck(_Bottleneck): + """Bottleneck block for ResNeXt. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if it is + "caffe", the stride-two layer is the first 1x1 conv layer. + """ + + def __init__(self, + inplanes, + planes, + groups=1, + base_width=4, + base_channels=64, + **kwargs): + super(Bottleneck, self).__init__(inplanes, planes, **kwargs) + + if groups == 1: + width = self.planes + else: + width = math.floor(self.planes * + (base_width / base_channels)) * groups + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width, postfix=1) + self.norm2_name, norm2 = build_norm_layer( + self.norm_cfg, width, postfix=2) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + fallback_on_stride = False + self.with_modulated_dcn = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if not self.with_dcn or fallback_on_stride: + self.conv2 = build_conv_layer( + self.conv_cfg, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + self.conv2 = build_conv_layer( + self.dcn, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.conv3 = build_conv_layer( + self.conv_cfg, + width, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + +@BACKBONES.register_module() +class ResNeXt(ResNet): + """ResNeXt backbone. + + Args: + depth (int): Depth of resnet, from {18, 34, 50, 101, 152}. + in_channels (int): Number of input image channels. Normally 3. + num_stages (int): Resnet stages, normally 4. + groups (int): Group of resnext. + base_width (int): Base width of resnext. + strides (Sequence[int]): Strides of the first block of each stage. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. + frozen_stages (int): Stages to be frozen (all param fixed). -1 means + not freezing any parameters. + norm_cfg (dict): dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): whether to use zero init for last norm layer + in resblocks to let them behave as identity. + + Example: + >>> from mmseg.models import ResNeXt + >>> import torch + >>> self = ResNeXt(depth=50) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 256, 8, 8) + (1, 512, 4, 4) + (1, 1024, 2, 2) + (1, 2048, 1, 1) + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, groups=1, base_width=4, **kwargs): + self.groups = groups + self.base_width = base_width + super(ResNeXt, self).__init__(**kwargs) + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``""" + return ResLayer( + groups=self.groups, + base_width=self.base_width, + base_channels=self.base_channels, + **kwargs) diff --git a/mmseg/models/backbones/unet.py b/mmseg/models/backbones/unet.py new file mode 100644 index 0000000000000000000000000000000000000000..0e1b001c82174b9bdb53a1fa9f6bb8a869172a86 --- /dev/null +++ b/mmseg/models/backbones/unet.py @@ -0,0 +1,428 @@ +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import (UPSAMPLE_LAYERS, ConvModule, build_activation_layer, + build_norm_layer, constant_init, kaiming_init) +from mmcv.runner import load_checkpoint +from mmcv.utils.parrots_wrapper import _BatchNorm + +from mmseg.utils import get_root_logger +from ..builder import BACKBONES +from ..utils import UpConvBlock + + +class BasicConvBlock(nn.Module): + """Basic convolutional block for UNet. + + This module consists of several plain convolutional layers. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + num_convs (int): Number of convolutional layers. Default: 2. + stride (int): Whether use stride convolution to downsample + the input feature map. If stride=2, it only uses stride convolution + in the first convolutional layer to downsample the input feature + map. Options are 1 or 2. Default: 1. + dilation (int): Whether use dilated convolution to expand the + receptive field. Set dilation rate of each convolutional layer and + the dilation rate of the first convolutional layer is always 1. + Default: 1. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + dcn (bool): Use deformable convoluton in convolutional layer or not. + Default: None. + plugins (dict): plugins for convolutional layers. Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + num_convs=2, + stride=1, + dilation=1, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + dcn=None, + plugins=None): + super(BasicConvBlock, self).__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.with_cp = with_cp + convs = [] + for i in range(num_convs): + convs.append( + ConvModule( + in_channels=in_channels if i == 0 else out_channels, + out_channels=out_channels, + kernel_size=3, + stride=stride if i == 0 else 1, + dilation=1 if i == 0 else dilation, + padding=1 if i == 0 else dilation, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + self.convs = nn.Sequential(*convs) + + def forward(self, x): + """Forward function.""" + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(self.convs, x) + else: + out = self.convs(x) + return out + + +@UPSAMPLE_LAYERS.register_module() +class DeconvModule(nn.Module): + """Deconvolution upsample module in decoder for UNet (2X upsample). + + This module uses deconvolution to upsample feature map in the decoder + of UNet. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + kernel_size (int): Kernel size of the convolutional layer. Default: 4. + """ + + def __init__(self, + in_channels, + out_channels, + with_cp=False, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + *, + kernel_size=4, + scale_factor=2): + super(DeconvModule, self).__init__() + + assert (kernel_size - scale_factor >= 0) and\ + (kernel_size - scale_factor) % 2 == 0,\ + f'kernel_size should be greater than or equal to scale_factor '\ + f'and (kernel_size - scale_factor) should be even numbers, '\ + f'while the kernel size is {kernel_size} and scale_factor is '\ + f'{scale_factor}.' + + stride = scale_factor + padding = (kernel_size - scale_factor) // 2 + self.with_cp = with_cp + deconv = nn.ConvTranspose2d( + in_channels, + out_channels, + kernel_size=kernel_size, + stride=stride, + padding=padding) + + norm_name, norm = build_norm_layer(norm_cfg, out_channels) + activate = build_activation_layer(act_cfg) + self.deconv_upsamping = nn.Sequential(deconv, norm, activate) + + def forward(self, x): + """Forward function.""" + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(self.deconv_upsamping, x) + else: + out = self.deconv_upsamping(x) + return out + + +@UPSAMPLE_LAYERS.register_module() +class InterpConv(nn.Module): + """Interpolation upsample module in decoder for UNet. + + This module uses interpolation to upsample feature map in the decoder + of UNet. It consists of one interpolation upsample layer and one + convolutional layer. It can be one interpolation upsample layer followed + by one convolutional layer (conv_first=False) or one convolutional layer + followed by one interpolation upsample layer (conv_first=True). + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + conv_first (bool): Whether convolutional layer or interpolation + upsample layer first. Default: False. It means interpolation + upsample layer followed by one convolutional layer. + kernel_size (int): Kernel size of the convolutional layer. Default: 1. + stride (int): Stride of the convolutional layer. Default: 1. + padding (int): Padding of the convolutional layer. Default: 1. + upsampe_cfg (dict): Interpolation config of the upsample layer. + Default: dict( + scale_factor=2, mode='bilinear', align_corners=False). + """ + + def __init__(self, + in_channels, + out_channels, + with_cp=False, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + *, + conv_cfg=None, + conv_first=False, + kernel_size=1, + stride=1, + padding=0, + upsampe_cfg=dict( + scale_factor=2, mode='bilinear', align_corners=False)): + super(InterpConv, self).__init__() + + self.with_cp = with_cp + conv = ConvModule( + in_channels, + out_channels, + kernel_size=kernel_size, + stride=stride, + padding=padding, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + upsample = nn.Upsample(**upsampe_cfg) + if conv_first: + self.interp_upsample = nn.Sequential(conv, upsample) + else: + self.interp_upsample = nn.Sequential(upsample, conv) + + def forward(self, x): + """Forward function.""" + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(self.interp_upsample, x) + else: + out = self.interp_upsample(x) + return out + + +@BACKBONES.register_module() +class UNet(nn.Module): + """UNet backbone. + U-Net: Convolutional Networks for Biomedical Image Segmentation. + https://arxiv.org/pdf/1505.04597.pdf + + Args: + in_channels (int): Number of input image channels. Default" 3. + base_channels (int): Number of base channels of each stage. + The output channels of the first stage. Default: 64. + num_stages (int): Number of stages in encoder, normally 5. Default: 5. + strides (Sequence[int 1 | 2]): Strides of each stage in encoder. + len(strides) is equal to num_stages. Normally the stride of the + first stage in encoder is 1. If strides[i]=2, it uses stride + convolution to downsample in the correspondance encoder stage. + Default: (1, 1, 1, 1, 1). + enc_num_convs (Sequence[int]): Number of convolutional layers in the + convolution block of the correspondance encoder stage. + Default: (2, 2, 2, 2, 2). + dec_num_convs (Sequence[int]): Number of convolutional layers in the + convolution block of the correspondance decoder stage. + Default: (2, 2, 2, 2). + downsamples (Sequence[int]): Whether use MaxPool to downsample the + feature map after the first stage of encoder + (stages: [1, num_stages)). If the correspondance encoder stage use + stride convolution (strides[i]=2), it will never use MaxPool to + downsample, even downsamples[i-1]=True. + Default: (True, True, True, True). + enc_dilations (Sequence[int]): Dilation rate of each stage in encoder. + Default: (1, 1, 1, 1, 1). + dec_dilations (Sequence[int]): Dilation rate of each stage in decoder. + Default: (1, 1, 1, 1). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + upsample_cfg (dict): The upsample config of the upsample module in + decoder. Default: dict(type='InterpConv'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + dcn (bool): Use deformable convoluton in convolutional layer or not. + Default: None. + plugins (dict): plugins for convolutional layers. Default: None. + + Notice: + The input image size should be devisible by the whole downsample rate + of the encoder. More detail of the whole downsample rate can be found + in UNet._check_input_devisible. + + """ + + def __init__(self, + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False, + dcn=None, + plugins=None): + super(UNet, self).__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + assert len(strides) == num_stages, \ + 'The length of strides should be equal to num_stages, '\ + f'while the strides is {strides}, the length of '\ + f'strides is {len(strides)}, and the num_stages is '\ + f'{num_stages}.' + assert len(enc_num_convs) == num_stages, \ + 'The length of enc_num_convs should be equal to num_stages, '\ + f'while the enc_num_convs is {enc_num_convs}, the length of '\ + f'enc_num_convs is {len(enc_num_convs)}, and the num_stages is '\ + f'{num_stages}.' + assert len(dec_num_convs) == (num_stages-1), \ + 'The length of dec_num_convs should be equal to (num_stages-1), '\ + f'while the dec_num_convs is {dec_num_convs}, the length of '\ + f'dec_num_convs is {len(dec_num_convs)}, and the num_stages is '\ + f'{num_stages}.' + assert len(downsamples) == (num_stages-1), \ + 'The length of downsamples should be equal to (num_stages-1), '\ + f'while the downsamples is {downsamples}, the length of '\ + f'downsamples is {len(downsamples)}, and the num_stages is '\ + f'{num_stages}.' + assert len(enc_dilations) == num_stages, \ + 'The length of enc_dilations should be equal to num_stages, '\ + f'while the enc_dilations is {enc_dilations}, the length of '\ + f'enc_dilations is {len(enc_dilations)}, and the num_stages is '\ + f'{num_stages}.' + assert len(dec_dilations) == (num_stages-1), \ + 'The length of dec_dilations should be equal to (num_stages-1), '\ + f'while the dec_dilations is {dec_dilations}, the length of '\ + f'dec_dilations is {len(dec_dilations)}, and the num_stages is '\ + f'{num_stages}.' + self.num_stages = num_stages + self.strides = strides + self.downsamples = downsamples + self.norm_eval = norm_eval + + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + + for i in range(num_stages): + enc_conv_block = [] + if i != 0: + if strides[i] == 1 and downsamples[i - 1]: + enc_conv_block.append(nn.MaxPool2d(kernel_size=2)) + upsample = (strides[i] != 1 or downsamples[i - 1]) + self.decoder.append( + UpConvBlock( + conv_block=BasicConvBlock, + in_channels=base_channels * 2**i, + skip_channels=base_channels * 2**(i - 1), + out_channels=base_channels * 2**(i - 1), + num_convs=dec_num_convs[i - 1], + stride=1, + dilation=dec_dilations[i - 1], + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + upsample_cfg=upsample_cfg if upsample else None, + dcn=None, + plugins=None)) + + enc_conv_block.append( + BasicConvBlock( + in_channels=in_channels, + out_channels=base_channels * 2**i, + num_convs=enc_num_convs[i], + stride=strides[i], + dilation=enc_dilations[i], + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + dcn=None, + plugins=None)) + self.encoder.append((nn.Sequential(*enc_conv_block))) + in_channels = base_channels * 2**i + + def forward(self, x): + self._check_input_devisible(x) + enc_outs = [] + for enc in self.encoder: + x = enc(x) + enc_outs.append(x) + dec_outs = [x] + for i in reversed(range(len(self.decoder))): + x = self.decoder[i](enc_outs[i], x) + dec_outs.append(x) + + return dec_outs + + def train(self, mode=True): + """Convert the model into training mode while keep normalization layer + freezed.""" + super(UNet, self).train(mode) + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() + + def _check_input_devisible(self, x): + h, w = x.shape[-2:] + whole_downsample_rate = 1 + for i in range(1, self.num_stages): + if self.strides[i] == 2 or self.downsamples[i - 1]: + whole_downsample_rate *= 2 + assert (h % whole_downsample_rate == 0) \ + and (w % whole_downsample_rate == 0),\ + f'The input image size {(h, w)} should be devisible by the whole '\ + f'downsample rate {whole_downsample_rate}, when num_stages is '\ + f'{self.num_stages}, strides is {self.strides}, and downsamples '\ + f'is {self.downsamples}.' + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if isinstance(pretrained, str): + logger = get_root_logger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + else: + raise TypeError('pretrained must be a str or None') diff --git a/mmseg/models/backbones/vit.py b/mmseg/models/backbones/vit.py new file mode 100644 index 0000000000000000000000000000000000000000..892bd850cd832f6f78ae11465c2033a9a643ea58 --- /dev/null +++ b/mmseg/models/backbones/vit.py @@ -0,0 +1,319 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import BACKBONES + +from mmcv.cnn import build_norm_layer + + +def _cfg(url='', **kwargs): + return { + 'url': url, + 'num_classes': 1000, 'input_size': (3, 224, 224), 'pool_size': None, + 'crop_pct': .9, 'interpolation': 'bicubic', + 'mean': (0.485, 0.456, 0.406), 'std': (0.229, 0.224, 0.225), + 'first_conv': '', 'classifier': 'head', + **kwargs + } + + +default_cfgs = { + # patch models + 'vit_small_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/vit_small_p16_224-15ec54c9.pth', + ), + 'vit_base_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_224-80ecf9dd.pth', + mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), + #pretrained_finetune='pretrain/VIT_base_224_ReLeM.pth' + ), + 'vit_base_patch16_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_384-83fb41ba.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_base_patch32_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p32_384-830016f5.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_large_patch16_224': _cfg(), + 'vit_large_patch16_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p16_384-b3be5167.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0, + ), + 'vit_large_patch32_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p32_384-9b920ba8.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_huge_patch16_224': _cfg(), + 'vit_huge_patch32_384': _cfg(input_size=(3, 384, 384)), + # hybrid models + 'vit_small_resnet26d_224': _cfg(), + 'vit_small_resnet50d_s3_224': _cfg(), + 'vit_base_resnet26d_224': _cfg(), + 'vit_base_resnet50d_224': _cfg(), + 'deit_base_distilled_path16_384': _cfg( + url='https://dl.fbaipublicfiles.com/deit/deit_base_distilled_patch16_384-d0272ac0.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0, checkpoint=True, + ), +} + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + head_dim = dim // num_heads + # NOTE scale factor was wrong in my original version, can set manually to be compat with prev weights + self.scale = qk_scale or head_dim ** -0.5 + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + B, N, C = x.shape + q, k, v = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + +class Block(nn.Module): + + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = Attention( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop) + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + def forward(self, x): + x = x + self.drop_path(self.attn(self.norm1(x))) + x = x + self.drop_path(self.mlp(self.norm2(x))) + return x + + +class PatchEmbed(nn.Module): + """ Image to Patch Embedding + """ + def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + num_patches = (img_size[1] // patch_size[1]) * (img_size[0] // patch_size[0]) + self.img_size = img_size + self.patch_size = patch_size + self.num_patches = num_patches + + self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) + + def forward(self, x): + B, C, H, W = x.shape + # FIXME look at relaxing size constraints + assert H == self.img_size[0] and W == self.img_size[1], \ + f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})." + + # x = F.interpolate(x, size=2*x.shape[-1], mode='bilinear', align_corners=True) + x = self.proj(x) + return x + + +class HybridEmbed(nn.Module): + """ CNN Feature Map Embedding + Extract feature map from CNN, flatten, project to embedding dim. + """ + def __init__(self, backbone, img_size=224, feature_size=None, in_chans=3, embed_dim=768): + super().__init__() + assert isinstance(backbone, nn.Module) + img_size = to_2tuple(img_size) + self.img_size = img_size + self.backbone = backbone + if feature_size is None: + with torch.no_grad(): + # FIXME this is hacky, but most reliable way of determining the exact dim of the output feature + # map for all networks, the feature metadata has reliable channel and stride info, but using + # stride to calc feature dim requires info about padding of each stage that isn't captured. + training = backbone.training + if training: + backbone.eval() + o = self.backbone(torch.zeros(1, in_chans, img_size[0], img_size[1]))[-1] + feature_size = o.shape[-2:] + feature_dim = o.shape[1] + backbone.train(training) + else: + feature_size = to_2tuple(feature_size) + feature_dim = self.backbone.feature_info.channels()[-1] + self.num_patches = feature_size[0] * feature_size[1] + self.proj = nn.Linear(feature_dim, embed_dim) + + def forward(self, x): + x = self.backbone(x)[-1] + x = x.flatten(2).transpose(1, 2) + x = self.proj(x) + return x + + +@BACKBONES.register_module() +class VisionTransformer(nn.Module): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, model_name='vit_large_patch16_384', img_size=384, patch_size=16, in_chans=3, embed_dim=1024, depth=24, + num_heads=16, num_classes=19, mlp_ratio=4., qkv_bias=True, qk_scale=None, drop_rate=0.1, attn_drop_rate=0., + drop_path_rate=0., hybrid_backbone=None, norm_layer=partial(nn.LayerNorm, eps=1e-6), norm_cfg=None, + pos_embed_interp=False, random_init=False, align_corners=False, pretrain_weights=None, **kwargs): + super(VisionTransformer, self).__init__(**kwargs) + self.model_name = model_name + self.img_size = img_size + self.patch_size = patch_size + self.in_chans = in_chans + self.embed_dim = embed_dim + self.depth = depth + self.num_heads = num_heads + self.num_classes = num_classes + self.mlp_ratio = mlp_ratio + self.qkv_bias = qkv_bias + self.qk_scale = qk_scale + self.drop_rate = drop_rate + self.attn_drop_rate = attn_drop_rate + self.drop_path_rate = drop_path_rate + self.hybrid_backbone = hybrid_backbone + self.norm_layer = norm_layer + self.norm_cfg = norm_cfg + self.pos_embed_interp = pos_embed_interp + self.random_init = random_init + self.align_corners = align_corners + self.pretrain_weights = pretrain_weights + + self.num_stages = self.depth + self.out_indices= tuple(range(self.num_stages)) + + if self.hybrid_backbone is not None: + self.patch_embed = HybridEmbed( + self.hybrid_backbone, img_size=self.img_size, in_chans=self.in_chans, embed_dim=self.embed_dim) + else: + self.patch_embed = PatchEmbed( + img_size=self.img_size, patch_size=self.patch_size, in_chans=self.in_chans, embed_dim=self.embed_dim) + self.num_patches = self.patch_embed.num_patches + + self.cls_token = nn.Parameter(torch.zeros(1, 1, self.embed_dim)) + self.pos_embed = nn.Parameter(torch.zeros(1, self.num_patches + 1, self.embed_dim)) + self.pos_drop = nn.Dropout(p=self.drop_rate) + + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] # stochastic depth decay rule + self.blocks = nn.ModuleList([ + Block( + dim=self.embed_dim, num_heads=self.num_heads, mlp_ratio=self.mlp_ratio, qkv_bias=self.qkv_bias, qk_scale=self.qk_scale, + drop=self.drop_rate, attn_drop=self.attn_drop_rate, drop_path=dpr[i], norm_layer=self.norm_layer) + for i in range(self.depth)]) + + # NOTE as per official impl, we could have a pre-logits representation dense layer + tanh here + #self.repr = nn.Linear(embed_dim, representation_size) + #self.repr_act = nn.Tanh() + + trunc_normal_(self.pos_embed, std=.02) + trunc_normal_(self.cls_token, std=.02) + # self.apply(self._init_weights) + + def init_weights(self, pretrained=None): + # nn.init.normal_(self.pos_embed, std=0.02) + # nn.init.zeros_(self.cls_token) + + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + if self.random_init == False: + self.default_cfg = default_cfgs[self.model_name] + + if not self.pretrain_weights == None: + self.default_cfg['pretrained_finetune'] = self.pretrain_weights + + if self.model_name in ['vit_small_patch16_224', 'vit_base_patch16_224']: + load_pretrained(self, num_classes=self.num_classes, in_chans=self.in_chans, pos_embed_interp=self.pos_embed_interp, num_patches=self.patch_embed.num_patches, align_corners=self.align_corners, filter_fn=self._conv_filter) + else: + load_pretrained(self, num_classes=self.num_classes, in_chans=self.in_chans, pos_embed_interp=self.pos_embed_interp, num_patches=self.patch_embed.num_patches, align_corners=self.align_corners) + else: + print('Initialize weight randomly') + + @property + def no_weight_decay(self): + return {'pos_embed', 'cls_token'} + + def _conv_filter(self, state_dict, patch_size=16): + """ convert patch embedding weight from manual patchify + linear proj to conv""" + out_dict = {} + for k, v in state_dict.items(): + if 'patch_embed.proj.weight' in k: + v = v.reshape((v.shape[0], 3, patch_size, patch_size)) + out_dict[k] = v + return out_dict + + def to_2D(self, x): + n, hw, c = x.shape + h=w = int(math.sqrt(hw)) + x = x.transpose(1,2).reshape(n, c, h, w) + return x + + def to_1D(self, x): + n, c, h, w = x.shape + x = x.reshape(n,c,-1).transpose(1,2) + return x + + def forward(self, x): + B = x.shape[0] + x = self.patch_embed(x) + + x = x.flatten(2).transpose(1, 2) + + cls_tokens = self.cls_token.expand(B, -1, -1) # stole cls_tokens impl from Phil Wang, thanks + x = torch.cat((cls_tokens, x), dim=1) + x = x + self.pos_embed + x = self.pos_drop(x) + + outs = [] + for i, blk in enumerate(self.blocks): + x = blk(x) + if i in self.out_indices: + outs.append(x) + return tuple(outs) + + diff --git a/mmseg/models/backbones/vit_mla.py b/mmseg/models/backbones/vit_mla.py new file mode 100644 index 0000000000000000000000000000000000000000..b6b52b17d4e97e94a6aceb7cea3b4efdce3af4df --- /dev/null +++ b/mmseg/models/backbones/vit_mla.py @@ -0,0 +1,371 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import BACKBONES + +from mmcv.cnn import build_norm_layer + + +def _cfg(url='', **kwargs): + return { + 'url': url, + 'num_classes': 1000, 'input_size': (3, 224, 224), 'pool_size': None, + 'crop_pct': .9, 'interpolation': 'bicubic', + 'mean': (0.485, 0.456, 0.406), 'std': (0.229, 0.224, 0.225), + 'first_conv': '', 'classifier': 'head', + **kwargs + } + + +default_cfgs = { + # patch models + 'vit_small_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/vit_small_p16_224-15ec54c9.pth', + ), + 'vit_base_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_224-80ecf9dd.pth', + mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), + #pretrained_finetune='pretrain/VIT_base_224_ReLeM.pth' + ), + 'vit_base_patch16_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_384-83fb41ba.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_base_patch32_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p32_384-830016f5.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_large_patch16_224': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p16_224-4ee7a4dc.pth', + input_size=(3, 224, 224), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_large_patch16_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p16_384-b3be5167.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_large_patch32_384': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_large_p32_384-9b920ba8.pth', + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0), + 'vit_base_patch16_224_in21k': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_patch16_224_in21k-e5005f0a.pth', + num_classes=21843, mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)), + 'vit_huge_patch16_224': _cfg(), + 'vit_huge_patch32_384': _cfg(input_size=(3, 384, 384)), + # hybrid models + 'vit_small_resnet26d_224': _cfg(), + 'vit_small_resnet50d_s3_224': _cfg(), + 'vit_base_resnet26d_224': _cfg(), + 'vit_base_resnet50d_224': _cfg(), + 'deit_base_distilled_path16_384': _cfg( + input_size=(3, 384, 384), mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=1.0, + pretrained_finetune='pretrained_model/deit_base_distilled_patch16_384.pth' + ) +} + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + head_dim = dim // num_heads + # NOTE scale factor was wrong in my original version, can set manually to be compat with prev weights + self.scale = qk_scale or head_dim ** -0.5 + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + B, N, C = x.shape + q, k, v = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + +class Block(nn.Module): + + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = Attention( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop) + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + + def forward(self, x): + x = x + self.drop_path(self.attn(self.norm1(x))) + x = x + self.drop_path(self.mlp(self.norm2(x))) + return x + + +class PatchEmbed(nn.Module): + """ Image to Patch Embedding + """ + def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + num_patches = (img_size[1] // patch_size[1]) * (img_size[0] // patch_size[0]) + self.img_size = img_size + self.patch_size = patch_size + self.num_patches = num_patches + + self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) + + def forward(self, x): + B, C, H, W = x.shape + # FIXME look at relaxing size constraints + assert H == self.img_size[0] and W == self.img_size[1], \ + f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})." + + # x = F.interpolate(x, size=2*x.shape[-1], mode='bilinear', align_corners=True) + x = self.proj(x) + return x + + +class HybridEmbed(nn.Module): + """ CNN Feature Map Embedding + Extract feature map from CNN, flatten, project to embedding dim. + """ + def __init__(self, backbone, img_size=224, feature_size=None, in_chans=3, embed_dim=768): + super().__init__() + assert isinstance(backbone, nn.Module) + img_size = to_2tuple(img_size) + self.img_size = img_size + self.backbone = backbone + if feature_size is None: + with torch.no_grad(): + # FIXME this is hacky, but most reliable way of determining the exact dim of the output feature + # map for all networks, the feature metadata has reliable channel and stride info, but using + # stride to calc feature dim requires info about padding of each stage that isn't captured. + training = backbone.training + if training: + backbone.eval() + o = self.backbone(torch.zeros(1, in_chans, img_size[0], img_size[1]))[-1] + feature_size = o.shape[-2:] + feature_dim = o.shape[1] + backbone.train(training) + else: + feature_size = to_2tuple(feature_size) + feature_dim = self.backbone.feature_info.channels()[-1] + self.num_patches = feature_size[0] * feature_size[1] + self.proj = nn.Linear(feature_dim, embed_dim) + + def forward(self, x): + x = self.backbone(x)[-1] + x = x.flatten(2).transpose(1, 2) + x = self.proj(x) + return x + + +class Conv_MLA(nn.Module): + def __init__(self, in_channels=1024, mla_channels=256, norm_cfg=None): + super(Conv_MLA, self).__init__() + self.mla_p2_1x1 = nn.Sequential(nn.Conv2d(in_channels, mla_channels, 1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p3_1x1 = nn.Sequential(nn.Conv2d(in_channels, mla_channels, 1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p4_1x1 = nn.Sequential(nn.Conv2d(in_channels, mla_channels, 1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p5_1x1 = nn.Sequential(nn.Conv2d(in_channels, mla_channels, 1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p2 = nn.Sequential(nn.Conv2d(mla_channels, mla_channels, 3, padding=1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p3 = nn.Sequential(nn.Conv2d(mla_channels, mla_channels, 3, padding=1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p4 = nn.Sequential(nn.Conv2d(mla_channels, mla_channels, 3, padding=1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + self.mla_p5 = nn.Sequential(nn.Conv2d(mla_channels, mla_channels, 3, padding=1, bias=False), build_norm_layer(norm_cfg, mla_channels)[1], nn.ReLU()) + + def to_2D(self, x): + n, hw, c = x.shape + h=w = int(math.sqrt(hw)) + x = x.transpose(1,2).reshape(n, c, h, w) + return x + + def forward(self, res2, res3, res4, res5): + + res2 = self.to_2D(res2) + res3 = self.to_2D(res3) + res4 = self.to_2D(res4) + res5 = self.to_2D(res5) + + mla_p5_1x1 = self.mla_p5_1x1(res5) + mla_p4_1x1 = self.mla_p4_1x1(res4) + mla_p3_1x1 = self.mla_p3_1x1(res3) + mla_p2_1x1 = self.mla_p2_1x1(res2) + + mla_p4_plus = mla_p5_1x1 + mla_p4_1x1 + mla_p3_plus = mla_p4_plus + mla_p3_1x1 + mla_p2_plus = mla_p3_plus + mla_p2_1x1 + + mla_p5 = self.mla_p5(mla_p5_1x1) + mla_p4 = self.mla_p4(mla_p4_plus) + mla_p3 = self.mla_p3(mla_p3_plus) + mla_p2 = self.mla_p2(mla_p2_plus) + + return mla_p2, mla_p3, mla_p4, mla_p5 + + +@BACKBONES.register_module() +class VIT_MLA(nn.Module): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, model_name='vit_large_patch16_384', img_size=384, patch_size=16, in_chans=3, embed_dim=1024, depth=24, + num_heads=16, num_classes=19, mlp_ratio=4., qkv_bias=True, qk_scale=None, drop_rate=0.1, attn_drop_rate=0., + drop_path_rate=0., hybrid_backbone=None, norm_layer=partial(nn.LayerNorm, eps=1e-6), norm_cfg=None, + pos_embed_interp=False, random_init=False, align_corners=False, mla_channels=256, + mla_index=(5,11,17,23), pretrain_weights=None, **kwargs): + super(VIT_MLA, self).__init__(**kwargs) + self.model_name = model_name + self.img_size = img_size + self.patch_size = patch_size + self.in_chans = in_chans + self.embed_dim = embed_dim + self.depth = depth + self.num_heads = num_heads + self.num_classes = num_classes + self.mlp_ratio = mlp_ratio + self.qkv_bias = qkv_bias + self.qk_scale = qk_scale + self.drop_rate = drop_rate + self.attn_drop_rate = attn_drop_rate + self.drop_path_rate = drop_path_rate + self.hybrid_backbone = hybrid_backbone + self.norm_layer = norm_layer + self.norm_cfg = norm_cfg + self.pos_embed_interp = pos_embed_interp + self.random_init = random_init + self.align_corners = align_corners + self.mla_channels = mla_channels + self.mla_index = mla_index + self.pretrain_weights = pretrain_weights + + self.num_stages = self.depth + self.out_indices= tuple(range(self.num_stages)) + + if self.hybrid_backbone is not None: + self.patch_embed = HybridEmbed( + self.hybrid_backbone, img_size=self.img_size, in_chans=self.in_chans, embed_dim=self.embed_dim) + else: + self.patch_embed = PatchEmbed( + img_size=self.img_size, patch_size=self.patch_size, in_chans=self.in_chans, embed_dim=self.embed_dim) + self.num_patches = self.patch_embed.num_patches + + self.cls_token = nn.Parameter(torch.zeros(1, 1, self.embed_dim)) + self.pos_embed = nn.Parameter(torch.zeros(1, self.num_patches + 1, self.embed_dim)) + self.pos_drop = nn.Dropout(p=self.drop_rate) + + dpr = [x.item() for x in torch.linspace(0, self.drop_path_rate, self.depth)] # stochastic depth decay rule + self.blocks = nn.ModuleList([ + Block( + dim=self.embed_dim, num_heads=self.num_heads, mlp_ratio=self.mlp_ratio, qkv_bias=self.qkv_bias, qk_scale=self.qk_scale, + drop=self.drop_rate, attn_drop=self.attn_drop_rate, drop_path=dpr[i], norm_layer=self.norm_layer) + for i in range(self.depth)]) + + self.mla = Conv_MLA(in_channels=self.embed_dim, mla_channels=self.mla_channels, norm_cfg=self.norm_cfg) + + self.norm_0 = norm_layer(self.embed_dim) + self.norm_1 = norm_layer(self.embed_dim) + self.norm_2 = norm_layer(self.embed_dim) + self.norm_3 = norm_layer(self.embed_dim) + + # NOTE as per official impl, we could have a pre-logits representation dense layer + tanh here + #self.repr = nn.Linear(embed_dim, representation_size) + #self.repr_act = nn.Tanh() + + trunc_normal_(self.pos_embed, std=.02) + trunc_normal_(self.cls_token, std=.02) + # self.apply(self._init_weights) + + def init_weights(self, pretrained=None): + # nn.init.normal_(self.pos_embed, std=0.02) + # nn.init.zeros_(self.cls_token) + + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + if self.random_init == False: + self.default_cfg = default_cfgs[self.model_name] + + if not self.pretrain_weights == None: + self.default_cfg['pretrained_finetune'] = self.pretrain_weights + + if self.model_name in ['vit_small_patch16_224', 'vit_base_patch16_224']: + load_pretrained(self, num_classes=self.num_classes, in_chans=self.in_chans, pos_embed_interp=self.pos_embed_interp, num_patches=self.patch_embed.num_patches, align_corners=self.align_corners, filter_fn=self._conv_filter) + else: + load_pretrained(self, num_classes=self.num_classes, in_chans=self.in_chans, pos_embed_interp=self.pos_embed_interp, num_patches=self.patch_embed.num_patches, align_corners=self.align_corners) + else: + print('Initialize weight randomly') + + @property + def no_weight_decay(self): + return {'pos_embed', 'cls_token'} + + def _conv_filter(self, state_dict, patch_size=16): + """ convert patch embedding weight from manual patchify + linear proj to conv""" + out_dict = {} + for k, v in state_dict.items(): + if 'patch_embed.proj.weight' in k: + v = v.reshape((v.shape[0], 3, patch_size, patch_size)) + out_dict[k] = v + return out_dict + + def forward(self, x): + B = x.shape[0] + x = self.patch_embed(x) + x = x.flatten(2).transpose(1, 2) + + cls_tokens = self.cls_token.expand(B, -1, -1) # stole cls_tokens impl from Phil Wang, thanks + x = torch.cat((cls_tokens, x), dim=1) + x = x + self.pos_embed + x = x[:,1:] + x = self.pos_drop(x) + + outs = [] + for i, blk in enumerate(self.blocks): + x = blk(x) + if i in self.out_indices: + outs.append(x) + + c6 = self.norm_0(outs[self.mla_index[0]]) + c12 = self.norm_1(outs[self.mla_index[1]]) + c18 = self.norm_2(outs[self.mla_index[2]]) + c24 = self.norm_3(outs[self.mla_index[3]]) + + p6, p12, p18, p24 = self.mla(c6, c12, c18, c24) + + return (p6, p12, p18, p24) + diff --git a/mmseg/models/builder.py b/mmseg/models/builder.py new file mode 100644 index 0000000000000000000000000000000000000000..c487dcdd32bb1c62630f6d8f75e5fa981aba3ba8 --- /dev/null +++ b/mmseg/models/builder.py @@ -0,0 +1,66 @@ +import warnings + +from mmcv.utils import Registry, build_from_cfg +from torch import nn + +BACKBONES = Registry('backbone') +NECKS = Registry('neck') +HEADS = Registry('head') +LOSSES = Registry('loss') +SEGMENTORS = Registry('segmentor') + + +def build(cfg, registry, default_args=None): + """Build a module. + + Args: + cfg (dict, list[dict]): The config of modules, is is either a dict + or a list of configs. + registry (:obj:`Registry`): A registry the module belongs to. + default_args (dict, optional): Default arguments to build the module. + Defaults to None. + + Returns: + nn.Module: A built nn module. + """ + + if isinstance(cfg, list): + modules = [ + build_from_cfg(cfg_, registry, default_args) for cfg_ in cfg + ] + return nn.Sequential(*modules) + else: + return build_from_cfg(cfg, registry, default_args) + + +def build_backbone(cfg): + """Build backbone.""" + return build(cfg, BACKBONES) + + +def build_neck(cfg): + """Build neck.""" + return build(cfg, NECKS) + + +def build_head(cfg): + """Build head.""" + return build(cfg, HEADS) + + +def build_loss(cfg): + """Build loss.""" + return build(cfg, LOSSES) + + +def build_segmentor(cfg, train_cfg=None, test_cfg=None): + """Build segmentor.""" + if train_cfg is not None or test_cfg is not None: + warnings.warn( + 'train_cfg and test_cfg is deprecated, ' + 'please specify them in model', UserWarning) + assert cfg.get('train_cfg') is None or train_cfg is None, \ + 'train_cfg specified in both outer field and model field ' + assert cfg.get('test_cfg') is None or test_cfg is None, \ + 'test_cfg specified in both outer field and model field ' + return build(cfg, SEGMENTORS, dict(train_cfg=train_cfg, test_cfg=test_cfg)) diff --git a/mmseg/models/decode_heads/__init__.py b/mmseg/models/decode_heads/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..7063ecdcca5cbb27a9d4c586a26b4882c25a0810 --- /dev/null +++ b/mmseg/models/decode_heads/__init__.py @@ -0,0 +1,32 @@ +from .ann_head import ANNHead +from .apc_head import APCHead +from .aspp_head import ASPPHead +from .cc_head import CCHead +from .da_head import DAHead +from .dm_head import DMHead +from .dnl_head import DNLHead +from .ema_head import EMAHead +from .enc_head import EncHead +from .fcn_head import FCNHead +from .fpn_head import FPNHead +from .gc_head import GCHead +from .lraspp_head import LRASPPHead +from .nl_head import NLHead +from .ocr_head import OCRHead +from .point_head import PointHead +from .psa_head import PSAHead +from .psp_head import PSPHead +from .sep_aspp_head import DepthwiseSeparableASPPHead +from .sep_fcn_head import DepthwiseSeparableFCNHead +from .uper_head import UPerHead +from .vit_up_head import VisionTransformerUpHead +from .vit_mla_head import VIT_MLAHead +from .vit_mla_auxi_head import VIT_MLA_AUXIHead + +__all__ = [ + 'FCNHead', 'PSPHead', 'ASPPHead', 'PSAHead', 'NLHead', 'GCHead', 'CCHead', + 'UPerHead', 'DepthwiseSeparableASPPHead', 'ANNHead', 'DAHead', 'OCRHead', + 'EncHead', 'DepthwiseSeparableFCNHead', 'FPNHead', 'EMAHead', 'DNLHead', + 'PointHead', 'APCHead', 'DMHead', 'LRASPPHead', + 'VisionTransformerUpHead', 'VIT_MLAHead', 'VIT_MLA_AUXIHead' +] diff --git a/mmseg/models/decode_heads/ann_head.py b/mmseg/models/decode_heads/ann_head.py new file mode 100644 index 0000000000000000000000000000000000000000..396c54e1505b3e1750abb715769c6d9c040d9906 --- /dev/null +++ b/mmseg/models/decode_heads/ann_head.py @@ -0,0 +1,245 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from ..builder import HEADS +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from .decode_head import BaseDecodeHead + + +class PPMConcat(nn.ModuleList): + """Pyramid Pooling Module that only concat the features of each layer. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. + """ + + def __init__(self, pool_scales=(1, 3, 6, 8)): + super(PPMConcat, self).__init__( + [nn.AdaptiveAvgPool2d(pool_scale) for pool_scale in pool_scales]) + + def forward(self, feats): + """Forward function.""" + ppm_outs = [] + for ppm in self: + ppm_out = ppm(feats) + ppm_outs.append(ppm_out.view(*feats.shape[:2], -1)) + concat_outs = torch.cat(ppm_outs, dim=2) + return concat_outs + + +class SelfAttentionBlock(_SelfAttentionBlock): + """Make a ANN used SelfAttentionBlock. + + Args: + low_in_channels (int): Input channels of lower level feature, + which is the key feature for self-attention. + high_in_channels (int): Input channels of higher level feature, + which is the query feature for self-attention. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + share_key_query (bool): Whether share projection weight between key + and query projection. + query_scale (int): The scale of query feature map. + key_pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module of key feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, low_in_channels, high_in_channels, channels, + out_channels, share_key_query, query_scale, key_pool_scales, + conv_cfg, norm_cfg, act_cfg): + key_psp = PPMConcat(key_pool_scales) + if query_scale > 1: + query_downsample = nn.MaxPool2d(kernel_size=query_scale) + else: + query_downsample = None + super(SelfAttentionBlock, self).__init__( + key_in_channels=low_in_channels, + query_in_channels=high_in_channels, + channels=channels, + out_channels=out_channels, + share_key_query=share_key_query, + query_downsample=query_downsample, + key_downsample=key_psp, + key_query_num_convs=1, + key_query_norm=True, + value_out_num_convs=1, + value_out_norm=False, + matmul_norm=True, + with_out=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + +class AFNB(nn.Module): + """Asymmetric Fusion Non-local Block(AFNB) + + Args: + low_in_channels (int): Input channels of lower level feature, + which is the key feature for self-attention. + high_in_channels (int): Input channels of higher level feature, + which is the query feature for self-attention. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + and query projection. + query_scales (tuple[int]): The scales of query feature map. + Default: (1,) + key_pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module of key feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, low_in_channels, high_in_channels, channels, + out_channels, query_scales, key_pool_scales, conv_cfg, + norm_cfg, act_cfg): + super(AFNB, self).__init__() + self.stages = nn.ModuleList() + for query_scale in query_scales: + self.stages.append( + SelfAttentionBlock( + low_in_channels=low_in_channels, + high_in_channels=high_in_channels, + channels=channels, + out_channels=out_channels, + share_key_query=False, + query_scale=query_scale, + key_pool_scales=key_pool_scales, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.bottleneck = ConvModule( + out_channels + high_in_channels, + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + def forward(self, low_feats, high_feats): + """Forward function.""" + priors = [stage(high_feats, low_feats) for stage in self.stages] + context = torch.stack(priors, dim=0).sum(dim=0) + output = self.bottleneck(torch.cat([context, high_feats], 1)) + return output + + +class APNB(nn.Module): + """Asymmetric Pyramid Non-local Block (APNB) + + Args: + in_channels (int): Input channels of key/query feature, + which is the key feature for self-attention. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + query_scales (tuple[int]): The scales of query feature map. + Default: (1,) + key_pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module of key feature. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, in_channels, channels, out_channels, query_scales, + key_pool_scales, conv_cfg, norm_cfg, act_cfg): + super(APNB, self).__init__() + self.stages = nn.ModuleList() + for query_scale in query_scales: + self.stages.append( + SelfAttentionBlock( + low_in_channels=in_channels, + high_in_channels=in_channels, + channels=channels, + out_channels=out_channels, + share_key_query=True, + query_scale=query_scale, + key_pool_scales=key_pool_scales, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.bottleneck = ConvModule( + 2 * in_channels, + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, feats): + """Forward function.""" + priors = [stage(feats, feats) for stage in self.stages] + context = torch.stack(priors, dim=0).sum(dim=0) + output = self.bottleneck(torch.cat([context, feats], 1)) + return output + + +@HEADS.register_module() +class ANNHead(BaseDecodeHead): + """Asymmetric Non-local Neural Networks for Semantic Segmentation. + + This head is the implementation of `ANNNet + `_. + + Args: + project_channels (int): Projection channels for Nonlocal. + query_scales (tuple[int]): The scales of query feature map. + Default: (1,) + key_pool_scales (tuple[int]): The pooling scales of key feature map. + Default: (1, 3, 6, 8). + """ + + def __init__(self, + project_channels, + query_scales=(1, ), + key_pool_scales=(1, 3, 6, 8), + **kwargs): + super(ANNHead, self).__init__( + input_transform='multiple_select', **kwargs) + assert len(self.in_channels) == 2 + low_in_channels, high_in_channels = self.in_channels + self.project_channels = project_channels + self.fusion = AFNB( + low_in_channels=low_in_channels, + high_in_channels=high_in_channels, + out_channels=high_in_channels, + channels=project_channels, + query_scales=query_scales, + key_pool_scales=key_pool_scales, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.bottleneck = ConvModule( + high_in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.context = APNB( + in_channels=self.channels, + out_channels=self.channels, + channels=project_channels, + query_scales=query_scales, + key_pool_scales=key_pool_scales, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + low_feats, high_feats = self._transform_inputs(inputs) + output = self.fusion(low_feats, high_feats) + output = self.dropout(output) + output = self.bottleneck(output) + output = self.context(output) + output = self.cls_seg(output) + + return output diff --git a/mmseg/models/decode_heads/apc_head.py b/mmseg/models/decode_heads/apc_head.py new file mode 100644 index 0000000000000000000000000000000000000000..b453db3943b6ba853f85fa804d3675c4244d460e --- /dev/null +++ b/mmseg/models/decode_heads/apc_head.py @@ -0,0 +1,158 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +class ACM(nn.Module): + """Adaptive Context Module used in APCNet. + + Args: + pool_scale (int): Pooling scale used in Adaptive Context + Module to extract region fetures. + fusion (bool): Add one conv to fuse residual feature. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict | None): Config of conv layers. + norm_cfg (dict | None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, pool_scale, fusion, in_channels, channels, conv_cfg, + norm_cfg, act_cfg): + super(ACM, self).__init__() + self.pool_scale = pool_scale + self.fusion = fusion + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.pooled_redu_conv = ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.input_redu_conv = ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.global_info = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.gla = nn.Conv2d(self.channels, self.pool_scale**2, 1, 1, 0) + + self.residual_conv = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + if self.fusion: + self.fusion_conv = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, x): + """Forward function.""" + pooled_x = F.adaptive_avg_pool2d(x, self.pool_scale) + # [batch_size, channels, h, w] + x = self.input_redu_conv(x) + # [batch_size, channels, pool_scale, pool_scale] + pooled_x = self.pooled_redu_conv(pooled_x) + batch_size = x.size(0) + # [batch_size, pool_scale * pool_scale, channels] + pooled_x = pooled_x.view(batch_size, self.channels, + -1).permute(0, 2, 1).contiguous() + # [batch_size, h * w, pool_scale * pool_scale] + affinity_matrix = self.gla(x + resize( + self.global_info(F.adaptive_avg_pool2d(x, 1)), size=x.shape[2:]) + ).permute(0, 2, 3, 1).reshape( + batch_size, -1, self.pool_scale**2) + affinity_matrix = F.sigmoid(affinity_matrix) + # [batch_size, h * w, channels] + z_out = torch.matmul(affinity_matrix, pooled_x) + # [batch_size, channels, h * w] + z_out = z_out.permute(0, 2, 1).contiguous() + # [batch_size, channels, h, w] + z_out = z_out.view(batch_size, self.channels, x.size(2), x.size(3)) + z_out = self.residual_conv(z_out) + z_out = F.relu(z_out + x) + if self.fusion: + z_out = self.fusion_conv(z_out) + + return z_out + + +@HEADS.register_module() +class APCHead(BaseDecodeHead): + """Adaptive Pyramid Context Network for Semantic Segmentation. + + This head is the implementation of + `APCNet `_. + + Args: + pool_scales (tuple[int]): Pooling scales used in Adaptive Context + Module. Default: (1, 2, 3, 6). + fusion (bool): Add one conv to fuse residual feature. + """ + + def __init__(self, pool_scales=(1, 2, 3, 6), fusion=True, **kwargs): + super(APCHead, self).__init__(**kwargs) + assert isinstance(pool_scales, (list, tuple)) + self.pool_scales = pool_scales + self.fusion = fusion + acm_modules = [] + for pool_scale in self.pool_scales: + acm_modules.append( + ACM(pool_scale, + self.fusion, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.acm_modules = nn.ModuleList(acm_modules) + self.bottleneck = ConvModule( + self.in_channels + len(pool_scales) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + acm_outs = [x] + for acm_module in self.acm_modules: + acm_outs.append(acm_module(x)) + acm_outs = torch.cat(acm_outs, dim=1) + output = self.bottleneck(acm_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/aspp_head.py b/mmseg/models/decode_heads/aspp_head.py new file mode 100644 index 0000000000000000000000000000000000000000..6332ab120ceb040f18ab962c74a97dd23bb17caa --- /dev/null +++ b/mmseg/models/decode_heads/aspp_head.py @@ -0,0 +1,107 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +class ASPPModule(nn.ModuleList): + """Atrous Spatial Pyramid Pooling (ASPP) Module. + + Args: + dilations (tuple[int]): Dilation rate of each layer. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, dilations, in_channels, channels, conv_cfg, norm_cfg, + act_cfg): + super(ASPPModule, self).__init__() + self.dilations = dilations + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + for dilation in dilations: + self.append( + ConvModule( + self.in_channels, + self.channels, + 1 if dilation == 1 else 3, + dilation=dilation, + padding=0 if dilation == 1 else dilation, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + + def forward(self, x): + """Forward function.""" + aspp_outs = [] + for aspp_module in self: + aspp_outs.append(aspp_module(x)) + + return aspp_outs + + +@HEADS.register_module() +class ASPPHead(BaseDecodeHead): + """Rethinking Atrous Convolution for Semantic Image Segmentation. + + This head is the implementation of `DeepLabV3 + `_. + + Args: + dilations (tuple[int]): Dilation rates for ASPP module. + Default: (1, 6, 12, 18). + """ + + def __init__(self, dilations=(1, 6, 12, 18), **kwargs): + super(ASPPHead, self).__init__(**kwargs) + assert isinstance(dilations, (list, tuple)) + self.dilations = dilations + self.image_pool = nn.Sequential( + nn.AdaptiveAvgPool2d(1), + ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.aspp_modules = ASPPModule( + dilations, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.bottleneck = ConvModule( + (len(dilations) + 1) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + aspp_outs = [ + resize( + self.image_pool(x), + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + ] + aspp_outs.extend(self.aspp_modules(x)) + aspp_outs = torch.cat(aspp_outs, dim=1) + output = self.bottleneck(aspp_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/cascade_decode_head.py b/mmseg/models/decode_heads/cascade_decode_head.py new file mode 100644 index 0000000000000000000000000000000000000000..d02122ca0e68743b1bf7a893afae96042f23838c --- /dev/null +++ b/mmseg/models/decode_heads/cascade_decode_head.py @@ -0,0 +1,57 @@ +from abc import ABCMeta, abstractmethod + +from .decode_head import BaseDecodeHead + + +class BaseCascadeDecodeHead(BaseDecodeHead, metaclass=ABCMeta): + """Base class for cascade decode head used in + :class:`CascadeEncoderDecoder.""" + + def __init__(self, *args, **kwargs): + super(BaseCascadeDecodeHead, self).__init__(*args, **kwargs) + + @abstractmethod + def forward(self, inputs, prev_output): + """Placeholder of forward function.""" + pass + + def forward_train(self, inputs, prev_output, img_metas, gt_semantic_seg, + train_cfg): + """Forward function for training. + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + gt_semantic_seg (Tensor): Semantic segmentation masks + used if the architecture supports semantic segmentation task. + train_cfg (dict): The training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + seg_logits = self.forward(inputs, prev_output) + losses = self.losses(seg_logits, gt_semantic_seg) + + return losses + + def forward_test(self, inputs, prev_output, img_metas, test_cfg): + """Forward function for testing. + + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Output segmentation map. + """ + return self.forward(inputs, prev_output) diff --git a/mmseg/models/decode_heads/cc_head.py b/mmseg/models/decode_heads/cc_head.py new file mode 100644 index 0000000000000000000000000000000000000000..95c2706a5d4d7877895146c5ebf4396a78d29a8d --- /dev/null +++ b/mmseg/models/decode_heads/cc_head.py @@ -0,0 +1,42 @@ +import torch + +from ..builder import HEADS +from .fcn_head import FCNHead + +try: + from mmcv.ops import CrissCrossAttention +except ModuleNotFoundError: + CrissCrossAttention = None + + +@HEADS.register_module() +class CCHead(FCNHead): + """CCNet: Criss-Cross Attention for Semantic Segmentation. + + This head is the implementation of `CCNet + `_. + + Args: + recurrence (int): Number of recurrence of Criss Cross Attention + module. Default: 2. + """ + + def __init__(self, recurrence=2, **kwargs): + if CrissCrossAttention is None: + raise RuntimeError('Please install mmcv-full for ' + 'CrissCrossAttention ops') + super(CCHead, self).__init__(num_convs=2, **kwargs) + self.recurrence = recurrence + self.cca = CrissCrossAttention(self.channels) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + for _ in range(self.recurrence): + output = self.cca(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/da_head.py b/mmseg/models/decode_heads/da_head.py new file mode 100644 index 0000000000000000000000000000000000000000..8ee0e08c3d69ee4392aa550072a043548c377571 --- /dev/null +++ b/mmseg/models/decode_heads/da_head.py @@ -0,0 +1,178 @@ +import torch +import torch.nn.functional as F +from mmcv.cnn import ConvModule, Scale +from torch import nn + +from mmseg.core import add_prefix +from ..builder import HEADS +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from .decode_head import BaseDecodeHead + + +class PAM(_SelfAttentionBlock): + """Position Attention Module (PAM) + + Args: + in_channels (int): Input channels of key/query feature. + channels (int): Output channels of key/query transform. + """ + + def __init__(self, in_channels, channels): + super(PAM, self).__init__( + key_in_channels=in_channels, + query_in_channels=in_channels, + channels=channels, + out_channels=in_channels, + share_key_query=False, + query_downsample=None, + key_downsample=None, + key_query_num_convs=1, + key_query_norm=False, + value_out_num_convs=1, + value_out_norm=False, + matmul_norm=False, + with_out=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None) + + self.gamma = Scale(0) + + def forward(self, x): + """Forward function.""" + out = super(PAM, self).forward(x, x) + + out = self.gamma(out) + x + return out + + +class CAM(nn.Module): + """Channel Attention Module (CAM)""" + + def __init__(self): + super(CAM, self).__init__() + self.gamma = Scale(0) + + def forward(self, x): + """Forward function.""" + batch_size, channels, height, width = x.size() + proj_query = x.view(batch_size, channels, -1) + proj_key = x.view(batch_size, channels, -1).permute(0, 2, 1) + energy = torch.bmm(proj_query, proj_key) + energy_new = torch.max( + energy, -1, keepdim=True)[0].expand_as(energy) - energy + attention = F.softmax(energy_new, dim=-1) + proj_value = x.view(batch_size, channels, -1) + + out = torch.bmm(attention, proj_value) + out = out.view(batch_size, channels, height, width) + + out = self.gamma(out) + x + return out + + +@HEADS.register_module() +class DAHead(BaseDecodeHead): + """Dual Attention Network for Scene Segmentation. + + This head is the implementation of `DANet + `_. + + Args: + pam_channels (int): The channels of Position Attention Module(PAM). + """ + + def __init__(self, pam_channels, **kwargs): + super(DAHead, self).__init__(**kwargs) + self.pam_channels = pam_channels + self.pam_in_conv = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.pam = PAM(self.channels, pam_channels) + self.pam_out_conv = ConvModule( + self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.pam_conv_seg = nn.Conv2d( + self.channels, self.num_classes, kernel_size=1) + + self.cam_in_conv = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.cam = CAM() + self.cam_out_conv = ConvModule( + self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.cam_conv_seg = nn.Conv2d( + self.channels, self.num_classes, kernel_size=1) + + def pam_cls_seg(self, feat): + """PAM feature classification.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.pam_conv_seg(feat) + return output + + def cam_cls_seg(self, feat): + """CAM feature classification.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.cam_conv_seg(feat) + return output + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + pam_feat = self.pam_in_conv(x) + pam_feat = self.pam(pam_feat) + pam_feat = self.pam_out_conv(pam_feat) + pam_out = self.pam_cls_seg(pam_feat) + + cam_feat = self.cam_in_conv(x) + cam_feat = self.cam(cam_feat) + cam_feat = self.cam_out_conv(cam_feat) + cam_out = self.cam_cls_seg(cam_feat) + + feat_sum = pam_feat + cam_feat + pam_cam_out = self.cls_seg(feat_sum) + + return pam_cam_out, pam_out, cam_out + + def forward_test(self, inputs, img_metas, test_cfg): + """Forward function for testing, only ``pam_cam`` is used.""" + return self.forward(inputs)[0] + + def losses(self, seg_logit, seg_label): + """Compute ``pam_cam``, ``pam``, ``cam`` loss.""" + pam_cam_seg_logit, pam_seg_logit, cam_seg_logit = seg_logit + loss = dict() + loss.update( + add_prefix( + super(DAHead, self).losses(pam_cam_seg_logit, seg_label), + 'pam_cam')) + loss.update( + add_prefix( + super(DAHead, self).losses(pam_seg_logit, seg_label), 'pam')) + loss.update( + add_prefix( + super(DAHead, self).losses(cam_seg_logit, seg_label), 'cam')) + return loss diff --git a/mmseg/models/decode_heads/decode_head.py b/mmseg/models/decode_heads/decode_head.py new file mode 100644 index 0000000000000000000000000000000000000000..86b9b63f43818c4b842a25d143060b07c2b401e1 --- /dev/null +++ b/mmseg/models/decode_heads/decode_head.py @@ -0,0 +1,234 @@ +from abc import ABCMeta, abstractmethod + +import torch +import torch.nn as nn +from mmcv.cnn import normal_init +from mmcv.runner import auto_fp16, force_fp32 + +from mmseg.core import build_pixel_sampler +from mmseg.ops import resize +from ..builder import build_loss +from ..losses import accuracy + + +class BaseDecodeHead(nn.Module, metaclass=ABCMeta): + """Base class for BaseDecodeHead. + + Args: + in_channels (int|Sequence[int]): Input channels. + channels (int): Channels after modules, before conv_seg. + num_classes (int): Number of classes. + dropout_ratio (float): Ratio of dropout layer. Default: 0.1. + conv_cfg (dict|None): Config of conv layers. Default: None. + norm_cfg (dict|None): Config of norm layers. Default: None. + act_cfg (dict): Config of activation layers. + Default: dict(type='ReLU') + in_index (int|Sequence[int]): Input feature index. Default: -1 + input_transform (str|None): Transformation type of input features. + Options: 'resize_concat', 'multiple_select', None. + 'resize_concat': Multiple feature maps will be resize to the + same size as first one and than concat together. + Usually used in FCN head of HRNet. + 'multiple_select': Multiple feature maps will be bundle into + a list and passed into decode head. + None: Only one select feature map is allowed. + Default: None. + loss_decode (dict): Config of decode loss. + Default: dict(type='CrossEntropyLoss'). + ignore_index (int | None): The label index to be ignored. When using + masked BCE loss, ignore_index should be set to None. Default: 255 + sampler (dict|None): The config of segmentation map sampler. + Default: None. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + """ + + def __init__(self, + in_channels, + channels, + *, + num_classes, + dropout_ratio=0.1, + conv_cfg=None, + norm_cfg=None, + act_cfg=dict(type='ReLU'), + in_index=-1, + input_transform=None, + loss_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + ignore_index=255, + sampler=None, + align_corners=False): + super(BaseDecodeHead, self).__init__() + self._init_inputs(in_channels, in_index, input_transform) + self.channels = channels + self.num_classes = num_classes + self.dropout_ratio = dropout_ratio + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.in_index = in_index + self.loss_decode = build_loss(loss_decode) + self.ignore_index = ignore_index + self.align_corners = align_corners + if sampler is not None: + self.sampler = build_pixel_sampler(sampler, context=self) + else: + self.sampler = None + + self.conv_seg = nn.Conv2d(channels, num_classes, kernel_size=1) + if dropout_ratio > 0: + self.dropout = nn.Dropout2d(dropout_ratio) + else: + self.dropout = None + self.fp16_enabled = False + + def extra_repr(self): + """Extra repr.""" + s = f'input_transform={self.input_transform}, ' \ + f'ignore_index={self.ignore_index}, ' \ + f'align_corners={self.align_corners}' + return s + + def _init_inputs(self, in_channels, in_index, input_transform): + """Check and initialize input transforms. + + The in_channels, in_index and input_transform must match. + Specifically, when input_transform is None, only single feature map + will be selected. So in_channels and in_index must be of type int. + When input_transform + + Args: + in_channels (int|Sequence[int]): Input channels. + in_index (int|Sequence[int]): Input feature index. + input_transform (str|None): Transformation type of input features. + Options: 'resize_concat', 'multiple_select', None. + 'resize_concat': Multiple feature maps will be resize to the + same size as first one and than concat together. + Usually used in FCN head of HRNet. + 'multiple_select': Multiple feature maps will be bundle into + a list and passed into decode head. + None: Only one select feature map is allowed. + """ + + if input_transform is not None: + assert input_transform in ['resize_concat', 'multiple_select'] + self.input_transform = input_transform + self.in_index = in_index + if input_transform is not None: + assert isinstance(in_channels, (list, tuple)) + assert isinstance(in_index, (list, tuple)) + assert len(in_channels) == len(in_index) + if input_transform == 'resize_concat': + self.in_channels = sum(in_channels) + else: + self.in_channels = in_channels + else: + assert isinstance(in_channels, int) + assert isinstance(in_index, int) + self.in_channels = in_channels + + def init_weights(self): + """Initialize weights of classification layer.""" + normal_init(self.conv_seg, mean=0, std=0.01) + + def _transform_inputs(self, inputs): + """Transform inputs for decoder. + + Args: + inputs (list[Tensor]): List of multi-level img features. + + Returns: + Tensor: The transformed inputs + """ + + if self.input_transform == 'resize_concat': + inputs = [inputs[i] for i in self.in_index] + upsampled_inputs = [ + resize( + input=x, + size=inputs[0].shape[2:], + mode='bilinear', + align_corners=self.align_corners) for x in inputs + ] + inputs = torch.cat(upsampled_inputs, dim=1) + elif self.input_transform == 'multiple_select': + inputs = [inputs[i] for i in self.in_index] + else: + inputs = inputs[self.in_index] + + return inputs + + @auto_fp16() + @abstractmethod + def forward(self, inputs): + """Placeholder of forward function.""" + pass + + def forward_train(self, inputs, img_metas, gt_semantic_seg, train_cfg): + """Forward function for training. + Args: + inputs (list[Tensor]): List of multi-level img features. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + gt_semantic_seg (Tensor): Semantic segmentation masks + used if the architecture supports semantic segmentation task. + train_cfg (dict): The training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + seg_logits = self.forward(inputs) + losses = self.losses(seg_logits, gt_semantic_seg) + return losses + + def forward_test(self, inputs, img_metas, test_cfg): + """Forward function for testing. + + Args: + inputs (list[Tensor]): List of multi-level img features. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Output segmentation map. + """ + return self.forward(inputs) + + def cls_seg(self, feat): + """Classify each pixel.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.conv_seg(feat) + return output + + @force_fp32(apply_to=('seg_logit', )) + def losses(self, seg_logit, seg_label): + """Compute segmentation loss.""" + loss = dict() + seg_logit = resize( + input=seg_logit, + size=seg_label.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + if self.sampler is not None: + seg_weight = self.sampler.sample(seg_logit, seg_label) + else: + seg_weight = None + seg_label = seg_label.squeeze(1) + loss['loss_seg'] = self.loss_decode( + seg_logit, + seg_label, + weight=seg_weight, + ignore_index=self.ignore_index) + loss['acc_seg'] = accuracy(seg_logit, seg_label) + return loss diff --git a/mmseg/models/decode_heads/dm_head.py b/mmseg/models/decode_heads/dm_head.py new file mode 100644 index 0000000000000000000000000000000000000000..1c918fc35d1477f7a961e3c8185f451583e3e8d8 --- /dev/null +++ b/mmseg/models/decode_heads/dm_head.py @@ -0,0 +1,140 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_activation_layer, build_norm_layer + +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +class DCM(nn.Module): + """Dynamic Convolutional Module used in DMNet. + + Args: + filter_size (int): The filter size of generated convolution kernel + used in Dynamic Convolutional Module. + fusion (bool): Add one conv to fuse DCM output feature. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict | None): Config of conv layers. + norm_cfg (dict | None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, filter_size, fusion, in_channels, channels, conv_cfg, + norm_cfg, act_cfg): + super(DCM, self).__init__() + self.filter_size = filter_size + self.fusion = fusion + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.filter_gen_conv = nn.Conv2d(self.in_channels, self.channels, 1, 1, + 0) + + self.input_redu_conv = ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + if self.norm_cfg is not None: + self.norm = build_norm_layer(self.norm_cfg, self.channels)[1] + else: + self.norm = None + self.activate = build_activation_layer(self.act_cfg) + + if self.fusion: + self.fusion_conv = ConvModule( + self.channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, x): + """Forward function.""" + generted_filter = self.filter_gen_conv( + F.adaptive_avg_pool2d(x, self.filter_size)) + x = self.input_redu_conv(x) + b, c, h, w = x.shape + # [1, b * c, h, w], c = self.channels + x = x.view(1, b * c, h, w) + # [b * c, 1, filter_size, filter_size] + generted_filter = generted_filter.view(b * c, 1, self.filter_size, + self.filter_size) + pad = (self.filter_size - 1) // 2 + if (self.filter_size - 1) % 2 == 0: + p2d = (pad, pad, pad, pad) + else: + p2d = (pad + 1, pad, pad + 1, pad) + x = F.pad(input=x, pad=p2d, mode='constant', value=0) + # [1, b * c, h, w] + output = F.conv2d(input=x, weight=generted_filter, groups=b * c) + # [b, c, h, w] + output = output.view(b, c, h, w) + if self.norm is not None: + output = self.norm(output) + output = self.activate(output) + + if self.fusion: + output = self.fusion_conv(output) + + return output + + +@HEADS.register_module() +class DMHead(BaseDecodeHead): + """Dynamic Multi-scale Filters for Semantic Segmentation. + + This head is the implementation of + `DMNet `_. + + Args: + filter_sizes (tuple[int]): The size of generated convolutional filters + used in Dynamic Convolutional Module. Default: (1, 3, 5, 7). + fusion (bool): Add one conv to fuse DCM output feature. + """ + + def __init__(self, filter_sizes=(1, 3, 5, 7), fusion=False, **kwargs): + super(DMHead, self).__init__(**kwargs) + assert isinstance(filter_sizes, (list, tuple)) + self.filter_sizes = filter_sizes + self.fusion = fusion + dcm_modules = [] + for filter_size in self.filter_sizes: + dcm_modules.append( + DCM(filter_size, + self.fusion, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.dcm_modules = nn.ModuleList(dcm_modules) + self.bottleneck = ConvModule( + self.in_channels + len(filter_sizes) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + dcm_outs = [x] + for dcm_module in self.dcm_modules: + dcm_outs.append(dcm_module(x)) + dcm_outs = torch.cat(dcm_outs, dim=1) + output = self.bottleneck(dcm_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/dnl_head.py b/mmseg/models/decode_heads/dnl_head.py new file mode 100644 index 0000000000000000000000000000000000000000..52a662ccb6ae8ff00930eb54ed71113724b6494e --- /dev/null +++ b/mmseg/models/decode_heads/dnl_head.py @@ -0,0 +1,131 @@ +import torch +from mmcv.cnn import NonLocal2d +from torch import nn + +from ..builder import HEADS +from .fcn_head import FCNHead + + +class DisentangledNonLocal2d(NonLocal2d): + """Disentangled Non-Local Blocks. + + Args: + temperature (float): Temperature to adjust attention. Default: 0.05 + """ + + def __init__(self, *arg, temperature, **kwargs): + super().__init__(*arg, **kwargs) + self.temperature = temperature + self.conv_mask = nn.Conv2d(self.in_channels, 1, kernel_size=1) + + def embedded_gaussian(self, theta_x, phi_x): + """Embedded gaussian with temperature.""" + + # NonLocal2d pairwise_weight: [N, HxW, HxW] + pairwise_weight = torch.matmul(theta_x, phi_x) + if self.use_scale: + # theta_x.shape[-1] is `self.inter_channels` + pairwise_weight /= theta_x.shape[-1]**0.5 + pairwise_weight /= self.temperature + pairwise_weight = pairwise_weight.softmax(dim=-1) + return pairwise_weight + + def forward(self, x): + # x: [N, C, H, W] + n = x.size(0) + + # g_x: [N, HxW, C] + g_x = self.g(x).view(n, self.inter_channels, -1) + g_x = g_x.permute(0, 2, 1) + + # theta_x: [N, HxW, C], phi_x: [N, C, HxW] + if self.mode == 'gaussian': + theta_x = x.view(n, self.in_channels, -1) + theta_x = theta_x.permute(0, 2, 1) + if self.sub_sample: + phi_x = self.phi(x).view(n, self.in_channels, -1) + else: + phi_x = x.view(n, self.in_channels, -1) + elif self.mode == 'concatenation': + theta_x = self.theta(x).view(n, self.inter_channels, -1, 1) + phi_x = self.phi(x).view(n, self.inter_channels, 1, -1) + else: + theta_x = self.theta(x).view(n, self.inter_channels, -1) + theta_x = theta_x.permute(0, 2, 1) + phi_x = self.phi(x).view(n, self.inter_channels, -1) + + # subtract mean + theta_x -= theta_x.mean(dim=-2, keepdim=True) + phi_x -= phi_x.mean(dim=-1, keepdim=True) + + pairwise_func = getattr(self, self.mode) + # pairwise_weight: [N, HxW, HxW] + pairwise_weight = pairwise_func(theta_x, phi_x) + + # y: [N, HxW, C] + y = torch.matmul(pairwise_weight, g_x) + # y: [N, C, H, W] + y = y.permute(0, 2, 1).contiguous().reshape(n, self.inter_channels, + *x.size()[2:]) + + # unary_mask: [N, 1, HxW] + unary_mask = self.conv_mask(x) + unary_mask = unary_mask.view(n, 1, -1) + unary_mask = unary_mask.softmax(dim=-1) + # unary_x: [N, 1, C] + unary_x = torch.matmul(unary_mask, g_x) + # unary_x: [N, C, 1, 1] + unary_x = unary_x.permute(0, 2, 1).contiguous().reshape( + n, self.inter_channels, 1, 1) + + output = x + self.conv_out(y + unary_x) + + return output + + +@HEADS.register_module() +class DNLHead(FCNHead): + """Disentangled Non-Local Neural Networks. + + This head is the implementation of `DNLNet + `_. + + Args: + reduction (int): Reduction factor of projection transform. Default: 2. + use_scale (bool): Whether to scale pairwise_weight by + sqrt(1/inter_channels). Default: False. + mode (str): The nonlocal mode. Options are 'embedded_gaussian', + 'dot_product'. Default: 'embedded_gaussian.'. + temperature (float): Temperature to adjust attention. Default: 0.05 + """ + + def __init__(self, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + temperature=0.05, + **kwargs): + super(DNLHead, self).__init__(num_convs=2, **kwargs) + self.reduction = reduction + self.use_scale = use_scale + self.mode = mode + self.temperature = temperature + self.dnl_block = DisentangledNonLocal2d( + in_channels=self.channels, + reduction=self.reduction, + use_scale=self.use_scale, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + mode=self.mode, + temperature=self.temperature) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + output = self.dnl_block(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/ema_head.py b/mmseg/models/decode_heads/ema_head.py new file mode 100644 index 0000000000000000000000000000000000000000..619d757046a61e2dd1ad4b88a8b85f4688f35492 --- /dev/null +++ b/mmseg/models/decode_heads/ema_head.py @@ -0,0 +1,168 @@ +import math + +import torch +import torch.distributed as dist +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +def reduce_mean(tensor): + """Reduce mean when distributed training.""" + if not (dist.is_available() and dist.is_initialized()): + return tensor + tensor = tensor.clone() + dist.all_reduce(tensor.div_(dist.get_world_size()), op=dist.ReduceOp.SUM) + return tensor + + +class EMAModule(nn.Module): + """Expectation Maximization Attention Module used in EMANet. + + Args: + channels (int): Channels of the whole module. + num_bases (int): Number of bases. + num_stages (int): Number of the EM iterations. + """ + + def __init__(self, channels, num_bases, num_stages, momentum): + super(EMAModule, self).__init__() + assert num_stages >= 1, 'num_stages must be at least 1!' + self.num_bases = num_bases + self.num_stages = num_stages + self.momentum = momentum + + bases = torch.zeros(1, channels, self.num_bases) + bases.normal_(0, math.sqrt(2. / self.num_bases)) + # [1, channels, num_bases] + bases = F.normalize(bases, dim=1, p=2) + self.register_buffer('bases', bases) + + def forward(self, feats): + """Forward function.""" + batch_size, channels, height, width = feats.size() + # [batch_size, channels, height*width] + feats = feats.view(batch_size, channels, height * width) + # [batch_size, channels, num_bases] + bases = self.bases.repeat(batch_size, 1, 1) + + with torch.no_grad(): + for i in range(self.num_stages): + # [batch_size, height*width, num_bases] + attention = torch.einsum('bcn,bck->bnk', feats, bases) + attention = F.softmax(attention, dim=2) + # l1 norm + attention_normed = F.normalize(attention, dim=1, p=1) + # [batch_size, channels, num_bases] + bases = torch.einsum('bcn,bnk->bck', feats, attention_normed) + # l2 norm + bases = F.normalize(bases, dim=1, p=2) + + feats_recon = torch.einsum('bck,bnk->bcn', bases, attention) + feats_recon = feats_recon.view(batch_size, channels, height, width) + + if self.training: + bases = bases.mean(dim=0, keepdim=True) + bases = reduce_mean(bases) + # l2 norm + bases = F.normalize(bases, dim=1, p=2) + self.bases = (1 - + self.momentum) * self.bases + self.momentum * bases + + return feats_recon + + +@HEADS.register_module() +class EMAHead(BaseDecodeHead): + """Expectation Maximization Attention Networks for Semantic Segmentation. + + This head is the implementation of `EMANet + `_. + + Args: + ema_channels (int): EMA module channels + num_bases (int): Number of bases. + num_stages (int): Number of the EM iterations. + concat_input (bool): Whether concat the input and output of convs + before classification layer. Default: True + momentum (float): Momentum to update the base. Default: 0.1. + """ + + def __init__(self, + ema_channels, + num_bases, + num_stages, + concat_input=True, + momentum=0.1, + **kwargs): + super(EMAHead, self).__init__(**kwargs) + self.ema_channels = ema_channels + self.num_bases = num_bases + self.num_stages = num_stages + self.concat_input = concat_input + self.momentum = momentum + self.ema_module = EMAModule(self.ema_channels, self.num_bases, + self.num_stages, self.momentum) + + self.ema_in_conv = ConvModule( + self.in_channels, + self.ema_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + # project (0, inf) -> (-inf, inf) + self.ema_mid_conv = ConvModule( + self.ema_channels, + self.ema_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=None, + act_cfg=None) + for param in self.ema_mid_conv.parameters(): + param.requires_grad = False + + self.ema_out_conv = ConvModule( + self.ema_channels, + self.ema_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=None) + self.bottleneck = ConvModule( + self.ema_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if self.concat_input: + self.conv_cat = ConvModule( + self.in_channels + self.channels, + self.channels, + kernel_size=3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + feats = self.ema_in_conv(x) + identity = feats + feats = self.ema_mid_conv(feats) + recon = self.ema_module(feats) + recon = F.relu(recon, inplace=True) + recon = self.ema_out_conv(recon) + output = F.relu(identity + recon, inplace=True) + output = self.bottleneck(output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/enc_head.py b/mmseg/models/decode_heads/enc_head.py new file mode 100644 index 0000000000000000000000000000000000000000..0c11994cf6272bd52ed3576486f4b8d7366af940 --- /dev/null +++ b/mmseg/models/decode_heads/enc_head.py @@ -0,0 +1,187 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_norm_layer + +from mmseg.ops import Encoding, resize +from ..builder import HEADS, build_loss +from .decode_head import BaseDecodeHead + + +class EncModule(nn.Module): + """Encoding Module used in EncNet. + + Args: + in_channels (int): Input channels. + num_codes (int): Number of code words. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + """ + + def __init__(self, in_channels, num_codes, conv_cfg, norm_cfg, act_cfg): + super(EncModule, self).__init__() + self.encoding_project = ConvModule( + in_channels, + in_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + # TODO: resolve this hack + # change to 1d + if norm_cfg is not None: + encoding_norm_cfg = norm_cfg.copy() + if encoding_norm_cfg['type'] in ['BN', 'IN']: + encoding_norm_cfg['type'] += '1d' + else: + encoding_norm_cfg['type'] = encoding_norm_cfg['type'].replace( + '2d', '1d') + else: + # fallback to BN1d + encoding_norm_cfg = dict(type='BN1d') + self.encoding = nn.Sequential( + Encoding(channels=in_channels, num_codes=num_codes), + build_norm_layer(encoding_norm_cfg, num_codes)[1], + nn.ReLU(inplace=True)) + self.fc = nn.Sequential( + nn.Linear(in_channels, in_channels), nn.Sigmoid()) + + def forward(self, x): + """Forward function.""" + encoding_projection = self.encoding_project(x) + encoding_feat = self.encoding(encoding_projection).mean(dim=1) + batch_size, channels, _, _ = x.size() + gamma = self.fc(encoding_feat) + y = gamma.view(batch_size, channels, 1, 1) + output = F.relu_(x + x * y) + return encoding_feat, output + + +@HEADS.register_module() +class EncHead(BaseDecodeHead): + """Context Encoding for Semantic Segmentation. + + This head is the implementation of `EncNet + `_. + + Args: + num_codes (int): Number of code words. Default: 32. + use_se_loss (bool): Whether use Semantic Encoding Loss (SE-loss) to + regularize the training. Default: True. + add_lateral (bool): Whether use lateral connection to fuse features. + Default: False. + loss_se_decode (dict): Config of decode loss. + Default: dict(type='CrossEntropyLoss', use_sigmoid=True). + """ + + def __init__(self, + num_codes=32, + use_se_loss=True, + add_lateral=False, + loss_se_decode=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=0.2), + **kwargs): + super(EncHead, self).__init__( + input_transform='multiple_select', **kwargs) + self.use_se_loss = use_se_loss + self.add_lateral = add_lateral + self.num_codes = num_codes + self.bottleneck = ConvModule( + self.in_channels[-1], + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if add_lateral: + self.lateral_convs = nn.ModuleList() + for in_channels in self.in_channels[:-1]: # skip the last one + self.lateral_convs.append( + ConvModule( + in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.fusion = ConvModule( + len(self.in_channels) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.enc_module = EncModule( + self.channels, + num_codes=num_codes, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if self.use_se_loss: + self.loss_se_decode = build_loss(loss_se_decode) + self.se_layer = nn.Linear(self.channels, self.num_classes) + + def forward(self, inputs): + """Forward function.""" + inputs = self._transform_inputs(inputs) + feat = self.bottleneck(inputs[-1]) + if self.add_lateral: + laterals = [ + resize( + lateral_conv(inputs[i]), + size=feat.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + feat = self.fusion(torch.cat([feat, *laterals], 1)) + encode_feat, output = self.enc_module(feat) + output = self.cls_seg(output) + if self.use_se_loss: + se_output = self.se_layer(encode_feat) + return output, se_output + else: + return output + + def forward_test(self, inputs, img_metas, test_cfg): + """Forward function for testing, ignore se_loss.""" + if self.use_se_loss: + return self.forward(inputs)[0] + else: + return self.forward(inputs) + + @staticmethod + def _convert_to_onehot_labels(seg_label, num_classes): + """Convert segmentation label to onehot. + + Args: + seg_label (Tensor): Segmentation label of shape (N, H, W). + num_classes (int): Number of classes. + + Returns: + Tensor: Onehot labels of shape (N, num_classes). + """ + + batch_size = seg_label.size(0) + onehot_labels = seg_label.new_zeros((batch_size, num_classes)) + for i in range(batch_size): + hist = seg_label[i].float().histc( + bins=num_classes, min=0, max=num_classes - 1) + onehot_labels[i] = hist > 0 + return onehot_labels + + def losses(self, seg_logit, seg_label): + """Compute segmentation and semantic encoding loss.""" + seg_logit, se_seg_logit = seg_logit + loss = dict() + loss.update(super(EncHead, self).losses(seg_logit, seg_label)) + se_loss = self.loss_se_decode( + se_seg_logit, + self._convert_to_onehot_labels(seg_label, self.num_classes)) + loss['loss_se'] = se_loss + return loss diff --git a/mmseg/models/decode_heads/fcn_head.py b/mmseg/models/decode_heads/fcn_head.py new file mode 100644 index 0000000000000000000000000000000000000000..d660847f8919c3d53d0e41358962fedab5a25044 --- /dev/null +++ b/mmseg/models/decode_heads/fcn_head.py @@ -0,0 +1,76 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +@HEADS.register_module() +class FCNHead(BaseDecodeHead): + """Fully Convolution Networks for Semantic Segmentation. + + This head is implemented of `FCNNet `_. + + Args: + num_convs (int): Number of convs in the head. Default: 2. + kernel_size (int): The kernel size for convs in the head. Default: 3. + concat_input (bool): Whether concat the input and output of convs + before classification layer. + """ + + def __init__(self, + num_convs=2, + kernel_size=3, + concat_input=True, + **kwargs): + assert num_convs >= 0 + self.num_convs = num_convs + self.concat_input = concat_input + self.kernel_size = kernel_size + super(FCNHead, self).__init__(**kwargs) + if num_convs == 0: + assert self.in_channels == self.channels + + convs = [] + convs.append( + ConvModule( + self.in_channels, + self.channels, + kernel_size=kernel_size, + padding=kernel_size // 2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + for i in range(num_convs - 1): + convs.append( + ConvModule( + self.channels, + self.channels, + kernel_size=kernel_size, + padding=kernel_size // 2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + if num_convs == 0: + self.convs = nn.Identity() + else: + self.convs = nn.Sequential(*convs) + if self.concat_input: + self.conv_cat = ConvModule( + self.in_channels + self.channels, + self.channels, + kernel_size=kernel_size, + padding=kernel_size // 2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs(x) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/fpn_head.py b/mmseg/models/decode_heads/fpn_head.py new file mode 100644 index 0000000000000000000000000000000000000000..9b6ada005995cc7e7f0b0cd66f4880d6a2bd665b --- /dev/null +++ b/mmseg/models/decode_heads/fpn_head.py @@ -0,0 +1,68 @@ +import numpy as np +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +@HEADS.register_module() +class FPNHead(BaseDecodeHead): + """Panoptic Feature Pyramid Networks. + + This head is the implementation of `Semantic FPN + `_. + + Args: + feature_strides (tuple[int]): The strides for input feature maps. + stack_lateral. All strides suppose to be power of 2. The first + one is of largest resolution. + """ + + def __init__(self, feature_strides, **kwargs): + super(FPNHead, self).__init__( + input_transform='multiple_select', **kwargs) + assert len(feature_strides) == len(self.in_channels) + assert min(feature_strides) == feature_strides[0] + self.feature_strides = feature_strides + + self.scale_heads = nn.ModuleList() + for i in range(len(feature_strides)): + head_length = max( + 1, + int(np.log2(feature_strides[i]) - np.log2(feature_strides[0]))) + scale_head = [] + for k in range(head_length): + scale_head.append( + ConvModule( + self.in_channels[i] if k == 0 else self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + if feature_strides[i] != feature_strides[0]: + scale_head.append( + nn.Upsample( + scale_factor=2, + mode='bilinear', + align_corners=self.align_corners)) + self.scale_heads.append(nn.Sequential(*scale_head)) + + def forward(self, inputs): + + x = self._transform_inputs(inputs) + + output = self.scale_heads[0](x[0]) + for i in range(1, len(self.feature_strides)): + # non inplace + output = output + resize( + self.scale_heads[i](x[i]), + size=output.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/gc_head.py b/mmseg/models/decode_heads/gc_head.py new file mode 100644 index 0000000000000000000000000000000000000000..336866375002c84206bec0d8c8e06518abefac6f --- /dev/null +++ b/mmseg/models/decode_heads/gc_head.py @@ -0,0 +1,47 @@ +import torch +from mmcv.cnn import ContextBlock + +from ..builder import HEADS +from .fcn_head import FCNHead + + +@HEADS.register_module() +class GCHead(FCNHead): + """GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond. + + This head is the implementation of `GCNet + `_. + + Args: + ratio (float): Multiplier of channels ratio. Default: 1/4. + pooling_type (str): The pooling type of context aggregation. + Options are 'att', 'avg'. Default: 'avg'. + fusion_types (tuple[str]): The fusion type for feature fusion. + Options are 'channel_add', 'channel_mul'. Defautl: ('channel_add',) + """ + + def __init__(self, + ratio=1 / 4., + pooling_type='att', + fusion_types=('channel_add', ), + **kwargs): + super(GCHead, self).__init__(num_convs=2, **kwargs) + self.ratio = ratio + self.pooling_type = pooling_type + self.fusion_types = fusion_types + self.gc_block = ContextBlock( + in_channels=self.channels, + ratio=self.ratio, + pooling_type=self.pooling_type, + fusion_types=self.fusion_types) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + output = self.gc_block(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/helpers.py b/mmseg/models/decode_heads/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..6813f73575dabe89d415cee0d55cb17b056b88de --- /dev/null +++ b/mmseg/models/decode_heads/helpers.py @@ -0,0 +1,93 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as model_zoo +import math +import logging + +_logger = logging.getLogger(__name__) + +def load_pretrained(model, cfg=None, num_classes=1000, in_chans=3, filter_fn=None, strict=True, pos_embed_interp=False, num_patches=576, align_corners=False): + if cfg is None: + cfg = getattr(model, 'default_cfg') + if cfg is None or 'url' not in cfg or not cfg['url']: + _logger.warning("Pretrained model URL is invalid, using random initialization.") + return + + if 'pretrained_finetune' in cfg and cfg['pretrained_finetune']: + state_dict = torch.load(cfg['pretrained_finetune']) + print('load pre-trained weight from ' + cfg['pretrained_finetune']) + else: + state_dict = model_zoo.load_url(cfg['url'], progress=False, map_location='cpu') + print('load pre-trained weight from imagenet21k') + + + if filter_fn is not None: + state_dict = filter_fn(state_dict) + + if in_chans == 1: + conv1_name = cfg['first_conv'] + _logger.info('Converting first conv (%s) pretrained weights from 3 to 1 channel' % conv1_name) + conv1_weight = state_dict[conv1_name + '.weight'] + # Some weights are in torch.half, ensure it's float for sum on CPU + conv1_type = conv1_weight.dtype + conv1_weight = conv1_weight.float() + O, I, J, K = conv1_weight.shape + if I > 3: + assert conv1_weight.shape[1] % 3 == 0 + # For models with space2depth stems + conv1_weight = conv1_weight.reshape(O, I // 3, 3, J, K) + conv1_weight = conv1_weight.sum(dim=2, keepdim=False) + else: + conv1_weight = conv1_weight.sum(dim=1, keepdim=True) + conv1_weight = conv1_weight.to(conv1_type) + state_dict[conv1_name + '.weight'] = conv1_weight + elif in_chans != 3: + conv1_name = cfg['first_conv'] + conv1_weight = state_dict[conv1_name + '.weight'] + conv1_type = conv1_weight.dtype + conv1_weight = conv1_weight.float() + O, I, J, K = conv1_weight.shape + if I == 3: + _logger.warning('Deleting first conv (%s) from pretrained weights.' % conv1_name) + del state_dict[conv1_name + '.weight'] + strict = False + else: + # NOTE this strategy should be better than random init, but there could be other combinations of + # the original RGB input layer weights that'd work better for specific cases. + _logger.info('Repeating first conv (%s) weights in channel dim.' % conv1_name) + repeat = int(math.ceil(in_chans / 3)) + conv1_weight = conv1_weight.repeat(1, repeat, 1, 1)[:, :in_chans, :, :] + conv1_weight *= (3 / float(in_chans)) + conv1_weight = conv1_weight.to(conv1_type) + state_dict[conv1_name + '.weight'] = conv1_weight + + classifier_name = cfg['classifier'] + if num_classes == 1000 and cfg['num_classes'] == 1001: + # special case for imagenet trained models with extra background class in pretrained weights + classifier_weight = state_dict[classifier_name + '.weight'] + state_dict[classifier_name + '.weight'] = classifier_weight[1:] + classifier_bias = state_dict[classifier_name + '.bias'] + state_dict[classifier_name + '.bias'] = classifier_bias[1:] + elif num_classes != cfg['num_classes']: + # completely discard fully connected for all other differences between pretrained and created model + del state_dict[classifier_name + '.weight'] + del state_dict[classifier_name + '.bias'] + strict = False + + + if pos_embed_interp: + pos_embed_weight = state_dict['pos_embed'][:,1:] + pos_embed_weight = pos_embed_weight.transpose(1,2) + n, c, hw = pos_embed_weight.shape + h = w = int(math.sqrt(hw)) + pos_embed_weight = pos_embed_weight.view(n,c,h,w) + + pos_embed_weight = F.interpolate(pos_embed_weight, size=int(math.sqrt(num_patches)), mode='bilinear', align_corners=align_corners) + pos_embed_weight = pos_embed_weight.view(n,c,-1).transpose(1,2) + + cls_token_weight = state_dict['pos_embed'][:,0].unsqueeze(1) + + state_dict['pos_embed'] = torch.cat((cls_token_weight, pos_embed_weight), dim=1) + + model.load_state_dict(state_dict, strict=strict) diff --git a/mmseg/models/decode_heads/layers/__init__.py b/mmseg/models/decode_heads/layers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..afd5f348b48afa6da4570255c269c73c3c73157e --- /dev/null +++ b/mmseg/models/decode_heads/layers/__init__.py @@ -0,0 +1,3 @@ +from .helpers import to_ntuple, to_2tuple, to_3tuple, to_4tuple +from .drop import DropBlock2d, DropPath, drop_block_2d, drop_path +from .weight_init import trunc_normal_ \ No newline at end of file diff --git a/mmseg/models/decode_heads/layers/drop.py b/mmseg/models/decode_heads/layers/drop.py new file mode 100644 index 0000000000000000000000000000000000000000..6de9e3f729f7f1ca29d4511f6c64733d3169fbec --- /dev/null +++ b/mmseg/models/decode_heads/layers/drop.py @@ -0,0 +1,168 @@ +""" DropBlock, DropPath + +PyTorch implementations of DropBlock and DropPath (Stochastic Depth) regularization layers. + +Papers: +DropBlock: A regularization method for convolutional networks (https://arxiv.org/abs/1810.12890) + +Deep Networks with Stochastic Depth (https://arxiv.org/abs/1603.09382) + +Code: +DropBlock impl inspired by two Tensorflow impl that I liked: + - https://github.com/tensorflow/tpu/blob/master/models/official/resnet/resnet_model.py#L74 + - https://github.com/clovaai/assembled-cnn/blob/master/nets/blocks.py + +Hacked together by / Copyright 2020 Ross Wightman +""" +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def drop_block_2d( + x, drop_prob: float = 0.1, block_size: int = 7, gamma_scale: float = 1.0, + with_noise: bool = False, inplace: bool = False, batchwise: bool = False): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + + DropBlock with an experimental gaussian noise option. This layer has been tested on a few training + runs with success, but needs further validation and possibly optimization for lower runtime impact. + """ + B, C, H, W = x.shape + total_size = W * H + clipped_block_size = min(block_size, min(W, H)) + # seed_drop_rate, the gamma parameter + gamma = gamma_scale * drop_prob * total_size / clipped_block_size ** 2 / ( + (W - block_size + 1) * (H - block_size + 1)) + + # Forces the block to be inside the feature map. + w_i, h_i = torch.meshgrid(torch.arange(W).to(x.device), torch.arange(H).to(x.device)) + valid_block = ((w_i >= clipped_block_size // 2) & (w_i < W - (clipped_block_size - 1) // 2)) & \ + ((h_i >= clipped_block_size // 2) & (h_i < H - (clipped_block_size - 1) // 2)) + valid_block = torch.reshape(valid_block, (1, 1, H, W)).to(dtype=x.dtype) + + if batchwise: + # one mask for whole batch, quite a bit faster + uniform_noise = torch.rand((1, C, H, W), dtype=x.dtype, device=x.device) + else: + uniform_noise = torch.rand_like(x) + block_mask = ((2 - gamma - valid_block + uniform_noise) >= 1).to(dtype=x.dtype) + block_mask = -F.max_pool2d( + -block_mask, + kernel_size=clipped_block_size, # block_size, + stride=1, + padding=clipped_block_size // 2) + + if with_noise: + normal_noise = torch.randn((1, C, H, W), dtype=x.dtype, device=x.device) if batchwise else torch.randn_like(x) + if inplace: + x.mul_(block_mask).add_(normal_noise * (1 - block_mask)) + else: + x = x * block_mask + normal_noise * (1 - block_mask) + else: + normalize_scale = (block_mask.numel() / block_mask.to(dtype=torch.float32).sum().add(1e-7)).to(x.dtype) + if inplace: + x.mul_(block_mask * normalize_scale) + else: + x = x * block_mask * normalize_scale + return x + + +def drop_block_fast_2d( + x: torch.Tensor, drop_prob: float = 0.1, block_size: int = 7, + gamma_scale: float = 1.0, with_noise: bool = False, inplace: bool = False, batchwise: bool = False): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + + DropBlock with an experimental gaussian noise option. Simplied from above without concern for valid + block mask at edges. + """ + B, C, H, W = x.shape + total_size = W * H + clipped_block_size = min(block_size, min(W, H)) + gamma = gamma_scale * drop_prob * total_size / clipped_block_size ** 2 / ( + (W - block_size + 1) * (H - block_size + 1)) + + if batchwise: + # one mask for whole batch, quite a bit faster + block_mask = torch.rand((1, C, H, W), dtype=x.dtype, device=x.device) < gamma + else: + # mask per batch element + block_mask = torch.rand_like(x) < gamma + block_mask = F.max_pool2d( + block_mask.to(x.dtype), kernel_size=clipped_block_size, stride=1, padding=clipped_block_size // 2) + + if with_noise: + normal_noise = torch.randn((1, C, H, W), dtype=x.dtype, device=x.device) if batchwise else torch.randn_like(x) + if inplace: + x.mul_(1. - block_mask).add_(normal_noise * block_mask) + else: + x = x * (1. - block_mask) + normal_noise * block_mask + else: + block_mask = 1 - block_mask + normalize_scale = (block_mask.numel() / block_mask.to(dtype=torch.float32).sum().add(1e-7)).to(dtype=x.dtype) + if inplace: + x.mul_(block_mask * normalize_scale) + else: + x = x * block_mask * normalize_scale + return x + + +class DropBlock2d(nn.Module): + """ DropBlock. See https://arxiv.org/pdf/1810.12890.pdf + """ + def __init__(self, + drop_prob=0.1, + block_size=7, + gamma_scale=1.0, + with_noise=False, + inplace=False, + batchwise=False, + fast=True): + super(DropBlock2d, self).__init__() + self.drop_prob = drop_prob + self.gamma_scale = gamma_scale + self.block_size = block_size + self.with_noise = with_noise + self.inplace = inplace + self.batchwise = batchwise + self.fast = fast # FIXME finish comparisons of fast vs not + + def forward(self, x): + if not self.training or not self.drop_prob: + return x + if self.fast: + return drop_block_fast_2d( + x, self.drop_prob, self.block_size, self.gamma_scale, self.with_noise, self.inplace, self.batchwise) + else: + return drop_block_2d( + x, self.drop_prob, self.block_size, self.gamma_scale, self.with_noise, self.inplace, self.batchwise) + + +def drop_path(x, drop_prob: float = 0., training: bool = False): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + + This is the same as the DropConnect impl I created for EfficientNet, etc networks, however, + the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper... + See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for + changing the layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use + 'survival rate' as the argument. + + """ + if drop_prob == 0. or not training: + return x + keep_prob = 1 - drop_prob + shape = (x.shape[0],) + (1,) * (x.ndim - 1) # work with diff dim tensors, not just 2D ConvNets + random_tensor = keep_prob + torch.rand(shape, dtype=x.dtype, device=x.device) + random_tensor.floor_() # binarize + output = x.div(keep_prob) * random_tensor + return output + + +class DropPath(nn.Module): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + """ + def __init__(self, drop_prob=None): + super(DropPath, self).__init__() + self.drop_prob = drop_prob + + def forward(self, x): + return drop_path(x, self.drop_prob, self.training) diff --git a/mmseg/models/decode_heads/layers/helpers.py b/mmseg/models/decode_heads/layers/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..65521132c6a8d911e51e8f95abfeeba2f20843b1 --- /dev/null +++ b/mmseg/models/decode_heads/layers/helpers.py @@ -0,0 +1,26 @@ +""" Layer/Module Helpers + +Hacked together by / Copyright 2020 Ross Wightman +""" +from itertools import repeat +from torch._six import container_abcs + + +# From PyTorch internals +def _ntuple(n): + def parse(x): + if isinstance(x, container_abcs.Iterable): + return x + return tuple(repeat(x, n)) + return parse + + +to_1tuple = _ntuple(1) +to_2tuple = _ntuple(2) +to_3tuple = _ntuple(3) +to_4tuple = _ntuple(4) +to_ntuple = _ntuple + + + + diff --git a/mmseg/models/decode_heads/layers/weight_init.py b/mmseg/models/decode_heads/layers/weight_init.py new file mode 100644 index 0000000000000000000000000000000000000000..d731029ff1708776758d9af60e5b205818940a6d --- /dev/null +++ b/mmseg/models/decode_heads/layers/weight_init.py @@ -0,0 +1,60 @@ +import torch +import math +import warnings + + +def _no_grad_trunc_normal_(tensor, mean, std, a, b): + # Cut & paste from PyTorch official master until it's in a few official releases - RW + # Method based on https://people.sc.fsu.edu/~jburkardt/presentations/truncated_normal.pdf + def norm_cdf(x): + # Computes standard normal cumulative distribution function + return (1. + math.erf(x / math.sqrt(2.))) / 2. + + if (mean < a - 2 * std) or (mean > b + 2 * std): + warnings.warn("mean is more than 2 std from [a, b] in nn.init.trunc_normal_. " + "The distribution of values may be incorrect.", + stacklevel=2) + + with torch.no_grad(): + # Values are generated by using a truncated uniform distribution and + # then using the inverse CDF for the normal distribution. + # Get upper and lower cdf values + l = norm_cdf((a - mean) / std) + u = norm_cdf((b - mean) / std) + + # Uniformly fill tensor with values from [l, u], then translate to + # [2l-1, 2u-1]. + tensor.uniform_(2 * l - 1, 2 * u - 1) + + # Use inverse cdf transform for normal distribution to get truncated + # standard normal + tensor.erfinv_() + + # Transform to proper mean, std + tensor.mul_(std * math.sqrt(2.)) + tensor.add_(mean) + + # Clamp to ensure it's in the proper range + tensor.clamp_(min=a, max=b) + return tensor + + +def trunc_normal_(tensor, mean=0., std=1., a=-2., b=2.): + # type: (Tensor, float, float, float, float) -> Tensor + r"""Fills the input Tensor with values drawn from a truncated + normal distribution. The values are effectively drawn from the + normal distribution :math:`\mathcal{N}(\text{mean}, \text{std}^2)` + with values outside :math:`[a, b]` redrawn until they are within + the bounds. The method used for generating the random values works + best when :math:`a \leq \text{mean} \leq b`. + Args: + tensor: an n-dimensional `torch.Tensor` + mean: the mean of the normal distribution + std: the standard deviation of the normal distribution + a: the minimum cutoff value + b: the maximum cutoff value + Examples: + >>> w = torch.empty(3, 5) + >>> nn.init.trunc_normal_(w) + """ + return _no_grad_trunc_normal_(tensor, mean, std, a, b) diff --git a/mmseg/models/decode_heads/lraspp_head.py b/mmseg/models/decode_heads/lraspp_head.py new file mode 100644 index 0000000000000000000000000000000000000000..32a093caded74a97e991ca61d45bec888396c9f2 --- /dev/null +++ b/mmseg/models/decode_heads/lraspp_head.py @@ -0,0 +1,90 @@ +import torch +import torch.nn as nn +from mmcv import is_tuple_of +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +@HEADS.register_module() +class LRASPPHead(BaseDecodeHead): + """Lite R-ASPP (LRASPP) head is proposed in Searching for MobileNetV3. + + This head is the improved implementation of `Searching for MobileNetV3 + `_. + + Args: + branch_channels (tuple[int]): The number of output channels in every + each branch. Default: (32, 64). + """ + + def __init__(self, branch_channels=(32, 64), **kwargs): + super(LRASPPHead, self).__init__(**kwargs) + if self.input_transform != 'multiple_select': + raise ValueError('in Lite R-ASPP (LRASPP) head, input_transform ' + f'must be \'multiple_select\'. But received ' + f'\'{self.input_transform}\'') + assert is_tuple_of(branch_channels, int) + assert len(branch_channels) == len(self.in_channels) - 1 + self.branch_channels = branch_channels + + self.convs = nn.Sequential() + self.conv_ups = nn.Sequential() + for i in range(len(branch_channels)): + self.convs.add_module( + f'conv{i}', + nn.Conv2d( + self.in_channels[i], branch_channels[i], 1, bias=False)) + self.conv_ups.add_module( + f'conv_up{i}', + ConvModule( + self.channels + branch_channels[i], + self.channels, + 1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + bias=False)) + + self.conv_up_input = nn.Conv2d(self.channels, self.channels, 1) + + self.aspp_conv = ConvModule( + self.in_channels[-1], + self.channels, + 1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + bias=False) + self.image_pool = nn.Sequential( + nn.AvgPool2d(kernel_size=49, stride=(16, 20)), + ConvModule( + self.in_channels[2], + self.channels, + 1, + act_cfg=dict(type='Sigmoid'), + bias=False)) + + def forward(self, inputs): + """Forward function.""" + inputs = self._transform_inputs(inputs) + + x = inputs[-1] + + x = self.aspp_conv(x) * resize( + self.image_pool(x), + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + x = self.conv_up_input(x) + + for i in range(len(self.branch_channels) - 1, -1, -1): + x = resize( + x, + size=inputs[i].size()[2:], + mode='bilinear', + align_corners=self.align_corners) + x = torch.cat([x, self.convs[i](inputs[i])], 1) + x = self.conv_ups[i](x) + + return self.cls_seg(x) diff --git a/mmseg/models/decode_heads/nl_head.py b/mmseg/models/decode_heads/nl_head.py new file mode 100644 index 0000000000000000000000000000000000000000..31658755a6599bc9f52bd59767ef60452d5b9fbb --- /dev/null +++ b/mmseg/models/decode_heads/nl_head.py @@ -0,0 +1,49 @@ +import torch +from mmcv.cnn import NonLocal2d + +from ..builder import HEADS +from .fcn_head import FCNHead + + +@HEADS.register_module() +class NLHead(FCNHead): + """Non-local Neural Networks. + + This head is the implementation of `NLNet + `_. + + Args: + reduction (int): Reduction factor of projection transform. Default: 2. + use_scale (bool): Whether to scale pairwise_weight by + sqrt(1/inter_channels). Default: True. + mode (str): The nonlocal mode. Options are 'embedded_gaussian', + 'dot_product'. Default: 'embedded_gaussian.'. + """ + + def __init__(self, + reduction=2, + use_scale=True, + mode='embedded_gaussian', + **kwargs): + super(NLHead, self).__init__(num_convs=2, **kwargs) + self.reduction = reduction + self.use_scale = use_scale + self.mode = mode + self.nl_block = NonLocal2d( + in_channels=self.channels, + reduction=self.reduction, + use_scale=self.use_scale, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + mode=self.mode) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + output = self.convs[0](x) + output = self.nl_block(output) + output = self.convs[1](output) + if self.concat_input: + output = self.conv_cat(torch.cat([x, output], dim=1)) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/ocr_head.py b/mmseg/models/decode_heads/ocr_head.py new file mode 100644 index 0000000000000000000000000000000000000000..e180e10276e9a4d794501d0f399740c189775673 --- /dev/null +++ b/mmseg/models/decode_heads/ocr_head.py @@ -0,0 +1,127 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from ..utils import SelfAttentionBlock as _SelfAttentionBlock +from .cascade_decode_head import BaseCascadeDecodeHead + + +class SpatialGatherModule(nn.Module): + """Aggregate the context features according to the initial predicted + probability distribution. + + Employ the soft-weighted method to aggregate the context. + """ + + def __init__(self, scale): + super(SpatialGatherModule, self).__init__() + self.scale = scale + + def forward(self, feats, probs): + """Forward function.""" + batch_size, num_classes, height, width = probs.size() + channels = feats.size(1) + probs = probs.view(batch_size, num_classes, -1) + feats = feats.view(batch_size, channels, -1) + # [batch_size, height*width, num_classes] + feats = feats.permute(0, 2, 1) + # [batch_size, channels, height*width] + probs = F.softmax(self.scale * probs, dim=2) + # [batch_size, channels, num_classes] + ocr_context = torch.matmul(probs, feats) + ocr_context = ocr_context.permute(0, 2, 1).contiguous().unsqueeze(3) + return ocr_context + + +class ObjectAttentionBlock(_SelfAttentionBlock): + """Make a OCR used SelfAttentionBlock.""" + + def __init__(self, in_channels, channels, scale, conv_cfg, norm_cfg, + act_cfg): + if scale > 1: + query_downsample = nn.MaxPool2d(kernel_size=scale) + else: + query_downsample = None + super(ObjectAttentionBlock, self).__init__( + key_in_channels=in_channels, + query_in_channels=in_channels, + channels=channels, + out_channels=in_channels, + share_key_query=False, + query_downsample=query_downsample, + key_downsample=None, + key_query_num_convs=2, + key_query_norm=True, + value_out_num_convs=1, + value_out_norm=True, + matmul_norm=True, + with_out=True, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.bottleneck = ConvModule( + in_channels * 2, + in_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, query_feats, key_feats): + """Forward function.""" + context = super(ObjectAttentionBlock, + self).forward(query_feats, key_feats) + output = self.bottleneck(torch.cat([context, query_feats], dim=1)) + if self.query_downsample is not None: + output = resize(query_feats) + + return output + + +@HEADS.register_module() +class OCRHead(BaseCascadeDecodeHead): + """Object-Contextual Representations for Semantic Segmentation. + + This head is the implementation of `OCRNet + `_. + + Args: + ocr_channels (int): The intermediate channels of OCR block. + scale (int): The scale of probability map in SpatialGatherModule in + Default: 1. + """ + + def __init__(self, ocr_channels, scale=1, **kwargs): + super(OCRHead, self).__init__(**kwargs) + self.ocr_channels = ocr_channels + self.scale = scale + self.object_context_block = ObjectAttentionBlock( + self.channels, + self.ocr_channels, + self.scale, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.spatial_gather_module = SpatialGatherModule(self.scale) + + self.bottleneck = ConvModule( + self.in_channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs, prev_output): + """Forward function.""" + x = self._transform_inputs(inputs) + feats = self.bottleneck(x) + context = self.spatial_gather_module(feats, prev_output) + object_context = self.object_context_block(feats, context) + output = self.cls_seg(object_context) + + return output diff --git a/mmseg/models/decode_heads/point_head.py b/mmseg/models/decode_heads/point_head.py new file mode 100644 index 0000000000000000000000000000000000000000..90a23635d935abf1179f181f04ab0f4265c6a1c7 --- /dev/null +++ b/mmseg/models/decode_heads/point_head.py @@ -0,0 +1,349 @@ +# Modified from https://github.com/facebookresearch/detectron2/tree/master/projects/PointRend/point_head/point_head.py # noqa + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, normal_init +from mmcv.ops import point_sample + +from mmseg.models.builder import HEADS +from mmseg.ops import resize +from ..losses import accuracy +from .cascade_decode_head import BaseCascadeDecodeHead + + +def calculate_uncertainty(seg_logits): + """Estimate uncertainty based on seg logits. + + For each location of the prediction ``seg_logits`` we estimate + uncertainty as the difference between top first and top second + predicted logits. + + Args: + seg_logits (Tensor): Semantic segmentation logits, + shape (batch_size, num_classes, height, width). + + Returns: + scores (Tensor): T uncertainty scores with the most uncertain + locations having the highest uncertainty score, shape ( + batch_size, 1, height, width) + """ + top2_scores = torch.topk(seg_logits, k=2, dim=1)[0] + return (top2_scores[:, 1] - top2_scores[:, 0]).unsqueeze(1) + + +@HEADS.register_module() +class PointHead(BaseCascadeDecodeHead): + """A mask point head use in PointRend. + + ``PointHead`` use shared multi-layer perceptron (equivalent to + nn.Conv1d) to predict the logit of input points. The fine-grained feature + and coarse feature will be concatenate together for predication. + + Args: + num_fcs (int): Number of fc layers in the head. Default: 3. + in_channels (int): Number of input channels. Default: 256. + fc_channels (int): Number of fc channels. Default: 256. + num_classes (int): Number of classes for logits. Default: 80. + class_agnostic (bool): Whether use class agnostic classification. + If so, the output channels of logits will be 1. Default: False. + coarse_pred_each_layer (bool): Whether concatenate coarse feature with + the output of each fc layer. Default: True. + conv_cfg (dict|None): Dictionary to construct and config conv layer. + Default: dict(type='Conv1d')) + norm_cfg (dict|None): Dictionary to construct and config norm layer. + Default: None. + loss_point (dict): Dictionary to construct and config loss layer of + point head. Default: dict(type='CrossEntropyLoss', use_mask=True, + loss_weight=1.0). + """ + + def __init__(self, + num_fcs=3, + coarse_pred_each_layer=True, + conv_cfg=dict(type='Conv1d'), + norm_cfg=None, + act_cfg=dict(type='ReLU', inplace=False), + **kwargs): + super(PointHead, self).__init__( + input_transform='multiple_select', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + **kwargs) + + self.num_fcs = num_fcs + self.coarse_pred_each_layer = coarse_pred_each_layer + + fc_in_channels = sum(self.in_channels) + self.num_classes + fc_channels = self.channels + self.fcs = nn.ModuleList() + for k in range(num_fcs): + fc = ConvModule( + fc_in_channels, + fc_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.fcs.append(fc) + fc_in_channels = fc_channels + fc_in_channels += self.num_classes if self.coarse_pred_each_layer \ + else 0 + self.fc_seg = nn.Conv1d( + fc_in_channels, + self.num_classes, + kernel_size=1, + stride=1, + padding=0) + if self.dropout_ratio > 0: + self.dropout = nn.Dropout(self.dropout_ratio) + delattr(self, 'conv_seg') + + def init_weights(self): + """Initialize weights of classification layer.""" + normal_init(self.fc_seg, std=0.001) + + def cls_seg(self, feat): + """Classify each pixel with fc.""" + if self.dropout is not None: + feat = self.dropout(feat) + output = self.fc_seg(feat) + return output + + def forward(self, fine_grained_point_feats, coarse_point_feats): + x = torch.cat([fine_grained_point_feats, coarse_point_feats], dim=1) + for fc in self.fcs: + x = fc(x) + if self.coarse_pred_each_layer: + x = torch.cat((x, coarse_point_feats), dim=1) + return self.cls_seg(x) + + def _get_fine_grained_point_feats(self, x, points): + """Sample from fine grained features. + + Args: + x (list[Tensor]): Feature pyramid from by neck or backbone. + points (Tensor): Point coordinates, shape (batch_size, + num_points, 2). + + Returns: + fine_grained_feats (Tensor): Sampled fine grained feature, + shape (batch_size, sum(channels of x), num_points). + """ + + fine_grained_feats_list = [ + point_sample(_, points, align_corners=self.align_corners) + for _ in x + ] + if len(fine_grained_feats_list) > 1: + fine_grained_feats = torch.cat(fine_grained_feats_list, dim=1) + else: + fine_grained_feats = fine_grained_feats_list[0] + + return fine_grained_feats + + def _get_coarse_point_feats(self, prev_output, points): + """Sample from fine grained features. + + Args: + prev_output (list[Tensor]): Prediction of previous decode head. + points (Tensor): Point coordinates, shape (batch_size, + num_points, 2). + + Returns: + coarse_feats (Tensor): Sampled coarse feature, shape (batch_size, + num_classes, num_points). + """ + + coarse_feats = point_sample( + prev_output, points, align_corners=self.align_corners) + + return coarse_feats + + def forward_train(self, inputs, prev_output, img_metas, gt_semantic_seg, + train_cfg): + """Forward function for training. + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + gt_semantic_seg (Tensor): Semantic segmentation masks + used if the architecture supports semantic segmentation task. + train_cfg (dict): The training config. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + x = self._transform_inputs(inputs) + with torch.no_grad(): + points = self.get_points_train( + prev_output, calculate_uncertainty, cfg=train_cfg) + fine_grained_point_feats = self._get_fine_grained_point_feats( + x, points) + coarse_point_feats = self._get_coarse_point_feats(prev_output, points) + point_logits = self.forward(fine_grained_point_feats, + coarse_point_feats) + point_label = point_sample( + gt_semantic_seg.float(), + points, + mode='nearest', + align_corners=self.align_corners) + point_label = point_label.squeeze(1).long() + + losses = self.losses(point_logits, point_label) + + return losses + + def forward_test(self, inputs, prev_output, img_metas, test_cfg): + """Forward function for testing. + + Args: + inputs (list[Tensor]): List of multi-level img features. + prev_output (Tensor): The output of previous decode head. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + test_cfg (dict): The testing config. + + Returns: + Tensor: Output segmentation map. + """ + + x = self._transform_inputs(inputs) + refined_seg_logits = prev_output.clone() + for _ in range(test_cfg.subdivision_steps): + refined_seg_logits = resize( + refined_seg_logits, + scale_factor=test_cfg.scale_factor, + mode='bilinear', + align_corners=self.align_corners) + batch_size, channels, height, width = refined_seg_logits.shape + point_indices, points = self.get_points_test( + refined_seg_logits, calculate_uncertainty, cfg=test_cfg) + fine_grained_point_feats = self._get_fine_grained_point_feats( + x, points) + coarse_point_feats = self._get_coarse_point_feats( + prev_output, points) + point_logits = self.forward(fine_grained_point_feats, + coarse_point_feats) + + point_indices = point_indices.unsqueeze(1).expand(-1, channels, -1) + refined_seg_logits = refined_seg_logits.reshape( + batch_size, channels, height * width) + refined_seg_logits = refined_seg_logits.scatter_( + 2, point_indices, point_logits) + refined_seg_logits = refined_seg_logits.view( + batch_size, channels, height, width) + + return refined_seg_logits + + def losses(self, point_logits, point_label): + """Compute segmentation loss.""" + loss = dict() + loss['loss_point'] = self.loss_decode( + point_logits, point_label, ignore_index=self.ignore_index) + loss['acc_point'] = accuracy(point_logits, point_label) + return loss + + def get_points_train(self, seg_logits, uncertainty_func, cfg): + """Sample points for training. + + Sample points in [0, 1] x [0, 1] coordinate space based on their + uncertainty. The uncertainties are calculated for each point using + 'uncertainty_func' function that takes point's logit prediction as + input. + + Args: + seg_logits (Tensor): Semantic segmentation logits, shape ( + batch_size, num_classes, height, width). + uncertainty_func (func): uncertainty calculation function. + cfg (dict): Training config of point head. + + Returns: + point_coords (Tensor): A tensor of shape (batch_size, num_points, + 2) that contains the coordinates of ``num_points`` sampled + points. + """ + num_points = cfg.num_points + oversample_ratio = cfg.oversample_ratio + importance_sample_ratio = cfg.importance_sample_ratio + assert oversample_ratio >= 1 + assert 0 <= importance_sample_ratio <= 1 + batch_size = seg_logits.shape[0] + num_sampled = int(num_points * oversample_ratio) + point_coords = torch.rand( + batch_size, num_sampled, 2, device=seg_logits.device) + point_logits = point_sample(seg_logits, point_coords) + # It is crucial to calculate uncertainty based on the sampled + # prediction value for the points. Calculating uncertainties of the + # coarse predictions first and sampling them for points leads to + # incorrect results. To illustrate this: assume uncertainty func( + # logits)=-abs(logits), a sampled point between two coarse + # predictions with -1 and 1 logits has 0 logits, and therefore 0 + # uncertainty value. However, if we calculate uncertainties for the + # coarse predictions first, both will have -1 uncertainty, + # and sampled point will get -1 uncertainty. + point_uncertainties = uncertainty_func(point_logits) + num_uncertain_points = int(importance_sample_ratio * num_points) + num_random_points = num_points - num_uncertain_points + idx = torch.topk( + point_uncertainties[:, 0, :], k=num_uncertain_points, dim=1)[1] + shift = num_sampled * torch.arange( + batch_size, dtype=torch.long, device=seg_logits.device) + idx += shift[:, None] + point_coords = point_coords.view(-1, 2)[idx.view(-1), :].view( + batch_size, num_uncertain_points, 2) + if num_random_points > 0: + rand_point_coords = torch.rand( + batch_size, num_random_points, 2, device=seg_logits.device) + point_coords = torch.cat((point_coords, rand_point_coords), dim=1) + return point_coords + + def get_points_test(self, seg_logits, uncertainty_func, cfg): + """Sample points for testing. + + Find ``num_points`` most uncertain points from ``uncertainty_map``. + + Args: + seg_logits (Tensor): A tensor of shape (batch_size, num_classes, + height, width) for class-specific or class-agnostic prediction. + uncertainty_func (func): uncertainty calculation function. + cfg (dict): Testing config of point head. + + Returns: + point_indices (Tensor): A tensor of shape (batch_size, num_points) + that contains indices from [0, height x width) of the most + uncertain points. + point_coords (Tensor): A tensor of shape (batch_size, num_points, + 2) that contains [0, 1] x [0, 1] normalized coordinates of the + most uncertain points from the ``height x width`` grid . + """ + + num_points = cfg.subdivision_num_points + uncertainty_map = uncertainty_func(seg_logits) + batch_size, _, height, width = uncertainty_map.shape + h_step = 1.0 / height + w_step = 1.0 / width + + uncertainty_map = uncertainty_map.view(batch_size, height * width) + num_points = min(height * width, num_points) + point_indices = uncertainty_map.topk(num_points, dim=1)[1] + point_coords = torch.zeros( + batch_size, + num_points, + 2, + dtype=torch.float, + device=seg_logits.device) + point_coords[:, :, 0] = w_step / 2.0 + (point_indices % + width).float() * w_step + point_coords[:, :, 1] = h_step / 2.0 + (point_indices // + width).float() * h_step + return point_indices, point_coords diff --git a/mmseg/models/decode_heads/psa_head.py b/mmseg/models/decode_heads/psa_head.py new file mode 100644 index 0000000000000000000000000000000000000000..8d915e57f4d22bd723da23b6f03f245476649846 --- /dev/null +++ b/mmseg/models/decode_heads/psa_head.py @@ -0,0 +1,196 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + +try: + from mmcv.ops import PSAMask +except ModuleNotFoundError: + PSAMask = None + + +@HEADS.register_module() +class PSAHead(BaseDecodeHead): + """Point-wise Spatial Attention Network for Scene Parsing. + + This head is the implementation of `PSANet + `_. + + Args: + mask_size (tuple[int]): The PSA mask size. It usually equals input + size. + psa_type (str): The type of psa module. Options are 'collect', + 'distribute', 'bi-direction'. Default: 'bi-direction' + compact (bool): Whether use compact map for 'collect' mode. + Default: True. + shrink_factor (int): The downsample factors of psa mask. Default: 2. + normalization_factor (float): The normalize factor of attention. + psa_softmax (bool): Whether use softmax for attention. + """ + + def __init__(self, + mask_size, + psa_type='bi-direction', + compact=False, + shrink_factor=2, + normalization_factor=1.0, + psa_softmax=True, + **kwargs): + if PSAMask is None: + raise RuntimeError('Please install mmcv-full for PSAMask ops') + super(PSAHead, self).__init__(**kwargs) + assert psa_type in ['collect', 'distribute', 'bi-direction'] + self.psa_type = psa_type + self.compact = compact + self.shrink_factor = shrink_factor + self.mask_size = mask_size + mask_h, mask_w = mask_size + self.psa_softmax = psa_softmax + if normalization_factor is None: + normalization_factor = mask_h * mask_w + self.normalization_factor = normalization_factor + + self.reduce = ConvModule( + self.in_channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.attention = nn.Sequential( + ConvModule( + self.channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + nn.Conv2d( + self.channels, mask_h * mask_w, kernel_size=1, bias=False)) + if psa_type == 'bi-direction': + self.reduce_p = ConvModule( + self.in_channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.attention_p = nn.Sequential( + ConvModule( + self.channels, + self.channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + nn.Conv2d( + self.channels, mask_h * mask_w, kernel_size=1, bias=False)) + self.psamask_collect = PSAMask('collect', mask_size) + self.psamask_distribute = PSAMask('distribute', mask_size) + else: + self.psamask = PSAMask(psa_type, mask_size) + self.proj = ConvModule( + self.channels * (2 if psa_type == 'bi-direction' else 1), + self.in_channels, + kernel_size=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.bottleneck = ConvModule( + self.in_channels * 2, + self.channels, + kernel_size=3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + identity = x + align_corners = self.align_corners + if self.psa_type in ['collect', 'distribute']: + out = self.reduce(x) + n, c, h, w = out.size() + if self.shrink_factor != 1: + if h % self.shrink_factor and w % self.shrink_factor: + h = (h - 1) // self.shrink_factor + 1 + w = (w - 1) // self.shrink_factor + 1 + align_corners = True + else: + h = h // self.shrink_factor + w = w // self.shrink_factor + align_corners = False + out = resize( + out, + size=(h, w), + mode='bilinear', + align_corners=align_corners) + y = self.attention(out) + if self.compact: + if self.psa_type == 'collect': + y = y.view(n, h * w, + h * w).transpose(1, 2).view(n, h * w, h, w) + else: + y = self.psamask(y) + if self.psa_softmax: + y = F.softmax(y, dim=1) + out = torch.bmm( + out.view(n, c, h * w), y.view(n, h * w, h * w)).view( + n, c, h, w) * (1.0 / self.normalization_factor) + else: + x_col = self.reduce(x) + x_dis = self.reduce_p(x) + n, c, h, w = x_col.size() + if self.shrink_factor != 1: + if h % self.shrink_factor and w % self.shrink_factor: + h = (h - 1) // self.shrink_factor + 1 + w = (w - 1) // self.shrink_factor + 1 + align_corners = True + else: + h = h // self.shrink_factor + w = w // self.shrink_factor + align_corners = False + x_col = resize( + x_col, + size=(h, w), + mode='bilinear', + align_corners=align_corners) + x_dis = resize( + x_dis, + size=(h, w), + mode='bilinear', + align_corners=align_corners) + y_col = self.attention(x_col) + y_dis = self.attention_p(x_dis) + if self.compact: + y_dis = y_dis.view(n, h * w, + h * w).transpose(1, 2).view(n, h * w, h, w) + else: + y_col = self.psamask_collect(y_col) + y_dis = self.psamask_distribute(y_dis) + if self.psa_softmax: + y_col = F.softmax(y_col, dim=1) + y_dis = F.softmax(y_dis, dim=1) + x_col = torch.bmm( + x_col.view(n, c, h * w), y_col.view(n, h * w, h * w)).view( + n, c, h, w) * (1.0 / self.normalization_factor) + x_dis = torch.bmm( + x_dis.view(n, c, h * w), y_dis.view(n, h * w, h * w)).view( + n, c, h, w) * (1.0 / self.normalization_factor) + out = torch.cat([x_col, x_dis], 1) + out = self.proj(out) + out = resize( + out, + size=identity.shape[2:], + mode='bilinear', + align_corners=align_corners) + out = self.bottleneck(torch.cat((identity, out), dim=1)) + out = self.cls_seg(out) + return out diff --git a/mmseg/models/decode_heads/psp_head.py b/mmseg/models/decode_heads/psp_head.py new file mode 100644 index 0000000000000000000000000000000000000000..bdbe2c8ac8dc2d21dd3e21aa5ed9f74504545c62 --- /dev/null +++ b/mmseg/models/decode_heads/psp_head.py @@ -0,0 +1,101 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead + + +class PPM(nn.ModuleList): + """Pooling Pyramid Module used in PSPNet. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. + in_channels (int): Input channels. + channels (int): Channels after modules, before conv_seg. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict): Config of activation layers. + align_corners (bool): align_corners argument of F.interpolate. + """ + + def __init__(self, pool_scales, in_channels, channels, conv_cfg, norm_cfg, + act_cfg, align_corners): + super(PPM, self).__init__() + self.pool_scales = pool_scales + self.align_corners = align_corners + self.in_channels = in_channels + self.channels = channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + for pool_scale in pool_scales: + self.append( + nn.Sequential( + nn.AdaptiveAvgPool2d(pool_scale), + ConvModule( + self.in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg))) + + def forward(self, x): + """Forward function.""" + ppm_outs = [] + for ppm in self: + ppm_out = ppm(x) + upsampled_ppm_out = resize( + ppm_out, + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + ppm_outs.append(upsampled_ppm_out) + return ppm_outs + + +@HEADS.register_module() +class PSPHead(BaseDecodeHead): + """Pyramid Scene Parsing Network. + + This head is the implementation of + `PSPNet `_. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module. Default: (1, 2, 3, 6). + """ + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super(PSPHead, self).__init__(**kwargs) + assert isinstance(pool_scales, (list, tuple)) + self.pool_scales = pool_scales + self.psp_modules = PPM( + self.pool_scales, + self.in_channels, + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.bottleneck = ConvModule( + self.in_channels + len(pool_scales) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + psp_outs = [x] + psp_outs.extend(self.psp_modules(x)) + psp_outs = torch.cat(psp_outs, dim=1) + output = self.bottleneck(psp_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/sep_aspp_head.py b/mmseg/models/decode_heads/sep_aspp_head.py new file mode 100644 index 0000000000000000000000000000000000000000..50bd52bcff62d0f791c42731bdf05a64276f50b9 --- /dev/null +++ b/mmseg/models/decode_heads/sep_aspp_head.py @@ -0,0 +1,101 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .aspp_head import ASPPHead, ASPPModule + + +class DepthwiseSeparableASPPModule(ASPPModule): + """Atrous Spatial Pyramid Pooling (ASPP) Module with depthwise separable + conv.""" + + def __init__(self, **kwargs): + super(DepthwiseSeparableASPPModule, self).__init__(**kwargs) + for i, dilation in enumerate(self.dilations): + if dilation > 1: + self[i] = DepthwiseSeparableConvModule( + self.in_channels, + self.channels, + 3, + dilation=dilation, + padding=dilation, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + +@HEADS.register_module() +class DepthwiseSeparableASPPHead(ASPPHead): + """Encoder-Decoder with Atrous Separable Convolution for Semantic Image + Segmentation. + + This head is the implementation of `DeepLabV3+ + `_. + + Args: + c1_in_channels (int): The input channels of c1 decoder. If is 0, + the no decoder will be used. + c1_channels (int): The intermediate channels of c1 decoder. + """ + + def __init__(self, c1_in_channels, c1_channels, **kwargs): + super(DepthwiseSeparableASPPHead, self).__init__(**kwargs) + assert c1_in_channels >= 0 + self.aspp_modules = DepthwiseSeparableASPPModule( + dilations=self.dilations, + in_channels=self.in_channels, + channels=self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + if c1_in_channels > 0: + self.c1_bottleneck = ConvModule( + c1_in_channels, + c1_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + else: + self.c1_bottleneck = None + self.sep_bottleneck = nn.Sequential( + DepthwiseSeparableConvModule( + self.channels + c1_channels, + self.channels, + 3, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg), + DepthwiseSeparableConvModule( + self.channels, + self.channels, + 3, + padding=1, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + + def forward(self, inputs): + """Forward function.""" + x = self._transform_inputs(inputs) + aspp_outs = [ + resize( + self.image_pool(x), + size=x.size()[2:], + mode='bilinear', + align_corners=self.align_corners) + ] + aspp_outs.extend(self.aspp_modules(x)) + aspp_outs = torch.cat(aspp_outs, dim=1) + output = self.bottleneck(aspp_outs) + if self.c1_bottleneck is not None: + c1_output = self.c1_bottleneck(inputs[0]) + output = resize( + input=output, + size=c1_output.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + output = torch.cat([output, c1_output], dim=1) + output = self.sep_bottleneck(output) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/sep_fcn_head.py b/mmseg/models/decode_heads/sep_fcn_head.py new file mode 100644 index 0000000000000000000000000000000000000000..a636f702e72d12fd6ff2821fd10923f682f805f1 --- /dev/null +++ b/mmseg/models/decode_heads/sep_fcn_head.py @@ -0,0 +1,51 @@ +from mmcv.cnn import DepthwiseSeparableConvModule + +from ..builder import HEADS +from .fcn_head import FCNHead + + +@HEADS.register_module() +class DepthwiseSeparableFCNHead(FCNHead): + """Depthwise-Separable Fully Convolutional Network for Semantic + Segmentation. + + This head is implemented according to Fast-SCNN paper. + Args: + in_channels(int): Number of output channels of FFM. + channels(int): Number of middle-stage channels in the decode head. + concat_input(bool): Whether to concatenate original decode input into + the result of several consecutive convolution layers. + Default: True. + num_classes(int): Used to determine the dimension of + final prediction tensor. + in_index(int): Correspond with 'out_indices' in FastSCNN backbone. + norm_cfg (dict | None): Config of norm layers. + align_corners (bool): align_corners argument of F.interpolate. + Default: False. + loss_decode(dict): Config of loss type and some + relevant additional options. + """ + + def __init__(self, **kwargs): + super(DepthwiseSeparableFCNHead, self).__init__(**kwargs) + self.convs[0] = DepthwiseSeparableConvModule( + self.in_channels, + self.channels, + kernel_size=self.kernel_size, + padding=self.kernel_size // 2, + norm_cfg=self.norm_cfg) + for i in range(1, self.num_convs): + self.convs[i] = DepthwiseSeparableConvModule( + self.channels, + self.channels, + kernel_size=self.kernel_size, + padding=self.kernel_size // 2, + norm_cfg=self.norm_cfg) + + if self.concat_input: + self.conv_cat = DepthwiseSeparableConvModule( + self.in_channels + self.channels, + self.channels, + kernel_size=self.kernel_size, + padding=self.kernel_size // 2, + norm_cfg=self.norm_cfg) diff --git a/mmseg/models/decode_heads/uper_head.py b/mmseg/models/decode_heads/uper_head.py new file mode 100644 index 0000000000000000000000000000000000000000..bb617f6b13a1b359b0fa932300161e0d405d046d --- /dev/null +++ b/mmseg/models/decode_heads/uper_head.py @@ -0,0 +1,126 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmseg.ops import resize +from ..builder import HEADS +from .decode_head import BaseDecodeHead +from .psp_head import PPM + + +@HEADS.register_module() +class UPerHead(BaseDecodeHead): + """Unified Perceptual Parsing for Scene Understanding. + + This head is the implementation of `UPerNet + `_. + + Args: + pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid + Module applied on the last feature. Default: (1, 2, 3, 6). + """ + + def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): + super(UPerHead, self).__init__( + input_transform='multiple_select', **kwargs) + # PSP Module + self.psp_modules = PPM( + pool_scales, + self.in_channels[-1], + self.channels, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + align_corners=self.align_corners) + self.bottleneck = ConvModule( + self.in_channels[-1] + len(pool_scales) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + # FPN Module + self.lateral_convs = nn.ModuleList() + self.fpn_convs = nn.ModuleList() + for in_channels in self.in_channels[:-1]: # skip the top layer + l_conv = ConvModule( + in_channels, + self.channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + inplace=False) + fpn_conv = ConvModule( + self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + inplace=False) + self.lateral_convs.append(l_conv) + self.fpn_convs.append(fpn_conv) + + self.fpn_bottleneck = ConvModule( + len(self.in_channels) * self.channels, + self.channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + def psp_forward(self, inputs): + """Forward function of PSP module.""" + x = inputs[-1] + psp_outs = [x] + psp_outs.extend(self.psp_modules(x)) + psp_outs = torch.cat(psp_outs, dim=1) + output = self.bottleneck(psp_outs) + + return output + + def forward(self, inputs): + """Forward function.""" + + inputs = self._transform_inputs(inputs) + + # build laterals + laterals = [ + lateral_conv(inputs[i]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + + laterals.append(self.psp_forward(inputs)) + + # build top-down path + used_backbone_levels = len(laterals) + for i in range(used_backbone_levels - 1, 0, -1): + prev_shape = laterals[i - 1].shape[2:] + laterals[i - 1] += resize( + laterals[i], + size=prev_shape, + mode='bilinear', + align_corners=self.align_corners) + + # build outputs + fpn_outs = [ + self.fpn_convs[i](laterals[i]) + for i in range(used_backbone_levels - 1) + ] + # append psp feature + fpn_outs.append(laterals[-1]) + + for i in range(used_backbone_levels - 1, 0, -1): + fpn_outs[i] = resize( + fpn_outs[i], + size=fpn_outs[0].shape[2:], + mode='bilinear', + align_corners=self.align_corners) + fpn_outs = torch.cat(fpn_outs, dim=1) + output = self.fpn_bottleneck(fpn_outs) + output = self.cls_seg(output) + return output diff --git a/mmseg/models/decode_heads/vit_mla_auxi_head.py b/mmseg/models/decode_heads/vit_mla_auxi_head.py new file mode 100644 index 0000000000000000000000000000000000000000..5f19351726f040a89c5faf0d4316b66c6d9feb99 --- /dev/null +++ b/mmseg/models/decode_heads/vit_mla_auxi_head.py @@ -0,0 +1,48 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import HEADS +from .decode_head import BaseDecodeHead +from ..backbones.vit import Block + +from mmcv.cnn import build_norm_layer + + +@HEADS.register_module() +class VIT_MLA_AUXIHead(BaseDecodeHead): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, img_size=768, **kwargs): + super(VIT_MLA_AUXIHead, self).__init__(**kwargs) + self.img_size = img_size + if self.in_channels==1024: + self.aux_0 = nn.Conv2d(self.in_channels, 256, kernel_size=1, bias=False) + self.aux_1 = nn.Conv2d(256, self.num_classes, kernel_size=1, bias=False) + elif self.in_channels==256: + self.aux = nn.Conv2d(self.in_channels, self.num_classes, kernel_size=1, bias=False) + + def to_2D(self, x): + n, hw, c = x.shape + h=w = int(math.sqrt(hw)) + x = x.transpose(1,2).reshape(n, c, h, w) + return x + + def forward(self, x): + x = self._transform_inputs(x) + if x.dim()==3: + x = x[:,1:] + x = self.to_2D(x) + + if self.in_channels==1024: + x = self.aux_0(x) + x = self.aux_1(x) + elif self.in_channels==256: + x = self.aux(x) + x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=self.align_corners) + return x diff --git a/mmseg/models/decode_heads/vit_mla_head.py b/mmseg/models/decode_heads/vit_mla_head.py new file mode 100644 index 0000000000000000000000000000000000000000..bbfde133fbd8b4b1cdd08867456bc005e29c3b10 --- /dev/null +++ b/mmseg/models/decode_heads/vit_mla_head.py @@ -0,0 +1,67 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import HEADS +from .decode_head import BaseDecodeHead +from ..backbones.vit import Block + +from mmcv.cnn import build_norm_layer + + +class MLAHead(nn.Module): + def __init__(self, mla_channels=256, mlahead_channels=128, norm_cfg=None): + super(MLAHead, self).__init__() + self.head2 = nn.Sequential(nn.Conv2d(mla_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU(), + nn.Conv2d(mlahead_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU()) + self.head3 = nn.Sequential(nn.Conv2d(mla_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU(), + nn.Conv2d(mlahead_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU()) + self.head4 = nn.Sequential(nn.Conv2d(mla_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU(), + nn.Conv2d(mlahead_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU()) + self.head5 = nn.Sequential(nn.Conv2d(mla_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU(), + nn.Conv2d(mlahead_channels, mlahead_channels, 3, padding=1, bias=False), + build_norm_layer(norm_cfg, mlahead_channels)[1], nn.ReLU()) + + def forward(self, mla_p2, mla_p3, mla_p4, mla_p5): + # head2 = self.head2(mla_p2) + head2 = F.interpolate(self.head2(mla_p2), 4*mla_p2.shape[-1], mode='bilinear', align_corners=True) + head3 = F.interpolate(self.head3(mla_p3), 4*mla_p3.shape[-1], mode='bilinear', align_corners=True) + head4 = F.interpolate(self.head4(mla_p4), 4*mla_p4.shape[-1], mode='bilinear', align_corners=True) + head5 = F.interpolate(self.head5(mla_p5), 4*mla_p5.shape[-1], mode='bilinear', align_corners=True) + return torch.cat([head2, head3, head4, head5], dim=1) + + + +@HEADS.register_module() +class VIT_MLAHead(BaseDecodeHead): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, img_size=768, mla_channels=256, mlahead_channels=128, + norm_layer=nn.BatchNorm2d, norm_cfg=None, **kwargs): + super(VIT_MLAHead, self).__init__(**kwargs) + self.img_size = img_size + self.norm_cfg = norm_cfg + self.mla_channels = mla_channels + self.BatchNorm = norm_layer + self.mlahead_channels = mlahead_channels + + self.mlahead = MLAHead(mla_channels=self.mla_channels, mlahead_channels=self.mlahead_channels, norm_cfg=self.norm_cfg) + self.cls = nn.Conv2d(4 * self.mlahead_channels, self.num_classes, 3, padding=1) + + def forward(self, inputs): + x = self.mlahead(inputs[0], inputs[1], inputs[2], inputs[3]) + x = self.cls(x) + x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=self.align_corners) + return x diff --git a/mmseg/models/decode_heads/vit_up_head.py b/mmseg/models/decode_heads/vit_up_head.py new file mode 100644 index 0000000000000000000000000000000000000000..3c08c5a57dee6d8099effdd3634e9cf7f4ed3245 --- /dev/null +++ b/mmseg/models/decode_heads/vit_up_head.py @@ -0,0 +1,111 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from functools import partial +import math + +from .helpers import load_pretrained +from .layers import DropPath, to_2tuple, trunc_normal_ + +from ..builder import HEADS +from .decode_head import BaseDecodeHead +from ..backbones.vit import Block + +from mmcv.cnn import build_norm_layer + + +@HEADS.register_module() +class VisionTransformerUpHead(BaseDecodeHead): + """ Vision Transformer with support for patch or hybrid CNN input stage + """ + def __init__(self, img_size=768, embed_dim=1024, + norm_layer=partial(nn.LayerNorm, eps=1e-6), norm_cfg=None, + num_conv=1, upsampling_method='bilinear', num_upsampe_layer=1, **kwargs): + super(VisionTransformerUpHead, self).__init__(**kwargs) + self.img_size = img_size + self.norm_cfg = norm_cfg + self.num_conv = num_conv + self.norm = norm_layer(embed_dim) + self.upsampling_method = upsampling_method + self.num_upsampe_layer = num_upsampe_layer + + out_channel=self.num_classes + + if self.num_conv==2: + self.conv_0 = nn.Conv2d(embed_dim, 256, kernel_size=3, stride=1, padding=1) + self.conv_1 = nn.Conv2d(256, out_channel, 1, 1) + _, self.syncbn_fc_0 = build_norm_layer(self.norm_cfg, 256) + + elif self.num_conv==4: + self.conv_0 = nn.Conv2d(embed_dim, 256, kernel_size=3, stride=1, padding=1) + self.conv_1 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) + self.conv_2 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) + self.conv_3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) + self.conv_4 = nn.Conv2d(256, out_channel, kernel_size=1, stride=1) + + _, self.syncbn_fc_0 = build_norm_layer(self.norm_cfg, 256) + _, self.syncbn_fc_1 = build_norm_layer(self.norm_cfg, 256) + _, self.syncbn_fc_2 = build_norm_layer(self.norm_cfg, 256) + _, self.syncbn_fc_3 = build_norm_layer(self.norm_cfg, 256) + + # Segmentation head + + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + def forward(self, x): + x = self._transform_inputs(x) + if x.dim()==3: + if x.shape[1] % 48 !=0: + x = x[:,1:] + x = self.norm(x) + + if self.upsampling_method=='bilinear': + if x.dim()==3: + n, hw, c = x.shape + h=w = int(math.sqrt(hw)) + x = x.transpose(1,2).reshape(n, c, h, w) + + if self.num_conv==2: + if self.num_upsampe_layer==2: + x = self.conv_0(x) + x = self.syncbn_fc_0(x) + x = F.relu(x,inplace=True) + x = F.interpolate(x, size=x.shape[-1]*4, mode='bilinear', align_corners=self.align_corners) + x = self.conv_1(x) + x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=self.align_corners) + elif self.num_upsampe_layer==1: + x = self.conv_0(x) + x = self.syncbn_fc_0(x) + x = F.relu(x,inplace=True) + x = self.conv_1(x) + x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=self.align_corners) + elif self.num_conv==4: + if self.num_upsampe_layer==4: + x = self.conv_0(x) + x = self.syncbn_fc_0(x) + x = F.relu(x,inplace=True) + x = F.interpolate(x, size=x.shape[-1]*2, mode='bilinear', align_corners=self.align_corners) + x = self.conv_1(x) + x = self.syncbn_fc_1(x) + x = F.relu(x,inplace=True) + x = F.interpolate(x, size=x.shape[-1]*2, mode='bilinear', align_corners=self.align_corners) + x = self.conv_2(x) + x = self.syncbn_fc_2(x) + x = F.relu(x,inplace=True) + x = F.interpolate(x, size=x.shape[-1]*2, mode='bilinear', align_corners=self.align_corners) + x = self.conv_3(x) + x = self.syncbn_fc_3(x) + x = F.relu(x,inplace=True) + x = self.conv_4(x) + x = F.interpolate(x, size=x.shape[-1]*2, mode='bilinear', align_corners=self.align_corners) + + return x + diff --git a/mmseg/models/losses/__init__.py b/mmseg/models/losses/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d623887760654c5c07fbdb2c76012baa2f9a4b52 --- /dev/null +++ b/mmseg/models/losses/__init__.py @@ -0,0 +1,11 @@ +from .accuracy import Accuracy, accuracy +from .cross_entropy_loss import (CrossEntropyLoss, binary_cross_entropy, + cross_entropy, mask_cross_entropy) +from .lovasz_loss import LovaszLoss +from .utils import reduce_loss, weight_reduce_loss, weighted_loss + +__all__ = [ + 'accuracy', 'Accuracy', 'cross_entropy', 'binary_cross_entropy', + 'mask_cross_entropy', 'CrossEntropyLoss', 'reduce_loss', + 'weight_reduce_loss', 'weighted_loss', 'LovaszLoss' +] diff --git a/mmseg/models/losses/accuracy.py b/mmseg/models/losses/accuracy.py new file mode 100644 index 0000000000000000000000000000000000000000..e45f9ec485737ef1f6717eaf3b6ddc572a169932 --- /dev/null +++ b/mmseg/models/losses/accuracy.py @@ -0,0 +1,78 @@ +import torch.nn as nn + + +def accuracy(pred, target, topk=1, thresh=None): + """Calculate accuracy according to the prediction and target. + + Args: + pred (torch.Tensor): The model prediction, shape (N, num_class, ...) + target (torch.Tensor): The target of each prediction, shape (N, , ...) + topk (int | tuple[int], optional): If the predictions in ``topk`` + matches the target, the predictions will be regarded as + correct ones. Defaults to 1. + thresh (float, optional): If not None, predictions with scores under + this threshold are considered incorrect. Default to None. + + Returns: + float | tuple[float]: If the input ``topk`` is a single integer, + the function will return a single float as accuracy. If + ``topk`` is a tuple containing multiple integers, the + function will return a tuple containing accuracies of + each ``topk`` number. + """ + assert isinstance(topk, (int, tuple)) + if isinstance(topk, int): + topk = (topk, ) + return_single = True + else: + return_single = False + + maxk = max(topk) + if pred.size(0) == 0: + accu = [pred.new_tensor(0.) for i in range(len(topk))] + return accu[0] if return_single else accu + assert pred.ndim == target.ndim + 1 + assert pred.size(0) == target.size(0) + assert maxk <= pred.size(1), \ + f'maxk {maxk} exceeds pred dimension {pred.size(1)}' + pred_value, pred_label = pred.topk(maxk, dim=1) + # transpose to shape (maxk, N, ...) + pred_label = pred_label.transpose(0, 1) + correct = pred_label.eq(target.unsqueeze(0).expand_as(pred_label)) + if thresh is not None: + # Only prediction values larger than thresh are counted as correct + correct = correct & (pred_value > thresh).t() + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / target.numel())) + return res[0] if return_single else res + + +class Accuracy(nn.Module): + """Accuracy calculation module.""" + + def __init__(self, topk=(1, ), thresh=None): + """Module to calculate the accuracy. + + Args: + topk (tuple, optional): The criterion used to calculate the + accuracy. Defaults to (1,). + thresh (float, optional): If not None, predictions with scores + under this threshold are considered incorrect. Default to None. + """ + super().__init__() + self.topk = topk + self.thresh = thresh + + def forward(self, pred, target): + """Forward function to calculate accuracy. + + Args: + pred (torch.Tensor): Prediction of models. + target (torch.Tensor): Target for each prediction. + + Returns: + tuple[float]: The accuracies under different topk criterions. + """ + return accuracy(pred, target, self.topk, self.thresh) diff --git a/mmseg/models/losses/cross_entropy_loss.py b/mmseg/models/losses/cross_entropy_loss.py new file mode 100644 index 0000000000000000000000000000000000000000..44798421aaced24d0524dbd3618645fd7ebb1e86 --- /dev/null +++ b/mmseg/models/losses/cross_entropy_loss.py @@ -0,0 +1,198 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weight_reduce_loss + + +def cross_entropy(pred, + label, + weight=None, + class_weight=None, + reduction='mean', + avg_factor=None, + ignore_index=-100): + """The wrapper function for :func:`F.cross_entropy`""" + # class_weight is a manual rescaling weight given to each class. + # If given, has to be a Tensor of size C element-wise losses + loss = F.cross_entropy( + pred, + label, + weight=class_weight, + reduction='none', + ignore_index=ignore_index) + + # apply weights and do the reduction + if weight is not None: + weight = weight.float() + loss = weight_reduce_loss( + loss, weight=weight, reduction=reduction, avg_factor=avg_factor) + + return loss + + +def _expand_onehot_labels(labels, label_weights, target_shape, ignore_index): + """Expand onehot labels to match the size of prediction.""" + bin_labels = labels.new_zeros(target_shape) + valid_mask = (labels >= 0) & (labels != ignore_index) + inds = torch.nonzero(valid_mask, as_tuple=True) + + if inds[0].numel() > 0: + if labels.dim() == 3: + bin_labels[inds[0], labels[valid_mask], inds[1], inds[2]] = 1 + else: + bin_labels[inds[0], labels[valid_mask]] = 1 + + valid_mask = valid_mask.unsqueeze(1).expand(target_shape).float() + if label_weights is None: + bin_label_weights = valid_mask + else: + bin_label_weights = label_weights.unsqueeze(1).expand(target_shape) + bin_label_weights *= valid_mask + + return bin_labels, bin_label_weights + + +def binary_cross_entropy(pred, + label, + weight=None, + reduction='mean', + avg_factor=None, + class_weight=None, + ignore_index=255): + """Calculate the binary CrossEntropy loss. + + Args: + pred (torch.Tensor): The prediction with shape (N, 1). + label (torch.Tensor): The learning label of the prediction. + weight (torch.Tensor, optional): Sample-wise loss weight. + reduction (str, optional): The method used to reduce the loss. + Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + class_weight (list[float], optional): The weight for each class. + ignore_index (int | None): The label index to be ignored. Default: 255 + + Returns: + torch.Tensor: The calculated loss + """ + if pred.dim() != label.dim(): + assert (pred.dim() == 2 and label.dim() == 1) or ( + pred.dim() == 4 and label.dim() == 3), \ + 'Only pred shape [N, C], label shape [N] or pred shape [N, C, ' \ + 'H, W], label shape [N, H, W] are supported' + label, weight = _expand_onehot_labels(label, weight, pred.shape, + ignore_index) + + # weighted element-wise losses + if weight is not None: + weight = weight.float() + loss = F.binary_cross_entropy_with_logits( + pred, label.float(), pos_weight=class_weight, reduction='none') + # do the reduction for the weighted loss + loss = weight_reduce_loss( + loss, weight, reduction=reduction, avg_factor=avg_factor) + + return loss + + +def mask_cross_entropy(pred, + target, + label, + reduction='mean', + avg_factor=None, + class_weight=None, + ignore_index=None): + """Calculate the CrossEntropy loss for masks. + + Args: + pred (torch.Tensor): The prediction with shape (N, C), C is the number + of classes. + target (torch.Tensor): The learning label of the prediction. + label (torch.Tensor): ``label`` indicates the class label of the mask' + corresponding object. This will be used to select the mask in the + of the class which the object belongs to when the mask prediction + if not class-agnostic. + reduction (str, optional): The method used to reduce the loss. + Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + class_weight (list[float], optional): The weight for each class. + ignore_index (None): Placeholder, to be consistent with other loss. + Default: None. + + Returns: + torch.Tensor: The calculated loss + """ + assert ignore_index is None, 'BCE loss does not support ignore_index' + # TODO: handle these two reserved arguments + assert reduction == 'mean' and avg_factor is None + num_rois = pred.size()[0] + inds = torch.arange(0, num_rois, dtype=torch.long, device=pred.device) + pred_slice = pred[inds, label].squeeze(1) + return F.binary_cross_entropy_with_logits( + pred_slice, target, weight=class_weight, reduction='mean')[None] + + +@LOSSES.register_module() +class CrossEntropyLoss(nn.Module): + """CrossEntropyLoss. + + Args: + use_sigmoid (bool, optional): Whether the prediction uses sigmoid + of softmax. Defaults to False. + use_mask (bool, optional): Whether to use mask cross entropy loss. + Defaults to False. + reduction (str, optional): . Defaults to 'mean'. + Options are "none", "mean" and "sum". + class_weight (list[float], optional): Weight of each class. + Defaults to None. + loss_weight (float, optional): Weight of the loss. Defaults to 1.0. + """ + + def __init__(self, + use_sigmoid=False, + use_mask=False, + reduction='mean', + class_weight=None, + loss_weight=1.0): + super(CrossEntropyLoss, self).__init__() + assert (use_sigmoid is False) or (use_mask is False) + self.use_sigmoid = use_sigmoid + self.use_mask = use_mask + self.reduction = reduction + self.loss_weight = loss_weight + self.class_weight = class_weight + + if self.use_sigmoid: + self.cls_criterion = binary_cross_entropy + elif self.use_mask: + self.cls_criterion = mask_cross_entropy + else: + self.cls_criterion = cross_entropy + + def forward(self, + cls_score, + label, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + """Forward function.""" + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.class_weight is not None: + class_weight = cls_score.new_tensor(self.class_weight) + else: + class_weight = None + loss_cls = self.loss_weight * self.cls_criterion( + cls_score, + label, + weight, + class_weight=class_weight, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss_cls diff --git a/mmseg/models/losses/lovasz_loss.py b/mmseg/models/losses/lovasz_loss.py new file mode 100644 index 0000000000000000000000000000000000000000..e6e2450cfdc713ee1ea166886469da4541568329 --- /dev/null +++ b/mmseg/models/losses/lovasz_loss.py @@ -0,0 +1,303 @@ +"""Modified from https://github.com/bermanmaxim/LovaszSoftmax/blob/master/pytor +ch/lovasz_losses.py Lovasz-Softmax and Jaccard hinge loss in PyTorch Maxim +Berman 2018 ESAT-PSI KU Leuven (MIT License)""" + +import mmcv +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weight_reduce_loss + + +def lovasz_grad(gt_sorted): + """Computes gradient of the Lovasz extension w.r.t sorted errors. + + See Alg. 1 in paper. + """ + p = len(gt_sorted) + gts = gt_sorted.sum() + intersection = gts - gt_sorted.float().cumsum(0) + union = gts + (1 - gt_sorted).float().cumsum(0) + jaccard = 1. - intersection / union + if p > 1: # cover 1-pixel case + jaccard[1:p] = jaccard[1:p] - jaccard[0:-1] + return jaccard + + +def flatten_binary_logits(logits, labels, ignore_index=None): + """Flattens predictions in the batch (binary case) Remove labels equal to + 'ignore_index'.""" + logits = logits.view(-1) + labels = labels.view(-1) + if ignore_index is None: + return logits, labels + valid = (labels != ignore_index) + vlogits = logits[valid] + vlabels = labels[valid] + return vlogits, vlabels + + +def flatten_probs(probs, labels, ignore_index=None): + """Flattens predictions in the batch.""" + if probs.dim() == 3: + # assumes output of a sigmoid layer + B, H, W = probs.size() + probs = probs.view(B, 1, H, W) + B, C, H, W = probs.size() + probs = probs.permute(0, 2, 3, 1).contiguous().view(-1, C) # B*H*W, C=P,C + labels = labels.view(-1) + if ignore_index is None: + return probs, labels + valid = (labels != ignore_index) + vprobs = probs[valid.nonzero().squeeze()] + vlabels = labels[valid] + return vprobs, vlabels + + +def lovasz_hinge_flat(logits, labels): + """Binary Lovasz hinge loss. + + Args: + logits (torch.Tensor): [P], logits at each prediction + (between -infty and +infty). + labels (torch.Tensor): [P], binary ground truth labels (0 or 1). + + Returns: + torch.Tensor: The calculated loss. + """ + if len(labels) == 0: + # only void pixels, the gradients should be 0 + return logits.sum() * 0. + signs = 2. * labels.float() - 1. + errors = (1. - logits * signs) + errors_sorted, perm = torch.sort(errors, dim=0, descending=True) + perm = perm.data + gt_sorted = labels[perm] + grad = lovasz_grad(gt_sorted) + loss = torch.dot(F.relu(errors_sorted), grad) + return loss + + +def lovasz_hinge(logits, + labels, + classes='present', + per_image=False, + class_weight=None, + reduction='mean', + avg_factor=None, + ignore_index=255): + """Binary Lovasz hinge loss. + + Args: + logits (torch.Tensor): [B, H, W], logits at each pixel + (between -infty and +infty). + labels (torch.Tensor): [B, H, W], binary ground truth masks (0 or 1). + classes (str | list[int], optional): Placeholder, to be consistent with + other loss. Default: None. + per_image (bool, optional): If per_image is True, compute the loss per + image instead of per batch. Default: False. + class_weight (list[float], optional): Placeholder, to be consistent + with other loss. Default: None. + reduction (str, optional): The method used to reduce the loss. Options + are "none", "mean" and "sum". This parameter only works when + per_image is True. Default: 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. This parameter only works when per_image is True. + Default: None. + ignore_index (int | None): The label index to be ignored. Default: 255. + + Returns: + torch.Tensor: The calculated loss. + """ + if per_image: + loss = [ + lovasz_hinge_flat(*flatten_binary_logits( + logit.unsqueeze(0), label.unsqueeze(0), ignore_index)) + for logit, label in zip(logits, labels) + ] + loss = weight_reduce_loss( + torch.stack(loss), None, reduction, avg_factor) + else: + loss = lovasz_hinge_flat( + *flatten_binary_logits(logits, labels, ignore_index)) + return loss + + +def lovasz_softmax_flat(probs, labels, classes='present', class_weight=None): + """Multi-class Lovasz-Softmax loss. + + Args: + probs (torch.Tensor): [P, C], class probabilities at each prediction + (between 0 and 1). + labels (torch.Tensor): [P], ground truth labels (between 0 and C - 1). + classes (str | list[int], optional): Classes choosed to calculate loss. + 'all' for all classes, 'present' for classes present in labels, or + a list of classes to average. Default: 'present'. + class_weight (list[float], optional): The weight for each class. + Default: None. + + Returns: + torch.Tensor: The calculated loss. + """ + if probs.numel() == 0: + # only void pixels, the gradients should be 0 + return probs * 0. + C = probs.size(1) + losses = [] + class_to_sum = list(range(C)) if classes in ['all', 'present'] else classes + for c in class_to_sum: + fg = (labels == c).float() # foreground for class c + if (classes == 'present' and fg.sum() == 0): + continue + if C == 1: + if len(classes) > 1: + raise ValueError('Sigmoid output possible only with 1 class') + class_pred = probs[:, 0] + else: + class_pred = probs[:, c] + errors = (fg - class_pred).abs() + errors_sorted, perm = torch.sort(errors, 0, descending=True) + perm = perm.data + fg_sorted = fg[perm] + loss = torch.dot(errors_sorted, lovasz_grad(fg_sorted)) + if class_weight is not None: + loss *= class_weight[c] + losses.append(loss) + return torch.stack(losses).mean() + + +def lovasz_softmax(probs, + labels, + classes='present', + per_image=False, + class_weight=None, + reduction='mean', + avg_factor=None, + ignore_index=255): + """Multi-class Lovasz-Softmax loss. + + Args: + probs (torch.Tensor): [B, C, H, W], class probabilities at each + prediction (between 0 and 1). + labels (torch.Tensor): [B, H, W], ground truth labels (between 0 and + C - 1). + classes (str | list[int], optional): Classes choosed to calculate loss. + 'all' for all classes, 'present' for classes present in labels, or + a list of classes to average. Default: 'present'. + per_image (bool, optional): If per_image is True, compute the loss per + image instead of per batch. Default: False. + class_weight (list[float], optional): The weight for each class. + Default: None. + reduction (str, optional): The method used to reduce the loss. Options + are "none", "mean" and "sum". This parameter only works when + per_image is True. Default: 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. This parameter only works when per_image is True. + Default: None. + ignore_index (int | None): The label index to be ignored. Default: 255. + + Returns: + torch.Tensor: The calculated loss. + """ + + if per_image: + loss = [ + lovasz_softmax_flat( + *flatten_probs( + prob.unsqueeze(0), label.unsqueeze(0), ignore_index), + classes=classes, + class_weight=class_weight) + for prob, label in zip(probs, labels) + ] + loss = weight_reduce_loss( + torch.stack(loss), None, reduction, avg_factor) + else: + loss = lovasz_softmax_flat( + *flatten_probs(probs, labels, ignore_index), + classes=classes, + class_weight=class_weight) + return loss + + +@LOSSES.register_module() +class LovaszLoss(nn.Module): + """LovaszLoss. + + This loss is proposed in `The Lovasz-Softmax loss: A tractable surrogate + for the optimization of the intersection-over-union measure in neural + networks `_. + + Args: + loss_type (str, optional): Binary or multi-class loss. + Default: 'multi_class'. Options are "binary" and "multi_class". + classes (str | list[int], optional): Classes choosed to calculate loss. + 'all' for all classes, 'present' for classes present in labels, or + a list of classes to average. Default: 'present'. + per_image (bool, optional): If per_image is True, compute the loss per + image instead of per batch. Default: False. + reduction (str, optional): The method used to reduce the loss. Options + are "none", "mean" and "sum". This parameter only works when + per_image is True. Default: 'mean'. + class_weight (list[float], optional): The weight for each class. + Default: None. + loss_weight (float, optional): Weight of the loss. Defaults to 1.0. + """ + + def __init__(self, + loss_type='multi_class', + classes='present', + per_image=False, + reduction='mean', + class_weight=None, + loss_weight=1.0): + super(LovaszLoss, self).__init__() + assert loss_type in ('binary', 'multi_class'), "loss_type should be \ + 'binary' or 'multi_class'." + + if loss_type == 'binary': + self.cls_criterion = lovasz_hinge + else: + self.cls_criterion = lovasz_softmax + assert classes in ('all', 'present') or mmcv.is_list_of(classes, int) + if not per_image: + assert reduction == 'none', "reduction should be 'none' when \ + per_image is False." + + self.classes = classes + self.per_image = per_image + self.reduction = reduction + self.loss_weight = loss_weight + self.class_weight = class_weight + + def forward(self, + cls_score, + label, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + """Forward function.""" + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.class_weight is not None: + class_weight = cls_score.new_tensor(self.class_weight) + else: + class_weight = None + + # if multi-class loss, transform logits to probs + if self.cls_criterion == lovasz_softmax: + cls_score = F.softmax(cls_score, dim=1) + + loss_cls = self.loss_weight * self.cls_criterion( + cls_score, + label, + self.classes, + self.per_image, + class_weight=class_weight, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss_cls diff --git a/mmseg/models/losses/utils.py b/mmseg/models/losses/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..a1153fa9f39f1f045def43b52bb55a06f301ff22 --- /dev/null +++ b/mmseg/models/losses/utils.py @@ -0,0 +1,101 @@ +import functools + +import torch.nn.functional as F + + +def reduce_loss(loss, reduction): + """Reduce loss as specified. + + Args: + loss (Tensor): Elementwise loss tensor. + reduction (str): Options are "none", "mean" and "sum". + + Return: + Tensor: Reduced loss tensor. + """ + reduction_enum = F._Reduction.get_enum(reduction) + # none: 0, elementwise_mean:1, sum: 2 + if reduction_enum == 0: + return loss + elif reduction_enum == 1: + return loss.mean() + elif reduction_enum == 2: + return loss.sum() + + +def weight_reduce_loss(loss, weight=None, reduction='mean', avg_factor=None): + """Apply element-wise weight and reduce loss. + + Args: + loss (Tensor): Element-wise loss. + weight (Tensor): Element-wise weights. + reduction (str): Same as built-in losses of PyTorch. + avg_factor (float): Avarage factor when computing the mean of losses. + + Returns: + Tensor: Processed loss values. + """ + # if weight is specified, apply element-wise weight + if weight is not None: + assert weight.dim() == loss.dim() + if weight.dim() > 1: + assert weight.size(1) == 1 or weight.size(1) == loss.size(1) + loss = loss * weight + + # if avg_factor is not specified, just reduce the loss + if avg_factor is None: + loss = reduce_loss(loss, reduction) + else: + # if reduction is mean, then average the loss by avg_factor + if reduction == 'mean': + loss = loss.sum() / avg_factor + # if reduction is 'none', then do nothing, otherwise raise an error + elif reduction != 'none': + raise ValueError('avg_factor can not be used with reduction="sum"') + return loss + + +def weighted_loss(loss_func): + """Create a weighted version of a given loss function. + + To use this decorator, the loss function must have the signature like + `loss_func(pred, target, **kwargs)`. The function only needs to compute + element-wise loss without any reduction. This decorator will add weight + and reduction arguments to the function. The decorated function will have + the signature like `loss_func(pred, target, weight=None, reduction='mean', + avg_factor=None, **kwargs)`. + + :Example: + + >>> import torch + >>> @weighted_loss + >>> def l1_loss(pred, target): + >>> return (pred - target).abs() + + >>> pred = torch.Tensor([0, 2, 3]) + >>> target = torch.Tensor([1, 1, 1]) + >>> weight = torch.Tensor([1, 0, 1]) + + >>> l1_loss(pred, target) + tensor(1.3333) + >>> l1_loss(pred, target, weight) + tensor(1.) + >>> l1_loss(pred, target, reduction='none') + tensor([1., 1., 2.]) + >>> l1_loss(pred, target, weight, avg_factor=2) + tensor(1.5000) + """ + + @functools.wraps(loss_func) + def wrapper(pred, + target, + weight=None, + reduction='mean', + avg_factor=None, + **kwargs): + # get element-wise loss + loss = loss_func(pred, target, **kwargs) + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + return wrapper diff --git a/mmseg/models/necks/__init__.py b/mmseg/models/necks/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0093021ebac1e46fbb798ed6ee96a192dbd8604c --- /dev/null +++ b/mmseg/models/necks/__init__.py @@ -0,0 +1,3 @@ +from .fpn import FPN + +__all__ = ['FPN'] diff --git a/mmseg/models/necks/fpn.py b/mmseg/models/necks/fpn.py new file mode 100644 index 0000000000000000000000000000000000000000..f43d1e62f62b4cde0f181d3d44cef5383fec78b1 --- /dev/null +++ b/mmseg/models/necks/fpn.py @@ -0,0 +1,212 @@ +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, xavier_init + +from ..builder import NECKS + + +@NECKS.register_module() +class FPN(nn.Module): + """Feature Pyramid Network. + + This is an implementation of - Feature Pyramid Networks for Object + Detection (https://arxiv.org/abs/1612.03144) + + Args: + in_channels (List[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale) + num_outs (int): Number of output scales. + start_level (int): Index of the start input backbone level used to + build the feature pyramid. Default: 0. + end_level (int): Index of the end input backbone level (exclusive) to + build the feature pyramid. Default: -1, which means the last level. + add_extra_convs (bool | str): If bool, it decides whether to add conv + layers on top of the original feature maps. Default to False. + If True, its actual mode is specified by `extra_convs_on_inputs`. + If str, it specifies the source feature map of the extra convs. + Only the following options are allowed + + - 'on_input': Last feat map of neck inputs (i.e. backbone feature). + - 'on_lateral': Last feature map after lateral convs. + - 'on_output': The last output feature map after fpn convs. + extra_convs_on_inputs (bool, deprecated): Whether to apply extra convs + on the original feature from the backbone. If True, + it is equivalent to `add_extra_convs='on_input'`. If False, it is + equivalent to set `add_extra_convs='on_output'`. Default to True. + relu_before_extra_convs (bool): Whether to apply relu before the extra + conv. Default: False. + no_norm_on_lateral (bool): Whether to apply norm on lateral. + Default: False. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (str): Config dict for activation layer in ConvModule. + Default: None. + upsample_cfg (dict): Config dict for interpolate layer. + Default: `dict(mode='nearest')` + + Example: + >>> import torch + >>> in_channels = [2, 3, 5, 7] + >>> scales = [340, 170, 84, 43] + >>> inputs = [torch.rand(1, c, s, s) + ... for c, s in zip(in_channels, scales)] + >>> self = FPN(in_channels, 11, len(in_channels)).eval() + >>> outputs = self.forward(inputs) + >>> for i in range(len(outputs)): + ... print(f'outputs[{i}].shape = {outputs[i].shape}') + outputs[0].shape = torch.Size([1, 11, 340, 340]) + outputs[1].shape = torch.Size([1, 11, 170, 170]) + outputs[2].shape = torch.Size([1, 11, 84, 84]) + outputs[3].shape = torch.Size([1, 11, 43, 43]) + """ + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + add_extra_convs=False, + extra_convs_on_inputs=False, + relu_before_extra_convs=False, + no_norm_on_lateral=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None, + upsample_cfg=dict(mode='nearest')): + super(FPN, self).__init__() + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_ins = len(in_channels) + self.num_outs = num_outs + self.relu_before_extra_convs = relu_before_extra_convs + self.no_norm_on_lateral = no_norm_on_lateral + self.fp16_enabled = False + self.upsample_cfg = upsample_cfg.copy() + + if end_level == -1: + self.backbone_end_level = self.num_ins + assert num_outs >= self.num_ins - start_level + else: + # if end_level < inputs, no extra level is allowed + self.backbone_end_level = end_level + assert end_level <= len(in_channels) + assert num_outs == end_level - start_level + self.start_level = start_level + self.end_level = end_level + self.add_extra_convs = add_extra_convs + assert isinstance(add_extra_convs, (str, bool)) + if isinstance(add_extra_convs, str): + # Extra_convs_source choices: 'on_input', 'on_lateral', 'on_output' + assert add_extra_convs in ('on_input', 'on_lateral', 'on_output') + elif add_extra_convs: # True + if extra_convs_on_inputs: + # For compatibility with previous release + # TODO: deprecate `extra_convs_on_inputs` + self.add_extra_convs = 'on_input' + else: + self.add_extra_convs = 'on_output' + + self.lateral_convs = nn.ModuleList() + self.fpn_convs = nn.ModuleList() + + for i in range(self.start_level, self.backbone_end_level): + l_conv = ConvModule( + in_channels[i], + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg if not self.no_norm_on_lateral else None, + act_cfg=act_cfg, + inplace=False) + fpn_conv = ConvModule( + out_channels, + out_channels, + 3, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + + self.lateral_convs.append(l_conv) + self.fpn_convs.append(fpn_conv) + + # add extra conv layers (e.g., RetinaNet) + extra_levels = num_outs - self.backbone_end_level + self.start_level + if self.add_extra_convs and extra_levels >= 1: + for i in range(extra_levels): + if i == 0 and self.add_extra_convs == 'on_input': + in_channels = self.in_channels[self.backbone_end_level - 1] + else: + in_channels = out_channels + extra_fpn_conv = ConvModule( + in_channels, + out_channels, + 3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + self.fpn_convs.append(extra_fpn_conv) + + # default init_weights for conv(msra) and norm in ConvModule + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + xavier_init(m, distribution='uniform') + + def forward(self, inputs): + assert len(inputs) == len(self.in_channels) + + # build laterals + laterals = [ + lateral_conv(inputs[i + self.start_level]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + + # build top-down path + used_backbone_levels = len(laterals) + for i in range(used_backbone_levels - 1, 0, -1): + # In some cases, fixing `scale factor` (e.g. 2) is preferred, but + # it cannot co-exist with `size` in `F.interpolate`. + if 'scale_factor' in self.upsample_cfg: + laterals[i - 1] += F.interpolate(laterals[i], + **self.upsample_cfg) + else: + prev_shape = laterals[i - 1].shape[2:] + laterals[i - 1] += F.interpolate( + laterals[i], size=prev_shape, **self.upsample_cfg) + + # build outputs + # part 1: from original levels + outs = [ + self.fpn_convs[i](laterals[i]) for i in range(used_backbone_levels) + ] + # part 2: add extra levels + if self.num_outs > len(outs): + # use max pool to get more levels on top of outputs + # (e.g., Faster R-CNN, Mask R-CNN) + if not self.add_extra_convs: + for i in range(self.num_outs - used_backbone_levels): + outs.append(F.max_pool2d(outs[-1], 1, stride=2)) + # add conv layers on top of original feature maps (RetinaNet) + else: + if self.add_extra_convs == 'on_input': + extra_source = inputs[self.backbone_end_level - 1] + elif self.add_extra_convs == 'on_lateral': + extra_source = laterals[-1] + elif self.add_extra_convs == 'on_output': + extra_source = outs[-1] + else: + raise NotImplementedError + outs.append(self.fpn_convs[used_backbone_levels](extra_source)) + for i in range(used_backbone_levels + 1, self.num_outs): + if self.relu_before_extra_convs: + outs.append(self.fpn_convs[i](F.relu(outs[-1]))) + else: + outs.append(self.fpn_convs[i](outs[-1])) + return tuple(outs) diff --git a/mmseg/models/segmentors/__init__.py b/mmseg/models/segmentors/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3f600ecb9fa61be81a74f2c51edf8b6bfdb9b3b5 --- /dev/null +++ b/mmseg/models/segmentors/__init__.py @@ -0,0 +1,4 @@ +from .cascade_encoder_decoder import CascadeEncoderDecoder +from .encoder_decoder import EncoderDecoder + +__all__ = ['EncoderDecoder', 'CascadeEncoderDecoder'] diff --git a/mmseg/models/segmentors/base.py b/mmseg/models/segmentors/base.py new file mode 100644 index 0000000000000000000000000000000000000000..6f59dbc72ed91501aed9cab114cd13ebefea76e2 --- /dev/null +++ b/mmseg/models/segmentors/base.py @@ -0,0 +1,269 @@ +import logging +import warnings +from abc import ABCMeta, abstractmethod +from collections import OrderedDict + +import mmcv +import numpy as np +import torch +import torch.distributed as dist +import torch.nn as nn +from mmcv.runner import auto_fp16 + + +class BaseSegmentor(nn.Module): + """Base class for segmentors.""" + + __metaclass__ = ABCMeta + + def __init__(self): + super(BaseSegmentor, self).__init__() + self.fp16_enabled = False + + @property + def with_neck(self): + """bool: whether the segmentor has neck""" + return hasattr(self, 'neck') and self.neck is not None + + @property + def with_auxiliary_head(self): + """bool: whether the segmentor has auxiliary head""" + return hasattr(self, + 'auxiliary_head') and self.auxiliary_head is not None + + @property + def with_decode_head(self): + """bool: whether the segmentor has decode head""" + return hasattr(self, 'decode_head') and self.decode_head is not None + + @abstractmethod + def extract_feat(self, imgs): + """Placeholder for extract features from images.""" + pass + + @abstractmethod + def encode_decode(self, img, img_metas): + """Placeholder for encode images with backbone and decode into a + semantic segmentation map of the same size as input.""" + pass + + @abstractmethod + def forward_train(self, imgs, img_metas, **kwargs): + """Placeholder for Forward function for training.""" + pass + + @abstractmethod + def simple_test(self, img, img_meta, **kwargs): + """Placeholder for single image test.""" + pass + + @abstractmethod + def aug_test(self, imgs, img_metas, **kwargs): + """Placeholder for augmentation test.""" + pass + + def init_weights(self, pretrained=None): + """Initialize the weights in segmentor. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + if pretrained is not None: + logger = logging.getLogger() + logger.info(f'load model from: {pretrained}') + + def forward_test(self, imgs, img_metas, **kwargs): + """ + Args: + imgs (List[Tensor]): the outer list indicates test-time + augmentations and inner Tensor should have a shape NxCxHxW, + which contains all images in the batch. + img_metas (List[List[dict]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. + """ + for var, name in [(imgs, 'imgs'), (img_metas, 'img_metas')]: + if not isinstance(var, list): + raise TypeError(f'{name} must be a list, but got ' + f'{type(var)}') + + num_augs = len(imgs) + if num_augs != len(img_metas): + raise ValueError(f'num of augmentations ({len(imgs)}) != ' + f'num of image meta ({len(img_metas)})') + # all images in the same aug batch all of the same ori_shape and pad + # shape + for img_meta in img_metas: + ori_shapes = [_['ori_shape'] for _ in img_meta] + assert all(shape == ori_shapes[0] for shape in ori_shapes) + img_shapes = [_['img_shape'] for _ in img_meta] + assert all(shape == img_shapes[0] for shape in img_shapes) + pad_shapes = [_['pad_shape'] for _ in img_meta] + assert all(shape == pad_shapes[0] for shape in pad_shapes) + + if num_augs == 1: + return self.simple_test(imgs[0], img_metas[0], **kwargs) + else: + return self.aug_test(imgs, img_metas, **kwargs) + + @auto_fp16(apply_to=('img', )) + def forward(self, img, img_metas, return_loss=True, **kwargs): + """Calls either :func:`forward_train` or :func:`forward_test` depending + on whether ``return_loss`` is ``True``. + + Note this setting will change the expected inputs. When + ``return_loss=True``, img and img_meta are single-nested (i.e. Tensor + and List[dict]), and when ``resturn_loss=False``, img and img_meta + should be double nested (i.e. List[Tensor], List[List[dict]]), with + the outer list indicating test time augmentations. + """ + if return_loss: + return self.forward_train(img, img_metas, **kwargs) + else: + return self.forward_test(img, img_metas, **kwargs) + + def train_step(self, data_batch, optimizer, **kwargs): + """The iteration step during training. + + This method defines an iteration step during training, except for the + back propagation and optimizer updating, which are done in an optimizer + hook. Note that in some complicated cases or models, the whole process + including back propagation and optimizer updating is also defined in + this method, such as GAN. + + Args: + data (dict): The output of dataloader. + optimizer (:obj:`torch.optim.Optimizer` | dict): The optimizer of + runner is passed to ``train_step()``. This argument is unused + and reserved. + + Returns: + dict: It should contain at least 3 keys: ``loss``, ``log_vars``, + ``num_samples``. + ``loss`` is a tensor for back propagation, which can be a + weighted sum of multiple losses. + ``log_vars`` contains all the variables to be sent to the + logger. + ``num_samples`` indicates the batch size (when the model is + DDP, it means the batch size on each GPU), which is used for + averaging the logs. + """ + losses = self(**data_batch) + loss, log_vars = self._parse_losses(losses) + + outputs = dict( + loss=loss, + log_vars=log_vars, + num_samples=len(data_batch['img'].data)) + + return outputs + + def val_step(self, data_batch, **kwargs): + """The iteration step during validation. + + This method shares the same signature as :func:`train_step`, but used + during val epochs. Note that the evaluation after training epochs is + not implemented with this method, but an evaluation hook. + """ + output = self(**data_batch, **kwargs) + return output + + @staticmethod + def _parse_losses(losses): + """Parse the raw outputs (losses) of the network. + + Args: + losses (dict): Raw output of the network, which usually contain + losses and other necessary information. + + Returns: + tuple[Tensor, dict]: (loss, log_vars), loss is the loss tensor + which may be a weighted sum of all losses, log_vars contains + all the variables to be sent to the logger. + """ + log_vars = OrderedDict() + for loss_name, loss_value in losses.items(): + if isinstance(loss_value, torch.Tensor): + log_vars[loss_name] = loss_value.mean() + elif isinstance(loss_value, list): + log_vars[loss_name] = sum(_loss.mean() for _loss in loss_value) + else: + raise TypeError( + f'{loss_name} is not a tensor or list of tensors') + + loss = sum(_value for _key, _value in log_vars.items() + if 'loss' in _key) + + log_vars['loss'] = loss + for loss_name, loss_value in log_vars.items(): + # reduce loss when distributed training + if dist.is_available() and dist.is_initialized(): + loss_value = loss_value.data.clone() + dist.all_reduce(loss_value.div_(dist.get_world_size())) + log_vars[loss_name] = loss_value.item() + + return loss, log_vars + + def show_result(self, + img, + result, + palette=None, + win_name='', + show=False, + wait_time=0, + out_file=None): + """Draw `result` over `img`. + + Args: + img (str or Tensor): The image to be displayed. + result (Tensor): The semantic segmentation results to draw over + `img`. + palette (list[list[int]]] | np.ndarray | None): The palette of + segmentation map. If None is given, random palette will be + generated. Default: None + win_name (str): The window name. + wait_time (int): Value of waitKey param. + Default: 0. + show (bool): Whether to show the image. + Default: False. + out_file (str or None): The filename to write the image. + Default: None. + + Returns: + img (Tensor): Only if not `show` or `out_file` + """ + img = mmcv.imread(img) + img = img.copy() + seg = result[0] + if palette is None: + if self.PALETTE is None: + palette = np.random.randint( + 0, 255, size=(len(self.CLASSES), 3)) + else: + palette = self.PALETTE + palette = np.array(palette) + assert palette.shape[0] == len(self.CLASSES) + assert palette.shape[1] == 3 + assert len(palette.shape) == 2 + color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) + for label, color in enumerate(palette): + color_seg[seg == label, :] = color + # convert to BGR + color_seg = color_seg[..., ::-1] + + img = img * 0.5 + color_seg * 0.5 + img = img.astype(np.uint8) + # if out_file specified, do not show image in window + if out_file is not None: + show = False + + if show: + mmcv.imshow(img, win_name, wait_time) + if out_file is not None: + mmcv.imwrite(img, out_file) + + if not (show or out_file): + warnings.warn('show==False and out_file is not specified, only ' + 'result image will be returned') + return img diff --git a/mmseg/models/segmentors/cascade_encoder_decoder.py b/mmseg/models/segmentors/cascade_encoder_decoder.py new file mode 100644 index 0000000000000000000000000000000000000000..220ab2bb365b61885482bdd86606e632f2af74ae --- /dev/null +++ b/mmseg/models/segmentors/cascade_encoder_decoder.py @@ -0,0 +1,98 @@ +from torch import nn + +from mmseg.core import add_prefix +from mmseg.ops import resize +from .. import builder +from ..builder import SEGMENTORS +from .encoder_decoder import EncoderDecoder + + +@SEGMENTORS.register_module() +class CascadeEncoderDecoder(EncoderDecoder): + """Cascade Encoder Decoder segmentors. + + CascadeEncoderDecoder almost the same as EncoderDecoder, while decoders of + CascadeEncoderDecoder are cascaded. The output of previous decoder_head + will be the input of next decoder_head. + """ + + def __init__(self, + num_stages, + backbone, + decode_head, + neck=None, + auxiliary_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None): + self.num_stages = num_stages + super(CascadeEncoderDecoder, self).__init__( + backbone=backbone, + decode_head=decode_head, + neck=neck, + auxiliary_head=auxiliary_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained) + + def _init_decode_head(self, decode_head): + """Initialize ``decode_head``""" + assert isinstance(decode_head, list) + assert len(decode_head) == self.num_stages + self.decode_head = nn.ModuleList() + for i in range(self.num_stages): + self.decode_head.append(builder.build_head(decode_head[i])) + self.align_corners = self.decode_head[-1].align_corners + self.num_classes = self.decode_head[-1].num_classes + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone and heads. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + self.backbone.init_weights(pretrained=pretrained) + for i in range(self.num_stages): + self.decode_head[i].init_weights() + if self.with_auxiliary_head: + if isinstance(self.auxiliary_head, nn.ModuleList): + for aux_head in self.auxiliary_head: + aux_head.init_weights() + else: + self.auxiliary_head.init_weights() + + def encode_decode(self, img, img_metas): + """Encode images with backbone and decode into a semantic segmentation + map of the same size as input.""" + x = self.extract_feat(img) + out = self.decode_head[0].forward_test(x, img_metas, self.test_cfg) + for i in range(1, self.num_stages): + out = self.decode_head[i].forward_test(x, out, img_metas, + self.test_cfg) + out = resize( + input=out, + size=img.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + return out + + def _decode_head_forward_train(self, x, img_metas, gt_semantic_seg): + """Run forward function and calculate loss for decode head in + training.""" + losses = dict() + + loss_decode = self.decode_head[0].forward_train( + x, img_metas, gt_semantic_seg, self.train_cfg) + + losses.update(add_prefix(loss_decode, 'decode_0')) + + for i in range(1, self.num_stages): + # forward test again, maybe unnecessary for most methods. + prev_outputs = self.decode_head[i - 1].forward_test( + x, img_metas, self.test_cfg) + loss_decode = self.decode_head[i].forward_train( + x, prev_outputs, img_metas, gt_semantic_seg, self.train_cfg) + losses.update(add_prefix(loss_decode, f'decode_{i}')) + + return losses diff --git a/mmseg/models/segmentors/encoder_decoder.py b/mmseg/models/segmentors/encoder_decoder.py new file mode 100644 index 0000000000000000000000000000000000000000..c513433ae6edc277e2260fd14875288e0705ee61 --- /dev/null +++ b/mmseg/models/segmentors/encoder_decoder.py @@ -0,0 +1,294 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +from mmseg.core import add_prefix +from mmseg.ops import resize +from .. import builder +from ..builder import SEGMENTORS +from .base import BaseSegmentor + + +@SEGMENTORS.register_module() +class EncoderDecoder(BaseSegmentor): + """Encoder Decoder segmentors. + + EncoderDecoder typically consists of backbone, decode_head, auxiliary_head. + Note that auxiliary_head is only used for deep supervision during training, + which could be dumped during inference. + """ + + def __init__(self, + backbone, + decode_head, + neck=None, + auxiliary_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None): + super(EncoderDecoder, self).__init__() + self.backbone = builder.build_backbone(backbone) + if neck is not None: + self.neck = builder.build_neck(neck) + self._init_decode_head(decode_head) + self._init_auxiliary_head(auxiliary_head) + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + self.init_weights(pretrained=pretrained) + + assert self.with_decode_head + + def _init_decode_head(self, decode_head): + """Initialize ``decode_head``""" + self.decode_head = builder.build_head(decode_head) + self.align_corners = self.decode_head.align_corners + self.num_classes = self.decode_head.num_classes + + def _init_auxiliary_head(self, auxiliary_head): + """Initialize ``auxiliary_head``""" + if auxiliary_head is not None: + if isinstance(auxiliary_head, list): + self.auxiliary_head = nn.ModuleList() + for head_cfg in auxiliary_head: + self.auxiliary_head.append(builder.build_head(head_cfg)) + else: + self.auxiliary_head = builder.build_head(auxiliary_head) + + def init_weights(self, pretrained=None): + """Initialize the weights in backbone and heads. + + Args: + pretrained (str, optional): Path to pre-trained weights. + Defaults to None. + """ + + super(EncoderDecoder, self).init_weights(pretrained) + self.backbone.init_weights(pretrained=pretrained) + self.decode_head.init_weights() + if self.with_auxiliary_head: + if isinstance(self.auxiliary_head, nn.ModuleList): + for aux_head in self.auxiliary_head: + aux_head.init_weights() + else: + self.auxiliary_head.init_weights() + + def extract_feat(self, img): + """Extract features from images.""" + x = self.backbone(img) + if self.with_neck: + x = self.neck(x) + return x + + def encode_decode(self, img, img_metas): + """Encode images with backbone and decode into a semantic segmentation + map of the same size as input.""" + x = self.extract_feat(img) + out = self._decode_head_forward_test(x, img_metas) + out = resize( + input=out, + size=img.shape[2:], + mode='bilinear', + align_corners=self.align_corners) + return out + + def _decode_head_forward_train(self, x, img_metas, gt_semantic_seg): + """Run forward function and calculate loss for decode head in + training.""" + losses = dict() + loss_decode = self.decode_head.forward_train(x, img_metas, + gt_semantic_seg, + self.train_cfg) + + losses.update(add_prefix(loss_decode, 'decode')) + return losses + + def _decode_head_forward_test(self, x, img_metas): + """Run forward function and calculate loss for decode head in + inference.""" + seg_logits = self.decode_head.forward_test(x, img_metas, self.test_cfg) + return seg_logits + + def _auxiliary_head_forward_train(self, x, img_metas, gt_semantic_seg): + """Run forward function and calculate loss for auxiliary head in + training.""" + losses = dict() + if isinstance(self.auxiliary_head, nn.ModuleList): + for idx, aux_head in enumerate(self.auxiliary_head): + loss_aux = aux_head.forward_train(x, img_metas, + gt_semantic_seg, + self.train_cfg) + losses.update(add_prefix(loss_aux, f'aux_{idx}')) + else: + loss_aux = self.auxiliary_head.forward_train( + x, img_metas, gt_semantic_seg, self.train_cfg) + losses.update(add_prefix(loss_aux, 'aux')) + + return losses + + def forward_dummy(self, img): + """Dummy forward function.""" + seg_logit = self.encode_decode(img, None) + + return seg_logit + + def forward_train(self, img, img_metas, gt_semantic_seg): + """Forward function for training. + + Args: + img (Tensor): Input images. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + gt_semantic_seg (Tensor): Semantic segmentation masks + used if the architecture supports semantic segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + + x = self.extract_feat(img) + + losses = dict() + + loss_decode = self._decode_head_forward_train(x, img_metas, + gt_semantic_seg) + losses.update(loss_decode) + + if self.with_auxiliary_head: + loss_aux = self._auxiliary_head_forward_train( + x, img_metas, gt_semantic_seg) + losses.update(loss_aux) + + return losses + + # TODO refactor + def slide_inference(self, img, img_meta, rescale): + """Inference by sliding-window with overlap. + + If h_crop > h_img or w_crop > w_img, the small patch will be used to + decode without padding. + """ + + h_stride, w_stride = self.test_cfg.stride + h_crop, w_crop = self.test_cfg.crop_size + batch_size, _, h_img, w_img = img.size() + #print(img.size()) + num_classes = self.num_classes + h_grids = max(h_img - h_crop + h_stride - 1, 0) // h_stride + 1 + w_grids = max(w_img - w_crop + w_stride - 1, 0) // w_stride + 1 + preds = img.new_zeros((batch_size, num_classes, h_img, w_img)) + count_mat = img.new_zeros((batch_size, 1, h_img, w_img)) + for h_idx in range(h_grids): + for w_idx in range(w_grids): + y1 = h_idx * h_stride + x1 = w_idx * w_stride + y2 = min(y1 + h_crop, h_img) + x2 = min(x1 + w_crop, w_img) + y1 = max(y2 - h_crop, 0) + x1 = max(x2 - w_crop, 0) + crop_img = img[:, :, y1:y2, x1:x2] + crop_seg_logit = self.encode_decode(crop_img, img_meta) + preds += F.pad(crop_seg_logit, + (int(x1), int(preds.shape[3] - x2), int(y1), + int(preds.shape[2] - y2))) + + count_mat[:, :, y1:y2, x1:x2] += 1 + assert (count_mat == 0).sum() == 0 + if torch.onnx.is_in_onnx_export(): + # cast count_mat to constant while exporting to ONNX + count_mat = torch.from_numpy( + count_mat.cpu().detach().numpy()).to(device=img.device) + preds = preds / count_mat + if rescale: + preds = resize( + preds, + size=img_meta[0]['ori_shape'][:2], + mode='bilinear', + align_corners=self.align_corners, + warning=False) + return preds + + def whole_inference(self, img, img_meta, rescale): + """Inference with full image.""" + + seg_logit = self.encode_decode(img, img_meta) + if rescale: + seg_logit = resize( + seg_logit, + size=img_meta[0]['ori_shape'][:2], + mode='bilinear', + align_corners=self.align_corners, + warning=False) + + return seg_logit + + def inference(self, img, img_meta, rescale): + """Inference with slide/whole style. + + Args: + img (Tensor): The input image of shape (N, 3, H, W). + img_meta (dict): Image info dict where each dict has: 'img_shape', + 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmseg/datasets/pipelines/formatting.py:Collect`. + rescale (bool): Whether rescale back to original shape. + + Returns: + Tensor: The output segmentation map. + """ + + assert self.test_cfg.mode in ['slide', 'whole'] + ori_shape = img_meta[0]['ori_shape'] + assert all(_['ori_shape'] == ori_shape for _ in img_meta) + if self.test_cfg.mode == 'slide': + seg_logit = self.slide_inference(img, img_meta, rescale) + else: + seg_logit = self.whole_inference(img, img_meta, rescale) + output = F.softmax(seg_logit, dim=1) + flip = img_meta[0]['flip'] + if flip: + flip_direction = img_meta[0]['flip_direction'] + assert flip_direction in ['horizontal', 'vertical'] + if flip_direction == 'horizontal': + output = output.flip(dims=(3, )) + elif flip_direction == 'vertical': + output = output.flip(dims=(2, )) + + return output + + def simple_test(self, img, img_meta, rescale=True): + """Simple test with single image.""" + seg_logit = self.inference(img, img_meta, rescale) + seg_pred = seg_logit.argmax(dim=1) + if torch.onnx.is_in_onnx_export(): + # our inference backend only support 4D output + seg_pred = seg_pred.unsqueeze(0) + return seg_pred + seg_pred = seg_pred.cpu().numpy() + # unravel batch dim + seg_pred = list(seg_pred) + return seg_pred + + def aug_test(self, imgs, img_metas, rescale=True): + """Test with augmentations. + + Only rescale=True is supported. + """ + # aug_test rescale all imgs back to ori_shape for now + assert rescale + # to save memory, we get augmented seg logit inplace + seg_logit = self.inference(imgs[0], img_metas[0], rescale) + for i in range(1, len(imgs)): + cur_seg_logit = self.inference(imgs[i], img_metas[i], rescale) + seg_logit += cur_seg_logit + seg_logit /= len(imgs) + seg_pred = seg_logit.argmax(dim=1) + seg_pred = seg_pred.cpu().numpy() + # unravel batch dim + seg_pred = list(seg_pred) + return seg_pred diff --git a/mmseg/models/utils/__init__.py b/mmseg/models/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..413228626e42eccbec6e099fd6490f4aec614394 --- /dev/null +++ b/mmseg/models/utils/__init__.py @@ -0,0 +1,10 @@ +from .inverted_residual import InvertedResidual, InvertedResidualV3 +from .make_divisible import make_divisible +from .res_layer import ResLayer +from .self_attention_block import SelfAttentionBlock +from .up_conv_block import UpConvBlock + +__all__ = [ + 'ResLayer', 'SelfAttentionBlock', 'make_divisible', 'InvertedResidual', + 'UpConvBlock', 'InvertedResidualV3' +] diff --git a/mmseg/models/utils/inverted_residual.py b/mmseg/models/utils/inverted_residual.py new file mode 100644 index 0000000000000000000000000000000000000000..093388f5643a1027095ef62e0158448df725fb82 --- /dev/null +++ b/mmseg/models/utils/inverted_residual.py @@ -0,0 +1,208 @@ +from mmcv.cnn import ConvModule +from torch import nn as nn +from torch.utils import checkpoint as cp + +from .se_layer import SELayer + + +class InvertedResidual(nn.Module): + """InvertedResidual block for MobileNetV2. + + Args: + in_channels (int): The input channels of the InvertedResidual block. + out_channels (int): The output channels of the InvertedResidual block. + stride (int): Stride of the middle (first) 3x3 convolution. + expand_ratio (int): Adjusts number of channels of the hidden layer + in InvertedResidual by this amount. + dilation (int): Dilation rate of depthwise conv. Default: 1 + conv_cfg (dict): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU6'). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + + Returns: + Tensor: The output tensor. + """ + + def __init__(self, + in_channels, + out_channels, + stride, + expand_ratio, + dilation=1, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU6'), + with_cp=False): + super(InvertedResidual, self).__init__() + self.stride = stride + assert stride in [1, 2], f'stride must in [1, 2]. ' \ + f'But received {stride}.' + self.with_cp = with_cp + self.use_res_connect = self.stride == 1 and in_channels == out_channels + hidden_dim = int(round(in_channels * expand_ratio)) + + layers = [] + if expand_ratio != 1: + layers.append( + ConvModule( + in_channels=in_channels, + out_channels=hidden_dim, + kernel_size=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + layers.extend([ + ConvModule( + in_channels=hidden_dim, + out_channels=hidden_dim, + kernel_size=3, + stride=stride, + padding=dilation, + dilation=dilation, + groups=hidden_dim, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg), + ConvModule( + in_channels=hidden_dim, + out_channels=out_channels, + kernel_size=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + ]) + self.conv = nn.Sequential(*layers) + + def forward(self, x): + + def _inner_forward(x): + if self.use_res_connect: + return x + self.conv(x) + else: + return self.conv(x) + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +class InvertedResidualV3(nn.Module): + """Inverted Residual Block for MobileNetV3. + + Args: + in_channels (int): The input channels of this Module. + out_channels (int): The output channels of this Module. + mid_channels (int): The input channels of the depthwise convolution. + kernel_size (int): The kernal size of the depthwise convolution. + Default: 3. + stride (int): The stride of the depthwise convolution. Default: 1. + se_cfg (dict): Config dict for se layer. Defaul: None, which means no + se layer. + with_expand_conv (bool): Use expand conv or not. If set False, + mid_channels must be the same with in_channels. Default: True. + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + + Returns: + Tensor: The output tensor. + """ + + def __init__(self, + in_channels, + out_channels, + mid_channels, + kernel_size=3, + stride=1, + se_cfg=None, + with_expand_conv=True, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + with_cp=False): + super(InvertedResidualV3, self).__init__() + self.with_res_shortcut = (stride == 1 and in_channels == out_channels) + assert stride in [1, 2] + self.with_cp = with_cp + self.with_se = se_cfg is not None + self.with_expand_conv = with_expand_conv + + if self.with_se: + assert isinstance(se_cfg, dict) + if not self.with_expand_conv: + assert mid_channels == in_channels + + if self.with_expand_conv: + self.expand_conv = ConvModule( + in_channels=in_channels, + out_channels=mid_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.depthwise_conv = ConvModule( + in_channels=mid_channels, + out_channels=mid_channels, + kernel_size=kernel_size, + stride=stride, + padding=kernel_size // 2, + groups=mid_channels, + conv_cfg=dict( + type='Conv2dAdaptivePadding') if stride == 2 else conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + if self.with_se: + self.se = SELayer(**se_cfg) + + self.linear_conv = ConvModule( + in_channels=mid_channels, + out_channels=out_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + def forward(self, x): + + def _inner_forward(x): + out = x + + if self.with_expand_conv: + out = self.expand_conv(out) + + out = self.depthwise_conv(out) + + if self.with_se: + out = self.se(out) + + out = self.linear_conv(out) + + if self.with_res_shortcut: + return x + out + else: + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out diff --git a/mmseg/models/utils/make_divisible.py b/mmseg/models/utils/make_divisible.py new file mode 100644 index 0000000000000000000000000000000000000000..75ad756052529f52fe83bb95dd1f0ecfc9a13078 --- /dev/null +++ b/mmseg/models/utils/make_divisible.py @@ -0,0 +1,27 @@ +def make_divisible(value, divisor, min_value=None, min_ratio=0.9): + """Make divisible function. + + This function rounds the channel number to the nearest value that can be + divisible by the divisor. It is taken from the original tf repo. It ensures + that all layers have a channel number that is divisible by divisor. It can + be seen here: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py # noqa + + Args: + value (int): The original channel number. + divisor (int): The divisor to fully divide the channel number. + min_value (int): The minimum value of the output channel. + Default: None, means that the minimum value equal to the divisor. + min_ratio (float): The minimum ratio of the rounded channel number to + the original channel number. Default: 0.9. + + Returns: + int: The modified output channel number. + """ + + if min_value is None: + min_value = divisor + new_value = max(min_value, int(value + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than (1-min_ratio). + if new_value < min_ratio * value: + new_value += divisor + return new_value diff --git a/mmseg/models/utils/res_layer.py b/mmseg/models/utils/res_layer.py new file mode 100644 index 0000000000000000000000000000000000000000..2585ab551aea79252ef6b34b5faef476e9e1abaa --- /dev/null +++ b/mmseg/models/utils/res_layer.py @@ -0,0 +1,94 @@ +from mmcv.cnn import build_conv_layer, build_norm_layer +from torch import nn as nn + + +class ResLayer(nn.Sequential): + """ResLayer to build ResNet style backbone. + + Args: + block (nn.Module): block used to build ResLayer. + inplanes (int): inplanes of block. + planes (int): planes of block. + num_blocks (int): number of blocks. + stride (int): stride of the first block. Default: 1 + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottleneck. Default: False + conv_cfg (dict): dictionary to construct and config conv layer. + Default: None + norm_cfg (dict): dictionary to construct and config norm layer. + Default: dict(type='BN') + multi_grid (int | None): Multi grid dilation rates of last + stage. Default: None + contract_dilation (bool): Whether contract first dilation of each layer + Default: False + """ + + def __init__(self, + block, + inplanes, + planes, + num_blocks, + stride=1, + dilation=1, + avg_down=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + multi_grid=None, + contract_dilation=False, + **kwargs): + self.block = block + + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = [] + conv_stride = stride + if avg_down: + conv_stride = 1 + downsample.append( + nn.AvgPool2d( + kernel_size=stride, + stride=stride, + ceil_mode=True, + count_include_pad=False)) + downsample.extend([ + build_conv_layer( + conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=conv_stride, + bias=False), + build_norm_layer(norm_cfg, planes * block.expansion)[1] + ]) + downsample = nn.Sequential(*downsample) + + layers = [] + if multi_grid is None: + if dilation > 1 and contract_dilation: + first_dilation = dilation // 2 + else: + first_dilation = dilation + else: + first_dilation = multi_grid[0] + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=stride, + dilation=first_dilation, + downsample=downsample, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + inplanes = planes * block.expansion + for i in range(1, num_blocks): + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=1, + dilation=dilation if multi_grid is None else multi_grid[i], + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + super(ResLayer, self).__init__(*layers) diff --git a/mmseg/models/utils/se_layer.py b/mmseg/models/utils/se_layer.py new file mode 100644 index 0000000000000000000000000000000000000000..d75e712cb467eab3e099e900cb3c7a2911a337d5 --- /dev/null +++ b/mmseg/models/utils/se_layer.py @@ -0,0 +1,57 @@ +import mmcv +import torch.nn as nn +from mmcv.cnn import ConvModule + +from .make_divisible import make_divisible + + +class SELayer(nn.Module): + """Squeeze-and-Excitation Module. + + Args: + channels (int): The input (and output) channels of the SE layer. + ratio (int): Squeeze ratio in SELayer, the intermediate channel will be + ``int(channels/ratio)``. Default: 16. + conv_cfg (None or dict): Config dict for convolution layer. + Default: None, which means using conv2d. + act_cfg (dict or Sequence[dict]): Config dict for activation layer. + If act_cfg is a dict, two activation layers will be configurated + by this dict. If act_cfg is a sequence of dicts, the first + activation layer will be configurated by the first dict and the + second activation layer will be configurated by the second dict. + Default: (dict(type='ReLU'), dict(type='HSigmoid', bias=3.0, + divisor=6.0)). + """ + + def __init__(self, + channels, + ratio=16, + conv_cfg=None, + act_cfg=(dict(type='ReLU'), + dict(type='HSigmoid', bias=3.0, divisor=6.0))): + super(SELayer, self).__init__() + if isinstance(act_cfg, dict): + act_cfg = (act_cfg, act_cfg) + assert len(act_cfg) == 2 + assert mmcv.is_tuple_of(act_cfg, dict) + self.global_avgpool = nn.AdaptiveAvgPool2d(1) + self.conv1 = ConvModule( + in_channels=channels, + out_channels=make_divisible(channels // ratio, 8), + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[0]) + self.conv2 = ConvModule( + in_channels=make_divisible(channels // ratio, 8), + out_channels=channels, + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[1]) + + def forward(self, x): + out = self.global_avgpool(x) + out = self.conv1(out) + out = self.conv2(out) + return x * out diff --git a/mmseg/models/utils/self_attention_block.py b/mmseg/models/utils/self_attention_block.py new file mode 100644 index 0000000000000000000000000000000000000000..372fad2e000a157c7ef283a82388a7fea0158ee0 --- /dev/null +++ b/mmseg/models/utils/self_attention_block.py @@ -0,0 +1,159 @@ +import torch +from mmcv.cnn import ConvModule, constant_init +from torch import nn as nn +from torch.nn import functional as F + + +class SelfAttentionBlock(nn.Module): + """General self-attention block/non-local block. + + Please refer to https://arxiv.org/abs/1706.03762 for details about key, + query and value. + + Args: + key_in_channels (int): Input channels of key feature. + query_in_channels (int): Input channels of query feature. + channels (int): Output channels of key/query transform. + out_channels (int): Output channels. + share_key_query (bool): Whether share projection weight between key + and query projection. + query_downsample (nn.Module): Query downsample module. + key_downsample (nn.Module): Key downsample module. + key_query_num_convs (int): Number of convs for key/query projection. + value_num_convs (int): Number of convs for value projection. + matmul_norm (bool): Whether normalize attention map with sqrt of + channels + with_out (bool): Whether use out projection. + conv_cfg (dict|None): Config of conv layers. + norm_cfg (dict|None): Config of norm layers. + act_cfg (dict|None): Config of activation layers. + """ + + def __init__(self, key_in_channels, query_in_channels, channels, + out_channels, share_key_query, query_downsample, + key_downsample, key_query_num_convs, value_out_num_convs, + key_query_norm, value_out_norm, matmul_norm, with_out, + conv_cfg, norm_cfg, act_cfg): + super(SelfAttentionBlock, self).__init__() + if share_key_query: + assert key_in_channels == query_in_channels + self.key_in_channels = key_in_channels + self.query_in_channels = query_in_channels + self.out_channels = out_channels + self.channels = channels + self.share_key_query = share_key_query + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.key_project = self.build_project( + key_in_channels, + channels, + num_convs=key_query_num_convs, + use_conv_module=key_query_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + if share_key_query: + self.query_project = self.key_project + else: + self.query_project = self.build_project( + query_in_channels, + channels, + num_convs=key_query_num_convs, + use_conv_module=key_query_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.value_project = self.build_project( + key_in_channels, + channels if with_out else out_channels, + num_convs=value_out_num_convs, + use_conv_module=value_out_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + if with_out: + self.out_project = self.build_project( + channels, + out_channels, + num_convs=value_out_num_convs, + use_conv_module=value_out_norm, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + else: + self.out_project = None + + self.query_downsample = query_downsample + self.key_downsample = key_downsample + self.matmul_norm = matmul_norm + + self.init_weights() + + def init_weights(self): + """Initialize weight of later layer.""" + if self.out_project is not None: + if not isinstance(self.out_project, ConvModule): + constant_init(self.out_project, 0) + + def build_project(self, in_channels, channels, num_convs, use_conv_module, + conv_cfg, norm_cfg, act_cfg): + """Build projection layer for key/query/value/out.""" + if use_conv_module: + convs = [ + ConvModule( + in_channels, + channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + ] + for _ in range(num_convs - 1): + convs.append( + ConvModule( + channels, + channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + else: + convs = [nn.Conv2d(in_channels, channels, 1)] + for _ in range(num_convs - 1): + convs.append(nn.Conv2d(channels, channels, 1)) + if len(convs) > 1: + convs = nn.Sequential(*convs) + else: + convs = convs[0] + return convs + + def forward(self, query_feats, key_feats): + """Forward function.""" + batch_size = query_feats.size(0) + query = self.query_project(query_feats) + if self.query_downsample is not None: + query = self.query_downsample(query) + query = query.reshape(*query.shape[:2], -1) + query = query.permute(0, 2, 1).contiguous() + + key = self.key_project(key_feats) + value = self.value_project(key_feats) + if self.key_downsample is not None: + key = self.key_downsample(key) + value = self.key_downsample(value) + key = key.reshape(*key.shape[:2], -1) + value = value.reshape(*value.shape[:2], -1) + value = value.permute(0, 2, 1).contiguous() + + sim_map = torch.matmul(query, key) + if self.matmul_norm: + sim_map = (self.channels**-.5) * sim_map + sim_map = F.softmax(sim_map, dim=-1) + + context = torch.matmul(sim_map, value) + context = context.permute(0, 2, 1).contiguous() + context = context.reshape(batch_size, -1, *query_feats.shape[2:]) + if self.out_project is not None: + context = self.out_project(context) + return context diff --git a/mmseg/models/utils/up_conv_block.py b/mmseg/models/utils/up_conv_block.py new file mode 100644 index 0000000000000000000000000000000000000000..df8a2aa7db31cf80d3c75adc4ca6da3155a75890 --- /dev/null +++ b/mmseg/models/utils/up_conv_block.py @@ -0,0 +1,101 @@ +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, build_upsample_layer + + +class UpConvBlock(nn.Module): + """Upsample convolution block in decoder for UNet. + + This upsample convolution block consists of one upsample module + followed by one convolution block. The upsample module expands the + high-level low-resolution feature map and the convolution block fuses + the upsampled high-level low-resolution feature map and the low-level + high-resolution feature map from encoder. + + Args: + conv_block (nn.Sequential): Sequential of convolutional layers. + in_channels (int): Number of input channels of the high-level + skip_channels (int): Number of input channels of the low-level + high-resolution feature map from encoder. + out_channels (int): Number of output channels. + num_convs (int): Number of convolutional layers in the conv_block. + Default: 2. + stride (int): Stride of convolutional layer in conv_block. Default: 1. + dilation (int): Dilation rate of convolutional layer in conv_block. + Default: 1. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + conv_cfg (dict | None): Config dict for convolution layer. + Default: None. + norm_cfg (dict | None): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict | None): Config dict for activation layer in ConvModule. + Default: dict(type='ReLU'). + upsample_cfg (dict): The upsample config of the upsample module in + decoder. Default: dict(type='InterpConv'). If the size of + high-level feature map is the same as that of skip feature map + (low-level feature map from encoder), it does not need upsample the + high-level feature map and the upsample_cfg is None. + dcn (bool): Use deformable convoluton in convolutional layer or not. + Default: None. + plugins (dict): plugins for convolutional layers. Default: None. + """ + + def __init__(self, + conv_block, + in_channels, + skip_channels, + out_channels, + num_convs=2, + stride=1, + dilation=1, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + dcn=None, + plugins=None): + super(UpConvBlock, self).__init__() + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.conv_block = conv_block( + in_channels=2 * skip_channels, + out_channels=out_channels, + num_convs=num_convs, + stride=stride, + dilation=dilation, + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + dcn=None, + plugins=None) + if upsample_cfg is not None: + self.upsample = build_upsample_layer( + cfg=upsample_cfg, + in_channels=in_channels, + out_channels=skip_channels, + with_cp=with_cp, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + else: + self.upsample = ConvModule( + in_channels, + skip_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, skip, x): + """Forward function.""" + + x = self.upsample(x) + out = torch.cat([skip, x], dim=1) + out = self.conv_block(out) + + return out diff --git a/mmseg/ops/__init__.py b/mmseg/ops/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bec51c75b9363a9a19e9fb5c35f4e7dbd6f7751c --- /dev/null +++ b/mmseg/ops/__init__.py @@ -0,0 +1,4 @@ +from .encoding import Encoding +from .wrappers import Upsample, resize + +__all__ = ['Upsample', 'resize', 'Encoding'] diff --git a/mmseg/ops/encoding.py b/mmseg/ops/encoding.py new file mode 100644 index 0000000000000000000000000000000000000000..d939189657576b3bb13f6fdb512775aa97737d24 --- /dev/null +++ b/mmseg/ops/encoding.py @@ -0,0 +1,74 @@ +import torch +from torch import nn as nn +from torch.nn import functional as F + + +class Encoding(nn.Module): + """Encoding Layer: a learnable residual encoder. + + Input is of shape (batch_size, channels, height, width). + Output is of shape (batch_size, num_codes, channels). + + Args: + channels: dimension of the features or feature channels + num_codes: number of code words + """ + + def __init__(self, channels, num_codes): + super(Encoding, self).__init__() + # init codewords and smoothing factor + self.channels, self.num_codes = channels, num_codes + std = 1. / ((num_codes * channels)**0.5) + # [num_codes, channels] + self.codewords = nn.Parameter( + torch.empty(num_codes, channels, + dtype=torch.float).uniform_(-std, std), + requires_grad=True) + # [num_codes] + self.scale = nn.Parameter( + torch.empty(num_codes, dtype=torch.float).uniform_(-1, 0), + requires_grad=True) + + @staticmethod + def scaled_l2(x, codewords, scale): + num_codes, channels = codewords.size() + batch_size = x.size(0) + reshaped_scale = scale.view((1, 1, num_codes)) + expanded_x = x.unsqueeze(2).expand( + (batch_size, x.size(1), num_codes, channels)) + reshaped_codewords = codewords.view((1, 1, num_codes, channels)) + + scaled_l2_norm = reshaped_scale * ( + expanded_x - reshaped_codewords).pow(2).sum(dim=3) + return scaled_l2_norm + + @staticmethod + def aggregate(assigment_weights, x, codewords): + num_codes, channels = codewords.size() + reshaped_codewords = codewords.view((1, 1, num_codes, channels)) + batch_size = x.size(0) + + expanded_x = x.unsqueeze(2).expand( + (batch_size, x.size(1), num_codes, channels)) + encoded_feat = (assigment_weights.unsqueeze(3) * + (expanded_x - reshaped_codewords)).sum(dim=1) + return encoded_feat + + def forward(self, x): + assert x.dim() == 4 and x.size(1) == self.channels + # [batch_size, channels, height, width] + batch_size = x.size(0) + # [batch_size, height x width, channels] + x = x.view(batch_size, self.channels, -1).transpose(1, 2).contiguous() + # assignment_weights: [batch_size, channels, num_codes] + assigment_weights = F.softmax( + self.scaled_l2(x, self.codewords, self.scale), dim=2) + # aggregate + encoded_feat = self.aggregate(assigment_weights, x, self.codewords) + return encoded_feat + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(Nx{self.channels}xHxW =>Nx{self.num_codes}' \ + f'x{self.channels})' + return repr_str diff --git a/mmseg/ops/wrappers.py b/mmseg/ops/wrappers.py new file mode 100644 index 0000000000000000000000000000000000000000..a6d755273df1af99371502186aef27e8e353ec9f --- /dev/null +++ b/mmseg/ops/wrappers.py @@ -0,0 +1,53 @@ +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def resize(input, + size=None, + scale_factor=None, + mode='nearest', + align_corners=None, + warning=True): + if warning: + if size is not None and align_corners: + input_h, input_w = tuple(int(x) for x in input.shape[2:]) + output_h, output_w = tuple(int(x) for x in size) + if output_h > input_h or output_w > output_h: + if ((output_h > 1 and output_w > 1 and input_h > 1 + and input_w > 1) and (output_h - 1) % (input_h - 1) + and (output_w - 1) % (input_w - 1)): + warnings.warn( + f'When align_corners={align_corners}, ' + 'the output would more aligned if ' + f'input size {(input_h, input_w)} is `x+1` and ' + f'out size {(output_h, output_w)} is `nx+1`') + if isinstance(size, torch.Size): + size = tuple(int(x) for x in size) + return F.interpolate(input, size, scale_factor, mode, align_corners) + + +class Upsample(nn.Module): + + def __init__(self, + size=None, + scale_factor=None, + mode='nearest', + align_corners=None): + super(Upsample, self).__init__() + self.size = size + if isinstance(scale_factor, tuple): + self.scale_factor = tuple(float(factor) for factor in scale_factor) + else: + self.scale_factor = float(scale_factor) if scale_factor else None + self.mode = mode + self.align_corners = align_corners + + def forward(self, x): + if not self.size: + size = [int(t * self.scale_factor) for t in x.shape[-2:]] + else: + size = self.size + return resize(x, size, None, self.mode, self.align_corners) diff --git a/mmseg/utils/__init__.py b/mmseg/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ac489e2dbbc0e6fa87f5088b4edcc20f8cadc1a6 --- /dev/null +++ b/mmseg/utils/__init__.py @@ -0,0 +1,4 @@ +from .collect_env import collect_env +from .logger import get_root_logger + +__all__ = ['get_root_logger', 'collect_env'] diff --git a/mmseg/utils/collect_env.py b/mmseg/utils/collect_env.py new file mode 100644 index 0000000000000000000000000000000000000000..8293a05fb3422249485c4d877749fc9c92a51e36 --- /dev/null +++ b/mmseg/utils/collect_env.py @@ -0,0 +1,17 @@ +from mmcv.utils import collect_env as collect_base_env +from mmcv.utils import get_git_hash + +import mmseg + + +def collect_env(): + """Collect the information of the running environments.""" + env_info = collect_base_env() + env_info['MMSegmentation'] = f'{mmseg.__version__}+{get_git_hash()[:7]}' + + return env_info + + +if __name__ == '__main__': + for name, val in collect_env().items(): + print('{}: {}'.format(name, val)) diff --git a/mmseg/utils/logger.py b/mmseg/utils/logger.py new file mode 100644 index 0000000000000000000000000000000000000000..05d2f13439ff501aa51b248ce7396ea5d41a38fb --- /dev/null +++ b/mmseg/utils/logger.py @@ -0,0 +1,27 @@ +import logging + +from mmcv.utils import get_logger + + +def get_root_logger(log_file=None, log_level=logging.INFO): + """Get the root logger. + + The logger will be initialized if it has not been initialized. By default a + StreamHandler will be added. If `log_file` is specified, a FileHandler will + also be added. The name of the root logger is the top-level package name, + e.g., "mmseg". + + Args: + log_file (str | None): The log filename. If specified, a FileHandler + will be added to the root logger. + log_level (int): The root logger level. Note that only the process of + rank 0 is affected, while other processes will set the level to + "Error" and be silent most of the time. + + Returns: + logging.Logger: The root logger. + """ + + logger = get_logger(name='mmseg', log_file=log_file, log_level=log_level) + + return logger diff --git a/mmseg/version.py b/mmseg/version.py new file mode 100644 index 0000000000000000000000000000000000000000..41a08cf155f9b938972b331c216349ef848840a5 --- /dev/null +++ b/mmseg/version.py @@ -0,0 +1,18 @@ +# Copyright (c) Open-MMLab. All rights reserved. + +__version__ = '0.11.0' + + +def parse_version_info(version_str): + version_info = [] + for x in version_str.split('.'): + if x.isdigit(): + version_info.append(int(x)) + elif x.find('rc') != -1: + patch_version = x.split('rc') + version_info.append(int(patch_version[0])) + version_info.append(f'rc{patch_version[1]}') + return tuple(version_info) + + +version_info = parse_version_info(__version__) diff --git a/pretrain b/pretrain new file mode 100644 index 0000000000000000000000000000000000000000..8f2a0bc25e45d37d2d54b1d7e22e03f8ceb06096 --- /dev/null +++ b/pretrain @@ -0,0 +1 @@ +pretrained_model \ No newline at end of file diff --git a/pretrained_model b/pretrained_model new file mode 100644 index 0000000000000000000000000000000000000000..78752e1288b1d64ed31208b594b171f2e7031a8a --- /dev/null +++ b/pretrained_model @@ -0,0 +1 @@ +../pretrained_model/ \ No newline at end of file diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..9796e871e70c7c67345b1d6bcf708c0c82377a98 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,7 @@ +[pytest] +addopts = --xdoctest --xdoctest-style=auto +norecursedirs = .git ignore build __pycache__ data docker docs .eggs + +filterwarnings= default + ignore:.*No cfgstr given in Cacher constructor or call.*:Warning + ignore:.*Define the __nice__ method for.*:Warning diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..91b35bacb850531f97c920f42c0a706fb6f55c5c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,23 @@ +<<<<<<< HEAD +<<<<<<< HEAD +-r requirements/optional.txt +-r requirements/runtime.txt +-r requirements/tests.txt +======= +======= +>>>>>>> f406c34c024e7549cfd031b9b7f8682c3107c813 +# requirements.txt +torch==1.13.1 +torchvision==0.14.1 +Pillow +gradio +# *** CRITICAL FIX: Lock NumPy to a stable, older version *** +numpy==1.24.4 +# MMSegmentation dependencies +mmcv-full==1.7.1 +<<<<<<< HEAD +mmsegmentation==0.30.0 +>>>>>>> f406c34c024e7549cfd031b9b7f8682c3107c813 +======= +mmsegmentation==0.30.0 +>>>>>>> f406c34c024e7549cfd031b9b7f8682c3107c813 diff --git a/requirements/docs.txt b/requirements/docs.txt new file mode 100644 index 0000000000000000000000000000000000000000..89fbf86c01cb29f10f7e99c910248c4d5229da58 --- /dev/null +++ b/requirements/docs.txt @@ -0,0 +1,4 @@ +recommonmark +sphinx +sphinx_markdown_tables +sphinx_rtd_theme diff --git a/requirements/optional.txt b/requirements/optional.txt new file mode 100644 index 0000000000000000000000000000000000000000..47fa5933159eb068640f6b45281d36ab4af294cb --- /dev/null +++ b/requirements/optional.txt @@ -0,0 +1 @@ +cityscapesscripts diff --git a/requirements/readthedocs.txt b/requirements/readthedocs.txt new file mode 100644 index 0000000000000000000000000000000000000000..0542bfce6dff3b002a1d33e53c0be975e7feed4a --- /dev/null +++ b/requirements/readthedocs.txt @@ -0,0 +1,3 @@ +mmcv +torch +torchvision diff --git a/requirements/runtime.txt b/requirements/runtime.txt new file mode 100644 index 0000000000000000000000000000000000000000..a8347b9c0c067c6ebeec91d7c235d8e15ee65536 --- /dev/null +++ b/requirements/runtime.txt @@ -0,0 +1,3 @@ +matplotlib +numpy +terminaltables diff --git a/requirements/tests.txt b/requirements/tests.txt new file mode 100644 index 0000000000000000000000000000000000000000..991fd711d4eed749f8f3440f9c4b448e3973575f --- /dev/null +++ b/requirements/tests.txt @@ -0,0 +1,7 @@ +codecov +flake8 +interrogate +isort==4.3.21 +pytest +xdoctest>=0.10.0 +yapf diff --git a/resources/mmseg-logo.png b/resources/mmseg-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..84d911f2dcd3f3654b637717bad872f851a82360 --- /dev/null +++ b/resources/mmseg-logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e55706ae5dfbabc48c55103023cbae35cc912c1acd1bcc0955382725ade0fb4 +size 44728 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..708fb4ce33fcf55bd448bc2234f38c1891ae0356 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,13 @@ +[yapf] +based_on_style = pep8 +blank_line_before_nested_class_or_def = true +split_before_expression_after_opening_paren = true + +[isort] +line_length = 79 +multi_line_output = 0 +known_standard_library = setuptools +known_first_party = mmseg +known_third_party = PIL,cityscapesscripts,cv2,detail,matplotlib,mmcv,numpy,onnxruntime,oss2,pytest,scipy,terminaltables,torch +no_lines_before = STDLIB,LOCALFOLDER +default_section = THIRDPARTY diff --git a/setup.py b/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..4b2e1483dbffd7ae39ac1a9563058307bbf8e0a2 --- /dev/null +++ b/setup.py @@ -0,0 +1,125 @@ +from setuptools import find_packages, setup + +def readme(): + with open('README.md', encoding='utf-8') as f: + content = f.read() + return content + + +version_file = 'mmseg/version.py' + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +def parse_requirements(fname='requirements.txt', with_version=True): + """Parse the package dependencies listed in a requirements file but strips + specific versioning information. + + Args: + fname (str): path to requirements file + with_version (bool, default=False): if True include version specs + + Returns: + List[str]: list of requirements items + + CommandLine: + python -c "import setup; print(setup.parse_requirements())" + """ + import sys + from os.path import exists + import re + require_fpath = fname + + def parse_line(line): + """Parse information from a line in a requirements text file.""" + if line.startswith('-r '): + # Allow specifying requirements in other files + target = line.split(' ')[1] + for info in parse_require_file(target): + yield info + else: + info = {'line': line} + if line.startswith('-e '): + info['package'] = line.split('#egg=')[1] + else: + # Remove versioning from the package + pat = '(' + '|'.join(['>=', '==', '>']) + ')' + parts = re.split(pat, line, maxsplit=1) + parts = [p.strip() for p in parts] + + info['package'] = parts[0] + if len(parts) > 1: + op, rest = parts[1:] + if ';' in rest: + # Handle platform specific dependencies + # http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies + version, platform_deps = map(str.strip, + rest.split(';')) + info['platform_deps'] = platform_deps + else: + version = rest # NOQA + info['version'] = (op, version) + yield info + + def parse_require_file(fpath): + with open(fpath, 'r') as f: + for line in f.readlines(): + line = line.strip() + if line and not line.startswith('#'): + for info in parse_line(line): + yield info + + def gen_packages_items(): + if exists(require_fpath): + for info in parse_require_file(require_fpath): + parts = [info['package']] + if with_version and 'version' in info: + parts.extend(info['version']) + if not sys.version.startswith('3.4'): + # apparently package_deps are broken in 3.4 + platform_deps = info.get('platform_deps') + if platform_deps is not None: + parts.append(';' + platform_deps) + item = ''.join(parts) + yield item + + packages = list(gen_packages_items()) + return packages + + +if __name__ == '__main__': + setup( + name='mmsegmentation', + version=get_version(), + description='Open MMLab Semantic Segmentation Toolbox and Benchmark', + long_description=readme(), + long_description_content_type='text/markdown', + author='MMSegmentation Authors', + author_email='openmmlab@gmail.com', + keywords='computer vision, semantic segmentation', + url='http://github.com/open-mmlab/mmsegmentation', + packages=find_packages(exclude=('configs', 'tools', 'demo')), + classifiers=[ + 'Development Status :: 4 - Beta', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + ], + license='Apache License 2.0', + setup_requires=parse_requirements('requirements/build.txt'), + tests_require=parse_requirements('requirements/tests.txt'), + install_requires=parse_requirements('requirements/runtime.txt'), + extras_require={ + 'all': parse_requirements('requirements.txt'), + 'tests': parse_requirements('requirements/tests.txt'), + 'build': parse_requirements('requirements/build.txt'), + 'optional': parse_requirements('requirements/optional.txt'), + }, + ext_modules=[], + zip_safe=False) diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000000000000000000000000000000000000..b991fbfd31233b113a92e927ca6072b54457f73e --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,160 @@ +import glob +import os +from os.path import dirname, exists, isdir, join, relpath + +from mmcv import Config +from torch import nn + +from mmseg.models import build_segmentor + + +def _get_config_directory(): + """Find the predefined segmentor config directory.""" + try: + # Assume we are running in the source mmsegmentation repo + repo_dpath = dirname(dirname(__file__)) + except NameError: + # For IPython development when this __file__ is not defined + import mmseg + repo_dpath = dirname(dirname(mmseg.__file__)) + config_dpath = join(repo_dpath, 'configs') + if not exists(config_dpath): + raise Exception('Cannot find config path') + return config_dpath + + +def test_config_build_segmentor(): + """Test that all segmentation models defined in the configs can be + initialized.""" + config_dpath = _get_config_directory() + print('Found config_dpath = {!r}'.format(config_dpath)) + + config_fpaths = [] + # one config each sub folder + for sub_folder in os.listdir(config_dpath): + if isdir(sub_folder): + config_fpaths.append( + list(glob.glob(join(config_dpath, sub_folder, '*.py')))[0]) + config_fpaths = [p for p in config_fpaths if p.find('_base_') == -1] + config_names = [relpath(p, config_dpath) for p in config_fpaths] + + print('Using {} config files'.format(len(config_names))) + + for config_fname in config_names: + config_fpath = join(config_dpath, config_fname) + config_mod = Config.fromfile(config_fpath) + + config_mod.model + print('Building segmentor, config_fpath = {!r}'.format(config_fpath)) + + # Remove pretrained keys to allow for testing in an offline environment + if 'pretrained' in config_mod.model: + config_mod.model['pretrained'] = None + + print('building {}'.format(config_fname)) + segmentor = build_segmentor(config_mod.model) + assert segmentor is not None + + head_config = config_mod.model['decode_head'] + _check_decode_head(head_config, segmentor.decode_head) + + +def test_config_data_pipeline(): + """Test whether the data pipeline is valid and can process corner cases. + + CommandLine: + xdoctest -m tests/test_config.py test_config_build_data_pipeline + """ + from mmcv import Config + from mmseg.datasets.pipelines import Compose + import numpy as np + + config_dpath = _get_config_directory() + print('Found config_dpath = {!r}'.format(config_dpath)) + + import glob + config_fpaths = list(glob.glob(join(config_dpath, '**', '*.py'))) + config_fpaths = [p for p in config_fpaths if p.find('_base_') == -1] + config_names = [relpath(p, config_dpath) for p in config_fpaths] + + print('Using {} config files'.format(len(config_names))) + + for config_fname in config_names: + config_fpath = join(config_dpath, config_fname) + print( + 'Building data pipeline, config_fpath = {!r}'.format(config_fpath)) + config_mod = Config.fromfile(config_fpath) + + # remove loading pipeline + load_img_pipeline = config_mod.train_pipeline.pop(0) + to_float32 = load_img_pipeline.get('to_float32', False) + config_mod.train_pipeline.pop(0) + config_mod.test_pipeline.pop(0) + + train_pipeline = Compose(config_mod.train_pipeline) + test_pipeline = Compose(config_mod.test_pipeline) + + img = np.random.randint(0, 255, size=(1024, 2048, 3), dtype=np.uint8) + if to_float32: + img = img.astype(np.float32) + seg = np.random.randint(0, 255, size=(1024, 2048, 1), dtype=np.uint8) + + results = dict( + filename='test_img.png', + ori_filename='test_img.png', + img=img, + img_shape=img.shape, + ori_shape=img.shape, + gt_semantic_seg=seg) + results['seg_fields'] = ['gt_semantic_seg'] + + print('Test training data pipeline: \n{!r}'.format(train_pipeline)) + output_results = train_pipeline(results) + assert output_results is not None + + results = dict( + filename='test_img.png', + ori_filename='test_img.png', + img=img, + img_shape=img.shape, + ori_shape=img.shape, + ) + print('Test testing data pipeline: \n{!r}'.format(test_pipeline)) + output_results = test_pipeline(results) + assert output_results is not None + + +def _check_decode_head(decode_head_cfg, decode_head): + if isinstance(decode_head_cfg, list): + assert isinstance(decode_head, nn.ModuleList) + assert len(decode_head_cfg) == len(decode_head) + num_heads = len(decode_head) + for i in range(num_heads): + _check_decode_head(decode_head_cfg[i], decode_head[i]) + return + # check consistency between head_config and roi_head + assert decode_head_cfg['type'] == decode_head.__class__.__name__ + + assert decode_head_cfg['type'] == decode_head.__class__.__name__ + + in_channels = decode_head_cfg.in_channels + input_transform = decode_head.input_transform + assert input_transform in ['resize_concat', 'multiple_select', None] + if input_transform is not None: + assert isinstance(in_channels, (list, tuple)) + assert isinstance(decode_head.in_index, (list, tuple)) + assert len(in_channels) == len(decode_head.in_index) + elif input_transform == 'resize_concat': + assert sum(in_channels) == decode_head.in_channels + else: + assert isinstance(in_channels, int) + assert in_channels == decode_head.in_channels + assert isinstance(decode_head.in_index, int) + + if decode_head_cfg['type'] == 'PointHead': + assert decode_head_cfg.channels+decode_head_cfg.num_classes == \ + decode_head.fc_seg.in_channels + assert decode_head.fc_seg.out_channels == decode_head_cfg.num_classes + else: + assert decode_head_cfg.channels == decode_head.conv_seg.in_channels + assert decode_head.conv_seg.out_channels == decode_head_cfg.num_classes diff --git a/tests/test_data/test_dataset.py b/tests/test_data/test_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..2e19c30f084aefd5a7567f3b05aa3a64e25db4bf --- /dev/null +++ b/tests/test_data/test_dataset.py @@ -0,0 +1,291 @@ +import os.path as osp +from unittest.mock import MagicMock, patch + +import numpy as np +import pytest + +from mmseg.core.evaluation import get_classes, get_palette +from mmseg.datasets import (DATASETS, ADE20KDataset, CityscapesDataset, + ConcatDataset, CustomDataset, PascalVOCDataset, + RepeatDataset) + + +def test_classes(): + assert list(CityscapesDataset.CLASSES) == get_classes('cityscapes') + assert list(PascalVOCDataset.CLASSES) == get_classes('voc') == get_classes( + 'pascal_voc') + assert list( + ADE20KDataset.CLASSES) == get_classes('ade') == get_classes('ade20k') + + with pytest.raises(ValueError): + get_classes('unsupported') + + +def test_palette(): + assert CityscapesDataset.PALETTE == get_palette('cityscapes') + assert PascalVOCDataset.PALETTE == get_palette('voc') == get_palette( + 'pascal_voc') + assert ADE20KDataset.PALETTE == get_palette('ade') == get_palette('ade20k') + + with pytest.raises(ValueError): + get_palette('unsupported') + + +@patch('mmseg.datasets.CustomDataset.load_annotations', MagicMock) +@patch('mmseg.datasets.CustomDataset.__getitem__', + MagicMock(side_effect=lambda idx: idx)) +def test_dataset_wrapper(): + # CustomDataset.load_annotations = MagicMock() + # CustomDataset.__getitem__ = MagicMock(side_effect=lambda idx: idx) + dataset_a = CustomDataset(img_dir=MagicMock(), pipeline=[]) + len_a = 10 + dataset_a.img_infos = MagicMock() + dataset_a.img_infos.__len__.return_value = len_a + dataset_b = CustomDataset(img_dir=MagicMock(), pipeline=[]) + len_b = 20 + dataset_b.img_infos = MagicMock() + dataset_b.img_infos.__len__.return_value = len_b + + concat_dataset = ConcatDataset([dataset_a, dataset_b]) + assert concat_dataset[5] == 5 + assert concat_dataset[25] == 15 + assert len(concat_dataset) == len(dataset_a) + len(dataset_b) + + repeat_dataset = RepeatDataset(dataset_a, 10) + assert repeat_dataset[5] == 5 + assert repeat_dataset[15] == 5 + assert repeat_dataset[27] == 7 + assert len(repeat_dataset) == 10 * len(dataset_a) + + +def test_custom_dataset(): + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + crop_size = (512, 1024) + train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict(type='Resize', img_scale=(128, 256), ratio_range=(0.5, 2.0)), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']), + ] + test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(128, 256), + # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) + ] + + # with img_dir and ann_dir + train_dataset = CustomDataset( + train_pipeline, + data_root=osp.join(osp.dirname(__file__), '../data/pseudo_dataset'), + img_dir='imgs/', + ann_dir='gts/', + img_suffix='img.jpg', + seg_map_suffix='gt.png') + assert len(train_dataset) == 5 + + # with img_dir, ann_dir, split + train_dataset = CustomDataset( + train_pipeline, + data_root=osp.join(osp.dirname(__file__), '../data/pseudo_dataset'), + img_dir='imgs/', + ann_dir='gts/', + img_suffix='img.jpg', + seg_map_suffix='gt.png', + split='splits/train.txt') + assert len(train_dataset) == 4 + + # no data_root + train_dataset = CustomDataset( + train_pipeline, + img_dir=osp.join(osp.dirname(__file__), '../data/pseudo_dataset/imgs'), + ann_dir=osp.join(osp.dirname(__file__), '../data/pseudo_dataset/gts'), + img_suffix='img.jpg', + seg_map_suffix='gt.png') + assert len(train_dataset) == 5 + + # with data_root but img_dir/ann_dir are abs path + train_dataset = CustomDataset( + train_pipeline, + data_root=osp.join(osp.dirname(__file__), '../data/pseudo_dataset'), + img_dir=osp.abspath( + osp.join(osp.dirname(__file__), '../data/pseudo_dataset/imgs')), + ann_dir=osp.abspath( + osp.join(osp.dirname(__file__), '../data/pseudo_dataset/gts')), + img_suffix='img.jpg', + seg_map_suffix='gt.png') + assert len(train_dataset) == 5 + + # test_mode=True + test_dataset = CustomDataset( + test_pipeline, + img_dir=osp.join(osp.dirname(__file__), '../data/pseudo_dataset/imgs'), + img_suffix='img.jpg', + test_mode=True) + assert len(test_dataset) == 5 + + # training data get + train_data = train_dataset[0] + assert isinstance(train_data, dict) + + # test data get + test_data = test_dataset[0] + assert isinstance(test_data, dict) + + # get gt seg map + gt_seg_maps = train_dataset.get_gt_seg_maps() + assert len(gt_seg_maps) == 5 + + # evaluation + pseudo_results = [] + for gt_seg_map in gt_seg_maps: + h, w = gt_seg_map.shape + pseudo_results.append(np.random.randint(low=0, high=7, size=(h, w))) + eval_results = train_dataset.evaluate(pseudo_results, metric='mIoU') + assert isinstance(eval_results, dict) + assert 'mIoU' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + eval_results = train_dataset.evaluate(pseudo_results, metric='mDice') + assert isinstance(eval_results, dict) + assert 'mDice' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + eval_results = train_dataset.evaluate( + pseudo_results, metric=['mDice', 'mIoU']) + assert isinstance(eval_results, dict) + assert 'mIoU' in eval_results + assert 'mDice' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + # evaluation with CLASSES + train_dataset.CLASSES = tuple(['a'] * 7) + eval_results = train_dataset.evaluate(pseudo_results, metric='mIoU') + assert isinstance(eval_results, dict) + assert 'mIoU' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + eval_results = train_dataset.evaluate(pseudo_results, metric='mDice') + assert isinstance(eval_results, dict) + assert 'mDice' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + eval_results = train_dataset.evaluate( + pseudo_results, metric=['mIoU', 'mDice']) + assert isinstance(eval_results, dict) + assert 'mIoU' in eval_results + assert 'mDice' in eval_results + assert 'mAcc' in eval_results + assert 'aAcc' in eval_results + + +@patch('mmseg.datasets.CustomDataset.load_annotations', MagicMock) +@patch('mmseg.datasets.CustomDataset.__getitem__', + MagicMock(side_effect=lambda idx: idx)) +@pytest.mark.parametrize('dataset, classes', [ + ('ADE20KDataset', ('wall', 'building')), + ('CityscapesDataset', ('road', 'sidewalk')), + ('CustomDataset', ('bus', 'car')), + ('PascalVOCDataset', ('aeroplane', 'bicycle')), +]) +def test_custom_classes_override_default(dataset, classes): + + dataset_class = DATASETS.get(dataset) + + original_classes = dataset_class.CLASSES + + # Test setting classes as a tuple + custom_dataset = dataset_class( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=classes, + test_mode=True) + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == classes + + # Test setting classes as a list + custom_dataset = dataset_class( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=list(classes), + test_mode=True) + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == list(classes) + + # Test overriding not a subset + custom_dataset = dataset_class( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=[classes[0]], + test_mode=True) + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == [classes[0]] + + # Test default behavior + custom_dataset = dataset_class( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=None, + test_mode=True) + + assert custom_dataset.CLASSES == original_classes + + +@patch('mmseg.datasets.CustomDataset.load_annotations', MagicMock) +@patch('mmseg.datasets.CustomDataset.__getitem__', + MagicMock(side_effect=lambda idx: idx)) +def test_custom_dataset_random_palette_is_generated(): + dataset = CustomDataset( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=('bus', 'car'), + test_mode=True) + assert len(dataset.PALETTE) == 2 + for class_color in dataset.PALETTE: + assert len(class_color) == 3 + assert all(x >= 0 and x <= 255 for x in class_color) + + +@patch('mmseg.datasets.CustomDataset.load_annotations', MagicMock) +@patch('mmseg.datasets.CustomDataset.__getitem__', + MagicMock(side_effect=lambda idx: idx)) +def test_custom_dataset_custom_palette(): + dataset = CustomDataset( + pipeline=[], + img_dir=MagicMock(), + split=MagicMock(), + classes=('bus', 'car'), + palette=[[100, 100, 100], [200, 200, 200]], + test_mode=True) + assert tuple(dataset.PALETTE) == tuple([[100, 100, 100], [200, 200, 200]]) diff --git a/tests/test_data/test_dataset_builder.py b/tests/test_data/test_dataset_builder.py new file mode 100644 index 0000000000000000000000000000000000000000..c6827e4d1758aa43716aceab793bb33da85a2398 --- /dev/null +++ b/tests/test_data/test_dataset_builder.py @@ -0,0 +1,192 @@ +import math +import os.path as osp + +import pytest +from torch.utils.data import (DistributedSampler, RandomSampler, + SequentialSampler) + +from mmseg.datasets import (DATASETS, ConcatDataset, build_dataloader, + build_dataset) + + +@DATASETS.register_module() +class ToyDataset(object): + + def __init__(self, cnt=0): + self.cnt = cnt + + def __item__(self, idx): + return idx + + def __len__(self): + return 100 + + +def test_build_dataset(): + cfg = dict(type='ToyDataset') + dataset = build_dataset(cfg) + assert isinstance(dataset, ToyDataset) + assert dataset.cnt == 0 + dataset = build_dataset(cfg, default_args=dict(cnt=1)) + assert isinstance(dataset, ToyDataset) + assert dataset.cnt == 1 + + data_root = osp.join(osp.dirname(__file__), '../data/pseudo_dataset') + img_dir = 'imgs/' + ann_dir = 'gts/' + + # We use same dir twice for simplicity + # with ann_dir + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + ann_dir=[ann_dir, ann_dir]) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 10 + + # with ann_dir, split + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=img_dir, + ann_dir=ann_dir, + split=['splits/train.txt', 'splits/val.txt']) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 5 + + # with ann_dir, split + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=img_dir, + ann_dir=[ann_dir, ann_dir], + split=['splits/train.txt', 'splits/val.txt']) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 5 + + # test mode + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + test_mode=True) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 10 + + # test mode with splits + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + split=['splits/val.txt', 'splits/val.txt'], + test_mode=True) + dataset = build_dataset(cfg) + assert isinstance(dataset, ConcatDataset) + assert len(dataset) == 2 + + # len(ann_dir) should be zero or len(img_dir) when len(img_dir) > 1 + with pytest.raises(AssertionError): + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + ann_dir=[ann_dir, ann_dir, ann_dir]) + build_dataset(cfg) + + # len(splits) should be zero or len(img_dir) when len(img_dir) > 1 + with pytest.raises(AssertionError): + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=[img_dir, img_dir], + split=['splits/val.txt', 'splits/val.txt', 'splits/val.txt']) + build_dataset(cfg) + + # len(splits) == len(ann_dir) when only len(img_dir) == 1 and len( + # ann_dir) > 1 + with pytest.raises(AssertionError): + cfg = dict( + type='CustomDataset', + pipeline=[], + data_root=data_root, + img_dir=img_dir, + ann_dir=[ann_dir, ann_dir], + split=['splits/val.txt', 'splits/val.txt', 'splits/val.txt']) + build_dataset(cfg) + + +def test_build_dataloader(): + dataset = ToyDataset() + samples_per_gpu = 3 + # dist=True, shuffle=True, 1GPU + dataloader = build_dataloader( + dataset, samples_per_gpu=samples_per_gpu, workers_per_gpu=2) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert isinstance(dataloader.sampler, DistributedSampler) + assert dataloader.sampler.shuffle + + # dist=True, shuffle=False, 1GPU + dataloader = build_dataloader( + dataset, + samples_per_gpu=samples_per_gpu, + workers_per_gpu=2, + shuffle=False) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert isinstance(dataloader.sampler, DistributedSampler) + assert not dataloader.sampler.shuffle + + # dist=True, shuffle=True, 8GPU + dataloader = build_dataloader( + dataset, + samples_per_gpu=samples_per_gpu, + workers_per_gpu=2, + num_gpus=8) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert dataloader.num_workers == 2 + + # dist=False, shuffle=True, 1GPU + dataloader = build_dataloader( + dataset, + samples_per_gpu=samples_per_gpu, + workers_per_gpu=2, + dist=False) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert isinstance(dataloader.sampler, RandomSampler) + assert dataloader.num_workers == 2 + + # dist=False, shuffle=False, 1GPU + dataloader = build_dataloader( + dataset, + samples_per_gpu=3, + workers_per_gpu=2, + shuffle=False, + dist=False) + assert dataloader.batch_size == samples_per_gpu + assert len(dataloader) == int(math.ceil(len(dataset) / samples_per_gpu)) + assert isinstance(dataloader.sampler, SequentialSampler) + assert dataloader.num_workers == 2 + + # dist=False, shuffle=True, 8GPU + dataloader = build_dataloader( + dataset, samples_per_gpu=3, workers_per_gpu=2, num_gpus=8, dist=False) + assert dataloader.batch_size == samples_per_gpu * 8 + assert len(dataloader) == int( + math.ceil(len(dataset) / samples_per_gpu / 8)) + assert isinstance(dataloader.sampler, RandomSampler) + assert dataloader.num_workers == 16 diff --git a/tests/test_data/test_loading.py b/tests/test_data/test_loading.py new file mode 100644 index 0000000000000000000000000000000000000000..e8aa5d31301caa9a40dfa8ebd8f39ee72d4f6a8f --- /dev/null +++ b/tests/test_data/test_loading.py @@ -0,0 +1,198 @@ +import copy +import os.path as osp +import tempfile + +import mmcv +import numpy as np + +from mmseg.datasets.pipelines import LoadAnnotations, LoadImageFromFile + + +class TestLoading(object): + + @classmethod + def setup_class(cls): + cls.data_prefix = osp.join(osp.dirname(__file__), '../data') + + def test_load_img(self): + results = dict( + img_prefix=self.data_prefix, img_info=dict(filename='color.jpg')) + transform = LoadImageFromFile() + results = transform(copy.deepcopy(results)) + assert results['filename'] == osp.join(self.data_prefix, 'color.jpg') + assert results['ori_filename'] == 'color.jpg' + assert results['img'].shape == (288, 512, 3) + assert results['img'].dtype == np.uint8 + assert results['img_shape'] == (288, 512, 3) + assert results['ori_shape'] == (288, 512, 3) + assert results['pad_shape'] == (288, 512, 3) + assert results['scale_factor'] == 1.0 + np.testing.assert_equal(results['img_norm_cfg']['mean'], + np.zeros(3, dtype=np.float32)) + assert repr(transform) == transform.__class__.__name__ + \ + "(to_float32=False,color_type='color',imdecode_backend='cv2')" + + # no img_prefix + results = dict( + img_prefix=None, img_info=dict(filename='tests/data/color.jpg')) + transform = LoadImageFromFile() + results = transform(copy.deepcopy(results)) + assert results['filename'] == 'tests/data/color.jpg' + assert results['ori_filename'] == 'tests/data/color.jpg' + assert results['img'].shape == (288, 512, 3) + + # to_float32 + transform = LoadImageFromFile(to_float32=True) + results = transform(copy.deepcopy(results)) + assert results['img'].dtype == np.float32 + + # gray image + results = dict( + img_prefix=self.data_prefix, img_info=dict(filename='gray.jpg')) + transform = LoadImageFromFile() + results = transform(copy.deepcopy(results)) + assert results['img'].shape == (288, 512, 3) + assert results['img'].dtype == np.uint8 + + transform = LoadImageFromFile(color_type='unchanged') + results = transform(copy.deepcopy(results)) + assert results['img'].shape == (288, 512) + assert results['img'].dtype == np.uint8 + np.testing.assert_equal(results['img_norm_cfg']['mean'], + np.zeros(1, dtype=np.float32)) + + def test_load_seg(self): + results = dict( + seg_prefix=self.data_prefix, + ann_info=dict(seg_map='seg.png'), + seg_fields=[]) + transform = LoadAnnotations() + results = transform(copy.deepcopy(results)) + assert results['seg_fields'] == ['gt_semantic_seg'] + assert results['gt_semantic_seg'].shape == (288, 512) + assert results['gt_semantic_seg'].dtype == np.uint8 + assert repr(transform) == transform.__class__.__name__ + \ + "(reduce_zero_label=False,imdecode_backend='pillow')" + + # no img_prefix + results = dict( + seg_prefix=None, + ann_info=dict(seg_map='tests/data/seg.png'), + seg_fields=[]) + transform = LoadAnnotations() + results = transform(copy.deepcopy(results)) + assert results['gt_semantic_seg'].shape == (288, 512) + assert results['gt_semantic_seg'].dtype == np.uint8 + + # reduce_zero_label + transform = LoadAnnotations(reduce_zero_label=True) + results = transform(copy.deepcopy(results)) + assert results['gt_semantic_seg'].shape == (288, 512) + assert results['gt_semantic_seg'].dtype == np.uint8 + + # mmcv backend + results = dict( + seg_prefix=self.data_prefix, + ann_info=dict(seg_map='seg.png'), + seg_fields=[]) + transform = LoadAnnotations(imdecode_backend='pillow') + results = transform(copy.deepcopy(results)) + # this image is saved by PIL + assert results['gt_semantic_seg'].shape == (288, 512) + assert results['gt_semantic_seg'].dtype == np.uint8 + + def test_load_seg_custom_classes(self): + + test_img = np.random.rand(10, 10) + test_gt = np.zeros_like(test_img) + test_gt[2:4, 2:4] = 1 + test_gt[2:4, 6:8] = 2 + test_gt[6:8, 2:4] = 3 + test_gt[6:8, 6:8] = 4 + + tmp_dir = tempfile.TemporaryDirectory() + img_path = osp.join(tmp_dir.name, 'img.jpg') + gt_path = osp.join(tmp_dir.name, 'gt.png') + + mmcv.imwrite(test_img, img_path) + mmcv.imwrite(test_gt, gt_path) + + # test only train with label with id 3 + results = dict( + img_info=dict(filename=img_path), + ann_info=dict(seg_map=gt_path), + label_map={ + 0: 0, + 1: 0, + 2: 0, + 3: 1, + 4: 0 + }, + seg_fields=[]) + + load_imgs = LoadImageFromFile() + results = load_imgs(copy.deepcopy(results)) + + load_anns = LoadAnnotations() + results = load_anns(copy.deepcopy(results)) + + gt_array = results['gt_semantic_seg'] + + true_mask = np.zeros_like(gt_array) + true_mask[6:8, 2:4] = 1 + + assert results['seg_fields'] == ['gt_semantic_seg'] + assert gt_array.shape == (10, 10) + assert gt_array.dtype == np.uint8 + np.testing.assert_array_equal(gt_array, true_mask) + + # test only train with label with id 4 and 3 + results = dict( + img_info=dict(filename=img_path), + ann_info=dict(seg_map=gt_path), + label_map={ + 0: 0, + 1: 0, + 2: 0, + 3: 2, + 4: 1 + }, + seg_fields=[]) + + load_imgs = LoadImageFromFile() + results = load_imgs(copy.deepcopy(results)) + + load_anns = LoadAnnotations() + results = load_anns(copy.deepcopy(results)) + + gt_array = results['gt_semantic_seg'] + + true_mask = np.zeros_like(gt_array) + true_mask[6:8, 2:4] = 2 + true_mask[6:8, 6:8] = 1 + + assert results['seg_fields'] == ['gt_semantic_seg'] + assert gt_array.shape == (10, 10) + assert gt_array.dtype == np.uint8 + np.testing.assert_array_equal(gt_array, true_mask) + + # test no custom classes + results = dict( + img_info=dict(filename=img_path), + ann_info=dict(seg_map=gt_path), + seg_fields=[]) + + load_imgs = LoadImageFromFile() + results = load_imgs(copy.deepcopy(results)) + + load_anns = LoadAnnotations() + results = load_anns(copy.deepcopy(results)) + + gt_array = results['gt_semantic_seg'] + + assert results['seg_fields'] == ['gt_semantic_seg'] + assert gt_array.shape == (10, 10) + assert gt_array.dtype == np.uint8 + np.testing.assert_array_equal(gt_array, test_gt) + + tmp_dir.cleanup() diff --git a/tests/test_data/test_transform.py b/tests/test_data/test_transform.py new file mode 100644 index 0000000000000000000000000000000000000000..a6417575c39e76607a522b6d1345e5ed2e19999e --- /dev/null +++ b/tests/test_data/test_transform.py @@ -0,0 +1,478 @@ +import copy +import os.path as osp + +import mmcv +import numpy as np +import pytest +from mmcv.utils import build_from_cfg +from PIL import Image + +from mmseg.datasets.builder import PIPELINES + + +def test_resize(): + # test assertion if img_scale is a list + with pytest.raises(AssertionError): + transform = dict(type='Resize', img_scale=[1333, 800], keep_ratio=True) + build_from_cfg(transform, PIPELINES) + + # test assertion if len(img_scale) while ratio_range is not None + with pytest.raises(AssertionError): + transform = dict( + type='Resize', + img_scale=[(1333, 800), (1333, 600)], + ratio_range=(0.9, 1.1), + keep_ratio=True) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid multiscale_mode + with pytest.raises(AssertionError): + transform = dict( + type='Resize', + img_scale=[(1333, 800), (1333, 600)], + keep_ratio=True, + multiscale_mode='2333') + build_from_cfg(transform, PIPELINES) + + transform = dict(type='Resize', img_scale=(1333, 800), keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + + results = dict() + # (288, 512, 3) + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + resized_results = resize_module(results.copy()) + assert resized_results['img_shape'] == (750, 1333, 3) + + # test keep_ratio=False + transform = dict( + type='Resize', + img_scale=(1280, 800), + multiscale_mode='value', + keep_ratio=False) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert resized_results['img_shape'] == (800, 1280, 3) + + # test multiscale_mode='range' + transform = dict( + type='Resize', + img_scale=[(1333, 400), (1333, 1200)], + multiscale_mode='range', + keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert max(resized_results['img_shape'][:2]) <= 1333 + assert min(resized_results['img_shape'][:2]) >= 400 + assert min(resized_results['img_shape'][:2]) <= 1200 + + # test multiscale_mode='value' + transform = dict( + type='Resize', + img_scale=[(1333, 800), (1333, 400)], + multiscale_mode='value', + keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert resized_results['img_shape'] in [(750, 1333, 3), (400, 711, 3)] + + # test multiscale_mode='range' + transform = dict( + type='Resize', + img_scale=(1333, 800), + ratio_range=(0.9, 1.1), + keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert max(resized_results['img_shape'][:2]) <= 1333 * 1.1 + + # test img_scale=None and ratio_range is tuple. + # img shape: (288, 512, 3) + transform = dict( + type='Resize', img_scale=None, ratio_range=(0.5, 2.0), keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + resized_results = resize_module(results.copy()) + assert int(288 * 0.5) <= resized_results['img_shape'][0] <= 288 * 2.0 + assert int(512 * 0.5) <= resized_results['img_shape'][1] <= 512 * 2.0 + + +def test_flip(): + # test assertion for invalid prob + with pytest.raises(AssertionError): + transform = dict(type='RandomFlip', prob=1.5) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid direction + with pytest.raises(AssertionError): + transform = dict(type='RandomFlip', prob=1, direction='horizonta') + build_from_cfg(transform, PIPELINES) + + transform = dict(type='RandomFlip', prob=1) + flip_module = build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + original_seg = copy.deepcopy(seg) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = flip_module(results) + + flip_module = build_from_cfg(transform, PIPELINES) + results = flip_module(results) + assert np.equal(original_img, results['img']).all() + assert np.equal(original_seg, results['gt_semantic_seg']).all() + + +def test_random_crop(): + # test assertion for invalid random crop + with pytest.raises(AssertionError): + transform = dict(type='RandomCrop', crop_size=(-1, 0)) + build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + h, w, _ = img.shape + transform = dict(type='RandomCrop', crop_size=(h - 20, w - 20)) + crop_module = build_from_cfg(transform, PIPELINES) + results = crop_module(results) + assert results['img'].shape[:2] == (h - 20, w - 20) + assert results['img_shape'][:2] == (h - 20, w - 20) + assert results['gt_semantic_seg'].shape[:2] == (h - 20, w - 20) + + +def test_pad(): + # test assertion if both size_divisor and size is None + with pytest.raises(AssertionError): + transform = dict(type='Pad') + build_from_cfg(transform, PIPELINES) + + transform = dict(type='Pad', size_divisor=32) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + # original img already divisible by 32 + assert np.equal(results['img'], original_img).all() + img_shape = results['img'].shape + assert img_shape[0] % 32 == 0 + assert img_shape[1] % 32 == 0 + + resize_transform = dict( + type='Resize', img_scale=(1333, 800), keep_ratio=True) + resize_module = build_from_cfg(resize_transform, PIPELINES) + results = resize_module(results) + results = transform(results) + img_shape = results['img'].shape + assert img_shape[0] % 32 == 0 + assert img_shape[1] % 32 == 0 + + +def test_rotate(): + # test assertion degree should be tuple[float] or float + with pytest.raises(AssertionError): + transform = dict(type='RandomRotate', prob=0.5, degree=-10) + build_from_cfg(transform, PIPELINES) + # test assertion degree should be tuple[float] or float + with pytest.raises(AssertionError): + transform = dict(type='RandomRotate', prob=0.5, degree=(10., 20., 30.)) + build_from_cfg(transform, PIPELINES) + + transform = dict(type='RandomRotate', degree=10., prob=1.) + transform = build_from_cfg(transform, PIPELINES) + + assert str(transform) == f'RandomRotate(' \ + f'prob={1.}, ' \ + f'degree=({-10.}, {10.}), ' \ + f'pad_val={0}, ' \ + f'seg_pad_val={255}, ' \ + f'center={None}, ' \ + f'auto_bound={False})' + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + h, w, _ = img.shape + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + assert results['img'].shape[:2] == (h, w) + assert results['gt_semantic_seg'].shape[:2] == (h, w) + + +def test_normalize(): + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + transform = dict(type='Normalize', **img_norm_cfg) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + + mean = np.array(img_norm_cfg['mean']) + std = np.array(img_norm_cfg['std']) + converted_img = (original_img[..., ::-1] - mean) / std + assert np.allclose(results['img'], converted_img) + + +def test_rgb2gray(): + # test assertion out_channels should be greater than 0 + with pytest.raises(AssertionError): + transform = dict(type='RGB2Gray', out_channels=-1) + build_from_cfg(transform, PIPELINES) + # test assertion weights should be tuple[float] + with pytest.raises(AssertionError): + transform = dict(type='RGB2Gray', out_channels=1, weights=1.1) + build_from_cfg(transform, PIPELINES) + + # test out_channels is None + transform = dict(type='RGB2Gray') + transform = build_from_cfg(transform, PIPELINES) + + assert str(transform) == f'RGB2Gray(' \ + f'out_channels={None}, ' \ + f'weights={(0.299, 0.587, 0.114)})' + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + h, w, c = img.shape + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + assert results['img'].shape == (h, w, c) + assert results['img_shape'] == (h, w, c) + assert results['ori_shape'] == (h, w, c) + + # test out_channels = 2 + transform = dict(type='RGB2Gray', out_channels=2) + transform = build_from_cfg(transform, PIPELINES) + + assert str(transform) == f'RGB2Gray(' \ + f'out_channels={2}, ' \ + f'weights={(0.299, 0.587, 0.114)})' + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + h, w, c = img.shape + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['img'] = img + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + assert results['img'].shape == (h, w, 2) + assert results['img_shape'] == (h, w, 2) + assert results['ori_shape'] == (h, w, c) + + +def test_adjust_gamma(): + # test assertion if gamma <= 0 + with pytest.raises(AssertionError): + transform = dict(type='AdjustGamma', gamma=0) + build_from_cfg(transform, PIPELINES) + + # test assertion if gamma is list + with pytest.raises(AssertionError): + transform = dict(type='AdjustGamma', gamma=[1.2]) + build_from_cfg(transform, PIPELINES) + + # test with gamma = 1.2 + transform = dict(type='AdjustGamma', gamma=1.2) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + + inv_gamma = 1.0 / 1.2 + table = np.array([((i / 255.0)**inv_gamma) * 255 + for i in np.arange(0, 256)]).astype('uint8') + converted_img = mmcv.lut_transform( + np.array(original_img, dtype=np.uint8), table) + assert np.allclose(results['img'], converted_img) + assert str(transform) == f'AdjustGamma(gamma={1.2})' + + +def test_rerange(): + # test assertion if min_value or max_value is illegal + with pytest.raises(AssertionError): + transform = dict(type='Rerange', min_value=[0], max_value=[255]) + build_from_cfg(transform, PIPELINES) + + # test assertion if min_value >= max_value + with pytest.raises(AssertionError): + transform = dict(type='Rerange', min_value=1, max_value=1) + build_from_cfg(transform, PIPELINES) + + # test assertion if img_min_value == img_max_value + with pytest.raises(AssertionError): + transform = dict(type='Rerange', min_value=0, max_value=1) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + results['img'] = np.array([[1, 1], [1, 1]]) + transform(results) + + img_rerange_cfg = dict() + transform = dict(type='Rerange', **img_rerange_cfg) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + + min_value = np.min(original_img) + max_value = np.max(original_img) + converted_img = (original_img - min_value) / (max_value - min_value) * 255 + + assert np.allclose(results['img'], converted_img) + assert str(transform) == f'Rerange(min_value={0}, max_value={255})' + + +def test_CLAHE(): + # test assertion if clip_limit is None + with pytest.raises(AssertionError): + transform = dict(type='CLAHE', clip_limit=None) + build_from_cfg(transform, PIPELINES) + + # test assertion if tile_grid_size is illegal + with pytest.raises(AssertionError): + transform = dict(type='CLAHE', tile_grid_size=(8.0, 8.0)) + build_from_cfg(transform, PIPELINES) + + # test assertion if tile_grid_size is illegal + with pytest.raises(AssertionError): + transform = dict(type='CLAHE', tile_grid_size=(9, 9, 9)) + build_from_cfg(transform, PIPELINES) + + transform = dict(type='CLAHE', clip_limit=2) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + results = transform(results) + + converted_img = np.empty(original_img.shape) + for i in range(original_img.shape[2]): + converted_img[:, :, i] = mmcv.clahe( + np.array(original_img[:, :, i], dtype=np.uint8), 2, (8, 8)) + + assert np.allclose(results['img'], converted_img) + assert str(transform) == f'CLAHE(clip_limit={2}, tile_grid_size={(8, 8)})' + + +def test_seg_rescale(): + results = dict() + seg = np.array( + Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) + results['gt_semantic_seg'] = seg + results['seg_fields'] = ['gt_semantic_seg'] + h, w = seg.shape + + transform = dict(type='SegRescale', scale_factor=1. / 2) + rescale_module = build_from_cfg(transform, PIPELINES) + rescale_results = rescale_module(results.copy()) + assert rescale_results['gt_semantic_seg'].shape == (h // 2, w // 2) + + transform = dict(type='SegRescale', scale_factor=1) + rescale_module = build_from_cfg(transform, PIPELINES) + rescale_results = rescale_module(results.copy()) + assert rescale_results['gt_semantic_seg'].shape == (h, w) diff --git a/tests/test_data/test_tta.py b/tests/test_data/test_tta.py new file mode 100644 index 0000000000000000000000000000000000000000..cc8c71e57c02d45a3f0587cd9e57caa7b467c5ab --- /dev/null +++ b/tests/test_data/test_tta.py @@ -0,0 +1,150 @@ +import os.path as osp + +import mmcv +import pytest +from mmcv.utils import build_from_cfg + +from mmseg.datasets.builder import PIPELINES + + +def test_multi_scale_flip_aug(): + # test assertion if img_scale=None, img_ratios=1 (not float). + with pytest.raises(AssertionError): + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=None, + img_ratios=1, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + build_from_cfg(tta_transform, PIPELINES) + + # test assertion if img_scale=None, img_ratios=None. + with pytest.raises(AssertionError): + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=None, + img_ratios=None, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + build_from_cfg(tta_transform, PIPELINES) + + # test assertion if img_scale=(512, 512), img_ratios=1 (not float). + with pytest.raises(AssertionError): + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=1, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + build_from_cfg(tta_transform, PIPELINES) + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=[0.5, 1.0, 2.0], + flip=False, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + + results = dict() + # (288, 512, 3) + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 256), (512, 512), (1024, 1024)] + assert tta_results['flip'] == [False, False, False] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=[0.5, 1.0, 2.0], + flip=True, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 256), (256, 256), (512, 512), + (512, 512), (1024, 1024), (1024, 1024)] + assert tta_results['flip'] == [False, True, False, True, False, True] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=1.0, + flip=False, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(512, 512)] + assert tta_results['flip'] == [False] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + img_ratios=1.0, + flip=True, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(512, 512), (512, 512)] + assert tta_results['flip'] == [False, True] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=None, + img_ratios=[0.5, 1.0, 2.0], + flip=False, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 144), (512, 288), (1024, 576)] + assert tta_results['flip'] == [False, False, False] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=None, + img_ratios=[0.5, 1.0, 2.0], + flip=True, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 144), (256, 144), (512, 288), + (512, 288), (1024, 576), (1024, 576)] + assert tta_results['flip'] == [False, True, False, True, False, True] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=[(256, 256), (512, 512), (1024, 1024)], + img_ratios=None, + flip=False, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 256), (512, 512), (1024, 1024)] + assert tta_results['flip'] == [False, False, False] + + tta_transform = dict( + type='MultiScaleFlipAug', + img_scale=[(256, 256), (512, 512), (1024, 1024)], + img_ratios=None, + flip=True, + transforms=[dict(type='Resize', keep_ratio=False)], + ) + tta_module = build_from_cfg(tta_transform, PIPELINES) + tta_results = tta_module(results.copy()) + assert tta_results['scale'] == [(256, 256), (256, 256), (512, 512), + (512, 512), (1024, 1024), (1024, 1024)] + assert tta_results['flip'] == [False, True, False, True, False, True] diff --git a/tests/test_eval_hook.py b/tests/test_eval_hook.py new file mode 100644 index 0000000000000000000000000000000000000000..a6a1352ea5419c1876551165edaf833f251e7151 --- /dev/null +++ b/tests/test_eval_hook.py @@ -0,0 +1,193 @@ +import logging +import tempfile +from unittest.mock import MagicMock, patch + +import mmcv.runner +import pytest +import torch +import torch.nn as nn +from mmcv.runner import obj_from_dict +from torch.utils.data import DataLoader, Dataset + +from mmseg.apis import single_gpu_test +from mmseg.core import DistEvalHook, EvalHook + + +class ExampleDataset(Dataset): + + def __getitem__(self, idx): + results = dict(img=torch.tensor([1]), img_metas=dict()) + return results + + def __len__(self): + return 1 + + +class ExampleModel(nn.Module): + + def __init__(self): + super(ExampleModel, self).__init__() + self.test_cfg = None + self.conv = nn.Conv2d(3, 3, 3) + + def forward(self, img, img_metas, test_mode=False, **kwargs): + return img + + def train_step(self, data_batch, optimizer): + loss = self.forward(**data_batch) + return dict(loss=loss) + + +def test_iter_eval_hook(): + with pytest.raises(TypeError): + test_dataset = ExampleModel() + data_loader = [ + DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_worker=0, + shuffle=False) + ] + EvalHook(data_loader) + + test_dataset = ExampleDataset() + test_dataset.evaluate = MagicMock(return_value=dict(test='success')) + loader = DataLoader(test_dataset, batch_size=1) + model = ExampleModel() + data_loader = DataLoader( + test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) + optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) + optimizer = obj_from_dict(optim_cfg, torch.optim, + dict(params=model.parameters())) + + # test EvalHook + with tempfile.TemporaryDirectory() as tmpdir: + eval_hook = EvalHook(data_loader) + runner = mmcv.runner.IterBasedRunner( + model=model, + optimizer=optimizer, + work_dir=tmpdir, + logger=logging.getLogger()) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 1) + test_dataset.evaluate.assert_called_with([torch.tensor([1])], + logger=runner.logger) + + +def test_epoch_eval_hook(): + with pytest.raises(TypeError): + test_dataset = ExampleModel() + data_loader = [ + DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_worker=0, + shuffle=False) + ] + EvalHook(data_loader, by_epoch=True) + + test_dataset = ExampleDataset() + test_dataset.evaluate = MagicMock(return_value=dict(test='success')) + loader = DataLoader(test_dataset, batch_size=1) + model = ExampleModel() + data_loader = DataLoader( + test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) + optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) + optimizer = obj_from_dict(optim_cfg, torch.optim, + dict(params=model.parameters())) + + # test EvalHook with interval + with tempfile.TemporaryDirectory() as tmpdir: + eval_hook = EvalHook(data_loader, by_epoch=True, interval=2) + runner = mmcv.runner.EpochBasedRunner( + model=model, + optimizer=optimizer, + work_dir=tmpdir, + logger=logging.getLogger()) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 2) + test_dataset.evaluate.assert_called_once_with([torch.tensor([1])], + logger=runner.logger) + + +def multi_gpu_test(model, data_loader, tmpdir=None, gpu_collect=False): + results = single_gpu_test(model, data_loader) + return results + + +@patch('mmseg.apis.multi_gpu_test', multi_gpu_test) +def test_dist_eval_hook(): + with pytest.raises(TypeError): + test_dataset = ExampleModel() + data_loader = [ + DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_worker=0, + shuffle=False) + ] + DistEvalHook(data_loader) + + test_dataset = ExampleDataset() + test_dataset.evaluate = MagicMock(return_value=dict(test='success')) + loader = DataLoader(test_dataset, batch_size=1) + model = ExampleModel() + data_loader = DataLoader( + test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) + optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) + optimizer = obj_from_dict(optim_cfg, torch.optim, + dict(params=model.parameters())) + + # test DistEvalHook + with tempfile.TemporaryDirectory() as tmpdir: + eval_hook = DistEvalHook(data_loader) + runner = mmcv.runner.IterBasedRunner( + model=model, + optimizer=optimizer, + work_dir=tmpdir, + logger=logging.getLogger()) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 1) + test_dataset.evaluate.assert_called_with([torch.tensor([1])], + logger=runner.logger) + + +@patch('mmseg.apis.multi_gpu_test', multi_gpu_test) +def test_dist_eval_hook_epoch(): + with pytest.raises(TypeError): + test_dataset = ExampleModel() + data_loader = [ + DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_worker=0, + shuffle=False) + ] + DistEvalHook(data_loader) + + test_dataset = ExampleDataset() + test_dataset.evaluate = MagicMock(return_value=dict(test='success')) + loader = DataLoader(test_dataset, batch_size=1) + model = ExampleModel() + data_loader = DataLoader( + test_dataset, batch_size=1, sampler=None, num_workers=0, shuffle=False) + optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) + optimizer = obj_from_dict(optim_cfg, torch.optim, + dict(params=model.parameters())) + + # test DistEvalHook + with tempfile.TemporaryDirectory() as tmpdir: + eval_hook = DistEvalHook(data_loader, by_epoch=True, interval=2) + runner = mmcv.runner.EpochBasedRunner( + model=model, + optimizer=optimizer, + work_dir=tmpdir, + logger=logging.getLogger()) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 2) + test_dataset.evaluate.assert_called_with([torch.tensor([1])], + logger=runner.logger) diff --git a/tests/test_inference.py b/tests/test_inference.py new file mode 100644 index 0000000000000000000000000000000000000000..046e036281db50ccc66e75d8e78c6eb63618cac7 --- /dev/null +++ b/tests/test_inference.py @@ -0,0 +1,29 @@ +import os.path as osp + +import mmcv + +from mmseg.apis import inference_segmentor, init_segmentor + + +def test_test_time_augmentation_on_cpu(): + config_file = 'configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py' + config = mmcv.Config.fromfile(config_file) + + # Remove pretrain model download for testing + config.model.pretrained = None + # Replace SyncBN with BN to inference on CPU + norm_cfg = dict(type='BN', requires_grad=True) + config.model.backbone.norm_cfg = norm_cfg + config.model.decode_head.norm_cfg = norm_cfg + config.model.auxiliary_head.norm_cfg = norm_cfg + + # Enable test time augmentation + config.data.test.pipeline[1].flip = True + + checkpoint_file = None + model = init_segmentor(config, checkpoint_file, device='cpu') + + img = mmcv.imread( + osp.join(osp.dirname(__file__), 'data/color.jpg'), 'color') + result = inference_segmentor(model, img) + assert result[0].shape == (288, 512) diff --git a/tests/test_metrics.py b/tests/test_metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..023bbb0a5563f36ae1902fab4edb8e5240f4ae02 --- /dev/null +++ b/tests/test_metrics.py @@ -0,0 +1,166 @@ +import numpy as np + +from mmseg.core.evaluation import eval_metrics, mean_dice, mean_iou + + +def get_confusion_matrix(pred_label, label, num_classes, ignore_index): + """Intersection over Union + Args: + pred_label (np.ndarray): 2D predict map + label (np.ndarray): label 2D label map + num_classes (int): number of categories + ignore_index (int): index ignore in evaluation + """ + + mask = (label != ignore_index) + pred_label = pred_label[mask] + label = label[mask] + + n = num_classes + inds = n * label + pred_label + + mat = np.bincount(inds, minlength=n**2).reshape(n, n) + + return mat + + +# This func is deprecated since it's not memory efficient +def legacy_mean_iou(results, gt_seg_maps, num_classes, ignore_index): + num_imgs = len(results) + assert len(gt_seg_maps) == num_imgs + total_mat = np.zeros((num_classes, num_classes), dtype=np.float) + for i in range(num_imgs): + mat = get_confusion_matrix( + results[i], gt_seg_maps[i], num_classes, ignore_index=ignore_index) + total_mat += mat + all_acc = np.diag(total_mat).sum() / total_mat.sum() + acc = np.diag(total_mat) / total_mat.sum(axis=1) + iou = np.diag(total_mat) / ( + total_mat.sum(axis=1) + total_mat.sum(axis=0) - np.diag(total_mat)) + + return all_acc, acc, iou + + +# This func is deprecated since it's not memory efficient +def legacy_mean_dice(results, gt_seg_maps, num_classes, ignore_index): + num_imgs = len(results) + assert len(gt_seg_maps) == num_imgs + total_mat = np.zeros((num_classes, num_classes), dtype=np.float) + for i in range(num_imgs): + mat = get_confusion_matrix( + results[i], gt_seg_maps[i], num_classes, ignore_index=ignore_index) + total_mat += mat + all_acc = np.diag(total_mat).sum() / total_mat.sum() + acc = np.diag(total_mat) / total_mat.sum(axis=1) + dice = 2 * np.diag(total_mat) / ( + total_mat.sum(axis=1) + total_mat.sum(axis=0)) + + return all_acc, acc, dice + + +def test_metrics(): + pred_size = (10, 30, 30) + num_classes = 19 + ignore_index = 255 + results = np.random.randint(0, num_classes, size=pred_size) + label = np.random.randint(0, num_classes, size=pred_size) + label[:, 2, 5:10] = ignore_index + all_acc, acc, iou = eval_metrics( + results, label, num_classes, ignore_index, metrics='mIoU') + all_acc_l, acc_l, iou_l = legacy_mean_iou(results, label, num_classes, + ignore_index) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(iou, iou_l) + + all_acc, acc, dice = eval_metrics( + results, label, num_classes, ignore_index, metrics='mDice') + all_acc_l, acc_l, dice_l = legacy_mean_dice(results, label, num_classes, + ignore_index) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(dice, dice_l) + + all_acc, acc, iou, dice = eval_metrics( + results, label, num_classes, ignore_index, metrics=['mIoU', 'mDice']) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(iou, iou_l) + assert np.allclose(dice, dice_l) + + results = np.random.randint(0, 5, size=pred_size) + label = np.random.randint(0, 4, size=pred_size) + all_acc, acc, iou = eval_metrics( + results, + label, + num_classes, + ignore_index=255, + metrics='mIoU', + nan_to_num=-1) + assert acc[-1] == -1 + assert iou[-1] == -1 + + all_acc, acc, dice = eval_metrics( + results, + label, + num_classes, + ignore_index=255, + metrics='mDice', + nan_to_num=-1) + assert acc[-1] == -1 + assert dice[-1] == -1 + + all_acc, acc, dice, iou = eval_metrics( + results, + label, + num_classes, + ignore_index=255, + metrics=['mDice', 'mIoU'], + nan_to_num=-1) + assert acc[-1] == -1 + assert dice[-1] == -1 + assert iou[-1] == -1 + + +def test_mean_iou(): + pred_size = (10, 30, 30) + num_classes = 19 + ignore_index = 255 + results = np.random.randint(0, num_classes, size=pred_size) + label = np.random.randint(0, num_classes, size=pred_size) + label[:, 2, 5:10] = ignore_index + all_acc, acc, iou = mean_iou(results, label, num_classes, ignore_index) + all_acc_l, acc_l, iou_l = legacy_mean_iou(results, label, num_classes, + ignore_index) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(iou, iou_l) + + results = np.random.randint(0, 5, size=pred_size) + label = np.random.randint(0, 4, size=pred_size) + all_acc, acc, iou = mean_iou( + results, label, num_classes, ignore_index=255, nan_to_num=-1) + assert acc[-1] == -1 + assert iou[-1] == -1 + + +def test_mean_dice(): + pred_size = (10, 30, 30) + num_classes = 19 + ignore_index = 255 + results = np.random.randint(0, num_classes, size=pred_size) + label = np.random.randint(0, num_classes, size=pred_size) + label[:, 2, 5:10] = ignore_index + all_acc, acc, iou = mean_dice(results, label, num_classes, ignore_index) + all_acc_l, acc_l, iou_l = legacy_mean_dice(results, label, num_classes, + ignore_index) + assert all_acc == all_acc_l + assert np.allclose(acc, acc_l) + assert np.allclose(iou, iou_l) + + results = np.random.randint(0, 5, size=pred_size) + label = np.random.randint(0, 4, size=pred_size) + all_acc, acc, iou = mean_dice( + results, label, num_classes, ignore_index=255, nan_to_num=-1) + assert acc[-1] == -1 + assert iou[-1] == -1 diff --git a/tests/test_model.py b/tests/test_model.py new file mode 100644 index 0000000000000000000000000000000000000000..79370ca18265ba6f9779a65797b71b011a4c6074 --- /dev/null +++ b/tests/test_model.py @@ -0,0 +1,9 @@ +import torch + +pthfile = r'/SEG/mmsegmentation/pretrained_model/recipe1MP_R50.pth' + + +net=torch.load(pthfile) + +for k in net.keys(): + print(k) \ No newline at end of file diff --git a/tests/test_models/test_backbone.py b/tests/test_models/test_backbone.py new file mode 100644 index 0000000000000000000000000000000000000000..9ed6ce222f0c4135c2227c55f60efa1f05e62cec --- /dev/null +++ b/tests/test_models/test_backbone.py @@ -0,0 +1,939 @@ +import pytest +import torch +from mmcv.ops import DeformConv2dPack +from mmcv.utils.parrots_wrapper import _BatchNorm +from torch.nn.modules import AvgPool2d, GroupNorm + +from mmseg.models.backbones import (CGNet, FastSCNN, MobileNetV3, ResNeSt, + ResNet, ResNetV1d, ResNeXt) +from mmseg.models.backbones.cgnet import (ContextGuidedBlock, + GlobalContextExtractor) +from mmseg.models.backbones.resnest import Bottleneck as BottleneckS +from mmseg.models.backbones.resnet import BasicBlock, Bottleneck +from mmseg.models.backbones.resnext import Bottleneck as BottleneckX +from mmseg.models.utils import ResLayer + + +def is_block(modules): + """Check if is ResNet building block.""" + if isinstance(modules, (BasicBlock, Bottleneck, BottleneckX)): + return True + return False + + +def is_norm(modules): + """Check if is one of the norms.""" + if isinstance(modules, (GroupNorm, _BatchNorm)): + return True + return False + + +def all_zeros(modules): + """Check if the weight(and bias) is all zero.""" + weight_zero = torch.allclose(modules.weight.data, + torch.zeros_like(modules.weight.data)) + if hasattr(modules, 'bias'): + bias_zero = torch.allclose(modules.bias.data, + torch.zeros_like(modules.bias.data)) + else: + bias_zero = True + + return weight_zero and bias_zero + + +def check_norm_state(modules, train_state): + """Check if norm layer is in correct train state.""" + for mod in modules: + if isinstance(mod, _BatchNorm): + if mod.training != train_state: + return False + return True + + +def test_resnet_basic_block(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + BasicBlock(64, 64, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + BasicBlock(64, 64, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + BasicBlock(64, 64, plugins=plugins) + + # Test BasicBlock with checkpoint forward + block = BasicBlock(16, 16, with_cp=True) + assert block.with_cp + x = torch.randn(1, 16, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 16, 56, 56]) + + # test BasicBlock structure and forward + block = BasicBlock(64, 64) + assert block.conv1.in_channels == 64 + assert block.conv1.out_channels == 64 + assert block.conv1.kernel_size == (3, 3) + assert block.conv2.in_channels == 64 + assert block.conv2.out_channels == 64 + assert block.conv2.kernel_size == (3, 3) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnet_bottleneck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + Bottleneck(64, 64, style='tensorflow') + + with pytest.raises(AssertionError): + # Allowed positions are 'after_conv1', 'after_conv2', 'after_conv3' + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv4') + ] + Bottleneck(64, 16, plugins=plugins) + + with pytest.raises(AssertionError): + # Need to specify different postfix to avoid duplicate plugin name + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + Bottleneck(64, 16, plugins=plugins) + + with pytest.raises(KeyError): + # Plugin type is not supported + plugins = [dict(cfg=dict(type='WrongPlugin'), position='after_conv3')] + Bottleneck(64, 16, plugins=plugins) + + # Test Bottleneck with checkpoint forward + block = Bottleneck(64, 16, with_cp=True) + assert block.with_cp + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck style + block = Bottleneck(64, 64, stride=2, style='pytorch') + assert block.conv1.stride == (1, 1) + assert block.conv2.stride == (2, 2) + block = Bottleneck(64, 64, stride=2, style='caffe') + assert block.conv1.stride == (2, 2) + assert block.conv2.stride == (1, 1) + + # Test Bottleneck DCN + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + with pytest.raises(AssertionError): + Bottleneck(64, 64, dcn=dcn, conv_cfg=dict(type='Conv')) + block = Bottleneck(64, 64, dcn=dcn) + assert isinstance(block.conv2, DeformConv2dPack) + + # Test Bottleneck forward + block = Bottleneck(64, 16) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 ContextBlock after conv3 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.context_block.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 GeneralizedAttention after conv2 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.gen_attention_block.in_channels == 16 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 GeneralizedAttention after conv2, 1 NonLocal2d + # after conv2, 1 ContextBlock after conv3 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2'), + dict(cfg=dict(type='NonLocal2d'), position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.gen_attention_block.in_channels == 16 + assert block.nonlocal_block.in_channels == 16 + assert block.context_block.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 ContextBlock after conv2, 2 ContextBlock after + # conv3 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=1), + position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=2), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=3), + position='after_conv3') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.context_block1.in_channels == 16 + assert block.context_block2.in_channels == 64 + assert block.context_block3.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnet_res_layer(): + # Test ResLayer of 3 Bottleneck w\o downsample + layer = ResLayer(Bottleneck, 64, 16, 3) + assert len(layer) == 3 + assert layer[0].conv1.in_channels == 64 + assert layer[0].conv1.out_channels == 16 + for i in range(1, len(layer)): + assert layer[i].conv1.in_channels == 64 + assert layer[i].conv1.out_channels == 16 + for i in range(len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test ResLayer of 3 Bottleneck with downsample + layer = ResLayer(Bottleneck, 64, 64, 3) + assert layer[0].downsample[0].out_channels == 256 + for i in range(1, len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 256, 56, 56]) + + # Test ResLayer of 3 Bottleneck with stride=2 + layer = ResLayer(Bottleneck, 64, 64, 3, stride=2) + assert layer[0].downsample[0].out_channels == 256 + assert layer[0].downsample[0].stride == (2, 2) + for i in range(1, len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 256, 28, 28]) + + # Test ResLayer of 3 Bottleneck with stride=2 and average downsample + layer = ResLayer(Bottleneck, 64, 64, 3, stride=2, avg_down=True) + assert isinstance(layer[0].downsample[0], AvgPool2d) + assert layer[0].downsample[1].out_channels == 256 + assert layer[0].downsample[1].stride == (1, 1) + for i in range(1, len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 256, 28, 28]) + + # Test ResLayer of 3 Bottleneck with dilation=2 + layer = ResLayer(Bottleneck, 64, 16, 3, dilation=2) + for i in range(len(layer)): + assert layer[i].conv2.dilation == (2, 2) + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test ResLayer of 3 Bottleneck with dilation=2, contract_dilation=True + layer = ResLayer(Bottleneck, 64, 16, 3, dilation=2, contract_dilation=True) + assert layer[0].conv2.dilation == (1, 1) + for i in range(1, len(layer)): + assert layer[i].conv2.dilation == (2, 2) + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test ResLayer of 3 Bottleneck with dilation=2, multi_grid + layer = ResLayer(Bottleneck, 64, 16, 3, dilation=2, multi_grid=(1, 2, 4)) + assert layer[0].conv2.dilation == (1, 1) + assert layer[1].conv2.dilation == (2, 2) + assert layer[2].conv2.dilation == (4, 4) + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnet_backbone(): + """Test resnet backbone.""" + with pytest.raises(KeyError): + # ResNet depth should be in [18, 34, 50, 101, 152] + ResNet(20) + + with pytest.raises(AssertionError): + # In ResNet: 1 <= num_stages <= 4 + ResNet(50, num_stages=0) + + with pytest.raises(AssertionError): + # len(stage_with_dcn) == num_stages + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + ResNet(50, dcn=dcn, stage_with_dcn=(True, )) + + with pytest.raises(AssertionError): + # len(stage_with_plugin) == num_stages + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True), + position='after_conv3') + ] + ResNet(50, plugins=plugins) + + with pytest.raises(AssertionError): + # In ResNet: 1 <= num_stages <= 4 + ResNet(50, num_stages=5) + + with pytest.raises(AssertionError): + # len(strides) == len(dilations) == num_stages + ResNet(50, strides=(1, ), dilations=(1, 1), num_stages=3) + + with pytest.raises(TypeError): + # pretrained must be a string path + model = ResNet(50) + model.init_weights(pretrained=0) + + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + ResNet(50, style='tensorflow') + + # Test ResNet50 norm_eval=True + model = ResNet(50, norm_eval=True) + model.init_weights() + model.train() + assert check_norm_state(model.modules(), False) + + # Test ResNet50 with torchvision pretrained weight + model = ResNet(depth=50, norm_eval=True) + model.init_weights('torchvision://resnet50') + model.train() + assert check_norm_state(model.modules(), False) + + # Test ResNet50 with first stage frozen + frozen_stages = 1 + model = ResNet(50, frozen_stages=frozen_stages) + model.init_weights() + model.train() + assert model.norm1.training is False + for layer in [model.conv1, model.norm1]: + for param in layer.parameters(): + assert param.requires_grad is False + for i in range(1, frozen_stages + 1): + layer = getattr(model, 'layer{}'.format(i)) + for mod in layer.modules(): + if isinstance(mod, _BatchNorm): + assert mod.training is False + for param in layer.parameters(): + assert param.requires_grad is False + + # Test ResNet50V1d with first stage frozen + model = ResNetV1d(depth=50, frozen_stages=frozen_stages) + assert len(model.stem) == 9 + model.init_weights() + model.train() + check_norm_state(model.stem, False) + for param in model.stem.parameters(): + assert param.requires_grad is False + for i in range(1, frozen_stages + 1): + layer = getattr(model, 'layer{}'.format(i)) + for mod in layer.modules(): + if isinstance(mod, _BatchNorm): + assert mod.training is False + for param in layer.parameters(): + assert param.requires_grad is False + + # Test ResNet18 forward + model = ResNet(18) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 64, 56, 56]) + assert feat[1].shape == torch.Size([1, 128, 28, 28]) + assert feat[2].shape == torch.Size([1, 256, 14, 14]) + assert feat[3].shape == torch.Size([1, 512, 7, 7]) + + # Test ResNet50 with BatchNorm forward + model = ResNet(50) + for m in model.modules(): + if is_norm(m): + assert isinstance(m, _BatchNorm) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 with layers 1, 2, 3 out forward + model = ResNet(50, out_indices=(0, 1, 2)) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + + # Test ResNet18 with checkpoint forward + model = ResNet(18, with_cp=True) + for m in model.modules(): + if is_block(m): + assert m.with_cp + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 64, 56, 56]) + assert feat[1].shape == torch.Size([1, 128, 28, 28]) + assert feat[2].shape == torch.Size([1, 256, 14, 14]) + assert feat[3].shape == torch.Size([1, 512, 7, 7]) + + # Test ResNet50 with checkpoint forward + model = ResNet(50, with_cp=True) + for m in model.modules(): + if is_block(m): + assert m.with_cp + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 with GroupNorm forward + model = ResNet( + 50, norm_cfg=dict(type='GN', num_groups=32, requires_grad=True)) + for m in model.modules(): + if is_norm(m): + assert isinstance(m, GroupNorm) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 with 1 GeneralizedAttention after conv2, 1 NonLocal2d + # after conv2, 1 ContextBlock after conv3 in layers 2, 3, 4 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + stages=(False, True, True, True), + position='after_conv2'), + dict(cfg=dict(type='NonLocal2d'), position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, False), + position='after_conv3') + ] + model = ResNet(50, plugins=plugins) + for m in model.layer1.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert not hasattr(m, 'gen_attention_block') + assert m.nonlocal_block.in_channels == 64 + for m in model.layer2.modules(): + if is_block(m): + assert m.nonlocal_block.in_channels == 128 + assert m.gen_attention_block.in_channels == 128 + assert m.context_block.in_channels == 512 + + for m in model.layer3.modules(): + if is_block(m): + assert m.nonlocal_block.in_channels == 256 + assert m.gen_attention_block.in_channels == 256 + assert m.context_block.in_channels == 1024 + + for m in model.layer4.modules(): + if is_block(m): + assert m.nonlocal_block.in_channels == 512 + assert m.gen_attention_block.in_channels == 512 + assert not hasattr(m, 'context_block') + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 with 1 ContextBlock after conv2, 1 ContextBlock after + # conv3 in layers 2, 3, 4 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=1), + stages=(False, True, True, False), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=2), + stages=(False, True, True, False), + position='after_conv3') + ] + + model = ResNet(50, plugins=plugins) + for m in model.layer1.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert not hasattr(m, 'context_block1') + assert not hasattr(m, 'context_block2') + for m in model.layer2.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert m.context_block1.in_channels == 512 + assert m.context_block2.in_channels == 512 + + for m in model.layer3.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert m.context_block1.in_channels == 1024 + assert m.context_block2.in_channels == 1024 + + for m in model.layer4.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert not hasattr(m, 'context_block1') + assert not hasattr(m, 'context_block2') + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNet50 zero initialization of residual + model = ResNet(50, zero_init_residual=True) + model.init_weights() + for m in model.modules(): + if isinstance(m, Bottleneck): + assert all_zeros(m.norm3) + elif isinstance(m, BasicBlock): + assert all_zeros(m.norm2) + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + # Test ResNetV1d forward + model = ResNetV1d(depth=50) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + +def test_renext_bottleneck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + BottleneckX(64, 64, groups=32, base_width=4, style='tensorflow') + + # Test ResNeXt Bottleneck structure + block = BottleneckX( + 64, 64, groups=32, base_width=4, stride=2, style='pytorch') + assert block.conv2.stride == (2, 2) + assert block.conv2.groups == 32 + assert block.conv2.out_channels == 128 + + # Test ResNeXt Bottleneck with DCN + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + with pytest.raises(AssertionError): + # conv_cfg must be None if dcn is not None + BottleneckX( + 64, + 64, + groups=32, + base_width=4, + dcn=dcn, + conv_cfg=dict(type='Conv')) + BottleneckX(64, 64, dcn=dcn) + + # Test ResNeXt Bottleneck forward + block = BottleneckX(64, 16, groups=32, base_width=4) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnext_backbone(): + with pytest.raises(KeyError): + # ResNeXt depth should be in [50, 101, 152] + ResNeXt(depth=18) + + # Test ResNeXt with group 32, base_width 4 + model = ResNeXt(depth=50, groups=32, base_width=4) + print(model) + for m in model.modules(): + if is_block(m): + assert m.conv2.groups == 32 + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 56, 56]) + assert feat[1].shape == torch.Size([1, 512, 28, 28]) + assert feat[2].shape == torch.Size([1, 1024, 14, 14]) + assert feat[3].shape == torch.Size([1, 2048, 7, 7]) + + +def test_fastscnn_backbone(): + with pytest.raises(AssertionError): + # Fast-SCNN channel constraints. + FastSCNN( + 3, (32, 48), + 64, (64, 96, 128), (2, 2, 1), + global_out_channels=127, + higher_in_channels=64, + lower_in_channels=128) + + # Test FastSCNN Standard Forward + model = FastSCNN() + model.init_weights() + model.train() + batch_size = 4 + imgs = torch.randn(batch_size, 3, 512, 1024) + feat = model(imgs) + + assert len(feat) == 3 + # higher-res + assert feat[0].shape == torch.Size([batch_size, 64, 64, 128]) + # lower-res + assert feat[1].shape == torch.Size([batch_size, 128, 16, 32]) + # FFM output + assert feat[2].shape == torch.Size([batch_size, 128, 64, 128]) + + +def test_resnest_bottleneck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + BottleneckS(64, 64, radix=2, reduction_factor=4, style='tensorflow') + + # Test ResNeSt Bottleneck structure + block = BottleneckS( + 64, 256, radix=2, reduction_factor=4, stride=2, style='pytorch') + assert block.avd_layer.stride == 2 + assert block.conv2.channels == 256 + + # Test ResNeSt Bottleneck forward + block = BottleneckS(64, 16, radix=2, reduction_factor=4) + x = torch.randn(2, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([2, 64, 56, 56]) + + +def test_resnest_backbone(): + with pytest.raises(KeyError): + # ResNeSt depth should be in [50, 101, 152, 200] + ResNeSt(depth=18) + + # Test ResNeSt with radix 2, reduction_factor 4 + model = ResNeSt( + depth=50, radix=2, reduction_factor=4, out_indices=(0, 1, 2, 3)) + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([2, 256, 56, 56]) + assert feat[1].shape == torch.Size([2, 512, 28, 28]) + assert feat[2].shape == torch.Size([2, 1024, 14, 14]) + assert feat[3].shape == torch.Size([2, 2048, 7, 7]) + + +def test_cgnet_GlobalContextExtractor(): + block = GlobalContextExtractor(16, 16, with_cp=True) + x = torch.randn(2, 16, 64, 64, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([2, 16, 64, 64]) + + +def test_cgnet_context_guided_block(): + with pytest.raises(AssertionError): + # cgnet ContextGuidedBlock GlobalContextExtractor channel and reduction + # constraints. + ContextGuidedBlock(8, 8) + + # test cgnet ContextGuidedBlock with checkpoint forward + block = ContextGuidedBlock( + 16, 16, act_cfg=dict(type='PReLU'), with_cp=True) + assert block.with_cp + x = torch.randn(2, 16, 64, 64, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([2, 16, 64, 64]) + + # test cgnet ContextGuidedBlock without checkpoint forward + block = ContextGuidedBlock(32, 32) + assert not block.with_cp + x = torch.randn(3, 32, 32, 32) + x_out = block(x) + assert x_out.shape == torch.Size([3, 32, 32, 32]) + + # test cgnet ContextGuidedBlock with down sampling + block = ContextGuidedBlock(32, 32, downsample=True) + assert block.conv1x1.conv.in_channels == 32 + assert block.conv1x1.conv.out_channels == 32 + assert block.conv1x1.conv.kernel_size == (3, 3) + assert block.conv1x1.conv.stride == (2, 2) + assert block.conv1x1.conv.padding == (1, 1) + + assert block.f_loc.in_channels == 32 + assert block.f_loc.out_channels == 32 + assert block.f_loc.kernel_size == (3, 3) + assert block.f_loc.stride == (1, 1) + assert block.f_loc.padding == (1, 1) + assert block.f_loc.groups == 32 + assert block.f_loc.dilation == (1, 1) + assert block.f_loc.bias is None + + assert block.f_sur.in_channels == 32 + assert block.f_sur.out_channels == 32 + assert block.f_sur.kernel_size == (3, 3) + assert block.f_sur.stride == (1, 1) + assert block.f_sur.padding == (2, 2) + assert block.f_sur.groups == 32 + assert block.f_sur.dilation == (2, 2) + assert block.f_sur.bias is None + + assert block.bottleneck.in_channels == 64 + assert block.bottleneck.out_channels == 32 + assert block.bottleneck.kernel_size == (1, 1) + assert block.bottleneck.stride == (1, 1) + assert block.bottleneck.bias is None + + x = torch.randn(1, 32, 32, 32) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 16, 16]) + + # test cgnet ContextGuidedBlock without down sampling + block = ContextGuidedBlock(32, 32, downsample=False) + assert block.conv1x1.conv.in_channels == 32 + assert block.conv1x1.conv.out_channels == 16 + assert block.conv1x1.conv.kernel_size == (1, 1) + assert block.conv1x1.conv.stride == (1, 1) + assert block.conv1x1.conv.padding == (0, 0) + + assert block.f_loc.in_channels == 16 + assert block.f_loc.out_channels == 16 + assert block.f_loc.kernel_size == (3, 3) + assert block.f_loc.stride == (1, 1) + assert block.f_loc.padding == (1, 1) + assert block.f_loc.groups == 16 + assert block.f_loc.dilation == (1, 1) + assert block.f_loc.bias is None + + assert block.f_sur.in_channels == 16 + assert block.f_sur.out_channels == 16 + assert block.f_sur.kernel_size == (3, 3) + assert block.f_sur.stride == (1, 1) + assert block.f_sur.padding == (2, 2) + assert block.f_sur.groups == 16 + assert block.f_sur.dilation == (2, 2) + assert block.f_sur.bias is None + + x = torch.randn(1, 32, 32, 32) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 32, 32]) + + +def test_cgnet_backbone(): + with pytest.raises(AssertionError): + # check invalid num_channels + CGNet(num_channels=(32, 64, 128, 256)) + + with pytest.raises(AssertionError): + # check invalid num_blocks + CGNet(num_blocks=(3, 21, 3)) + + with pytest.raises(AssertionError): + # check invalid dilation + CGNet(num_blocks=2) + + with pytest.raises(AssertionError): + # check invalid reduction + CGNet(reductions=16) + + with pytest.raises(AssertionError): + # check invalid num_channels and reduction + CGNet(num_channels=(32, 64, 128), reductions=(64, 129)) + + # Test CGNet with default settings + model = CGNet() + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == torch.Size([2, 35, 112, 112]) + assert feat[1].shape == torch.Size([2, 131, 56, 56]) + assert feat[2].shape == torch.Size([2, 256, 28, 28]) + + # Test CGNet with norm_eval True and with_cp True + model = CGNet(norm_eval=True, with_cp=True) + with pytest.raises(TypeError): + # check invalid pretrained + model.init_weights(pretrained=8) + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == torch.Size([2, 35, 112, 112]) + assert feat[1].shape == torch.Size([2, 131, 56, 56]) + assert feat[2].shape == torch.Size([2, 256, 28, 28]) + + +def test_mobilenet_v3(): + with pytest.raises(AssertionError): + # check invalid arch + MobileNetV3('big') + + with pytest.raises(AssertionError): + # check invalid reduction_factor + MobileNetV3(reduction_factor=0) + + with pytest.raises(ValueError): + # check invalid out_indices + MobileNetV3(out_indices=(0, 1, 15)) + + with pytest.raises(ValueError): + # check invalid frozen_stages + MobileNetV3(frozen_stages=15) + + with pytest.raises(TypeError): + # check invalid pretrained + model = MobileNetV3() + model.init_weights(pretrained=8) + + # Test MobileNetV3 with default settings + model = MobileNetV3() + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == (2, 16, 112, 112) + assert feat[1].shape == (2, 16, 56, 56) + assert feat[2].shape == (2, 576, 28, 28) + + # Test MobileNetV3 with arch = 'large' + model = MobileNetV3(arch='large', out_indices=(1, 3, 16)) + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == (2, 16, 112, 112) + assert feat[1].shape == (2, 24, 56, 56) + assert feat[2].shape == (2, 960, 28, 28) + + # Test MobileNetV3 with norm_eval True, with_cp True and frozen_stages=5 + model = MobileNetV3(norm_eval=True, with_cp=True, frozen_stages=5) + with pytest.raises(TypeError): + # check invalid pretrained + model.init_weights(pretrained=8) + model.init_weights() + model.train() + + imgs = torch.randn(2, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == (2, 16, 112, 112) + assert feat[1].shape == (2, 16, 56, 56) + assert feat[2].shape == (2, 576, 28, 28) diff --git a/tests/test_models/test_forward.py b/tests/test_models/test_forward.py new file mode 100644 index 0000000000000000000000000000000000000000..ee8036246bd7df90d15158266cb5bdbfa3a5730f --- /dev/null +++ b/tests/test_models/test_forward.py @@ -0,0 +1,250 @@ +"""pytest tests/test_forward.py.""" +import copy +from os.path import dirname, exists, join +from unittest.mock import patch + +import numpy as np +import pytest +import torch +import torch.nn as nn +from mmcv.utils.parrots_wrapper import SyncBatchNorm, _BatchNorm + + +def _demo_mm_inputs(input_shape=(2, 3, 8, 16), num_classes=10): + """Create a superset of inputs needed to run test or train batches. + + Args: + input_shape (tuple): + input batch dimensions + + num_classes (int): + number of semantic classes + """ + (N, C, H, W) = input_shape + + rng = np.random.RandomState(0) + + imgs = rng.rand(*input_shape) + segs = rng.randint( + low=0, high=num_classes - 1, size=(N, 1, H, W)).astype(np.uint8) + + img_metas = [{ + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': 1.0, + 'flip': False, + 'flip_direction': 'horizontal' + } for _ in range(N)] + + mm_inputs = { + 'imgs': torch.FloatTensor(imgs), + 'img_metas': img_metas, + 'gt_semantic_seg': torch.LongTensor(segs) + } + return mm_inputs + + +def _get_config_directory(): + """Find the predefined segmentor config directory.""" + try: + # Assume we are running in the source mmsegmentation repo + repo_dpath = dirname(dirname(dirname(__file__))) + except NameError: + # For IPython development when this __file__ is not defined + import mmseg + repo_dpath = dirname(dirname(dirname(mmseg.__file__))) + config_dpath = join(repo_dpath, 'configs') + if not exists(config_dpath): + raise Exception('Cannot find config path') + return config_dpath + + +def _get_config_module(fname): + """Load a configuration as a python module.""" + from mmcv import Config + config_dpath = _get_config_directory() + config_fpath = join(config_dpath, fname) + config_mod = Config.fromfile(config_fpath) + return config_mod + + +def _get_segmentor_cfg(fname): + """Grab configs necessary to create a segmentor. + + These are deep copied to allow for safe modification of parameters without + influencing other tests. + """ + config = _get_config_module(fname) + model = copy.deepcopy(config.model) + return model + + +def test_pspnet_forward(): + _test_encoder_decoder_forward( + 'pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_fcn_forward(): + _test_encoder_decoder_forward('fcn/fcn_r50-d8_512x1024_40k_cityscapes.py') + + +def test_deeplabv3_forward(): + _test_encoder_decoder_forward( + 'deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py') + + +def test_deeplabv3plus_forward(): + _test_encoder_decoder_forward( + 'deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py') + + +def test_gcnet_forward(): + _test_encoder_decoder_forward( + 'gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_ann_forward(): + _test_encoder_decoder_forward('ann/ann_r50-d8_512x1024_40k_cityscapes.py') + + +def test_ccnet_forward(): + if not torch.cuda.is_available(): + pytest.skip('CCNet requires CUDA') + _test_encoder_decoder_forward( + 'ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_danet_forward(): + _test_encoder_decoder_forward( + 'danet/danet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_nonlocal_net_forward(): + _test_encoder_decoder_forward( + 'nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py') + + +def test_upernet_forward(): + _test_encoder_decoder_forward( + 'upernet/upernet_r50_512x1024_40k_cityscapes.py') + + +def test_hrnet_forward(): + _test_encoder_decoder_forward('hrnet/fcn_hr18s_512x1024_40k_cityscapes.py') + + +def test_ocrnet_forward(): + _test_encoder_decoder_forward( + 'ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py') + + +def test_psanet_forward(): + _test_encoder_decoder_forward( + 'psanet/psanet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_encnet_forward(): + _test_encoder_decoder_forward( + 'encnet/encnet_r50-d8_512x1024_40k_cityscapes.py') + + +def test_sem_fpn_forward(): + _test_encoder_decoder_forward('sem_fpn/fpn_r50_512x1024_80k_cityscapes.py') + + +def test_point_rend_forward(): + _test_encoder_decoder_forward( + 'point_rend/pointrend_r50_512x1024_80k_cityscapes.py') + + +def test_mobilenet_v2_forward(): + _test_encoder_decoder_forward( + 'mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py') + + +def test_dnlnet_forward(): + _test_encoder_decoder_forward( + 'dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py') + + +def test_emanet_forward(): + _test_encoder_decoder_forward( + 'emanet/emanet_r50-d8_512x1024_80k_cityscapes.py') + + +def get_world_size(process_group): + + return 1 + + +def _check_input_dim(self, inputs): + pass + + +def _convert_batchnorm(module): + module_output = module + if isinstance(module, SyncBatchNorm): + # to be consistent with SyncBN, we hack dim check function in BN + module_output = _BatchNorm(module.num_features, module.eps, + module.momentum, module.affine, + module.track_running_stats) + if module.affine: + module_output.weight.data = module.weight.data.clone().detach() + module_output.bias.data = module.bias.data.clone().detach() + # keep requires_grad unchanged + module_output.weight.requires_grad = module.weight.requires_grad + module_output.bias.requires_grad = module.bias.requires_grad + module_output.running_mean = module.running_mean + module_output.running_var = module.running_var + module_output.num_batches_tracked = module.num_batches_tracked + for name, child in module.named_children(): + module_output.add_module(name, _convert_batchnorm(child)) + del module + return module_output + + +@patch('torch.nn.modules.batchnorm._BatchNorm._check_input_dim', + _check_input_dim) +@patch('torch.distributed.get_world_size', get_world_size) +def _test_encoder_decoder_forward(cfg_file): + model = _get_segmentor_cfg(cfg_file) + model['pretrained'] = None + model['test_cfg']['mode'] = 'whole' + + from mmseg.models import build_segmentor + segmentor = build_segmentor(model) + + if isinstance(segmentor.decode_head, nn.ModuleList): + num_classes = segmentor.decode_head[-1].num_classes + else: + num_classes = segmentor.decode_head.num_classes + # batch_size=2 for BatchNorm + input_shape = (2, 3, 32, 32) + mm_inputs = _demo_mm_inputs(input_shape, num_classes=num_classes) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + gt_semantic_seg = mm_inputs['gt_semantic_seg'] + + # convert to cuda Tensor if applicable + if torch.cuda.is_available(): + segmentor = segmentor.cuda() + imgs = imgs.cuda() + gt_semantic_seg = gt_semantic_seg.cuda() + else: + segmentor = _convert_batchnorm(segmentor) + + # Test forward train + losses = segmentor.forward( + imgs, img_metas, gt_semantic_seg=gt_semantic_seg, return_loss=True) + assert isinstance(losses, dict) + + # Test forward test + with torch.no_grad(): + segmentor.eval() + # pack into lists + img_list = [img[None, :] for img in imgs] + img_meta_list = [[img_meta] for img_meta in img_metas] + segmentor.forward(img_list, img_meta_list, return_loss=False) diff --git a/tests/test_models/test_heads.py b/tests/test_models/test_heads.py new file mode 100644 index 0000000000000000000000000000000000000000..e8a8493c160f11c2f51ab6dbca365b5312a6e46d --- /dev/null +++ b/tests/test_models/test_heads.py @@ -0,0 +1,834 @@ +from unittest.mock import patch + +import pytest +import torch +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule +from mmcv.utils import ConfigDict +from mmcv.utils.parrots_wrapper import SyncBatchNorm + +from mmseg.models.decode_heads import (ANNHead, APCHead, ASPPHead, CCHead, + DAHead, DepthwiseSeparableASPPHead, + DepthwiseSeparableFCNHead, DMHead, + DNLHead, EMAHead, EncHead, FCNHead, + GCHead, LRASPPHead, NLHead, OCRHead, + PointHead, PSAHead, PSPHead, UPerHead) +from mmseg.models.decode_heads.decode_head import BaseDecodeHead + + +def _conv_has_norm(module, sync_bn): + for m in module.modules(): + if isinstance(m, ConvModule): + if not m.with_norm: + return False + if sync_bn: + if not isinstance(m.bn, SyncBatchNorm): + return False + return True + + +def to_cuda(module, data): + module = module.cuda() + if isinstance(data, list): + for i in range(len(data)): + data[i] = data[i].cuda() + return module, data + + +@patch.multiple(BaseDecodeHead, __abstractmethods__=set()) +def test_decode_head(): + + with pytest.raises(AssertionError): + # default input_transform doesn't accept multiple inputs + BaseDecodeHead([32, 16], 16, num_classes=19) + + with pytest.raises(AssertionError): + # default input_transform doesn't accept multiple inputs + BaseDecodeHead(32, 16, num_classes=19, in_index=[-1, -2]) + + with pytest.raises(AssertionError): + # supported mode is resize_concat only + BaseDecodeHead(32, 16, num_classes=19, input_transform='concat') + + with pytest.raises(AssertionError): + # in_channels should be list|tuple + BaseDecodeHead(32, 16, num_classes=19, input_transform='resize_concat') + + with pytest.raises(AssertionError): + # in_index should be list|tuple + BaseDecodeHead([32], + 16, + in_index=-1, + num_classes=19, + input_transform='resize_concat') + + with pytest.raises(AssertionError): + # len(in_index) should equal len(in_channels) + BaseDecodeHead([32, 16], + 16, + num_classes=19, + in_index=[-1], + input_transform='resize_concat') + + # test default dropout + head = BaseDecodeHead(32, 16, num_classes=19) + assert hasattr(head, 'dropout') and head.dropout.p == 0.1 + + # test set dropout + head = BaseDecodeHead(32, 16, num_classes=19, dropout_ratio=0.2) + assert hasattr(head, 'dropout') and head.dropout.p == 0.2 + + # test no input_transform + inputs = [torch.randn(1, 32, 45, 45)] + head = BaseDecodeHead(32, 16, num_classes=19) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.in_channels == 32 + assert head.input_transform is None + transformed_inputs = head._transform_inputs(inputs) + assert transformed_inputs.shape == (1, 32, 45, 45) + + # test input_transform = resize_concat + inputs = [torch.randn(1, 32, 45, 45), torch.randn(1, 16, 21, 21)] + head = BaseDecodeHead([32, 16], + 16, + num_classes=19, + in_index=[0, 1], + input_transform='resize_concat') + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.in_channels == 48 + assert head.input_transform == 'resize_concat' + transformed_inputs = head._transform_inputs(inputs) + assert transformed_inputs.shape == (1, 48, 45, 45) + + +def test_fcn_head(): + + with pytest.raises(AssertionError): + # num_convs must be not less than 0 + FCNHead(num_classes=19, num_convs=-1) + + # test no norm_cfg + head = FCNHead(in_channels=32, channels=16, num_classes=19) + for m in head.modules(): + if isinstance(m, ConvModule): + assert not m.with_norm + + # test with norm_cfg + head = FCNHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + for m in head.modules(): + if isinstance(m, ConvModule): + assert m.with_norm and isinstance(m.bn, SyncBatchNorm) + + # test concat_input=False + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead( + in_channels=32, channels=16, num_classes=19, concat_input=False) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert len(head.convs) == 2 + assert not head.concat_input and not hasattr(head, 'conv_cat') + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test concat_input=True + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead( + in_channels=32, channels=16, num_classes=19, concat_input=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert len(head.convs) == 2 + assert head.concat_input + assert head.conv_cat.in_channels == 48 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test kernel_size=3 + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead(in_channels=32, channels=16, num_classes=19) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + for i in range(len(head.convs)): + assert head.convs[i].kernel_size == (3, 3) + assert head.convs[i].padding == 1 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test kernel_size=1 + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead(in_channels=32, channels=16, num_classes=19, kernel_size=1) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + for i in range(len(head.convs)): + assert head.convs[i].kernel_size == (1, 1) + assert head.convs[i].padding == 0 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test num_conv + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead(in_channels=32, channels=16, num_classes=19, num_convs=1) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert len(head.convs) == 1 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test num_conv = 0 + inputs = [torch.randn(1, 32, 45, 45)] + head = FCNHead( + in_channels=32, + channels=32, + num_classes=19, + num_convs=0, + concat_input=False) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert isinstance(head.convs, torch.nn.Identity) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_psp_head(): + + with pytest.raises(AssertionError): + # pool_scales must be list|tuple + PSPHead(in_channels=32, channels=16, num_classes=19, pool_scales=1) + + # test no norm_cfg + head = PSPHead(in_channels=32, channels=16, num_classes=19) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = PSPHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + inputs = [torch.randn(1, 32, 45, 45)] + head = PSPHead( + in_channels=32, channels=16, num_classes=19, pool_scales=(1, 2, 3)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.psp_modules[0][0].output_size == 1 + assert head.psp_modules[1][0].output_size == 2 + assert head.psp_modules[2][0].output_size == 3 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_apc_head(): + + with pytest.raises(AssertionError): + # pool_scales must be list|tuple + APCHead(in_channels=32, channels=16, num_classes=19, pool_scales=1) + + # test no norm_cfg + head = APCHead(in_channels=32, channels=16, num_classes=19) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = APCHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + # fusion=True + inputs = [torch.randn(1, 32, 45, 45)] + head = APCHead( + in_channels=32, + channels=16, + num_classes=19, + pool_scales=(1, 2, 3), + fusion=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.fusion is True + assert head.acm_modules[0].pool_scale == 1 + assert head.acm_modules[1].pool_scale == 2 + assert head.acm_modules[2].pool_scale == 3 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # fusion=False + inputs = [torch.randn(1, 32, 45, 45)] + head = APCHead( + in_channels=32, + channels=16, + num_classes=19, + pool_scales=(1, 2, 3), + fusion=False) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.fusion is False + assert head.acm_modules[0].pool_scale == 1 + assert head.acm_modules[1].pool_scale == 2 + assert head.acm_modules[2].pool_scale == 3 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_dm_head(): + + with pytest.raises(AssertionError): + # filter_sizes must be list|tuple + DMHead(in_channels=32, channels=16, num_classes=19, filter_sizes=1) + + # test no norm_cfg + head = DMHead(in_channels=32, channels=16, num_classes=19) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = DMHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + # fusion=True + inputs = [torch.randn(1, 32, 45, 45)] + head = DMHead( + in_channels=32, + channels=16, + num_classes=19, + filter_sizes=(1, 3, 5), + fusion=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.fusion is True + assert head.dcm_modules[0].filter_size == 1 + assert head.dcm_modules[1].filter_size == 3 + assert head.dcm_modules[2].filter_size == 5 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # fusion=False + inputs = [torch.randn(1, 32, 45, 45)] + head = DMHead( + in_channels=32, + channels=16, + num_classes=19, + filter_sizes=(1, 3, 5), + fusion=False) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.fusion is False + assert head.dcm_modules[0].filter_size == 1 + assert head.dcm_modules[1].filter_size == 3 + assert head.dcm_modules[2].filter_size == 5 + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_aspp_head(): + + with pytest.raises(AssertionError): + # pool_scales must be list|tuple + ASPPHead(in_channels=32, channels=16, num_classes=19, dilations=1) + + # test no norm_cfg + head = ASPPHead(in_channels=32, channels=16, num_classes=19) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = ASPPHead( + in_channels=32, + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + inputs = [torch.randn(1, 32, 45, 45)] + head = ASPPHead( + in_channels=32, channels=16, num_classes=19, dilations=(1, 12, 24)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.aspp_modules[0].conv.dilation == (1, 1) + assert head.aspp_modules[1].conv.dilation == (12, 12) + assert head.aspp_modules[2].conv.dilation == (24, 24) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_psa_head(): + + with pytest.raises(AssertionError): + # psa_type must be in 'bi-direction', 'collect', 'distribute' + PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_type='gather') + + # test no norm_cfg + head = PSAHead( + in_channels=32, channels=16, num_classes=19, mask_size=(39, 39)) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + norm_cfg=dict(type='SyncBN')) + assert _conv_has_norm(head, sync_bn=True) + + # test 'bi-direction' psa_type + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, channels=16, num_classes=19, mask_size=(39, 39)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'bi-direction' psa_type, shrink_factor=1 + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + shrink_factor=1) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'bi-direction' psa_type with soft_max + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_softmax=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'collect' psa_type + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_type='collect') + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'collect' psa_type, shrink_factor=1 + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + shrink_factor=1, + psa_type='collect') + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'collect' psa_type, shrink_factor=1, compact=True + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_type='collect', + shrink_factor=1, + compact=True) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + # test 'distribute' psa_type + inputs = [torch.randn(1, 32, 39, 39)] + head = PSAHead( + in_channels=32, + channels=16, + num_classes=19, + mask_size=(39, 39), + psa_type='distribute') + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 39, 39) + + +def test_gc_head(): + head = GCHead(in_channels=32, channels=16, num_classes=19) + assert len(head.convs) == 2 + assert hasattr(head, 'gc_block') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_nl_head(): + head = NLHead(in_channels=32, channels=16, num_classes=19) + assert len(head.convs) == 2 + assert hasattr(head, 'nl_block') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_cc_head(): + head = CCHead(in_channels=32, channels=16, num_classes=19) + assert len(head.convs) == 2 + assert hasattr(head, 'cca') + if not torch.cuda.is_available(): + pytest.skip('CCHead requires CUDA') + inputs = [torch.randn(1, 32, 45, 45)] + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_uper_head(): + + with pytest.raises(AssertionError): + # fpn_in_channels must be list|tuple + UPerHead(in_channels=32, channels=16, num_classes=19) + + # test no norm_cfg + head = UPerHead( + in_channels=[32, 16], channels=16, num_classes=19, in_index=[-2, -1]) + assert not _conv_has_norm(head, sync_bn=False) + + # test with norm_cfg + head = UPerHead( + in_channels=[32, 16], + channels=16, + num_classes=19, + norm_cfg=dict(type='SyncBN'), + in_index=[-2, -1]) + assert _conv_has_norm(head, sync_bn=True) + + inputs = [torch.randn(1, 32, 45, 45), torch.randn(1, 16, 21, 21)] + head = UPerHead( + in_channels=[32, 16], channels=16, num_classes=19, in_index=[-2, -1]) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_ann_head(): + + inputs = [torch.randn(1, 16, 45, 45), torch.randn(1, 32, 21, 21)] + head = ANNHead( + in_channels=[16, 32], + channels=16, + num_classes=19, + in_index=[-2, -1], + project_channels=8) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 21, 21) + + +def test_da_head(): + + inputs = [torch.randn(1, 32, 45, 45)] + head = DAHead(in_channels=32, channels=16, num_classes=19, pam_channels=8) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert isinstance(outputs, tuple) and len(outputs) == 3 + for output in outputs: + assert output.shape == (1, head.num_classes, 45, 45) + test_output = head.forward_test(inputs, None, None) + assert test_output.shape == (1, head.num_classes, 45, 45) + + +def test_ocr_head(): + + inputs = [torch.randn(1, 32, 45, 45)] + ocr_head = OCRHead( + in_channels=32, channels=16, num_classes=19, ocr_channels=8) + fcn_head = FCNHead(in_channels=32, channels=16, num_classes=19) + if torch.cuda.is_available(): + head, inputs = to_cuda(ocr_head, inputs) + head, inputs = to_cuda(fcn_head, inputs) + prev_output = fcn_head(inputs) + output = ocr_head(inputs, prev_output) + assert output.shape == (1, ocr_head.num_classes, 45, 45) + + +def test_enc_head(): + # with se_loss, w.o. lateral + inputs = [torch.randn(1, 32, 21, 21)] + head = EncHead( + in_channels=[32], channels=16, num_classes=19, in_index=[-1]) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert isinstance(outputs, tuple) and len(outputs) == 2 + assert outputs[0].shape == (1, head.num_classes, 21, 21) + assert outputs[1].shape == (1, head.num_classes) + + # w.o se_loss, w.o. lateral + inputs = [torch.randn(1, 32, 21, 21)] + head = EncHead( + in_channels=[32], + channels=16, + use_se_loss=False, + num_classes=19, + in_index=[-1]) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 21, 21) + + # with se_loss, with lateral + inputs = [torch.randn(1, 16, 45, 45), torch.randn(1, 32, 21, 21)] + head = EncHead( + in_channels=[16, 32], + channels=16, + add_lateral=True, + num_classes=19, + in_index=[-2, -1]) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert isinstance(outputs, tuple) and len(outputs) == 2 + assert outputs[0].shape == (1, head.num_classes, 21, 21) + assert outputs[1].shape == (1, head.num_classes) + test_output = head.forward_test(inputs, None, None) + assert test_output.shape == (1, head.num_classes, 21, 21) + + +def test_dw_aspp_head(): + + # test w.o. c1 + inputs = [torch.randn(1, 32, 45, 45)] + head = DepthwiseSeparableASPPHead( + c1_in_channels=0, + c1_channels=0, + in_channels=32, + channels=16, + num_classes=19, + dilations=(1, 12, 24)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.c1_bottleneck is None + assert head.aspp_modules[0].conv.dilation == (1, 1) + assert head.aspp_modules[1].depthwise_conv.dilation == (12, 12) + assert head.aspp_modules[2].depthwise_conv.dilation == (24, 24) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # test with c1 + inputs = [torch.randn(1, 8, 45, 45), torch.randn(1, 32, 21, 21)] + head = DepthwiseSeparableASPPHead( + c1_in_channels=8, + c1_channels=4, + in_channels=32, + channels=16, + num_classes=19, + dilations=(1, 12, 24)) + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + assert head.c1_bottleneck.in_channels == 8 + assert head.c1_bottleneck.out_channels == 4 + assert head.aspp_modules[0].conv.dilation == (1, 1) + assert head.aspp_modules[1].depthwise_conv.dilation == (12, 12) + assert head.aspp_modules[2].depthwise_conv.dilation == (24, 24) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_sep_fcn_head(): + # test sep_fcn_head with concat_input=False + head = DepthwiseSeparableFCNHead( + in_channels=128, + channels=128, + concat_input=False, + num_classes=19, + in_index=-1, + norm_cfg=dict(type='BN', requires_grad=True, momentum=0.01)) + x = [torch.rand(2, 128, 32, 32)] + output = head(x) + assert output.shape == (2, head.num_classes, 32, 32) + assert not head.concat_input + assert isinstance(head.convs[0], DepthwiseSeparableConvModule) + assert isinstance(head.convs[1], DepthwiseSeparableConvModule) + assert head.conv_seg.kernel_size == (1, 1) + + head = DepthwiseSeparableFCNHead( + in_channels=64, + channels=64, + concat_input=True, + num_classes=19, + in_index=-1, + norm_cfg=dict(type='BN', requires_grad=True, momentum=0.01)) + x = [torch.rand(3, 64, 32, 32)] + output = head(x) + assert output.shape == (3, head.num_classes, 32, 32) + assert head.concat_input + assert isinstance(head.convs[0], DepthwiseSeparableConvModule) + assert isinstance(head.convs[1], DepthwiseSeparableConvModule) + + +def test_dnl_head(): + # DNL with 'embedded_gaussian' mode + head = DNLHead(in_channels=32, channels=16, num_classes=19) + assert len(head.convs) == 2 + assert hasattr(head, 'dnl_block') + assert head.dnl_block.temperature == 0.05 + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # NonLocal2d with 'dot_product' mode + head = DNLHead( + in_channels=32, channels=16, num_classes=19, mode='dot_product') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # NonLocal2d with 'gaussian' mode + head = DNLHead( + in_channels=32, channels=16, num_classes=19, mode='gaussian') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + # NonLocal2d with 'concatenation' mode + head = DNLHead( + in_channels=32, channels=16, num_classes=19, mode='concatenation') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_emanet_head(): + head = EMAHead( + in_channels=32, + ema_channels=24, + channels=16, + num_stages=3, + num_bases=16, + num_classes=19) + for param in head.ema_mid_conv.parameters(): + assert not param.requires_grad + assert hasattr(head, 'ema_module') + inputs = [torch.randn(1, 32, 45, 45)] + if torch.cuda.is_available(): + head, inputs = to_cuda(head, inputs) + outputs = head(inputs) + assert outputs.shape == (1, head.num_classes, 45, 45) + + +def test_point_head(): + + inputs = [torch.randn(1, 32, 45, 45)] + point_head = PointHead( + in_channels=[32], in_index=[0], channels=16, num_classes=19) + assert len(point_head.fcs) == 3 + fcn_head = FCNHead(in_channels=32, channels=16, num_classes=19) + if torch.cuda.is_available(): + head, inputs = to_cuda(point_head, inputs) + head, inputs = to_cuda(fcn_head, inputs) + prev_output = fcn_head(inputs) + test_cfg = ConfigDict( + subdivision_steps=2, subdivision_num_points=8196, scale_factor=2) + output = point_head.forward_test(inputs, prev_output, None, test_cfg) + assert output.shape == (1, point_head.num_classes, 180, 180) + + +def test_lraspp_head(): + with pytest.raises(ValueError): + # check invalid input_transform + LRASPPHead( + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='resize_concat', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + + with pytest.raises(AssertionError): + # check invalid branch_channels + LRASPPHead( + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + branch_channels=64, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + + # test with default settings + lraspp_head = LRASPPHead( + in_channels=(16, 16, 576), + in_index=(0, 1, 2), + channels=128, + input_transform='multiple_select', + dropout_ratio=0.1, + num_classes=19, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)) + inputs = [ + torch.randn(2, 16, 45, 45), + torch.randn(2, 16, 28, 28), + torch.randn(2, 576, 14, 14) + ] + with pytest.raises(RuntimeError): + # check invalid inputs + output = lraspp_head(inputs) + + inputs = [ + torch.randn(2, 16, 111, 111), + torch.randn(2, 16, 77, 77), + torch.randn(2, 576, 55, 55) + ] + output = lraspp_head(inputs) + assert output.shape == (2, 19, 111, 111) diff --git a/tests/test_models/test_losses.py b/tests/test_models/test_losses.py new file mode 100644 index 0000000000000000000000000000000000000000..005d9391145dbc18766fb81633fb3eda16b825b0 --- /dev/null +++ b/tests/test_models/test_losses.py @@ -0,0 +1,204 @@ +import numpy as np +import pytest +import torch + +from mmseg.models.losses import Accuracy, reduce_loss, weight_reduce_loss + + +def test_utils(): + loss = torch.rand(1, 3, 4, 4) + weight = torch.zeros(1, 3, 4, 4) + weight[:, :, :2, :2] = 1 + + # test reduce_loss() + reduced = reduce_loss(loss, 'none') + assert reduced is loss + + reduced = reduce_loss(loss, 'mean') + np.testing.assert_almost_equal(reduced.numpy(), loss.mean()) + + reduced = reduce_loss(loss, 'sum') + np.testing.assert_almost_equal(reduced.numpy(), loss.sum()) + + # test weight_reduce_loss() + reduced = weight_reduce_loss(loss, weight=None, reduction='none') + assert reduced is loss + + reduced = weight_reduce_loss(loss, weight=weight, reduction='mean') + target = (loss * weight).mean() + np.testing.assert_almost_equal(reduced.numpy(), target) + + reduced = weight_reduce_loss(loss, weight=weight, reduction='sum') + np.testing.assert_almost_equal(reduced.numpy(), (loss * weight).sum()) + + with pytest.raises(AssertionError): + weight_wrong = weight[0, 0, ...] + weight_reduce_loss(loss, weight=weight_wrong, reduction='mean') + + with pytest.raises(AssertionError): + weight_wrong = weight[:, 0:2, ...] + weight_reduce_loss(loss, weight=weight_wrong, reduction='mean') + + +def test_ce_loss(): + from mmseg.models import build_loss + + # use_mask and use_sigmoid cannot be true at the same time + with pytest.raises(AssertionError): + loss_cfg = dict( + type='CrossEntropyLoss', + use_mask=True, + use_sigmoid=True, + loss_weight=1.0) + build_loss(loss_cfg) + + # test loss with class weights + loss_cls_cfg = dict( + type='CrossEntropyLoss', + use_sigmoid=False, + class_weight=[0.8, 0.2], + loss_weight=1.0) + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[100, -100]]) + fake_label = torch.Tensor([1]).long() + assert torch.allclose(loss_cls(fake_pred, fake_label), torch.tensor(40.)) + + loss_cls_cfg = dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0) + loss_cls = build_loss(loss_cls_cfg) + assert torch.allclose(loss_cls(fake_pred, fake_label), torch.tensor(200.)) + + loss_cls_cfg = dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0) + loss_cls = build_loss(loss_cls_cfg) + assert torch.allclose(loss_cls(fake_pred, fake_label), torch.tensor(100.)) + + fake_pred = torch.full(size=(2, 21, 8, 8), fill_value=0.5) + fake_label = torch.ones(2, 8, 8).long() + assert torch.allclose( + loss_cls(fake_pred, fake_label), torch.tensor(0.9503), atol=1e-4) + fake_label[:, 0, 0] = 255 + assert torch.allclose( + loss_cls(fake_pred, fake_label, ignore_index=255), + torch.tensor(0.9354), + atol=1e-4) + + # TODO test use_mask + + +def test_accuracy(): + # test for empty pred + pred = torch.empty(0, 4) + label = torch.empty(0) + accuracy = Accuracy(topk=1) + acc = accuracy(pred, label) + assert acc.item() == 0 + + pred = torch.Tensor([[0.2, 0.3, 0.6, 0.5], [0.1, 0.1, 0.2, 0.6], + [0.9, 0.0, 0.0, 0.1], [0.4, 0.7, 0.1, 0.1], + [0.0, 0.0, 0.99, 0]]) + # test for top1 + true_label = torch.Tensor([2, 3, 0, 1, 2]).long() + accuracy = Accuracy(topk=1) + acc = accuracy(pred, true_label) + assert acc.item() == 100 + + # test for top1 with score thresh=0.8 + true_label = torch.Tensor([2, 3, 0, 1, 2]).long() + accuracy = Accuracy(topk=1, thresh=0.8) + acc = accuracy(pred, true_label) + assert acc.item() == 40 + + # test for top2 + accuracy = Accuracy(topk=2) + label = torch.Tensor([3, 2, 0, 0, 2]).long() + acc = accuracy(pred, label) + assert acc.item() == 100 + + # test for both top1 and top2 + accuracy = Accuracy(topk=(1, 2)) + true_label = torch.Tensor([2, 3, 0, 1, 2]).long() + acc = accuracy(pred, true_label) + for a in acc: + assert a.item() == 100 + + # topk is larger than pred class number + with pytest.raises(AssertionError): + accuracy = Accuracy(topk=5) + accuracy(pred, true_label) + + # wrong topk type + with pytest.raises(AssertionError): + accuracy = Accuracy(topk='wrong type') + accuracy(pred, true_label) + + # label size is larger than required + with pytest.raises(AssertionError): + label = torch.Tensor([2, 3, 0, 1, 2, 0]).long() # size mismatch + accuracy = Accuracy() + accuracy(pred, label) + + # wrong pred dimension + with pytest.raises(AssertionError): + accuracy = Accuracy() + accuracy(pred[:, :, None], true_label) + + +def test_lovasz_loss(): + from mmseg.models import build_loss + + # loss_type should be 'binary' or 'multi_class' + with pytest.raises(AssertionError): + loss_cfg = dict( + type='LovaszLoss', + loss_type='Binary', + reduction='none', + loss_weight=1.0) + build_loss(loss_cfg) + + # reduction should be 'none' when per_image is False. + with pytest.raises(AssertionError): + loss_cfg = dict(type='LovaszLoss', loss_type='multi_class') + build_loss(loss_cfg) + + # test lovasz loss with loss_type = 'multi_class' and per_image = False + loss_cfg = dict(type='LovaszLoss', reduction='none', loss_weight=1.0) + lovasz_loss = build_loss(loss_cfg) + logits = torch.rand(1, 3, 4, 4) + labels = (torch.rand(1, 4, 4) * 2).long() + lovasz_loss(logits, labels) + + # test lovasz loss with loss_type = 'multi_class' and per_image = True + loss_cfg = dict( + type='LovaszLoss', + per_image=True, + reduction='mean', + class_weight=[1.0, 2.0, 3.0], + loss_weight=1.0) + lovasz_loss = build_loss(loss_cfg) + logits = torch.rand(1, 3, 4, 4) + labels = (torch.rand(1, 4, 4) * 2).long() + lovasz_loss(logits, labels, ignore_index=None) + + # test lovasz loss with loss_type = 'binary' and per_image = False + loss_cfg = dict( + type='LovaszLoss', + loss_type='binary', + reduction='none', + loss_weight=1.0) + lovasz_loss = build_loss(loss_cfg) + logits = torch.rand(2, 4, 4) + labels = (torch.rand(2, 4, 4)).long() + lovasz_loss(logits, labels) + + # test lovasz loss with loss_type = 'binary' and per_image = True + loss_cfg = dict( + type='LovaszLoss', + loss_type='binary', + per_image=True, + reduction='mean', + loss_weight=1.0) + lovasz_loss = build_loss(loss_cfg) + logits = torch.rand(2, 4, 4) + labels = (torch.rand(2, 4, 4)).long() + lovasz_loss(logits, labels, ignore_index=None) diff --git a/tests/test_models/test_necks.py b/tests/test_models/test_necks.py new file mode 100644 index 0000000000000000000000000000000000000000..8fc968450f5e66c804bc7a4ac1cf28a0d635739c --- /dev/null +++ b/tests/test_models/test_necks.py @@ -0,0 +1,18 @@ +import torch + +from mmseg.models import FPN + + +def test_fpn(): + in_channels = [256, 512, 1024, 2048] + inputs = [ + torch.randn(1, c, 56 // 2**i, 56 // 2**i) + for i, c in enumerate(in_channels) + ] + + fpn = FPN(in_channels, 256, len(in_channels)) + outputs = fpn(inputs) + assert outputs[0].shape == torch.Size([1, 256, 56, 56]) + assert outputs[1].shape == torch.Size([1, 256, 28, 28]) + assert outputs[2].shape == torch.Size([1, 256, 14, 14]) + assert outputs[3].shape == torch.Size([1, 256, 7, 7]) diff --git a/tests/test_models/test_segmentor.py b/tests/test_models/test_segmentor.py new file mode 100644 index 0000000000000000000000000000000000000000..90d3bf6314f03e11d9728890adc532732b05d14c --- /dev/null +++ b/tests/test_models/test_segmentor.py @@ -0,0 +1,214 @@ +import numpy as np +import torch +from mmcv import ConfigDict +from torch import nn + +from mmseg.models import BACKBONES, HEADS, build_segmentor +from mmseg.models.decode_heads.cascade_decode_head import BaseCascadeDecodeHead +from mmseg.models.decode_heads.decode_head import BaseDecodeHead + + +def _demo_mm_inputs(input_shape=(1, 3, 8, 16), num_classes=10): + """Create a superset of inputs needed to run test or train batches. + + Args: + input_shape (tuple): + input batch dimensions + + num_classes (int): + number of semantic classes + """ + (N, C, H, W) = input_shape + + rng = np.random.RandomState(0) + + imgs = rng.rand(*input_shape) + segs = rng.randint( + low=0, high=num_classes - 1, size=(N, 1, H, W)).astype(np.uint8) + + img_metas = [{ + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': 1.0, + 'flip': False, + 'flip_direction': 'horizontal' + } for _ in range(N)] + + mm_inputs = { + 'imgs': torch.FloatTensor(imgs), + 'img_metas': img_metas, + 'gt_semantic_seg': torch.LongTensor(segs) + } + return mm_inputs + + +@BACKBONES.register_module() +class ExampleBackbone(nn.Module): + + def __init__(self): + super(ExampleBackbone, self).__init__() + self.conv = nn.Conv2d(3, 3, 3) + + def init_weights(self, pretrained=None): + pass + + def forward(self, x): + return [self.conv(x)] + + +@HEADS.register_module() +class ExampleDecodeHead(BaseDecodeHead): + + def __init__(self): + super(ExampleDecodeHead, self).__init__(3, 3, num_classes=19) + + def forward(self, inputs): + return self.cls_seg(inputs[0]) + + +@HEADS.register_module() +class ExampleCascadeDecodeHead(BaseCascadeDecodeHead): + + def __init__(self): + super(ExampleCascadeDecodeHead, self).__init__(3, 3, num_classes=19) + + def forward(self, inputs, prev_out): + return self.cls_seg(inputs[0]) + + +def _segmentor_forward_train_test(segmentor): + if isinstance(segmentor.decode_head, nn.ModuleList): + num_classes = segmentor.decode_head[-1].num_classes + else: + num_classes = segmentor.decode_head.num_classes + # batch_size=2 for BatchNorm + mm_inputs = _demo_mm_inputs(num_classes=num_classes) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + gt_semantic_seg = mm_inputs['gt_semantic_seg'] + + # convert to cuda Tensor if applicable + if torch.cuda.is_available(): + segmentor = segmentor.cuda() + imgs = imgs.cuda() + gt_semantic_seg = gt_semantic_seg.cuda() + + # Test forward train + losses = segmentor.forward( + imgs, img_metas, gt_semantic_seg=gt_semantic_seg, return_loss=True) + assert isinstance(losses, dict) + + # Test forward simple test + with torch.no_grad(): + segmentor.eval() + # pack into lists + img_list = [img[None, :] for img in imgs] + img_meta_list = [[img_meta] for img_meta in img_metas] + segmentor.forward(img_list, img_meta_list, return_loss=False) + + # Test forward aug test + with torch.no_grad(): + segmentor.eval() + # pack into lists + img_list = [img[None, :] for img in imgs] + img_list = img_list + img_list + img_meta_list = [[img_meta] for img_meta in img_metas] + img_meta_list = img_meta_list + img_meta_list + segmentor.forward(img_list, img_meta_list, return_loss=False) + + +def test_encoder_decoder(): + + # test 1 decode head, w.o. aux head + + cfg = ConfigDict( + type='EncoderDecoder', + backbone=dict(type='ExampleBackbone'), + decode_head=dict(type='ExampleDecodeHead'), + train_cfg=None, + test_cfg=dict(mode='whole')) + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test slide mode + cfg.test_cfg = ConfigDict(mode='slide', crop_size=(3, 3), stride=(2, 2)) + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test 1 decode head, 1 aux head + cfg = ConfigDict( + type='EncoderDecoder', + backbone=dict(type='ExampleBackbone'), + decode_head=dict(type='ExampleDecodeHead'), + auxiliary_head=dict(type='ExampleDecodeHead')) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test 1 decode head, 2 aux head + cfg = ConfigDict( + type='EncoderDecoder', + backbone=dict(type='ExampleBackbone'), + decode_head=dict(type='ExampleDecodeHead'), + auxiliary_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleDecodeHead') + ]) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + +def test_cascade_encoder_decoder(): + + # test 1 decode head, w.o. aux head + cfg = ConfigDict( + type='CascadeEncoderDecoder', + num_stages=2, + backbone=dict(type='ExampleBackbone'), + decode_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleCascadeDecodeHead') + ]) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test slide mode + cfg.test_cfg = ConfigDict(mode='slide', crop_size=(3, 3), stride=(2, 2)) + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test 1 decode head, 1 aux head + cfg = ConfigDict( + type='CascadeEncoderDecoder', + num_stages=2, + backbone=dict(type='ExampleBackbone'), + decode_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleCascadeDecodeHead') + ], + auxiliary_head=dict(type='ExampleDecodeHead')) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) + + # test 1 decode head, 2 aux head + cfg = ConfigDict( + type='CascadeEncoderDecoder', + num_stages=2, + backbone=dict(type='ExampleBackbone'), + decode_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleCascadeDecodeHead') + ], + auxiliary_head=[ + dict(type='ExampleDecodeHead'), + dict(type='ExampleDecodeHead') + ]) + cfg.test_cfg = ConfigDict(mode='whole') + segmentor = build_segmentor(cfg) + _segmentor_forward_train_test(segmentor) diff --git a/tests/test_models/test_unet.py b/tests/test_models/test_unet.py new file mode 100644 index 0000000000000000000000000000000000000000..febe4f0c970c3bc44bd9e8170c706df32122b9b4 --- /dev/null +++ b/tests/test_models/test_unet.py @@ -0,0 +1,833 @@ +import pytest +import torch +from mmcv.cnn import ConvModule +from mmcv.utils.parrots_wrapper import _BatchNorm +from torch import nn + +from mmseg.models.backbones.unet import (BasicConvBlock, DeconvModule, + InterpConv, UNet, UpConvBlock) + + +def check_norm_state(modules, train_state): + """Check if norm layer is in correct train state.""" + for mod in modules: + if isinstance(mod, _BatchNorm): + if mod.training != train_state: + return False + return True + + +def test_unet_basic_conv_block(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + BasicConvBlock(64, 64, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + BasicConvBlock(64, 64, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + BasicConvBlock(64, 64, plugins=plugins) + + # test BasicConvBlock with checkpoint forward + block = BasicConvBlock(16, 16, with_cp=True) + assert block.with_cp + x = torch.randn(1, 16, 64, 64, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([1, 16, 64, 64]) + + block = BasicConvBlock(16, 16, with_cp=False) + assert not block.with_cp + x = torch.randn(1, 16, 64, 64) + x_out = block(x) + assert x_out.shape == torch.Size([1, 16, 64, 64]) + + # test BasicConvBlock with stride convolution to downsample + block = BasicConvBlock(16, 16, stride=2) + x = torch.randn(1, 16, 64, 64) + x_out = block(x) + assert x_out.shape == torch.Size([1, 16, 32, 32]) + + # test BasicConvBlock structure and forward + block = BasicConvBlock(16, 64, num_convs=3, dilation=3) + assert block.convs[0].conv.in_channels == 16 + assert block.convs[0].conv.out_channels == 64 + assert block.convs[0].conv.kernel_size == (3, 3) + assert block.convs[0].conv.dilation == (1, 1) + assert block.convs[0].conv.padding == (1, 1) + + assert block.convs[1].conv.in_channels == 64 + assert block.convs[1].conv.out_channels == 64 + assert block.convs[1].conv.kernel_size == (3, 3) + assert block.convs[1].conv.dilation == (3, 3) + assert block.convs[1].conv.padding == (3, 3) + + assert block.convs[2].conv.in_channels == 64 + assert block.convs[2].conv.out_channels == 64 + assert block.convs[2].conv.kernel_size == (3, 3) + assert block.convs[2].conv.dilation == (3, 3) + assert block.convs[2].conv.padding == (3, 3) + + +def test_deconv_module(): + with pytest.raises(AssertionError): + # kernel_size should be greater than or equal to scale_factor and + # (kernel_size - scale_factor) should be even numbers + DeconvModule(64, 32, kernel_size=1, scale_factor=2) + + with pytest.raises(AssertionError): + # kernel_size should be greater than or equal to scale_factor and + # (kernel_size - scale_factor) should be even numbers + DeconvModule(64, 32, kernel_size=3, scale_factor=2) + + with pytest.raises(AssertionError): + # kernel_size should be greater than or equal to scale_factor and + # (kernel_size - scale_factor) should be even numbers + DeconvModule(64, 32, kernel_size=5, scale_factor=4) + + # test DeconvModule with checkpoint forward and upsample 2X. + block = DeconvModule(64, 32, with_cp=True) + assert block.with_cp + x = torch.randn(1, 64, 128, 128, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + block = DeconvModule(64, 32, with_cp=False) + assert not block.with_cp + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test DeconvModule with different kernel size for upsample 2X. + x = torch.randn(1, 64, 64, 64) + block = DeconvModule(64, 32, kernel_size=2, scale_factor=2) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 128, 128]) + + block = DeconvModule(64, 32, kernel_size=6, scale_factor=2) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 128, 128]) + + # test DeconvModule with different kernel size for upsample 4X. + x = torch.randn(1, 64, 64, 64) + block = DeconvModule(64, 32, kernel_size=4, scale_factor=4) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + block = DeconvModule(64, 32, kernel_size=6, scale_factor=4) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + +def test_interp_conv(): + # test InterpConv with checkpoint forward and upsample 2X. + block = InterpConv(64, 32, with_cp=True) + assert block.with_cp + x = torch.randn(1, 64, 128, 128, requires_grad=True) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + block = InterpConv(64, 32, with_cp=False) + assert not block.with_cp + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test InterpConv with conv_first=False for upsample 2X. + block = InterpConv(64, 32, conv_first=False) + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert isinstance(block.interp_upsample[0], nn.Upsample) + assert isinstance(block.interp_upsample[1], ConvModule) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test InterpConv with conv_first=True for upsample 2X. + block = InterpConv(64, 32, conv_first=True) + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert isinstance(block.interp_upsample[0], ConvModule) + assert isinstance(block.interp_upsample[1], nn.Upsample) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test InterpConv with bilinear upsample for upsample 2X. + block = InterpConv( + 64, + 32, + conv_first=False, + upsampe_cfg=dict(scale_factor=2, mode='bilinear', align_corners=False)) + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert isinstance(block.interp_upsample[0], nn.Upsample) + assert isinstance(block.interp_upsample[1], ConvModule) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + assert block.interp_upsample[0].mode == 'bilinear' + + # test InterpConv with nearest upsample for upsample 2X. + block = InterpConv( + 64, + 32, + conv_first=False, + upsampe_cfg=dict(scale_factor=2, mode='nearest')) + x = torch.randn(1, 64, 128, 128) + x_out = block(x) + assert isinstance(block.interp_upsample[0], nn.Upsample) + assert isinstance(block.interp_upsample[1], ConvModule) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + assert block.interp_upsample[0].mode == 'nearest' + + +def test_up_conv_block(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + UpConvBlock(BasicConvBlock, 64, 32, 32, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + UpConvBlock(BasicConvBlock, 64, 32, 32, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + UpConvBlock(BasicConvBlock, 64, 32, 32, plugins=plugins) + + # test UpConvBlock with checkpoint forward and upsample 2X. + block = UpConvBlock(BasicConvBlock, 64, 32, 32, with_cp=True) + skip_x = torch.randn(1, 32, 256, 256, requires_grad=True) + x = torch.randn(1, 64, 128, 128, requires_grad=True) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test UpConvBlock with upsample=True for upsample 2X. The spatial size of + # skip_x is 2X larger than x. + block = UpConvBlock( + BasicConvBlock, 64, 32, 32, upsample_cfg=dict(type='InterpConv')) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 128, 128) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test UpConvBlock with upsample=False for upsample 2X. The spatial size of + # skip_x is the same as that of x. + block = UpConvBlock(BasicConvBlock, 64, 32, 32, upsample_cfg=None) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 256, 256) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test UpConvBlock with different upsample method for upsample 2X. + # The upsample method is interpolation upsample (bilinear or nearest). + block = UpConvBlock( + BasicConvBlock, + 64, + 32, + 32, + upsample_cfg=dict( + type='InterpConv', + upsampe_cfg=dict( + scale_factor=2, mode='bilinear', align_corners=False))) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 128, 128) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test UpConvBlock with different upsample method for upsample 2X. + # The upsample method is deconvolution upsample. + block = UpConvBlock( + BasicConvBlock, + 64, + 32, + 32, + upsample_cfg=dict(type='DeconvModule', kernel_size=4, scale_factor=2)) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 128, 128) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + # test BasicConvBlock structure and forward + block = UpConvBlock( + conv_block=BasicConvBlock, + in_channels=64, + skip_channels=32, + out_channels=32, + num_convs=3, + dilation=3, + upsample_cfg=dict( + type='InterpConv', + upsampe_cfg=dict( + scale_factor=2, mode='bilinear', align_corners=False))) + skip_x = torch.randn(1, 32, 256, 256) + x = torch.randn(1, 64, 128, 128) + x_out = block(skip_x, x) + assert x_out.shape == torch.Size([1, 32, 256, 256]) + + assert block.conv_block.convs[0].conv.in_channels == 64 + assert block.conv_block.convs[0].conv.out_channels == 32 + assert block.conv_block.convs[0].conv.kernel_size == (3, 3) + assert block.conv_block.convs[0].conv.dilation == (1, 1) + assert block.conv_block.convs[0].conv.padding == (1, 1) + + assert block.conv_block.convs[1].conv.in_channels == 32 + assert block.conv_block.convs[1].conv.out_channels == 32 + assert block.conv_block.convs[1].conv.kernel_size == (3, 3) + assert block.conv_block.convs[1].conv.dilation == (3, 3) + assert block.conv_block.convs[1].conv.padding == (3, 3) + + assert block.conv_block.convs[2].conv.in_channels == 32 + assert block.conv_block.convs[2].conv.out_channels == 32 + assert block.conv_block.convs[2].conv.kernel_size == (3, 3) + assert block.conv_block.convs[2].conv.dilation == (3, 3) + assert block.conv_block.convs[2].conv.padding == (3, 3) + + assert block.upsample.interp_upsample[1].conv.in_channels == 64 + assert block.upsample.interp_upsample[1].conv.out_channels == 32 + assert block.upsample.interp_upsample[1].conv.kernel_size == (1, 1) + assert block.upsample.interp_upsample[1].conv.dilation == (1, 1) + assert block.upsample.interp_upsample[1].conv.padding == (0, 0) + + +def test_unet(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + UNet(3, 64, 5, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + UNet(3, 64, 5, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + UNet(3, 64, 5, plugins=plugins) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=4, + strides=(1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2), + dec_num_convs=(2, 2, 2), + downsamples=(True, True, True), + enc_dilations=(1, 1, 1, 1), + dec_dilations=(1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 16. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 2, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check whether the input image size can be devisible by the whole + # downsample rate of the encoder. The whole downsample rate of this + # case is 32. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=6, + strides=(1, 1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2, 2), + downsamples=(True, True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1, 1)) + x = torch.randn(2, 3, 65, 65) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(strides)=num_stages + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(enc_num_convs)=num_stages + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(dec_num_convs)=num_stages-1 + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(downsamples)=num_stages-1 + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(enc_dilations)=num_stages + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + with pytest.raises(AssertionError): + # Check if num_stages matchs strides, len(dec_dilations)=num_stages-1 + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1, 1)) + x = torch.randn(2, 3, 64, 64) + unet(x) + + # test UNet norm_eval=True + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + norm_eval=True) + unet.train() + assert check_norm_state(unet.modules(), False) + + # test UNet norm_eval=False + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + norm_eval=False) + unet.train() + assert check_norm_state(unet.modules(), True) + + # test UNet forward and outputs. The whole downsample rate is 16. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 8, 8]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 2, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 4. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 4. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 4. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 2. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, False, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 64, 64]) + assert x_outs[1].shape == torch.Size([2, 512, 64, 64]) + assert x_outs[2].shape == torch.Size([2, 256, 64, 64]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 1. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(False, False, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 128, 128]) + assert x_outs[1].shape == torch.Size([2, 512, 128, 128]) + assert x_outs[2].shape == torch.Size([2, 256, 128, 128]) + assert x_outs[3].shape == torch.Size([2, 128, 128, 128]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 16. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 8, 8]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 8. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 2, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 16, 16]) + assert x_outs[1].shape == torch.Size([2, 512, 16, 16]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet forward and outputs. The whole downsample rate is 4. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) + + # test UNet init_weights method. + unet = UNet( + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 2, 2, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, False, False), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1)) + unet.init_weights(pretrained=None) + print(unet) + x = torch.randn(2, 3, 128, 128) + x_outs = unet(x) + assert x_outs[0].shape == torch.Size([2, 1024, 32, 32]) + assert x_outs[1].shape == torch.Size([2, 512, 32, 32]) + assert x_outs[2].shape == torch.Size([2, 256, 32, 32]) + assert x_outs[3].shape == torch.Size([2, 128, 64, 64]) + assert x_outs[4].shape == torch.Size([2, 64, 128, 128]) diff --git a/tests/test_sampler.py b/tests/test_sampler.py new file mode 100644 index 0000000000000000000000000000000000000000..3c79c16277511db4c470a5cbe7b5aa61b0b0b9bd --- /dev/null +++ b/tests/test_sampler.py @@ -0,0 +1,38 @@ +import pytest +import torch + +from mmseg.core import OHEMPixelSampler +from mmseg.models.decode_heads import FCNHead + + +def _context_for_ohem(): + return FCNHead(in_channels=32, channels=16, num_classes=19) + + +def test_ohem_sampler(): + + with pytest.raises(AssertionError): + # seg_logit and seg_label must be of the same size + sampler = OHEMPixelSampler(context=_context_for_ohem()) + seg_logit = torch.randn(1, 19, 45, 45) + seg_label = torch.randint(0, 19, size=(1, 1, 89, 89)) + sampler.sample(seg_logit, seg_label) + + # test with thresh + sampler = OHEMPixelSampler( + context=_context_for_ohem(), thresh=0.7, min_kept=200) + seg_logit = torch.randn(1, 19, 45, 45) + seg_label = torch.randint(0, 19, size=(1, 1, 45, 45)) + seg_weight = sampler.sample(seg_logit, seg_label) + assert seg_weight.shape[0] == seg_logit.shape[0] + assert seg_weight.shape[1:] == seg_logit.shape[2:] + assert seg_weight.sum() > 200 + + # test w.o thresh + sampler = OHEMPixelSampler(context=_context_for_ohem(), min_kept=200) + seg_logit = torch.randn(1, 19, 45, 45) + seg_label = torch.randint(0, 19, size=(1, 1, 45, 45)) + seg_weight = sampler.sample(seg_logit, seg_label) + assert seg_weight.shape[0] == seg_logit.shape[0] + assert seg_weight.shape[1:] == seg_logit.shape[2:] + assert seg_weight.sum() == 200 diff --git a/tests/test_utils/test_inverted_residual_module.py b/tests/test_utils/test_inverted_residual_module.py new file mode 100644 index 0000000000000000000000000000000000000000..8d5eecf15bf7d5f5ad54aa8e71d61cb40973fa8d --- /dev/null +++ b/tests/test_utils/test_inverted_residual_module.py @@ -0,0 +1,120 @@ +import mmcv +import pytest +import torch + +from mmseg.models.utils import InvertedResidual, InvertedResidualV3 + + +def test_inv_residual(): + with pytest.raises(AssertionError): + # test stride assertion. + InvertedResidual(32, 32, 3, 4) + + # test default config with res connection. + # set expand_ratio = 4, stride = 1 and inp=oup. + inv_module = InvertedResidual(32, 32, 1, 4) + assert inv_module.use_res_connect + assert inv_module.conv[0].kernel_size == (1, 1) + assert inv_module.conv[0].padding == 0 + assert inv_module.conv[1].kernel_size == (3, 3) + assert inv_module.conv[1].padding == 1 + assert inv_module.conv[0].with_norm + assert inv_module.conv[1].with_norm + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 32, 64, 64) + + # test inv_residual module without res connection. + # set expand_ratio = 4, stride = 2. + inv_module = InvertedResidual(32, 32, 2, 4) + assert not inv_module.use_res_connect + assert inv_module.conv[0].kernel_size == (1, 1) + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 32, 32, 32) + + # test expand_ratio == 1 + inv_module = InvertedResidual(32, 32, 1, 1) + assert inv_module.conv[0].kernel_size == (3, 3) + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 32, 64, 64) + + # test with checkpoint forward + inv_module = InvertedResidual(32, 32, 1, 1, with_cp=True) + assert inv_module.with_cp + x = torch.rand(1, 32, 64, 64, requires_grad=True) + output = inv_module(x) + assert output.shape == (1, 32, 64, 64) + + +def test_inv_residualv3(): + with pytest.raises(AssertionError): + # test stride assertion. + InvertedResidualV3(32, 32, 16, stride=3) + + with pytest.raises(AssertionError): + # test assertion. + InvertedResidualV3(32, 32, 16, with_expand_conv=False) + + # test with se_cfg=None, with_expand_conv=False + inv_module = InvertedResidualV3(32, 32, 32, with_expand_conv=False) + + assert inv_module.with_res_shortcut is True + assert inv_module.with_se is False + assert inv_module.with_expand_conv is False + assert not hasattr(inv_module, 'expand_conv') + assert isinstance(inv_module.depthwise_conv.conv, torch.nn.Conv2d) + assert inv_module.depthwise_conv.conv.kernel_size == (3, 3) + assert inv_module.depthwise_conv.conv.stride == (1, 1) + assert inv_module.depthwise_conv.conv.padding == (1, 1) + assert isinstance(inv_module.depthwise_conv.bn, torch.nn.BatchNorm2d) + assert isinstance(inv_module.depthwise_conv.activate, torch.nn.ReLU) + assert inv_module.linear_conv.conv.kernel_size == (1, 1) + assert inv_module.linear_conv.conv.stride == (1, 1) + assert inv_module.linear_conv.conv.padding == (0, 0) + assert isinstance(inv_module.linear_conv.bn, torch.nn.BatchNorm2d) + + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 32, 64, 64) + + # test with se_cfg and with_expand_conv + se_cfg = dict( + channels=16, + ratio=4, + act_cfg=(dict(type='ReLU'), + dict(type='HSigmoid', bias=3.0, divisor=6.0))) + act_cfg = dict(type='HSwish') + inv_module = InvertedResidualV3( + 32, 40, 16, 3, 2, se_cfg=se_cfg, act_cfg=act_cfg) + assert inv_module.with_res_shortcut is False + assert inv_module.with_se is True + assert inv_module.with_expand_conv is True + assert inv_module.expand_conv.conv.kernel_size == (1, 1) + assert inv_module.expand_conv.conv.stride == (1, 1) + assert inv_module.expand_conv.conv.padding == (0, 0) + assert isinstance(inv_module.expand_conv.activate, mmcv.cnn.HSwish) + + assert isinstance(inv_module.depthwise_conv.conv, + mmcv.cnn.bricks.Conv2dAdaptivePadding) + assert inv_module.depthwise_conv.conv.kernel_size == (3, 3) + assert inv_module.depthwise_conv.conv.stride == (2, 2) + assert inv_module.depthwise_conv.conv.padding == (0, 0) + assert isinstance(inv_module.depthwise_conv.bn, torch.nn.BatchNorm2d) + assert isinstance(inv_module.depthwise_conv.activate, mmcv.cnn.HSwish) + assert inv_module.linear_conv.conv.kernel_size == (1, 1) + assert inv_module.linear_conv.conv.stride == (1, 1) + assert inv_module.linear_conv.conv.padding == (0, 0) + assert isinstance(inv_module.linear_conv.bn, torch.nn.BatchNorm2d) + x = torch.rand(1, 32, 64, 64) + output = inv_module(x) + assert output.shape == (1, 40, 32, 32) + + # test with checkpoint forward + inv_module = InvertedResidualV3( + 32, 40, 16, 3, 2, se_cfg=se_cfg, act_cfg=act_cfg, with_cp=True) + assert inv_module.with_cp + x = torch.randn(2, 32, 64, 64, requires_grad=True) + output = inv_module(x) + assert output.shape == (2, 40, 32, 32) diff --git a/tests/test_utils/test_make_divisible.py b/tests/test_utils/test_make_divisible.py new file mode 100644 index 0000000000000000000000000000000000000000..5e9d1062ffcbe3213a22701bad826ae48a52ecee --- /dev/null +++ b/tests/test_utils/test_make_divisible.py @@ -0,0 +1,13 @@ +from mmseg.models.utils import make_divisible + + +def test_make_divisible(): + # test with min_value = None + assert make_divisible(10, 4) == 12 + assert make_divisible(9, 4) == 12 + assert make_divisible(1, 4) == 4 + + # test with min_value = 8 + assert make_divisible(10, 4, 8) == 12 + assert make_divisible(9, 4, 8) == 12 + assert make_divisible(1, 4, 8) == 8 diff --git a/tests/test_utils/test_se_layer.py b/tests/test_utils/test_se_layer.py new file mode 100644 index 0000000000000000000000000000000000000000..8bba7b33b93434a7021c69ee2053451cd4066d9d --- /dev/null +++ b/tests/test_utils/test_se_layer.py @@ -0,0 +1,41 @@ +import mmcv +import pytest +import torch + +from mmseg.models.utils.se_layer import SELayer + + +def test_se_layer(): + with pytest.raises(AssertionError): + # test act_cfg assertion. + SELayer(32, act_cfg=(dict(type='ReLU'), )) + + # test config with channels = 16. + se_layer = SELayer(16) + assert se_layer.conv1.conv.kernel_size == (1, 1) + assert se_layer.conv1.conv.stride == (1, 1) + assert se_layer.conv1.conv.padding == (0, 0) + assert isinstance(se_layer.conv1.activate, torch.nn.ReLU) + assert se_layer.conv2.conv.kernel_size == (1, 1) + assert se_layer.conv2.conv.stride == (1, 1) + assert se_layer.conv2.conv.padding == (0, 0) + assert isinstance(se_layer.conv2.activate, mmcv.cnn.HSigmoid) + + x = torch.rand(1, 16, 64, 64) + output = se_layer(x) + assert output.shape == (1, 16, 64, 64) + + # test config with channels = 16, act_cfg = dict(type='ReLU'). + se_layer = SELayer(16, act_cfg=dict(type='ReLU')) + assert se_layer.conv1.conv.kernel_size == (1, 1) + assert se_layer.conv1.conv.stride == (1, 1) + assert se_layer.conv1.conv.padding == (0, 0) + assert isinstance(se_layer.conv1.activate, torch.nn.ReLU) + assert se_layer.conv2.conv.kernel_size == (1, 1) + assert se_layer.conv2.conv.stride == (1, 1) + assert se_layer.conv2.conv.padding == (0, 0) + assert isinstance(se_layer.conv2.activate, torch.nn.ReLU) + + x = torch.rand(1, 16, 64, 64) + output = se_layer(x) + assert output.shape == (1, 16, 64, 64) diff --git a/tools/benchmark.py b/tools/benchmark.py new file mode 100644 index 0000000000000000000000000000000000000000..cb0df3bdfa65465eb99db2fff4ec80ba08d5bc23 --- /dev/null +++ b/tools/benchmark.py @@ -0,0 +1,82 @@ +import argparse +import time + +import torch +from mmcv import Config +from mmcv.parallel import MMDataParallel +from mmcv.runner import load_checkpoint + +from mmseg.datasets import build_dataloader, build_dataset +from mmseg.models import build_segmentor + + +def parse_args(): + parser = argparse.ArgumentParser(description='MMSeg benchmark a model') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument( + '--log-interval', type=int, default=50, help='interval of logging') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + # set cudnn_benchmark + torch.backends.cudnn.benchmark = False + cfg.model.pretrained = None + cfg.data.test.test_mode = True + + # build the dataloader + # TODO: support multiple images per gpu (only minor changes are needed) + dataset = build_dataset(cfg.data.test) + data_loader = build_dataloader( + dataset, + samples_per_gpu=1, + workers_per_gpu=cfg.data.workers_per_gpu, + dist=False, + shuffle=False) + + # build the model and load checkpoint + cfg.model.train_cfg = None + model = build_segmentor(cfg.model, test_cfg=cfg.get('test_cfg')) + load_checkpoint(model, args.checkpoint, map_location='cpu') + + model = MMDataParallel(model, device_ids=[0]) + + model.eval() + + # the first several iterations may be very slow so skip them + num_warmup = 5 + pure_inf_time = 0 + total_iters = 200 + + # benchmark with 200 image and take the average + for i, data in enumerate(data_loader): + + torch.cuda.synchronize() + start_time = time.perf_counter() + + with torch.no_grad(): + model(return_loss=False, rescale=True, **data) + + torch.cuda.synchronize() + elapsed = time.perf_counter() - start_time + + if i >= num_warmup: + pure_inf_time += elapsed + if (i + 1) % args.log_interval == 0: + fps = (i + 1 - num_warmup) / pure_inf_time + print(f'Done image [{i + 1:<3}/ {total_iters}], ' + f'fps: {fps:.2f} img / s') + + if (i + 1) == total_iters: + fps = (i + 1 - num_warmup) / pure_inf_time + print(f'Overall fps: {fps:.2f} img / s') + break + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/chase_db1.py b/tools/convert_datasets/chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..56bb210edbb359caf57b6048b8e09b94ef295152 --- /dev/null +++ b/tools/convert_datasets/chase_db1.py @@ -0,0 +1,87 @@ +import argparse +import os +import os.path as osp +import tempfile +import zipfile + +import mmcv + +CHASE_DB1_LEN = 28 * 3 +TRAINING_LEN = 60 + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert CHASE_DB1 dataset to mmsegmentation format') + parser.add_argument('dataset_path', help='path of CHASEDB1.zip') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + dataset_path = args.dataset_path + if args.out_dir is None: + out_dir = osp.join('data', 'CHASE_DB1') + else: + out_dir = args.out_dir + + print('Making directories...') + mmcv.mkdir_or_exist(out_dir) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'validation')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'validation')) + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + print('Extracting CHASEDB1.zip...') + zip_file = zipfile.ZipFile(dataset_path) + zip_file.extractall(tmp_dir) + + print('Generating training dataset...') + + assert len(os.listdir(tmp_dir)) == CHASE_DB1_LEN, \ + 'len(os.listdir(tmp_dir)) != {}'.format(CHASE_DB1_LEN) + + for img_name in sorted(os.listdir(tmp_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(tmp_dir, img_name)) + if osp.splitext(img_name)[1] == '.jpg': + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'training', + osp.splitext(img_name)[0] + '.png')) + else: + # The annotation img should be divided by 128, because some of + # the annotation imgs are not standard. We should set a + # threshold to convert the nonstandard annotation imgs. The + # value divided by 128 is equivalent to '1 if value >= 128 + # else 0' + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(img_name)[0] + '.png')) + + for img_name in sorted(os.listdir(tmp_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(tmp_dir, img_name)) + if osp.splitext(img_name)[1] == '.jpg': + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'validation', + osp.splitext(img_name)[0] + '.png')) + else: + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(img_name)[0] + '.png')) + + print('Removing the temporary files...') + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/cityscapes.py b/tools/convert_datasets/cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99d05b41f58c1d2b92a6cbb4f5859c6d696d0ac8 --- /dev/null +++ b/tools/convert_datasets/cityscapes.py @@ -0,0 +1,55 @@ +import argparse +import os.path as osp + +import mmcv +from cityscapesscripts.preparation.json2labelImg import json2labelImg + + +def convert_json_to_label(json_file): + label_file = json_file.replace('_polygons.json', '_labelTrainIds.png') + json2labelImg(json_file, label_file, 'trainIds') + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert Cityscapes annotations to TrainIds') + parser.add_argument('cityscapes_path', help='cityscapes data path') + parser.add_argument('--gt-dir', default='gtFine', type=str) + parser.add_argument('-o', '--out-dir', help='output path') + parser.add_argument( + '--nproc', default=1, type=int, help='number of process') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + cityscapes_path = args.cityscapes_path + out_dir = args.out_dir if args.out_dir else cityscapes_path + mmcv.mkdir_or_exist(out_dir) + + gt_dir = osp.join(cityscapes_path, args.gt_dir) + + poly_files = [] + for poly in mmcv.scandir(gt_dir, '_polygons.json', recursive=True): + poly_file = osp.join(gt_dir, poly) + poly_files.append(poly_file) + if args.nproc > 1: + mmcv.track_parallel_progress(convert_json_to_label, poly_files, + args.nproc) + else: + mmcv.track_progress(convert_json_to_label, poly_files) + + split_names = ['train', 'val', 'test'] + + for split in split_names: + filenames = [] + for poly in mmcv.scandir( + osp.join(gt_dir, split), '_polygons.json', recursive=True): + filenames.append(poly.replace('_gtFine_polygons.json', '')) + with open(osp.join(out_dir, f'{split}.txt'), 'w') as f: + f.writelines(f + '\n' for f in filenames) + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/drive.py b/tools/convert_datasets/drive.py new file mode 100644 index 0000000000000000000000000000000000000000..891f06f725cc7be9da8c65bc0dc56008b8313e30 --- /dev/null +++ b/tools/convert_datasets/drive.py @@ -0,0 +1,112 @@ +import argparse +import os +import os.path as osp +import tempfile +import zipfile + +import cv2 +import mmcv + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert DRIVE dataset to mmsegmentation format') + parser.add_argument( + 'training_path', help='the training part of DRIVE dataset') + parser.add_argument( + 'testing_path', help='the testing part of DRIVE dataset') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + training_path = args.training_path + testing_path = args.testing_path + if args.out_dir is None: + out_dir = osp.join('data', 'DRIVE') + else: + out_dir = args.out_dir + + print('Making directories...') + mmcv.mkdir_or_exist(out_dir) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'validation')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'validation')) + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + print('Extracting training.zip...') + zip_file = zipfile.ZipFile(training_path) + zip_file.extractall(tmp_dir) + + print('Generating training dataset...') + now_dir = osp.join(tmp_dir, 'training', 'images') + for img_name in os.listdir(now_dir): + img = mmcv.imread(osp.join(now_dir, img_name)) + mmcv.imwrite( + img, + osp.join( + out_dir, 'images', 'training', + osp.splitext(img_name)[0].replace('_training', '') + + '.png')) + + now_dir = osp.join(tmp_dir, 'training', '1st_manual') + for img_name in os.listdir(now_dir): + cap = cv2.VideoCapture(osp.join(now_dir, img_name)) + ret, img = cap.read() + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(img_name)[0] + '.png')) + + print('Extracting test.zip...') + zip_file = zipfile.ZipFile(testing_path) + zip_file.extractall(tmp_dir) + + print('Generating validation dataset...') + now_dir = osp.join(tmp_dir, 'test', 'images') + for img_name in os.listdir(now_dir): + img = mmcv.imread(osp.join(now_dir, img_name)) + mmcv.imwrite( + img, + osp.join( + out_dir, 'images', 'validation', + osp.splitext(img_name)[0].replace('_test', '') + '.png')) + + now_dir = osp.join(tmp_dir, 'test', '1st_manual') + if osp.exists(now_dir): + for img_name in os.listdir(now_dir): + cap = cv2.VideoCapture(osp.join(now_dir, img_name)) + ret, img = cap.read() + # The annotation img should be divided by 128, because some of + # the annotation imgs are not standard. We should set a + # threshold to convert the nonstandard annotation imgs. The + # value divided by 128 is equivalent to '1 if value >= 128 + # else 0' + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(img_name)[0] + '.png')) + + now_dir = osp.join(tmp_dir, 'test', '2nd_manual') + if osp.exists(now_dir): + for img_name in os.listdir(now_dir): + cap = cv2.VideoCapture(osp.join(now_dir, img_name)) + ret, img = cap.read() + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(img_name)[0] + '.png')) + + print('Removing the temporary files...') + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/hrf.py b/tools/convert_datasets/hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..bdeb6e7e5668e097f30bc019c88f9eab6c7fcf07 --- /dev/null +++ b/tools/convert_datasets/hrf.py @@ -0,0 +1,110 @@ +import argparse +import os +import os.path as osp +import tempfile +import zipfile + +import mmcv + +HRF_LEN = 15 +TRAINING_LEN = 5 + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert HRF dataset to mmsegmentation format') + parser.add_argument('healthy_path', help='the path of healthy.zip') + parser.add_argument( + 'healthy_manualsegm_path', help='the path of healthy_manualsegm.zip') + parser.add_argument('glaucoma_path', help='the path of glaucoma.zip') + parser.add_argument( + 'glaucoma_manualsegm_path', help='the path of glaucoma_manualsegm.zip') + parser.add_argument( + 'diabetic_retinopathy_path', + help='the path of diabetic_retinopathy.zip') + parser.add_argument( + 'diabetic_retinopathy_manualsegm_path', + help='the path of diabetic_retinopathy_manualsegm.zip') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + images_path = [ + args.healthy_path, args.glaucoma_path, args.diabetic_retinopathy_path + ] + annotations_path = [ + args.healthy_manualsegm_path, args.glaucoma_manualsegm_path, + args.diabetic_retinopathy_manualsegm_path + ] + if args.out_dir is None: + out_dir = osp.join('data', 'HRF') + else: + out_dir = args.out_dir + + print('Making directories...') + mmcv.mkdir_or_exist(out_dir) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'validation')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'validation')) + + print('Generating images...') + for now_path in images_path: + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + zip_file = zipfile.ZipFile(now_path) + zip_file.extractall(tmp_dir) + + assert len(os.listdir(tmp_dir)) == HRF_LEN, \ + 'len(os.listdir(tmp_dir)) != {}'.format(HRF_LEN) + + for filename in sorted(os.listdir(tmp_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(tmp_dir, filename)) + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'training', + osp.splitext(filename)[0] + '.png')) + for filename in sorted(os.listdir(tmp_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(tmp_dir, filename)) + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Generating annotations...') + for now_path in annotations_path: + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + zip_file = zipfile.ZipFile(now_path) + zip_file.extractall(tmp_dir) + + assert len(os.listdir(tmp_dir)) == HRF_LEN, \ + 'len(os.listdir(tmp_dir)) != {}'.format(HRF_LEN) + + for filename in sorted(os.listdir(tmp_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(tmp_dir, filename)) + # The annotation img should be divided by 128, because some of + # the annotation imgs are not standard. We should set a + # threshold to convert the nonstandard annotation imgs. The + # value divided by 128 is equivalent to '1 if value >= 128 + # else 0' + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(filename)[0] + '.png')) + for filename in sorted(os.listdir(tmp_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(tmp_dir, filename)) + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/pascal_context.py b/tools/convert_datasets/pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..dc49ab7ad8fd359c458ec4b6190ed61851426031 --- /dev/null +++ b/tools/convert_datasets/pascal_context.py @@ -0,0 +1,86 @@ +import argparse +import os.path as osp +from functools import partial + +import mmcv +import numpy as np +from detail import Detail +from PIL import Image + +_mapping = np.sort( + np.array([ + 0, 2, 259, 260, 415, 324, 9, 258, 144, 18, 19, 22, 23, 397, 25, 284, + 158, 159, 416, 33, 162, 420, 454, 295, 296, 427, 44, 45, 46, 308, 59, + 440, 445, 31, 232, 65, 354, 424, 68, 326, 72, 458, 34, 207, 80, 355, + 85, 347, 220, 349, 360, 98, 187, 104, 105, 366, 189, 368, 113, 115 + ])) +_key = np.array(range(len(_mapping))).astype('uint8') + + +def generate_labels(img_id, detail, out_dir): + + def _class_to_index(mask, _mapping, _key): + # assert the values + values = np.unique(mask) + for i in range(len(values)): + assert (values[i] in _mapping) + index = np.digitize(mask.ravel(), _mapping, right=True) + return _key[index].reshape(mask.shape) + + mask = Image.fromarray( + _class_to_index(detail.getMask(img_id), _mapping=_mapping, _key=_key)) + filename = img_id['file_name'] + mask.save(osp.join(out_dir, filename.replace('jpg', 'png'))) + return osp.splitext(osp.basename(filename))[0] + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert PASCAL VOC annotations to mmsegmentation format') + parser.add_argument('devkit_path', help='pascal voc devkit path') + parser.add_argument('json_path', help='annoation json filepath') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + devkit_path = args.devkit_path + if args.out_dir is None: + out_dir = osp.join(devkit_path, 'VOC2010', 'SegmentationClassContext') + else: + out_dir = args.out_dir + json_path = args.json_path + mmcv.mkdir_or_exist(out_dir) + img_dir = osp.join(devkit_path, 'VOC2010', 'JPEGImages') + + train_detail = Detail(json_path, img_dir, 'train') + train_ids = train_detail.getImgs() + + val_detail = Detail(json_path, img_dir, 'val') + val_ids = val_detail.getImgs() + + mmcv.mkdir_or_exist( + osp.join(devkit_path, 'VOC2010/ImageSets/SegmentationContext')) + + train_list = mmcv.track_progress( + partial(generate_labels, detail=train_detail, out_dir=out_dir), + train_ids) + with open( + osp.join(devkit_path, 'VOC2010/ImageSets/SegmentationContext', + 'train.txt'), 'w') as f: + f.writelines(line + '\n' for line in sorted(train_list)) + + val_list = mmcv.track_progress( + partial(generate_labels, detail=val_detail, out_dir=out_dir), val_ids) + with open( + osp.join(devkit_path, 'VOC2010/ImageSets/SegmentationContext', + 'val.txt'), 'w') as f: + f.writelines(line + '\n' for line in sorted(val_list)) + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/stare.py b/tools/convert_datasets/stare.py new file mode 100644 index 0000000000000000000000000000000000000000..6238d62f64de9406ef84ebb4667d7c0e1ce8a8c5 --- /dev/null +++ b/tools/convert_datasets/stare.py @@ -0,0 +1,165 @@ +import argparse +import gzip +import os +import os.path as osp +import tarfile +import tempfile + +import mmcv + +STARE_LEN = 20 +TRAINING_LEN = 10 + + +def un_gz(src, dst): + g_file = gzip.GzipFile(src) + with open(dst, 'wb+') as f: + f.write(g_file.read()) + g_file.close() + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert STARE dataset to mmsegmentation format') + parser.add_argument('image_path', help='the path of stare-images.tar') + parser.add_argument('labels_ah', help='the path of labels-ah.tar') + parser.add_argument('labels_vk', help='the path of labels-vk.tar') + parser.add_argument('--tmp_dir', help='path of the temporary directory') + parser.add_argument('-o', '--out_dir', help='output path') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + image_path = args.image_path + labels_ah = args.labels_ah + labels_vk = args.labels_vk + if args.out_dir is None: + out_dir = osp.join('data', 'STARE') + else: + out_dir = args.out_dir + + print('Making directories...') + mmcv.mkdir_or_exist(out_dir) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'images', 'validation')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'training')) + mmcv.mkdir_or_exist(osp.join(out_dir, 'annotations', 'validation')) + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'gz')) + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'files')) + + print('Extracting stare-images.tar...') + with tarfile.open(image_path) as f: + f.extractall(osp.join(tmp_dir, 'gz')) + + for filename in os.listdir(osp.join(tmp_dir, 'gz')): + un_gz( + osp.join(tmp_dir, 'gz', filename), + osp.join(tmp_dir, 'files', + osp.splitext(filename)[0])) + + now_dir = osp.join(tmp_dir, 'files') + + assert len(os.listdir(now_dir)) == STARE_LEN, \ + 'len(os.listdir(now_dir)) != {}'.format(STARE_LEN) + + for filename in sorted(os.listdir(now_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'training', + osp.splitext(filename)[0] + '.png')) + + for filename in sorted(os.listdir(now_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img, + osp.join(out_dir, 'images', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Removing the temporary files...') + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'gz')) + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'files')) + + print('Extracting labels-ah.tar...') + with tarfile.open(labels_ah) as f: + f.extractall(osp.join(tmp_dir, 'gz')) + + for filename in os.listdir(osp.join(tmp_dir, 'gz')): + un_gz( + osp.join(tmp_dir, 'gz', filename), + osp.join(tmp_dir, 'files', + osp.splitext(filename)[0])) + + now_dir = osp.join(tmp_dir, 'files') + + assert len(os.listdir(now_dir)) == STARE_LEN, \ + 'len(os.listdir(now_dir)) != {}'.format(STARE_LEN) + + for filename in sorted(os.listdir(now_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(now_dir, filename)) + # The annotation img should be divided by 128, because some of + # the annotation imgs are not standard. We should set a threshold + # to convert the nonstandard annotation imgs. The value divided by + # 128 equivalent to '1 if value >= 128 else 0' + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(filename)[0] + '.png')) + + for filename in sorted(os.listdir(now_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Removing the temporary files...') + + with tempfile.TemporaryDirectory(dir=args.tmp_dir) as tmp_dir: + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'gz')) + mmcv.mkdir_or_exist(osp.join(tmp_dir, 'files')) + + print('Extracting labels-vk.tar...') + with tarfile.open(labels_vk) as f: + f.extractall(osp.join(tmp_dir, 'gz')) + + for filename in os.listdir(osp.join(tmp_dir, 'gz')): + un_gz( + osp.join(tmp_dir, 'gz', filename), + osp.join(tmp_dir, 'files', + osp.splitext(filename)[0])) + + now_dir = osp.join(tmp_dir, 'files') + + assert len(os.listdir(now_dir)) == STARE_LEN, \ + 'len(os.listdir(now_dir)) != {}'.format(STARE_LEN) + + for filename in sorted(os.listdir(now_dir))[:TRAINING_LEN]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'training', + osp.splitext(filename)[0] + '.png')) + + for filename in sorted(os.listdir(now_dir))[TRAINING_LEN:]: + img = mmcv.imread(osp.join(now_dir, filename)) + mmcv.imwrite( + img[:, :, 0] // 128, + osp.join(out_dir, 'annotations', 'validation', + osp.splitext(filename)[0] + '.png')) + + print('Removing the temporary files...') + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/convert_datasets/voc_aug.py b/tools/convert_datasets/voc_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..942746351b64b2e931cb18ce684a1f3ccf7e3866 --- /dev/null +++ b/tools/convert_datasets/voc_aug.py @@ -0,0 +1,91 @@ +import argparse +import os.path as osp +from functools import partial + +import mmcv +import numpy as np +from PIL import Image +from scipy.io import loadmat + +AUG_LEN = 10582 + + +def convert_mat(mat_file, in_dir, out_dir): + data = loadmat(osp.join(in_dir, mat_file)) + mask = data['GTcls'][0]['Segmentation'][0].astype(np.uint8) + seg_filename = osp.join(out_dir, mat_file.replace('.mat', '.png')) + Image.fromarray(mask).save(seg_filename, 'PNG') + + +def generate_aug_list(merged_list, excluded_list): + return list(set(merged_list) - set(excluded_list)) + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert PASCAL VOC annotations to mmsegmentation format') + parser.add_argument('devkit_path', help='pascal voc devkit path') + parser.add_argument('aug_path', help='pascal voc aug path') + parser.add_argument('-o', '--out_dir', help='output path') + parser.add_argument( + '--nproc', default=1, type=int, help='number of process') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + devkit_path = args.devkit_path + aug_path = args.aug_path + nproc = args.nproc + if args.out_dir is None: + out_dir = osp.join(devkit_path, 'VOC2012', 'SegmentationClassAug') + else: + out_dir = args.out_dir + mmcv.mkdir_or_exist(out_dir) + in_dir = osp.join(aug_path, 'dataset', 'cls') + + mmcv.track_parallel_progress( + partial(convert_mat, in_dir=in_dir, out_dir=out_dir), + list(mmcv.scandir(in_dir, suffix='.mat')), + nproc=nproc) + + full_aug_list = [] + with open(osp.join(aug_path, 'dataset', 'train.txt')) as f: + full_aug_list += [line.strip() for line in f] + with open(osp.join(aug_path, 'dataset', 'val.txt')) as f: + full_aug_list += [line.strip() for line in f] + + with open( + osp.join(devkit_path, 'VOC2012/ImageSets/Segmentation', + 'train.txt')) as f: + ori_train_list = [line.strip() for line in f] + with open( + osp.join(devkit_path, 'VOC2012/ImageSets/Segmentation', + 'val.txt')) as f: + val_list = [line.strip() for line in f] + + aug_train_list = generate_aug_list(ori_train_list + full_aug_list, + val_list) + assert len(aug_train_list) == AUG_LEN, 'len(aug_train_list) != {}'.format( + AUG_LEN) + + with open( + osp.join(devkit_path, 'VOC2012/ImageSets/Segmentation', + 'trainaug.txt'), 'w') as f: + f.writelines(line + '\n' for line in aug_train_list) + + aug_list = generate_aug_list(full_aug_list, ori_train_list + val_list) + assert len(aug_list) == AUG_LEN - len( + ori_train_list), 'len(aug_list) != {}'.format(AUG_LEN - + len(ori_train_list)) + with open( + osp.join(devkit_path, 'VOC2012/ImageSets/Segmentation', 'aug.txt'), + 'w') as f: + f.writelines(line + '\n' for line in aug_list) + + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/dist_test.sh b/tools/dist_test.sh new file mode 100644 index 0000000000000000000000000000000000000000..34fb46541d447d923bc3561bbba09bd5c94d7bfe --- /dev/null +++ b/tools/dist_test.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +CONFIG=$1 +CHECKPOINT=$2 +GPUS=$3 +PORT=${PORT:-29500} +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +python -m torch.distributed.launch --nproc_per_node=$GPUS --master_port=$PORT \ + $(dirname "$0")/test.py $CONFIG $CHECKPOINT --launcher pytorch ${@:4} diff --git a/tools/dist_train.sh b/tools/dist_train.sh new file mode 100644 index 0000000000000000000000000000000000000000..1fcfc8bb1a6604359199b634cc7a19d257ade12e --- /dev/null +++ b/tools/dist_train.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +GPUS=$1 +PORT=${PORT:-29500} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +python -m torch.distributed.launch --nproc_per_node=$GPUS --master_port=$PORT \ + $(dirname "$0")/train.py --launcher pytorch ${@:2} diff --git a/tools/get_flops.py b/tools/get_flops.py new file mode 100644 index 0000000000000000000000000000000000000000..bc98c5252591b0c9ec218144c0652ea695a5b96e --- /dev/null +++ b/tools/get_flops.py @@ -0,0 +1,58 @@ +import argparse + +from mmcv import Config +from mmcv.cnn import get_model_complexity_info + +from mmseg.models import build_segmentor + + +def parse_args(): + parser = argparse.ArgumentParser(description='Train a segmentor') + parser.add_argument('config', help='train config file path') + parser.add_argument( + '--shape', + type=int, + nargs='+', + default=[2048, 1024], + help='input image size') + args = parser.parse_args() + return args + + +def main(): + + args = parse_args() + + if len(args.shape) == 1: + input_shape = (3, args.shape[0], args.shape[0]) + elif len(args.shape) == 2: + input_shape = (3, ) + tuple(args.shape) + else: + raise ValueError('invalid input shape') + + cfg = Config.fromfile(args.config) + cfg.model.pretrained = None + model = build_segmentor( + cfg.model, + train_cfg=cfg.get('train_cfg'), + test_cfg=cfg.get('test_cfg')).cuda() + model.eval() + + if hasattr(model, 'forward_dummy'): + model.forward = model.forward_dummy + else: + raise NotImplementedError( + 'FLOPs counter is currently not currently supported with {}'. + format(model.__class__.__name__)) + + flops, params = get_model_complexity_info(model, input_shape) + split_line = '=' * 30 + print('{0}\nInput shape: {1}\nFlops: {2}\nParams: {3}\n{0}'.format( + split_line, input_shape, flops, params)) + print('!!!Please be cautious if you use the results in papers. ' + 'You may need to check if all ops are supported and verify that the ' + 'flops computation is correct.') + + +if __name__ == '__main__': + main() diff --git a/tools/print_config.py b/tools/print_config.py new file mode 100644 index 0000000000000000000000000000000000000000..2a0c67780a0620fff1d8748db28177ca3ddcc0ca --- /dev/null +++ b/tools/print_config.py @@ -0,0 +1,28 @@ +import argparse + +from mmcv import Config, DictAction + + +def parse_args(): + parser = argparse.ArgumentParser(description='Print the whole config') + parser.add_argument('config', help='config file path') + parser.add_argument( + '--options', nargs='+', action=DictAction, help='arguments in dict') + args = parser.parse_args() + + return args + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + if args.options is not None: + cfg.merge_from_dict(args.options) + print(f'Config:\n{cfg.pretty_text}') + # dump config + cfg.dump('example.py') + + +if __name__ == '__main__': + main() diff --git a/tools/publish_model.py b/tools/publish_model.py new file mode 100644 index 0000000000000000000000000000000000000000..a049f17674b7a1aa730057e5cc294d2368fe707c --- /dev/null +++ b/tools/publish_model.py @@ -0,0 +1,35 @@ +import argparse +import subprocess + +import torch + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Process a checkpoint to be published') + parser.add_argument('in_file', help='input checkpoint filename') + parser.add_argument('out_file', help='output checkpoint filename') + args = parser.parse_args() + return args + + +def process_checkpoint(in_file, out_file): + checkpoint = torch.load(in_file, map_location='cpu') + # remove optimizer for smaller file size + if 'optimizer' in checkpoint: + del checkpoint['optimizer'] + # if it is necessary to remove some sensitive data in checkpoint['meta'], + # add the code here. + torch.save(checkpoint, out_file) + sha = subprocess.check_output(['sha256sum', out_file]).decode() + final_file = out_file.rstrip('.pth') + '-{}.pth'.format(sha[:8]) + subprocess.Popen(['mv', out_file, final_file]) + + +def main(): + args = parse_args() + process_checkpoint(args.in_file, args.out_file) + + +if __name__ == '__main__': + main() diff --git a/tools/pytorch2onnx.py b/tools/pytorch2onnx.py new file mode 100644 index 0000000000000000000000000000000000000000..2ec9feb59a86db61a8368d2239f8ef0dcb461d41 --- /dev/null +++ b/tools/pytorch2onnx.py @@ -0,0 +1,200 @@ +import argparse +from functools import partial + +import mmcv +import numpy as np +import onnxruntime as rt +import torch +import torch._C +import torch.serialization +from mmcv.onnx import register_extra_symbolics +from mmcv.runner import load_checkpoint +from torch import nn + +from mmseg.models import build_segmentor + +torch.manual_seed(3) + + +def _convert_batchnorm(module): + module_output = module + if isinstance(module, torch.nn.SyncBatchNorm): + module_output = torch.nn.BatchNorm2d(module.num_features, module.eps, + module.momentum, module.affine, + module.track_running_stats) + if module.affine: + module_output.weight.data = module.weight.data.clone().detach() + module_output.bias.data = module.bias.data.clone().detach() + # keep requires_grad unchanged + module_output.weight.requires_grad = module.weight.requires_grad + module_output.bias.requires_grad = module.bias.requires_grad + module_output.running_mean = module.running_mean + module_output.running_var = module.running_var + module_output.num_batches_tracked = module.num_batches_tracked + for name, child in module.named_children(): + module_output.add_module(name, _convert_batchnorm(child)) + del module + return module_output + + +def _demo_mm_inputs(input_shape, num_classes): + """Create a superset of inputs needed to run test or train batches. + + Args: + input_shape (tuple): + input batch dimensions + num_classes (int): + number of semantic classes + """ + (N, C, H, W) = input_shape + rng = np.random.RandomState(0) + imgs = rng.rand(*input_shape) + segs = rng.randint( + low=0, high=num_classes - 1, size=(N, 1, H, W)).astype(np.uint8) + img_metas = [{ + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': 1.0, + 'flip': False, + } for _ in range(N)] + mm_inputs = { + 'imgs': torch.FloatTensor(imgs).requires_grad_(True), + 'img_metas': img_metas, + 'gt_semantic_seg': torch.LongTensor(segs) + } + return mm_inputs + + +def pytorch2onnx(model, + input_shape, + opset_version=11, + show=False, + output_file='tmp.onnx', + verify=False): + """Export Pytorch model to ONNX model and verify the outputs are same + between Pytorch and ONNX. + + Args: + model (nn.Module): Pytorch model we want to export. + input_shape (tuple): Use this input shape to construct + the corresponding dummy input and execute the model. + opset_version (int): The onnx op version. Default: 11. + show (bool): Whether print the computation graph. Default: False. + output_file (string): The path to where we store the output ONNX model. + Default: `tmp.onnx`. + verify (bool): Whether compare the outputs between Pytorch and ONNX. + Default: False. + """ + model.cpu().eval() + + if isinstance(model.decode_head, nn.ModuleList): + num_classes = model.decode_head[-1].num_classes + else: + num_classes = model.decode_head.num_classes + + mm_inputs = _demo_mm_inputs(input_shape, num_classes) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + img_list = [img[None, :] for img in imgs] + img_meta_list = [[img_meta] for img_meta in img_metas] + + # replace original forward function + origin_forward = model.forward + model.forward = partial( + model.forward, img_metas=img_meta_list, return_loss=False) + + register_extra_symbolics(opset_version) + with torch.no_grad(): + torch.onnx.export( + model, (img_list, ), + output_file, + export_params=True, + keep_initializers_as_inputs=True, + verbose=show, + opset_version=opset_version) + print(f'Successfully exported ONNX model: {output_file}') + model.forward = origin_forward + + if verify: + # check by onnx + import onnx + onnx_model = onnx.load(output_file) + onnx.checker.check_model(onnx_model) + + # check the numerical value + # get pytorch output + pytorch_result = model(img_list, img_meta_list, return_loss=False)[0] + + # get onnx output + input_all = [node.name for node in onnx_model.graph.input] + input_initializer = [ + node.name for node in onnx_model.graph.initializer + ] + net_feed_input = list(set(input_all) - set(input_initializer)) + assert (len(net_feed_input) == 1) + sess = rt.InferenceSession(output_file) + onnx_result = sess.run( + None, {net_feed_input[0]: img_list[0].detach().numpy()})[0] + if not np.allclose(pytorch_result, onnx_result): + raise ValueError( + 'The outputs are different between Pytorch and ONNX') + print('The outputs are same between Pytorch and ONNX') + + +def parse_args(): + parser = argparse.ArgumentParser(description='Convert MMSeg to ONNX') + parser.add_argument('config', help='test config file path') + parser.add_argument('--checkpoint', help='checkpoint file', default=None) + parser.add_argument('--show', action='store_true', help='show onnx graph') + parser.add_argument( + '--verify', action='store_true', help='verify the onnx model') + parser.add_argument('--output-file', type=str, default='tmp.onnx') + parser.add_argument('--opset-version', type=int, default=11) + parser.add_argument( + '--shape', + type=int, + nargs='+', + default=[256, 256], + help='input image size') + args = parser.parse_args() + return args + + +if __name__ == '__main__': + args = parse_args() + + if len(args.shape) == 1: + input_shape = (1, 3, args.shape[0], args.shape[0]) + elif len(args.shape) == 2: + input_shape = ( + 1, + 3, + ) + tuple(args.shape) + else: + raise ValueError('invalid input shape') + + cfg = mmcv.Config.fromfile(args.config) + cfg.model.pretrained = None + + # build the model and load checkpoint + cfg.model.train_cfg = None + segmentor = build_segmentor( + cfg.model, train_cfg=None, test_cfg=cfg.get('test_cfg')) + # convert SyncBN to BN + segmentor = _convert_batchnorm(segmentor) + + if args.checkpoint: + load_checkpoint(segmentor, args.checkpoint, map_location='cpu') + + # conver model to onnx file + pytorch2onnx( + segmentor, + input_shape, + opset_version=args.opset_version, + show=args.show, + output_file=args.output_file, + verify=args.verify) diff --git a/tools/slurm_test.sh b/tools/slurm_test.sh new file mode 100644 index 0000000000000000000000000000000000000000..4e6f7bf4e33267f269cf0f455924cb70166ccd4b --- /dev/null +++ b/tools/slurm_test.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -x + +PARTITION=$1 +JOB_NAME=$2 +CONFIG=$3 +CHECKPOINT=$4 +GPUS=${GPUS:-4} +GPUS_PER_NODE=${GPUS_PER_NODE:-4} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} +PY_ARGS=${@:5} +SRUN_ARGS=${SRUN_ARGS:-""} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +srun -p ${PARTITION} \ + --job-name=${JOB_NAME} \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks=${GPUS} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=${CPUS_PER_TASK} \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u tools/test.py ${CONFIG} ${CHECKPOINT} --launcher="slurm" ${PY_ARGS} diff --git a/tools/slurm_train.sh b/tools/slurm_train.sh new file mode 100644 index 0000000000000000000000000000000000000000..ab232105f0309c720ed81a522eca14b6fbd64afd --- /dev/null +++ b/tools/slurm_train.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -x + +PARTITION=$1 +JOB_NAME=$2 +CONFIG=$3 +GPUS=${GPUS:-4} +GPUS_PER_NODE=${GPUS_PER_NODE:-4} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} +SRUN_ARGS=${SRUN_ARGS:-""} +PY_ARGS=${@:4} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +srun -p ${PARTITION} \ + --job-name=${JOB_NAME} \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks=${GPUS} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=${CPUS_PER_TASK} \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u tools/train.py ${CONFIG} --launcher="slurm" ${PY_ARGS} diff --git a/tools/test.py b/tools/test.py new file mode 100644 index 0000000000000000000000000000000000000000..a106f04626c44326ff081ffc62c1456f55a19be2 --- /dev/null +++ b/tools/test.py @@ -0,0 +1,148 @@ +import argparse +import os + +import mmcv +import torch +from mmcv.parallel import MMDataParallel, MMDistributedDataParallel +from mmcv.runner import get_dist_info, init_dist, load_checkpoint +from mmcv.utils import DictAction + +from mmseg.apis import multi_gpu_test, single_gpu_test +from mmseg.datasets import build_dataloader, build_dataset +from mmseg.models import build_segmentor + + +def parse_args(): + parser = argparse.ArgumentParser( + description='mmseg test (and eval) a model') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument( + '--aug-test', action='store_true', help='Use Flip and Multi scale aug') + parser.add_argument('--out', help='output result file in pickle format') + parser.add_argument( + '--format-only', + action='store_true', + help='Format the output results without perform evaluation. It is' + 'useful when you want to format the result to a specific format and ' + 'submit it to the test server') + parser.add_argument( + '--eval', + type=str, + nargs='+', + help='evaluation metrics, which depends on the dataset, e.g., "mIoU"' + ' for generic datasets, and "cityscapes" for Cityscapes') + parser.add_argument('--show', action='store_true', help='show results') + parser.add_argument( + '--show-dir', help='directory where painted images will be saved') + parser.add_argument( + '--gpu-collect', + action='store_true', + help='whether to use gpu to collect results.') + parser.add_argument( + '--tmpdir', + help='tmp directory used for collecting results from multiple ' + 'workers, available when gpu_collect is not specified') + parser.add_argument( + '--options', nargs='+', action=DictAction, help='custom options') + parser.add_argument( + '--eval-options', + nargs='+', + action=DictAction, + help='custom options for evaluation') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + return args + + +def main(): + args = parse_args() + + assert args.out or args.eval or args.format_only or args.show \ + or args.show_dir, \ + ('Please specify at least one operation (save/eval/format/show the ' + 'results / save the results) with the argument "--out", "--eval"' + ', "--format-only", "--show" or "--show-dir"') + + if args.eval and args.format_only: + raise ValueError('--eval and --format_only cannot be both specified') + + if args.out is not None and not args.out.endswith(('.pkl', '.pickle')): + raise ValueError('The output file must be a pkl file.') + + cfg = mmcv.Config.fromfile(args.config) + if args.options is not None: + cfg.merge_from_dict(args.options) + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + if args.aug_test: + # hard code index + cfg.data.test.pipeline[1].img_ratios = [ + 0.5, 0.75, 1.0, 1.25, 1.5, 1.75 + ] + cfg.data.test.pipeline[1].flip = True + cfg.model.pretrained = None + cfg.data.test.test_mode = True + + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + distributed = False + else: + distributed = True + init_dist(args.launcher, **cfg.dist_params) + + # build the dataloader + # TODO: support multiple images per gpu (only minor changes are needed) + dataset = build_dataset(cfg.data.test) + data_loader = build_dataloader( + dataset, + samples_per_gpu=1, + workers_per_gpu=cfg.data.workers_per_gpu, + dist=distributed, + shuffle=False) + + # build the model and load checkpoint + cfg.model.train_cfg = None + model = build_segmentor(cfg.model, test_cfg=cfg.get('test_cfg')) + checkpoint = load_checkpoint(model, args.checkpoint, map_location='cpu') + model.CLASSES = checkpoint['meta']['CLASSES'] + model.PALETTE = checkpoint['meta']['PALETTE'] + + efficient_test = False + if args.eval_options is not None: + efficient_test = args.eval_options.get('efficient_test', False) + + if not distributed: + model = MMDataParallel(model, device_ids=[0]) + outputs = single_gpu_test(model, data_loader, args.show, args.show_dir, + efficient_test) + else: + model = MMDistributedDataParallel( + model.cuda(), + device_ids=[torch.cuda.current_device()], + broadcast_buffers=False) + outputs = multi_gpu_test(model, data_loader, args.tmpdir, + args.gpu_collect, efficient_test) + + rank, _ = get_dist_info() + if rank == 0: + if args.out: + print(f'\nwriting results to {args.out}') + mmcv.dump(outputs, args.out) + kwargs = {} if args.eval_options is None else args.eval_options + if args.format_only: + dataset.format_results(outputs, **kwargs) + if args.eval: + dataset.evaluate(outputs, args.eval, **kwargs) + + +if __name__ == '__main__': + main() diff --git a/tools/train.py b/tools/train.py new file mode 100644 index 0000000000000000000000000000000000000000..890cafd992548dbaaf41e5775499de06754b54e6 --- /dev/null +++ b/tools/train.py @@ -0,0 +1,167 @@ +import argparse +import copy +import os +import os.path as osp +import time + +import mmcv +import torch +from mmcv.runner import init_dist +from mmcv.utils import Config, DictAction, get_git_hash + +from mmseg import __version__ +from mmseg.apis import set_random_seed, train_segmentor +from mmseg.datasets import build_dataset +from mmseg.models import build_segmentor +from mmseg.utils import collect_env, get_root_logger + + +# os.environ["CUDA_VISIBLE_DEVICES"] = "0" + + +def parse_args(): + parser = argparse.ArgumentParser(description='Train a segmentor') + parser.add_argument('--config',default="/SEG/mmsegmentation/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py", help='train config file path') + parser.add_argument('--work-dir',default="/SEG/mmsegmentation/checkpoints/ccnet/recipe1m_train2", help='the dir to save logs and models') + parser.add_argument( + '--load-from', help='the checkpoint file to load weights from') + parser.add_argument( + '--resume-from', help='the checkpoint file to resume from') + parser.add_argument( + '--no-validate', + action='store_true', + help='whether not to evaluate the checkpoint during training') + group_gpus = parser.add_mutually_exclusive_group() + group_gpus.add_argument( + '--gpus', + type=int, + help='number of gpus to use ' + '(only applicable to non-distributed training)') + group_gpus.add_argument( + '--gpu-ids', + type=int, + nargs='+', + help='ids of gpus to use ' + '(only applicable to non-distributed training)') + parser.add_argument('--seed', type=int, default=None, help='random seed') + parser.add_argument( + '--deterministic', + action='store_true', + help='whether to set deterministic options for CUDNN backend.') + parser.add_argument( + '--options', nargs='+', action=DictAction, help='custom options') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + + return args + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + if args.options is not None: + cfg.merge_from_dict(args.options) + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + + # work_dir is determined in this priority: CLI > segment in file > filename + if args.work_dir is not None: + # update configs according to CLI args if args.work_dir is not None + cfg.work_dir = args.work_dir + elif cfg.get('work_dir', None) is None: + # use config filename as default work_dir if cfg.work_dir is None + cfg.work_dir = osp.join('./work_dirs', + osp.splitext(osp.basename(args.config))[0]) + if args.load_from is not None: + cfg.load_from = args.load_from + if args.resume_from is not None: + cfg.resume_from = args.resume_from + if args.gpu_ids is not None: + cfg.gpu_ids = args.gpu_ids + else: + cfg.gpu_ids = range(1) if args.gpus is None else range(args.gpus) + + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + distributed = False + else: + distributed = True + init_dist(args.launcher, **cfg.dist_params) + + # create work_dir + mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir)) + # dump config + cfg.dump(osp.join(cfg.work_dir, osp.basename(args.config))) + # init the logger before other steps + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + log_file = osp.join(cfg.work_dir, f'{timestamp}.log') + logger = get_root_logger(log_file=log_file, log_level=cfg.log_level) + + # init the meta dict to record some important information such as + # environment info and seed, which will be logged + meta = dict() + # log env info + env_info_dict = collect_env() + env_info = '\n'.join([f'{k}: {v}' for k, v in env_info_dict.items()]) + dash_line = '-' * 60 + '\n' + logger.info('Environment info:\n' + dash_line + env_info + '\n' + + dash_line) + meta['env_info'] = env_info + + # log some basic info + logger.info(f'Distributed training: {distributed}') + logger.info(f'Config:\n{cfg.pretty_text}') + + # set random seeds + if args.seed is not None: + logger.info(f'Set random seed to {args.seed}, deterministic: ' + f'{args.deterministic}') + set_random_seed(args.seed, deterministic=args.deterministic) + cfg.seed = args.seed + meta['seed'] = args.seed + meta['exp_name'] = osp.basename(args.config) + + model = build_segmentor( + cfg.model, + train_cfg=cfg.get('train_cfg'), + test_cfg=cfg.get('test_cfg')) + + logger.info(model) + + datasets = [build_dataset(cfg.data.train)] + if len(cfg.workflow) == 2: + val_dataset = copy.deepcopy(cfg.data.val) + val_dataset.pipeline = cfg.data.train.pipeline + datasets.append(build_dataset(val_dataset)) + if cfg.checkpoint_config is not None: + # save mmseg version, config file content and class names in + # checkpoints as meta data + cfg.checkpoint_config.meta = dict( + mmseg_version=f'{__version__}+{get_git_hash()[:7]}', + config=cfg.pretty_text, + CLASSES=datasets[0].CLASSES, + PALETTE=datasets[0].PALETTE) + # add an attribute for visualization convenience + model.CLASSES = datasets[0].CLASSES + + train_segmentor( + model, + datasets, + cfg, + distributed=distributed, + validate=(not args.no_validate), + timestamp=timestamp, + meta=meta) + + +if __name__ == '__main__': + main()