diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..b1d94f442883925b829316c1a91b21e75fe7080d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,12 @@ saved_model/**/* 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 +FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000399.jpg filter=lfs diff=lfs merge=lfs -text +FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001520.jpg filter=lfs diff=lfs merge=lfs -text +FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001905.jpg filter=lfs diff=lfs merge=lfs -text +FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002559.jpg filter=lfs diff=lfs merge=lfs -text +FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003337.jpg filter=lfs diff=lfs merge=lfs -text +FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004114.jpg filter=lfs diff=lfs merge=lfs -text +FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006307.jpg filter=lfs diff=lfs merge=lfs -text +FoodSeg103/demo/mmcv/docs/en/_static/flow_raw_images.png filter=lfs diff=lfs merge=lfs -text +FoodSeg103/demo/mmcv/docs/en/_static/flow_warp_diff.png filter=lfs diff=lfs merge=lfs -text diff --git a/FoodSeg103/.DS_Store b/FoodSeg103/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d2c3d824dd4c99804127d5b91855d477c24071ce Binary files /dev/null and b/FoodSeg103/.DS_Store differ diff --git a/FoodSeg103/.dev/gather_models.py b/FoodSeg103/.dev/gather_models.py new file mode 100644 index 0000000000000000000000000000000000000000..1899195d7dc90088e89a424c8c749f075e4e18d6 --- /dev/null +++ b/FoodSeg103/.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/FoodSeg103/.dev/upload_modelzoo.py b/FoodSeg103/.dev/upload_modelzoo.py new file mode 100644 index 0000000000000000000000000000000000000000..bd78bc41e69c3b603e7bbb4ee8a6c420ad87e26b --- /dev/null +++ b/FoodSeg103/.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/FoodSeg103/.gitignore b/FoodSeg103/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..9b7cffbc88b17eb033ca403bed5c6254a539e73c --- /dev/null +++ b/FoodSeg103/.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/FoodSeg103/.pre-commit-config.yaml b/FoodSeg103/.pre-commit-config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d3395dc284edbae1fea7006ee7c8967ea62a3b45 --- /dev/null +++ b/FoodSeg103/.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/FoodSeg103/.readthedocs.yml b/FoodSeg103/.readthedocs.yml new file mode 100644 index 0000000000000000000000000000000000000000..73ea4cb7e95530cd18ed94895ca38edd531f0d94 --- /dev/null +++ b/FoodSeg103/.readthedocs.yml @@ -0,0 +1,7 @@ +version: 2 + +python: + version: 3.7 + install: + - requirements: requirements/docs.txt + - requirements: requirements/readthedocs.txt diff --git a/FoodSeg103/.tags b/FoodSeg103/.tags new file mode 100644 index 0000000000000000000000000000000000000000..bde6d2877474357e0a809846f12c0be9c14f4c7d --- /dev/null +++ b/FoodSeg103/.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/FoodSeg103/.tags_sorted_by_file b/FoodSeg103/.tags_sorted_by_file new file mode 100644 index 0000000000000000000000000000000000000000..e8030a12c49274a2649e6a5904cce7a2fb91fe51 --- /dev/null +++ b/FoodSeg103/.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/FoodSeg103/LICENSE b/FoodSeg103/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..38e625bf59f9ba58f16f758bebaad865030c1e3e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/README.md b/FoodSeg103/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8971386332f73c4d90428b2fa8daf4949f56347d --- /dev/null +++ b/FoodSeg103/README.md @@ -0,0 +1,119 @@ +# A Large-Scale Benchmark for Food Image Segmentation + +By [Xiongwei Wu](http://xiongweiwu.github.io/), [Xin Fu](https://xinfu607.github.io/), Ying Liu, [Ee-Peng Lim](http://www.mysmu.edu/faculty/eplim/), [Steven C.H. Hoi](https://sites.google.com/view/stevenhoi/home/), [Qianru Sun](https://qianrusun.com/). + + +
+ +
+
+ +## Introduction + +We build a new food image dataset FoodSeg103 containing 7,118 images. We annotate these images with 104 ingredient classes and each image has an average of 6 ingredient labels and pixel-wise masks. +In addition, we propose a multi-modality pre-training approach called ReLeM that explicitly equips a segmentation model with rich and semantic food knowledge. + +In this software, we use three popular semantic segmentation methods (i.e., Dilated Convolution based, Feature Pyramid based, and Vision Transformer based) as baselines, and evaluate them as well as ReLeM on our new datasets. We believe that the FoodSeg103 and the pre-trained models using ReLeM can serve as a benchmark to facilitate future works on fine-grained food image understanding. + +Please refer our [paper](https://arxiv.org/abs/2105.05409) and our [homepage](https://xiongweiwu.github.io/foodseg103.html) for more details. + +## License + +This project is released under the [Apache 2.0 license](LICENSE). + + +## Installation + +Please refer to [get_started.md](docs/get_started.md#installation) for installation. + +## Dataset + +Please download the file from [url](https://research.larc.smu.edu.sg/downloads/datarepo/FoodSeg103.zip) and unzip the data in ./data folder (./data/FoodSeg103/), with passwd: LARCdataset9947 + +## Leaderboard + +Please refer to [leaderboard](https://paperswithcode.com/dataset/foodseg103) in paperwithcode website. + +## Benchmark and model zoo + +:exclamation::exclamation::exclamation: **We have finished the course so the models are available again. Please download the trained models from THIS [link](https://smu-my.sharepoint.com/:u:/g/personal/xwwu_smu_edu_sg/EWBcCC3QrO9LthKX66QCzyoBhFU7PHXKcHhh1lgIC98uKw?e=bHT7vM):eyes: .** + +Encoder | Decoder | Crop Size | Batch Size |mIoU | mAcc | Link +--- |:---:|:---:|:---:|:---:|:---:|:---: +R-50 | [FPN](https://arxiv.org/abs/1901.02446) | 512x1024 | 8 | 27.8 | 38.2 | [Model+Config](https://drive.google.com/drive/folders/1CQ5CXxASAoobj7bKqyuvazkeusqMAM4F?usp=sharing) +ReLeM-R-50 | FPN | 512x1024 | 8 | 29.1 | 39.8 | [Model+Config](https://drive.google.com/drive/folders/1m7N2EE8jkX67a0lD6GZ4NQgr4gEcWpDU?usp=sharing) +R-50 | [CCNet](https://arxiv.org/abs/1811.11721) | 512x1024 | 8 | 35.5 | 45.3 | [Model+Config](https://drive.google.com/drive/folders/1pNPbtrGqCq_Zlina2PCs6X8bIvY9ZZxG?usp=sharing) +ReLeM-R-50 | CCNet | 512x1024 | 8 | 36.8 | 47.4 | [Model+Config](https://drive.google.com/drive/folders/1FWwxAsZzDnBbDBEbohqOA8htyWgMLM4U?usp=sharing) +[PVT-S](https://arxiv.org/abs/2102.12122) | FPN | 512x1024 | 8 | 31.3 | 43.0 | Model+Config +ReLeM-PVT-S | FPN | 512x1024 | 8 | 32.0 | 44.1 | Model+Config +[ViT-16/B](https://openreview.net/forum?id=YicbFdNTTy) | [Naive](https://arxiv.org/abs/2012.15840) | 768x768 | 4 | 41.3 | 52.7 | [Model+Config](https://drive.google.com/drive/folders/19b3VG906CA-5kQFaJVk5U6kDxnw9HcWL?usp=sharing) +ReLeM-ViT-16/B | Naive | 768x768 | 4 | 43.9 | 57.0 | [Model+Config](https://drive.google.com/drive/folders/10yKiu8aMeTGphU2CKT2ybeAC3ezgDnXP?usp=sharing) +ViT-16/B | PUP | 768x768 | 4 | 38.5 | 49.1 | Model+Config +ReLeM-ViT-16/B | PUP | 768x768 | 4 | 42.5 | 53.9 | Model+Config +ViT-16/B | [MLA](https://arxiv.org/abs/2012.15840) | 768x768 | 4 | 45.1 | 57.4 | [Model+Config](https://drive.google.com/drive/folders/17Ht1HQDaBJmS0FXaXGjHk0VQNhAJxrlF?usp=sharing) +ReLeM-ViT-16/B | MLA | 768x768 | 4 | 43.3 | 55.9 | [Model+Config](https://drive.google.com/drive/folders/12OlkStefNmELNLo-xJqc-lE-kPZ7DvPV?usp=sharing) +[ViT-16/L](https://openreview.net/forum?id=YicbFdNTTy) | MLA | 768x768 | 4 | 44.5 | 56.6 | [Model+Config](https://drive.google.com/drive/folders/1PS4uh2zktNc0hh-mSLZkRTqgNnkfh7xu?usp=sharing) +[Swin-S](https://arxiv.org/abs/2103.14030) | [UperNet](https://arxiv.org/abs/1807.10221) | 512x1024 | 8 | 41.6 | 53.6 | [Model+Config](https://drive.google.com/drive/folders/1E5fZga8h65dNZCX1m8zywvB8MwrleFNg?usp=sharing) +[Swin-B](https://arxiv.org/abs/2103.14030) | UperNet | 512x1024 | 8 | 41.2 | 53.9 | [Model+Config](https://drive.google.com/drive/folders/1kqOsH51h1pa-88tbFVUV3mmzTNCGzqd0?usp=sharing) + + +[1] *We do not include the implementation of [swin](https://arxiv.org/abs/2103.14030) in this software. You can use the official [implementation](https://github.com/SwinTransformer/Swin-Transformer-Semantic-Segmentation) based on our provided models.* \ +[2] *We use Step-wise learning policy to train PVT model since we found this policy can yield higher performance, and for other baselines we adopt the default settings.* \ +[3] *We use Recipe1M to train ReLeM-PVT-S while other ReLeM models are trained with Recipe1M+ due to time limitation.* + + + +## Train & Test + +Train script: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-300} tools/train.py --config [config] --work-dir [work-dir] --launcher pytorch +``` + +Exmaple: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-300} tools/train.py --config configs/foodnet/SETR_Naive_768x768_80k_base_RM.py --work-dir checkpoints/SETR_Naive_ReLeM --launcher pytorch +``` + +Test script: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-999} tools/test.py [config] [weights] --launcher pytorch --eval mIoU +``` + +Example: + +``` + CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port=${PORT:-999} tools/test.py checkpoints/SETR_Naive_ReLeM/SETR_Naive_768x768_80k_base_RM.py checkpoints/SETR_Naive_ReLeM/iter_80000.pth --launcher pytorch --eval mIoU +``` + +## ReLeM +We train recipe information based on the implementation of [im2recipe](https://github.com/torralba-lab/im2recipe-Pytorch) with small modifications, which is trained on [Recipe1M+](http://pic2recipe.csail.mit.edu/) dataset (test images of FoodSeg103 are removed). I may upload the lmdb file later due to the huge datasize (>35G). + +It takes about 2~3 weeks to train a ReLeM ViT-Base model with 8 Tesla-V100 cards, so I strongly recommend you use my pre-trained models([link](https://drive.google.com/drive/folders/1LRCHxeMuCXMb68I1XFI8q-aQ2cCyUx_r?usp=sharing)). + + +## Citation + +If you find this project useful in your research, please consider cite: + +```latex +@inproceedings{wu2021foodseg, + title={A Large-Scale Benchmark for Food Image Segmentation}, + author={Wu, Xiongwei and Fu, Xin and Liu, Ying and Lim, Ee-Peng and Hoi, Steven CH and Sun, Qianru}, + booktitle={Proceedings of ACM international conference on Multimedia}, + year={2021} +} +``` + +## Other Issues + +If you meet other issues in using the software, you can check the original mmsegmentation (see [doc](https://mmsegmentation.readthedocs.io/) for more details). + + +## Acknowledgement + +The segmentation software in this project was developed mainly by extending the [segmentation](https://github.com/open-mmlab/mmsegmentation/). + diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.DS_Store b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7de4b33ec59a44768f4065a4beb7f3a5228a64e4 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.DS_Store differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.dev/gather_models.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.dev/gather_models.py new file mode 100644 index 0000000000000000000000000000000000000000..1899195d7dc90088e89a424c8c749f075e4e18d6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.dev/upload_modelzoo.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.dev/upload_modelzoo.py new file mode 100644 index 0000000000000000000000000000000000000000..bd78bc41e69c3b603e7bbb4ee8a6c420ad87e26b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/CODE_OF_CONDUCT.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000000000000000000000000000000000..efd4305798630a5cd7b17d7cf893b9a811d5501f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at chenkaidev@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/CONTRIBUTING.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..112527ec88c78915c2cffdeb70e9d7cb1d829129 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/CONTRIBUTING.md @@ -0,0 +1,57 @@ +# Contributing to mmsegmentation + +All kinds of contributions are welcome, including but not limited to the following. + +- Fixes (typo, bugs) +- New features and components + +## Workflow + +1. fork and pull the latest mmsegmentation +2. checkout a new branch (do not use master branch for PRs) +3. commit your changes +4. create a PR + +Note + +- If you plan to add some new features that involve large changes, it is encouraged to open an issue for discussion first. +- If you are the author of some papers and would like to include your method to mmsegmentation, + please contact Kai Chen (chenkaidev[at]gmail[dot]com). We will much appreciate your contribution. + +## Code style + +### Python + +We adopt [PEP8](https://www.python.org/dev/peps/pep-0008/) as the preferred code style. + +We use the following tools for linting and formatting: + +- [flake8](http://flake8.pycqa.org/en/latest/): linter +- [yapf](https://github.com/google/yapf): formatter +- [isort](https://github.com/timothycrosley/isort): sort imports + +Style configurations of yapf and isort can be found in [setup.cfg](../setup.cfg) and [.isort.cfg](../.isort.cfg). + +We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`, + fixes `end-of-files`, sorts `requirments.txt` automatically on every commit. +The config for a pre-commit hook is stored in [.pre-commit-config](../.pre-commit-config.yaml). + +After you clone the repository, you will need to install initialize pre-commit hook. + +```shell +pip install -U pre-commit +``` + +From the repository folder + +```shell +pre-commit install +``` + +After this on every commit check code linters and formatter will be enforced. + +>Before you create a PR, make sure that your code lints and is formatted by yapf. + +### C++ and CUDA + +We follow the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html). diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/config.yml b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..6eaae3e0d5777c75291a35e996a352e3a442a0ad --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,6 @@ +blank_issues_enabled: false + +contact_links: + - name: MMSegmentation Documentation + url: https://mmsegmentation.readthedocs.io + about: Check the docs and FAQ to see if you question is already anwsered. diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/error-report.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/error-report.md new file mode 100644 index 0000000000000000000000000000000000000000..73a63b7d10d7f33476a0dd141adcd1c9c1163e34 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/error-report.md @@ -0,0 +1,48 @@ +--- +name: Error report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +Thanks for your error report and we appreciate it a lot. + +**Checklist** + +1. I have searched related issues but cannot get the expected help. +2. The bug has not been fixed in the latest version. + +**Describe the bug** +A clear and concise description of what the bug is. + +**Reproduction** + +1. What command or script did you run? + + ```none + A placeholder for the command. + ``` + +2. Did you make any modifications on the code or config? Did you understand what you have modified? +3. What dataset did you use? + +**Environment** + +1. Please run `python mmseg/utils/collect_env.py` to collect necessary environment infomation and paste it here. +2. You may add addition that may be helpful for locating the problem, such as + - How you installed PyTorch [e.g., pip, conda, source] + - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) + +**Error traceback** + +If applicable, paste the error trackback here. + +```none +A placeholder for trackback. +``` + +**Bug fix** + +If you have already identified the reason, you can provide the information here. If you are willing to create a PR to fix it, please also leave a comment here and that would be much appreciated! diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/feature_request.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000000000000000000000000000000000..ec59b783d900f36228e1100217bc318f01f6fa7d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,22 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +# Describe the feature + +**Motivation** +A clear and concise description of the motivation of the feature. +Ex1. It is inconvenient when [....]. +Ex2. There is a recent paper [....], which is very helpful for [....]. + +**Related resources** +If there is an official code release or third-party implementations, please also provide the information here, which would be very helpful. + +**Additional context** +Add any other context or screenshots about the feature request here. +If you would like to implement the feature and create a PR, please leave a comment here and that would be much appreciated. diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/general_questions.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/general_questions.md new file mode 100644 index 0000000000000000000000000000000000000000..b5a6451a6cbf81ad1c4d0cae8541621b7991b99b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/ISSUE_TEMPLATE/general_questions.md @@ -0,0 +1,8 @@ +--- +name: General questions +about: Ask general questions to get help +title: '' +labels: '' +assignees: '' + +--- diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/workflows/build.yml b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/workflows/build.yml new file mode 100644 index 0000000000000000000000000000000000000000..9a30054bfefe964c59f018bd894c64c6a29367b6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/workflows/build.yml @@ -0,0 +1,98 @@ +name: build + +on: [push, pull_request] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Install pre-commit hook + run: | + pip install pre-commit + pre-commit install + - name: Linting + run: pre-commit run --all-files + - name: Check docstring + run: | + pip install interrogate + interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --exclude mmseg/ops --ignore-regex "__repr__" --fail-under 80 mmseg + + build: + env: + CUDA: 10.1.105-1 + CUDA_SHORT: 10.1 + UBUNTU_VERSION: ubuntu1804 + FORCE_CUDA: 1 + MMCV_CUDA_ARGS: -gencode=arch=compute_61,code=sm_61 + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.6, 3.7] + torch: [1.3.0+cpu, 1.5.0+cpu] + include: + - torch: 1.3.0+cpu + torchvision: 0.4.1+cpu + - torch: 1.5.0+cpu + torchvision: 0.6.0+cpu + - torch: 1.5.0+cpu + torchvision: 0.6.0+cpu + python-version: 3.8 + - torch: 1.5.0+cu101 + torchvision: 0.6.0+cu101 + python-version: 3.7 + - torch: 1.6.0+cu101 + torchvision: 0.7.0+cu101 + python-version: 3.7 + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install CUDA + if: ${{matrix.torch == '1.5.0+cu101'}} + run: | + export INSTALLER=cuda-repo-${UBUNTU_VERSION}_${CUDA}_amd64.deb + wget http://developer.download.nvidia.com/compute/cuda/repos/${UBUNTU_VERSION}/x86_64/${INSTALLER} + sudo dpkg -i ${INSTALLER} + wget https://developer.download.nvidia.com/compute/cuda/repos/${UBUNTU_VERSION}/x86_64/7fa2af80.pub + sudo apt-key add 7fa2af80.pub + sudo apt update -qq + sudo apt install -y cuda-${CUDA_SHORT/./-} cuda-cufft-dev-${CUDA_SHORT/./-} + sudo apt clean + export CUDA_HOME=/usr/local/cuda-${CUDA_SHORT} + export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${CUDA_HOME}/include:${LD_LIBRARY_PATH} + export PATH=${CUDA_HOME}/bin:${PATH} + sudo apt-get install -y ninja-build + - name: Install Pillow + if: ${{matrix.torchvision == '0.4.1+cpu'}} + run: pip install Pillow==6.2.2 + - name: Install PyTorch + run: pip install torch==${{matrix.torch}} torchvision==${{matrix.torchvision}} -f https://download.pytorch.org/whl/torch_stable.html + - name: Install mmseg dependencies + run: | + pip install mmcv-full==latest+torch${{matrix.torch}} -f https://download.openmmlab.com/mmcv/dist/index.html --use-deprecated=legacy-resolver + pip install -r requirements.txt + - name: Build and install + run: rm -rf .eggs && pip install -e . + - name: Run unittests and generate coverage report + run: | + coverage run --branch --source mmseg -m pytest tests/ + coverage xml + coverage report -m + # Only upload coverage report for python3.7 && pytorch1.5 + - name: Upload coverage to Codecov + if: ${{matrix.torch == '1.5.0+cu101' && matrix.python-version == '3.7'}} + uses: codecov/codecov-action@v1.0.10 + with: + file: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/workflows/deploy.yml b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/workflows/deploy.yml new file mode 100644 index 0000000000000000000000000000000000000000..b972731162e15a6bc4ed89ed342222f75ec8cbab --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.github/workflows/deploy.yml @@ -0,0 +1,22 @@ +name: deploy + +on: push + +jobs: + build-n-publish: + runs-on: ubuntu-latest + if: startsWith(github.event.ref, 'refs/tags') + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 + with: + python-version: 3.7 + - name: Build MMSegmentation + run: | + pip install wheel + python setup.py sdist bdist_wheel + - name: Publish distribution to PyPI + run: | + pip install twine + twine upload dist/* -u __token__ -p ${{ secrets.pypi_password }} diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.gitignore b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..9b7cffbc88b17eb033ca403bed5c6254a539e73c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.pre-commit-config.yaml b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.pre-commit-config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d3395dc284edbae1fea7006ee7c8967ea62a3b45 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.readthedocs.yml b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.readthedocs.yml new file mode 100644 index 0000000000000000000000000000000000000000..73ea4cb7e95530cd18ed94895ca38edd531f0d94 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/.readthedocs.yml @@ -0,0 +1,7 @@ +version: 2 + +python: + version: 3.7 + install: + - requirements: requirements/docs.txt + - requirements: requirements/readthedocs.txt diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/LICENSE b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..55528a8fd10bf805118c7ee9edf47a57ec54d178 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/LICENSE @@ -0,0 +1,220 @@ +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. + + + ====================================================================================== + Swin-Transformer-Semantic-Segmentation Subcomponents: + + The Swin-Transformer-Semantic-Segmentation project contains subcomponents with separate + copyright notices and license terms. Your use of the source code for the these + subcomponents is subject to the terms and conditions of the following licenses. + + ======================================================================================= + MIT license + ======================================================================================= + + The following components are provided under an MIT license. + + 1. swin_transformer.py - For details, mmseg/models/backbones/swin_transformer.py + Copyright (c) 2021 Microsoft diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/README.md new file mode 100644 index 0000000000000000000000000000000000000000..a94d8212b33f8fa1aaa4e4969ed9851976d9155e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/README.md @@ -0,0 +1,95 @@ +# Swin Transformer for Semantic Segmentaion + +This repo contains the supported code and configuration files to reproduce semantic segmentaion results of [Swin Transformer](https://arxiv.org/pdf/2103.14030.pdf). It is based on [mmsegmentaion](https://github.com/open-mmlab/mmsegmentation/tree/v0.11.0). + +## Updates + +***05/11/2021*** Models for [MoBY](https://github.com/SwinTransformer/Transformer-SSL) are released + +***04/12/2021*** Initial commits + +## Results and Models + +### ADE20K + +| Backbone | Method | Crop Size | Lr Schd | mIoU | mIoU (ms+flip) | #params | FLOPs | config | log | model | +| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | +| Swin-T | UPerNet | 512x512 | 160K | 44.51 | 45.81 | 60M | 945G | [config](configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k.py) | [github](https://github.com/SwinTransformer/storage/releases/download/v1.0.1/upernet_swin_tiny_patch4_window7_512x512.log.json)/[baidu](https://pan.baidu.com/s/1dq0DdS17dFcmAzHlM_1rgw) | [github](https://github.com/SwinTransformer/storage/releases/download/v1.0.1/upernet_swin_tiny_patch4_window7_512x512.pth)/[baidu](https://pan.baidu.com/s/17VmmppX-PUKuek9T5H3Iqw) | +| Swin-S | UperNet | 512x512 | 160K | 47.64 | 49.47 | 81M | 1038G | [config](configs/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k.py) | [github](https://github.com/SwinTransformer/storage/releases/download/v1.0.1/upernet_swin_small_patch4_window7_512x512.log.json)/[baidu](https://pan.baidu.com/s/1ko3SVKPzH9x5B7SWCFxlig) | [github](https://github.com/SwinTransformer/storage/releases/download/v1.0.1/upernet_swin_small_patch4_window7_512x512.pth)/[baidu](https://pan.baidu.com/s/184em63etTMsf0cR_NX9zNg) | +| Swin-B | UperNet | 512x512 | 160K | 48.13 | 49.72 | 121M | 1188G | [config](configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k.py) | [github](https://github.com/SwinTransformer/storage/releases/download/v1.0.1/upernet_swin_base_patch4_window7_512x512.log.json)/[baidu](https://pan.baidu.com/s/1YlXXiB3GwUKhHobUajlIaQ) | [github](https://github.com/SwinTransformer/storage/releases/download/v1.0.1/upernet_swin_base_patch4_window7_512x512.pth)/[baidu](https://pan.baidu.com/s/12B2dY_niMirwtu64_9AMbg) | + +**Notes**: + +- **Pre-trained models can be downloaded from [Swin Transformer for ImageNet Classification](https://github.com/microsoft/Swin-Transformer)**. +- Access code for `baidu` is `swin`. + +## Results of MoBY with Swin Transformer + +### ADE20K + +| Backbone | Method | Crop Size | Lr Schd | mIoU | mIoU (ms+flip) | #params | FLOPs | config | log | model | +| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | +| Swin-T | UPerNet | 512x512 | 160K | 44.06 | 45.58 | 60M | 945G | [config](configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k.py) | [github](https://github.com/SwinTransformer/storage/releases/download/v1.0.3/moby_upernet_swin_tiny_patch4_window7_512x512.log.json)/[baidu](https://pan.baidu.com/s/1i0EMiapoQ-otkDmx-_cJHg) | [github](https://github.com/SwinTransformer/storage/releases/download/v1.0.3/moby_upernet_swin_tiny_patch4_window7_512x512.pth)/[baidu](https://pan.baidu.com/s/1BYgtgkHQV89bGC7LQLS7Jw) | + +**Notes**: + +- The learning rate needs to be tuned for best practice. +- MoBY pre-trained models can be downloaded from [MoBY with Swin Transformer](https://github.com/SwinTransformer/Transformer-SSL). + +## Usage + +### Installation + +Please refer to [get_started.md](https://github.com/open-mmlab/mmsegmentation/blob/master/docs/get_started.md#installation) for installation and dataset preparation. + +### Inference +``` +# single-gpu testing +python tools/test.py --eval mIoU + +# multi-gpu testing +tools/dist_test.sh --eval mIoU + +# multi-gpu, multi-scale testing +tools/dist_test.sh --aug-test --eval mIoU +``` + +### Training + +To train with pre-trained models, run: +``` +# single-gpu training +python tools/train.py --options model.pretrained= [model.backbone.use_checkpoint=True] [other optional arguments] + +# multi-gpu training +tools/dist_train.sh --options model.pretrained= [model.backbone.use_checkpoint=True] [other optional arguments] +``` +For example, to train an UPerNet model with a `Swin-T` backbone and 8 gpus, run: +``` +tools/dist_train.sh configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k.py 8 --options model.pretrained= +``` + +**Notes:** +- `use_checkpoint` is used to save GPU memory. Please refer to [this page](https://pytorch.org/docs/stable/checkpoint.html) for more details. +- The default learning rate and training schedule is for 8 GPUs and 2 imgs/gpu. + + +## Citing Swin Transformer +``` +@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} +} +``` + +## Other Links + +> **Image Classification**: See [Swin Transformer for Image Classification](https://github.com/microsoft/Swin-Transformer). + +> **Object Detection**: See [Swin Transformer for Object Detection](https://github.com/SwinTransformer/Swin-Transformer-Object-Detection). + +> **Self-Supervised Learning**: See [MoBY with Swin Transformer](https://github.com/SwinTransformer/Transformer-SSL). + +> **Video Recognition**, See [Video Swin Transformer](https://github.com/SwinTransformer/Video-Swin-Transformer). diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..efc8b4bb20c981f3db6df7eb52b3dc0744c94cc0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/chase_db1.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..298594ea925f87f22b37094a2ec50e370aec96a0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f21867c63e1835f6fceb61f066e802fd8fd2a735 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/cityscapes_769x769.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/cityscapes_769x769.py new file mode 100644 index 0000000000000000000000000000000000000000..336c7b254fe392b4703039fec86a83acdbd2e1a5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/drive.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/drive.py new file mode 100644 index 0000000000000000000000000000000000000000..06e8ff606e0d2a4514ec8b7d2c6c436a32efcbf4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/hrf.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..242d790eb1b83e75cf6b7eaa7a35c674099311ad --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..ff65bad1b86d7e3a5980bb5b9fc55798dc8df5f4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/pascal_voc12.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/pascal_voc12.py new file mode 100644 index 0000000000000000000000000000000000000000..ba1d42d0c5781f56dc177d860d856bb34adce555 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/pascal_voc12_aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/pascal_voc12_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..3f23b6717d53ad29f02dd15046802a2631a5076b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/stare.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/datasets/stare.py new file mode 100644 index 0000000000000000000000000000000000000000..3f71b25488cc11a6b4d582ac52b5a24e1ad1cf8e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/default_runtime.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/default_runtime.py new file mode 100644 index 0000000000000000000000000000000000000000..b564cc4e7e7d9a67dacaaddecb100e4d8f5c005b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/ann_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/ann_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..a2cb653827e44e6015b3b83bc578003e614a6aa1 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/apcnet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/apcnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..c8f5316cbcf3896ba9de7ca2c801eba512f01d5e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/ccnet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/ccnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..794148f576b9e215c3c6963e73dffe98204b7717 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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=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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/cgnet.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/cgnet.py new file mode 100644 index 0000000000000000000000000000000000000000..eff8d9458c877c5db894957e0b1b4597e40da6ab --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/danet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/danet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..2c934939fac48525f22ad86f489a041dd7db7d09 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/deeplabv3_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/deeplabv3_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..d7a43bee01422ad4795dd27874e0cd4bb6cbfecf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/deeplabv3_unet_s5-d16.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/deeplabv3_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..0cd262999d8b2cb8e14a5c32190ae73f479d8e81 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/deeplabv3plus_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/deeplabv3plus_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..050e39e091d816df9028d23aa3ecf9db74e441e1 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/dmnet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/dmnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..d22ba52640bebd805b3b8d07025e276dfb023759 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/dnl_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/dnl_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..edb4c174c51e34c103737ba39bfc48bf831e561d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/emanet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/emanet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..26adcd430926de0862204a71d345f2543167f27b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/encnet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/encnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..be777123a886503172a95fe0719e956a147bbd68 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fast_scnn.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fast_scnn.py new file mode 100644 index 0000000000000000000000000000000000000000..32fdeb659355a5ce5ef2cc7c2f30742703811cdf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fcn_hr18.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fcn_hr18.py new file mode 100644 index 0000000000000000000000000000000000000000..c3e299bc89ada56ca14bbffcbdb08a586b8ed9e9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fcn_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fcn_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..5e98f6cc918b6146fc6d613c6918e825ef1355c3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fcn_unet_s5-d16.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fcn_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..a33e7972877f902d0e7d18401ca675e3e4e60a18 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fpn_r50.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/fpn_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..86ab327db92e44c14822d65f1c9277cb007f17c1 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/gcnet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/gcnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..3d2ad69f5c22adfe79d5fdabf920217628987166 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/lraspp_m-v3-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/lraspp_m-v3-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..93258242a90695cc94a7c6bd41562d6a75988771 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/nonlocal_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/nonlocal_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..5674a39854cafd1f2e363bac99c58ccae62f24da --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/ocrnet_hr18.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/ocrnet_hr18.py new file mode 100644 index 0000000000000000000000000000000000000000..c60f62a7cdf3f5c5096a7a7e725e8268fddcb057 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/ocrnet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/ocrnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..615aa3ff703942b6c22b2d6e9642504dd3e41ebd --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/pointrend_r50.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/pointrend_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..9d323dbf9466d41e0800aa57ef84045f3d874bdf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/psanet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/psanet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..689513fa9d2a40f14bf0ae4ae61f38f0dcc1b3da --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/pspnet_r50-d8.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/pspnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..f451e08ad2eb0732dcb806b1851eb978d4acf136 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/pspnet_unet_s5-d16.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/pspnet_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..fcff9ec4f41fad158344ecd77313dc14564f3682 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/upernet_r50.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/upernet_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..10974962fdd7136031fd06de1700f497d355ceaa --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/upernet_swin.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/upernet_swin.py new file mode 100644 index 0000000000000000000000000000000000000000..0a0def41f6faf51ef67e8d94a59ddf42dcdfc387 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/models/upernet_swin.py @@ -0,0 +1,49 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained=None, + backbone=dict( + type='SwinTransformer', + embed_dim=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4., + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + ape=False, + patch_norm=True, + out_indices=(0, 1, 2, 3), + use_checkpoint=False), + decode_head=dict( + type='UPerHead', + in_channels=[96, 192, 384, 768], + 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=384, + 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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/schedules/schedule_160k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/schedules/schedule_160k.py new file mode 100644 index 0000000000000000000000000000000000000000..52603890b10f25faf8eec9f9e5a4468fae09b811 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/schedules/schedule_20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/schedules/schedule_20k.py new file mode 100644 index 0000000000000000000000000000000000000000..bf780a1b6f6521833c6a5859675147824efa599d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/schedules/schedule_40k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/schedules/schedule_40k.py new file mode 100644 index 0000000000000000000000000000000000000000..cdbf841abcb26eed87bf76ab816aff4bae0630ee --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/schedules/schedule_80k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..c190cee6bdc7922b688ea75dc8f152fa15c24617 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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() +# 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=80000) +checkpoint_config = dict(by_epoch=False, interval=8000) +evaluation = dict(interval=8000, metric='mIoU') diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7fc1648311d8f6789fd2ed99789973afbb940531 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d494e07333217e0c6830d36d1bb58fa78b03cfb0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1eeff0b030cf1db8c6ec9740fa65db44b2026d58 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9e43af541f6e3df3f36479e736bb0c03fc916970 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d854f2e4223731f443369febc500dbccdc524d9d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..893c53b1ca4bf9788e4d94f0f53cfe92a93f48ce --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a64dac670ed4d4632e7b9791ec5f8a334dcea78e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..59508248490b3edbac1c46b4fcc7891f99655b9b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a9c712d1ccfd62ddf6f12ff01ea347ca1995013b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..00b2594ba8a1c9edc90cca7a6d7c3334fa209edc --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ef7b369dd9e12b2282a30da14f99dd4547c53a7b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ca6bb248ac867d463c274f975c884aa80a57730f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..071f190261c4e8f4a80a5da12a88e0cfcdfef0d8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..82a1c9386c51fb0ada436e51702beb961a534b26 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5e04aa7c6ac050d119e07b715e2082f692e1a1de --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4912bdb9fb298518ae084eb7df0ad22d3e4ff84f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d1cc072b152986102286f503e3d7b92999bf414c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c2ab106a29c1a135fc7a726df9f6f22536357ced --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1e1cec67355abae33d518417eb96eae111f16d2b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..04cb006ba146268e1d3278151bc6ea00a4fb1bfe --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1ce2279a0fbfd6fcc7cd20e3f552b1a39f47d943 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8f10b98406c88256c66d3bbe241c149791d68feb --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5c44ebcaf36075e67208c5f033d1e5f9a78dda4e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..616984575dda73a13fc5870f60ae6ffa30d6b01b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99c61a942e4868315ce4a9404d113f73fed4a4ea --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..62a0627ae2e9bb17974068e56ee660093e944e0d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f7821c559d2f92d23b28e07e040a54cfc425eefc --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..daafa5fbc12c3ed6c10b5234d520166f774e0f94 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3db6140cb97da1d202fd464d01f793276effa629 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9cac4254f37bc3755bff869a10eb3cb75db4d943 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..044d5896781de5824fc5a009d8c0eadf47a44e4e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d2bac38ca6760af6441ede5a04409ed495ef87f3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..989928ab7f98da86e291451040ff85669a9fbddb --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..c32bf48751f0a18983bff0d99310870b71801663 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..53eb77c0cd6690668ee7c2a666bd85b9a5f7e73b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d7eb668f39bbd22a1f42628428bc19d1645e9865 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..029c1d525b809b61dc8e548ebe4fb26e5c68a8be --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..43f05fab05ee4e20c3509a923118fe9818543cbd --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..654f377b6f6152c9bd98d33824a39a41d7510c3f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6a4316dde57206fe369e72fa0d32a529fe1a1932 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..16e34356e9f8566ec73e3c25c771e281d3eeb975 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1ad94d8988bb822c1571816255464126d9d5b95d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..bbcd29ccea8dcf9f67f1cd198dacd5dab380b265 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..947b8ac8ce1ddf7906ad39788c6992df3b506d29 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1a1f49cf6b112afdadf1841571f51b98c010ddf8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..580d59ca6995ea95a9345ef3ea574ea5b57e9cfb --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c6dac64377bb3f73fdf5c836fa9c38757f75ff76 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/cgnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/cgnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..00ba387203a257dbb485d68134c88cb43780722d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/cgnet/cgnet_512x1024_60k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/cgnet/cgnet_512x1024_60k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..11421ef9d375d01b01c333c3705d6eb6e3348ee8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/cgnet/cgnet_680x680_60k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/cgnet/cgnet_680x680_60k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..2b2f8eefb7dbecf81fcd2db54644493480825246 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f49ccf96194f820f509aa9448493ba12ead91953 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3bfb9bdb3064275c2ac3bf2a057ef8eb79c308df --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d80b2ec160ae1c41499d45242713a99122d8adf8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0f22d0fb6362252ac02f3f152a42997c68b90343 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..709f93cba3e3bca6ce0635457ab1823b04123bf8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..5c623eb56836760694b50f3e4e66aa0f1fc069df --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..bd31bc8f283fe8c322ee4876deadb89569dc1743 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..597d76de79610780b03cd91dba5f3a4f10147bcd --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..70f9b31966128e8d9ec37859f57a7edfd8e6d1b2 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b70c5b8d49f04661e23604ca4da56a82b1b99c9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..03734310d7338c75d48c914cb325500961c04a79 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..22aaf857c3212d0b36b0b04e7990616025a3ef9b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..010f86f1aac1b5c827dec29f692d137dc1c399bf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..0cef0f09bfa2290d14fc3a783ea500d6c3da2931 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..154e84890ed73fe4813dddc8c321de6cd2854fc1 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5c5b94e5a27d7f902d4bdea7ef6c4ef0b816bb99 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c7237ae03c601204dc7c03018ca17ed363090569 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c4994f6469051efd4881546acfcefef76616332e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f20f260e23a95dfee9dfdceef9badab992246f53 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..de4a8a5e9f030f1e8a8802596885186163f23eed --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0b5256f7b7b053cbe8d9e4ca2ec6139bb02387f6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..001b7a69c15299fc1fe5b269a5accf92c5ece032 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8c707c79d659bc544d242352bcb29686eb40b004 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6804a5781369d1031f179d421a3b5a160fd575d3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..df6f36ef7c3b71ba7979aa7a1b226b3e3ebd9bb4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..40f5f62373e59d1c6c01ca3f57777698461127c9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..fb2be22f8bc2e10cdfba4f58b2ad1ced913b4ea4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..796ba3fb142394c4d93a29ba57548dca59d8d02b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e6d58a67b3b4dddf3da42efca30fa599e623f183 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..13094a98ee9be3cf8c88370e1e111cb4dde03ec4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5186bf614bc9ebffe47323ea61afbc9604be265b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d185db95adc61734f11f0dcd7b6c45aa652680b0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e084e95c70b0b7b0c9dcc3388d6b7d3d51d54b6d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a990c076536ad9455a9203f5b6a60157f2f2f99f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b25e725ed98324e6ea648567740dc67e0413b4f9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fd920f0ca7c690d3d1c44f5f7be1cbea18fa14d4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..9d493ef527bb161be98d0e4ea433104b3bb9ff48 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..71a0fda48aa2538e4d913e73e94a71564377ea50 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8e7420d24a20b662286266cac58cab4721dc8df3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..132787db98d3fc9df5ed62e31738c82da8c279bf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..b4a9d4e1b9123b3c965cd430237ce9fcc7018a11 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f62da1a8090da389a77d77a9887926af2a7ded49 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..492bd3dfdce331070cb9645dbe55142e9b662da1 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..78f4d0d9de3d6b8dd2b097531317956d8e3b19f1 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e35d1988f0bb7ad47a73ef1a64b73d9b40e0ba40 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..dd7c16580d0620bc854f2c6eb7c881bdcd23020a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e742d9a5ec2b6addf829cb802de27ea1afd53301 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..332d9cfb79fb698c7867f0f80053c1fd29bf2c1d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/README.md new file mode 100644 index 0000000000000000000000000000000000000000..dc02660428fe534605ae3bf9659382c282379a4e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..bf39d2f12b719b1c91e38bef71f0f5232543b0dc --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c53ec41baf9043029549b4893b2380372ea5ecd9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..68e2b072e4b8d076e8c3e929dfdc73bcd24ce859 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..3a46c28608add5325ec1decf33624c3c00bff1d7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6ce85aea5a960e76f8154a5319c7c52e98c4c45 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0ebbd3c70ee5e33c6ef4ae76b6c6a6ce828d07b4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a75c9d3019b13d01c0dd13dae53bce3d15791d52 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ebb1a8eaee16de7443ab3e79e02a37340de511d7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..3caa6cf8ae61d467628378d99a919c9db1253b91 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..53fd3a909585367ca59eb827c2fbbab4cdf234ea --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c3c92eb26f8fead94f5ad7ac7d7fb60d92c57114 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5ea9cdb5b639e5284cd46e02ce1b67b4729950f7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..398d9759cafc1d01e78c138abd249808531a97b9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..136449083f7a9efbad6df94f1acd04170147aaba --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..aff70c93e6142ddda3a874d9dfd57ec6c4cd89b3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0172d9a87d6dc1c75bf75a9c48363eb985d389a8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b90b292b03a80aa37b8ca236746cf7cddc4ac27e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b49da3581d9697e726e114b1564fc58a55ef1099 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..318845de1e2124a4dff3348749ec5a13d78d686f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..1736c2397a9b2a4b4fb12eee8175e5ee98eaf805 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7243d0390f6394fdd528c881bb128b2c13d08037 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3304d3677f5357f1a3e343b39fcd97b238abdb5e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1491e3b8247c9d163d6016caf2fcd8043a053b7e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1056ad4d1e2a4f956d12f6daf506620fab27dd17 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..e36c83ba601884b81c06ee69445a94e76224c828 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..352d870bc8eab11974640c4b2d9c80dc6fbbaaf2 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e4bda3eded693bfd44a8c86ced7ae6ee9963c583 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1420b97a4bd0dc0f5451623697666012a2de635c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..dd8e1da9c7b1d86bc8a0c834bbede9d0fd40acf5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c0ba019136c2e4f33b015be3d82505bee2066655 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9b12c8d862fb7b7633c5b2f4a1c357803abdcd32 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fd6897691d3f8f200783fae7bfe231735f25a11b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..116cbdcede32bf24ad95f04291e98754011172c9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..d78d46c040f75d16225307d4b4151b87e6e3db29 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9713b731a47df9c5e23d26a08ad17d03a0d5e9fe --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6b222e730073dd42df618db5660ee9d4117f3956 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f36d490e9c9b31de7eedf735d2712e55f35db998 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1f9a917fa4223bd2428f2b2d10eac446f7ecc71a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b38f90dc4318f23d32971e7afbf90a327768f2d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a8fbd9beb11f3d1308ce2cd12da2a177c2d39478 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..74f6d6a85a06e96580a3c8d5843f660c85bca5ad --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..19841547a42315164de547a4121cfd64739cf24b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..31d95f96eb10025c2ad054cde4c81f47db21f0f2 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..172dfe1a0f07646c5f8cc47ddd62f5cb6da85a55 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1a36e3c80a13f91e37e4d90b7ae47c7e0d204144 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0f2e1b6da7e63841f4429b1caed5fbe9d537c4f8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..aca44e478b67d5a226681c099e64fe67d93cf39b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ebd27a1d1c6bf0e983fafed2e5659701dadb8f24 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..575e9d01343a4563e0d3ba89b361ea8e358d2dee --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4f1b9e19411eb963d16fd2a8174529e69ecd5a1a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f7aa7444d4c8022563db642478beec4dc5ab0dab --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fdff93f543af6bac93949e68532daea45e437167 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5305689d09b944f6e37aa85567ce3f29fc6974a7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..09604c39729abfc9015eb971069b987c8d8a82cb --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0666199b63e604b09fe8187c378589c25d0d311b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f7b07c4f47629c07faa013b9d1eae3462d898c6f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..40df946ed446cf862847dad084324412e5aa52ee --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..58f28b43f55f54c7a604960735963e6b7c13b6f1 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c5dbf20b0fcc7bc1dd077bd8b7077772251d4c1a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..73b7788bf924be2e1588596a88f0155ddc37358e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..699aa212c3518901b2f84db3f062c16b023c7538 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6ba42f69fae5e52254b34195b6cd0ed689c5bf6c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f34373d9ebab5ef6f4c01e3eab8a97c288495be0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0b0207b3144460d25229e3ac4c4d0d9fc1d34292 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8fec6ba255f33d48a66a831de4571346a7a2bd2e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..c264af998b5ef6a9e521db204205fb998cce68a9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..8a6968ea583758191fa8e94497c7186e653c7afb --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..94151004ea88394373cf8f135b065d5056b11179 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6ade67b76ce04e1ede3ff99aab4863705cff446 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..55648c08b2c4eb78d7d5ae65482e5e5b291c058a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4ea6ed0e84f3aa7d2c7acd8dd5c459a8cd3ce45c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d2feeef7e982550481365f8187cb1a50f0fafcc9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..2a5dc203cc793860aae7743d16c4fb9a564ad1d8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..9cb7952cede58165d2ed0f35d2208ad1ffb65232 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..81f3cbfbf516e833821c49deecd8f167170021f0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..835375cb0447378fc76431158eb0b8fc011d36bc --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d311e33f56ba431a882b0e7079001b0e9932a011 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7b535f3c80818ce6b692b66f18ceee8e7b181fdc --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..600b701a7194ead496cc924bee897b6096e1c7ca --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fastscnn/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fastscnn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bb87a9f7aeb8d3630aeccc04b585a4dfec9f2b7e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3d9c9999370c8b1c28af3063a3aded0d88c91caf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..95ca2ac0439c3a33ef13f2e22d7fa7a83754142b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..f3a15b41054318d508e98685632921f262029de0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..bdccfd99ba0c25646f02850483c2cdf679fdbf3d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7918dd10d05cd98dbc02f02ef1b93e3134f52357 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..528110dc73c15008869a9ad9851ef487f0c952c7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1bf6780f2c821052692ddcb904bd10e6256c1e71 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..09a5fe5468f0155f8fd0bf2cd1574a33624d8492 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..eafefaa67565513c277c5eb42e3661a88133cb27 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6d0294530f4c817b352cb020d111e3248690ae1f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6b4cc571294fa45b4442c2bfeb9fda13a14fc5c2 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3503c76935e294c881130b309999d32f13df8839 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b9bf60fc13364ca1b7b3842664950f653426e67 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f36eb02e68707d502cbe315ff8f6f25b232dee92 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5a1d29e480cb46a763cb17d2105b3f040153d417 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6644a58dea86fd38e208abbedffe4f836e677078 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..92accfc703fc398d2845d7dc2f1d5336f24738e8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5dd34dd2134c745275c66adc5488b4b9f68d6809 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..fdc6314f704e61d064f5fb7bdd30bc38a9e87ee5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0870f928b82b24b8179305f6c9fc7f6013fb481e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..401c6ea7330d45d8f7604a1da63fc6e15faea424 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..990a085eda2f2dc47f1a1289bfbf2726ad8c9c4f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9ca7fd23cedc0567a015bd5f8641a509ead6110a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..17206a5171dcc357c589a1711afa52d87faeece0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..8cec429c3e27ad2543b7e38fa206e6606fda4d5a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ef194cb594eb76316324066e23e48184d8cede27 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fca98c1d9ace73a61ae395914e5960832216bf67 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7d75cd9f49343355b14c7d60bb0df0936ffe0278 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..28ef13f8d17e977f710ba9a863f182b1f80dc8cf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..106f7b6a1ece974c9f732ee813724bd8bda3bef3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8d12e4d78025313fb9689bb320b07520bd7648ef --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..60d8350e98605c2445ce8359ca9a7a1951fe0085 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c263d6907ec9ddfdad32b380a7d926d1391e393c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8100a8e64d780c1b9c272b57e4e171c5e1a4120b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..aefac2953abf65c10023599ec42c709a794935c8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b840d5bf9f844e7af89803b48a43b76b887ced36 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..27bd9422dad49bc5a06f577ee45cd834bdbe3912 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7f0f83fe39da31fe9a5b497e0481e1c79a33e764 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9888120f65b045df1c7d4d05fb010373abf82ccf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1b70ca8e46a0409379f5ae9809ce03de203426ad --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..b17c7a12b547ee4e1cd60d667c575eab06eb071c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a2183fc2db1ff188b0ad5418e55f71005da926cc --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..08a6031f20234b1cc1d792ea5d4891613503a185 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5efb61339cdbdde585f7814e9650be2e2df654ac --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..610467c07204140bf604f8dda2aa57978c565ed3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..155e28f42194112703bb21473e5e3dd0fca40d49 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1549a4d5bf10cd3fd6e3bd57bf7a48e7e5e1ede8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..a496204bdb061d975c40cb7ef2aaada40e020a13 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d85cf6550fea5da7cf1fa078eb4fa30e017166b4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..89d5e1ae0f3ef44626f3b5534c504cbce7389a32 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..332495d3d7f7d7c7c0e0aca4e379cd54e2ed07de --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6d9cb1c64bcf8c3e952b6f8adc11bec0403d106 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4d77cefe3e51091bc2264df8b201968addd81e8d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..5ff05aa595399d77ee51552c243e489f395a820e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..cf315a4f0e6f397768572c590a634cc1b9d298a9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9f04e935c39b08de66629f913b30675ffff2a8fe --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99760c36d8399204ca8e35f32690bcd369676852 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a653dda19255214a1a412b645abddd3fc5c0d853 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..45ed99b6813324a58575f9bb74ce0534626e10c4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f06448b168af4d2dcc5a1f96e4430a7948b7e170 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d74e95943afca04ba4073e411e0b713985384129 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..52bc9f5e91f2fdf9ce8f9e3a873902dd8db56522 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..d09931048f762cd2ac224d62c2fe2ed8e0e148c8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..584b7135fd95464f3d2c965440a0b92161cde09a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ddbe3801f99dc21120548af85c55c7cdcfadaea2 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4e31d26e093b6cb2d59b24bb3060c92bd7dccdea --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ee2831d99d859c419b158b5f828d8a84063564ea --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..22a3ce0b38f36efc96595fe1c3ef428fc1575eb0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d0de5df75242e58ba572277d6fc5cf93675a097e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..409db3c628edf63cd40e002f436884ce1fb75970 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a8400979b1e94dd42343de656ffbc5fbb7a07944 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0e2d96cb6ce7249852cb1d9b36a2f24bdce00199 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..e28164e3dc9d321bf0a97b37f14f3184f95a27a5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..394a61c99f038c94fce58ac9c422b7c3ee4b5f50 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d37ab1d09ef51b1321ed8b3634fd99445efee543 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a9bab32b52ca41155062c7655986ed84677a8280 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..dff4fea85ced568c38d39408d459697e88ca0faa --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..a8d1deb98659d05755c6316c2aff2295afb0bb9c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1084a57e978195df6d45a9a00415953ddbaeeb51 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7eca7fa4b8102c6225af3b484ffff5bdc7c0f201 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e0e75e028db703129551402ae9d63c6a2861dc4b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..267483d88ff25d75dc18c5c2d37375cd77c9639c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..e15b8cc82b09ac3e64875936cdfd0f663aaba936 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d4533d79a25771905d7f1900bf7b34037885a77a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7615a7c19a3f19635b71801a55e4544be4d215b5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a535bd0ed8a4883134acdc52cf3f77c8d897ce82 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..c5f6ab0d62e269e44dac016eb5ac58f49c1fa292 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7403bee864d833bcc31160665e4b54fdd738cc13 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5b72ac830be29b865ed52adaf41f2fe800f252cc --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2bad2a731c63ba51ee05518af893618cf7ed94a0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e59a78b48be3a0997a31524fd78e7fad5636bc82 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a3c5435142db6b1f81421f5fd96d07ece32b5f38 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d4e368b2a11ed6433d8f2594a2cc3184fe5ddfff --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0c5f707200c5d8b6d39493762baf59023dcaad11 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/README.md new file mode 100644 index 0000000000000000000000000000000000000000..76352e265a9db69640c650e192f66ab75b1f19b3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ef7b06dd3806c1d93be41943ab4d7d49f68ac830 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7a1e66cf1c239eac3c6a4876a35d82e7b6ccec2e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..df9c2aca9c7c1999d74a08a58aca5d220f7df54a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..490f9873a29f2626ad764825eec97f16ee7f9f96 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..40d9190fba223251b794c105b036e4794865f785 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0c6f60dac7b457d3b936a5f7f43eb84713c77e05 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..23e6da7f23180c2350253ea400f444c0c3064fd6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0627e2b5a76dead859212d4cab116c160df21404 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9d4dc7390370d0ffe21e7dcb686eeff7261952c4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b0672b687ade8d554b71fdf0bc54de9f024fa30c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..b1adfbab882d9825a3f348ed99e401d1f164cd11 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..2e808d8072f34d09a7b0859f90261dd66c8815dd --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..66b443abec3282242c0f794a2f91e066596e7ee9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8a7a2f509ba6627ad5ab972ac090362bbcd2ecb7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..75adef324877d56c157b457eecbf8446aa6b192f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a0726c293d6026898110f7fa55d5e7d2d55d7a02 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0a4c75c708330be9163dae675b0c1f84d7722728 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1c86eba17c46a863091d999b1a090e1237202ec5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..2c73b3839c8c1bc859eb3b8864256a00cfd022fe --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..506ad9319a9418f50650c477698c9b5cb9bf6663 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a3c86e18ea65c6aaa36a4fb6e2708f08c7ae1698 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ab9d6446c9089bfae533b9dcd66e1352d81f74d0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..df79a9cf13963d26384b00ced0cf5efa9f68a420 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6ad67722a50c2b2ece5fcb7f0dd1819061ff6b3e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fc7909785f743071cad2cd1032000405435f81d4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..923731f74f80c11e196f6099b1c84875686cd441 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..be6bf16a2fd234f3526bf8fb8c30179f1ef9df78 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..81f3d5cb91607134bb1d844d78df7a3c411c134d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ceb944815b5a979ddb72015295375f6fe0c31a89 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..70babc91c99eb99ee4f941b34ea886236531832e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..36e77219ac2d7ee6795db7c40ad7341749a3b1c7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c094391b1dfcef2fa6278f0c181fb50c303f7a4c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0aada9d8dcd792fd4fc7da8908cc11d44a9ff521 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b2e0094393151fa8975a0d53c48b6048b7e1929 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..3b3e8af9538e6ce3c929a902e3d1ee5be53469a5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..c2dd6d1158bd31ecdd7874827fd37bffb5d26db6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..89e6309f55f6b939f7d79271513da4934bbacbb6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..04971226eb0fd6461b715358ac955dfb78102992 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3dd70b74a0bf912d8a6fd39f1f26be7f7571ccd6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e34f3432e581ff506c9d2951c98b5aad7b1be6a5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..33d96c76f68b92217ed38afe9538144dfedc4fd2 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0dea3e31f8c1eb3da33251fa1e10227ae98561e3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a8c14c8cf91d7cbcc05065a6dc387101dff8cdf6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..4d1f8c8154431b056fb8371772f03dfa49ac1ad3 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..96cbaa48d61ee208117d074e9f06bf4218407d78 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..db8c634c0f889c69ce80f86c445c493dcfdbd3c8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fcb24103b8e2dd649c0ad8938319f201e3254d19 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..69d212f158552cf5a24f62174b24a9d4976477bb --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..bc25d6aaf67ccb7e9fcb44ba2d803bebfa31b160 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7f6795e5ef0e4bf1d10ee7ed4f608bf93ac24216 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1a3c43495bbf9d302216d7ddf62df75446907a36 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f62eef9773ddf41d996104de571bcda00c488e14 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f8865a7c4d795d9de3f5bc6b762b305b3cabc22f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ffc99f010903267fc7c1893f4a6b0dcd2cbe42e6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6a9efc55ad2062facf3a568f8cdbba76c8c55950 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6671fcb4bf8430bc0128cd93a4b8cedea1856b03 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a441013a4c1adc39fc064dbac23caaac9efdc4a6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9c6364eb43e2abc95011205b569627ff9367d0e5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..af06cb66cc808c206d6946a4b2420a6942d3dc7e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..803c42da35eda861bf32ce0e7866cdc9fad96d0d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0141a6d0925c2a2aa37517670a9f12ac7d3a02d4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..690f8b5ef359be8a8be3a2d768aede24216a8706 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0966b4770cc649e95525c366b09801408b99567a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..931cad900680281d6970626b511124704e954c43 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0b5a990604a77238375cb6d2b8298a382a457dd6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..fda9110603d71e14cab6e537949be191f2adf6db --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..38fee11bc23d8c92c529acd0c02a68204e34ab91 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9931a07bc2d137eb49b3fa4dad8f8681d4f5e943 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6107b41544378ad371cee95ee5ebc2e98ccbd9ad --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..2221b202d6c53c4b04f2431d3344379cbfe06dd7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..15f578b6002c481ada06befc3ea66accbbdd1f66 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..fb7c3d55d57b09296ea24889b218f9a0fb997463 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c6e7e58508f31627766b8ab748bd81cd51c77eca --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..59b8c6dd5ef234334bcdfa3d5e3594b7a9989b17 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ab8a3d3e3fcc12dd41223af190e2ae04f14d1cb8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1a7cb708e551e90a12ad4267e2af6938c353f0ba --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d914f93c023a6384e0e856b8608280cef589d5c6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5893e66a41cad73e8fb24aa58dc78ef002aecca5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..abeeedf84387d7846a8a2c10480b94c9d8405559 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..284be6d09af1806b99bee5b85286b55ce02e8cbd --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..86da94de5b32576f04240a2d02dfeccc0d6ddd45 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..cbb02714b9e252bab38b3f9d9095dabe570b9005 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5deb5872b00a30d5c18a980c4d6c1b0d915908b9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4e9972849d6899fe43f435284d0e0b1bc3b0e7a9 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..86584573a3d1afac73041b85516112ac21f1f17c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..cd88154d5e0be1a519e973331e0a14ae8a7de13e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f0c20c12f6bcf04b732dccaa4bfdba10bd10b5e6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..52efdf51d7d66c3205c1448c45ae281649a0901e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..145cadb24016eeea87fccff8171c5b0dfb78f7ab --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..23a81eb7ef56a4cd8e7c9da65b86f3d0e562001a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..946bf4fc84236942a4462c2daa7637cace4e90cf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b6087dcf9f7cc04e12a2b9bcbde7abc4a56e972e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/README.md new file mode 100644 index 0000000000000000000000000000000000000000..31bac01ec9f659d6c30f220a104c385326d3f04b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f98398690eb3e1e77975d7fb94ea865424aa331b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..e3924ad679cb3d7ba731322f9cdb67410baae59a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..69bef7238345cf6aabb126012af992602f910287 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..d51bccb965dafc40d7859219d132dc9467740a1b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..33fa0252d8b4cc786f1297605c169ee6068195a4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..dcee8c280e833825f84b944c6db21e9a43125e06 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9737849cbd7470b03ef3fcb3b1225283370eb503 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6a622eae963401e143004a62ff53071ddbf61c01 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c73ade624817b61be2f226c6fae03d0b023c570a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7f8710d4be4ee0664f644b9037fd4653e4655907 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..2654096dfd78ecdd4065ac2d26cab3e2f11a9c65 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4bf3edd825296fbbed883effc3622793e9adf071 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5cdfc8ca264c6045dcb7ad890d89f15537bef233 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..49551718811d7c489738351b6d344a01547a575e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k.py @@ -0,0 +1,38 @@ +_base_ = [ + '../_base_/models/upernet_swin.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + backbone=dict( + embed_dim=128, + depths=[2, 2, 18, 2], + num_heads=[4, 8, 16, 32], + window_size=7, + ape=False, + drop_path_rate=0.3, + patch_norm=True, + use_checkpoint=False + ), + decode_head=dict( + in_channels=[128, 256, 512, 1024], + num_classes=150 + ), + auxiliary_head=dict( + in_channels=512, + num_classes=150 + )) + +# AdamW optimizer, no weight decay for position embedding & layer norm in backbone +optimizer = dict(_delete_=True, type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01, + paramwise_cfg=dict(custom_keys={'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.)})) + +lr_config = dict(_delete_=True, policy='poly', + warmup='linear', + warmup_iters=1500, + warmup_ratio=1e-6, + power=1.0, min_lr=0.0, by_epoch=False) + +# By default, models are trained on 8 GPUs with 2 images per GPU +data=dict(samples_per_gpu=2) diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6b31832cf4e406b0e78f4e431787a13b7cb7af09 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k.py @@ -0,0 +1,38 @@ +_base_ = [ + '../_base_/models/upernet_swin.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + backbone=dict( + embed_dim=96, + depths=[2, 2, 18, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + ape=False, + drop_path_rate=0.3, + patch_norm=True, + use_checkpoint=False + ), + decode_head=dict( + in_channels=[96, 192, 384, 768], + num_classes=150 + ), + auxiliary_head=dict( + in_channels=384, + num_classes=150 + )) + +# AdamW optimizer, no weight decay for position embedding & layer norm in backbone +optimizer = dict(_delete_=True, type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01, + paramwise_cfg=dict(custom_keys={'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.)})) + +lr_config = dict(_delete_=True, policy='poly', + warmup='linear', + warmup_iters=1500, + warmup_ratio=1e-6, + power=1.0, min_lr=0.0, by_epoch=False) + +# By default, models are trained on 8 GPUs with 2 images per GPU +data=dict(samples_per_gpu=2) diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..aae70e2aff0114989954574f0c59478489d94154 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k.py @@ -0,0 +1,38 @@ +_base_ = [ + '../_base_/models/upernet_swin.py', '../_base_/datasets/ade20k.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' +] +model = dict( + backbone=dict( + embed_dim=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + ape=False, + drop_path_rate=0.3, + patch_norm=True, + use_checkpoint=False + ), + decode_head=dict( + in_channels=[96, 192, 384, 768], + num_classes=150 + ), + auxiliary_head=dict( + in_channels=384, + num_classes=150 + )) + +# AdamW optimizer, no weight decay for position embedding & layer norm in backbone +optimizer = dict(_delete_=True, type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01, + paramwise_cfg=dict(custom_keys={'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.)})) + +lr_config = dict(_delete_=True, policy='poly', + warmup='linear', + warmup_iters=1500, + warmup_ratio=1e-6, + power=1.0, min_lr=0.0, by_epoch=False) + +# By default, models are trained on 8 GPUs with 2 images per GPU +data=dict(samples_per_gpu=2) diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d815510a19ade68c4962f04b8dee2c317f1788ce --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..c706cf3548e311a7930e5b58299e05af30c43d98 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..0ef02dcc491871f148b1ad038d281d250eb6e2f4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..118428bc44d3078517e231399b131db492f2bc7e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..1f8862a0e89243d67634f37c3aca94ca98feff5c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..2bc52d96293f214adf1e3e1878746ed8bd2434f6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..5d836c61dfd568dd4d29d876980001067dcaa200 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..be8eec77792f4eb16475dc5ab8607fb5682f0acf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..80483ade4a4bc3dc5cb8805e8b74c100e872da0c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..b085a17d6bab5f4d33668bfcf232e30f2a9830fe --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..9d729cea699e1c845549c74b52703c9ee3273662 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..f57c9166b67a18fd74f474754b3baec6584b17cf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..7b5421ad6877e4b35b0a6ae6e516e577404547ce --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/README.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4d53a92f9bdb67ca9e4c3974ee368ca49d84619c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b90b597d831a664761d6051397d2b1862feb59c6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..420ca2e42836099213c1f91cb925088cfe7c1269 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..146f13eb79053cc69d4934d294aad9ba723b2577 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..56345d1806482ac822d709893fe6942f44be6f74 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..0669b741b9b3e3e1a309147b920d3d2a1952ab75 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..abfb9c5d9f35407d590cdc3325006b396ec52820 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e5f3a3fae18cb769fd04b0c669785c5728cf479f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r101_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a709165657d257df4fc76148d225261c63f88d8a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d621e89ce62c06424db7c2e5f5fd00a0a2e85a61 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..95fffcc76c2ff4f61f8dd80a00d35b7875262a50 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x512_160k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f5dd9aa4ed59d4939bcb49ffe129a9935e303201 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x512_20k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..95f5c09567144db47e07fc802b114bedd6a00725 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x512_40k_voc12aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..9621fd1f5c24e582b4a1eda18fcc0a13d2bcb953 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x512_80k_ade20k.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f561e309e3bddb439c90af930c4de5a0c7e209a7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_769x769_40k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..89b18aa2840d12e67339ce0b7a0561fa2ba0c6fa --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_769x769_80k_cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/configs/upernet/upernet_r50_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..29af98f2ebe341998fcf93f8a5c018cabcc0c0ba --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/demo/MMSegmentation_Tutorial.ipynb b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/demo/MMSegmentation_Tutorial.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..127ad4e6a7d14d83ddca96ca519a26e5ba52eb64 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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": "iVBORw0KGgoAAAANSUhEUgAAAj4AAAFoCAYAAABXDfHbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXhU5dk/8O8ze2ay73tCEvYlYFgEBAUrarWvUBQ3iksVtbW0pbba0vatb7V0ubRVa+tWtSoWlFrx54JWi2hV9n0LIZAQsu/JZPY5z++PhBAgIducWZLv57rmInOW59wTJjP3eVYhpQQRERHRcKAJdABERERE/sLEh4iIiIYNJj5EREQ0bDDxISIiomGDiQ8RERENG0x8iIiIaNhQLfERQlwlhCgUQhwTQjyk1nWIiIiI+kqoMY+PEEIL4CiAKwCcArAdwM1SykM+vxgRERFRH6lV4zMdwDEp5XEppQvAWgDXqXQtIiIioj7RqVRuGoCyLs9PAZjR9QAhxHIAywFArxcFCfEGlUIhIuo/KQGlzh3oMCiEVHuUOillgq/L3blzZ6JOp3sBwASwb25vpBCi2ev1vqQoyl8LCgpc5x6gVuLTKynlcwCeA4C0VJO8Z3lWoEIhIjqPdCmwvVgFeAMdCYWK39dZS9UoV6fTvZCcnDw2ISGhUaPRcJ2pC5BSwuVy6SsqKr7X0tJyEYDbzj1GrcyxHEBGl+fpHduIiIKelBLg1wsFjwkJCQktTHp6J4SA0Wh0Z2VlNQO4pLtj1Krx2Q5gpBBiBNoTnpsA3KLStYiIfMpb7IBzczNreyhYaJj09E/H70vb3T5VEh8ppUcIcT+ADzsu/KKU8qAa1yIi8jmvBBxKoKMgIhWo1sdHSvk+gPfVKp+ISA1KsweKlVU9RIOxcuXK1OLiYuOGDRtOBDqWcwWsczMRUTByftIEpfK8gSBEQeX3v/99vt1uV+07PCwszPOTn/xkr1rlBxKHxREREYUYNZMef5QfSEP2hRER9Yd0K3Dvt0EOoplr0rhImM1nPlYPH21Bc4vHF+ERBa1Vq1YlP//884ltbW3ahIQE9xNPPHHWsH6n0ymuv/76bJfLpZk6dWrbjh07LB9++GHx6f233357hhACL730Utn5pfseEx8iIgDSJeHe0jKoYezTLopBcqKp83l1jYOJDw1pe/fuNf7tb39L3LZt2+Hs7Gx3YWGhwePxiM2bNwMArFaruPbaa3Pj4uI8//rXv4rLy8v1jz/+eEpdXZ02Pj7e63a78c4778Ru2LChyF8xs6mLiIiIBkSr1cLlcok9e/aYnE6nGD16tGv8+PFOAGhtbdXOmzdvVHZ2tvPNN98s0el0yMrKck+bNs3697//PQYA1q9fHxUTE+OZM2eOzV8xM/EhomHPc9QO5/sNnLSQqJ8mTJjg/M1vflP261//OjUhISH/2muvzSkpKdEDwJ49eyyFhYVhv/rVr6o0mjPpxtKlS+vWrl0bBwBr1qyJW7JkSb0/Y2biQ0TDmueEA54SB5QarstFNBD33ntvw86dOwtLSkr2CSHkD37wg3QAmDNnTsuKFSsq58+fP6qsrKyza83SpUubCgsLw7Zv3276z3/+E3XnnXc2+DNe9vEhomHN9VULZCP74RANxN69e42lpaWGK664wmo2m6XJZJJe75kBAo888ki10+nUzJ8/f/Rnn31WmJKS4jGbzfLrX/9646233pozadKktpEjR/p1/gjW+BAREYWYsLAwVbP1vpbvcDg0q1atSo+Pj5+clJSUX1dXp3v88cfPWpvzD3/4Q+XVV1/dOG/evFHV1dVaALjjjjvqi4qKwm6++Wa/NnMBrPEhomFKsXrh+rx5UMPXiQIlWCYXnDFjhn3//v2Hz93++OOPV3R9/uSTT1YA6NyWk5PjMplMyre+9a1GP4R5FiY+RDTsKE0eeCuc8B53BDoUomHH6/Vi9erVSddee21jbGys3xfFY+JDRMOGlBKQgPtgGzx72gIdDtGw09LSoklOTs5PTU11bdy48WggYmDiQ0TDiv2NWsgmdmYmCoTIyEjFZrPtDmQMTHyIaFhQmj1w77FCNnsBdushGraY+BDRkKe0euCtcMFzwG+TwxJRkGLiQ0RDmpQS7q2t8BTaAx0KEQUBJj5ENGRJr4RjfR2UZvbpIaJ2nMCQiIYuCSgtHsDNRbiIqB1rfIhoyJF2L6QHgFdy4VEiOgsTHyIacpyfNMFb6gx0GESq+cPvZuTb7U2qfYeHhUV7fvzg1j7NDp2Wljbx6aefLlm4cGGrWvH4EhMfIhoSPCfscO+0AgAULjpKQ5yaSY8vy3e73dDr9b4oymfYx4eIgpqUEp6jNrgPX/jhPe6AUu2GUu0GXGzfIvKHhQsXjqisrDTcdNNNI81m85Sf//znSUKIgj/+8Y/xKSkpE2fOnDkaAP70pz/F5eTkjI+MjJx8ySWXjDx69KjhdBm7d+82zZo1a2RUVNTk7OzsCS+88EKMmjEz8SGioCTdCqRTAZwSzs9b4PpP0wUfniMcrk4902oFjAZN50OnE4EOaUh4++23T6SkpLjWrl1bZLPZdp9edPSzzz4LLywsPPjpp58efe2116Iff/zxlPXr1xfX19fvmTVrlvXGG2/MAdqXsLj66qtH3XjjjQ11dXV71qxZU/zjH/84c+fOnSa1YmZTFxEFJeenzfAWdyQznGmZBmna5GhcOju+8/n+Qy14/+PqAEY0tD366KMVkZGRCgA899xzCT/84Q+rLrroIgcArF69uvKpp55KPnr0qGHz5s2WtLQ05/e///16AJg9e7b96quvbnr99ddjCgoKKtWIjYkPEQUV6ZFwftIIpdLFhId84sr5icjKMEOnO9PIodGwxkdNubm57tM/l5eXG1atWpXxy1/+Mv30NimlKC0t1ZeWlhr27dtniYiImHx6n9frFYsWLapXKzYmPkQUXKSEt8QJeNhPhwZHrxfISAvDqNxwREac3cE2IlyH7EwzSk5yGRM1aDSazj/glJQU1wMPPFB53333NZx73PHjx43Tpk1r/fLLL4v8Fpu/LkRE1BspJaAEOgoaCoQAYqMNuPmbGeclPQCQk23B4m+kQq9nzc9gxcfHu48dO2bsaf/y5ctrH3/88ZQdO3aYAKC+vl774osvxgDAkiVLmkpKSkxPP/10rNPpFE6nU2zevNm8a9cu1fr4MPEhoqDhPeGA7dVq1vbQoM2dGY+lN2Rc8BijQYPv3ZWLnCyzn6LynbCwaFXnbOhP+T/+8Y+rHnvssZSIiIjJa9asOW9E1rJly5p+8IMfVN5yyy054eHhU8aPHz/+gw8+iAKAmJgY5YMPPjj65ptvxiYnJ09KSkrKf/DBB9MdDodqGamQMvAfMGmpJnnP8qxAh0FEAeYpssP5UWOgwxiwby/NQnLimRvV19eX4QSbUvxu3px45GZbkJTQt0qDN94+haLjbYO+7u/rrDullFMHXdA59u7dW5Kfn1/n63KHur1798bn5+dnn7udfXyIKCgoTZ72dbWIBsigF4iLNWLyhGiYw7R9Pi8m2oCYKBcam929H0whj01dRBQUnJ82wb0lJGa8pyCVnGTCnbdm9SvpAYArLkvEgnmJKkVFwYaJDxERhbyvXZqAhV9PHfD5WRlm3HN7NgwGfi0OdfwfJqKAkm4Fru2tkC2ctIcGzmLWISJ84L039HoNYqMNmDU9FkkJPQ5QoiGAfXyIKLDcEu7trUDgx1lQiNHrBMzm9mYtXwxL12gEZk+PQ1OTG9W1zkGXR8GJiQ8REYWknBEWLL524M1bNDyxqYuIiEKSACCE6Hz4yuwZsbhmQbLPyqPgwsSHiAJGqXfDc9TOZi7qt9xsC7Iz1Zl4MDrKgKz0MORPiOLMzkMQEx8iChjvKSdcX7QEOgwKQdMLYlCQf94kwT4TE23ANVckITpSD62WyY+/FRYWGoQQBW637+dWYh8fIiKiHnx7aTY2f1GHr3act75mQP36+tX5tha7at/h5sgwzy/W/3SvWuUHEhMfIgoI52dN8Ja7Ah0GhZDcERYU5EcDAJL9MORcCAGtFhBB2DaiZtIz0PLdbjf0+vMXhA02QfjfSUTDgbfCBdnAJSqo76Ii9RiZE46ROeEwm/133x4XY0DeCAvyRlg4weE50tLSJq5atSp51KhR4ywWy0Vr1qyJysvLGx8RETF5+vTpo7uusv6zn/0sOSMjY4LFYpmSm5s7/pVXXok+vc/j8WD58uXpMTEx+enp6RPfeuutKLVi5v8gEfmVlBLSK9mhmfpFowE0AepqM2l8FG5clI4bF6UjKpINJef65z//Gfv+++8Xbd68+fBdd92V84c//KGsrq5u74IFC5oWLlyYd3ql9by8POfnn39e2NLSsvuhhx6quOeee0aUlpbqAeDxxx9P+Pe//x21ffv2Qzt37jz09ttvq9aBi4kPEfmVbPHC9lIVZCNre6jvbrk+A/PnJAQ6DOrGvffeW52Xl+d+6623oufNm9e8aNGiFqPRKB9++OFqh8Oh+fjjj8MB4M4772zMzs52a7Va3H333Y1ZWVnOzz//3AIAb731Vsx9991Xk5eX505KSvI++OCDVWrFy9SViPzGc9wOT5EdcLK6h/rHaNBAr+e9ejDKyspyA0BFRYU+IyOjs+OeVqtFSkqKq6ysTA8Af/7zn+P+/Oc/J5WXlxsAwG63a2tra3UAUF1drc/MzOw8Nzc3V7Wps/kuIiLVSSnhrXPDe8IB7zFHoMMhIh8SQkgASE1NdZeVlRlOb1cUBZWVlYaMjAz30aNHDStXrsx64oknTjY2Nu5pbW3dk5eXZ5ey/SYoMTHRffLkyc5zjx8/rlrvdSY+ROQXzvca4DliD3QYRP0mpex8UM+WLl3asGnTpqgNGzZEOJ1O8atf/SrJYDDIr33ta9bW1laNEALJycluAHjiiSfijh07Fnb63G9+85uNzz77bGJxcbG+trZW+/vf/161qbPZ1EVERHQBW3Y0YufeRgBAqzU4+qaZI8M8as/j099z8vPznc8+++yJlStXZi5dulQ/ZswY+9tvv11kMplkQUGBY/ny5dVz584dq9Fo5OLFi+unTJliPX3uypUra48ePWoqKCgYb7FYvPfff3/Vli1bInz7qtqJYMhg01JN8p7lWYEOg4hUIqWE/ZUaSKs30KGo6ttLs5Cc2Dl6F6+vL8OJk7YARjR0TJkYhZG57UPZ/W3Tf2vx5bbeJzD8fZ11p5Ryqq+vv3fv3pL8/Pw6X5c71O3duzc+Pz8/+9ztrPEhIqKgt3t/M9xuiYQ4I6IidT5dlLQnUkq0tHrgcCiqX4v8h318iIgoJBw40oIXXy+F4seGilfWncSufU3+uyCpjokPEalKqXfD8WYdpG1oN3ORfzgcXrz0einKK9lRngaGTV1EpCrpllBqfb/CMg1PUgLVNU4cPNICp1NBTrbF59coLbOhrsEFQMLlYjPXUMPEh4hUI90KJL84SAXbdzehqdmNlGQTTEaNT/v8HDjcgj0Hmn1WHgUXNnURkWpcX7TA+W7vo2GIBqLoeBuefuE43O7Aj06m0MEaHyJSjwIuRkqqSU8Nw5yL46DT+aa2x+uVePv9CpRXcnbxoYyJD4UUqUh4Tzrhk2EdQkCbaYTQBmjJZyIalHCL1qd9fCSAEydtcDrZPDuUMfGh0OIFnB81Ar6o2tYAYbclAQbNeduFxv/JkFQkIKF6Iia9EhDqvkYpZUdtD6t7yH+klPB6JbRa0a8+P16v7DyXhj4mPjR8KYD9tRrgnM9Hw7QI6Cf7f3ZY12fNkC1emP4nTtXrODbUQ5Okh3F2lHoX6fjdcgg7+dOpCjveeLsc994+AhZL37/e3tlYieITbQAAZ4h0xr9idUF+s71Jte/wqLBoz79/unOvWuUHEhMfChneGhc8e9sAjw/vyrqpOfIctUPaFegvjvDP7LBeCdd/m+E95YQI06p+PbglvCVOOB3taw/pp4RDE6v3+WWkS2mv9SHyE0UBHE4FH31ag0njo5Dbx2Ywt1sJmYTnNDWTHrXKd7vd0Ot9/1nTX4Ma1SWEKBFC7BdC7BFC7OjYFiuE+LcQoqjj3xjfhErDkVQkvFWu9keZE56jdtU7yyq1bniK/TM5mnQoUKpc8ByxQzZ7Id1K5+tV2tSrLZFNHniO2OE5Yoe3zHnmd9zLQ/oy6SRSyaHCVhSfsKK69sKdlBVForzSDjuXpBiU//73v+axY8eOs1gsU66++uqca665JmfFihWp7777bkRSUtKkVatWJcfHx+ffcMMNI2pra7Xz5s3Li4mJyY+MjJw8b968vOLi4s5s6Mknn4xLT0+faLFYpqSlpU3861//GgsABw4cME6bNm10RETE5JiYmPxrrrkmZ6Dx+iKjmyel7Lp42kMAPpFS/lYI8VDH8wd9cB0aZqSUgFOB4626gI0MklKqWuvjrXDC+UHjmevVe+D4Z/ufk35mJPRTLD67/pkFic/+Zbr+29LnMsJuSYCICfwdG1Fvtu9uQslJG5bfNqLHY1xuBa++Uca+PYPgcDjEkiVLcu+7777qn/zkJ7Vr166Nuuuuu3Luu+++KgCor6/XNzQ0aMvKyvZ5vV5YrVbNbbfdVvfOO+8c93g8uOWWW7LvueeezI8//ri4paVF87Of/Szziy++OJSfn+8sLS3V19bWagHgpz/9aer8+fObt2zZUuh0OsXnn38+4F7taszjcx2Av3f8/HcAC1W4Bg0DnkI77OtqA5L0yBZv+2riTR7/X7yDe2crHBvquyQsgyOt7a9JaQjcayKioWXTpk0Wj8cjVq1aVWM0GuVtt93WNGnSpLbT+4UQ8rHHHqsICwuT4eHhMjk52Xv77bc3RUREKDExMcovfvGLym3btkV0PX737t1hVqtVZGVluadOneoAAJ1OJ0+ePGksKSnRm81meeWVV1oHGvNgEx8J4CMhxE4hxPKObUlSysqOn6sAJHV3ohBiuRBihxBiRxs7QFJ33BKyLUBV0LI9UXDvaYOnRJ05PdxHbO1Ndz1xSSj1bri3tvqmk7DS/prU7nejNHrg3tYK8C6aglhltQP/3VIPxZ8rng5BZWVl+qSkJLdGcyadSE1NdZ3+OSYmxmM2mzt/ya2trZpbbrklKzU1dWJ4ePiUBQsWjGltbdV6PB5ERkYqL7/88vHnnnsuISUlJf+yyy7L2717twkAnnjiiVNSSsycOXNsXl7e+D/96U8DHgUy2MTnEinlRQCuBvBdIcTcrjtl+61qt+8qKeVzUsqpUsqpFrMfOnQSDYDnkA3eMqcqZXuL7PAW95JUOSTcO63w1rqhNHmgtHgGVAMkHQpkq39uMJRmD9y7rADvZyjIKIpEQ6MLDY0unChtw9adjZxxYZDS0tLc1dXVekU5c0dVUVFhOP3zuU31//d//5d07Ngx05YtWw5brdbdH3300RHgTFP84sWLW7788suiysrKvSNHjnTcddddWQCQmZnpWbt2bWlNTc2+p59+uvTBBx/MOnDggHEgMQ8q8ZFSlnf8WwPgXwCmA6gWQqQAQMe/NYO5BhEBzncbYF9T097/ZwAf1O69Vjg21Ps+MKIQYm3z4K8vncBfXzqBTf+t6/0E6tXll1/eptVq5erVqxPdbjdee+216H379vXY/6a1tVVrMpmU+Ph4b3V1tfZ///d/U0/vKysr07322mvRLS0tmo6mMeV0TdKLL74Yc7oTdFxcnEcIAY1GM6C0dcCJjxDCIoSIOP0zgAUADgB4B8BtHYfdBmDDQK9BNNR4iu2wr6uBfV0NvJWu3k84h7QrcLxRC29t/88loqEjKixa1c56fS3fZDLJdevWFb/66qvxUVFRU9asWRM7b968ZqPR2G1S8tBDD1U7HA5NfHz85BkzZoxdsGBB52qwiqKIJ554IiktLW1SdHT05C+++CLimWeeKQWAbdu2WWbOnDnWbDZPWbRoUd4jjzxycty4cQP6IBzMqK4kAP/qqMbSAXhdSrlRCLEdwBtCiG8DKAWwZBDXIAp50qXAU9g+DN9b5YJSN4jPKwko9Z728hwS2owL1/RKKeEptEOpcQ/8mkQUdIJpcsG5c+fajhw5cuj080mTJo255pprXNdee21rdXX1vq7HZmdnu7dt21bYdduPf/zjOgDIyspyb9++/ax9pz3zzDOnnnnmmVO+iHfAiY+U8jiA/G621wO4fDBB0fAhlfYh652EAIz9m25edR4J6VD6FVf7UHwJSAnF6oXrs+beT+pPSHvbIO1Kr4kPALi3tfqtfw8RDT/vvfde+MSJEx0pKSmeZ555Ju7o0aPmhQsX9n2eDD/jzM0UUEqdG471Z9raRaQWYbcmBjCi83kO2eAtcbSv69WPfMz+zzrIZg4dJ6Kh7fDhw6Zly5bl2u12TXp6uvPll18uzsrKCtpqZiY+5HdSkXB+2AjpkoBbObuzbpCOsJAOBY7/Vw/D7Cho43uewM+9vw2e4+0jtaTVo+rrUU45YT+nw7LQAMYrYyDOXXiViEglDzzwQN0DDzwQMr3FmfgMEUqzB0pdcCXY2lQjRFg3X8AS8JY725uCQoUCKKdcQC9T2yuNHiin1Bn+fi5pUyBt51xLA66PRUR0AUx8hghviaNfSw/4g2lRHLRhZ/qgSK9srwEJ4QnDpCIhvRJCG0R9kKhbQgBaTc//TxLgUgVEwxATH/Ib53+a4D3RMWFfN6uihwLnB43Q5ZlgvJxr7wa7nGwLFn09pcf99Y1uvPR6qR8jIqJgwMSH/McjQzbh6eSRXKE8CM2ZGYfoqLP7XkVG6GE09jwrfGwM8I2rkrvdd6rCjt37fDsSj4iCAxOfEKE0eSDtPQ9JVlpCf7iyCNdCk8CVv6n/8kZYkJoc1q9zTEYtJo2L6nafxaxDTa0T5ZXqrNNGRIHDxCeAeltzqeucMe5dVngO29QOKaB048wwTIvo/UAileVmW5CeGoY//fUYPOwHRDSkMPEJIM8BG9w7W7vdZ7w8GtoMk58jIgotEeE63H5zJixmfpTR8BKf+Zv8+gabam/8uFizp+7kz/wyO/TKlStTi4uLjRs2bDjhj+vx0yKApEuBbOt+7LEcgvPe6UaHQZOkhwYC07UGFBdbUdGlKcFb5oRLC+inhAfXzM0UlLIzzBgzKgIR4TpV3i86rcCls+Ox72Azauu5NhoFFzWTHn+U70tutxt6fd+7SYTMC6OzmcO0CDP13HEzGDh1mrPm74vKMcMgBDQApuvNaGtxn5X4KJUuyDYv9FPC/R4r+YZi9UK2qdffTKsViI5s/4AbmRuOgvxoVa918dRYnKqwM/Eh6sETTzwRt2HDhpj//Oc/xwAgKytrwrhx42wffPDBcQBITk6e9NZbbxU9//zz8R988EGM1WrVZmVlOR577LGyq666yrp+/frIp556KllKCbPZHJ2RkeEsLCw8VF9fr73vvvvSN23aFCWEwE033VT3+OOPV+h0Ojz55JNxL7/8csKUKVPa/vnPf8YtW7as5sknn6zoa8xMfELU9ItiMGt6bKDDuKA33XZUyDNfgvN0RuRq2t9yrNEZmlybm+AtUW8Cx/hYA769NEu18omof6644orWn//85xlerxdlZWV6t9stdu3aFQ4Ahw4dMthsNs2MGTPse/bsaVu9enVFXFyc95FHHklaunRp7smTJ/ddf/31LV9++WXVuU1dN910U3ZCQoKnuLj4QGtrq+aqq64a+cc//tF1ekHTffv2WRYvXtxQW1u7x+l09usLhYmPHxVo9RirOVMdJ/NNkCPjuj12c5gb5V3qS+bMjEPe1DNrWFks2qBPHhboTfB06cAdITRBH3NfeE86YVtbAwAwzIqELpN9sfxpKLyHiIaKcePGuSwWi/LVV1+ZDx06ZLz00ktbDhw4YN69e7fps88+s0ydOtWq1Wrxne98p+H0OQ8//HD1H//4x5S9e/eaZs6caT+3zLKyMt3mzZujGhoadoeHh8vIyEjl/vvvr37xxRfjTyc+CQkJrlWrVtUAgF6v79cIBCY+fjJeo0e2Rod4TZfmKYsWsHR/vMHtBZQztSWRETokag0qR+lb0UJzwUU9szLMcDgVHCrsvoN30HJJyPqOTlihtOwGEZEKZsyY0frxxx9HHDt2zDh37tzWqKgo78cffxy+ZcuW8Dlz5rQCwC9/+cuk1157Lb62tlYPAG1tbdqamppuc5Bjx44ZPB6PSElJyT+9TUopkpOTO9ucU1JSBrxGExMflYR1+cYXAGbrDDCLvi8caYQ4qwxdf5YFDxHjRkciJsoQeokPERF1mjt3but7770XferUKcPDDz9cGRMT412zZk3srl27wr///e/XbNy4MfzPf/5z8saNG48WFBTYtVotIiMjJ5+e0kUIcdYdZE5OjttgMMiGhoY9PXVaPvec/uASzirQAbjdYMHdHY+7DJazkpi+WKAzdZ5/t8GC0RrmqEREFHyuuOKK1q1bt0Y4HA5Nbm6ue8GCBa2fffZZVHNzs27WrFm25uZmrU6nk8nJyW632y0eeOCBlLa2ts7mj6SkJM+pU6cMXm97K0dWVpZ79uzZzcuXL89oaGjQeL1eHDx40Pjee+/5ZOQLv0196BKtEUkaDQQAPQDNIPoiDOZcIiI6nzlMi1uvT1et/N8/c0S1ss8VF2v2qD2PT1+PnTRpktNsNnunT59uBYDY2FglIyPDGRsb69HpdFi8eHHz+vXrW8aNGzcxLCzMe88991R3bbZatmxZw7p162JjYmImp6enOw8dOnT4jTfeKFmxYkXa2LFjJ9hsNk16errrhz/8YaUvXltIJz4aADka9RqBihUPup9l54woCCR29NvJ0miRoAnuIebBxmTSYOyo9tma66UXDVoJ77H2Ie5K7YCbcGmIcji9OFTYgrwR4TAYWGE9nIzIMsN0ztpraSn9G1ig02mQndlDx8oQ46/JBfuqtrZ2X9fnBw4cOHz6Z51OhzfffLMEQMnpbY888kj16Z+Tk5O9O3fuLOx6flxcnHfNmjUnAZw891orVqyoX7FiRf1AYw3pxEcP4GqdCVoVake8UuIlVxscuHAzYo5Wh0t1HNUzUDHRBnzz2lQAwFaPE1sbbGh9rSbAUVGwarTbtxEAACAASURBVG7x4F/vVeK+O0Yg1uCfzv5arYBO17fPGNbTqkOnE7h8TgKSEvlZS4MX0omPmjQAbjNYekl7ANbv+M5UrQE5BoHnAh0IURffuDIZSm9Vvx10eqY+vhYVqcPyZSP4uyWfYeLTAyEEuE64f2mF4BsyyLm+bAH0PTcxDcXmSZ2OTWqBJISAXi/6NH9TfKwB112dAgA4cLgFLa1D7/1Ig8fvGQoqOp0GmWlhvda0AYDTqaCmTr1ZgvtDSgml2q3qcg3BQM1ZmYkGy2LRYcLYSABAZbWDiQ91K6QTH1Z8Dj0R4Tp868bMPh1bWmbDmvVl522XgZhTUAKO9xsAex/bRIaR0zfqAfl/ISI6R8gmPmM0OszRGTkR0TCWlhqG792de972V9edRGMz7/SCweVzEzB+TPsd+Euvl6LV2ucRskREqgjZxEcHAUs/ZkKmoUenFYgIP/stLKXE7BlxsDvOb3LyeCQ++6qONQ8+NHVyNKIie+4Nl5NlQUS4DlJKzLk4Dk6Xb2rEzGGhMaxgyqRo5GRb4FUkPv+qHl4v33z9kZNlxpiO6S6IfCUkE59ICFg4wR91QwiB/AlR3e5zuhQcKWpFY5MLLrfvv4A00TqYwyRM/WiEdboU1WtBRLQO6DIcW7Z4gEF2RdJogNhoAyZPiOrTEGMhBKZMih7cRUPQ6TmqPB4FhUWtcHfzvvN4JZpYQ3memGg9RuWGY8rE4fe+IXWFZOLzdX0YkljbQ/1kNGjw7aVZeHNDOYqOt/m0bKERMC2Kw6V6E/I1fR8PWFRsxZvvVPg0lrPiEgKmb8Setc3xRh2UusF90VrMOiy/LZsrpfeRTqfBHbdkdbuvtt6F518p8W9AIeCWxemIjgqthZmHo7S0tIlPP/10ycKFC89adPHdd9+N+Pa3vz2iurp6X3fnLV68ODstLc315JNPqvcB2IOQTHwA8AOXBkQIgSvnJ2HenDNNLp99WYcjRdbO59OmxGDKpLNrjex2L157s6yzmUynE1h2Yya+CvfiZMf83qffk8H23jwdj2L1wvFOfXuNTz/FROtxw3Vpnc+1muB6jaGgp/dFbLQey2/LPm/72+9XoqaWo+ioew+Pysq3NTao9h1ujon1/O/R0qCaHdpXQirxMQCYoNWzmYsG5dw+KWNHRZy1LXeEBQlxxrOOcbkUzCiI6Ux8tFqBxHgjjIoDfZ7drhsx0QbMKIjpdt/JU3ZUVjsGXPZ5vBKysX9Jz0WToqDXaxBu0Z33OyHf0Ok03f5u9X2cLVotBoMGUyZ232zsS80t7rNuPHwlK8N8Xh/AoUTNpMcf5QdSSL0wIwTmaI1Bd0dNoW3c6EiMGx15wWMMBg0un5t4/o5B9tVNiDfia5d2Uy6Az7+q65yHxGb39q1TtgSkzQtoAXGBiQYvxGjQQKdrnzBu7qx4WMwh9TExZISZtLCYtZAAbDb/zg+l1wvExehx+dwE1T9vj5e0nZX4aDRAWJh20NcdleuThbypD7Zu3Wr50Y9+lFlbW6tfsGBB0yuvvFJ67jFffPFF2N13351dWlpquuyyy5rP/f/9+c9/nvTss88mCSHw0EMPVfzoRz/K2r9//4EJEyb4vNqTHWWIgtQlF8dhxfJcrFiei9iYPvZ1kIB9bS08hfYBX/fK+YlYsTwX37s7J2RGTw1FNyxMw4rlubj39hHQav17szd9Sgxuv7n7PklqS4w3YsXduYiMYMIdKtavXx/34YcfHi0qKtp//Phx00MPPZTSdb/D4RA33HBD3o033ljf0NCw5/rrr2/cuHFjdJfzI5955pnkDz744GhxcfGBzZs3qzqUj+8soiAlhOic/O9/rko+a0TQh5uqUVvn6v7EbmqGxml0GBttgnJD781V8bEGaNiHJ+A0QgCivQbulsXpPp2G4fOv6lB6qvvk+LqrU5CeGha494AA338h5u67767Jy8tzA8CDDz5Y+cADD2QsWLCgs7Pzpk2bLB6PR/ziF7+o0Wg0uOOOOxqffPLJpNP7161bF3vjjTfWTZ061QEAjz76aMU777wTe/6VfIOJD1EISE0OO+v5mJERSIhzQVEkCo9Ze/1SjBQaZOj1QAZXoAs1Go1AZrrZp2VW10YAQqC0zNa5zWTUIDfbguxMM8It/vtqsFh0GDf6zA1+TBTfo6EmMzOz8y4sNzfXWVtbe1YVdVlZmT4xMdGt0ZxpZEpPT+9swqqqqtIXFBS0dSmjh7s63wiZxEcDQM++PUQAgLkz4wG0d7ouLTsOj/fszka8Y6YLmX5RDJISjKioOlPrExdrwMJrUv0eS1KCEYsCcF3ynZMnT3YmOsePHzckJCSclbikpaW5a2pq9Iqi4HTyU15ebhwxYoQTAJKSktynTp3qLKO4uFjVeQxCJvG5SGvAxVrO6UDUlV4v8L27c87b/qnixEFweQjqWUZaGH54b96ZDcyVaYBeeOGFhMWLFzeFh4crv/vd71Kuu+66xq77L7/88jatVisfffTRxJ/85Ce1a9eujdq3b5/5kksuaQGAJUuWNHz3u9/NvvPOO+tHjhzp+uUvf5nS/ZV8I2Q6N2sA6ITgiC6iLoQQ0Os15z1Y40O90WjOee/oQubrgNA+z06wlL948eKGBQsWjMrLy5uYlZXlXL16dWXX/SaTSa5bt6749ddfj4+NjZ38xhtvxF555ZVNp/cvWbKk5a677qpZsGDB6Nzc3AkzZsxo6zhPlVWfhQyChYvSUk3ynuUXHkEwXWvALB3nEaHg8p7bjiLlzOfDZTojJgdBzeQnbgf2K2dmZ75Ya8DF/PshUlXUz3bulFJO9XW5e/fuLcnPz6/zdbnBateuXaZp06aNdzgcO/X6gff52rt3b3x+fn72uduZ4hMNgjjnQURE/ffKK69E2+12UVtbq33ggQfS582b1zSYpOdCQqaPD1EwulxnwmVdxo/rmf4QEfXb888/n/Dd7343W6PRYPr06a0vvPDCSbWuxcSHaBCMIjjrekZqdYjpspBvioYTERJR8Pr888+L/HWtIZn41EoF1l76LmkBZAgNO0vTkJSp0SGTDdlEROcJisRHAuiuk/W5SUlfO2K/5LbjI++F5z+KhcBaU1QQ3qsTERGRWoIi8WmFxKfy7EX4RgoN0rukJf/P48Tznr6tVF0vVRkBR0RERCEuKBIfBUDbOdvc5zxvhkQZExoiIiIahKBIfLrjBmDv0rTlCYL5hogCTZFAmyvw8/EISFgMLrCLHBGFmqBNfI5KBUcDHQRRkLG5jPjLV/OgyMBmHJFGB74zc1NAYyAiGoigTXzUNE+rx2KdiR2bKSRJGfgh9G0uI17dfXG/ovjmhF2wGFRddJnogtpcBrx14CIVr7BTxbLP9uht4/NtrY2qfYebI2I8q/5+cK9a5Z9r5cqVqcXFxcYNGzacUPtawy7xmanRY6bGgDGaYffSiXzGKzUob47txxkSB6tTEaZ3w6j1YGR8NZvJqFt2tx7H6hP7dGyU0Y7MmIY+HVtrDUdJYzxONccg0DcOvqBm0uOP8gNpyL6wntylD0MWJ3OjkCVh0Hrg8uogQ+rDW+CTY+MAADFhbRgZXx3geEgtHkUDrzLw92ZtWzjePZzfp2NHJ1R2Jj4erwbec5qAhQAM2vYRw8fqE/Hp8TEDjou6l5aWNvHOO++sWbduXVxZWZnxG9/4RsNjjz1Wfuutt47YuXNneH5+ftuGDRuKGxoatGPGjJn45JNPlvzmN79JdTgcmuXLl1f/7ne/q1q/fn3kU089lSylhNlsjs7IyHAWFhYemj59+uiZM2e2fv7555GFhYVhkydPtq5fv/5ESkrKoBZoHXaJD1Eosxhc+N7sT/CPPTNQ3hIT6HCIzvPfE3nYfmrEgM8f6DiWjUcn4HBNylnb4i2tuGPqlwOOhfrmnXfeifnkk0+OejweUVBQMO7KK680P//88yVTpkxxzJ8/f+Rvf/vbxOXLl9cDwBdffBFeVFR0YP/+/aZLL7107I033th0/fXXt3z55ZdV3TV1vfXWW7HvvfdeUU5Ojmv+/Pmjfv3rXyf95S9/KR9MvEx8iEKIEIBeq+DSnELY3QZ4FA3eOzIJiuQ0zTR4UgL/LhoH6yBGDtZaI+BR/F+r7pXivOs22Cx468AUXDHykN/jGU7uvffemoyMDA8ATJs2zRofH++ePXu2HQC+8Y1vNG3atCkCQD0APProoxXh4eFy5syZ9tGjR9t37NgRdtFFF/U4Sd/NN99cP2nSJCcAfPOb32x47733ogcb77BJfDReLaJbE1BpMEMRGmg1CjKiGtnPgEJSVkf1vtOjhUZIKCEy20NMWBvSoxoDHUZQ8ygalDUNrDZPr1WQFtn/z7X6NgtanCYAAoW1ybC6TAO6frBxefUorE3GpSM4RlhNKSkpnVPvmUwmJSkpqbMpKiwsTLHZbJ0ZaWZmprvrPqvVesEsOTk5ufN4s9ms2Gy2Qd/lDZvEx+SyYPKR+djU0S/CYnDg/ln/CaleEkTdEUJCIxRIKYK434+EgER+ShlmZh0PdDD9osjTI+n8w+o0Yu3e6RhIB9yYsDbcPf2z9nWA+mFHeRZ2lWf3+3pEviKE8Nvt27BJfIiGIoPWi+9c3D6fTmlTHN4+qOZQ3cG5Y+oXiDWfO0d78Hv/yKQ+jzLyhcHM1dpkN+OpLy/v93luLwd8UGAlJSV5Pv30U4PX64VWq+77kYkPUQgTAjAb2muCUyObsGDkQQDAoZoUnOrXcHP1mfRu6LWht+yM06OD3W0IdBh9IiFCJlZ/CDc4MCurGBaDM9Ch+Jw5Isaj9jw+apXdnWXLljWsW7cuNiYmZnJ6errz0KFDh9W6FhMfoiEiyuRAQXopgPYhwcGS+Og0HsSZ26D1X002EYD2ZPv038RQ48/JBS+kvLx8f9fn547KWrlyZd3KlSvrAEBKedYMj9u2bSs8/XNycrJ3586dhT3tB4AVK1bUr1ixon6wMTPxIRqyuiYager7I5EY3orbCr4K0PWJiM7GxIdoCJozogjTM9pvvF7fMwOtzrCAxDF3xFFMTB7UlBtERD7FxIdoCLIYXLAYXJASmJpeAodbD4dHj90VmfBn7Y/F4ESkqccpOoiI/K7XxEcI8SKAawHUSCkndGyLBbAOQDaAEgBLpJSNQggB4AkAXwdgA3C7lHLXgALz6KH16gdyareMrsDc8RIFkhDAxZntNT+N9rCOxMcfJMINzs7lAkKZWe9CmN4Ju3vgk/oRUfDoS43PywD+DOCVLtseAvCJlPK3QoiHOp4/COBqACM7HjMA/LXj337LOTUJ6VWjB3Jqj0TQznFCNLRohcRd0z+HSefu/eAgd9XoAxidUIV1+6YHOhQi8oFeEx8p5WdCiOxzNl8H4LKOn/8O4FO0Jz7XAXhFSikBbBFCRAshUqSUlX2OSArkF16KiLZYJipEPhRhdGLZRe2djAtrk7G1LEfV6wnIITEzuhAYCot5E1GHgfbxSeqSzFQBSOr4OQ1AWZfjTnVsOy/xEUIsB7AcAAxRZ8IQACKtcTB4hsaU6UTBQqdRkBbVBABwK1q0Ok04VJMCX3+rRxjtyImthVYTenP2ENHQN+jOzVJKOZCppqWUzwF4DgDCU0xS62nvzyP8ODU80XCVHVOPpPAWnGiIh8Org/ThIqfxZisuzzsC3RBKfDRCwqh1w+nVgdU/RKFtoJ921UKIFADo+LemY3s5gIwux6V3bLugcFsM5u5cjLk7F2POrm9C72EnQiK1mXRu3D/7P8iMbvBpuSWN8fjzl/Ph9AydQaNZ0fW4f9Z/hkSfJSJf2rt3r3HMmDHjLBbLlEceecSna7ukpaVNfPvttyO627dx48bw7OzsCQMpd6CfTO8AuA3Abzv+3dBl+/1CiLVo79Tc3Jf+PUIKaCTXiiHyJyEAnVAwd8RR2NJK4JUavHs4Hx5lcH+LEgJexXc1SMFACLDpjoJKy58uz4e9Wb27i7AoT+QPPul1duhHH300efbs2a1/+9vfDqkWSzeuuuoqa0lJyYGBnNvrp5MQ4h8AvgIwWghxSgjxbbQnPFcIIYoAfK3jOQC8D+A4gGMAngfwnYEERUT+kx7VhFEJNRgZX4Oc2FqEGzjvTneEaG8ijDDaAx0KEVRNevpR/qlTp4zjx48PqT+KXhMfKeXNUsoUKaVeSpkupfyblLJeSnm5lHKklPJrUsqGjmOllPK7UspcKeVEKeUO9V8CEfmCTqNg8cRdyIwZ7FI4Ehox9GpHNEJi0YTdyIur6f1gomHg4osvHrV169aIn/70p5lms3nKvn37jFVVVdr58+fnhYeHT5kwYcLYFStWpBYUFPQ4N82aNWui8vLyxkdEREyePn366F27dp01smnr1q2W3Nzc8ZGRkZOvv/76bJvNJgDg3XffjUhKSpo0kLiHVn00EQVcdkw9vjtrE4w6vy7uTER+tmXLlqMFBQXW1atXn7TZbLsnTZrkvOuuu7LMZrNSWVm59+9///uJN954I76n8/ft22e86667cv7whz+U1dXV7V2wYEHTwoUL8xwOR+cIgvXr18d9+OGHR4uKivYfP37c9NBDD6UMNm4mPkTkU1qhIEzvHhJz+FBwq26NwsbC8dhYOB6VLdGBDmfY83g82LhxY/Sjjz5aHhERoRQUFDiWLFlS19Pxr776auy8efOaFy1a1GI0GuXDDz9c7XA4NB9//HH46WPuvvvumry8PHdSUpL3wQcfrPzXv/4VO9g4h86wCyLyiWiTHTFhbWi0WwIdSlCKNDkQZ7ai3hbe+8GkqiaHGbsrsnrc71E0qGqNBAC0Ojk3nNoqKip0Xq9X5OTkdA5/zMjIcF3geH3X/VqtFikpKa6ysrLO9aoyMzM79+fm5jpra2sNg42TNT5EdJZLc47i66P3A5AdD+pqVlYxvjF2T6DDoD5oslvw0o5L8NKOS7CzPDvQ4Qx5qampHq1WK0+cONGZuJSVlfWYqKSmprq77lcUBZWVlYaMjIzOxOnkyZOd+48fP25ISEjoMZHqKyY+RHSelMgm3DNjM8L0g/6MIaJhQqfT4corr2xatWpVamtrq2b37t2mN998M66n45cuXdqwadOmqA0bNkQ4nU7xq1/9KslgMMivfe1r1tPHvPDCCwnFxcX66upq7e9+97uU6667rnGwcTLxIaLz6LUKosNs0PR/UvZhIdzoxOzsIhg5oSEFSliUuqMHBlj+888/f7K1tVWbkpKS/61vfWvEwoULGwwGQ7cfJPn5+c5nn332xMqVKzPj4+PzP/jgg+i33367yGQydR6/ePHihgULFozKy8ubmJWV5Vy9enXf1/7sAfv4EFGPIo0OuL1auLz63g8eRiKMTszJLsKBqjQ4PfzdkP/1ZXJBf9i2bVth1+epqameTz/99Njp5/fdd19aSkpKj1XHy5Yta1q2bFlTd/vKy8v3A8Dq1aurzt2nKAr0ev2A7sxY40NE3RIAbiv4EvkppwIdChGFiN27d5u2bt0apigKNm3aZF67dm38okWLuk1sBmPfvn1hGRkZzoGcyxofIuoWh6MTUX+1tLRovvWtb+XU1tbqY2NjPffee2/1rbfe6tPE54477sj46KOPol944YUTAzmfiQ8RdUtK4FBNKmrbOGy7J2MTK3GiIR7V1qhAh0IUFC699FLbyZMnB7SGVl+99NJLZQDKBno+Ex8i6pYE8MmxMWhzcf6T7ggBzMsthFajMPEhCiHs40NERBTcFEVR2PjcDx2/L293+5j4EBERBbcDtbW1UUx+eielhNPp1JeWlkYD+G93x7Cpi4jOY3frcao5Bl5FG+hQgl5sWBuyoutQ2hSH9rFwRL7l8XjuqqqqeqGqqmoCWGHRG0UI0ez1ep9UFOWv3R3AxIeIzlNjjcD6/VMDHUZImJBcgbSoRjyz5bJAh0JDVEFBQQ2A/wl0HEMFM0ciIiIaNoZt4uP06LGxcAIabOZAh0JERER+MmwTH4+ixd7KTLS5jIEOhYhCnE6jICWiGTpNt4NIiCiIDNvE5zSJ9onaiKgd/x76L8LoxO1Tv0Sc2Yr2TxUiClbDPvF5++AUfHJsbKDDIAoaHx8biw2HpgQ6jJB0w6QdmDOiKNBhENEFDPvEp81lgs1tCHQYREHD5jawCXiAIoxOhOl7XIiaiIIAh7MDcHm1aLKHIcpk9/nCjG6vBlYffYnoNAoijANajJaIiIjAxAcAUFSXhNLGeKyY/TH0WsWnZVe2RGPNnhk+KSs1sgm3FXzlk7KIiIiGIyY+AAABt1eLV3fNxPy8I8iOqfdJqZuPj8LhmhT4ajbXWmsEXtw+u9fjrh59ACmRzT65Jg0fHkWDf+yZjjquxj4oYxOqEGduw9o90yE5kzNR0GHi00FCoNoaBadn8L8SRRHYV5WGEw3xaLRbfBBdO7ei69Mq0C4vlxnwpRprBE41x/i83Ny4GkSZHD4vtzsVLVGoar3we8erCFS2RMEr+f4ZDLPBhUS0QAgJKZn4EAUbJj7ncHl1cHq0MOoGNh+HVxGwuQ34uGgc3Epgfr1Orw52t94nZRm0Hmg1/h+e6/TooATJl8ax+kRsPj7a5+UumbRd9cRHyvbf5ZGaFGwty1H1WkREoYCJzzneOzwRh2NTsCR/x4DOP1afiLcPTgnol/ZbBy7yWQX7DRN3ICeuzkel9d0/9kxHtTXS79ftTqjftb+8czaa7JyhnIgIYOJzHgnNoJIWKQUUGdhZAqTU+GwKtc0nRmH7qeyztsVbrLg874iPrtA9JQh+j6GuwWbGv4vGodVpYl8TPzPqPLh+4g5sPj66T83TROQ/THy6YXMbUFSXiJzY2n4185xqjkZlL/0oQk1Va/R525odZmRENyAnpg46H4+Cc3u1ONEQB6fHN011way8JRphehdSVeqI7vTocLwhUZWy6cK0GoncuDpsY/MiUdDhLXU3qq1ReOvARbC5DfAomj4/PjsxCltO5gY6fNXV28Lxz/0FsLqMUHzY/UeRAs0OE/55oABNjqHfNPNFyUh8UZLX+f7x5e/Sqwh4WWNGRHQe1vj0QJECz22d268GApcyvEbD/G37HMzNKcS09FKflLflZA6+Kh36iWNXxxsS8OR/LwcAXDn6AMYnVfqk3E3FY7CnMsMnZRERDSVMfHok4PIO/eaWgRNweXU4UJWGNpcRl444OuBZr6Vs/6I+0RgPl3d4vSUVqYHT214z41V8V0PjUTRwD7PfJRFRX/CTkQalqjUadrcBI+NqkBje0u+Zr11eLWqsEThYnQqry6RSlKGhyW5GeXN7n6rkiOYBTSMgJVDVGhXQtbYcHn3n64gOs8Fi4NpVRBQ82AmABq3ZYcYru2ahyWGG7Md3tZRAfVs4Xt01a9gnPQDwRelIvLJrFl7ZNRNtLiOkxFmP3kgJeKXA2r3TcLQuWf2Ae1DeEtPxOmahqC6pX+8JIiK1scaHfOYfe6ajIK0Us7OL+3T85hOjsI/9ULr1952zoBFnMoabJ29FrNl2wXPKmmPwzqHJQTUiblPxaByrT8T1E3cGOhQiIgBMfMiH2lwmHKtPhKePnbyP1ycEtEkmeInzasC2luXArD+7ySgxvAVjE6sAAAerU3GsLhGtzjC/RdkXDo8BlS1R2Hx8FGZkHodJ5wl0SEQ0zDHxIZ+qaIlBRYvv17Ua7vZUZJ63bWR8NZLCWwAA+yvTcKIxwd9h9YnVZcKXpbkYEVuLBEsrwvRMfogocJj4EIWoorpEFNWFygSFAmt2X4xLc45iVlbfmkKJiNTAxIcoZIXaMhQCO05l4XBNCgBg0fhdvfZbIiLyNY7qIiK/aXOZUGONRI01Evsq01HWxGZRIvIv1vgQUUB8dTIPdrcB8RYrTDr3gCfAJCLqD9b4EFHA7KnMwAvb5oBT/RCRvzDxIaIAElAkq3qIyH+Y+BBRQHkVDY7WJsPmMgQ6FCIaBpj4EFFAOb16/OvgRahtCw90KEQ0DDDxISIiomGDo7qIiHzM5dHio6LxrMUiCkJMfIgooDRCQUpEM4xDZB0vq9OIKmskDlSlQYbcJJNEQx8THyIKKJPOjaUXfQXNEMgRpAQKa5PwUdGEQIdCRD1g4kNE5CPr9k1DRUt0oMMgogtg4kNENEh2tx5bTuagujUSTo8+0OEQ0QUw8SEiGgSbS49qayS2nMxB6C0cSzT8MPEhIhqEHeXZ+KIkD0x6iEIDEx8iogGQEnhj31RUtUaBSQ9R6OAEhkREA1RvC4fNbQx0GETUD0x8iIiIaNhg4kNERETDBhMfIiIiGjaY+BAREdGw0WviI4R4UQhRI4Q40GXbr4QQ5UKIPR2Pr3fZ91MhxDEhRKEQ4kq1AiciIiLqr77U+LwM4Kputv9RSjm54/E+AAghxgG4CcD4jnP+IoTQ+ipYIiIiosHoNfGRUn4GoKGP5V0HYK2U0imlPAHgGIDpg4iPiIiIyGcG08fnfiHEvo6msJiObWkAyrocc6pj23mEEMuFEDuEEDtsbtsgwiAiIiLqm4EmPn8FkAtgMoBKAI/1twAp5XNSyqlSyqlmvXmAYRARBY6ABCADHQYR9cOAEh8pZbWU0iulVAA8jzPNWeUAMrocmt6xjYhoyFlW8BWmpZcEOgwi6ocBJT5CiJQuTxcBOD3i6x0ANwkhjEKIEQBGAtg2uBCJiIKPEIDF4IJB5wl0KETUD70uUiqE+AeAywDECyFOAfhfAJcJISajvY63BMA9ACClPCiEeAPAIQAeAN+VUnrVCZ2IiIiof3pNfKSUN3ez+W8XOP5RAI8OJigiIiIiNXDmZiIiIho2mPgQERHRsMHEh4iIiIYNJj5EREQ0bPTauZmISC2jEyoxPeMERKADIaJhg4kPEQVMhNGB9KimQIdBRMMIm7qIiIho2GDiQ0RERMMGEx8iIiIaNpj4EFFApEQ0ITbMFugwiGiYYedmIgqIr4/Zj8Tw1kCHMWgCEgISkmPTiEIC6kY94wAAE0VJREFUa3yIiAZhRuYJLCv4Eu1rNhNRsGPiQ0Q0CAatF2F6V6DDIKI+YuJDREREwwYTHyIKADYLEVFgsHMzEflVpMmGmyZtR1SYPdChENEwxMSHiPxKKyRizW0QHARFRAHAxIeIhhybWw+vcqYl36RzQ69VAhgREQULJj5ENOS8eygfxQ0Jnc+vHbMPE1PKAxgREQULJj5ENOS0d50W5zwnIuKoLiIaBsqbY1BcHx/oMIgoCLDGh4iGvD2Vmahpi0B6VCMMWq/PO1YLtE9k6PZquXQFUZBjjQ8RDQuVLdF46ovLYXUZfV52lMmOFbM/RsIQWHuMaKhjjQ8R+c24xHJMTFavk7HLq8X7Ryai2hp13j4JAbeiVeW6QgB6rQLB3kREQY+JDxH5gUR6VCPy4muQE1enyhVanUZUtETjSG0ypAxMZXZqZBM8ihb1tvCAXJ+IesemLiJSmYRGSFw3bg/GJ1WqdpXi+kS8daCg16RHkQJSpYqZq0YfREF6iTqFE5FPMPEhIlUlh7fge7M+QbjREehQAAAvbr8Eu8qzAh0GEQUIEx8iUs24xHLMzCqG2eCGRsXBTltOjsDB6tQ+HCng8BjgVtT76MuIasBlOUfY34coSDHxISIVSCRYWjEmsQpjEqtUu4pXEahujcD+ynScbIrr83lWpwl1bRZVYkoMtyI/pQxCMPEhCkZMfIjI57RCYumUrzA6oVq1a0gJWF0mvLjjEtTZIvp17vZTIzr6A6kUXCcmP0TBhokPEYWkXeWZWLN7RqDD6JZJ78bd0z9DWmRjoEMhonMw8SEin4oOa8PFmcXQatRZDV3K9qTnaF0ymh1mYIAzJdvdenx1Mhc2l963AQLQCCDWbOOK8ERBiIkPEflMmN6FjKhGzM0pUvVLf1vZCJQ0Dm7tLZvbiM3HR8Pm9v1MzkQUvDiBIRH5zNfH7MPIuJpAh0FE1CPW+BDRoOk1Htw6ZQsyohp8vgBoVw02M17ZNRMtTpPPytxwaDJ2nOK8PkTDBWt8iGjQNEIiNbIJOpX69QBAeXM0TjTEo6Ilxqfl1lgj0ewI82mZRBS8mPgQ0aBohAKDzgO1hm5L2b746L6qdOypyFTlGl5FA6dHC4PW65MaKykBp1cHRapY/UVEA8LEh4gGZVxiBa4ecwBalSbskxB4fttcWH3YvHWuXeVZOFafiHsv/nSAY8TOZvfo8Zcv56m2GjwRDRwTHyIasHk5R5AdW6dKE9eWkyNwqjkWUgI2lxHSJylJ9yQEPL5cxkICXqnBQIfaE5F6mPgQUb9phReZMQ3Ii69GvKVNlWtUtkSjqC5JlbKJaPhi4kNE/WY2uHDjpO0+H8ElJQLaL0aRGggoqo5MI6LAYuJDREHjaF0S3j8yEQDg9vr346nNZcRTX8zHkkk7kBbV5NdrE5H/cB4fIuqXEbG1uDSn0OflbivLxq7yLDg8Bjg8ho4+Mv4k4PAYfFLjZNB6sWDkQcSZrT6Ii4h8iYkPEfVZvLkVeXE1mJhc4bPmIK8iUNUaiYPVqYNehsIXGmwWNNkHN6+PTqtgSloZIowOH0VFRL7CxIeI+kACkPjmhF2Yml7qu1Il4PDo8fKO2ahqjfZZuYPxfuEkfHZiVKDDICKVsI8PEfUqNqwNS/K3I9LHNRj7q9Lw+YmRKk19SER0Ptb4EFGvNBqJmDA7tBrfpSi7yjNxuCYFLU4zgm2+m1prBL4qzYFXCa64iGjwmPgQ0QWZdC6f9lX5/+3da3BU93nH8e+zWgkJCYHERQiQEOZmsMdc7GBsnNSxp47tZoI7k3GdF47rusGdIZNkJi/q5k3bmb5IXzSZZKbxlI49xm0Sx5OQmrGduIGYOLQxJgZirrbFLSAuEggkdJd2n77Yg7sCCXTZ3bPa8/vMaLT7Pxc95+G/0sP//M85iaRxubuM3acbONY6K2P7zaTmzkr+9+QiPXJCpADpVJeI3NC984+ypu54xvbX1lPGv+36k4ztT0RkNFT4iMgNmXnGruB6v6mevU1XHzSq0RQRyT0VPiJynfKSHhZNbwFgZvn470XjDoebazl6YRYtnZXj3l8uJNzYf24eMUsyZVIPC6dfCDskEckAFT4icp3pkzt59Nb9495PfyJGIhnDMX599Fau9I7v/ji5lEgW8dZHtwOwoKplTIVPSdEAxbEB+pP6VSuSL/RpFJGs2d64jA/O1gGpEZSoeey2vXzYMpvXDq0KOxQRCajwEZFB1tQdY+nMcxnZV9JjITx6In8UxZyY6S5FIvlEhY+IDDK7op1543xIpzscb51Be09phqISEckMFT4iEkiNTtg4RigSScOBRDLGfx1aRe9AcebCExHJABU+IgJAPJbk2bt/Q3lJ75j38frhFRxtnQlA74B+vYhI/tFvJhGhpqKNO+edpLykd1yPpehLFGmUR0TymgofkYirLutgQfUFVtSeHtP2XX3FXO6ZDKCiR0Ty3k0LHzOrA14GagAHNrn798ysGvgJ0ACcAB5390tmZsD3gEeBLuAv3X1PdsIXkfF6aMlBFlRfHPP2jRdreOPIHRmMqBBdHUWL3iX9IvlmJNeZDgDfdPflwFpgo5ktB54Dtrv7YmB78B7gEWBx8LUBeD7jUYuITBALp7fwlTXvUBxLhB2KiDCCER93PwucDV5fMbPDwFxgPXB/sNpmYAfwt0H7y+7uwLtmNs3MaoP9iEieiMcSrK0/xrSyrlFv2zsQ571TC3Cg+crEeARFWIqLEkwt7dZgj0ieGNUcHzNrAFYBu4CatGLmHKlTYZAqik6lbXY6aBtU+JjZBlIjQlSWTh1l2CIyHiVF/VRP7mJdQ+Oob7DX0x/nQlcFO08sQn/NRWSiGXHhY2YVwM+Ab7h7u6U9rtnd3UZ58w933wRsAqitnKNbm4rk0O01Z3hoycExPXV975l6dhxbiooeEZmIRlT4mFkxqaLnh+6+JWg+f/UUlpnVAs1BexNQl7b5vKBNRPLAF5bvo25q66iLHnfYcmA1Z9qnoaJHRCaqm05uDq7SegE47O7fSVu0FXgqeP0U8Fpa+5ctZS3Qpvk9Ivlj+uQOKkt7RrVNd38xe8/U09RWRUefHkMhIhPXSEZ81gFPAvvNbF/Q9i3g28CrZvYMcBJ4PFj2JqlL2RtJXc7+dEYjFpExMZxJ8f5Rz+npT8S40FnBWx/dnqXIoqEs3k8yGe2Htorkg5Fc1bWT4ce1HxxifQc2jjMuEcmwytJunr37N6MufH57fAm7TzdkJ6iIiMeS/M3aHbx+eAWHmueEHY5IpOnOzSIRcFtNEytrTwUPIR3ZNu6w9fAKmtqqSGqUYlzMoMictfVHmVXRzo5jt4YdkkhkqfARKWhOQ9VFFk1vpr6qdcRbdfUXc+pyNUcvztJjKDKoZsoVepRPkVCp8BEpcI8s3c+0su5RbdPSMYUtB+7MUkQiIuHR+LWIiIhEhkZ8RArU1NIu7mv4mMnFfWGHIiKSNzTiI1KAppZ2UT/tInfUNlES18Mx88mk+ABzKi8Rs2TYoYhEkgofkQK0tv4Yn1+2P+wwZAizp7Tz5OrfUaaROJFQqPARERGRyNAcH5ECYjj3zD/KnMrLYYciIpKXVPiIFIh4LMHU0m7urjtGafFA2OGIiOQlFT4iBaJuait/sWJ32GGIiOQ1zfERKSBmjPiRFDdSO6WNp+/aqQm4IlJwNOIjUgBuqW5m0fSWjO2vJJ5gVkW7LrkWkYKjwkekAKycc4qlM8+HHYaISN7TqS4RERGJDI34iBSAnccXs6dpPjFL8tht+5gU11VdIiJDUeEjUgCaOyuhM3Ufn49aaiiJD1Aa72d+VWvYockQDFhY3cKptmoudZeHHY5IpOhUl0gBcYzXj6xgy4E72d64jP5EDPex7y8eS2JognOmmcGfLdvP0pnniMcSxGMJYBz/UCIyYip8RApUc0cl3/+fB2nvLRvT9gb89ad+y6q5f8xsYPKJTy/4mK+t28bX1m2jqqwr7HBEIkGnukQKlGP0JeJs+3gZJUUDTC7p44GFR0Z8nx+z1GXtRRbtkYi75p5g0YzsXDEXjyWJx8AdHlh4mN5EMT39xWxrXEaq9BSRTFPhI1LQjI8uzAagoqSHJcEf8IpJvRphGKH6qossqL6Y1Z9hBktmNgPQ2VfCkZbZwetJmgMkkmEqfEQioqOvlP/cew8Aq+ac5HNLDgI3v9OzmTP8/BONSmRaeUkfT65+F4APzs7ljSN3BEuUa5FMUOEjEkEHzs3ldFs1f/WpndhNJtWua2hkTd3xQW0dvaW89P692QxRgGWzzjKn8jIv7P40SVfhI5IJKnxEIqg/GedS92R2HF2KmTOz/Aq3zz4z5Lql8QFKr7kvkOuPcE4UFyWZVtbN/bd8SNKN1q5yPjhXF3ZYIhOaCh+RiBpIFrHr1C0ALKhqobayjeqyzhFNfo5ZkumTO2nrKWMgWZTlSKMtHktyd31qxO2Pl6o53V513TqXuyeTdF2kKzISKnxEhOOXZvDi7vv4+rptlMQTN12/vKSPr6x5h5f33MOZIf4QS3bUTWtlw5p3rmv/we8+O+bbFohEjQofEQGMgWSMzXvuvemcn3S64ii3rh2Na+6YwtZDK+jomxROQCITkAofEQkYFzqnhB2EjEJ/ooiWzsqwwxCZUFT4iIhMIO7Q3V+CAz0DxWGHIzLhqPAREZlAEm5seu8z9PTH0b19REZPhY+IyASTdMP1qEWRMVHhIyISkvNXptA6ygniyWSMZFIjPSJjpcJHROQGBpIx+hPZGV35w9k63m9qyMq+RWRoKnxERG7gjSN38ItRXOI/GgnddFAk51T4iIjcQCJZxM1v6SgiE4X+uyEiIiKRocJHREREIkOFj4iIiESGCh8RERGJDBU+IiIiEhkqfERERCQyVPiIiIhIZKjwERERkchQ4SMiIiKRocJHREREIkOFj4iIiESGCh8RERGJDBU+IiIiEhnm7mHHgJm1AJ3AhbBjySMzUD7SKR+DKR+DKR+DKR+D5Sof8919Zg5+joxDXhQ+AGb2e3e/K+w48oXyMZjyMZjyMZjyMZjyMZjyIel0qktEREQiQ4WPiIiIREY+FT6bwg4gzygfgykfgykfgykfgykfgykf8om8meMjIiIikm35NOIjIiIiklUqfERERCQyQi98zOxhM/vQzBrN7Lmw4wmDmZ0ws/1mts/Mfh+0VZvZr8zs4+B7VdhxZouZvWhmzWZ2IK1tyOO3lO8H/eUDM1sdXuTZMUw+/sHMmoI+ss/MHk1b9ndBPj40s8+FE3X2mFmdmb1tZofM7KCZfT1oj2QfuUE+ItlHzKzUzN4zsz8E+fjHoH2Bme0KjvsnZlYStE8K3jcGyxvCjF9yL9TCx8yKgH8FHgGWA18ys+VhxhSiz7r7yrR7TTwHbHf3xcD24H2hegl4+Jq24Y7/EWBx8LUBeD5HMebSS1yfD4DvBn1kpbu/CRB8Xp4Abgu2+UHwuSokA8A33X05sBbYGBx3VPvIcPmAaPaRXuABd18BrAQeNrO1wD+Tysci4BLwTLD+M8CloP27wXoSIWGP+KwBGt39mLv3Aa8A60OOKV+sBzYHrzcDj4UYS1a5+ztA6zXNwx3/euBlT3kXmGZmtbmJNDeGycdw1gOvuHuvux8HGkl9rgqGu5919z3B6yvAYWAuEe0jN8jHcAq6jwT/zh3B2+Lgy4EHgJ8G7df2j6v95qfAg2ZmOQpX8kDYhc9c4FTa+9Pc+ANcqBz4bzN738w2BG017n42eH0OqAkntNAMd/xR7jNfDU7dvJh26jNS+QhOS6wCdqE+cm0+IKJ9xMyKzGwf0Az8CjgKXHb3gWCV9GP+JB/B8jZgem4jljCFXfhIyn3uvprUEP1GM/tM+kJP3XMgsvcdiPrxB54HFpIayj8L/Eu44eSemVUAPwO+4e7t6cui2EeGyEdk+4i7J9x9JTCP1GjWrSGHJHks7MKnCahLez8vaIsUd28KvjcDPyf1wT1/dXg++N4cXoShGO74I9ln3P188Ms9Cfw7/3+qIhL5MLNiUn/kf+juW4LmyPaRofIR9T4C4O6XgbeBe0id4owHi9KP+ZN8BMunAhdzHKqEKOzCZzewOJh9X0JqAt7WkGPKKTMrN7MpV18DDwEHSOXhqWC1p4DXwokwNMMd/1bgy8GVO2uBtrTTHQXrmjkqf06qj0AqH08EV6osIDWh971cx5dNwfyLF4DD7v6dtEWR7CPD5SOqfcTMZprZtOB1GfCnpOY9vQ18MVjt2v5xtd98Efi1606+kRK/+SrZ4+4DZvZV4C2gCHjR3Q+GGVMIaoCfB3Pr4sCP3P2XZrYbeNXMngFOAo+HGGNWmdmPgfuBGWZ2Gvh74NsMffxvAo+SmqDZBTyd84CzbJh83G9mK0mdzjkBPAvg7gfN7FXgEKmrfTa6eyKMuLNoHfAksD+YxwHwLaLbR4bLx5ci2kdqgc3BlWox4FV3f93MDgGvmNk/AXtJFYsE3//DzBpJXUTwRBhBS3j0yAoRERGJjLBPdYmIiIjkjAofERERiQwVPiIiIhIZKnxEREQkMlT4iIiISGSo8BEREZHIUOEjIiIikfF/THVJi3GOnuIAAAAASUVORK5CYII=\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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/demo/demo.png b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/demo/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..1e82d7a0773cea14b36f0021fea603de0961b5d8 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/demo/demo.png differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/demo/image_demo.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/demo/image_demo.py new file mode 100644 index 0000000000000000000000000000000000000000..183f23871b7ff4607066b4e29727313e575b14e4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/demo/inference_demo.ipynb b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/demo/inference_demo.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..e47d964e3c41d1db5e348d22d8ec01641c8aa88b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docker/Dockerfile b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..8e090f73a9e5b8aa09eee256e7876c8b4401f055 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/Makefile b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d4bb2cbb9eddb1bb1b4f366623044af8e4830919 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/api.rst b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/api.rst new file mode 100644 index 0000000000000000000000000000000000000000..9c14a67564029b83900001ab565954539bb7c081 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/changelog.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/changelog.md new file mode 100644 index 0000000000000000000000000000000000000000..faf1df3d217d728ea84f8c4685722018ae523a72 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/conf.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..f472acb30abdbcf5191926a8d89f478c1210744c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/dataset_prepare.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/dataset_prepare.md new file mode 100644 index 0000000000000000000000000000000000000000..5407339f13909c3bf32556dc273076d8bb351ba6 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/get_started.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/get_started.md new file mode 100644 index 0000000000000000000000000000000000000000..3182c53451dae3024a4e99aace1c766856773d66 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/index.rst b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..94db9026574e36dbaa668023e9783ccb669b5b3a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/inference.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/inference.md new file mode 100644 index 0000000000000000000000000000000000000000..d7bc21b65acb9da4a38ade92be6ccf3c56574982 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/make.bat b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/make.bat new file mode 100644 index 0000000000000000000000000000000000000000..922152e96a04a242e6fc40f124261d74890617d8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/model_zoo.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/model_zoo.md new file mode 100644 index 0000000000000000000000000000000000000000..2d4c1c2ac999c771e7048c36bd94d316457f0e50 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/stat.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/stat.py new file mode 100644 index 0000000000000000000000000000000000000000..3aaf0607004e1aa9d92001da78521afe51057034 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/train.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/train.md new file mode 100644 index 0000000000000000000000000000000000000000..1deac95f7d18185ff0586f81095587471eac46c4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/config.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/config.md new file mode 100644 index 0000000000000000000000000000000000000000..b243c06d5b60fc09135b227235241c6583325a6b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/customize_datasets.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/customize_datasets.md new file mode 100644 index 0000000000000000000000000000000000000000..020d51316e15a7f6926f49d81dcd2509f5170e07 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/customize_models.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/customize_models.md new file mode 100644 index 0000000000000000000000000000000000000000..f637fd6f0431ea0de748e39806be51d1b4849c8e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/customize_runtime.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/customize_runtime.md new file mode 100644 index 0000000000000000000000000000000000000000..dd67ef54f639fa0b3b9a01727d16352752d30899 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/data_pipeline.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/data_pipeline.md new file mode 100644 index 0000000000000000000000000000000000000000..1eecfe91d433ca897ae47a5ae9b8c5f406a3fe2b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/index.rst b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..e1a67a8b44a9ac3c2bbee59304c2043467ac3f30 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/training_tricks.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/tutorials/training_tricks.md new file mode 100644 index 0000000000000000000000000000000000000000..98a201fa649d94525facd8237d32effd6560c658 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/useful_tools.md b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/docs/useful_tools.md new file mode 100644 index 0000000000000000000000000000000000000000..514b5680ee4eff351affd3bfa169c11d5dee9b9f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/pytest.ini b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..9796e871e70c7c67345b1d6bcf708c0c82377a98 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements.txt b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..6da5adea757ffc79ac35e544d4afe85c5f44a90d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements.txt @@ -0,0 +1,3 @@ +-r requirements/optional.txt +-r requirements/runtime.txt +-r requirements/tests.txt diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/docs.txt b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/docs.txt new file mode 100644 index 0000000000000000000000000000000000000000..89fbf86c01cb29f10f7e99c910248c4d5229da58 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/docs.txt @@ -0,0 +1,4 @@ +recommonmark +sphinx +sphinx_markdown_tables +sphinx_rtd_theme diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/optional.txt b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/optional.txt new file mode 100644 index 0000000000000000000000000000000000000000..47fa5933159eb068640f6b45281d36ab4af294cb --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/optional.txt @@ -0,0 +1 @@ +cityscapesscripts diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/readthedocs.txt b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/readthedocs.txt new file mode 100644 index 0000000000000000000000000000000000000000..0542bfce6dff3b002a1d33e53c0be975e7feed4a --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/readthedocs.txt @@ -0,0 +1,3 @@ +mmcv +torch +torchvision diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/runtime.txt b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/runtime.txt new file mode 100644 index 0000000000000000000000000000000000000000..4ba146c5647eb631374b845bf65b772341c6ae11 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/runtime.txt @@ -0,0 +1,4 @@ +matplotlib +numpy +terminaltables +timm diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/tests.txt b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/tests.txt new file mode 100644 index 0000000000000000000000000000000000000000..991fd711d4eed749f8f3440f9c4b448e3973575f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/requirements/tests.txt @@ -0,0 +1,7 @@ +codecov +flake8 +interrogate +isort==4.3.21 +pytest +xdoctest>=0.10.0 +yapf diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/resources/mmseg-logo.png b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/resources/mmseg-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..009083a9e80599a1893591ff362da377c94a0975 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/resources/mmseg-logo.png differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/resources/seg_demo.gif b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/resources/seg_demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f0760fe7a86912c07f9873eec3909ad41fe2acb Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/resources/seg_demo.gif differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/setup.cfg b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/setup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..708fb4ce33fcf55bd448bc2234f38c1891ae0356 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/setup.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..2e69551b8f1b221f2fc645e52c6baf020bf5d5e8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/setup.py @@ -0,0 +1,126 @@ +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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/color.jpg b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/color.jpg new file mode 100644 index 0000000000000000000000000000000000000000..05d62b850a70ea53948b6a687f2c14967f882cf2 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/color.jpg differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/gray.jpg b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/gray.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94edd7326f2fdcf311c11f4ad6a8edc62a9ac2a5 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/gray.jpg differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00000_gt.png b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00000_gt.png new file mode 100644 index 0000000000000000000000000000000000000000..48fc125a0522fd06ce03d3e35f03f10b6302ff90 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00000_gt.png differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00001_gt.png b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00001_gt.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb49b05f2bdaafe355ff45f2224027038ca1a52 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00001_gt.png differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00002_gt.png b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00002_gt.png new file mode 100644 index 0000000000000000000000000000000000000000..db7250cf0d9233694ec40eca96a5acb5b17fa150 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00002_gt.png differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00003_gt.png b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00003_gt.png new file mode 100644 index 0000000000000000000000000000000000000000..f96a1be1b282e61f4f8611b9e04f3f9174fbe3ff Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00003_gt.png differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00004_gt.png b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00004_gt.png new file mode 100644 index 0000000000000000000000000000000000000000..35b1cadfcda9e7a5d96d8b6f72c2054212b7688d Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/gts/00004_gt.png differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00000_img.jpg b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00000_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33ab8e29f15a96983b9280a71920bac15db1d23f Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00000_img.jpg differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00001_img.jpg b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00001_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49c222901cdeca4937b353060a458af0f018ff70 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00001_img.jpg differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00002_img.jpg b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00002_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6baeb5fdedad34ab66f31430eb172f27739e1d0e Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00002_img.jpg differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00003_img.jpg b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00003_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e889d759d741291324669ee45876cba1c1e30f1 Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00003_img.jpg differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00004_img.jpg b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00004_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..474c915d8c375db85f5f56469ffc101bec2ee97e Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/imgs/00004_img.jpg differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/splits/train.txt b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/splits/train.txt new file mode 100644 index 0000000000000000000000000000000000000000..9e25ab0266ec1191b5eba9a2c1b353cfd7541524 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/splits/train.txt @@ -0,0 +1,4 @@ +00000 +00001 +00002 +00003 diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/splits/val.txt b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/splits/val.txt new file mode 100644 index 0000000000000000000000000000000000000000..59dd536625d36884256d1e6f24cbae2a96579396 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/pseudo_dataset/splits/val.txt @@ -0,0 +1 @@ +00004 diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/seg.png b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/seg.png new file mode 100644 index 0000000000000000000000000000000000000000..f23a499cefac5d91e6924d7e192ff219727d6f9d Binary files /dev/null and b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/data/seg.png differ diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_config.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_config.py new file mode 100644 index 0000000000000000000000000000000000000000..b991fbfd31233b113a92e927ca6072b54457f73e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_dataset.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..2e19c30f084aefd5a7567f3b05aa3a64e25db4bf --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_dataset_builder.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_dataset_builder.py new file mode 100644 index 0000000000000000000000000000000000000000..c6827e4d1758aa43716aceab793bb33da85a2398 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_loading.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_loading.py new file mode 100644 index 0000000000000000000000000000000000000000..e8aa5d31301caa9a40dfa8ebd8f39ee72d4f6a8f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_transform.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_transform.py new file mode 100644 index 0000000000000000000000000000000000000000..a6417575c39e76607a522b6d1345e5ed2e19999e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_tta.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_data/test_tta.py new file mode 100644 index 0000000000000000000000000000000000000000..cc8c71e57c02d45a3f0587cd9e57caa7b467c5ab --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_eval_hook.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_eval_hook.py new file mode 100644 index 0000000000000000000000000000000000000000..a6a1352ea5419c1876551165edaf833f251e7151 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_inference.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_inference.py new file mode 100644 index 0000000000000000000000000000000000000000..046e036281db50ccc66e75d8e78c6eb63618cac7 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_metrics.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..023bbb0a5563f36ae1902fab4edb8e5240f4ae02 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_backbone.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_backbone.py new file mode 100644 index 0000000000000000000000000000000000000000..9ed6ce222f0c4135c2227c55f60efa1f05e62cec --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_forward.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_forward.py new file mode 100644 index 0000000000000000000000000000000000000000..ee8036246bd7df90d15158266cb5bdbfa3a5730f --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_heads.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_heads.py new file mode 100644 index 0000000000000000000000000000000000000000..e8a8493c160f11c2f51ab6dbca365b5312a6e46d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_losses.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_losses.py new file mode 100644 index 0000000000000000000000000000000000000000..005d9391145dbc18766fb81633fb3eda16b825b0 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_necks.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_necks.py new file mode 100644 index 0000000000000000000000000000000000000000..8fc968450f5e66c804bc7a4ac1cf28a0d635739c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_segmentor.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_segmentor.py new file mode 100644 index 0000000000000000000000000000000000000000..90d3bf6314f03e11d9728890adc532732b05d14c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_unet.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_models/test_unet.py new file mode 100644 index 0000000000000000000000000000000000000000..febe4f0c970c3bc44bd9e8170c706df32122b9b4 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_sampler.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_sampler.py new file mode 100644 index 0000000000000000000000000000000000000000..3c79c16277511db4c470a5cbe7b5aa61b0b0b9bd --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_utils/test_inverted_residual_module.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_utils/test_inverted_residual_module.py new file mode 100644 index 0000000000000000000000000000000000000000..8d5eecf15bf7d5f5ad54aa8e71d61cb40973fa8d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_utils/test_make_divisible.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_utils/test_make_divisible.py new file mode 100644 index 0000000000000000000000000000000000000000..5e9d1062ffcbe3213a22701bad826ae48a52ecee --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_utils/test_se_layer.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tests/test_utils/test_se_layer.py new file mode 100644 index 0000000000000000000000000000000000000000..8bba7b33b93434a7021c69ee2053451cd4066d9d --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/benchmark.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/benchmark.py new file mode 100644 index 0000000000000000000000000000000000000000..cb0df3bdfa65465eb99db2fff4ec80ba08d5bc23 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/chase_db1.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..56bb210edbb359caf57b6048b8e09b94ef295152 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/cityscapes.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99d05b41f58c1d2b92a6cbb4f5859c6d696d0ac8 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/drive.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/drive.py new file mode 100644 index 0000000000000000000000000000000000000000..891f06f725cc7be9da8c65bc0dc56008b8313e30 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/hrf.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..bdeb6e7e5668e097f30bc019c88f9eab6c7fcf07 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/pascal_context.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..dc49ab7ad8fd359c458ec4b6190ed61851426031 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/stare.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/stare.py new file mode 100644 index 0000000000000000000000000000000000000000..6238d62f64de9406ef84ebb4667d7c0e1ce8a8c5 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/voc_aug.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/convert_datasets/voc_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..942746351b64b2e931cb18ce684a1f3ccf7e3866 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/dist_test.sh b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/dist_test.sh new file mode 100644 index 0000000000000000000000000000000000000000..34fb46541d447d923bc3561bbba09bd5c94d7bfe --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/dist_train.sh b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/dist_train.sh new file mode 100644 index 0000000000000000000000000000000000000000..5b43fffbf28fc9b8ba7c14efcd5e4f8b19279470 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/dist_train.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +CONFIG=$1 +GPUS=$2 +PORT=${PORT:-29500} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +python -m torch.distributed.launch --nproc_per_node=$GPUS --master_port=$PORT \ + $(dirname "$0")/train.py $CONFIG --launcher pytorch ${@:3} diff --git a/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/get_flops.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/get_flops.py new file mode 100644 index 0000000000000000000000000000000000000000..bc98c5252591b0c9ec218144c0652ea695a5b96e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/print_config.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/print_config.py new file mode 100644 index 0000000000000000000000000000000000000000..2a0c67780a0620fff1d8748db28177ca3ddcc0ca --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/publish_model.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/publish_model.py new file mode 100644 index 0000000000000000000000000000000000000000..a049f17674b7a1aa730057e5cc294d2368fe707c --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/pytorch2onnx.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/pytorch2onnx.py new file mode 100644 index 0000000000000000000000000000000000000000..2ec9feb59a86db61a8368d2239f8ef0dcb461d41 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/slurm_test.sh b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/slurm_test.sh new file mode 100644 index 0000000000000000000000000000000000000000..4e6f7bf4e33267f269cf0f455924cb70166ccd4b --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/slurm_train.sh b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/slurm_train.sh new file mode 100644 index 0000000000000000000000000000000000000000..ab232105f0309c720ed81a522eca14b6fbd64afd --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/test.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/test.py new file mode 100644 index 0000000000000000000000000000000000000000..a106f04626c44326ff081ffc62c1456f55a19be2 --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/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/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/train.py b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/train.py new file mode 100644 index 0000000000000000000000000000000000000000..51fe4065de132e8ea6e03f87c77b50952965c96e --- /dev/null +++ b/FoodSeg103/Swin-Transformer-Semantic-Segmentation-main/tools/train.py @@ -0,0 +1,163 @@ +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 + + +def parse_args(): + parser = argparse.ArgumentParser(description='Train a segmentor') + parser.add_argument('config', help='train config file path') + parser.add_argument('--work-dir', 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() diff --git a/FoodSeg103/checkpoints/.DS_Store b/FoodSeg103/checkpoints/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ebb71b1802cacd073cdceb3f0cf32d2495da0147 Binary files /dev/null and b/FoodSeg103/checkpoints/.DS_Store differ diff --git a/FoodSeg103/checkpoints/CCNet/ccnet_r101-d8_512x1024_80k.py b/FoodSeg103/checkpoints/CCNet/ccnet_r101-d8_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..eea05beb74d885c2dd92d63b44405507f4aabf10 --- /dev/null +++ b/FoodSeg103/checkpoints/CCNet/ccnet_r101-d8_512x1024_80k.py @@ -0,0 +1,168 @@ +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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1024, 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']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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( + type='CustomDataset', + data_root='data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1024, 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='CustomDataset', + data_root='data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1024, 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +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=dict(type='SyncBN', requires_grad=True), + 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=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=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + train_cfg=dict(), + test_cfg=dict(mode='whole')) +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=0.0001, by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') +work_dir = 'checkpoints/ccnet/train' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/CCNet/iter_80000.pth b/FoodSeg103/checkpoints/CCNet/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..4cf48be111978d5b5619d0f472550190761ae841 --- /dev/null +++ b/FoodSeg103/checkpoints/CCNet/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:516a81ce3fcd9f308756aef349457f4e79a9d3b8a5eb4f35e9cf7b46d131896f +size 399549856 diff --git a/FoodSeg103/checkpoints/CCNet_ReLeM/ccnet_r50-d8_512x1024_80k.py b/FoodSeg103/checkpoints/CCNet_ReLeM/ccnet_r50-d8_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..d7c50716c229652ed18e8b5c86096d4cc49badbe --- /dev/null +++ b/FoodSeg103/checkpoints/CCNet_ReLeM/ccnet_r50-d8_512x1024_80k.py @@ -0,0 +1,168 @@ +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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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']) +] +test_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']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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( + type='CustomDataset', + data_root='data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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']) + ]) + ]), + test=dict( + type='CustomDataset', + data_root='data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='pretrained_model/recipe1MP_R50.pth', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=dict(type='SyncBN', requires_grad=True), + 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=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=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + train_cfg=dict(), + test_cfg=dict(mode='whole')) +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=0.0001, by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') +work_dir = 'checkpoints/ccnet/recipe1m_train2' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/CCNet_ReLeM/iter_80000.pth b/FoodSeg103/checkpoints/CCNet_ReLeM/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..516b287edf7bd882f96a4a7938024e91f82e4f40 --- /dev/null +++ b/FoodSeg103/checkpoints/CCNet_ReLeM/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e92547419f949182948681ba63720c8d81b83a18d1b2cf49e1e21f50a0ef687 +size 399389758 diff --git a/FoodSeg103/checkpoints/FPN/fpn_r50_512x1024_80k.py b/FoodSeg103/checkpoints/FPN/fpn_r50_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..4ae2f067cb08cb89ca56ca57dfcecd54eedd5608 --- /dev/null +++ b/FoodSeg103/checkpoints/FPN/fpn_r50_512x1024_80k.py @@ -0,0 +1,160 @@ +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=dict(type='SyncBN', requires_grad=True), + 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=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + train_cfg=dict(), + test_cfg=dict(mode='whole')) +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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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']) +] +test_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']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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']) + ]) + ]), + test=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +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=0.0001, by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') +work_dir = 'checkpoints/r50_fpn' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/FPN/iter_80000.pth b/FoodSeg103/checkpoints/FPN/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..5426c1c16a7e00b0a445a86d49438f99f24bd8a2 --- /dev/null +++ b/FoodSeg103/checkpoints/FPN/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b46e7ecbd1c21ca14a32d3a0cc7625ed3332e173356f0cb2cbb5a68985228bb5 +size 228495057 diff --git a/FoodSeg103/checkpoints/FPN_ReLeM/fpn_r50_512x1024_80k.py b/FoodSeg103/checkpoints/FPN_ReLeM/fpn_r50_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..ee807b954cd39d301c04925a54a5c139ff4d844b --- /dev/null +++ b/FoodSeg103/checkpoints/FPN_ReLeM/fpn_r50_512x1024_80k.py @@ -0,0 +1,160 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='./pretrained_model/R50_ReLeM.pth', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 1, 1), + strides=(1, 2, 2, 2), + norm_cfg=dict(type='SyncBN', requires_grad=True), + 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=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + train_cfg=dict(), + test_cfg=dict(mode='whole')) +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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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']) +] +test_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']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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']) + ]) + ]), + test=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +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=0.0001, by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') +work_dir = 'checkpoints/r50_fpn_RM_poly' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/FPN_ReLeM/iter_80000.pth b/FoodSeg103/checkpoints/FPN_ReLeM/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..1e9ce10ab3cf13038f44ef3ee5f45de01cbdc6e6 --- /dev/null +++ b/FoodSeg103/checkpoints/FPN_ReLeM/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2cf26d32490fea9cf5af44d1d1cf48976ac42544cc4749f91366b8ea4904c578 +size 228334959 diff --git a/FoodSeg103/checkpoints/SETR_MLA/SETR_MLA_768x768_80k_base.py b/FoodSeg103/checkpoints/SETR_MLA/SETR_MLA_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..66d4dda518f617d8af01f969468c8e7a778710ae --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_MLA/SETR_MLA_768x768_80k_base.py @@ -0,0 +1,207 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='VIT_MLA', + model_name='vit_base_patch16_224', + img_size=768, + patch_size=16, + in_chans=3, + embed_dim=768, + depth=12, + num_heads=12, + num_classes=19, + drop_rate=0.0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + pos_embed_interp=True, + align_corners=False, + mla_channels=256, + mla_index=(5, 7, 9, 11)), + decode_head=dict( + type='VIT_MLAHead', + in_channels=1024, + channels=512, + img_size=768, + mla_channels=256, + mlahead_channels=128, + num_classes=104, + 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='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)) + ]) +train_cfg = dict() +test_cfg = dict(mode='slide', crop_size=(768, 768), stride=(512, 512)) +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 = (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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), 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), + 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']) + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) + ]), + val=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +optimizer = dict( + type='SGD', + lr=0.002, + momentum=0.9, + weight_decay=0.0, + paramwise_cfg=dict(custom_keys=dict(head=dict(lr_mult=10.0)))) +optimizer_config = dict() +lr_config = dict(policy='poly', power=0.9, min_lr=0.0001, by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') +find_unused_parameters = True +work_dir = 'checkpoints/SETR_224' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/SETR_MLA/iter_80000.pth b/FoodSeg103/checkpoints/SETR_MLA/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..8ca7b9e1f1ba645a6bee7d4d63e8a9193fbc63c3 --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_MLA/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f72bf120eb00dca469f292cc2bde956883f3b64d22768f203c17aea8eaf5001a +size 744713085 diff --git a/FoodSeg103/checkpoints/SETR_MLA_L384/SETR_MLA_768x768_80k.py b/FoodSeg103/checkpoints/SETR_MLA_L384/SETR_MLA_768x768_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..14f5b1b1ee0dc8d372a5328f0fa473029b9144e2 --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_MLA_L384/SETR_MLA_768x768_80k.py @@ -0,0 +1,207 @@ +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.0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + 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=104, + 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='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)) + ]) +train_cfg = dict() +test_cfg = dict(mode='slide', crop_size=(768, 768), stride=(512, 512)) +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 = (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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), 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), + 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']) + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) + ]), + val=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +optimizer = dict( + type='SGD', + lr=0.002, + momentum=0.9, + weight_decay=0.0, + paramwise_cfg=dict(custom_keys=dict(head=dict(lr_mult=10.0)))) +optimizer_config = dict() +lr_config = dict(policy='poly', power=0.9, min_lr=0.0001, by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=80000, metric='mIoU') +find_unused_parameters = True +work_dir = 'checkpoints/setr_mla_large_384/' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/SETR_MLA_L384/iter_80000.pth b/FoodSeg103/checkpoints/SETR_MLA_L384/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..564d6c2ac1bb0d19ee19ef06688cbe3307c093bf --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_MLA_L384/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b15d2b727f8694ba5ad0da043030c307436a68dcb86eb6ccb5baddb7669455f +size 2491270045 diff --git a/FoodSeg103/checkpoints/SETR_MLA_ReLeM/SETR_MLA_768x768_80k_base.py b/FoodSeg103/checkpoints/SETR_MLA_ReLeM/SETR_MLA_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..f997a0cfd0e3a7dcf0b4cab45852199c1578b578 --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_MLA_ReLeM/SETR_MLA_768x768_80k_base.py @@ -0,0 +1,207 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + backbone=dict( + type='VIT_MLA', + model_name='vit_base_patch16_224', + img_size=768, + patch_size=16, + in_chans=3, + embed_dim=768, + depth=12, + num_heads=12, + num_classes=19, + drop_rate=0.0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + pos_embed_interp=True, + align_corners=False, + mla_channels=256, + mla_index=(5, 7, 9, 11)), + decode_head=dict( + type='VIT_MLAHead', + in_channels=1024, + channels=512, + img_size=768, + mla_channels=256, + mlahead_channels=128, + num_classes=104, + 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='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)) + ]) +train_cfg = dict() +test_cfg = dict(mode='slide', crop_size=(768, 768), stride=(512, 512)) +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 = (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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), 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), + 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']) + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) + ]), + val=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +optimizer = dict( + type='SGD', + lr=0.002, + momentum=0.9, + weight_decay=0.0, + paramwise_cfg=dict(custom_keys=dict(head=dict(lr_mult=10.0)))) +optimizer_config = dict() +lr_config = dict(policy='poly', power=0.9, min_lr=0.0001, by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') +find_unused_parameters = True +work_dir = 'checkpoints/SETR_224_RMP_230/' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/SETR_MLA_ReLeM/iter_80000.pth b/FoodSeg103/checkpoints/SETR_MLA_ReLeM/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..8034aea1a2dd6471d88c8242e97367b9e71e2e8c --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_MLA_ReLeM/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e4ddcde6fbd5387ac6b86c862e15a6d4ae9e3cef5c8d73430bf613626521f5b +size 744713085 diff --git a/FoodSeg103/checkpoints/SETR_Naive/SETR_Naive_768x768_80k_base.py b/FoodSeg103/checkpoints/SETR_Naive/SETR_Naive_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..a4d31f4a32782e0b5f065f95ab8d82dfad7544a3 --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_Naive/SETR_Naive_768x768_80k_base.py @@ -0,0 +1,209 @@ +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=768, + depth=12, + num_heads=12, + num_classes=104, + drop_rate=0.0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + pos_embed_interp=True, + align_corners=False), + decode_head=dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=11, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=[ + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=5, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + 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=dict(type='SyncBN', requires_grad=True), + 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=dict(type='SyncBN', requires_grad=True), + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)) + ]) +train_cfg = dict() +test_cfg = dict(mode='slide', crop_size=(768, 768), stride=(512, 512)) +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 = (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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), 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), + 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']) + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) + ]), + val=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +optimizer = dict( + type='SGD', + lr=0.01, + momentum=0.9, + weight_decay=0.0, + paramwise_cfg=dict(custom_keys=dict(head=dict(lr_mult=10.0)))) +optimizer_config = dict() +lr_config = dict(policy='poly', power=0.9, min_lr=0.0001, by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') +find_unused_parameters = True +work_dir = 'checkpoints/SETR_NAIVE' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/SETR_Naive/iter_80000.pth b/FoodSeg103/checkpoints/SETR_Naive/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..2f3085a9504a7024638cd90e991c454428a75f45 --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_Naive/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:befb064c1653ae6c3a73fcd31cb72c275825223fe7a46d197daae9d2489f723d +size 757893835 diff --git a/FoodSeg103/checkpoints/SETR_Naive_ReLeM/SETR_Naive_768x768_80k_base.py b/FoodSeg103/checkpoints/SETR_Naive_ReLeM/SETR_Naive_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..bc6fc541f81066fead9141571b0fc33a69971a78 --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_Naive_ReLeM/SETR_Naive_768x768_80k_base.py @@ -0,0 +1,209 @@ +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=768, + depth=12, + num_heads=12, + num_classes=104, + drop_rate=0.0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + pos_embed_interp=True, + align_corners=False), + decode_head=dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=11, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=[ + dict( + type='VisionTransformerUpHead', + in_channels=768, + channels=512, + in_index=5, + img_size=768, + embed_dim=768, + num_classes=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + 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=dict(type='SyncBN', requires_grad=True), + 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=dict(type='SyncBN', requires_grad=True), + num_conv=2, + upsampling_method='bilinear', + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)) + ]) +train_cfg = dict() +test_cfg = dict(mode='slide', crop_size=(768, 768), stride=(512, 512)) +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 = (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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), 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), + 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']) + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(768, 768), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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=(768, 768), pad_val=0, seg_pad_val=255), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_semantic_seg']) + ]), + val=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + pipeline=[ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2049, 1025), + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +optimizer = dict( + type='SGD', + lr=0.01, + momentum=0.9, + weight_decay=0.0, + paramwise_cfg=dict(custom_keys=dict(head=dict(lr_mult=10.0)))) +optimizer_config = dict() +lr_config = dict(policy='poly', power=0.9, min_lr=0.0001, by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=4000) +evaluation = dict(interval=4000, metric='mIoU') +find_unused_parameters = True +work_dir = 'checkpoints/SETR_Naive_RMP' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/SETR_Naive_ReLeM/iter_80000.pth b/FoodSeg103/checkpoints/SETR_Naive_ReLeM/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..b50ea1f7af64aa6a418f7e49f8a1a5c2895c0c5c --- /dev/null +++ b/FoodSeg103/checkpoints/SETR_Naive_ReLeM/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a42c1610c8dbd28deb0cf7d1169796a76bb134fd7198fb267a3429a4528bb6eb +size 757893835 diff --git a/FoodSeg103/checkpoints/swin_base/iter_80000.pth b/FoodSeg103/checkpoints/swin_base/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..a9cbe4b258a33186d77f8c404f5e0975898949a9 --- /dev/null +++ b/FoodSeg103/checkpoints/swin_base/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6f54780e99e3fc5027c6539314165ab95e894acdd922ee146c904adc1457ec4 +size 1455875918 diff --git a/FoodSeg103/checkpoints/swin_base/upernet_swin_base_patch4_window7_512x1024_80k.py b/FoodSeg103/checkpoints/swin_base/upernet_swin_base_patch4_window7_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..09bad148a021af3538c5cdcc1c2bf2f01facc231 --- /dev/null +++ b/FoodSeg103/checkpoints/swin_base/upernet_swin_base_patch4_window7_512x1024_80k.py @@ -0,0 +1,189 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='pretrained/swin_base_patch4_window7_224.pth', + backbone=dict( + type='SwinTransformer', + embed_dim=128, + depths=[2, 2, 18, 2], + num_heads=[4, 8, 16, 32], + window_size=7, + mlp_ratio=4.0, + qkv_bias=True, + qk_scale=None, + drop_rate=0.0, + attn_drop_rate=0.0, + drop_path_rate=0.3, + ape=False, + patch_norm=True, + out_indices=(0, 1, 2, 3), + use_checkpoint=False), + decode_head=dict( + type='UPerHead', + in_channels=[128, 256, 512, 1024], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=104, + 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=512, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + train_cfg=dict(), + test_cfg=dict(mode='whole')) +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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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']) +] +test_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']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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']) + ]) + ]), + test=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +optimizer = dict( + type='AdamW', + lr=6e-05, + betas=(0.9, 0.999), + weight_decay=0.01, + paramwise_cfg=dict( + custom_keys=dict( + absolute_pos_embed=dict(decay_mult=0.0), + relative_position_bias_table=dict(decay_mult=0.0), + norm=dict(decay_mult=0.0)))) +optimizer_config = dict() +lr_config = dict( + policy='poly', + warmup='linear', + warmup_iters=1500, + warmup_ratio=1e-06, + power=1.0, + min_lr=0.0, + by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=8000) +evaluation = dict(interval=8000, metric='mIoU') +work_dir = './work_dirs/upernet_swin_base_patch4_window7_512x1024_80k' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/swin_small/(original)upernet_swin_small_patch4_window7_512x1024_80k.py b/FoodSeg103/checkpoints/swin_small/(original)upernet_swin_small_patch4_window7_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..a74817d6b9c54f077143a33d1f3093bd889eefe6 --- /dev/null +++ b/FoodSeg103/checkpoints/swin_small/(original)upernet_swin_small_patch4_window7_512x1024_80k.py @@ -0,0 +1,189 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='pretrained/swin_small_patch4_window7_224.pth', + backbone=dict( + type='SwinTransformer', + embed_dim=96, + depths=[2, 2, 18, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4.0, + qkv_bias=True, + qk_scale=None, + drop_rate=0.0, + attn_drop_rate=0.0, + drop_path_rate=0.3, + ape=False, + patch_norm=True, + out_indices=(0, 1, 2, 3), + use_checkpoint=False), + decode_head=dict( + type='UPerHead', + in_channels=[96, 192, 384, 768], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=104, + 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=384, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + train_cfg=dict(), + test_cfg=dict(mode='whole')) +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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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']) +] +test_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']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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']) + ]) + ]), + test=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +optimizer = dict( + type='AdamW', + lr=6e-05, + betas=(0.9, 0.999), + weight_decay=0.01, + paramwise_cfg=dict( + custom_keys=dict( + absolute_pos_embed=dict(decay_mult=0.0), + relative_position_bias_table=dict(decay_mult=0.0), + norm=dict(decay_mult=0.0)))) +optimizer_config = dict() +lr_config = dict( + policy='poly', + warmup='linear', + warmup_iters=1500, + warmup_ratio=1e-06, + power=1.0, + min_lr=0.0, + by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=8000) +evaluation = dict(interval=8000, metric='mIoU') +work_dir = './work_dirs/upernet_swin_small_patch4_window7_512x1024_80k' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/swin_small/.DS_Store b/FoodSeg103/checkpoints/swin_small/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 Binary files /dev/null and b/FoodSeg103/checkpoints/swin_small/.DS_Store differ diff --git a/FoodSeg103/checkpoints/swin_small/config.json b/FoodSeg103/checkpoints/swin_small/config.json new file mode 100644 index 0000000000000000000000000000000000000000..0ba68972e81ab7d50707a57b4f8a4cfe7b307009 --- /dev/null +++ b/FoodSeg103/checkpoints/swin_small/config.json @@ -0,0 +1,232 @@ +{ + + "model_type": "unet", + "model_config": { + "encoder": { + "type": "resnet18", + "pretrained": true + }, + "decoder": { + "type": "unet", + "num_classes": 104 + } + } +} + "norm_cfg": { + "type": "SyncBN", + "requires_grad": true + }, + "model": { + "type": "EncoderDecoder", + "pretrained": "pretrained/swin_small_patch4_window7_224.pth", + "backbone": { + "type": "SwinTransformer", + "embed_dim": 96, + "depths": [2, 2, 18, 2], + "num_heads": [3, 6, 12, 24], + "window_size": 7, + "mlp_ratio": 4.0, + "qkv_bias": true, + "qk_scale": null, + "drop_rate": 0.0, + "attn_drop_rate": 0.0, + "drop_path_rate": 0.3, + "ape": false, + "patch_norm": true, + "out_indices": [0, 1, 2, 3], + "use_checkpoint": false + }, + "decode_head": { + "type": "UPerHead", + "in_channels": [96, 192, 384, 768], + "in_index": [0, 1, 2, 3], + "pool_scales": [1, 2, 3, 6], + "channels": 512, + "dropout_ratio": 0.1, + "num_classes": 104, + "norm_cfg": { + "type": "SyncBN", + "requires_grad": true + }, + "align_corners": false, + "loss_decode": { + "type": "CrossEntropyLoss", + "use_sigmoid": false, + "loss_weight": 1.0 + } + }, + "auxiliary_head": { + "type": "FCNHead", + "in_channels": 384, + "in_index": 2, + "channels": 256, + "num_convs": 1, + "concat_input": false, + "dropout_ratio": 0.1, + "num_classes": 104, + "norm_cfg": { + "type": "SyncBN", + "requires_grad": true + }, + "align_corners": false, + "loss_decode": { + "type": "CrossEntropyLoss", + "use_sigmoid": false, + "loss_weight": 0.4 + } + }, + "train_cfg": {}, + "test_cfg": { + "mode": "whole" + } + }, + "dataset_type": "CustomDataset", + "data_root": "./data/FoodSeg103/Images/", + "img_norm_cfg": { + "mean": [123.675, 116.28, 103.53], + "std": [58.395, 57.12, 57.375], + "to_rgb": true + }, + "crop_size": [512, 1024], + "train_pipeline": [ + { + "type": "LoadImageFromFile" + }, + { + "type": "LoadAnnotations" + }, + { + "type": "Resize", + "img_scale": [2048, 1024], + "ratio_range": [0.5, 2.0] + }, + { + "type": "RandomCrop", + "crop_size": [512, 1024], + "cat_max_ratio": 0.75 + }, + { + "type": "RandomFlip", + "prob": 0.5 + }, + { + "type": "PhotoMetricDistortion" + }, + { + "type": "Normalize", + "mean": [123.675, 116.28, 103.53], + "std": [58.395, 57.12, 57.375], + "to_rgb": true + }, + { + "type": "Pad", + "size": [512, 1024], + "pad_val": 0, + "seg_pad_val": 255 + }, + { + "type": "DefaultFormatBundle" + }, + { + "type": "Collect", + "keys": ["img", "gt_semantic_seg"] + } + ], + "test_pipeline": [ + { + "type": "LoadImageFromFile" + }, + { + "type": "MultiScaleFlipAug", + "img_scale": [2048, 1024], + "flip": false, + "transforms": [ + { + "type": "Resize", + "keep_ratio": true + }, + { + "type": "RandomFlip" + }, + { + "type": "Normalize", + "mean": [123.675, 116.28, 103.53], + "std": [58.395, 57.12, 57.375], + "to_rgb": true + }, + { + "type": "ImageToTensor", + "keys": ["img"] + }, + { + "type": "Collect", + "keys": ["img"] + } + ] + } + ], + "data": { + "samples_per_gpu": 2, + "workers_per_gpu": 2, + "train": { + "type": "CustomDataset", + "data_root": "./data/FoodSeg103/Images/", + "img_dir": "img_dir/train", + "ann_dir": "ann_dir/train", + "pipeline": [ + { + "type": "LoadImageFromFile" + }, + { + "type": "LoadAnnotations" + }, + { + "type": "Resize", + "img_scale": [2048, 1024], + "ratio_range": [0.5, 2.0] + }, + { + "type": "RandomCrop", + "crop_size": [512, 1024], + "cat_max_ratio": 0.75 + }, + { + "type": "RandomFlip", + "prob": 0.5 + }, + { + "type": "PhotoMetricDistortion" + }, + { + "type": "Normalize", + "mean": [123.675, 116.28, 103.53], + "std": [58.395, 57.12, 57.375], + "to_rgb": true + }, + { + "type": "Pad", + "size": [512, 1024], + "pad_val": 0, + "seg_pad_val": 255 + }, + { + "type": "DefaultFormatBundle" + }, + { + "type": "Collect", + "keys": ["img", "gt_semantic_seg"] + } + ] + }, + "val": { + "type": "CustomDataset", + "data_root": "./data/FoodSeg103/Images/", + "img_dir": "img_dir/test", + "ann_dir": "ann_dir/test", + "pipeline": [ + { + "type": "LoadImageFromFile" + }, + { + "type": "MultiScaleFlipAug", + "img_scale": [2048, 1024], \ No newline at end of file diff --git a/FoodSeg103/checkpoints/swin_small/config.py b/FoodSeg103/checkpoints/swin_small/config.py new file mode 100644 index 0000000000000000000000000000000000000000..a74817d6b9c54f077143a33d1f3093bd889eefe6 --- /dev/null +++ b/FoodSeg103/checkpoints/swin_small/config.py @@ -0,0 +1,189 @@ +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='pretrained/swin_small_patch4_window7_224.pth', + backbone=dict( + type='SwinTransformer', + embed_dim=96, + depths=[2, 2, 18, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4.0, + qkv_bias=True, + qk_scale=None, + drop_rate=0.0, + attn_drop_rate=0.0, + drop_path_rate=0.3, + ape=False, + patch_norm=True, + out_indices=(0, 1, 2, 3), + use_checkpoint=False), + decode_head=dict( + type='UPerHead', + in_channels=[96, 192, 384, 768], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=104, + 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=384, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=104, + norm_cfg=dict(type='SyncBN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + train_cfg=dict(), + test_cfg=dict(mode='whole')) +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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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']) +] +test_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']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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']) + ]) + ]), + test=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +optimizer = dict( + type='AdamW', + lr=6e-05, + betas=(0.9, 0.999), + weight_decay=0.01, + paramwise_cfg=dict( + custom_keys=dict( + absolute_pos_embed=dict(decay_mult=0.0), + relative_position_bias_table=dict(decay_mult=0.0), + norm=dict(decay_mult=0.0)))) +optimizer_config = dict() +lr_config = dict( + policy='poly', + warmup='linear', + warmup_iters=1500, + warmup_ratio=1e-06, + power=1.0, + min_lr=0.0, + by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=8000) +evaluation = dict(interval=8000, metric='mIoU') +work_dir = './work_dirs/upernet_swin_small_patch4_window7_512x1024_80k' +gpu_ids = range(0, 1) diff --git a/FoodSeg103/checkpoints/swin_small/iter_80000.pth b/FoodSeg103/checkpoints/swin_small/iter_80000.pth new file mode 100644 index 0000000000000000000000000000000000000000..32f92023edb26c39d13cbe7ae452df9dc360dd0d --- /dev/null +++ b/FoodSeg103/checkpoints/swin_small/iter_80000.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b67e032728959023a14b7a6a4831009367d58331cd2d188fa6540e7e40a05121 +size 975633422 diff --git a/FoodSeg103/checkpoints/swin_small/upernet_swin_small_patch4_window7_512x1024_80k.py b/FoodSeg103/checkpoints/swin_small/upernet_swin_small_patch4_window7_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..2d9eb62e8529894767a2687cad7c37010de5dacf --- /dev/null +++ b/FoodSeg103/checkpoints/swin_small/upernet_swin_small_patch4_window7_512x1024_80k.py @@ -0,0 +1,189 @@ +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + type='EncoderDecoder', + pretrained='pretrained/swin_small_patch4_window7_224.pth', + backbone=dict( + type='SwinTransformer', + embed_dim=96, + depths=[2, 2, 18, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4.0, + qkv_bias=True, + qk_scale=None, + drop_rate=0.0, + attn_drop_rate=0.0, + drop_path_rate=0.3, + ape=False, + patch_norm=True, + out_indices=(0, 1, 2, 3), + use_checkpoint=False), + decode_head=dict( + type='UPerHead', + in_channels=[96, 192, 384, 768], + in_index=[0, 1, 2, 3], + pool_scales=(1, 2, 3, 6), + channels=512, + dropout_ratio=0.1, + num_classes=104, + norm_cfg=dict(type='BN', 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=384, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=104, + norm_cfg=dict(type='BN', requires_grad=True), + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + train_cfg=dict(), + test_cfg=dict(mode='whole')) +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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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']) +] +test_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']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/train', + ann_dir='ann_dir/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=(512, 1024), cat_max_ratio=0.75), + dict(type='RandomFlip', prob=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( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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']) + ]) + ]), + test=dict( + type='CustomDataset', + data_root='./data/FoodSeg103/Images/', + img_dir='img_dir/test', + ann_dir='ann_dir/test', + 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( + interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)]) +# dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] +cudnn_benchmark = True +optimizer = dict( + type='AdamW', + lr=6e-05, + betas=(0.9, 0.999), + weight_decay=0.01, + paramwise_cfg=dict( + custom_keys=dict( + absolute_pos_embed=dict(decay_mult=0.0), + relative_position_bias_table=dict(decay_mult=0.0), + norm=dict(decay_mult=0.0)))) +optimizer_config = dict() +lr_config = dict( + policy='poly', + warmup='linear', + warmup_iters=1500, + warmup_ratio=1e-06, + power=1.0, + min_lr=0.0, + by_epoch=False) +runner = dict(type='IterBasedRunner', max_iters=80000) +checkpoint_config = dict(by_epoch=False, interval=8000) +evaluation = dict(interval=8000, metric='mIoU') +work_dir = './work_dirs/upernet_swin_small_patch4_window7_512x1024_80k' +#gpu_ids = range(0, 1) diff --git a/FoodSeg103/configs/.DS_Store b/FoodSeg103/configs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d28abe0cb4e1416935e8bd673d5f0b7253247bfb Binary files /dev/null and b/FoodSeg103/configs/.DS_Store differ diff --git a/FoodSeg103/configs/_base_/.DS_Store b/FoodSeg103/configs/_base_/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d8b09b42e90a68410eddf03e91637f386ae98d96 Binary files /dev/null and b/FoodSeg103/configs/_base_/.DS_Store differ diff --git a/FoodSeg103/configs/_base_/datasets/FoodSeg103.py b/FoodSeg103/configs/_base_/datasets/FoodSeg103.py new file mode 100644 index 0000000000000000000000000000000000000000..0db467e549045162fd9a1a9a4fee01f612ea8fc1 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/FoodSeg103_768x768.py b/FoodSeg103/configs/_base_/datasets/FoodSeg103_768x768.py new file mode 100644 index 0000000000000000000000000000000000000000..4ebbc01579714ab10899114407b58d0a5fedfcd0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/ade20k.py b/FoodSeg103/configs/_base_/datasets/ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..efc8b4bb20c981f3db6df7eb52b3dc0744c94cc0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/chase_db1.py b/FoodSeg103/configs/_base_/datasets/chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..298594ea925f87f22b37094a2ec50e370aec96a0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/cityscapes.py b/FoodSeg103/configs/_base_/datasets/cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f21867c63e1835f6fceb61f066e802fd8fd2a735 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/cityscapes_769x769.py b/FoodSeg103/configs/_base_/datasets/cityscapes_769x769.py new file mode 100644 index 0000000000000000000000000000000000000000..336c7b254fe392b4703039fec86a83acdbd2e1a5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/drive.py b/FoodSeg103/configs/_base_/datasets/drive.py new file mode 100644 index 0000000000000000000000000000000000000000..06e8ff606e0d2a4514ec8b7d2c6c436a32efcbf4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/hrf.py b/FoodSeg103/configs/_base_/datasets/hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..242d790eb1b83e75cf6b7eaa7a35c674099311ad --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/pascal_context.py b/FoodSeg103/configs/_base_/datasets/pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..ff65bad1b86d7e3a5980bb5b9fc55798dc8df5f4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/pascal_voc12.py b/FoodSeg103/configs/_base_/datasets/pascal_voc12.py new file mode 100644 index 0000000000000000000000000000000000000000..ba1d42d0c5781f56dc177d860d856bb34adce555 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/pascal_voc12_aug.py b/FoodSeg103/configs/_base_/datasets/pascal_voc12_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..3f23b6717d53ad29f02dd15046802a2631a5076b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/datasets/stare.py b/FoodSeg103/configs/_base_/datasets/stare.py new file mode 100644 index 0000000000000000000000000000000000000000..3f71b25488cc11a6b4d582ac52b5a24e1ad1cf8e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/default_runtime.py b/FoodSeg103/configs/_base_/default_runtime.py new file mode 100644 index 0000000000000000000000000000000000000000..b564cc4e7e7d9a67dacaaddecb100e4d8f5c005b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/ann_r50-d8.py b/FoodSeg103/configs/_base_/models/ann_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..a2cb653827e44e6015b3b83bc578003e614a6aa1 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/apcnet_r50-d8.py b/FoodSeg103/configs/_base_/models/apcnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..c8f5316cbcf3896ba9de7ca2c801eba512f01d5e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/ccnet_r50-d8.py b/FoodSeg103/configs/_base_/models/ccnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..4fc3d8f875049b0a2ea5c8a0e1ab442b96bee73c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/cgnet.py b/FoodSeg103/configs/_base_/models/cgnet.py new file mode 100644 index 0000000000000000000000000000000000000000..eff8d9458c877c5db894957e0b1b4597e40da6ab --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/danet_r50-d8.py b/FoodSeg103/configs/_base_/models/danet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..2c934939fac48525f22ad86f489a041dd7db7d09 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/deeplabv3_r50-d8.py b/FoodSeg103/configs/_base_/models/deeplabv3_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..d7a43bee01422ad4795dd27874e0cd4bb6cbfecf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/deeplabv3_unet_s5-d16.py b/FoodSeg103/configs/_base_/models/deeplabv3_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..0cd262999d8b2cb8e14a5c32190ae73f479d8e81 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/deeplabv3plus_r50-d8.py b/FoodSeg103/configs/_base_/models/deeplabv3plus_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..050e39e091d816df9028d23aa3ecf9db74e441e1 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/dmnet_r50-d8.py b/FoodSeg103/configs/_base_/models/dmnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..d22ba52640bebd805b3b8d07025e276dfb023759 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/dnl_r50-d8.py b/FoodSeg103/configs/_base_/models/dnl_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..edb4c174c51e34c103737ba39bfc48bf831e561d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/emanet_r50-d8.py b/FoodSeg103/configs/_base_/models/emanet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..26adcd430926de0862204a71d345f2543167f27b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/encnet_r50-d8.py b/FoodSeg103/configs/_base_/models/encnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..be777123a886503172a95fe0719e956a147bbd68 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/fast_scnn.py b/FoodSeg103/configs/_base_/models/fast_scnn.py new file mode 100644 index 0000000000000000000000000000000000000000..32fdeb659355a5ce5ef2cc7c2f30742703811cdf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/fcn_hr18.py b/FoodSeg103/configs/_base_/models/fcn_hr18.py new file mode 100644 index 0000000000000000000000000000000000000000..c3e299bc89ada56ca14bbffcbdb08a586b8ed9e9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/fcn_r50-d8.py b/FoodSeg103/configs/_base_/models/fcn_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..5e98f6cc918b6146fc6d613c6918e825ef1355c3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/fcn_unet_s5-d16.py b/FoodSeg103/configs/_base_/models/fcn_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..a33e7972877f902d0e7d18401ca675e3e4e60a18 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/fpn_r50.py b/FoodSeg103/configs/_base_/models/fpn_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..86ab327db92e44c14822d65f1c9277cb007f17c1 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/gcnet_r50-d8.py b/FoodSeg103/configs/_base_/models/gcnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..3d2ad69f5c22adfe79d5fdabf920217628987166 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/lraspp_m-v3-d8.py b/FoodSeg103/configs/_base_/models/lraspp_m-v3-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..93258242a90695cc94a7c6bd41562d6a75988771 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/nonlocal_r50-d8.py b/FoodSeg103/configs/_base_/models/nonlocal_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..5674a39854cafd1f2e363bac99c58ccae62f24da --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/ocrnet_hr18.py b/FoodSeg103/configs/_base_/models/ocrnet_hr18.py new file mode 100644 index 0000000000000000000000000000000000000000..c60f62a7cdf3f5c5096a7a7e725e8268fddcb057 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/ocrnet_r50-d8.py b/FoodSeg103/configs/_base_/models/ocrnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..615aa3ff703942b6c22b2d6e9642504dd3e41ebd --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/pointrend_r50.py b/FoodSeg103/configs/_base_/models/pointrend_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..9d323dbf9466d41e0800aa57ef84045f3d874bdf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/psanet_r50-d8.py b/FoodSeg103/configs/_base_/models/psanet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..689513fa9d2a40f14bf0ae4ae61f38f0dcc1b3da --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/pspnet_r50-d8.py b/FoodSeg103/configs/_base_/models/pspnet_r50-d8.py new file mode 100644 index 0000000000000000000000000000000000000000..f451e08ad2eb0732dcb806b1851eb978d4acf136 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/pspnet_unet_s5-d16.py b/FoodSeg103/configs/_base_/models/pspnet_unet_s5-d16.py new file mode 100644 index 0000000000000000000000000000000000000000..fcff9ec4f41fad158344ecd77313dc14564f3682 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/setr_mla.py b/FoodSeg103/configs/_base_/models/setr_mla.py new file mode 100644 index 0000000000000000000000000000000000000000..2e1750599f9ab574efd4531d13558ce710eb93c8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/setr_naive_pup.py b/FoodSeg103/configs/_base_/models/setr_naive_pup.py new file mode 100644 index 0000000000000000000000000000000000000000..b6a962f9d7e760f847626d32533d76fd1eac3d5b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/models/upernet_r50.py b/FoodSeg103/configs/_base_/models/upernet_r50.py new file mode 100644 index 0000000000000000000000000000000000000000..10974962fdd7136031fd06de1700f497d355ceaa --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/schedules/schedule_160k.py b/FoodSeg103/configs/_base_/schedules/schedule_160k.py new file mode 100644 index 0000000000000000000000000000000000000000..52603890b10f25faf8eec9f9e5a4468fae09b811 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/schedules/schedule_20k.py b/FoodSeg103/configs/_base_/schedules/schedule_20k.py new file mode 100644 index 0000000000000000000000000000000000000000..bf780a1b6f6521833c6a5859675147824efa599d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/schedules/schedule_40k.py b/FoodSeg103/configs/_base_/schedules/schedule_40k.py new file mode 100644 index 0000000000000000000000000000000000000000..cdbf841abcb26eed87bf76ab816aff4bae0630ee --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/_base_/schedules/schedule_80k.py b/FoodSeg103/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..751963703002309741da12d9060beae1d1be4a96 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/README.md b/FoodSeg103/configs/ann/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7fc1648311d8f6789fd2ed99789973afbb940531 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d494e07333217e0c6830d36d1bb58fa78b03cfb0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1eeff0b030cf1db8c6ec9740fa65db44b2026d58 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/ann/ann_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9e43af541f6e3df3f36479e736bb0c03fc916970 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d854f2e4223731f443369febc500dbccdc524d9d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..893c53b1ca4bf9788e4d94f0f53cfe92a93f48ce --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/ann/ann_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a64dac670ed4d4632e7b9791ec5f8a334dcea78e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..59508248490b3edbac1c46b4fcc7891f99655b9b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a9c712d1ccfd62ddf6f12ff01ea347ca1995013b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..00b2594ba8a1c9edc90cca7a6d7c3334fa209edc --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ef7b369dd9e12b2282a30da14f99dd4547c53a7b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/ann/ann_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ca6bb248ac867d463c274f975c884aa80a57730f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..071f190261c4e8f4a80a5da12a88e0cfcdfef0d8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..82a1c9386c51fb0ada436e51702beb961a534b26 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/ann/ann_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5e04aa7c6ac050d119e07b715e2082f692e1a1de --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4912bdb9fb298518ae084eb7df0ad22d3e4ff84f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d1cc072b152986102286f503e3d7b92999bf414c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/README.md b/FoodSeg103/configs/apcnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c2ab106a29c1a135fc7a726df9f6f22536357ced --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1e1cec67355abae33d518417eb96eae111f16d2b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..04cb006ba146268e1d3278151bc6ea00a4fb1bfe --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1ce2279a0fbfd6fcc7cd20e3f552b1a39f47d943 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8f10b98406c88256c66d3bbe241c149791d68feb --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5c44ebcaf36075e67208c5f033d1e5f9a78dda4e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..616984575dda73a13fc5870f60ae6ffa30d6b01b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99c61a942e4868315ce4a9404d113f73fed4a4ea --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..62a0627ae2e9bb17974068e56ee660093e944e0d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f7821c559d2f92d23b28e07e040a54cfc425eefc --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..daafa5fbc12c3ed6c10b5234d520166f774e0f94 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3db6140cb97da1d202fd464d01f793276effa629 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9cac4254f37bc3755bff869a10eb3cb75db4d943 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/README.md b/FoodSeg103/configs/ccnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..044d5896781de5824fc5a009d8c0eadf47a44e4e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py b/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x1024_40k_Recipe1M.py new file mode 100644 index 0000000000000000000000000000000000000000..d112e4a4248fb4733f60385a0ef338fd9bf8b56c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d2bac38ca6760af6441ede5a04409ed495ef87f3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..989928ab7f98da86e291451040ff85669a9fbddb --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..c32bf48751f0a18983bff0d99310870b71801663 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..53eb77c0cd6690668ee7c2a666bd85b9a5f7e73b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d7eb668f39bbd22a1f42628428bc19d1645e9865 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..029c1d525b809b61dc8e548ebe4fb26e5c68a8be --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..43f05fab05ee4e20c3509a923118fe9818543cbd --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..654f377b6f6152c9bd98d33824a39a41d7510c3f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6a4316dde57206fe369e72fa0d32a529fe1a1932 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..16e34356e9f8566ec73e3c25c771e281d3eeb975 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1ad94d8988bb822c1571816255464126d9d5b95d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..bbcd29ccea8dcf9f67f1cd198dacd5dab380b265 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..947b8ac8ce1ddf7906ad39788c6992df3b506d29 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1a1f49cf6b112afdadf1841571f51b98c010ddf8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..580d59ca6995ea95a9345ef3ea574ea5b57e9cfb --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c6dac64377bb3f73fdf5c836fa9c38757f75ff76 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/cgnet/README.md b/FoodSeg103/configs/cgnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..00ba387203a257dbb485d68134c88cb43780722d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/cgnet/cgnet_512x1024_60k_cityscapes.py b/FoodSeg103/configs/cgnet/cgnet_512x1024_60k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..11421ef9d375d01b01c333c3705d6eb6e3348ee8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/cgnet/cgnet_680x680_60k_cityscapes.py b/FoodSeg103/configs/cgnet/cgnet_680x680_60k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..2b2f8eefb7dbecf81fcd2db54644493480825246 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/README.md b/FoodSeg103/configs/danet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f49ccf96194f820f509aa9448493ba12ead91953 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3bfb9bdb3064275c2ac3bf2a057ef8eb79c308df --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d80b2ec160ae1c41499d45242713a99122d8adf8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/danet/danet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0f22d0fb6362252ac02f3f152a42997c68b90343 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..709f93cba3e3bca6ce0635457ab1823b04123bf8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..5c623eb56836760694b50f3e4e66aa0f1fc069df --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/danet/danet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..bd31bc8f283fe8c322ee4876deadb89569dc1743 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..597d76de79610780b03cd91dba5f3a4f10147bcd --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..70f9b31966128e8d9ec37859f57a7edfd8e6d1b2 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b70c5b8d49f04661e23604ca4da56a82b1b99c9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..03734310d7338c75d48c914cb325500961c04a79 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/danet/danet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..22aaf857c3212d0b36b0b04e7990616025a3ef9b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..010f86f1aac1b5c827dec29f692d137dc1c399bf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..0cef0f09bfa2290d14fc3a783ea500d6c3da2931 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/danet/danet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..154e84890ed73fe4813dddc8c321de6cd2854fc1 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5c5b94e5a27d7f902d4bdea7ef6c4ef0b816bb99 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c7237ae03c601204dc7c03018ca17ed363090569 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/README.md b/FoodSeg103/configs/deeplabv3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c4994f6469051efd4881546acfcefef76616332e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f20f260e23a95dfee9dfdceef9badab992246f53 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..de4a8a5e9f030f1e8a8802596885186163f23eed --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0b5256f7b7b053cbe8d9e4ca2ec6139bb02387f6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..001b7a69c15299fc1fe5b269a5accf92c5ece032 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8c707c79d659bc544d242352bcb29686eb40b004 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6804a5781369d1031f179d421a3b5a160fd575d3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..df6f36ef7c3b71ba7979aa7a1b226b3e3ebd9bb4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..40f5f62373e59d1c6c01ca3f57777698461127c9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..fb2be22f8bc2e10cdfba4f58b2ad1ced913b4ea4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..796ba3fb142394c4d93a29ba57548dca59d8d02b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e6d58a67b3b4dddf3da42efca30fa599e623f183 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..13094a98ee9be3cf8c88370e1e111cb4dde03ec4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5186bf614bc9ebffe47323ea61afbc9604be265b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d185db95adc61734f11f0dcd7b6c45aa652680b0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e084e95c70b0b7b0c9dcc3388d6b7d3d51d54b6d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a990c076536ad9455a9203f5b6a60157f2f2f99f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b25e725ed98324e6ea648567740dc67e0413b4f9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fd920f0ca7c690d3d1c44f5f7be1cbea18fa14d4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..9d493ef527bb161be98d0e4ea433104b3bb9ff48 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..71a0fda48aa2538e4d913e73e94a71564377ea50 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8e7420d24a20b662286266cac58cab4721dc8df3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..132787db98d3fc9df5ed62e31738c82da8c279bf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..b4a9d4e1b9123b3c965cd430237ce9fcc7018a11 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f62da1a8090da389a77d77a9887926af2a7ded49 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..492bd3dfdce331070cb9645dbe55142e9b662da1 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..78f4d0d9de3d6b8dd2b097531317956d8e3b19f1 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e35d1988f0bb7ad47a73ef1a64b73d9b40e0ba40 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..dd7c16580d0620bc854f2c6eb7c881bdcd23020a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e742d9a5ec2b6addf829cb802de27ea1afd53301 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..332d9cfb79fb698c7867f0f80053c1fd29bf2c1d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/README.md b/FoodSeg103/configs/deeplabv3plus/README.md new file mode 100644 index 0000000000000000000000000000000000000000..dc02660428fe534605ae3bf9659382c282379a4e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..bf39d2f12b719b1c91e38bef71f0f5232543b0dc --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c53ec41baf9043029549b4893b2380372ea5ecd9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..68e2b072e4b8d076e8c3e929dfdc73bcd24ce859 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..3a46c28608add5325ec1decf33624c3c00bff1d7 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6ce85aea5a960e76f8154a5319c7c52e98c4c45 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0ebbd3c70ee5e33c6ef4ae76b6c6a6ce828d07b4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a75c9d3019b13d01c0dd13dae53bce3d15791d52 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ebb1a8eaee16de7443ab3e79e02a37340de511d7 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..3caa6cf8ae61d467628378d99a919c9db1253b91 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..53fd3a909585367ca59eb827c2fbbab4cdf234ea --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c3c92eb26f8fead94f5ad7ac7d7fb60d92c57114 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5ea9cdb5b639e5284cd46e02ce1b67b4729950f7 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..398d9759cafc1d01e78c138abd249808531a97b9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..136449083f7a9efbad6df94f1acd04170147aaba --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..aff70c93e6142ddda3a874d9dfd57ec6c4cd89b3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0172d9a87d6dc1c75bf75a9c48363eb985d389a8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b90b292b03a80aa37b8ca236746cf7cddc4ac27e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b49da3581d9697e726e114b1564fc58a55ef1099 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..318845de1e2124a4dff3348749ec5a13d78d686f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..1736c2397a9b2a4b4fb12eee8175e5ee98eaf805 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7243d0390f6394fdd528c881bb128b2c13d08037 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3304d3677f5357f1a3e343b39fcd97b238abdb5e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1491e3b8247c9d163d6016caf2fcd8043a053b7e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1056ad4d1e2a4f956d12f6daf506620fab27dd17 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..e36c83ba601884b81c06ee69445a94e76224c828 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..352d870bc8eab11974640c4b2d9c80dc6fbbaaf2 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e4bda3eded693bfd44a8c86ced7ae6ee9963c583 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1420b97a4bd0dc0f5451623697666012a2de635c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..dd8e1da9c7b1d86bc8a0c834bbede9d0fd40acf5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c0ba019136c2e4f33b015be3d82505bee2066655 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/README.md b/FoodSeg103/configs/dmnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9b12c8d862fb7b7633c5b2f4a1c357803abdcd32 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fd6897691d3f8f200783fae7bfe231735f25a11b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..116cbdcede32bf24ad95f04291e98754011172c9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..d78d46c040f75d16225307d4b4151b87e6e3db29 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9713b731a47df9c5e23d26a08ad17d03a0d5e9fe --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6b222e730073dd42df618db5660ee9d4117f3956 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f36d490e9c9b31de7eedf735d2712e55f35db998 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1f9a917fa4223bd2428f2b2d10eac446f7ecc71a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b38f90dc4318f23d32971e7afbf90a327768f2d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a8fbd9beb11f3d1308ce2cd12da2a177c2d39478 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..74f6d6a85a06e96580a3c8d5843f660c85bca5ad --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..19841547a42315164de547a4121cfd64739cf24b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..31d95f96eb10025c2ad054cde4c81f47db21f0f2 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/README.md b/FoodSeg103/configs/dnlnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..172dfe1a0f07646c5f8cc47ddd62f5cb6da85a55 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1a36e3c80a13f91e37e4d90b7ae47c7e0d204144 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0f2e1b6da7e63841f4429b1caed5fbe9d537c4f8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..aca44e478b67d5a226681c099e64fe67d93cf39b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ebd27a1d1c6bf0e983fafed2e5659701dadb8f24 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..575e9d01343a4563e0d3ba89b361ea8e358d2dee --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4f1b9e19411eb963d16fd2a8174529e69ecd5a1a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f7aa7444d4c8022563db642478beec4dc5ab0dab --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fdff93f543af6bac93949e68532daea45e437167 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5305689d09b944f6e37aa85567ce3f29fc6974a7 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..09604c39729abfc9015eb971069b987c8d8a82cb --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0666199b63e604b09fe8187c378589c25d0d311b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f7b07c4f47629c07faa013b9d1eae3462d898c6f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/emanet/README.md b/FoodSeg103/configs/emanet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..40df946ed446cf862847dad084324412e5aa52ee --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..58f28b43f55f54c7a604960735963e6b7c13b6f1 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c5dbf20b0fcc7bc1dd077bd8b7077772251d4c1a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..73b7788bf924be2e1588596a88f0155ddc37358e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..699aa212c3518901b2f84db3f062c16b023c7538 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/README.md b/FoodSeg103/configs/encnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6ba42f69fae5e52254b34195b6cd0ed689c5bf6c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f34373d9ebab5ef6f4c01e3eab8a97c288495be0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0b0207b3144460d25229e3ac4c4d0d9fc1d34292 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8fec6ba255f33d48a66a831de4571346a7a2bd2e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..c264af998b5ef6a9e521db204205fb998cce68a9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..8a6968ea583758191fa8e94497c7186e653c7afb --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..94151004ea88394373cf8f135b065d5056b11179 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6ade67b76ce04e1ede3ff99aab4863705cff446 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..55648c08b2c4eb78d7d5ae65482e5e5b291c058a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4ea6ed0e84f3aa7d2c7acd8dd5c459a8cd3ce45c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d2feeef7e982550481365f8187cb1a50f0fafcc9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..2a5dc203cc793860aae7743d16c4fb9a564ad1d8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..9cb7952cede58165d2ed0f35d2208ad1ffb65232 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..81f3cbfbf516e833821c49deecd8f167170021f0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..835375cb0447378fc76431158eb0b8fc011d36bc --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d311e33f56ba431a882b0e7079001b0e9932a011 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7b535f3c80818ce6b692b66f18ceee8e7b181fdc --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..600b701a7194ead496cc924bee897b6096e1c7ca --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fastscnn/README.md b/FoodSeg103/configs/fastscnn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bb87a9f7aeb8d3630aeccc04b585a4dfec9f2b7e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py b/FoodSeg103/configs/fastscnn/fast_scnn_4x8_80k_lr0.12_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3d9c9999370c8b1c28af3063a3aded0d88c91caf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/README.md b/FoodSeg103/configs/fcn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..95ca2ac0439c3a33ef13f2e22d7fa7a83754142b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py b/FoodSeg103/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..f3a15b41054318d508e98685632921f262029de0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py b/FoodSeg103/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..bdccfd99ba0c25646f02850483c2cdf679fdbf3d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7918dd10d05cd98dbc02f02ef1b93e3134f52357 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..528110dc73c15008869a9ad9851ef487f0c952c7 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1bf6780f2c821052692ddcb904bd10e6256c1e71 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..09a5fe5468f0155f8fd0bf2cd1574a33624d8492 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..eafefaa67565513c277c5eb42e3661a88133cb27 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6d0294530f4c817b352cb020d111e3248690ae1f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6b4cc571294fa45b4442c2bfeb9fda13a14fc5c2 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3503c76935e294c881130b309999d32f13df8839 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b9bf60fc13364ca1b7b3842664950f653426e67 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f36eb02e68707d502cbe315ff8f6f25b232dee92 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5a1d29e480cb46a763cb17d2105b3f040153d417 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6644a58dea86fd38e208abbedffe4f836e677078 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..92accfc703fc398d2845d7dc2f1d5336f24738e8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5dd34dd2134c745275c66adc5488b4b9f68d6809 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py b/FoodSeg103/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..fdc6314f704e61d064f5fb7bdd30bc38a9e87ee5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py b/FoodSeg103/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0870f928b82b24b8179305f6c9fc7f6013fb481e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..401c6ea7330d45d8f7604a1da63fc6e15faea424 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..990a085eda2f2dc47f1a1289bfbf2726ad8c9c4f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9ca7fd23cedc0567a015bd5f8641a509ead6110a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..17206a5171dcc357c589a1711afa52d87faeece0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..8cec429c3e27ad2543b7e38fa206e6606fda4d5a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..ef194cb594eb76316324066e23e48184d8cede27 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fca98c1d9ace73a61ae395914e5960832216bf67 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7d75cd9f49343355b14c7d60bb0df0936ffe0278 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..28ef13f8d17e977f710ba9a863f182b1f80dc8cf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..106f7b6a1ece974c9f732ee813724bd8bda3bef3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/README.md b/FoodSeg103/configs/foodnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7aa6d7db2cdb9aa3b82537aa08396589a9511345 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/SETR_MLA_768x768_80k_base.py b/FoodSeg103/configs/foodnet/SETR_MLA_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..28beb61a243849ccf09dcb18a2e3880aeb8610f4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/SETR_MLA_768x768_80k_base_RM.py b/FoodSeg103/configs/foodnet/SETR_MLA_768x768_80k_base_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..6f3a76d44ce1efd203c27bd586566d3793d0a57c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/SETR_MLA_768x768_80k_large.py b/FoodSeg103/configs/foodnet/SETR_MLA_768x768_80k_large.py new file mode 100644 index 0000000000000000000000000000000000000000..caf8c3d1b462cfd9fd646291674519e255fb4532 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/SETR_Naive_768x768_80k_base.py b/FoodSeg103/configs/foodnet/SETR_Naive_768x768_80k_base.py new file mode 100644 index 0000000000000000000000000000000000000000..a51b67876051d356294c51ec1c333c56ac5c9042 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/SETR_Naive_768x768_80k_base_RM.py b/FoodSeg103/configs/foodnet/SETR_Naive_768x768_80k_base_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..e171cf36329b0ce0a71fa05b13c20f0f13979ce3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/ccnet_r50-d8_512x1024_80k.py b/FoodSeg103/configs/foodnet/ccnet_r50-d8_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..a65634569402a018ed238142ff34cce446e8ffe2 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/ccnet_r50-d8_512x1024_80k_RM.py b/FoodSeg103/configs/foodnet/ccnet_r50-d8_512x1024_80k_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..bf9c68ea153ac90398afe4080886ae16044f4d06 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/fpn_r50_512x1024_80k.py b/FoodSeg103/configs/foodnet/fpn_r50_512x1024_80k.py new file mode 100644 index 0000000000000000000000000000000000000000..da856c77ee311eaac410e37be3f9e2268bdd1442 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/foodnet/fpn_r50_512x1024_80k_RM.py b/FoodSeg103/configs/foodnet/fpn_r50_512x1024_80k_RM.py new file mode 100644 index 0000000000000000000000000000000000000000..31291a171e6d0d451367094e208babf310275c2c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fp16/README.md b/FoodSeg103/configs/fp16/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8d12e4d78025313fb9689bb320b07520bd7648ef --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py b/FoodSeg103/configs/fp16/deeplabv3_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..60d8350e98605c2445ce8359ca9a7a1951fe0085 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py b/FoodSeg103/configs/fp16/deeplabv3plus_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c263d6907ec9ddfdad32b380a7d926d1391e393c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py b/FoodSeg103/configs/fp16/fcn_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..8100a8e64d780c1b9c272b57e4e171c5e1a4120b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py b/FoodSeg103/configs/fp16/pspnet_r101-d8_512x1024_80k_fp16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..aefac2953abf65c10023599ec42c709a794935c8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/README.md b/FoodSeg103/configs/gcnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b840d5bf9f844e7af89803b48a43b76b887ced36 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..27bd9422dad49bc5a06f577ee45cd834bdbe3912 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7f0f83fe39da31fe9a5b497e0481e1c79a33e764 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9888120f65b045df1c7d4d05fb010373abf82ccf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1b70ca8e46a0409379f5ae9809ce03de203426ad --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..b17c7a12b547ee4e1cd60d667c575eab06eb071c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a2183fc2db1ff188b0ad5418e55f71005da926cc --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..08a6031f20234b1cc1d792ea5d4891613503a185 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5efb61339cdbdde585f7814e9650be2e2df654ac --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..610467c07204140bf604f8dda2aa57978c565ed3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..155e28f42194112703bb21473e5e3dd0fca40d49 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..1549a4d5bf10cd3fd6e3bd57bf7a48e7e5e1ede8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..a496204bdb061d975c40cb7ef2aaada40e020a13 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d85cf6550fea5da7cf1fa078eb4fa30e017166b4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..89d5e1ae0f3ef44626f3b5534c504cbce7389a32 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..332495d3d7f7d7c7c0e0aca4e379cd54e2ed07de --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d6d9cb1c64bcf8c3e952b6f8adc11bec0403d106 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/README.md b/FoodSeg103/configs/hrnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4d77cefe3e51091bc2264df8b201968addd81e8d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py b/FoodSeg103/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..5ff05aa595399d77ee51552c243e489f395a820e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py b/FoodSeg103/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..cf315a4f0e6f397768572c590a634cc1b9d298a9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py b/FoodSeg103/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9f04e935c39b08de66629f913b30675ffff2a8fe --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py b/FoodSeg103/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..99760c36d8399204ca8e35f32690bcd369676852 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py b/FoodSeg103/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a653dda19255214a1a412b645abddd3fc5c0d853 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py b/FoodSeg103/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..45ed99b6813324a58575f9bb74ce0534626e10c4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py b/FoodSeg103/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f06448b168af4d2dcc5a1f96e4430a7948b7e170 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py b/FoodSeg103/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d74e95943afca04ba4073e411e0b713985384129 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py b/FoodSeg103/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..52bc9f5e91f2fdf9ce8f9e3a873902dd8db56522 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py b/FoodSeg103/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..d09931048f762cd2ac224d62c2fe2ed8e0e148c8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py b/FoodSeg103/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..584b7135fd95464f3d2c965440a0b92161cde09a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py b/FoodSeg103/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ddbe3801f99dc21120548af85c55c7cdcfadaea2 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py b/FoodSeg103/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4e31d26e093b6cb2d59b24bb3060c92bd7dccdea --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py b/FoodSeg103/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ee2831d99d859c419b158b5f828d8a84063564ea --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py b/FoodSeg103/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..22a3ce0b38f36efc96595fe1c3ef428fc1575eb0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py b/FoodSeg103/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d0de5df75242e58ba572277d6fc5cf93675a097e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py b/FoodSeg103/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..409db3c628edf63cd40e002f436884ce1fb75970 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py b/FoodSeg103/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a8400979b1e94dd42343de656ffbc5fbb7a07944 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py b/FoodSeg103/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0e2d96cb6ce7249852cb1d9b36a2f24bdce00199 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py b/FoodSeg103/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..e28164e3dc9d321bf0a97b37f14f3184f95a27a5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py b/FoodSeg103/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..394a61c99f038c94fce58ac9c422b7c3ee4b5f50 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py b/FoodSeg103/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d37ab1d09ef51b1321ed8b3634fd99445efee543 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py b/FoodSeg103/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a9bab32b52ca41155062c7655986ed84677a8280 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py b/FoodSeg103/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..dff4fea85ced568c38d39408d459697e88ca0faa --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py b/FoodSeg103/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..a8d1deb98659d05755c6316c2aff2295afb0bb9c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py b/FoodSeg103/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1084a57e978195df6d45a9a00415953ddbaeeb51 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py b/FoodSeg103/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7eca7fa4b8102c6225af3b484ffff5bdc7c0f201 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v2/README.md b/FoodSeg103/configs/mobilenet_v2/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e0e75e028db703129551402ae9d63c6a2861dc4b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..267483d88ff25d75dc18c5c2d37375cd77c9639c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..e15b8cc82b09ac3e64875936cdfd0f663aaba936 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d4533d79a25771905d7f1900bf7b34037885a77a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7615a7c19a3f19635b71801a55e4544be4d215b5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a535bd0ed8a4883134acdc52cf3f77c8d897ce82 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..c5f6ab0d62e269e44dac016eb5ac58f49c1fa292 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7403bee864d833bcc31160665e4b54fdd738cc13 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5b72ac830be29b865ed52adaf41f2fe800f252cc --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v3/README.md b/FoodSeg103/configs/mobilenet_v3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2bad2a731c63ba51ee05518af893618cf7ed94a0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py b/FoodSeg103/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e59a78b48be3a0997a31524fd78e7fad5636bc82 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py b/FoodSeg103/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a3c5435142db6b1f81421f5fd96d07ece32b5f38 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py b/FoodSeg103/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d4e368b2a11ed6433d8f2594a2cc3184fe5ddfff --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py b/FoodSeg103/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0c5f707200c5d8b6d39493762baf59023dcaad11 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/README.md b/FoodSeg103/configs/nonlocal_net/README.md new file mode 100644 index 0000000000000000000000000000000000000000..76352e265a9db69640c650e192f66ab75b1f19b3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ef7b06dd3806c1d93be41943ab4d7d49f68ac830 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7a1e66cf1c239eac3c6a4876a35d82e7b6ccec2e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..df9c2aca9c7c1999d74a08a58aca5d220f7df54a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..490f9873a29f2626ad764825eec97f16ee7f9f96 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..40d9190fba223251b794c105b036e4794865f785 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0c6f60dac7b457d3b936a5f7f43eb84713c77e05 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..23e6da7f23180c2350253ea400f444c0c3064fd6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0627e2b5a76dead859212d4cab116c160df21404 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9d4dc7390370d0ffe21e7dcb686eeff7261952c4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b0672b687ade8d554b71fdf0bc54de9f024fa30c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..b1adfbab882d9825a3f348ed99e401d1f164cd11 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..2e808d8072f34d09a7b0859f90261dd66c8815dd --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..66b443abec3282242c0f794a2f91e066596e7ee9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..8a7a2f509ba6627ad5ab972ac090362bbcd2ecb7 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..75adef324877d56c157b457eecbf8446aa6b192f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a0726c293d6026898110f7fa55d5e7d2d55d7a02 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/README.md b/FoodSeg103/configs/ocrnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0a4c75c708330be9163dae675b0c1f84d7722728 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1c86eba17c46a863091d999b1a090e1237202ec5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..2c73b3839c8c1bc859eb3b8864256a00cfd022fe --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..506ad9319a9418f50650c477698c9b5cb9bf6663 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..a3c86e18ea65c6aaa36a4fb6e2708f08c7ae1698 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ab9d6446c9089bfae533b9dcd66e1352d81f74d0 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..df79a9cf13963d26384b00ced0cf5efa9f68a420 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6ad67722a50c2b2ece5fcb7f0dd1819061ff6b3e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..fc7909785f743071cad2cd1032000405435f81d4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..923731f74f80c11e196f6099b1c84875686cd441 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..be6bf16a2fd234f3526bf8fb8c30179f1ef9df78 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..81f3d5cb91607134bb1d844d78df7a3c411c134d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..ceb944815b5a979ddb72015295375f6fe0c31a89 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..70babc91c99eb99ee4f941b34ea886236531832e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py b/FoodSeg103/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..36e77219ac2d7ee6795db7c40ad7341749a3b1c7 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c094391b1dfcef2fa6278f0c181fb50c303f7a4c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0aada9d8dcd792fd4fc7da8908cc11d44a9ff521 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1b2e0094393151fa8975a0d53c48b6048b7e1929 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py b/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..3b3e8af9538e6ce3c929a902e3d1ee5be53469a5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py b/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..c2dd6d1158bd31ecdd7874827fd37bffb5d26db6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py b/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..89e6309f55f6b939f7d79271513da4934bbacbb6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py b/FoodSeg103/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..04971226eb0fd6461b715358ac955dfb78102992 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..3dd70b74a0bf912d8a6fd39f1f26be7f7571ccd6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e34f3432e581ff506c9d2951c98b5aad7b1be6a5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py b/FoodSeg103/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..33d96c76f68b92217ed38afe9538144dfedc4fd2 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/point_rend/README.md b/FoodSeg103/configs/point_rend/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0dea3e31f8c1eb3da33251fa1e10227ae98561e3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py b/FoodSeg103/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a8c14c8cf91d7cbcc05065a6dc387101dff8cdf6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py b/FoodSeg103/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..4d1f8c8154431b056fb8371772f03dfa49ac1ad3 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py b/FoodSeg103/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..96cbaa48d61ee208117d074e9f06bf4218407d78 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py b/FoodSeg103/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..db8c634c0f889c69ce80f86c445c493dcfdbd3c8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/README.md b/FoodSeg103/configs/psanet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fcb24103b8e2dd649c0ad8938319f201e3254d19 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..69d212f158552cf5a24f62174b24a9d4976477bb --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..bc25d6aaf67ccb7e9fcb44ba2d803bebfa31b160 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..7f6795e5ef0e4bf1d10ee7ed4f608bf93ac24216 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..1a3c43495bbf9d302216d7ddf62df75446907a36 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f62eef9773ddf41d996104de571bcda00c488e14 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f8865a7c4d795d9de3f5bc6b762b305b3cabc22f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ffc99f010903267fc7c1893f4a6b0dcd2cbe42e6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6a9efc55ad2062facf3a568f8cdbba76c8c55950 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..6671fcb4bf8430bc0128cd93a4b8cedea1856b03 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a441013a4c1adc39fc064dbac23caaac9efdc4a6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..9c6364eb43e2abc95011205b569627ff9367d0e5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..af06cb66cc808c206d6946a4b2420a6942d3dc7e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..803c42da35eda861bf32ce0e7866cdc9fad96d0d --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..0141a6d0925c2a2aa37517670a9f12ac7d3a02d4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..690f8b5ef359be8a8be3a2d768aede24216a8706 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..0966b4770cc649e95525c366b09801408b99567a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/README.md b/FoodSeg103/configs/pspnet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..931cad900680281d6970626b511124704e954c43 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..0b5a990604a77238375cb6d2b8298a382a457dd6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..fda9110603d71e14cab6e537949be191f2adf6db --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..38fee11bc23d8c92c529acd0c02a68204e34ab91 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9931a07bc2d137eb49b3fa4dad8f8681d4f5e943 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6107b41544378ad371cee95ee5ebc2e98ccbd9ad --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..2221b202d6c53c4b04f2431d3344379cbfe06dd7 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..15f578b6002c481ada06befc3ea66accbbdd1f66 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..fb7c3d55d57b09296ea24889b218f9a0fb997463 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..c6e7e58508f31627766b8ab748bd81cd51c77eca --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..59b8c6dd5ef234334bcdfa3d5e3594b7a9989b17 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..ab8a3d3e3fcc12dd41223af190e2ae04f14d1cb8 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..1a7cb708e551e90a12ad4267e2af6938c353f0ba --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d914f93c023a6384e0e856b8608280cef589d5c6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5893e66a41cad73e8fb24aa58dc78ef002aecca5 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..abeeedf84387d7846a8a2c10480b94c9d8405559 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..284be6d09af1806b99bee5b85286b55ce02e8cbd --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..86da94de5b32576f04240a2d02dfeccc0d6ddd45 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py new file mode 100644 index 0000000000000000000000000000000000000000..cbb02714b9e252bab38b3f9d9095dabe570b9005 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..5deb5872b00a30d5c18a980c4d6c1b0d915908b9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4e9972849d6899fe43f435284d0e0b1bc3b0e7a9 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..86584573a3d1afac73041b85516112ac21f1f17c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..cd88154d5e0be1a519e973331e0a14ae8a7de13e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f0c20c12f6bcf04b732dccaa4bfdba10bd10b5e6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..52efdf51d7d66c3205c1448c45ae281649a0901e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..145cadb24016eeea87fccff8171c5b0dfb78f7ab --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..23a81eb7ef56a4cd8e7c9da65b86f3d0e562001a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..946bf4fc84236942a4462c2daa7637cace4e90cf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py b/FoodSeg103/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b6087dcf9f7cc04e12a2b9bcbde7abc4a56e972e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/resnest/README.md b/FoodSeg103/configs/resnest/README.md new file mode 100644 index 0000000000000000000000000000000000000000..31bac01ec9f659d6c30f220a104c385326d3f04b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..f98398690eb3e1e77975d7fb94ea865424aa331b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..e3924ad679cb3d7ba731322f9cdb67410baae59a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..69bef7238345cf6aabb126012af992602f910287 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..d51bccb965dafc40d7859219d132dc9467740a1b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..33fa0252d8b4cc786f1297605c169ee6068195a4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..dcee8c280e833825f84b944c6db21e9a43125e06 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py b/FoodSeg103/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..9737849cbd7470b03ef3fcb3b1225283370eb503 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py b/FoodSeg103/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..6a622eae963401e143004a62ff53071ddbf61c01 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/sem_fpn/README.md b/FoodSeg103/configs/sem_fpn/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c73ade624817b61be2f226c6fae03d0b023c570a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py b/FoodSeg103/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..7f8710d4be4ee0664f644b9037fd4653e4655907 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py b/FoodSeg103/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..2654096dfd78ecdd4065ac2d26cab3e2f11a9c65 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py b/FoodSeg103/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..4bf3edd825296fbbed883effc3622793e9adf071 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py b/FoodSeg103/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..5cdfc8ca264c6045dcb7ad890d89f15537bef233 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/README.md b/FoodSeg103/configs/unet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d815510a19ade68c4962f04b8dee2c317f1788ce --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py b/FoodSeg103/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..c706cf3548e311a7930e5b58299e05af30c43d98 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py b/FoodSeg103/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..0ef02dcc491871f148b1ad038d281d250eb6e2f4 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py b/FoodSeg103/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..118428bc44d3078517e231399b131db492f2bc7e --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py b/FoodSeg103/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..1f8862a0e89243d67634f37c3aca94ca98feff5c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py b/FoodSeg103/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..2bc52d96293f214adf1e3e1878746ed8bd2434f6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py b/FoodSeg103/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..5d836c61dfd568dd4d29d876980001067dcaa200 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py b/FoodSeg103/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..be8eec77792f4eb16475dc5ab8607fb5682f0acf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py b/FoodSeg103/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..80483ade4a4bc3dc5cb8805e8b74c100e872da0c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py b/FoodSeg103/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py new file mode 100644 index 0000000000000000000000000000000000000000..b085a17d6bab5f4d33668bfcf232e30f2a9830fe --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py b/FoodSeg103/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py new file mode 100644 index 0000000000000000000000000000000000000000..9d729cea699e1c845549c74b52703c9ee3273662 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py b/FoodSeg103/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py new file mode 100644 index 0000000000000000000000000000000000000000..f57c9166b67a18fd74f474754b3baec6584b17cf --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py b/FoodSeg103/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py new file mode 100644 index 0000000000000000000000000000000000000000..7b5421ad6877e4b35b0a6ae6e516e577404547ce --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/README.md b/FoodSeg103/configs/upernet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4d53a92f9bdb67ca9e4c3974ee368ca49d84619c --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py b/FoodSeg103/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..b90b597d831a664761d6051397d2b1862feb59c6 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py b/FoodSeg103/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..420ca2e42836099213c1f91cb925088cfe7c1269 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r101_512x512_160k_ade20k.py b/FoodSeg103/configs/upernet/upernet_r101_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..146f13eb79053cc69d4934d294aad9ba723b2577 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r101_512x512_20k_voc12aug.py b/FoodSeg103/configs/upernet/upernet_r101_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..56345d1806482ac822d709893fe6942f44be6f74 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r101_512x512_40k_voc12aug.py b/FoodSeg103/configs/upernet/upernet_r101_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..0669b741b9b3e3e1a309147b920d3d2a1952ab75 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r101_512x512_80k_ade20k.py b/FoodSeg103/configs/upernet/upernet_r101_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..abfb9c5d9f35407d590cdc3325006b396ec52820 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r101_769x769_40k_cityscapes.py b/FoodSeg103/configs/upernet/upernet_r101_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..e5f3a3fae18cb769fd04b0c669785c5728cf479f --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r101_769x769_80k_cityscapes.py b/FoodSeg103/configs/upernet/upernet_r101_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..a709165657d257df4fc76148d225261c63f88d8a --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py b/FoodSeg103/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..d621e89ce62c06424db7c2e5f5fd00a0a2e85a61 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py b/FoodSeg103/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..95fffcc76c2ff4f61f8dd80a00d35b7875262a50 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r50_512x512_160k_ade20k.py b/FoodSeg103/configs/upernet/upernet_r50_512x512_160k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f5dd9aa4ed59d4939bcb49ffe129a9935e303201 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r50_512x512_20k_voc12aug.py b/FoodSeg103/configs/upernet/upernet_r50_512x512_20k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..95f5c09567144db47e07fc802b114bedd6a00725 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r50_512x512_40k_voc12aug.py b/FoodSeg103/configs/upernet/upernet_r50_512x512_40k_voc12aug.py new file mode 100644 index 0000000000000000000000000000000000000000..9621fd1f5c24e582b4a1eda18fcc0a13d2bcb953 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r50_512x512_80k_ade20k.py b/FoodSeg103/configs/upernet/upernet_r50_512x512_80k_ade20k.py new file mode 100644 index 0000000000000000000000000000000000000000..f561e309e3bddb439c90af930c4de5a0c7e209a7 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r50_769x769_40k_cityscapes.py b/FoodSeg103/configs/upernet/upernet_r50_769x769_40k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..89b18aa2840d12e67339ce0b7a0561fa2ba0c6fa --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/configs/upernet/upernet_r50_769x769_80k_cityscapes.py b/FoodSeg103/configs/upernet/upernet_r50_769x769_80k_cityscapes.py new file mode 100644 index 0000000000000000000000000000000000000000..29af98f2ebe341998fcf93f8a5c018cabcc0c0ba --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/data/.DS_Store b/FoodSeg103/data/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9d3b04ff632511c5c7e22b5afe2e211638687b7f Binary files /dev/null and b/FoodSeg103/data/.DS_Store differ diff --git a/FoodSeg103/data/FoodSeg103/.DS_Store b/FoodSeg103/data/FoodSeg103/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..aebe3465f78d6ece2a38a964c04dcbe14a3234b9 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/.DS_Store differ diff --git a/FoodSeg103/data/FoodSeg103/ImageSets/test.txt b/FoodSeg103/data/FoodSeg103/ImageSets/test.txt new file mode 100644 index 0000000000000000000000000000000000000000..03ffa80d51ae47fe30774a719fa66b4135987d04 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/ImageSets/test.txt @@ -0,0 +1,2135 @@ +00000048.jpg +00000263.jpg +00001977.jpg +00002106.jpg +00004401.jpg +00004402.jpg +00004403.jpg +00004404.jpg +00004405.jpg +00004406.jpg +00004407.jpg +00004408.jpg +00004409.jpg +00004410.jpg +00004411.jpg +00004412.jpg +00004413.jpg +00004414.jpg +00004415.jpg +00004416.jpg +00004417.jpg +00004418.jpg +00004419.jpg +00004420.jpg +00004421.jpg +00004422.jpg +00004423.jpg +00004424.jpg +00004425.jpg +00004426.jpg +00004427.jpg +00004428.jpg +00004429.jpg +00004430.jpg +00004431.jpg +00004432.jpg +00004433.jpg +00004434.jpg +00004435.jpg +00004436.jpg +00004437.jpg +00004438.jpg +00004439.jpg +00004440.jpg +00004441.jpg +00004442.jpg +00004443.jpg +00004444.jpg +00004445.jpg +00004446.jpg +00004447.jpg +00004448.jpg +00004449.jpg +00004450.jpg +00004451.jpg +00004452.jpg +00004453.jpg +00004454.jpg +00004455.jpg +00004456.jpg +00004457.jpg +00004458.jpg +00004459.jpg +00004460.jpg +00004461.jpg +00004462.jpg +00004463.jpg +00004464.jpg +00004465.jpg +00004466.jpg +00004467.jpg +00004468.jpg +00004469.jpg +00004470.jpg +00004471.jpg +00004472.jpg +00004473.jpg +00004474.jpg +00004475.jpg +00004476.jpg +00004477.jpg +00004478.jpg +00004479.jpg +00004480.jpg +00004481.jpg +00004482.jpg +00004483.jpg +00004484.jpg +00004485.jpg +00004486.jpg +00004487.jpg +00004488.jpg +00004489.jpg +00004490.jpg +00004491.jpg +00004492.jpg +00004493.jpg +00004494.jpg +00004495.jpg +00004496.jpg +00004497.jpg +00004498.jpg +00004499.jpg +00004500.jpg +00004501.jpg +00004502.jpg +00004503.jpg +00004504.jpg +00004505.jpg +00004506.jpg +00004507.jpg +00004508.jpg +00004509.jpg +00004510.jpg +00004511.jpg +00004512.jpg +00004513.jpg +00004514.jpg +00004515.jpg +00004516.jpg +00004517.jpg +00004518.jpg +00004519.jpg +00004520.jpg +00004521.jpg +00004522.jpg +00004523.jpg +00004524.jpg +00004525.jpg +00004526.jpg +00004527.jpg +00004528.jpg +00004529.jpg +00004530.jpg +00004531.jpg +00004532.jpg +00004533.jpg +00004534.jpg +00004535.jpg +00004536.jpg +00004537.jpg +00004538.jpg +00004539.jpg +00004540.jpg +00004541.jpg +00004542.jpg +00004543.jpg +00004544.jpg +00004545.jpg +00004546.jpg +00004547.jpg +00004548.jpg +00004549.jpg +00004550.jpg +00004551.jpg +00004552.jpg +00004553.jpg +00004554.jpg +00004555.jpg +00004556.jpg +00004557.jpg +00004558.jpg +00004559.jpg +00004560.jpg +00004561.jpg +00004562.jpg +00004563.jpg +00004564.jpg +00004565.jpg +00004566.jpg +00004567.jpg +00004568.jpg +00004569.jpg +00004570.jpg +00004571.jpg +00004572.jpg +00004573.jpg +00004574.jpg +00004575.jpg +00004576.jpg +00004577.jpg +00004578.jpg +00004579.jpg +00004580.jpg +00004581.jpg +00004582.jpg +00004583.jpg +00004584.jpg +00004585.jpg +00004586.jpg +00004587.jpg +00004588.jpg +00004589.jpg +00004590.jpg +00004591.jpg +00004592.jpg +00004593.jpg +00004594.jpg +00004595.jpg +00004596.jpg +00004597.jpg +00004598.jpg +00004599.jpg +00004600.jpg +00004601.jpg +00004602.jpg +00004603.jpg +00004604.jpg +00004605.jpg +00004606.jpg +00004607.jpg +00004608.jpg +00004609.jpg +00004610.jpg +00004611.jpg +00004612.jpg +00004613.jpg +00004614.jpg +00004615.jpg +00004616.jpg +00004617.jpg +00004618.jpg +00004619.jpg +00004620.jpg +00004621.jpg +00004622.jpg +00004623.jpg +00004624.jpg +00004625.jpg +00004626.jpg +00004627.jpg +00004628.jpg +00004629.jpg +00004630.jpg +00004631.jpg +00004632.jpg +00004633.jpg +00004634.jpg +00004635.jpg +00004636.jpg +00004637.jpg +00004638.jpg +00004639.jpg +00004640.jpg +00004641.jpg +00004642.jpg +00004643.jpg +00004644.jpg +00004645.jpg +00004646.jpg +00004647.jpg +00004648.jpg +00004649.jpg +00004650.jpg +00004651.jpg +00004652.jpg +00004653.jpg +00004654.jpg +00004655.jpg +00004656.jpg +00004657.jpg +00004658.jpg +00004659.jpg +00004660.jpg +00004661.jpg +00004662.jpg +00004663.jpg +00004664.jpg +00004665.jpg +00004666.jpg +00004667.jpg +00004668.jpg +00004669.jpg +00004670.jpg +00004671.jpg +00004672.jpg +00004673.jpg +00004674.jpg +00004675.jpg +00004676.jpg +00004677.jpg +00004678.jpg +00004679.jpg +00004680.jpg +00004681.jpg +00004682.jpg +00004683.jpg +00004684.jpg +00004685.jpg +00004686.jpg +00004687.jpg +00004688.jpg +00004689.jpg +00004690.jpg +00004691.jpg +00004692.jpg +00004693.jpg +00004694.jpg +00004695.jpg +00004696.jpg +00004697.jpg +00004698.jpg +00004699.jpg +00004700.jpg +00004701.jpg +00004702.jpg +00004703.jpg +00004704.jpg +00004705.jpg +00004706.jpg +00004707.jpg +00004708.jpg +00004709.jpg +00004710.jpg +00004711.jpg +00004712.jpg +00004713.jpg +00004714.jpg +00004715.jpg +00004716.jpg +00004717.jpg +00004718.jpg +00004719.jpg +00004720.jpg +00004721.jpg +00004722.jpg +00004723.jpg +00004724.jpg +00004725.jpg +00004726.jpg +00004727.jpg +00004728.jpg +00004729.jpg +00004730.jpg +00004731.jpg +00004732.jpg +00004733.jpg +00004734.jpg +00004735.jpg +00004736.jpg +00004737.jpg +00004738.jpg +00004739.jpg +00004740.jpg +00004741.jpg +00004742.jpg +00004743.jpg +00004744.jpg +00004745.jpg +00004746.jpg +00004747.jpg +00004748.jpg +00004749.jpg +00004750.jpg +00004751.jpg +00004752.jpg +00004753.jpg +00004754.jpg +00004755.jpg +00004756.jpg +00004757.jpg +00004758.jpg +00004759.jpg +00004760.jpg +00004761.jpg +00004762.jpg +00004763.jpg +00004764.jpg +00004765.jpg +00004766.jpg +00004767.jpg +00004768.jpg +00004769.jpg +00004770.jpg +00004771.jpg +00004772.jpg +00004773.jpg +00004774.jpg +00004775.jpg +00004776.jpg +00004777.jpg +00004778.jpg +00004779.jpg +00004780.jpg +00004781.jpg +00004782.jpg +00004783.jpg +00004784.jpg +00004785.jpg +00004786.jpg +00004787.jpg +00004788.jpg +00004789.jpg +00004790.jpg +00004791.jpg +00004792.jpg +00004793.jpg +00004794.jpg +00004795.jpg +00004796.jpg +00004797.jpg +00004798.jpg +00004799.jpg +00004800.jpg +00004801.jpg +00004802.jpg +00004803.jpg +00004804.jpg +00004805.jpg +00004806.jpg +00004807.jpg +00004808.jpg +00004809.jpg +00004810.jpg +00004811.jpg +00004812.jpg +00004813.jpg +00004814.jpg +00004815.jpg +00004816.jpg +00004817.jpg +00004818.jpg +00004819.jpg +00004820.jpg +00004821.jpg +00004822.jpg +00004823.jpg +00004824.jpg +00004825.jpg +00004826.jpg +00004827.jpg +00004828.jpg +00004829.jpg +00004830.jpg +00004831.jpg +00004832.jpg +00004833.jpg +00004834.jpg +00004835.jpg +00004836.jpg +00004837.jpg +00004838.jpg +00004839.jpg +00004840.jpg +00004841.jpg +00004842.jpg +00004843.jpg +00004844.jpg +00004845.jpg +00004846.jpg +00004847.jpg +00004848.jpg +00004849.jpg +00004850.jpg +00004851.jpg +00004852.jpg +00004853.jpg +00004854.jpg +00004855.jpg +00004856.jpg +00004857.jpg +00004858.jpg +00004859.jpg +00004860.jpg +00004861.jpg +00004862.jpg +00004863.jpg +00004864.jpg +00004865.jpg +00004866.jpg +00004867.jpg +00004868.jpg +00004869.jpg +00004870.jpg +00004871.jpg +00004872.jpg +00004873.jpg +00004874.jpg +00004875.jpg +00004876.jpg +00004877.jpg +00004878.jpg +00004879.jpg +00004880.jpg +00004881.jpg +00004882.jpg +00004883.jpg +00004884.jpg +00004885.jpg +00004886.jpg +00004887.jpg +00004888.jpg +00004889.jpg +00004890.jpg +00004891.jpg +00004892.jpg +00004893.jpg +00004894.jpg +00004895.jpg +00004896.jpg +00004897.jpg +00004898.jpg +00004899.jpg +00004900.jpg +00004901.jpg +00004902.jpg +00004903.jpg +00004904.jpg +00004905.jpg +00004906.jpg +00004907.jpg +00004908.jpg +00004909.jpg +00004910.jpg +00004911.jpg +00004912.jpg +00004913.jpg +00004914.jpg +00004915.jpg +00004916.jpg +00004917.jpg +00004918.jpg +00004919.jpg +00004920.jpg +00004921.jpg +00004922.jpg +00004923.jpg +00004924.jpg +00004925.jpg +00004926.jpg +00004927.jpg +00004928.jpg +00004929.jpg +00004930.jpg +00004931.jpg +00004932.jpg +00004933.jpg +00004934.jpg +00004935.jpg +00004936.jpg +00004937.jpg +00004938.jpg +00004939.jpg +00004940.jpg +00004941.jpg +00004942.jpg +00004943.jpg +00004944.jpg +00004945.jpg +00004946.jpg +00004947.jpg +00004948.jpg +00004949.jpg +00004950.jpg +00004951.jpg +00004952.jpg +00004953.jpg +00004954.jpg +00004955.jpg +00004956.jpg +00004957.jpg +00004958.jpg +00004959.jpg +00004960.jpg +00004961.jpg +00004962.jpg +00004963.jpg +00004964.jpg +00004965.jpg +00004966.jpg +00004967.jpg +00004968.jpg +00004969.jpg +00004970.jpg +00004971.jpg +00004972.jpg +00004973.jpg +00004974.jpg +00004975.jpg +00004976.jpg +00004977.jpg +00004978.jpg +00004979.jpg +00004980.jpg +00004981.jpg +00004982.jpg +00004983.jpg +00004984.jpg +00004985.jpg +00004986.jpg +00004987.jpg +00004988.jpg +00004989.jpg +00004990.jpg +00004991.jpg +00004992.jpg +00004993.jpg +00004994.jpg +00004995.jpg +00004996.jpg +00004997.jpg +00004998.jpg +00004999.jpg +00005000.jpg +00005001.jpg +00005002.jpg +00005003.jpg +00005004.jpg +00005005.jpg +00005006.jpg +00005007.jpg +00005008.jpg +00005009.jpg +00005010.jpg +00005011.jpg +00005012.jpg +00005013.jpg +00005014.jpg +00005015.jpg +00005016.jpg +00005017.jpg +00005018.jpg +00005019.jpg +00005020.jpg +00005021.jpg +00005022.jpg +00005023.jpg +00005024.jpg +00005025.jpg +00005026.jpg +00005027.jpg +00005028.jpg +00005029.jpg +00005030.jpg +00005031.jpg +00005032.jpg +00005033.jpg +00005034.jpg +00005035.jpg +00005036.jpg +00005037.jpg +00005038.jpg +00005039.jpg +00005040.jpg +00005041.jpg +00005042.jpg +00005043.jpg +00005044.jpg +00005045.jpg +00005046.jpg +00005047.jpg +00005048.jpg +00005049.jpg +00005050.jpg +00005051.jpg +00005052.jpg +00005053.jpg +00005054.jpg +00005055.jpg +00005056.jpg +00005057.jpg +00005058.jpg +00005059.jpg +00005060.jpg +00005061.jpg +00005062.jpg +00005063.jpg +00005064.jpg +00005065.jpg +00005066.jpg +00005067.jpg +00005068.jpg +00005069.jpg +00005070.jpg +00005071.jpg +00005072.jpg +00005073.jpg +00005074.jpg +00005075.jpg +00005076.jpg +00005077.jpg +00005078.jpg +00005079.jpg +00005080.jpg +00005081.jpg +00005082.jpg +00005083.jpg +00005084.jpg +00005085.jpg +00005086.jpg +00005087.jpg +00005088.jpg +00005089.jpg +00005090.jpg +00005091.jpg +00005092.jpg +00005093.jpg +00005094.jpg +00005095.jpg +00005096.jpg +00005097.jpg +00005098.jpg +00005099.jpg +00005100.jpg +00005101.jpg +00005102.jpg +00005103.jpg +00005104.jpg +00005105.jpg +00005106.jpg +00005107.jpg +00005108.jpg +00005109.jpg +00005110.jpg +00005111.jpg +00005112.jpg +00005113.jpg +00005114.jpg +00005115.jpg +00005116.jpg +00005117.jpg +00005118.jpg +00005119.jpg +00005120.jpg +00005121.jpg +00005122.jpg +00005123.jpg +00005124.jpg +00005125.jpg +00005126.jpg +00005127.jpg +00005128.jpg +00005129.jpg +00005130.jpg +00005131.jpg +00005132.jpg +00005133.jpg +00005134.jpg +00005135.jpg +00005136.jpg +00005137.jpg +00005138.jpg +00005139.jpg +00005140.jpg +00005141.jpg +00005142.jpg +00005143.jpg +00005144.jpg +00005145.jpg +00005146.jpg +00005147.jpg +00005148.jpg +00005149.jpg +00005150.jpg +00005151.jpg +00005152.jpg +00005153.jpg +00005154.jpg +00005155.jpg +00005156.jpg +00005157.jpg +00005158.jpg +00005159.jpg +00005160.jpg +00005161.jpg +00005162.jpg +00005163.jpg +00005164.jpg +00005165.jpg +00005166.jpg +00005167.jpg +00005168.jpg +00005169.jpg +00005170.jpg +00005171.jpg +00005172.jpg +00005173.jpg +00005174.jpg +00005175.jpg +00005176.jpg +00005177.jpg +00005178.jpg +00005179.jpg +00005180.jpg +00005181.jpg +00005182.jpg +00005183.jpg +00005184.jpg +00005185.jpg +00005186.jpg +00005187.jpg +00005188.jpg +00005189.jpg +00005190.jpg +00005191.jpg +00005192.jpg +00005193.jpg +00005194.jpg +00005195.jpg +00005196.jpg +00005197.jpg +00005198.jpg +00005199.jpg +00005200.jpg +00005201.jpg +00005202.jpg +00005203.jpg +00005204.jpg +00005205.jpg +00005206.jpg +00005207.jpg +00005208.jpg +00005209.jpg +00005210.jpg +00005211.jpg +00005212.jpg +00005213.jpg +00005214.jpg +00005215.jpg +00005216.jpg +00005217.jpg +00005218.jpg +00005219.jpg +00005220.jpg +00005221.jpg +00005222.jpg +00005223.jpg +00005224.jpg +00005225.jpg +00005226.jpg +00005227.jpg +00005228.jpg +00005229.jpg +00005230.jpg +00005231.jpg +00005232.jpg +00005233.jpg +00005234.jpg +00005235.jpg +00005236.jpg +00005237.jpg +00005238.jpg +00005239.jpg +00005240.jpg +00005241.jpg +00005242.jpg +00005243.jpg +00005244.jpg +00005245.jpg +00005246.jpg +00005247.jpg +00005248.jpg +00005249.jpg +00005250.jpg +00005251.jpg +00005252.jpg +00005253.jpg +00005254.jpg +00005255.jpg +00005256.jpg +00005257.jpg +00005258.jpg +00005259.jpg +00005260.jpg +00005261.jpg +00005262.jpg +00005263.jpg +00005264.jpg +00005265.jpg +00005266.jpg +00005267.jpg +00005268.jpg +00005269.jpg +00005270.jpg +00005271.jpg +00005272.jpg +00005273.jpg +00005274.jpg +00005275.jpg +00005276.jpg +00005277.jpg +00005278.jpg +00005279.jpg +00005280.jpg +00005281.jpg +00005282.jpg +00005283.jpg +00005284.jpg +00005285.jpg +00005286.jpg +00005287.jpg +00005288.jpg +00005289.jpg +00005290.jpg +00005291.jpg +00005292.jpg +00005293.jpg +00005294.jpg +00005295.jpg +00005296.jpg +00005297.jpg +00005298.jpg +00005299.jpg +00005300.jpg +00005301.jpg +00005302.jpg +00005303.jpg +00005304.jpg +00005305.jpg +00005306.jpg +00005307.jpg +00005308.jpg +00005309.jpg +00005310.jpg +00005311.jpg +00005312.jpg +00005313.jpg +00005314.jpg +00005315.jpg +00005316.jpg +00005317.jpg +00005318.jpg +00005319.jpg +00005320.jpg +00005321.jpg +00005322.jpg +00005323.jpg +00005324.jpg +00005325.jpg +00005326.jpg +00005327.jpg +00005328.jpg +00005329.jpg +00005330.jpg +00005331.jpg +00005332.jpg +00005333.jpg +00005334.jpg +00005335.jpg +00005336.jpg +00005337.jpg +00005338.jpg +00005339.jpg +00005340.jpg +00005341.jpg +00005342.jpg +00005343.jpg +00005344.jpg +00005345.jpg +00005346.jpg +00005347.jpg +00005348.jpg +00005349.jpg +00005350.jpg +00005351.jpg +00005352.jpg +00005353.jpg +00005354.jpg +00005355.jpg +00005356.jpg +00005357.jpg +00005358.jpg +00005359.jpg +00005360.jpg +00005361.jpg +00005362.jpg +00005363.jpg +00005364.jpg +00005365.jpg +00005366.jpg +00005367.jpg +00005368.jpg +00005369.jpg +00005370.jpg +00005371.jpg +00005372.jpg +00005373.jpg +00005374.jpg +00005375.jpg +00005376.jpg +00005377.jpg +00005378.jpg +00005379.jpg +00005380.jpg +00005381.jpg +00005382.jpg +00005383.jpg +00005384.jpg +00005385.jpg +00005386.jpg +00005387.jpg +00005388.jpg +00005389.jpg +00005390.jpg +00005391.jpg +00005392.jpg +00005393.jpg +00005394.jpg +00005395.jpg +00005396.jpg +00005397.jpg +00005398.jpg +00005399.jpg +00005400.jpg +00005401.jpg +00005402.jpg +00005403.jpg +00005404.jpg +00005405.jpg +00005406.jpg +00005407.jpg +00005408.jpg +00005409.jpg +00005410.jpg +00005411.jpg +00005412.jpg +00005413.jpg +00005414.jpg +00005415.jpg +00005416.jpg +00005417.jpg +00005418.jpg +00005419.jpg +00005420.jpg +00005421.jpg +00005422.jpg +00005423.jpg +00005424.jpg +00005425.jpg +00005426.jpg +00005427.jpg +00005428.jpg +00005429.jpg +00005430.jpg +00005431.jpg +00005432.jpg +00005433.jpg +00005434.jpg +00005435.jpg +00005436.jpg +00005437.jpg +00005438.jpg +00005439.jpg +00005440.jpg +00005441.jpg +00005442.jpg +00005443.jpg +00005444.jpg +00005445.jpg +00005446.jpg +00005447.jpg +00005448.jpg +00005449.jpg +00005450.jpg +00005451.jpg +00005452.jpg +00005453.jpg +00005454.jpg +00005455.jpg +00005456.jpg +00005457.jpg +00005458.jpg +00005459.jpg +00005460.jpg +00005461.jpg +00005462.jpg +00005463.jpg +00005464.jpg +00005465.jpg +00005466.jpg +00005467.jpg +00005468.jpg +00005469.jpg +00005470.jpg +00005471.jpg +00005472.jpg +00005473.jpg +00005474.jpg +00005475.jpg +00005476.jpg +00005477.jpg +00005478.jpg +00005479.jpg +00005480.jpg +00005481.jpg +00005482.jpg +00005483.jpg +00005484.jpg +00005485.jpg +00005486.jpg +00005487.jpg +00005488.jpg +00005489.jpg +00005490.jpg +00005491.jpg +00005492.jpg +00005493.jpg +00005494.jpg +00005495.jpg +00005496.jpg +00005497.jpg +00005498.jpg +00005499.jpg +00005500.jpg +00005501.jpg +00005502.jpg +00005503.jpg +00005504.jpg +00005505.jpg +00005506.jpg +00005507.jpg +00005508.jpg +00005509.jpg +00005510.jpg +00005511.jpg +00005512.jpg +00005513.jpg +00005514.jpg +00005515.jpg +00005516.jpg +00005517.jpg +00005518.jpg +00005519.jpg +00005520.jpg +00005521.jpg +00005522.jpg +00005523.jpg +00005524.jpg +00005525.jpg +00005526.jpg +00005527.jpg +00005528.jpg +00005529.jpg +00005530.jpg +00005531.jpg +00005532.jpg +00005533.jpg +00005534.jpg +00005535.jpg +00005536.jpg +00005537.jpg +00005538.jpg +00005539.jpg +00005540.jpg +00005541.jpg +00005542.jpg +00005543.jpg +00005544.jpg +00005545.jpg +00005546.jpg +00005547.jpg +00005548.jpg +00005549.jpg +00005550.jpg +00005551.jpg +00005552.jpg +00005553.jpg +00005554.jpg +00005555.jpg +00005556.jpg +00005557.jpg +00005558.jpg +00005559.jpg +00005560.jpg +00005561.jpg +00005562.jpg +00005563.jpg +00005564.jpg +00005565.jpg +00005566.jpg +00005567.jpg +00005568.jpg +00005569.jpg +00005570.jpg +00005571.jpg +00005572.jpg +00005573.jpg +00005574.jpg +00005575.jpg +00005576.jpg +00005577.jpg +00005578.jpg +00005579.jpg +00005580.jpg +00005581.jpg +00005582.jpg +00005583.jpg +00005584.jpg +00005585.jpg +00005586.jpg +00005587.jpg +00005588.jpg +00005589.jpg +00005590.jpg +00005591.jpg +00005592.jpg +00005593.jpg +00005594.jpg +00005595.jpg +00005596.jpg +00005597.jpg +00005598.jpg +00005599.jpg +00005600.jpg +00005601.jpg +00005602.jpg +00005603.jpg +00005604.jpg +00005605.jpg +00005606.jpg +00005607.jpg +00005608.jpg +00005609.jpg +00005610.jpg +00005611.jpg +00005612.jpg +00005613.jpg +00005614.jpg +00005615.jpg +00005616.jpg +00005617.jpg +00005618.jpg +00005619.jpg +00005620.jpg +00005621.jpg +00005622.jpg +00005623.jpg +00005624.jpg +00005625.jpg +00005626.jpg +00005627.jpg +00005628.jpg +00005629.jpg +00005630.jpg +00005631.jpg +00005632.jpg +00005633.jpg +00005634.jpg +00005635.jpg +00005636.jpg +00005637.jpg +00005638.jpg +00005639.jpg +00005640.jpg +00005641.jpg +00005642.jpg +00005643.jpg +00005644.jpg +00005645.jpg +00005646.jpg +00005647.jpg +00005648.jpg +00005649.jpg +00005650.jpg +00005651.jpg +00005652.jpg +00005653.jpg +00005654.jpg +00005655.jpg +00005656.jpg +00005657.jpg +00005658.jpg +00005659.jpg +00005660.jpg +00005661.jpg +00005662.jpg +00005663.jpg +00005664.jpg +00005665.jpg +00005666.jpg +00005667.jpg +00005668.jpg +00005669.jpg +00005670.jpg +00005671.jpg +00005672.jpg +00005673.jpg +00005674.jpg +00005675.jpg +00005676.jpg +00005677.jpg +00005678.jpg +00005679.jpg +00005680.jpg +00005681.jpg +00005682.jpg +00005683.jpg +00005684.jpg +00005685.jpg +00005686.jpg +00005687.jpg +00005688.jpg +00005689.jpg +00005690.jpg +00005691.jpg +00005692.jpg +00005693.jpg +00005694.jpg +00005695.jpg +00005696.jpg +00005697.jpg +00005698.jpg +00005699.jpg +00005700.jpg +00005701.jpg +00005702.jpg +00005703.jpg +00005704.jpg +00005705.jpg +00005706.jpg +00005707.jpg +00005708.jpg +00005709.jpg +00005710.jpg +00005711.jpg +00005712.jpg +00005713.jpg +00005714.jpg +00005715.jpg +00005716.jpg +00005717.jpg +00005718.jpg +00005719.jpg +00005720.jpg +00005721.jpg +00005722.jpg +00005723.jpg +00005724.jpg +00005725.jpg +00005726.jpg +00005727.jpg +00005728.jpg +00005729.jpg +00005730.jpg +00005731.jpg +00005732.jpg +00005733.jpg +00005734.jpg +00005735.jpg +00005736.jpg +00005737.jpg +00005738.jpg +00005739.jpg +00005740.jpg +00005741.jpg +00005742.jpg +00005743.jpg +00005744.jpg +00005745.jpg +00005746.jpg +00005747.jpg +00005748.jpg +00005749.jpg +00005750.jpg +00005751.jpg +00005752.jpg +00005753.jpg +00005754.jpg +00005755.jpg +00005756.jpg +00005757.jpg +00005758.jpg +00005759.jpg +00005760.jpg +00005761.jpg +00005762.jpg +00005763.jpg +00005764.jpg +00005765.jpg +00005766.jpg +00005767.jpg +00005768.jpg +00005769.jpg +00005770.jpg +00005771.jpg +00005772.jpg +00005773.jpg +00005774.jpg +00005775.jpg +00005776.jpg +00005777.jpg +00005778.jpg +00005779.jpg +00005780.jpg +00005781.jpg +00005782.jpg +00005783.jpg +00005784.jpg +00005785.jpg +00005786.jpg +00005787.jpg +00005788.jpg +00005789.jpg +00005790.jpg +00005791.jpg +00005792.jpg +00005793.jpg +00005794.jpg +00005795.jpg +00005796.jpg +00005797.jpg +00005798.jpg +00005799.jpg +00005800.jpg +00005801.jpg +00005802.jpg +00005803.jpg +00005804.jpg +00005805.jpg +00005806.jpg +00005807.jpg +00005808.jpg +00005809.jpg +00005810.jpg +00005811.jpg +00005812.jpg +00005813.jpg +00005814.jpg +00005815.jpg +00005816.jpg +00005817.jpg +00005818.jpg +00005819.jpg +00005820.jpg +00005821.jpg +00005822.jpg +00005823.jpg +00005824.jpg +00005825.jpg +00005826.jpg +00005827.jpg +00005828.jpg +00005829.jpg +00005830.jpg +00005831.jpg +00005832.jpg +00005833.jpg +00005834.jpg +00005835.jpg +00005836.jpg +00005837.jpg +00005838.jpg +00005839.jpg +00005840.jpg +00005841.jpg +00005842.jpg +00005843.jpg +00005844.jpg +00005845.jpg +00005846.jpg +00005847.jpg +00005848.jpg +00005849.jpg +00005850.jpg +00005851.jpg +00005852.jpg +00005853.jpg +00005854.jpg +00005855.jpg +00005856.jpg +00005857.jpg +00005858.jpg +00005859.jpg +00005860.jpg +00005861.jpg +00005862.jpg +00005863.jpg +00005864.jpg +00005865.jpg +00005866.jpg +00005867.jpg +00005868.jpg +00005869.jpg +00005870.jpg +00005871.jpg +00005872.jpg +00005873.jpg +00005874.jpg +00005875.jpg +00005876.jpg +00005877.jpg +00005878.jpg +00005879.jpg +00005880.jpg +00005881.jpg +00005882.jpg +00005883.jpg +00005884.jpg +00005885.jpg +00005886.jpg +00005887.jpg +00005888.jpg +00005889.jpg +00005890.jpg +00005891.jpg +00005892.jpg +00005893.jpg +00005894.jpg +00005895.jpg +00005896.jpg +00005897.jpg +00005898.jpg +00005899.jpg +00005900.jpg +00005901.jpg +00005902.jpg +00005903.jpg +00005904.jpg +00005905.jpg +00005906.jpg +00005907.jpg +00005908.jpg +00005909.jpg +00005910.jpg +00005911.jpg +00005912.jpg +00005913.jpg +00005914.jpg +00005915.jpg +00005916.jpg +00005917.jpg +00005918.jpg +00005919.jpg +00005920.jpg +00005921.jpg +00005922.jpg +00005923.jpg +00005924.jpg +00005925.jpg +00005926.jpg +00005927.jpg +00005928.jpg +00005929.jpg +00005930.jpg +00005931.jpg +00005932.jpg +00005933.jpg +00005934.jpg +00005935.jpg +00005936.jpg +00005937.jpg +00005938.jpg +00005939.jpg +00005940.jpg +00005941.jpg +00005942.jpg +00005943.jpg +00005944.jpg +00005945.jpg +00005946.jpg +00005947.jpg +00005948.jpg +00005949.jpg +00005950.jpg +00005951.jpg +00005952.jpg +00005953.jpg +00005954.jpg +00005955.jpg +00005956.jpg +00005957.jpg +00005958.jpg +00005959.jpg +00005960.jpg +00005961.jpg +00005962.jpg +00005963.jpg +00005964.jpg +00005965.jpg +00005966.jpg +00005967.jpg +00005968.jpg +00005969.jpg +00005970.jpg +00005971.jpg +00005972.jpg +00005973.jpg +00005974.jpg +00005975.jpg +00005976.jpg +00005977.jpg +00005978.jpg +00005979.jpg +00005980.jpg +00005981.jpg +00005982.jpg +00005983.jpg +00005984.jpg +00005985.jpg +00005986.jpg +00005987.jpg +00005988.jpg +00005989.jpg +00005990.jpg +00005991.jpg +00005992.jpg +00005993.jpg +00005994.jpg +00005995.jpg +00005996.jpg +00005997.jpg +00005998.jpg +00005999.jpg +00006000.jpg +00006001.jpg +00006002.jpg +00006003.jpg +00006004.jpg +00006005.jpg +00006006.jpg +00006007.jpg +00006008.jpg +00006009.jpg +00006010.jpg +00006011.jpg +00006012.jpg +00006013.jpg +00006014.jpg +00006015.jpg +00006016.jpg +00006017.jpg +00006018.jpg +00006019.jpg +00006020.jpg +00006021.jpg +00006022.jpg +00006023.jpg +00006024.jpg +00006025.jpg +00006026.jpg +00006027.jpg +00006028.jpg +00006029.jpg +00006030.jpg +00006031.jpg +00006032.jpg +00006033.jpg +00006034.jpg +00006035.jpg +00006036.jpg +00006037.jpg +00006038.jpg +00006039.jpg +00006040.jpg +00006041.jpg +00006042.jpg +00006043.jpg +00006044.jpg +00006045.jpg +00006046.jpg +00006047.jpg +00006048.jpg +00006049.jpg +00006050.jpg +00006051.jpg +00006052.jpg +00006053.jpg +00006054.jpg +00006055.jpg +00006056.jpg +00006057.jpg +00006058.jpg +00006059.jpg +00006060.jpg +00006061.jpg +00006062.jpg +00006063.jpg +00006064.jpg +00006065.jpg +00006066.jpg +00006067.jpg +00006068.jpg +00006069.jpg +00006070.jpg +00006071.jpg +00006072.jpg +00006073.jpg +00006074.jpg +00006075.jpg +00006076.jpg +00006077.jpg +00006078.jpg +00006079.jpg +00006080.jpg +00006081.jpg +00006082.jpg +00006083.jpg +00006084.jpg +00006085.jpg +00006086.jpg +00006087.jpg +00006088.jpg +00006089.jpg +00006090.jpg +00006091.jpg +00006092.jpg +00006093.jpg +00006094.jpg +00006095.jpg +00006096.jpg +00006097.jpg +00006098.jpg +00006099.jpg +00006100.jpg +00006101.jpg +00006102.jpg +00006103.jpg +00006104.jpg +00006105.jpg +00006106.jpg +00006107.jpg +00006108.jpg +00006109.jpg +00006110.jpg +00006111.jpg +00006112.jpg +00006113.jpg +00006114.jpg +00006115.jpg +00006116.jpg +00006117.jpg +00006118.jpg +00006119.jpg +00006120.jpg +00006121.jpg +00006122.jpg +00006123.jpg +00006124.jpg +00006125.jpg +00006126.jpg +00006127.jpg +00006128.jpg +00006129.jpg +00006130.jpg +00006131.jpg +00006132.jpg +00006133.jpg +00006134.jpg +00006135.jpg +00006136.jpg +00006137.jpg +00006138.jpg +00006139.jpg +00006140.jpg +00006141.jpg +00006142.jpg +00006143.jpg +00006144.jpg +00006145.jpg +00006146.jpg +00006147.jpg +00006148.jpg +00006149.jpg +00006150.jpg +00006151.jpg +00006152.jpg +00006153.jpg +00006154.jpg +00006155.jpg +00006156.jpg +00006157.jpg +00006158.jpg +00006159.jpg +00006160.jpg +00006161.jpg +00006162.jpg +00006163.jpg +00006164.jpg +00006165.jpg +00006166.jpg +00006167.jpg +00006168.jpg +00006169.jpg +00006170.jpg +00006171.jpg +00006172.jpg +00006173.jpg +00006174.jpg +00006175.jpg +00006176.jpg +00006177.jpg +00006178.jpg +00006179.jpg +00006180.jpg +00006181.jpg +00006182.jpg +00006183.jpg +00006184.jpg +00006185.jpg +00006186.jpg +00006187.jpg +00006188.jpg +00006189.jpg +00006190.jpg +00006191.jpg +00006192.jpg +00006193.jpg +00006194.jpg +00006195.jpg +00006196.jpg +00006197.jpg +00006198.jpg +00006199.jpg +00006200.jpg +00006201.jpg +00006202.jpg +00006203.jpg +00006204.jpg +00006205.jpg +00006206.jpg +00006207.jpg +00006208.jpg +00006209.jpg +00006210.jpg +00006211.jpg +00006212.jpg +00006213.jpg +00006214.jpg +00006215.jpg +00006216.jpg +00006217.jpg +00006218.jpg +00006219.jpg +00006220.jpg +00006221.jpg +00006222.jpg +00006223.jpg +00006224.jpg +00006225.jpg +00006226.jpg +00006227.jpg +00006228.jpg +00006229.jpg +00006230.jpg +00006231.jpg +00006232.jpg +00006233.jpg +00006234.jpg +00006235.jpg +00006236.jpg +00006237.jpg +00006238.jpg +00006239.jpg +00006240.jpg +00006241.jpg +00006242.jpg +00006243.jpg +00006244.jpg +00006245.jpg +00006246.jpg +00006247.jpg +00006248.jpg +00006249.jpg +00006250.jpg +00006251.jpg +00006252.jpg +00006253.jpg +00006254.jpg +00006255.jpg +00006256.jpg +00006257.jpg +00006258.jpg +00006259.jpg +00006260.jpg +00006261.jpg +00006262.jpg +00006263.jpg +00006264.jpg +00006265.jpg +00006266.jpg +00006267.jpg +00006268.jpg +00006269.jpg +00006270.jpg +00006271.jpg +00006272.jpg +00006273.jpg +00006274.jpg +00006275.jpg +00006276.jpg +00006277.jpg +00006278.jpg +00006279.jpg +00006280.jpg +00006867.jpg +00006868.jpg +00006869.jpg +00006870.jpg +00006871.jpg +00006872.jpg +00006873.jpg +00006874.jpg +00006875.jpg +00006876.jpg +00006877.jpg +00006878.jpg +00006879.jpg +00006880.jpg +00006881.jpg +00006882.jpg +00006883.jpg +00006884.jpg +00006885.jpg +00006886.jpg +00006887.jpg +00006888.jpg +00006889.jpg +00006890.jpg +00006891.jpg +00006892.jpg +00006893.jpg +00006894.jpg +00006895.jpg +00006896.jpg +00006897.jpg +00006898.jpg +00006899.jpg +00006900.jpg +00006901.jpg +00006902.jpg +00006903.jpg +00006904.jpg +00006905.jpg +00006906.jpg +00006907.jpg +00006908.jpg +00006909.jpg +00006910.jpg +00006911.jpg +00006912.jpg +00006913.jpg +00006914.jpg +00006915.jpg +00006916.jpg +00006917.jpg +00006918.jpg +00006919.jpg +00006920.jpg +00006921.jpg +00006922.jpg +00006923.jpg +00006924.jpg +00006925.jpg +00006926.jpg +00006927.jpg +00006928.jpg +00006929.jpg +00006930.jpg +00006931.jpg +00006932.jpg +00006933.jpg +00006934.jpg +00006935.jpg +00006936.jpg +00006937.jpg +00006938.jpg +00006939.jpg +00006940.jpg +00006941.jpg +00006942.jpg +00006943.jpg +00006944.jpg +00006945.jpg +00006946.jpg +00006947.jpg +00006948.jpg +00006949.jpg +00006950.jpg +00006951.jpg +00006952.jpg +00006953.jpg +00006954.jpg +00006955.jpg +00006956.jpg +00006957.jpg +00006958.jpg +00006959.jpg +00006960.jpg +00006961.jpg +00006962.jpg +00006963.jpg +00006964.jpg +00006965.jpg +00006966.jpg +00006967.jpg +00006968.jpg +00006969.jpg +00006970.jpg +00006971.jpg +00006972.jpg +00006973.jpg +00006974.jpg +00006975.jpg +00006976.jpg +00006977.jpg +00006978.jpg +00006979.jpg +00006980.jpg +00006981.jpg +00006982.jpg +00006983.jpg +00006984.jpg +00006985.jpg +00006986.jpg +00006987.jpg +00006988.jpg +00006989.jpg +00006990.jpg +00006991.jpg +00006992.jpg +00006993.jpg +00006994.jpg +00006995.jpg +00006996.jpg +00006997.jpg +00006998.jpg +00006999.jpg +00007000.jpg +00007001.jpg +00007002.jpg +00007003.jpg +00007004.jpg +00007005.jpg +00007006.jpg +00007007.jpg +00007008.jpg +00007009.jpg +00007010.jpg +00007011.jpg +00007012.jpg +00007013.jpg +00007014.jpg +00007015.jpg +00007016.jpg +00007017.jpg +00007018.jpg +00007019.jpg +00007020.jpg +00007021.jpg +00007022.jpg +00007023.jpg +00007024.jpg +00007025.jpg +00007026.jpg +00007027.jpg +00007028.jpg +00007029.jpg +00007030.jpg +00007031.jpg +00007032.jpg +00007033.jpg +00007034.jpg +00007035.jpg +00007036.jpg +00007037.jpg +00007038.jpg +00007039.jpg +00007040.jpg +00007041.jpg +00007042.jpg +00007043.jpg +00007044.jpg +00007045.jpg +00007046.jpg +00007047.jpg +00007048.jpg +00007049.jpg +00007050.jpg +00007051.jpg +00007052.jpg +00007053.jpg +00007054.jpg +00007055.jpg +00007056.jpg +00007057.jpg +00007058.jpg +00007059.jpg +00007060.jpg +00007061.jpg +00007062.jpg +00007063.jpg +00007064.jpg +00007065.jpg +00007066.jpg +00007067.jpg +00007068.jpg +00007069.jpg +00007070.jpg +00007071.jpg +00007072.jpg +00007073.jpg +00007074.jpg +00007075.jpg +00007076.jpg +00007077.jpg +00007078.jpg +00007079.jpg +00007080.jpg +00007081.jpg +00007082.jpg +00007083.jpg +00007084.jpg +00007085.jpg +00007086.jpg +00007087.jpg +00007088.jpg +00007089.jpg +00007090.jpg +00007091.jpg +00007092.jpg +00007093.jpg +00007094.jpg +00007095.jpg +00007096.jpg +00007097.jpg +00007098.jpg +00007099.jpg +00007100.jpg +00007101.jpg +00007102.jpg +00007103.jpg +00007104.jpg +00007105.jpg +00007106.jpg +00007107.jpg +00007108.jpg +00007109.jpg +00007110.jpg +00007111.jpg +00007112.jpg +00007113.jpg +00007114.jpg +00007115.jpg +00007116.jpg +00007117.jpg diff --git a/FoodSeg103/data/FoodSeg103/ImageSets/train.txt b/FoodSeg103/data/FoodSeg103/ImageSets/train.txt new file mode 100644 index 0000000000000000000000000000000000000000..bacb5ed60738d904a64751159860c5d16018a346 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/ImageSets/train.txt @@ -0,0 +1,4983 @@ +00000000.jpg +00000001.jpg +00000002.jpg +00000003.jpg +00000004.jpg +00000005.jpg +00000006.jpg +00000007.jpg +00000008.jpg +00000009.jpg +00000010.jpg +00000011.jpg +00000012.jpg +00000013.jpg +00000014.jpg +00000015.jpg +00000016.jpg +00000017.jpg +00000018.jpg +00000019.jpg +00000020.jpg +00000021.jpg +00000022.jpg +00000023.jpg +00000024.jpg +00000025.jpg +00000026.jpg +00000027.jpg +00000028.jpg +00000029.jpg +00000030.jpg +00000031.jpg +00000032.jpg +00000033.jpg +00000034.jpg +00000035.jpg +00000036.jpg +00000037.jpg +00000038.jpg +00000039.jpg +00000040.jpg +00000041.jpg +00000042.jpg +00000043.jpg +00000044.jpg +00000045.jpg +00000046.jpg +00000047.jpg +00000049.jpg +00000050.jpg +00000051.jpg +00000052.jpg +00000053.jpg +00000054.jpg +00000055.jpg +00000056.jpg +00000057.jpg +00000058.jpg +00000059.jpg +00000060.jpg +00000061.jpg +00000062.jpg +00000063.jpg +00000064.jpg +00000065.jpg +00000066.jpg +00000067.jpg +00000068.jpg +00000069.jpg +00000070.jpg +00000071.jpg +00000072.jpg +00000073.jpg +00000074.jpg +00000075.jpg +00000076.jpg +00000077.jpg +00000078.jpg +00000079.jpg +00000080.jpg +00000081.jpg +00000082.jpg +00000083.jpg +00000084.jpg +00000085.jpg +00000086.jpg +00000087.jpg +00000088.jpg +00000089.jpg +00000090.jpg +00000091.jpg +00000092.jpg +00000093.jpg +00000094.jpg +00000095.jpg +00000096.jpg +00000097.jpg +00000098.jpg +00000099.jpg +00000100.jpg +00000101.jpg +00000102.jpg +00000103.jpg +00000104.jpg +00000105.jpg +00000106.jpg +00000107.jpg +00000108.jpg +00000109.jpg +00000110.jpg +00000111.jpg +00000112.jpg +00000113.jpg +00000114.jpg +00000115.jpg +00000116.jpg +00000117.jpg +00000118.jpg +00000119.jpg +00000120.jpg +00000121.jpg +00000122.jpg +00000123.jpg +00000124.jpg +00000125.jpg +00000126.jpg +00000127.jpg +00000128.jpg +00000129.jpg +00000130.jpg +00000131.jpg +00000132.jpg +00000133.jpg +00000134.jpg +00000135.jpg +00000136.jpg +00000137.jpg +00000138.jpg +00000139.jpg +00000140.jpg +00000141.jpg +00000142.jpg +00000143.jpg +00000144.jpg +00000145.jpg +00000146.jpg +00000147.jpg +00000148.jpg +00000149.jpg +00000150.jpg +00000151.jpg +00000152.jpg +00000153.jpg +00000154.jpg +00000155.jpg +00000156.jpg +00000157.jpg +00000158.jpg +00000159.jpg +00000160.jpg +00000161.jpg +00000162.jpg +00000163.jpg +00000164.jpg +00000165.jpg +00000166.jpg +00000167.jpg +00000168.jpg +00000169.jpg +00000170.jpg +00000171.jpg +00000172.jpg +00000173.jpg +00000174.jpg +00000175.jpg +00000176.jpg +00000177.jpg +00000178.jpg +00000179.jpg +00000180.jpg +00000181.jpg +00000182.jpg +00000183.jpg +00000184.jpg +00000185.jpg +00000186.jpg +00000187.jpg +00000188.jpg +00000189.jpg +00000190.jpg +00000191.jpg +00000192.jpg +00000193.jpg +00000194.jpg +00000195.jpg +00000196.jpg +00000197.jpg +00000198.jpg +00000199.jpg +00000200.jpg +00000201.jpg +00000202.jpg +00000203.jpg +00000204.jpg +00000205.jpg +00000206.jpg +00000207.jpg +00000208.jpg +00000209.jpg +00000210.jpg +00000211.jpg +00000212.jpg +00000213.jpg +00000214.jpg +00000215.jpg +00000216.jpg +00000217.jpg +00000218.jpg +00000219.jpg +00000220.jpg +00000221.jpg +00000222.jpg +00000223.jpg +00000224.jpg +00000225.jpg +00000226.jpg +00000227.jpg +00000228.jpg +00000229.jpg +00000230.jpg +00000231.jpg +00000232.jpg +00000233.jpg +00000234.jpg +00000235.jpg +00000236.jpg +00000237.jpg +00000238.jpg +00000239.jpg +00000240.jpg +00000241.jpg +00000242.jpg +00000243.jpg +00000244.jpg +00000245.jpg +00000246.jpg +00000247.jpg +00000248.jpg +00000249.jpg +00000250.jpg +00000251.jpg +00000252.jpg +00000253.jpg +00000254.jpg +00000255.jpg +00000256.jpg +00000257.jpg +00000258.jpg +00000259.jpg +00000260.jpg +00000261.jpg +00000262.jpg +00000264.jpg +00000265.jpg +00000266.jpg +00000267.jpg +00000268.jpg +00000269.jpg +00000270.jpg +00000271.jpg +00000272.jpg +00000273.jpg +00000274.jpg +00000275.jpg +00000276.jpg +00000277.jpg +00000278.jpg +00000279.jpg +00000280.jpg +00000281.jpg +00000282.jpg +00000283.jpg +00000284.jpg +00000285.jpg +00000286.jpg +00000287.jpg +00000288.jpg +00000289.jpg +00000290.jpg +00000291.jpg +00000292.jpg +00000293.jpg +00000294.jpg +00000295.jpg +00000296.jpg +00000297.jpg +00000298.jpg +00000299.jpg +00000300.jpg +00000301.jpg +00000302.jpg +00000303.jpg +00000304.jpg +00000305.jpg +00000306.jpg +00000307.jpg +00000308.jpg +00000309.jpg +00000310.jpg +00000311.jpg +00000312.jpg +00000313.jpg +00000314.jpg +00000315.jpg +00000316.jpg +00000317.jpg +00000318.jpg +00000319.jpg +00000320.jpg +00000321.jpg +00000322.jpg +00000323.jpg +00000324.jpg +00000325.jpg +00000326.jpg +00000327.jpg +00000328.jpg +00000329.jpg +00000330.jpg +00000331.jpg +00000332.jpg +00000333.jpg +00000334.jpg +00000335.jpg +00000336.jpg +00000337.jpg +00000338.jpg +00000339.jpg +00000340.jpg +00000341.jpg +00000342.jpg +00000343.jpg +00000344.jpg +00000345.jpg +00000346.jpg +00000347.jpg +00000348.jpg +00000349.jpg +00000350.jpg +00000351.jpg +00000352.jpg +00000353.jpg +00000354.jpg +00000355.jpg +00000356.jpg +00000357.jpg +00000358.jpg +00000359.jpg +00000360.jpg +00000361.jpg +00000362.jpg +00000363.jpg +00000364.jpg +00000365.jpg +00000366.jpg +00000367.jpg +00000368.jpg +00000369.jpg +00000370.jpg +00000371.jpg +00000372.jpg +00000373.jpg +00000374.jpg +00000375.jpg +00000376.jpg +00000377.jpg +00000378.jpg +00000379.jpg +00000380.jpg +00000381.jpg +00000382.jpg +00000383.jpg +00000384.jpg +00000385.jpg +00000386.jpg +00000387.jpg +00000388.jpg +00000389.jpg +00000390.jpg +00000391.jpg +00000392.jpg +00000393.jpg +00000394.jpg +00000395.jpg +00000396.jpg +00000397.jpg +00000398.jpg +00000399.jpg +00000400.jpg +00000401.jpg +00000402.jpg +00000403.jpg +00000404.jpg +00000405.jpg +00000406.jpg +00000407.jpg +00000408.jpg +00000409.jpg +00000410.jpg +00000411.jpg +00000412.jpg +00000413.jpg +00000414.jpg +00000415.jpg +00000416.jpg +00000417.jpg +00000418.jpg +00000419.jpg +00000420.jpg +00000421.jpg +00000422.jpg +00000423.jpg +00000424.jpg +00000425.jpg +00000426.jpg +00000427.jpg +00000428.jpg +00000429.jpg +00000430.jpg +00000431.jpg +00000432.jpg +00000433.jpg +00000434.jpg +00000435.jpg +00000436.jpg +00000437.jpg +00000438.jpg +00000439.jpg +00000440.jpg +00000441.jpg +00000442.jpg +00000443.jpg +00000444.jpg +00000445.jpg +00000446.jpg +00000447.jpg +00000448.jpg +00000449.jpg +00000450.jpg +00000451.jpg +00000452.jpg +00000453.jpg +00000454.jpg +00000455.jpg +00000456.jpg +00000457.jpg +00000458.jpg +00000459.jpg +00000460.jpg +00000461.jpg +00000462.jpg +00000463.jpg +00000464.jpg +00000465.jpg +00000466.jpg +00000467.jpg +00000468.jpg +00000469.jpg +00000470.jpg +00000471.jpg +00000472.jpg +00000473.jpg +00000474.jpg +00000475.jpg +00000476.jpg +00000477.jpg +00000478.jpg +00000479.jpg +00000480.jpg +00000481.jpg +00000482.jpg +00000483.jpg +00000484.jpg +00000485.jpg +00000486.jpg +00000487.jpg +00000488.jpg +00000489.jpg +00000490.jpg +00000491.jpg +00000492.jpg +00000493.jpg +00000494.jpg +00000495.jpg +00000496.jpg +00000497.jpg +00000498.jpg +00000499.jpg +00000500.jpg +00000501.jpg +00000502.jpg +00000503.jpg +00000504.jpg +00000505.jpg +00000506.jpg +00000507.jpg +00000508.jpg +00000509.jpg +00000510.jpg +00000511.jpg +00000512.jpg +00000513.jpg +00000514.jpg +00000515.jpg +00000516.jpg +00000517.jpg +00000518.jpg +00000519.jpg +00000520.jpg +00000521.jpg +00000522.jpg +00000523.jpg +00000524.jpg +00000525.jpg +00000526.jpg +00000527.jpg +00000528.jpg +00000529.jpg +00000530.jpg +00000531.jpg +00000532.jpg +00000533.jpg +00000534.jpg +00000535.jpg +00000536.jpg +00000537.jpg +00000538.jpg +00000539.jpg +00000540.jpg +00000541.jpg +00000542.jpg +00000543.jpg +00000544.jpg +00000545.jpg +00000546.jpg +00000547.jpg +00000548.jpg +00000549.jpg +00000550.jpg +00000551.jpg +00000552.jpg +00000553.jpg +00000554.jpg +00000555.jpg +00000556.jpg +00000557.jpg +00000558.jpg +00000559.jpg +00000560.jpg +00000561.jpg +00000562.jpg +00000563.jpg +00000564.jpg +00000565.jpg +00000566.jpg +00000567.jpg +00000568.jpg +00000569.jpg +00000570.jpg +00000571.jpg +00000572.jpg +00000573.jpg +00000574.jpg +00000575.jpg +00000576.jpg +00000577.jpg +00000578.jpg +00000579.jpg +00000580.jpg +00000581.jpg +00000582.jpg +00000583.jpg +00000584.jpg +00000585.jpg +00000586.jpg +00000587.jpg +00000588.jpg +00000589.jpg +00000590.jpg +00000591.jpg +00000592.jpg +00000593.jpg +00000594.jpg +00000595.jpg +00000596.jpg +00000597.jpg +00000598.jpg +00000599.jpg +00000600.jpg +00000601.jpg +00000602.jpg +00000603.jpg +00000604.jpg +00000605.jpg +00000606.jpg +00000607.jpg +00000608.jpg +00000609.jpg +00000610.jpg +00000611.jpg +00000612.jpg +00000613.jpg +00000614.jpg +00000615.jpg +00000616.jpg +00000617.jpg +00000618.jpg +00000619.jpg +00000620.jpg +00000621.jpg +00000622.jpg +00000623.jpg +00000624.jpg +00000625.jpg +00000626.jpg +00000627.jpg +00000628.jpg +00000629.jpg +00000630.jpg +00000631.jpg +00000632.jpg +00000633.jpg +00000634.jpg +00000635.jpg +00000636.jpg +00000637.jpg +00000638.jpg +00000639.jpg +00000640.jpg +00000641.jpg +00000642.jpg +00000643.jpg +00000644.jpg +00000645.jpg +00000646.jpg +00000647.jpg +00000648.jpg +00000649.jpg +00000650.jpg +00000651.jpg +00000652.jpg +00000653.jpg +00000654.jpg +00000655.jpg +00000656.jpg +00000657.jpg +00000658.jpg +00000659.jpg +00000660.jpg +00000661.jpg +00000662.jpg +00000663.jpg +00000664.jpg +00000665.jpg +00000666.jpg +00000667.jpg +00000668.jpg +00000669.jpg +00000670.jpg +00000671.jpg +00000672.jpg +00000673.jpg +00000674.jpg +00000675.jpg +00000676.jpg +00000677.jpg +00000678.jpg +00000679.jpg +00000680.jpg +00000681.jpg +00000682.jpg +00000683.jpg +00000684.jpg +00000685.jpg +00000686.jpg +00000687.jpg +00000688.jpg +00000689.jpg +00000690.jpg +00000691.jpg +00000692.jpg +00000693.jpg +00000694.jpg +00000695.jpg +00000696.jpg +00000697.jpg +00000698.jpg +00000699.jpg +00000700.jpg +00000701.jpg +00000702.jpg +00000703.jpg +00000704.jpg +00000705.jpg +00000706.jpg +00000707.jpg +00000708.jpg +00000709.jpg +00000710.jpg +00000711.jpg +00000712.jpg +00000713.jpg +00000714.jpg +00000715.jpg +00000716.jpg +00000717.jpg +00000718.jpg +00000719.jpg +00000720.jpg +00000721.jpg +00000722.jpg +00000723.jpg +00000724.jpg +00000725.jpg +00000726.jpg +00000727.jpg +00000728.jpg +00000729.jpg +00000730.jpg +00000731.jpg +00000732.jpg +00000733.jpg +00000734.jpg +00000735.jpg +00000736.jpg +00000737.jpg +00000738.jpg +00000739.jpg +00000740.jpg +00000741.jpg +00000742.jpg +00000743.jpg +00000744.jpg +00000745.jpg +00000746.jpg +00000747.jpg +00000748.jpg +00000749.jpg +00000750.jpg +00000751.jpg +00000752.jpg +00000753.jpg +00000754.jpg +00000755.jpg +00000756.jpg +00000757.jpg +00000758.jpg +00000759.jpg +00000760.jpg +00000761.jpg +00000762.jpg +00000763.jpg +00000764.jpg +00000765.jpg +00000766.jpg +00000767.jpg +00000768.jpg +00000769.jpg +00000770.jpg +00000771.jpg +00000772.jpg +00000773.jpg +00000774.jpg +00000775.jpg +00000776.jpg +00000777.jpg +00000778.jpg +00000779.jpg +00000780.jpg +00000781.jpg +00000782.jpg +00000783.jpg +00000784.jpg +00000785.jpg +00000786.jpg +00000787.jpg +00000788.jpg +00000789.jpg +00000790.jpg +00000791.jpg +00000792.jpg +00000793.jpg +00000794.jpg +00000795.jpg +00000796.jpg +00000797.jpg +00000798.jpg +00000799.jpg +00000800.jpg +00000801.jpg +00000802.jpg +00000803.jpg +00000804.jpg +00000805.jpg +00000806.jpg +00000807.jpg +00000808.jpg +00000809.jpg +00000810.jpg +00000811.jpg +00000812.jpg +00000813.jpg +00000814.jpg +00000815.jpg +00000816.jpg +00000817.jpg +00000818.jpg +00000819.jpg +00000820.jpg +00000821.jpg +00000822.jpg +00000823.jpg +00000824.jpg +00000825.jpg +00000826.jpg +00000827.jpg +00000828.jpg +00000829.jpg +00000830.jpg +00000831.jpg +00000832.jpg +00000833.jpg +00000834.jpg +00000835.jpg +00000836.jpg +00000837.jpg +00000838.jpg +00000839.jpg +00000840.jpg +00000841.jpg +00000842.jpg +00000843.jpg +00000844.jpg +00000845.jpg +00000846.jpg +00000847.jpg +00000848.jpg +00000849.jpg +00000850.jpg +00000851.jpg +00000852.jpg +00000853.jpg +00000854.jpg +00000855.jpg +00000856.jpg +00000857.jpg +00000858.jpg +00000859.jpg +00000860.jpg +00000861.jpg +00000862.jpg +00000863.jpg +00000864.jpg +00000865.jpg +00000866.jpg +00000867.jpg +00000868.jpg +00000869.jpg +00000870.jpg +00000871.jpg +00000872.jpg +00000873.jpg +00000874.jpg +00000875.jpg +00000876.jpg +00000877.jpg +00000878.jpg +00000879.jpg +00000880.jpg +00000881.jpg +00000882.jpg +00000883.jpg +00000884.jpg +00000885.jpg +00000886.jpg +00000887.jpg +00000888.jpg +00000889.jpg +00000890.jpg +00000891.jpg +00000892.jpg +00000893.jpg +00000894.jpg +00000895.jpg +00000896.jpg +00000897.jpg +00000898.jpg +00000899.jpg +00000900.jpg +00000901.jpg +00000902.jpg +00000903.jpg +00000904.jpg +00000905.jpg +00000906.jpg +00000907.jpg +00000908.jpg +00000909.jpg +00000910.jpg +00000911.jpg +00000912.jpg +00000913.jpg +00000914.jpg +00000915.jpg +00000916.jpg +00000917.jpg +00000918.jpg +00000919.jpg +00000920.jpg +00000921.jpg +00000922.jpg +00000923.jpg +00000924.jpg +00000925.jpg +00000926.jpg +00000927.jpg +00000928.jpg +00000929.jpg +00000930.jpg +00000931.jpg +00000932.jpg +00000933.jpg +00000934.jpg +00000935.jpg +00000936.jpg +00000937.jpg +00000938.jpg +00000939.jpg +00000940.jpg +00000941.jpg +00000942.jpg +00000943.jpg +00000944.jpg +00000945.jpg +00000946.jpg +00000947.jpg +00000948.jpg +00000949.jpg +00000950.jpg +00000951.jpg +00000952.jpg +00000953.jpg +00000954.jpg +00000955.jpg +00000956.jpg +00000957.jpg +00000958.jpg +00000959.jpg +00000960.jpg +00000961.jpg +00000962.jpg +00000963.jpg +00000964.jpg +00000965.jpg +00000966.jpg +00000967.jpg +00000968.jpg +00000969.jpg +00000970.jpg +00000971.jpg +00000972.jpg +00000973.jpg +00000974.jpg +00000975.jpg +00000976.jpg +00000977.jpg +00000978.jpg +00000979.jpg +00000980.jpg +00000981.jpg +00000982.jpg +00000983.jpg +00000984.jpg +00000985.jpg +00000986.jpg +00000987.jpg +00000988.jpg +00000989.jpg +00000990.jpg +00000991.jpg +00000992.jpg +00000993.jpg +00000994.jpg +00000995.jpg +00000996.jpg +00000997.jpg +00000998.jpg +00000999.jpg +00001000.jpg +00001001.jpg +00001002.jpg +00001003.jpg +00001004.jpg +00001005.jpg +00001006.jpg +00001007.jpg +00001008.jpg +00001009.jpg +00001010.jpg +00001011.jpg +00001012.jpg +00001013.jpg +00001014.jpg +00001015.jpg +00001016.jpg +00001017.jpg +00001018.jpg +00001019.jpg +00001020.jpg +00001021.jpg +00001022.jpg +00001023.jpg +00001024.jpg +00001025.jpg +00001026.jpg +00001027.jpg +00001028.jpg +00001029.jpg +00001030.jpg +00001031.jpg +00001032.jpg +00001033.jpg +00001034.jpg +00001035.jpg +00001036.jpg +00001037.jpg +00001038.jpg +00001039.jpg +00001040.jpg +00001041.jpg +00001042.jpg +00001043.jpg +00001044.jpg +00001045.jpg +00001046.jpg +00001047.jpg +00001048.jpg +00001049.jpg +00001050.jpg +00001051.jpg +00001052.jpg +00001053.jpg +00001054.jpg +00001055.jpg +00001056.jpg +00001057.jpg +00001058.jpg +00001059.jpg +00001060.jpg +00001061.jpg +00001062.jpg +00001063.jpg +00001064.jpg +00001065.jpg +00001066.jpg +00001067.jpg +00001068.jpg +00001069.jpg +00001070.jpg +00001071.jpg +00001072.jpg +00001073.jpg +00001074.jpg +00001075.jpg +00001076.jpg +00001077.jpg +00001078.jpg +00001079.jpg +00001080.jpg +00001081.jpg +00001082.jpg +00001083.jpg +00001084.jpg +00001085.jpg +00001086.jpg +00001087.jpg +00001088.jpg +00001089.jpg +00001090.jpg +00001091.jpg +00001092.jpg +00001093.jpg +00001094.jpg +00001095.jpg +00001096.jpg +00001097.jpg +00001098.jpg +00001099.jpg +00001100.jpg +00001101.jpg +00001102.jpg +00001103.jpg +00001104.jpg +00001105.jpg +00001106.jpg +00001107.jpg +00001108.jpg +00001109.jpg +00001110.jpg +00001111.jpg +00001112.jpg +00001113.jpg +00001114.jpg +00001115.jpg +00001116.jpg +00001117.jpg +00001118.jpg +00001119.jpg +00001120.jpg +00001121.jpg +00001122.jpg +00001123.jpg +00001124.jpg +00001125.jpg +00001126.jpg +00001127.jpg +00001128.jpg +00001129.jpg +00001130.jpg +00001131.jpg +00001132.jpg +00001133.jpg +00001134.jpg +00001135.jpg +00001136.jpg +00001137.jpg +00001138.jpg +00001139.jpg +00001140.jpg +00001141.jpg +00001142.jpg +00001143.jpg +00001144.jpg +00001145.jpg +00001146.jpg +00001147.jpg +00001148.jpg +00001149.jpg +00001150.jpg +00001151.jpg +00001152.jpg +00001153.jpg +00001154.jpg +00001155.jpg +00001156.jpg +00001157.jpg +00001158.jpg +00001159.jpg +00001160.jpg +00001161.jpg +00001162.jpg +00001163.jpg +00001164.jpg +00001165.jpg +00001166.jpg +00001167.jpg +00001168.jpg +00001169.jpg +00001170.jpg +00001171.jpg +00001172.jpg +00001173.jpg +00001174.jpg +00001175.jpg +00001176.jpg +00001177.jpg +00001178.jpg +00001179.jpg +00001180.jpg +00001181.jpg +00001182.jpg +00001183.jpg +00001184.jpg +00001185.jpg +00001186.jpg +00001187.jpg +00001188.jpg +00001189.jpg +00001190.jpg +00001191.jpg +00001192.jpg +00001193.jpg +00001194.jpg +00001195.jpg +00001196.jpg +00001197.jpg +00001198.jpg +00001199.jpg +00001200.jpg +00001201.jpg +00001202.jpg +00001203.jpg +00001204.jpg +00001205.jpg +00001206.jpg +00001207.jpg +00001208.jpg +00001209.jpg +00001210.jpg +00001211.jpg +00001212.jpg +00001213.jpg +00001214.jpg +00001215.jpg +00001216.jpg +00001217.jpg +00001218.jpg +00001219.jpg +00001220.jpg +00001221.jpg +00001222.jpg +00001223.jpg +00001224.jpg +00001225.jpg +00001226.jpg +00001227.jpg +00001228.jpg +00001229.jpg +00001230.jpg +00001231.jpg +00001232.jpg +00001233.jpg +00001234.jpg +00001235.jpg +00001236.jpg +00001237.jpg +00001238.jpg +00001239.jpg +00001240.jpg +00001241.jpg +00001242.jpg +00001243.jpg +00001244.jpg +00001245.jpg +00001246.jpg +00001247.jpg +00001248.jpg +00001249.jpg +00001250.jpg +00001251.jpg +00001252.jpg +00001253.jpg +00001254.jpg +00001255.jpg +00001256.jpg +00001257.jpg +00001258.jpg +00001259.jpg +00001260.jpg +00001261.jpg +00001262.jpg +00001263.jpg +00001264.jpg +00001265.jpg +00001266.jpg +00001267.jpg +00001268.jpg +00001269.jpg +00001270.jpg +00001271.jpg +00001272.jpg +00001273.jpg +00001274.jpg +00001275.jpg +00001276.jpg +00001277.jpg +00001278.jpg +00001279.jpg +00001280.jpg +00001281.jpg +00001282.jpg +00001283.jpg +00001284.jpg +00001285.jpg +00001286.jpg +00001287.jpg +00001288.jpg +00001289.jpg +00001290.jpg +00001291.jpg +00001292.jpg +00001293.jpg +00001294.jpg +00001295.jpg +00001296.jpg +00001297.jpg +00001298.jpg +00001299.jpg +00001300.jpg +00001301.jpg +00001302.jpg +00001303.jpg +00001304.jpg +00001305.jpg +00001306.jpg +00001307.jpg +00001308.jpg +00001309.jpg +00001310.jpg +00001311.jpg +00001312.jpg +00001313.jpg +00001314.jpg +00001315.jpg +00001316.jpg +00001317.jpg +00001318.jpg +00001319.jpg +00001320.jpg +00001321.jpg +00001322.jpg +00001323.jpg +00001324.jpg +00001325.jpg +00001326.jpg +00001327.jpg +00001328.jpg +00001329.jpg +00001330.jpg +00001331.jpg +00001332.jpg +00001333.jpg +00001334.jpg +00001335.jpg +00001336.jpg +00001337.jpg +00001338.jpg +00001339.jpg +00001340.jpg +00001341.jpg +00001342.jpg +00001343.jpg +00001344.jpg +00001345.jpg +00001346.jpg +00001347.jpg +00001348.jpg +00001349.jpg +00001350.jpg +00001351.jpg +00001352.jpg +00001353.jpg +00001354.jpg +00001355.jpg +00001356.jpg +00001357.jpg +00001358.jpg +00001359.jpg +00001360.jpg +00001361.jpg +00001362.jpg +00001363.jpg +00001364.jpg +00001365.jpg +00001366.jpg +00001367.jpg +00001368.jpg +00001369.jpg +00001370.jpg +00001371.jpg +00001372.jpg +00001373.jpg +00001374.jpg +00001375.jpg +00001376.jpg +00001377.jpg +00001378.jpg +00001379.jpg +00001380.jpg +00001381.jpg +00001382.jpg +00001383.jpg +00001384.jpg +00001385.jpg +00001386.jpg +00001387.jpg +00001388.jpg +00001389.jpg +00001390.jpg +00001391.jpg +00001392.jpg +00001393.jpg +00001394.jpg +00001395.jpg +00001396.jpg +00001397.jpg +00001398.jpg +00001399.jpg +00001400.jpg +00001401.jpg +00001402.jpg +00001403.jpg +00001404.jpg +00001405.jpg +00001406.jpg +00001407.jpg +00001408.jpg +00001409.jpg +00001410.jpg +00001411.jpg +00001412.jpg +00001413.jpg +00001414.jpg +00001415.jpg +00001416.jpg +00001417.jpg +00001418.jpg +00001419.jpg +00001420.jpg +00001421.jpg +00001422.jpg +00001423.jpg +00001424.jpg +00001425.jpg +00001426.jpg +00001427.jpg +00001428.jpg +00001429.jpg +00001430.jpg +00001431.jpg +00001432.jpg +00001433.jpg +00001434.jpg +00001435.jpg +00001436.jpg +00001437.jpg +00001438.jpg +00001439.jpg +00001440.jpg +00001441.jpg +00001442.jpg +00001443.jpg +00001444.jpg +00001445.jpg +00001446.jpg +00001447.jpg +00001448.jpg +00001449.jpg +00001450.jpg +00001451.jpg +00001452.jpg +00001453.jpg +00001454.jpg +00001455.jpg +00001456.jpg +00001457.jpg +00001458.jpg +00001459.jpg +00001460.jpg +00001461.jpg +00001462.jpg +00001463.jpg +00001464.jpg +00001465.jpg +00001466.jpg +00001467.jpg +00001468.jpg +00001469.jpg +00001470.jpg +00001471.jpg +00001472.jpg +00001473.jpg +00001474.jpg +00001475.jpg +00001476.jpg +00001477.jpg +00001478.jpg +00001479.jpg +00001480.jpg +00001481.jpg +00001482.jpg +00001483.jpg +00001484.jpg +00001485.jpg +00001486.jpg +00001487.jpg +00001488.jpg +00001489.jpg +00001490.jpg +00001491.jpg +00001492.jpg +00001493.jpg +00001494.jpg +00001495.jpg +00001496.jpg +00001497.jpg +00001498.jpg +00001499.jpg +00001500.jpg +00001501.jpg +00001502.jpg +00001503.jpg +00001504.jpg +00001505.jpg +00001506.jpg +00001507.jpg +00001508.jpg +00001509.jpg +00001510.jpg +00001511.jpg +00001512.jpg +00001513.jpg +00001514.jpg +00001515.jpg +00001516.jpg +00001517.jpg +00001518.jpg +00001519.jpg +00001520.jpg +00001521.jpg +00001522.jpg +00001523.jpg +00001524.jpg +00001525.jpg +00001526.jpg +00001527.jpg +00001528.jpg +00001529.jpg +00001530.jpg +00001531.jpg +00001532.jpg +00001533.jpg +00001534.jpg +00001535.jpg +00001536.jpg +00001537.jpg +00001538.jpg +00001539.jpg +00001540.jpg +00001541.jpg +00001542.jpg +00001543.jpg +00001544.jpg +00001545.jpg +00001546.jpg +00001547.jpg +00001548.jpg +00001549.jpg +00001550.jpg +00001551.jpg +00001552.jpg +00001553.jpg +00001554.jpg +00001555.jpg +00001556.jpg +00001557.jpg +00001558.jpg +00001559.jpg +00001560.jpg +00001561.jpg +00001562.jpg +00001563.jpg +00001564.jpg +00001565.jpg +00001566.jpg +00001567.jpg +00001568.jpg +00001569.jpg +00001570.jpg +00001571.jpg +00001572.jpg +00001573.jpg +00001574.jpg +00001575.jpg +00001576.jpg +00001577.jpg +00001578.jpg +00001579.jpg +00001580.jpg +00001581.jpg +00001582.jpg +00001583.jpg +00001584.jpg +00001585.jpg +00001586.jpg +00001587.jpg +00001588.jpg +00001589.jpg +00001590.jpg +00001591.jpg +00001592.jpg +00001593.jpg +00001594.jpg +00001595.jpg +00001596.jpg +00001597.jpg +00001598.jpg +00001599.jpg +00001600.jpg +00001601.jpg +00001602.jpg +00001603.jpg +00001604.jpg +00001605.jpg +00001606.jpg +00001607.jpg +00001608.jpg +00001609.jpg +00001610.jpg +00001611.jpg +00001612.jpg +00001613.jpg +00001614.jpg +00001615.jpg +00001616.jpg +00001617.jpg +00001618.jpg +00001619.jpg +00001620.jpg +00001621.jpg +00001622.jpg +00001623.jpg +00001624.jpg +00001625.jpg +00001626.jpg +00001627.jpg +00001628.jpg +00001629.jpg +00001630.jpg +00001631.jpg +00001632.jpg +00001633.jpg +00001634.jpg +00001635.jpg +00001636.jpg +00001637.jpg +00001638.jpg +00001639.jpg +00001640.jpg +00001641.jpg +00001642.jpg +00001643.jpg +00001644.jpg +00001645.jpg +00001646.jpg +00001647.jpg +00001648.jpg +00001649.jpg +00001650.jpg +00001651.jpg +00001652.jpg +00001653.jpg +00001654.jpg +00001655.jpg +00001656.jpg +00001657.jpg +00001658.jpg +00001659.jpg +00001660.jpg +00001661.jpg +00001662.jpg +00001663.jpg +00001664.jpg +00001665.jpg +00001666.jpg +00001667.jpg +00001668.jpg +00001669.jpg +00001670.jpg +00001671.jpg +00001672.jpg +00001673.jpg +00001674.jpg +00001675.jpg +00001676.jpg +00001677.jpg +00001678.jpg +00001679.jpg +00001680.jpg +00001681.jpg +00001682.jpg +00001683.jpg +00001684.jpg +00001685.jpg +00001686.jpg +00001687.jpg +00001688.jpg +00001689.jpg +00001690.jpg +00001691.jpg +00001692.jpg +00001693.jpg +00001694.jpg +00001695.jpg +00001696.jpg +00001697.jpg +00001698.jpg +00001699.jpg +00001700.jpg +00001701.jpg +00001702.jpg +00001703.jpg +00001704.jpg +00001705.jpg +00001706.jpg +00001707.jpg +00001708.jpg +00001709.jpg +00001710.jpg +00001711.jpg +00001712.jpg +00001713.jpg +00001714.jpg +00001715.jpg +00001716.jpg +00001717.jpg +00001718.jpg +00001719.jpg +00001720.jpg +00001721.jpg +00001722.jpg +00001723.jpg +00001724.jpg +00001725.jpg +00001726.jpg +00001727.jpg +00001728.jpg +00001729.jpg +00001730.jpg +00001731.jpg +00001732.jpg +00001733.jpg +00001734.jpg +00001735.jpg +00001736.jpg +00001737.jpg +00001738.jpg +00001739.jpg +00001740.jpg +00001741.jpg +00001742.jpg +00001743.jpg +00001744.jpg +00001745.jpg +00001746.jpg +00001747.jpg +00001748.jpg +00001749.jpg +00001750.jpg +00001751.jpg +00001752.jpg +00001753.jpg +00001754.jpg +00001755.jpg +00001756.jpg +00001757.jpg +00001758.jpg +00001759.jpg +00001760.jpg +00001761.jpg +00001762.jpg +00001763.jpg +00001764.jpg +00001765.jpg +00001766.jpg +00001767.jpg +00001768.jpg +00001769.jpg +00001770.jpg +00001771.jpg +00001772.jpg +00001773.jpg +00001774.jpg +00001775.jpg +00001776.jpg +00001777.jpg +00001778.jpg +00001779.jpg +00001780.jpg +00001781.jpg +00001782.jpg +00001783.jpg +00001784.jpg +00001785.jpg +00001786.jpg +00001787.jpg +00001788.jpg +00001789.jpg +00001790.jpg +00001791.jpg +00001792.jpg +00001793.jpg +00001794.jpg +00001795.jpg +00001796.jpg +00001797.jpg +00001798.jpg +00001799.jpg +00001800.jpg +00001801.jpg +00001802.jpg +00001803.jpg +00001804.jpg +00001805.jpg +00001806.jpg +00001807.jpg +00001808.jpg +00001809.jpg +00001810.jpg +00001811.jpg +00001812.jpg +00001813.jpg +00001814.jpg +00001815.jpg +00001816.jpg +00001817.jpg +00001818.jpg +00001819.jpg +00001820.jpg +00001821.jpg +00001822.jpg +00001823.jpg +00001824.jpg +00001825.jpg +00001826.jpg +00001827.jpg +00001828.jpg +00001829.jpg +00001830.jpg +00001831.jpg +00001832.jpg +00001833.jpg +00001834.jpg +00001835.jpg +00001836.jpg +00001837.jpg +00001838.jpg +00001839.jpg +00001840.jpg +00001841.jpg +00001842.jpg +00001843.jpg +00001844.jpg +00001845.jpg +00001846.jpg +00001847.jpg +00001848.jpg +00001849.jpg +00001850.jpg +00001851.jpg +00001852.jpg +00001853.jpg +00001854.jpg +00001855.jpg +00001856.jpg +00001857.jpg +00001858.jpg +00001859.jpg +00001860.jpg +00001861.jpg +00001862.jpg +00001863.jpg +00001864.jpg +00001865.jpg +00001866.jpg +00001867.jpg +00001868.jpg +00001869.jpg +00001870.jpg +00001871.jpg +00001872.jpg +00001873.jpg +00001874.jpg +00001875.jpg +00001876.jpg +00001877.jpg +00001878.jpg +00001879.jpg +00001880.jpg +00001881.jpg +00001882.jpg +00001883.jpg +00001884.jpg +00001885.jpg +00001886.jpg +00001887.jpg +00001888.jpg +00001889.jpg +00001890.jpg +00001891.jpg +00001892.jpg +00001893.jpg +00001894.jpg +00001895.jpg +00001896.jpg +00001897.jpg +00001898.jpg +00001899.jpg +00001900.jpg +00001901.jpg +00001902.jpg +00001903.jpg +00001904.jpg +00001905.jpg +00001906.jpg +00001907.jpg +00001908.jpg +00001909.jpg +00001910.jpg +00001911.jpg +00001912.jpg +00001913.jpg +00001914.jpg +00001915.jpg +00001916.jpg +00001917.jpg +00001918.jpg +00001919.jpg +00001920.jpg +00001921.jpg +00001922.jpg +00001923.jpg +00001924.jpg +00001925.jpg +00001926.jpg +00001927.jpg +00001928.jpg +00001929.jpg +00001930.jpg +00001931.jpg +00001932.jpg +00001933.jpg +00001934.jpg +00001935.jpg +00001936.jpg +00001937.jpg +00001938.jpg +00001939.jpg +00001940.jpg +00001941.jpg +00001942.jpg +00001943.jpg +00001944.jpg +00001945.jpg +00001946.jpg +00001947.jpg +00001948.jpg +00001949.jpg +00001950.jpg +00001951.jpg +00001952.jpg +00001953.jpg +00001954.jpg +00001955.jpg +00001956.jpg +00001957.jpg +00001958.jpg +00001959.jpg +00001960.jpg +00001961.jpg +00001962.jpg +00001963.jpg +00001964.jpg +00001965.jpg +00001966.jpg +00001967.jpg +00001968.jpg +00001969.jpg +00001970.jpg +00001971.jpg +00001972.jpg +00001973.jpg +00001974.jpg +00001975.jpg +00001976.jpg +00001978.jpg +00001979.jpg +00001980.jpg +00001981.jpg +00001982.jpg +00001983.jpg +00001984.jpg +00001985.jpg +00001986.jpg +00001987.jpg +00001988.jpg +00001989.jpg +00001990.jpg +00001991.jpg +00001992.jpg +00001993.jpg +00001994.jpg +00001995.jpg +00001996.jpg +00001997.jpg +00001998.jpg +00001999.jpg +00002000.jpg +00002001.jpg +00002002.jpg +00002003.jpg +00002004.jpg +00002005.jpg +00002006.jpg +00002007.jpg +00002008.jpg +00002009.jpg +00002010.jpg +00002011.jpg +00002012.jpg +00002013.jpg +00002014.jpg +00002015.jpg +00002016.jpg +00002017.jpg +00002018.jpg +00002019.jpg +00002020.jpg +00002021.jpg +00002022.jpg +00002023.jpg +00002024.jpg +00002025.jpg +00002026.jpg +00002027.jpg +00002028.jpg +00002029.jpg +00002030.jpg +00002031.jpg +00002032.jpg +00002033.jpg +00002034.jpg +00002035.jpg +00002036.jpg +00002037.jpg +00002038.jpg +00002039.jpg +00002040.jpg +00002041.jpg +00002042.jpg +00002043.jpg +00002044.jpg +00002045.jpg +00002046.jpg +00002047.jpg +00002048.jpg +00002049.jpg +00002050.jpg +00002051.jpg +00002052.jpg +00002053.jpg +00002054.jpg +00002055.jpg +00002056.jpg +00002057.jpg +00002058.jpg +00002059.jpg +00002060.jpg +00002061.jpg +00002062.jpg +00002063.jpg +00002064.jpg +00002065.jpg +00002066.jpg +00002067.jpg +00002068.jpg +00002069.jpg +00002070.jpg +00002071.jpg +00002072.jpg +00002073.jpg +00002074.jpg +00002075.jpg +00002076.jpg +00002077.jpg +00002078.jpg +00002079.jpg +00002080.jpg +00002081.jpg +00002082.jpg +00002083.jpg +00002084.jpg +00002085.jpg +00002086.jpg +00002087.jpg +00002088.jpg +00002089.jpg +00002090.jpg +00002091.jpg +00002092.jpg +00002093.jpg +00002094.jpg +00002095.jpg +00002096.jpg +00002097.jpg +00002098.jpg +00002099.jpg +00002100.jpg +00002101.jpg +00002102.jpg +00002103.jpg +00002104.jpg +00002105.jpg +00002107.jpg +00002108.jpg +00002109.jpg +00002110.jpg +00002111.jpg +00002112.jpg +00002113.jpg +00002114.jpg +00002115.jpg +00002116.jpg +00002117.jpg +00002118.jpg +00002119.jpg +00002120.jpg +00002121.jpg +00002122.jpg +00002123.jpg +00002124.jpg +00002125.jpg +00002126.jpg +00002127.jpg +00002128.jpg +00002129.jpg +00002130.jpg +00002131.jpg +00002132.jpg +00002133.jpg +00002134.jpg +00002135.jpg +00002136.jpg +00002137.jpg +00002138.jpg +00002139.jpg +00002140.jpg +00002141.jpg +00002142.jpg +00002143.jpg +00002144.jpg +00002145.jpg +00002146.jpg +00002147.jpg +00002148.jpg +00002149.jpg +00002150.jpg +00002151.jpg +00002152.jpg +00002153.jpg +00002154.jpg +00002155.jpg +00002156.jpg +00002157.jpg +00002158.jpg +00002159.jpg +00002160.jpg +00002161.jpg +00002162.jpg +00002163.jpg +00002164.jpg +00002165.jpg +00002166.jpg +00002167.jpg +00002168.jpg +00002169.jpg +00002170.jpg +00002171.jpg +00002172.jpg +00002173.jpg +00002174.jpg +00002175.jpg +00002176.jpg +00002177.jpg +00002178.jpg +00002179.jpg +00002180.jpg +00002181.jpg +00002182.jpg +00002183.jpg +00002184.jpg +00002185.jpg +00002186.jpg +00002187.jpg +00002188.jpg +00002189.jpg +00002190.jpg +00002191.jpg +00002192.jpg +00002193.jpg +00002194.jpg +00002195.jpg +00002196.jpg +00002197.jpg +00002198.jpg +00002199.jpg +00002200.jpg +00002201.jpg +00002202.jpg +00002203.jpg +00002204.jpg +00002205.jpg +00002206.jpg +00002207.jpg +00002208.jpg +00002209.jpg +00002210.jpg +00002211.jpg +00002212.jpg +00002213.jpg +00002214.jpg +00002215.jpg +00002216.jpg +00002217.jpg +00002218.jpg +00002219.jpg +00002220.jpg +00002221.jpg +00002222.jpg +00002223.jpg +00002224.jpg +00002225.jpg +00002226.jpg +00002227.jpg +00002228.jpg +00002229.jpg +00002230.jpg +00002231.jpg +00002232.jpg +00002233.jpg +00002234.jpg +00002235.jpg +00002236.jpg +00002237.jpg +00002238.jpg +00002239.jpg +00002240.jpg +00002241.jpg +00002242.jpg +00002243.jpg +00002244.jpg +00002245.jpg +00002246.jpg +00002247.jpg +00002248.jpg +00002249.jpg +00002250.jpg +00002251.jpg +00002252.jpg +00002253.jpg +00002254.jpg +00002255.jpg +00002256.jpg +00002257.jpg +00002258.jpg +00002259.jpg +00002260.jpg +00002261.jpg +00002262.jpg +00002263.jpg +00002264.jpg +00002265.jpg +00002266.jpg +00002267.jpg +00002268.jpg +00002269.jpg +00002270.jpg +00002271.jpg +00002272.jpg +00002273.jpg +00002274.jpg +00002275.jpg +00002276.jpg +00002277.jpg +00002278.jpg +00002279.jpg +00002280.jpg +00002281.jpg +00002282.jpg +00002283.jpg +00002284.jpg +00002285.jpg +00002286.jpg +00002287.jpg +00002288.jpg +00002289.jpg +00002290.jpg +00002291.jpg +00002292.jpg +00002293.jpg +00002294.jpg +00002295.jpg +00002296.jpg +00002297.jpg +00002298.jpg +00002299.jpg +00002300.jpg +00002301.jpg +00002302.jpg +00002303.jpg +00002304.jpg +00002305.jpg +00002306.jpg +00002307.jpg +00002308.jpg +00002309.jpg +00002310.jpg +00002311.jpg +00002312.jpg +00002313.jpg +00002314.jpg +00002315.jpg +00002316.jpg +00002317.jpg +00002318.jpg +00002319.jpg +00002320.jpg +00002321.jpg +00002322.jpg +00002323.jpg +00002324.jpg +00002325.jpg +00002326.jpg +00002327.jpg +00002328.jpg +00002329.jpg +00002330.jpg +00002331.jpg +00002332.jpg +00002333.jpg +00002334.jpg +00002335.jpg +00002336.jpg +00002337.jpg +00002338.jpg +00002339.jpg +00002340.jpg +00002341.jpg +00002342.jpg +00002343.jpg +00002344.jpg +00002345.jpg +00002346.jpg +00002347.jpg +00002348.jpg +00002349.jpg +00002350.jpg +00002351.jpg +00002352.jpg +00002353.jpg +00002354.jpg +00002355.jpg +00002356.jpg +00002357.jpg +00002358.jpg +00002359.jpg +00002360.jpg +00002361.jpg +00002362.jpg +00002363.jpg +00002364.jpg +00002365.jpg +00002366.jpg +00002367.jpg +00002368.jpg +00002369.jpg +00002370.jpg +00002371.jpg +00002372.jpg +00002373.jpg +00002374.jpg +00002375.jpg +00002376.jpg +00002377.jpg +00002378.jpg +00002379.jpg +00002380.jpg +00002381.jpg +00002382.jpg +00002383.jpg +00002384.jpg +00002385.jpg +00002386.jpg +00002387.jpg +00002388.jpg +00002389.jpg +00002390.jpg +00002391.jpg +00002392.jpg +00002393.jpg +00002394.jpg +00002395.jpg +00002396.jpg +00002397.jpg +00002398.jpg +00002399.jpg +00002400.jpg +00002401.jpg +00002402.jpg +00002403.jpg +00002404.jpg +00002405.jpg +00002406.jpg +00002407.jpg +00002408.jpg +00002409.jpg +00002410.jpg +00002411.jpg +00002412.jpg +00002413.jpg +00002414.jpg +00002415.jpg +00002416.jpg +00002417.jpg +00002418.jpg +00002419.jpg +00002420.jpg +00002421.jpg +00002422.jpg +00002423.jpg +00002424.jpg +00002425.jpg +00002426.jpg +00002427.jpg +00002428.jpg +00002429.jpg +00002430.jpg +00002431.jpg +00002432.jpg +00002433.jpg +00002434.jpg +00002435.jpg +00002436.jpg +00002437.jpg +00002438.jpg +00002439.jpg +00002440.jpg +00002441.jpg +00002442.jpg +00002443.jpg +00002444.jpg +00002445.jpg +00002446.jpg +00002447.jpg +00002448.jpg +00002449.jpg +00002450.jpg +00002451.jpg +00002452.jpg +00002453.jpg +00002454.jpg +00002455.jpg +00002456.jpg +00002457.jpg +00002458.jpg +00002459.jpg +00002460.jpg +00002461.jpg +00002462.jpg +00002463.jpg +00002464.jpg +00002465.jpg +00002466.jpg +00002467.jpg +00002468.jpg +00002469.jpg +00002470.jpg +00002471.jpg +00002472.jpg +00002473.jpg +00002474.jpg +00002475.jpg +00002476.jpg +00002477.jpg +00002478.jpg +00002479.jpg +00002480.jpg +00002481.jpg +00002482.jpg +00002483.jpg +00002484.jpg +00002485.jpg +00002486.jpg +00002487.jpg +00002488.jpg +00002489.jpg +00002490.jpg +00002491.jpg +00002492.jpg +00002493.jpg +00002494.jpg +00002495.jpg +00002496.jpg +00002497.jpg +00002498.jpg +00002499.jpg +00002500.jpg +00002501.jpg +00002502.jpg +00002503.jpg +00002504.jpg +00002505.jpg +00002506.jpg +00002507.jpg +00002508.jpg +00002509.jpg +00002510.jpg +00002511.jpg +00002512.jpg +00002513.jpg +00002514.jpg +00002515.jpg +00002516.jpg +00002517.jpg +00002518.jpg +00002519.jpg +00002520.jpg +00002521.jpg +00002522.jpg +00002523.jpg +00002524.jpg +00002525.jpg +00002526.jpg +00002527.jpg +00002528.jpg +00002529.jpg +00002530.jpg +00002531.jpg +00002532.jpg +00002533.jpg +00002534.jpg +00002535.jpg +00002536.jpg +00002537.jpg +00002538.jpg +00002539.jpg +00002540.jpg +00002541.jpg +00002542.jpg +00002543.jpg +00002544.jpg +00002545.jpg +00002546.jpg +00002547.jpg +00002548.jpg +00002549.jpg +00002550.jpg +00002551.jpg +00002552.jpg +00002553.jpg +00002554.jpg +00002555.jpg +00002556.jpg +00002557.jpg +00002558.jpg +00002559.jpg +00002560.jpg +00002561.jpg +00002562.jpg +00002563.jpg +00002564.jpg +00002565.jpg +00002566.jpg +00002567.jpg +00002568.jpg +00002569.jpg +00002570.jpg +00002571.jpg +00002572.jpg +00002573.jpg +00002574.jpg +00002575.jpg +00002576.jpg +00002577.jpg +00002578.jpg +00002579.jpg +00002580.jpg +00002581.jpg +00002582.jpg +00002583.jpg +00002584.jpg +00002585.jpg +00002586.jpg +00002587.jpg +00002588.jpg +00002589.jpg +00002590.jpg +00002591.jpg +00002592.jpg +00002593.jpg +00002594.jpg +00002595.jpg +00002596.jpg +00002597.jpg +00002598.jpg +00002599.jpg +00002600.jpg +00002601.jpg +00002602.jpg +00002603.jpg +00002604.jpg +00002605.jpg +00002606.jpg +00002607.jpg +00002608.jpg +00002609.jpg +00002610.jpg +00002611.jpg +00002612.jpg +00002613.jpg +00002614.jpg +00002615.jpg +00002616.jpg +00002617.jpg +00002618.jpg +00002619.jpg +00002620.jpg +00002621.jpg +00002622.jpg +00002623.jpg +00002624.jpg +00002625.jpg +00002626.jpg +00002627.jpg +00002628.jpg +00002629.jpg +00002630.jpg +00002631.jpg +00002632.jpg +00002633.jpg +00002634.jpg +00002635.jpg +00002636.jpg +00002637.jpg +00002638.jpg +00002639.jpg +00002640.jpg +00002641.jpg +00002642.jpg +00002643.jpg +00002644.jpg +00002645.jpg +00002646.jpg +00002647.jpg +00002648.jpg +00002649.jpg +00002650.jpg +00002651.jpg +00002652.jpg +00002653.jpg +00002654.jpg +00002655.jpg +00002656.jpg +00002657.jpg +00002658.jpg +00002659.jpg +00002660.jpg +00002661.jpg +00002662.jpg +00002663.jpg +00002664.jpg +00002665.jpg +00002666.jpg +00002667.jpg +00002668.jpg +00002669.jpg +00002670.jpg +00002671.jpg +00002672.jpg +00002673.jpg +00002674.jpg +00002675.jpg +00002676.jpg +00002677.jpg +00002678.jpg +00002679.jpg +00002680.jpg +00002681.jpg +00002682.jpg +00002683.jpg +00002684.jpg +00002685.jpg +00002686.jpg +00002687.jpg +00002688.jpg +00002689.jpg +00002690.jpg +00002691.jpg +00002692.jpg +00002693.jpg +00002694.jpg +00002695.jpg +00002696.jpg +00002697.jpg +00002698.jpg +00002699.jpg +00002700.jpg +00002701.jpg +00002702.jpg +00002703.jpg +00002704.jpg +00002705.jpg +00002706.jpg +00002707.jpg +00002708.jpg +00002709.jpg +00002710.jpg +00002711.jpg +00002712.jpg +00002713.jpg +00002714.jpg +00002715.jpg +00002716.jpg +00002717.jpg +00002718.jpg +00002719.jpg +00002720.jpg +00002721.jpg +00002722.jpg +00002723.jpg +00002724.jpg +00002725.jpg +00002726.jpg +00002727.jpg +00002728.jpg +00002729.jpg +00002730.jpg +00002731.jpg +00002732.jpg +00002733.jpg +00002734.jpg +00002735.jpg +00002736.jpg +00002737.jpg +00002738.jpg +00002739.jpg +00002740.jpg +00002741.jpg +00002742.jpg +00002743.jpg +00002744.jpg +00002745.jpg +00002746.jpg +00002747.jpg +00002748.jpg +00002749.jpg +00002750.jpg +00002751.jpg +00002752.jpg +00002753.jpg +00002754.jpg +00002755.jpg +00002756.jpg +00002757.jpg +00002758.jpg +00002759.jpg +00002760.jpg +00002761.jpg +00002762.jpg +00002763.jpg +00002764.jpg +00002765.jpg +00002766.jpg +00002767.jpg +00002768.jpg +00002769.jpg +00002770.jpg +00002771.jpg +00002772.jpg +00002773.jpg +00002774.jpg +00002775.jpg +00002776.jpg +00002777.jpg +00002778.jpg +00002779.jpg +00002780.jpg +00002781.jpg +00002782.jpg +00002783.jpg +00002784.jpg +00002785.jpg +00002786.jpg +00002787.jpg +00002788.jpg +00002789.jpg +00002790.jpg +00002791.jpg +00002792.jpg +00002793.jpg +00002794.jpg +00002795.jpg +00002796.jpg +00002797.jpg +00002798.jpg +00002799.jpg +00002800.jpg +00002801.jpg +00002802.jpg +00002803.jpg +00002804.jpg +00002805.jpg +00002806.jpg +00002807.jpg +00002808.jpg +00002809.jpg +00002810.jpg +00002811.jpg +00002812.jpg +00002813.jpg +00002814.jpg +00002815.jpg +00002816.jpg +00002817.jpg +00002818.jpg +00002819.jpg +00002820.jpg +00002821.jpg +00002822.jpg +00002823.jpg +00002824.jpg +00002825.jpg +00002826.jpg +00002827.jpg +00002828.jpg +00002829.jpg +00002830.jpg +00002831.jpg +00002832.jpg +00002833.jpg +00002834.jpg +00002835.jpg +00002836.jpg +00002837.jpg +00002838.jpg +00002839.jpg +00002840.jpg +00002841.jpg +00002842.jpg +00002843.jpg +00002844.jpg +00002845.jpg +00002846.jpg +00002847.jpg +00002848.jpg +00002849.jpg +00002850.jpg +00002851.jpg +00002852.jpg +00002853.jpg +00002854.jpg +00002855.jpg +00002856.jpg +00002857.jpg +00002858.jpg +00002859.jpg +00002860.jpg +00002861.jpg +00002862.jpg +00002863.jpg +00002864.jpg +00002865.jpg +00002866.jpg +00002867.jpg +00002868.jpg +00002869.jpg +00002870.jpg +00002871.jpg +00002872.jpg +00002873.jpg +00002874.jpg +00002875.jpg +00002876.jpg +00002877.jpg +00002878.jpg +00002879.jpg +00002880.jpg +00002881.jpg +00002882.jpg +00002883.jpg +00002884.jpg +00002885.jpg +00002886.jpg +00002887.jpg +00002888.jpg +00002889.jpg +00002890.jpg +00002891.jpg +00002892.jpg +00002893.jpg +00002894.jpg +00002895.jpg +00002896.jpg +00002897.jpg +00002898.jpg +00002899.jpg +00002900.jpg +00002901.jpg +00002902.jpg +00002903.jpg +00002904.jpg +00002905.jpg +00002906.jpg +00002907.jpg +00002908.jpg +00002909.jpg +00002910.jpg +00002911.jpg +00002912.jpg +00002913.jpg +00002914.jpg +00002915.jpg +00002916.jpg +00002917.jpg +00002918.jpg +00002919.jpg +00002920.jpg +00002921.jpg +00002922.jpg +00002923.jpg +00002924.jpg +00002925.jpg +00002926.jpg +00002927.jpg +00002928.jpg +00002929.jpg +00002930.jpg +00002931.jpg +00002932.jpg +00002933.jpg +00002934.jpg +00002935.jpg +00002936.jpg +00002937.jpg +00002938.jpg +00002939.jpg +00002940.jpg +00002941.jpg +00002942.jpg +00002943.jpg +00002944.jpg +00002945.jpg +00002946.jpg +00002947.jpg +00002948.jpg +00002949.jpg +00002950.jpg +00002951.jpg +00002952.jpg +00002953.jpg +00002954.jpg +00002955.jpg +00002956.jpg +00002957.jpg +00002958.jpg +00002959.jpg +00002960.jpg +00002961.jpg +00002962.jpg +00002963.jpg +00002964.jpg +00002965.jpg +00002966.jpg +00002967.jpg +00002968.jpg +00002969.jpg +00002970.jpg +00002971.jpg +00002972.jpg +00002973.jpg +00002974.jpg +00002975.jpg +00002976.jpg +00002977.jpg +00002978.jpg +00002979.jpg +00002980.jpg +00002981.jpg +00002982.jpg +00002983.jpg +00002984.jpg +00002985.jpg +00002986.jpg +00002987.jpg +00002988.jpg +00002989.jpg +00002990.jpg +00002991.jpg +00002992.jpg +00002993.jpg +00002994.jpg +00002995.jpg +00002996.jpg +00002997.jpg +00002998.jpg +00002999.jpg +00003000.jpg +00003001.jpg +00003002.jpg +00003003.jpg +00003004.jpg +00003005.jpg +00003006.jpg +00003007.jpg +00003008.jpg +00003009.jpg +00003010.jpg +00003011.jpg +00003012.jpg +00003013.jpg +00003014.jpg +00003015.jpg +00003016.jpg +00003017.jpg +00003018.jpg +00003019.jpg +00003020.jpg +00003021.jpg +00003022.jpg +00003023.jpg +00003024.jpg +00003025.jpg +00003026.jpg +00003027.jpg +00003028.jpg +00003029.jpg +00003030.jpg +00003031.jpg +00003032.jpg +00003033.jpg +00003034.jpg +00003035.jpg +00003036.jpg +00003037.jpg +00003038.jpg +00003039.jpg +00003040.jpg +00003041.jpg +00003042.jpg +00003043.jpg +00003044.jpg +00003045.jpg +00003046.jpg +00003047.jpg +00003048.jpg +00003049.jpg +00003050.jpg +00003051.jpg +00003052.jpg +00003053.jpg +00003054.jpg +00003055.jpg +00003056.jpg +00003057.jpg +00003058.jpg +00003059.jpg +00003060.jpg +00003061.jpg +00003062.jpg +00003063.jpg +00003064.jpg +00003065.jpg +00003066.jpg +00003067.jpg +00003068.jpg +00003069.jpg +00003070.jpg +00003071.jpg +00003072.jpg +00003073.jpg +00003074.jpg +00003075.jpg +00003076.jpg +00003077.jpg +00003078.jpg +00003079.jpg +00003080.jpg +00003081.jpg +00003082.jpg +00003083.jpg +00003084.jpg +00003085.jpg +00003086.jpg +00003087.jpg +00003088.jpg +00003089.jpg +00003090.jpg +00003091.jpg +00003092.jpg +00003093.jpg +00003094.jpg +00003095.jpg +00003096.jpg +00003097.jpg +00003098.jpg +00003099.jpg +00003100.jpg +00003101.jpg +00003102.jpg +00003103.jpg +00003104.jpg +00003105.jpg +00003106.jpg +00003107.jpg +00003108.jpg +00003109.jpg +00003110.jpg +00003111.jpg +00003112.jpg +00003113.jpg +00003114.jpg +00003115.jpg +00003116.jpg +00003117.jpg +00003118.jpg +00003119.jpg +00003120.jpg +00003121.jpg +00003122.jpg +00003123.jpg +00003124.jpg +00003125.jpg +00003126.jpg +00003127.jpg +00003128.jpg +00003129.jpg +00003130.jpg +00003131.jpg +00003132.jpg +00003133.jpg +00003134.jpg +00003135.jpg +00003136.jpg +00003137.jpg +00003138.jpg +00003139.jpg +00003140.jpg +00003141.jpg +00003142.jpg +00003143.jpg +00003144.jpg +00003145.jpg +00003146.jpg +00003147.jpg +00003148.jpg +00003149.jpg +00003150.jpg +00003151.jpg +00003152.jpg +00003153.jpg +00003154.jpg +00003155.jpg +00003156.jpg +00003157.jpg +00003158.jpg +00003159.jpg +00003160.jpg +00003161.jpg +00003162.jpg +00003163.jpg +00003164.jpg +00003165.jpg +00003166.jpg +00003167.jpg +00003168.jpg +00003169.jpg +00003170.jpg +00003171.jpg +00003172.jpg +00003173.jpg +00003174.jpg +00003175.jpg +00003176.jpg +00003177.jpg +00003178.jpg +00003179.jpg +00003180.jpg +00003181.jpg +00003182.jpg +00003183.jpg +00003184.jpg +00003185.jpg +00003186.jpg +00003187.jpg +00003188.jpg +00003189.jpg +00003190.jpg +00003191.jpg +00003192.jpg +00003193.jpg +00003194.jpg +00003195.jpg +00003196.jpg +00003197.jpg +00003198.jpg +00003199.jpg +00003200.jpg +00003201.jpg +00003202.jpg +00003203.jpg +00003204.jpg +00003205.jpg +00003206.jpg +00003207.jpg +00003208.jpg +00003209.jpg +00003210.jpg +00003211.jpg +00003212.jpg +00003213.jpg +00003214.jpg +00003215.jpg +00003216.jpg +00003217.jpg +00003218.jpg +00003219.jpg +00003220.jpg +00003221.jpg +00003222.jpg +00003223.jpg +00003224.jpg +00003225.jpg +00003226.jpg +00003227.jpg +00003228.jpg +00003229.jpg +00003230.jpg +00003231.jpg +00003232.jpg +00003233.jpg +00003234.jpg +00003235.jpg +00003236.jpg +00003237.jpg +00003238.jpg +00003239.jpg +00003240.jpg +00003241.jpg +00003242.jpg +00003243.jpg +00003244.jpg +00003245.jpg +00003246.jpg +00003247.jpg +00003248.jpg +00003249.jpg +00003250.jpg +00003251.jpg +00003252.jpg +00003253.jpg +00003254.jpg +00003255.jpg +00003256.jpg +00003257.jpg +00003258.jpg +00003259.jpg +00003260.jpg +00003261.jpg +00003262.jpg +00003263.jpg +00003264.jpg +00003265.jpg +00003266.jpg +00003267.jpg +00003268.jpg +00003269.jpg +00003270.jpg +00003271.jpg +00003272.jpg +00003273.jpg +00003274.jpg +00003275.jpg +00003276.jpg +00003277.jpg +00003278.jpg +00003279.jpg +00003280.jpg +00003281.jpg +00003282.jpg +00003283.jpg +00003284.jpg +00003285.jpg +00003286.jpg +00003287.jpg +00003288.jpg +00003289.jpg +00003290.jpg +00003291.jpg +00003292.jpg +00003293.jpg +00003294.jpg +00003295.jpg +00003296.jpg +00003297.jpg +00003298.jpg +00003299.jpg +00003300.jpg +00003301.jpg +00003302.jpg +00003303.jpg +00003304.jpg +00003305.jpg +00003306.jpg +00003307.jpg +00003308.jpg +00003309.jpg +00003310.jpg +00003311.jpg +00003312.jpg +00003313.jpg +00003314.jpg +00003315.jpg +00003316.jpg +00003317.jpg +00003318.jpg +00003319.jpg +00003320.jpg +00003321.jpg +00003322.jpg +00003323.jpg +00003324.jpg +00003325.jpg +00003326.jpg +00003327.jpg +00003328.jpg +00003329.jpg +00003330.jpg +00003331.jpg +00003332.jpg +00003333.jpg +00003334.jpg +00003335.jpg +00003336.jpg +00003337.jpg +00003338.jpg +00003339.jpg +00003340.jpg +00003341.jpg +00003342.jpg +00003343.jpg +00003344.jpg +00003345.jpg +00003346.jpg +00003347.jpg +00003348.jpg +00003349.jpg +00003350.jpg +00003351.jpg +00003352.jpg +00003353.jpg +00003354.jpg +00003355.jpg +00003356.jpg +00003357.jpg +00003358.jpg +00003359.jpg +00003360.jpg +00003361.jpg +00003362.jpg +00003363.jpg +00003364.jpg +00003365.jpg +00003366.jpg +00003367.jpg +00003368.jpg +00003369.jpg +00003370.jpg +00003371.jpg +00003372.jpg +00003373.jpg +00003374.jpg +00003375.jpg +00003376.jpg +00003377.jpg +00003378.jpg +00003379.jpg +00003380.jpg +00003381.jpg +00003382.jpg +00003383.jpg +00003384.jpg +00003385.jpg +00003386.jpg +00003387.jpg +00003388.jpg +00003389.jpg +00003390.jpg +00003391.jpg +00003392.jpg +00003393.jpg +00003394.jpg +00003395.jpg +00003396.jpg +00003397.jpg +00003398.jpg +00003399.jpg +00003400.jpg +00003401.jpg +00003402.jpg +00003403.jpg +00003404.jpg +00003405.jpg +00003406.jpg +00003407.jpg +00003408.jpg +00003409.jpg +00003410.jpg +00003411.jpg +00003412.jpg +00003413.jpg +00003414.jpg +00003415.jpg +00003416.jpg +00003417.jpg +00003418.jpg +00003419.jpg +00003420.jpg +00003421.jpg +00003422.jpg +00003423.jpg +00003424.jpg +00003425.jpg +00003426.jpg +00003427.jpg +00003428.jpg +00003429.jpg +00003430.jpg +00003431.jpg +00003432.jpg +00003433.jpg +00003434.jpg +00003435.jpg +00003436.jpg +00003437.jpg +00003438.jpg +00003439.jpg +00003440.jpg +00003441.jpg +00003442.jpg +00003443.jpg +00003444.jpg +00003445.jpg +00003446.jpg +00003447.jpg +00003448.jpg +00003449.jpg +00003450.jpg +00003451.jpg +00003452.jpg +00003453.jpg +00003454.jpg +00003455.jpg +00003456.jpg +00003457.jpg +00003458.jpg +00003459.jpg +00003460.jpg +00003461.jpg +00003462.jpg +00003463.jpg +00003464.jpg +00003465.jpg +00003466.jpg +00003467.jpg +00003468.jpg +00003469.jpg +00003470.jpg +00003471.jpg +00003472.jpg +00003473.jpg +00003474.jpg +00003475.jpg +00003476.jpg +00003477.jpg +00003478.jpg +00003479.jpg +00003480.jpg +00003481.jpg +00003482.jpg +00003483.jpg +00003484.jpg +00003485.jpg +00003486.jpg +00003487.jpg +00003488.jpg +00003489.jpg +00003490.jpg +00003491.jpg +00003492.jpg +00003493.jpg +00003494.jpg +00003495.jpg +00003496.jpg +00003497.jpg +00003498.jpg +00003499.jpg +00003500.jpg +00003501.jpg +00003502.jpg +00003503.jpg +00003504.jpg +00003505.jpg +00003506.jpg +00003507.jpg +00003508.jpg +00003509.jpg +00003510.jpg +00003511.jpg +00003512.jpg +00003513.jpg +00003514.jpg +00003515.jpg +00003516.jpg +00003517.jpg +00003518.jpg +00003519.jpg +00003520.jpg +00003521.jpg +00003522.jpg +00003523.jpg +00003524.jpg +00003525.jpg +00003526.jpg +00003527.jpg +00003528.jpg +00003529.jpg +00003530.jpg +00003531.jpg +00003532.jpg +00003533.jpg +00003534.jpg +00003535.jpg +00003536.jpg +00003537.jpg +00003538.jpg +00003539.jpg +00003540.jpg +00003541.jpg +00003542.jpg +00003543.jpg +00003544.jpg +00003545.jpg +00003546.jpg +00003547.jpg +00003548.jpg +00003549.jpg +00003550.jpg +00003551.jpg +00003552.jpg +00003553.jpg +00003554.jpg +00003555.jpg +00003556.jpg +00003557.jpg +00003558.jpg +00003559.jpg +00003560.jpg +00003561.jpg +00003562.jpg +00003563.jpg +00003564.jpg +00003565.jpg +00003566.jpg +00003567.jpg +00003568.jpg +00003569.jpg +00003570.jpg +00003571.jpg +00003572.jpg +00003573.jpg +00003574.jpg +00003575.jpg +00003576.jpg +00003577.jpg +00003578.jpg +00003579.jpg +00003580.jpg +00003581.jpg +00003582.jpg +00003583.jpg +00003584.jpg +00003585.jpg +00003586.jpg +00003587.jpg +00003588.jpg +00003589.jpg +00003590.jpg +00003591.jpg +00003592.jpg +00003593.jpg +00003594.jpg +00003595.jpg +00003596.jpg +00003597.jpg +00003598.jpg +00003599.jpg +00003600.jpg +00003601.jpg +00003602.jpg +00003603.jpg +00003604.jpg +00003605.jpg +00003606.jpg +00003607.jpg +00003608.jpg +00003609.jpg +00003610.jpg +00003611.jpg +00003612.jpg +00003613.jpg +00003614.jpg +00003615.jpg +00003616.jpg +00003617.jpg +00003618.jpg +00003619.jpg +00003620.jpg +00003621.jpg +00003622.jpg +00003623.jpg +00003624.jpg +00003625.jpg +00003626.jpg +00003627.jpg +00003628.jpg +00003629.jpg +00003630.jpg +00003631.jpg +00003632.jpg +00003633.jpg +00003634.jpg +00003635.jpg +00003636.jpg +00003637.jpg +00003638.jpg +00003639.jpg +00003640.jpg +00003641.jpg +00003642.jpg +00003643.jpg +00003644.jpg +00003645.jpg +00003646.jpg +00003647.jpg +00003648.jpg +00003649.jpg +00003650.jpg +00003651.jpg +00003652.jpg +00003653.jpg +00003654.jpg +00003655.jpg +00003656.jpg +00003657.jpg +00003658.jpg +00003659.jpg +00003660.jpg +00003661.jpg +00003662.jpg +00003663.jpg +00003664.jpg +00003665.jpg +00003666.jpg +00003667.jpg +00003668.jpg +00003669.jpg +00003670.jpg +00003671.jpg +00003672.jpg +00003673.jpg +00003674.jpg +00003675.jpg +00003676.jpg +00003677.jpg +00003678.jpg +00003679.jpg +00003680.jpg +00003681.jpg +00003682.jpg +00003683.jpg +00003684.jpg +00003685.jpg +00003686.jpg +00003687.jpg +00003688.jpg +00003689.jpg +00003690.jpg +00003691.jpg +00003692.jpg +00003693.jpg +00003694.jpg +00003695.jpg +00003696.jpg +00003697.jpg +00003698.jpg +00003699.jpg +00003700.jpg +00003701.jpg +00003702.jpg +00003703.jpg +00003704.jpg +00003705.jpg +00003706.jpg +00003707.jpg +00003708.jpg +00003709.jpg +00003710.jpg +00003711.jpg +00003712.jpg +00003713.jpg +00003714.jpg +00003715.jpg +00003716.jpg +00003717.jpg +00003718.jpg +00003719.jpg +00003720.jpg +00003721.jpg +00003722.jpg +00003723.jpg +00003724.jpg +00003725.jpg +00003726.jpg +00003727.jpg +00003728.jpg +00003729.jpg +00003730.jpg +00003731.jpg +00003732.jpg +00003733.jpg +00003734.jpg +00003735.jpg +00003736.jpg +00003737.jpg +00003738.jpg +00003739.jpg +00003740.jpg +00003741.jpg +00003742.jpg +00003743.jpg +00003744.jpg +00003745.jpg +00003746.jpg +00003747.jpg +00003748.jpg +00003749.jpg +00003750.jpg +00003751.jpg +00003752.jpg +00003753.jpg +00003754.jpg +00003755.jpg +00003756.jpg +00003757.jpg +00003758.jpg +00003759.jpg +00003760.jpg +00003761.jpg +00003762.jpg +00003763.jpg +00003764.jpg +00003765.jpg +00003766.jpg +00003767.jpg +00003768.jpg +00003769.jpg +00003770.jpg +00003771.jpg +00003772.jpg +00003773.jpg +00003774.jpg +00003775.jpg +00003776.jpg +00003777.jpg +00003778.jpg +00003779.jpg +00003780.jpg +00003781.jpg +00003782.jpg +00003783.jpg +00003784.jpg +00003785.jpg +00003786.jpg +00003787.jpg +00003788.jpg +00003789.jpg +00003790.jpg +00003791.jpg +00003792.jpg +00003793.jpg +00003794.jpg +00003795.jpg +00003796.jpg +00003797.jpg +00003798.jpg +00003799.jpg +00003800.jpg +00003801.jpg +00003802.jpg +00003803.jpg +00003804.jpg +00003805.jpg +00003806.jpg +00003807.jpg +00003808.jpg +00003809.jpg +00003810.jpg +00003811.jpg +00003812.jpg +00003813.jpg +00003814.jpg +00003815.jpg +00003816.jpg +00003817.jpg +00003818.jpg +00003819.jpg +00003820.jpg +00003821.jpg +00003822.jpg +00003823.jpg +00003824.jpg +00003825.jpg +00003826.jpg +00003827.jpg +00003828.jpg +00003829.jpg +00003830.jpg +00003831.jpg +00003832.jpg +00003833.jpg +00003834.jpg +00003835.jpg +00003836.jpg +00003837.jpg +00003838.jpg +00003839.jpg +00003840.jpg +00003841.jpg +00003842.jpg +00003843.jpg +00003844.jpg +00003845.jpg +00003846.jpg +00003847.jpg +00003848.jpg +00003849.jpg +00003850.jpg +00003851.jpg +00003852.jpg +00003853.jpg +00003854.jpg +00003855.jpg +00003856.jpg +00003857.jpg +00003858.jpg +00003859.jpg +00003860.jpg +00003861.jpg +00003862.jpg +00003863.jpg +00003864.jpg +00003865.jpg +00003866.jpg +00003867.jpg +00003868.jpg +00003869.jpg +00003870.jpg +00003871.jpg +00003872.jpg +00003873.jpg +00003874.jpg +00003875.jpg +00003876.jpg +00003877.jpg +00003878.jpg +00003879.jpg +00003880.jpg +00003881.jpg +00003882.jpg +00003883.jpg +00003884.jpg +00003885.jpg +00003886.jpg +00003887.jpg +00003888.jpg +00003889.jpg +00003890.jpg +00003891.jpg +00003892.jpg +00003893.jpg +00003894.jpg +00003895.jpg +00003896.jpg +00003897.jpg +00003898.jpg +00003899.jpg +00003900.jpg +00003901.jpg +00003902.jpg +00003903.jpg +00003904.jpg +00003905.jpg +00003906.jpg +00003907.jpg +00003908.jpg +00003909.jpg +00003910.jpg +00003911.jpg +00003912.jpg +00003913.jpg +00003914.jpg +00003915.jpg +00003916.jpg +00003917.jpg +00003918.jpg +00003919.jpg +00003920.jpg +00003921.jpg +00003922.jpg +00003923.jpg +00003924.jpg +00003925.jpg +00003926.jpg +00003927.jpg +00003928.jpg +00003929.jpg +00003930.jpg +00003931.jpg +00003932.jpg +00003933.jpg +00003934.jpg +00003935.jpg +00003936.jpg +00003937.jpg +00003938.jpg +00003939.jpg +00003940.jpg +00003941.jpg +00003942.jpg +00003943.jpg +00003944.jpg +00003945.jpg +00003946.jpg +00003947.jpg +00003948.jpg +00003949.jpg +00003950.jpg +00003951.jpg +00003952.jpg +00003953.jpg +00003954.jpg +00003955.jpg +00003956.jpg +00003957.jpg +00003958.jpg +00003959.jpg +00003960.jpg +00003961.jpg +00003962.jpg +00003963.jpg +00003964.jpg +00003965.jpg +00003966.jpg +00003967.jpg +00003968.jpg +00003969.jpg +00003970.jpg +00003971.jpg +00003972.jpg +00003973.jpg +00003974.jpg +00003975.jpg +00003976.jpg +00003977.jpg +00003978.jpg +00003979.jpg +00003980.jpg +00003981.jpg +00003982.jpg +00003983.jpg +00003984.jpg +00003985.jpg +00003986.jpg +00003987.jpg +00003988.jpg +00003989.jpg +00003990.jpg +00003991.jpg +00003992.jpg +00003993.jpg +00003994.jpg +00003995.jpg +00003996.jpg +00003997.jpg +00003998.jpg +00003999.jpg +00004000.jpg +00004001.jpg +00004002.jpg +00004003.jpg +00004004.jpg +00004005.jpg +00004006.jpg +00004007.jpg +00004008.jpg +00004009.jpg +00004010.jpg +00004011.jpg +00004012.jpg +00004013.jpg +00004014.jpg +00004015.jpg +00004016.jpg +00004017.jpg +00004018.jpg +00004019.jpg +00004020.jpg +00004021.jpg +00004022.jpg +00004023.jpg +00004024.jpg +00004025.jpg +00004026.jpg +00004027.jpg +00004028.jpg +00004029.jpg +00004030.jpg +00004031.jpg +00004032.jpg +00004033.jpg +00004034.jpg +00004035.jpg +00004036.jpg +00004037.jpg +00004038.jpg +00004039.jpg +00004040.jpg +00004041.jpg +00004042.jpg +00004043.jpg +00004044.jpg +00004045.jpg +00004046.jpg +00004047.jpg +00004048.jpg +00004049.jpg +00004050.jpg +00004051.jpg +00004052.jpg +00004053.jpg +00004054.jpg +00004055.jpg +00004056.jpg +00004057.jpg +00004058.jpg +00004059.jpg +00004060.jpg +00004061.jpg +00004062.jpg +00004063.jpg +00004064.jpg +00004065.jpg +00004066.jpg +00004067.jpg +00004068.jpg +00004069.jpg +00004070.jpg +00004071.jpg +00004072.jpg +00004073.jpg +00004074.jpg +00004075.jpg +00004076.jpg +00004077.jpg +00004078.jpg +00004079.jpg +00004080.jpg +00004081.jpg +00004082.jpg +00004083.jpg +00004084.jpg +00004085.jpg +00004086.jpg +00004087.jpg +00004088.jpg +00004089.jpg +00004090.jpg +00004091.jpg +00004092.jpg +00004093.jpg +00004094.jpg +00004095.jpg +00004096.jpg +00004097.jpg +00004098.jpg +00004099.jpg +00004100.jpg +00004101.jpg +00004102.jpg +00004103.jpg +00004104.jpg +00004105.jpg +00004106.jpg +00004107.jpg +00004108.jpg +00004109.jpg +00004110.jpg +00004111.jpg +00004112.jpg +00004113.jpg +00004114.jpg +00004115.jpg +00004116.jpg +00004117.jpg +00004118.jpg +00004119.jpg +00004120.jpg +00004121.jpg +00004122.jpg +00004123.jpg +00004124.jpg +00004125.jpg +00004126.jpg +00004127.jpg +00004128.jpg +00004129.jpg +00004130.jpg +00004131.jpg +00004132.jpg +00004133.jpg +00004134.jpg +00004135.jpg +00004136.jpg +00004137.jpg +00004138.jpg +00004139.jpg +00004140.jpg +00004141.jpg +00004142.jpg +00004143.jpg +00004144.jpg +00004145.jpg +00004146.jpg +00004147.jpg +00004148.jpg +00004149.jpg +00004150.jpg +00004151.jpg +00004152.jpg +00004153.jpg +00004154.jpg +00004155.jpg +00004156.jpg +00004157.jpg +00004158.jpg +00004159.jpg +00004160.jpg +00004161.jpg +00004162.jpg +00004163.jpg +00004164.jpg +00004165.jpg +00004166.jpg +00004167.jpg +00004168.jpg +00004169.jpg +00004170.jpg +00004171.jpg +00004172.jpg +00004173.jpg +00004174.jpg +00004175.jpg +00004176.jpg +00004177.jpg +00004178.jpg +00004179.jpg +00004180.jpg +00004181.jpg +00004182.jpg +00004183.jpg +00004184.jpg +00004185.jpg +00004186.jpg +00004187.jpg +00004188.jpg +00004189.jpg +00004190.jpg +00004191.jpg +00004192.jpg +00004193.jpg +00004194.jpg +00004195.jpg +00004196.jpg +00004197.jpg +00004198.jpg +00004199.jpg +00004200.jpg +00004201.jpg +00004202.jpg +00004203.jpg +00004204.jpg +00004205.jpg +00004206.jpg +00004207.jpg +00004208.jpg +00004209.jpg +00004210.jpg +00004211.jpg +00004212.jpg +00004213.jpg +00004214.jpg +00004215.jpg +00004216.jpg +00004217.jpg +00004218.jpg +00004219.jpg +00004220.jpg +00004221.jpg +00004222.jpg +00004223.jpg +00004224.jpg +00004225.jpg +00004226.jpg +00004227.jpg +00004228.jpg +00004229.jpg +00004230.jpg +00004231.jpg +00004232.jpg +00004233.jpg +00004234.jpg +00004235.jpg +00004236.jpg +00004237.jpg +00004238.jpg +00004239.jpg +00004240.jpg +00004241.jpg +00004242.jpg +00004243.jpg +00004244.jpg +00004245.jpg +00004246.jpg +00004247.jpg +00004248.jpg +00004249.jpg +00004250.jpg +00004251.jpg +00004252.jpg +00004253.jpg +00004254.jpg +00004255.jpg +00004256.jpg +00004257.jpg +00004258.jpg +00004259.jpg +00004260.jpg +00004261.jpg +00004262.jpg +00004263.jpg +00004264.jpg +00004265.jpg +00004266.jpg +00004267.jpg +00004268.jpg +00004269.jpg +00004270.jpg +00004271.jpg +00004272.jpg +00004273.jpg +00004274.jpg +00004275.jpg +00004276.jpg +00004277.jpg +00004278.jpg +00004279.jpg +00004280.jpg +00004281.jpg +00004282.jpg +00004283.jpg +00004284.jpg +00004285.jpg +00004286.jpg +00004287.jpg +00004288.jpg +00004289.jpg +00004290.jpg +00004291.jpg +00004292.jpg +00004293.jpg +00004294.jpg +00004295.jpg +00004296.jpg +00004297.jpg +00004298.jpg +00004299.jpg +00004300.jpg +00004301.jpg +00004302.jpg +00004303.jpg +00004304.jpg +00004305.jpg +00004306.jpg +00004307.jpg +00004308.jpg +00004309.jpg +00004310.jpg +00004311.jpg +00004312.jpg +00004313.jpg +00004314.jpg +00004315.jpg +00004316.jpg +00004317.jpg +00004318.jpg +00004319.jpg +00004320.jpg +00004321.jpg +00004322.jpg +00004323.jpg +00004324.jpg +00004325.jpg +00004326.jpg +00004327.jpg +00004328.jpg +00004329.jpg +00004330.jpg +00004331.jpg +00004332.jpg +00004333.jpg +00004334.jpg +00004335.jpg +00004336.jpg +00004337.jpg +00004338.jpg +00004339.jpg +00004340.jpg +00004341.jpg +00004342.jpg +00004343.jpg +00004344.jpg +00004345.jpg +00004346.jpg +00004347.jpg +00004348.jpg +00004349.jpg +00004350.jpg +00004351.jpg +00004352.jpg +00004353.jpg +00004354.jpg +00004355.jpg +00004356.jpg +00004357.jpg +00004358.jpg +00004359.jpg +00004360.jpg +00004361.jpg +00004362.jpg +00004363.jpg +00004364.jpg +00004365.jpg +00004366.jpg +00004367.jpg +00004368.jpg +00004369.jpg +00004370.jpg +00004371.jpg +00004372.jpg +00004373.jpg +00004374.jpg +00004375.jpg +00004376.jpg +00004377.jpg +00004378.jpg +00004379.jpg +00004380.jpg +00004381.jpg +00004382.jpg +00004383.jpg +00004384.jpg +00004385.jpg +00004386.jpg +00004387.jpg +00004388.jpg +00004389.jpg +00004390.jpg +00004391.jpg +00004392.jpg +00004393.jpg +00004394.jpg +00004395.jpg +00004396.jpg +00004397.jpg +00004398.jpg +00004399.jpg +00004400.jpg +00006281.jpg +00006282.jpg +00006283.jpg +00006284.jpg +00006285.jpg +00006286.jpg +00006287.jpg +00006288.jpg +00006289.jpg +00006290.jpg +00006291.jpg +00006292.jpg +00006293.jpg +00006294.jpg +00006295.jpg +00006296.jpg +00006297.jpg +00006298.jpg +00006299.jpg +00006300.jpg +00006301.jpg +00006302.jpg +00006303.jpg +00006304.jpg +00006305.jpg +00006306.jpg +00006307.jpg +00006308.jpg +00006309.jpg +00006310.jpg +00006311.jpg +00006312.jpg +00006313.jpg +00006314.jpg +00006315.jpg +00006316.jpg +00006317.jpg +00006318.jpg +00006319.jpg +00006320.jpg +00006321.jpg +00006322.jpg +00006323.jpg +00006324.jpg +00006325.jpg +00006326.jpg +00006327.jpg +00006328.jpg +00006329.jpg +00006330.jpg +00006331.jpg +00006332.jpg +00006333.jpg +00006334.jpg +00006335.jpg +00006336.jpg +00006337.jpg +00006338.jpg +00006339.jpg +00006340.jpg +00006341.jpg +00006342.jpg +00006343.jpg +00006344.jpg +00006345.jpg +00006346.jpg +00006347.jpg +00006348.jpg +00006349.jpg +00006350.jpg +00006351.jpg +00006352.jpg +00006353.jpg +00006354.jpg +00006355.jpg +00006356.jpg +00006357.jpg +00006358.jpg +00006359.jpg +00006360.jpg +00006361.jpg +00006362.jpg +00006363.jpg +00006364.jpg +00006365.jpg +00006366.jpg +00006367.jpg +00006368.jpg +00006369.jpg +00006370.jpg +00006371.jpg +00006372.jpg +00006373.jpg +00006374.jpg +00006375.jpg +00006376.jpg +00006377.jpg +00006378.jpg +00006379.jpg +00006380.jpg +00006381.jpg +00006382.jpg +00006383.jpg +00006384.jpg +00006385.jpg +00006386.jpg +00006387.jpg +00006388.jpg +00006389.jpg +00006390.jpg +00006391.jpg +00006392.jpg +00006393.jpg +00006394.jpg +00006395.jpg +00006396.jpg +00006397.jpg +00006398.jpg +00006399.jpg +00006400.jpg +00006401.jpg +00006402.jpg +00006403.jpg +00006404.jpg +00006405.jpg +00006406.jpg +00006407.jpg +00006408.jpg +00006409.jpg +00006410.jpg +00006411.jpg +00006412.jpg +00006413.jpg +00006414.jpg +00006415.jpg +00006416.jpg +00006417.jpg +00006418.jpg +00006419.jpg +00006420.jpg +00006421.jpg +00006422.jpg +00006423.jpg +00006424.jpg +00006425.jpg +00006426.jpg +00006427.jpg +00006428.jpg +00006429.jpg +00006430.jpg +00006431.jpg +00006432.jpg +00006433.jpg +00006434.jpg +00006435.jpg +00006436.jpg +00006437.jpg +00006438.jpg +00006439.jpg +00006440.jpg +00006441.jpg +00006442.jpg +00006443.jpg +00006444.jpg +00006445.jpg +00006446.jpg +00006447.jpg +00006448.jpg +00006449.jpg +00006450.jpg +00006451.jpg +00006452.jpg +00006453.jpg +00006454.jpg +00006455.jpg +00006456.jpg +00006457.jpg +00006458.jpg +00006459.jpg +00006460.jpg +00006461.jpg +00006462.jpg +00006463.jpg +00006464.jpg +00006465.jpg +00006466.jpg +00006467.jpg +00006468.jpg +00006469.jpg +00006470.jpg +00006471.jpg +00006472.jpg +00006473.jpg +00006474.jpg +00006475.jpg +00006476.jpg +00006477.jpg +00006478.jpg +00006479.jpg +00006480.jpg +00006481.jpg +00006482.jpg +00006483.jpg +00006484.jpg +00006485.jpg +00006486.jpg +00006487.jpg +00006488.jpg +00006489.jpg +00006490.jpg +00006491.jpg +00006492.jpg +00006493.jpg +00006494.jpg +00006495.jpg +00006496.jpg +00006497.jpg +00006498.jpg +00006499.jpg +00006500.jpg +00006501.jpg +00006502.jpg +00006503.jpg +00006504.jpg +00006505.jpg +00006506.jpg +00006507.jpg +00006508.jpg +00006509.jpg +00006510.jpg +00006511.jpg +00006512.jpg +00006513.jpg +00006514.jpg +00006515.jpg +00006516.jpg +00006517.jpg +00006518.jpg +00006519.jpg +00006520.jpg +00006521.jpg +00006522.jpg +00006523.jpg +00006524.jpg +00006525.jpg +00006526.jpg +00006527.jpg +00006528.jpg +00006529.jpg +00006530.jpg +00006531.jpg +00006532.jpg +00006533.jpg +00006534.jpg +00006535.jpg +00006536.jpg +00006537.jpg +00006538.jpg +00006539.jpg +00006540.jpg +00006541.jpg +00006542.jpg +00006543.jpg +00006544.jpg +00006545.jpg +00006546.jpg +00006547.jpg +00006548.jpg +00006549.jpg +00006550.jpg +00006551.jpg +00006552.jpg +00006553.jpg +00006554.jpg +00006555.jpg +00006556.jpg +00006557.jpg +00006558.jpg +00006559.jpg +00006560.jpg +00006561.jpg +00006562.jpg +00006563.jpg +00006564.jpg +00006565.jpg +00006566.jpg +00006567.jpg +00006568.jpg +00006569.jpg +00006570.jpg +00006571.jpg +00006572.jpg +00006573.jpg +00006574.jpg +00006575.jpg +00006576.jpg +00006577.jpg +00006578.jpg +00006579.jpg +00006580.jpg +00006581.jpg +00006582.jpg +00006583.jpg +00006584.jpg +00006585.jpg +00006586.jpg +00006587.jpg +00006588.jpg +00006589.jpg +00006590.jpg +00006591.jpg +00006592.jpg +00006593.jpg +00006594.jpg +00006595.jpg +00006596.jpg +00006597.jpg +00006598.jpg +00006599.jpg +00006600.jpg +00006601.jpg +00006602.jpg +00006603.jpg +00006604.jpg +00006605.jpg +00006606.jpg +00006607.jpg +00006608.jpg +00006609.jpg +00006610.jpg +00006611.jpg +00006612.jpg +00006613.jpg +00006614.jpg +00006615.jpg +00006616.jpg +00006617.jpg +00006618.jpg +00006619.jpg +00006620.jpg +00006621.jpg +00006622.jpg +00006623.jpg +00006624.jpg +00006625.jpg +00006626.jpg +00006627.jpg +00006628.jpg +00006629.jpg +00006630.jpg +00006631.jpg +00006632.jpg +00006633.jpg +00006634.jpg +00006635.jpg +00006636.jpg +00006637.jpg +00006638.jpg +00006639.jpg +00006640.jpg +00006641.jpg +00006642.jpg +00006643.jpg +00006644.jpg +00006645.jpg +00006646.jpg +00006647.jpg +00006648.jpg +00006649.jpg +00006650.jpg +00006651.jpg +00006652.jpg +00006653.jpg +00006654.jpg +00006655.jpg +00006656.jpg +00006657.jpg +00006658.jpg +00006659.jpg +00006660.jpg +00006661.jpg +00006662.jpg +00006663.jpg +00006664.jpg +00006665.jpg +00006666.jpg +00006667.jpg +00006668.jpg +00006669.jpg +00006670.jpg +00006671.jpg +00006672.jpg +00006673.jpg +00006674.jpg +00006675.jpg +00006676.jpg +00006677.jpg +00006678.jpg +00006679.jpg +00006680.jpg +00006681.jpg +00006682.jpg +00006683.jpg +00006684.jpg +00006685.jpg +00006686.jpg +00006687.jpg +00006688.jpg +00006689.jpg +00006690.jpg +00006691.jpg +00006692.jpg +00006693.jpg +00006694.jpg +00006695.jpg +00006696.jpg +00006697.jpg +00006698.jpg +00006699.jpg +00006700.jpg +00006701.jpg +00006702.jpg +00006703.jpg +00006704.jpg +00006705.jpg +00006706.jpg +00006707.jpg +00006708.jpg +00006709.jpg +00006710.jpg +00006711.jpg +00006712.jpg +00006713.jpg +00006714.jpg +00006715.jpg +00006716.jpg +00006717.jpg +00006718.jpg +00006719.jpg +00006720.jpg +00006721.jpg +00006722.jpg +00006723.jpg +00006724.jpg +00006725.jpg +00006726.jpg +00006727.jpg +00006728.jpg +00006729.jpg +00006730.jpg +00006731.jpg +00006732.jpg +00006733.jpg +00006734.jpg +00006735.jpg +00006736.jpg +00006737.jpg +00006738.jpg +00006739.jpg +00006740.jpg +00006741.jpg +00006742.jpg +00006743.jpg +00006744.jpg +00006745.jpg +00006746.jpg +00006747.jpg +00006748.jpg +00006749.jpg +00006750.jpg +00006751.jpg +00006752.jpg +00006753.jpg +00006754.jpg +00006755.jpg +00006756.jpg +00006757.jpg +00006758.jpg +00006759.jpg +00006760.jpg +00006761.jpg +00006762.jpg +00006763.jpg +00006764.jpg +00006765.jpg +00006766.jpg +00006767.jpg +00006768.jpg +00006769.jpg +00006770.jpg +00006771.jpg +00006772.jpg +00006773.jpg +00006774.jpg +00006775.jpg +00006776.jpg +00006777.jpg +00006778.jpg +00006779.jpg +00006780.jpg +00006781.jpg +00006782.jpg +00006783.jpg +00006784.jpg +00006785.jpg +00006786.jpg +00006787.jpg +00006788.jpg +00006789.jpg +00006790.jpg +00006791.jpg +00006792.jpg +00006793.jpg +00006794.jpg +00006795.jpg +00006796.jpg +00006797.jpg +00006798.jpg +00006799.jpg +00006800.jpg +00006801.jpg +00006802.jpg +00006803.jpg +00006804.jpg +00006805.jpg +00006806.jpg +00006807.jpg +00006808.jpg +00006809.jpg +00006810.jpg +00006811.jpg +00006812.jpg +00006813.jpg +00006814.jpg +00006815.jpg +00006816.jpg +00006817.jpg +00006818.jpg +00006819.jpg +00006820.jpg +00006821.jpg +00006822.jpg +00006823.jpg +00006824.jpg +00006825.jpg +00006826.jpg +00006827.jpg +00006828.jpg +00006829.jpg +00006830.jpg +00006831.jpg +00006832.jpg +00006833.jpg +00006834.jpg +00006835.jpg +00006836.jpg +00006837.jpg +00006838.jpg +00006839.jpg +00006840.jpg +00006841.jpg +00006842.jpg +00006843.jpg +00006844.jpg +00006845.jpg +00006846.jpg +00006847.jpg +00006848.jpg +00006849.jpg +00006850.jpg +00006851.jpg +00006852.jpg +00006853.jpg +00006854.jpg +00006855.jpg +00006856.jpg +00006857.jpg +00006858.jpg +00006859.jpg +00006860.jpg +00006861.jpg +00006862.jpg +00006863.jpg +00006864.jpg +00006865.jpg +00006866.jpg diff --git a/FoodSeg103/data/FoodSeg103/Images/.DS_Store b/FoodSeg103/data/FoodSeg103/Images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..549dc8d10e921d0b147e0b1907d99dad705ffb02 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/.DS_Store differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/.DS_Store b/FoodSeg103/data/FoodSeg103/Images/ann_dir/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b6004015cb6db73a36e56a441e0341bf8973cd53 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/.DS_Store differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004458.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004458.png new file mode 100644 index 0000000000000000000000000000000000000000..a40693bf5c5c39c0dbc134ecbae41888e4fa4f4d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004458.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004464.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004464.png new file mode 100644 index 0000000000000000000000000000000000000000..02ee9c0e01296f20b9a4bb45ac9d3f26f03a9a21 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004464.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004470.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004470.png new file mode 100644 index 0000000000000000000000000000000000000000..00634d78afa3cd7f938daa37d84f61b76aa7b23d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004470.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004504.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004504.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5821d349d2819ddde580d85edd6d98088c42ab Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004504.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004505.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004505.png new file mode 100644 index 0000000000000000000000000000000000000000..f710916cd2dc78866af56f3d72963aaa23f64f25 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004505.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004510.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004510.png new file mode 100644 index 0000000000000000000000000000000000000000..b59e08dc2c686d62c2690d2768437c86fc6ee474 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004510.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004511.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004511.png new file mode 100644 index 0000000000000000000000000000000000000000..16dbabaf2d7dff42da205236869bd17ad8844ceb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004511.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004538.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004538.png new file mode 100644 index 0000000000000000000000000000000000000000..a677c9bbef78c45d7c2057598cc86cad8b2081f5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004538.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004539.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004539.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfb6712018139d84f1b0ac35197447cc9cc261e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004539.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004666.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004666.png new file mode 100644 index 0000000000000000000000000000000000000000..af1e980ddb28437d894b97a6e71e88c405a57fa8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004666.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004672.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004672.png new file mode 100644 index 0000000000000000000000000000000000000000..77089d96a782052c18a3e06df693d75853f99621 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004672.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004699.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004699.png new file mode 100644 index 0000000000000000000000000000000000000000..3c20b18d592e591ecbb10d80e35941cdfe6898c5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004699.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004706.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004706.png new file mode 100644 index 0000000000000000000000000000000000000000..19b5621c7688fa20426cb557814565e869c2aeba Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004706.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004707.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004707.png new file mode 100644 index 0000000000000000000000000000000000000000..ebfd9bfcbc7bd87bea7913b9eb4bf1a3094b41ae Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004707.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004712.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004712.png new file mode 100644 index 0000000000000000000000000000000000000000..ba007ebb648645b1a4e1f78cdedd21fde86d6b8a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004712.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004713.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004713.png new file mode 100644 index 0000000000000000000000000000000000000000..b25b460c5f87f52ebf1e1d0998356484bf925a00 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004713.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004841.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004841.png new file mode 100644 index 0000000000000000000000000000000000000000..b1490c4b92946f9d38502e4bcba4ec4c4984b4fc Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004841.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004855.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004855.png new file mode 100644 index 0000000000000000000000000000000000000000..ae15f34a511245fc919ea15e9000e445a22e82f2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004855.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004869.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004869.png new file mode 100644 index 0000000000000000000000000000000000000000..db7f11449df43d9205c2184d0e2bbea4af07c5d0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004869.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004882.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004882.png new file mode 100644 index 0000000000000000000000000000000000000000..c11ae217b41c1e05a052cdda6c56ff3c471232c9 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004882.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004896.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004896.png new file mode 100644 index 0000000000000000000000000000000000000000..b4efbb913f68fb7475b659a3cb21fdbe23c87609 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004896.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004908.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004908.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a723b8e7ab19ac010e80d7887c44905a9fca75 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004908.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004909.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004909.png new file mode 100644 index 0000000000000000000000000000000000000000..b261800a96cce33d2aa0d6b129ac99db36ad0990 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004909.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004921.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004921.png new file mode 100644 index 0000000000000000000000000000000000000000..830e8c4e40222a4fc0d3274a57eec26f8c1098ac Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004921.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004935.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004935.png new file mode 100644 index 0000000000000000000000000000000000000000..7d0c1d29af361413443d6f2d2111ec76a16342d8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00004935.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005008.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005008.png new file mode 100644 index 0000000000000000000000000000000000000000..8e1b4fd35504cca879995795b2ffc8537569c2b6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005008.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005020.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005020.png new file mode 100644 index 0000000000000000000000000000000000000000..021f242a70b95556382f7f8b5663d713e4d65054 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005020.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005034.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005034.png new file mode 100644 index 0000000000000000000000000000000000000000..8f6611c685cdf912ca26844e83687880863c687e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005034.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005140.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005140.png new file mode 100644 index 0000000000000000000000000000000000000000..fc9a604d8960c9700472518a7cb80e9f5e2aaec8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005140.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005141.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005141.png new file mode 100644 index 0000000000000000000000000000000000000000..5fed0f5364468a4e1603f04cc0819f23e1da5e65 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005141.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005154.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005154.png new file mode 100644 index 0000000000000000000000000000000000000000..8f17851200d2771c5bad6bfb26b3977d3f095062 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005154.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005155.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005155.png new file mode 100644 index 0000000000000000000000000000000000000000..e2999cca0784f399c2b68494ea7e2939e0507b2d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005155.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005168.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005168.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee876b5190cc3a396f57643b1e0b86d7c6d917e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005168.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005169.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005169.png new file mode 100644 index 0000000000000000000000000000000000000000..b5892392cf8bb9e1046dacfcce02eb8f986a9f7c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005169.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005182.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005182.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8f7d4b2262ff81fddc1ffdd62345b2d0576c31 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005182.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005183.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005183.png new file mode 100644 index 0000000000000000000000000000000000000000..bf35eff494e78b1e80f94e66c507b51baa1622d2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005183.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005196.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005196.png new file mode 100644 index 0000000000000000000000000000000000000000..8d95c42e7cc9da57cd21878fce0a1b5ba8f8c41d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005196.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005197.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005197.png new file mode 100644 index 0000000000000000000000000000000000000000..0991f4f9221de78848f809bbe154f3ead71b7b47 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005197.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005222.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005222.png new file mode 100644 index 0000000000000000000000000000000000000000..7acee0783f88ce3a7572f56811d7c0bca7054f39 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005222.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005236.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005236.png new file mode 100644 index 0000000000000000000000000000000000000000..ab4699763b948cc289c9216170a2d854692d7bbe Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005236.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005342.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005342.png new file mode 100644 index 0000000000000000000000000000000000000000..84168bc3e80a82c3cdcb7d7f7e3005739fe2be90 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005342.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005343.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005343.png new file mode 100644 index 0000000000000000000000000000000000000000..50a65efa51feb52a45777e4c0579d685b396bc8e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005343.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005356.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005356.png new file mode 100644 index 0000000000000000000000000000000000000000..61868c09e408f15a2c0cca0ea8e33d65d895b1f2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005356.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005357.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005357.png new file mode 100644 index 0000000000000000000000000000000000000000..9b080dcdd65f89c2aa988f4b813424fdb3b14a68 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005357.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005381.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005381.png new file mode 100644 index 0000000000000000000000000000000000000000..6a111c2a59f8380517dcfd23cbbe6c2e56e02a1a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005381.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005395.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005395.png new file mode 100644 index 0000000000000000000000000000000000000000..cd7c7699847f0792404dbe61c1cdd151afbc98a3 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005395.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005418.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005418.png new file mode 100644 index 0000000000000000000000000000000000000000..42625f1bd72ef2ff2dcb69978d761c9808f34448 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005418.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005419.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005419.png new file mode 100644 index 0000000000000000000000000000000000000000..563b906e327c799c4a313330037f62ad4ad72645 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005419.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005424.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005424.png new file mode 100644 index 0000000000000000000000000000000000000000..86478baf1788a2cda3bc6ac6951e3f478f1c9d87 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005424.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005425.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005425.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d7d2064e7d36de7272cb507285bf833c77c3d2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005425.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005430.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005430.png new file mode 100644 index 0000000000000000000000000000000000000000..2bbc7e39d19172adbd38960d1d93482c48d3b01a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005430.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005431.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005431.png new file mode 100644 index 0000000000000000000000000000000000000000..78eb1f18ab6b756e71654718551ed4dad1c523b6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005431.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005544.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005544.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae942c1a5c897fb8fda254e48247bb4cfe5d496 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005544.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005550.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005550.png new file mode 100644 index 0000000000000000000000000000000000000000..f30b0af9fc5c49e309eaea606991ad10cecee4b2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005550.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005578.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005578.png new file mode 100644 index 0000000000000000000000000000000000000000..f755d0885b2743c1331865ac20235dcc5000f1e7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005578.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005587.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005587.png new file mode 100644 index 0000000000000000000000000000000000000000..86bb7e8ecf247702202364f7f665e7f044ecd459 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005587.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005593.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005593.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d9e264fddb19e454fa8c7771984e477e7cec14 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005593.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005626.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005626.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd7c91daff90c7e26e753fb5660a7abff1c4609 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005626.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005627.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005627.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae27d126f6ff154e13d48cb8587f19a6f181405 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005627.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005632.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005632.png new file mode 100644 index 0000000000000000000000000000000000000000..378cf70af746bb9e1a8ce7e8e961fdcfc04b34c6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005632.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005633.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005633.png new file mode 100644 index 0000000000000000000000000000000000000000..699baf7422d15062bdd666aefd29f10cccce8786 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005633.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005746.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005746.png new file mode 100644 index 0000000000000000000000000000000000000000..d9502cb7a86100be539e54afe0d8524128781949 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005746.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005752.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005752.png new file mode 100644 index 0000000000000000000000000000000000000000..7424ac33b260c7ccb95b012a5e3ecfccaf72d376 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005752.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005785.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005785.png new file mode 100644 index 0000000000000000000000000000000000000000..f62a2cffd7aaa27f9b1b8113481339bb910eb8e9 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005785.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005791.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005791.png new file mode 100644 index 0000000000000000000000000000000000000000..7913a7e9c6c440225be819a5a3c49e2eb4a4fb0d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005791.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005800.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005800.png new file mode 100644 index 0000000000000000000000000000000000000000..2bef015a03d02a5155d3f42228f4e8d504fe5c80 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005800.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005801.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005801.png new file mode 100644 index 0000000000000000000000000000000000000000..cc28d745c903a233385c30dd9eaa7c8c7bca38a5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005801.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005814.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005814.png new file mode 100644 index 0000000000000000000000000000000000000000..3bdd82e27f9357b931062914d5efc9eeba11cdb1 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005814.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005815.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005815.png new file mode 100644 index 0000000000000000000000000000000000000000..8c3aa789056681a6db1cfd427043016740bad98d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005815.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005828.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005828.png new file mode 100644 index 0000000000000000000000000000000000000000..5df2a18bc9da0edfa1219158e22713d08c1bb29a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005828.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005829.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005829.png new file mode 100644 index 0000000000000000000000000000000000000000..86d67309a4b580b6082a335c1e423b0c56a3ae69 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005829.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005949.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005949.png new file mode 100644 index 0000000000000000000000000000000000000000..3514f013fa665f428a873a17682864625a1ff8f8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005949.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005961.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005961.png new file mode 100644 index 0000000000000000000000000000000000000000..9f0222ecfcd73eb814e3a0a7efe3859f9fb85ad6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005961.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005975.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005975.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbd2425329a62eceb64932dcda6cdaf0e229b5d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00005975.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006059.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006059.png new file mode 100644 index 0000000000000000000000000000000000000000..1653f2a1ca073361b6d4999619b5d18d4cb90fa0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006059.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006065.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006065.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ebf2a8984090d5340c2583debb9f38fa878e0c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006065.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006071.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006071.png new file mode 100644 index 0000000000000000000000000000000000000000..06e354f116347e13a733e57aafb34f4911bf7c25 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006071.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006104.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006104.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b4b1cead4531ee55a32a3ec9f259a5c3e68a04 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006104.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006105.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006105.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc0193706f1280df469757c44d8b14a6b0be2ae Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006105.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006110.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006110.png new file mode 100644 index 0000000000000000000000000000000000000000..59669a7c98aa2f3fab2dc2c8c600b9a13b135dea Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006110.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006111.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006111.png new file mode 100644 index 0000000000000000000000000000000000000000..0aedfd01b093e0cea55b2fd0c8d8aa57f2704820 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006111.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006138.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006138.png new file mode 100644 index 0000000000000000000000000000000000000000..59dc91c02f70bd9476bbddeac9876c764504a5a8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006138.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006139.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006139.png new file mode 100644 index 0000000000000000000000000000000000000000..799c4c69ad0b1046be938f9b0e540f9b639258ea Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006139.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006267.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006267.png new file mode 100644 index 0000000000000000000000000000000000000000..d75ef666050577fa4d61378653f7bab6df718da4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006267.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006273.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006273.png new file mode 100644 index 0000000000000000000000000000000000000000..15986f62874d35c63fc00480b52cc6b9774fa325 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006273.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006878.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006878.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9e49de6fc53a41b5482bcb58f45516c8774ab7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006878.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006879.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006879.png new file mode 100644 index 0000000000000000000000000000000000000000..f898aa41c0e67bd31762d760ddf6c93c7358c89f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006879.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006886.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006886.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3cb09e1b924d95e9e465a9d6abef3f4c7e2cc4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006886.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006887.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006887.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f8c79cccf8364aaca365568f8588409d11752a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006887.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006892.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006892.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4d60615e6fe5a8282203babcdedaeb98ade469 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006892.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006893.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006893.png new file mode 100644 index 0000000000000000000000000000000000000000..aca7629168a374f2a244678d6070628b9cb62976 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006893.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006918.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006918.png new file mode 100644 index 0000000000000000000000000000000000000000..cac95cddbad18f373a8c00f14601c9b451c392e8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006918.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006924.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006924.png new file mode 100644 index 0000000000000000000000000000000000000000..1bac5c0b594b5ecc3535608797097fbaebe44ce2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006924.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006930.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006930.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab931b86e2dce9d71990ea1a0c8024eced3cab4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00006930.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007018.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007018.png new file mode 100644 index 0000000000000000000000000000000000000000..7de4e310aec34335c378d2801469d439f323e12d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007018.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007019.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007019.png new file mode 100644 index 0000000000000000000000000000000000000000..ee9c4a44650c2cffa7a7ab344d59e87b863a090f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007019.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007024.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007024.png new file mode 100644 index 0000000000000000000000000000000000000000..1bcdc76c9e89742acfa0ab41f9f3b65ef4d44117 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007024.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007025.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007025.png new file mode 100644 index 0000000000000000000000000000000000000000..2b3b254d5f77595accf0d51706c1509ca47bd8e5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007025.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007030.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007030.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf7de477474a31b25aac6c0d7e977c30217c6b8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007030.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007031.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007031.png new file mode 100644 index 0000000000000000000000000000000000000000..82ff20b45b5a0c560474b88a01b1c6a5ab95f159 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/test/00007031.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000158.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000158.png new file mode 100644 index 0000000000000000000000000000000000000000..0931a44a1340812ba9c1b920d991e17a32ba1b56 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000158.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000164.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000164.png new file mode 100644 index 0000000000000000000000000000000000000000..ea33185eafe5ce90d4e61b1068c2eb4cb0a3a097 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000164.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000170.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000170.png new file mode 100644 index 0000000000000000000000000000000000000000..90a4d0adc2df152376c05ade445581b7d5419db6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000170.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000366.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000366.png new file mode 100644 index 0000000000000000000000000000000000000000..a99a25fb2b4018659da94d26db3f5096f0d33007 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000366.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000372.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000372.png new file mode 100644 index 0000000000000000000000000000000000000000..c97ecbdd974b8ec0535d51cec6e1fc292648702e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000372.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000399.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000399.png new file mode 100644 index 0000000000000000000000000000000000000000..3fe582c0e9e40bd3530779cd35fe543b2f60533f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000399.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000400.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000400.png new file mode 100644 index 0000000000000000000000000000000000000000..79234ecaa77f4710571bc465a0ef6a4e3804b181 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000400.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000414.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000414.png new file mode 100644 index 0000000000000000000000000000000000000000..3fbfa00ea10edb51b3c6d05d766afcdafb8ce2a5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000414.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000428.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000428.png new file mode 100644 index 0000000000000000000000000000000000000000..f16c52e470a355f28f933c2e1bd651eb56fa215e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000428.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000548.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000548.png new file mode 100644 index 0000000000000000000000000000000000000000..0efa5409f39e3eae0897b0332a7a0e38dfe82923 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000548.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000602.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000602.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7c40ea7ed0be416621d247a3a15692cc49e2a6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000602.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000616.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000616.png new file mode 100644 index 0000000000000000000000000000000000000000..7b0bde52a995375f62a2717b604749d2bac16dd4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000616.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000819.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000819.png new file mode 100644 index 0000000000000000000000000000000000000000..16d6d072f59483c6855546a497fbecc0936b81f8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000819.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000825.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000825.png new file mode 100644 index 0000000000000000000000000000000000000000..a94ce8a0d5bdd2ad273a1d0d239a20daae073da0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000825.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000831.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000831.png new file mode 100644 index 0000000000000000000000000000000000000000..e927b1ee4ed42bbb1c400ace58eb573d94dee71f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00000831.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001044.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001044.png new file mode 100644 index 0000000000000000000000000000000000000000..6c7e98e6ca2f01c769eaf0bdbe91d360870cd6df Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001044.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001050.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001050.png new file mode 100644 index 0000000000000000000000000000000000000000..86232249c284cbc2cb3befd92a581cbf7c2c1b19 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001050.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001078.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001078.png new file mode 100644 index 0000000000000000000000000000000000000000..40f91c085428be3c1e25f42a3e1738463671b940 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001078.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001087.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001087.png new file mode 100644 index 0000000000000000000000000000000000000000..f8781ed756f9c1d17320b5eaf47430060dcdce11 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001087.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001093.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001093.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b3129af10ec841c2bd85de5991de0290ec9bc2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001093.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001124.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001124.png new file mode 100644 index 0000000000000000000000000000000000000000..5a504e05c2583f2fe3357bf698be4f5b7847a3a1 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001124.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001130.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001130.png new file mode 100644 index 0000000000000000000000000000000000000000..13f34a20c6d9e8d301517d2a3726d09c42cbf88c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001130.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001246.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001246.png new file mode 100644 index 0000000000000000000000000000000000000000..fc1f2736e5754f4bc85dc21ef0c75908aab4db79 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001246.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001252.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001252.png new file mode 100644 index 0000000000000000000000000000000000000000..5a7b8f648f17f32af17cffca43854ef6643001e6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001252.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001285.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001285.png new file mode 100644 index 0000000000000000000000000000000000000000..4c13e1a4e862d0fff3a3f8e31b499b3a3eb8a173 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001285.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001291.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001291.png new file mode 100644 index 0000000000000000000000000000000000000000..bdadf597906d300c12f1621793ba67b7130f6b89 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001291.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001508.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001508.png new file mode 100644 index 0000000000000000000000000000000000000000..57c99dc1a286360ea45c71746d5e588d9208430f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001508.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001520.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001520.png new file mode 100644 index 0000000000000000000000000000000000000000..f71e24cbf3c580f9a35c9aaa557606bfb7e67718 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001520.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001534.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001534.png new file mode 100644 index 0000000000000000000000000000000000000000..13f1e783b0dc5b9de98b159c61a428602c0c84d2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001534.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001642.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001642.png new file mode 100644 index 0000000000000000000000000000000000000000..236d7700cd64550fa09c0582222ea5139d7a85cb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001642.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001656.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001656.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c97f80a0376e125f31b4a700272fdb046ff6aa Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001656.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001681.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001681.png new file mode 100644 index 0000000000000000000000000000000000000000..88b4d88e25fac040e31a51ae8bdb6e202443144e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001681.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001695.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001695.png new file mode 100644 index 0000000000000000000000000000000000000000..22c76468392d846f11dc597c48be51ddae63352c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001695.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001722.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001722.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8a40011357898364641ef589e95e852185c289 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001722.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001736.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001736.png new file mode 100644 index 0000000000000000000000000000000000000000..b96f77f9622d69daf59ac4958e2fdac18e30775c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001736.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001859.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001859.png new file mode 100644 index 0000000000000000000000000000000000000000..6833f3ce618cf0c2836f1ba3944b5a1be7eb1746 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001859.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001865.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001865.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4a928bc5dcd3cff1e5da9dc01f8af0b971f80e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001865.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001871.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001871.png new file mode 100644 index 0000000000000000000000000000000000000000..766b585069fd3de1d8b6a1de450a70ae3044fe81 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001871.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001905.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001905.png new file mode 100644 index 0000000000000000000000000000000000000000..efaad2a7a568d6a101799a95a1cd6cddcc1c4562 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001905.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001911.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001911.png new file mode 100644 index 0000000000000000000000000000000000000000..58848a1824048af6d951a2c08877a50563765db4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001911.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001939.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001939.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7eba1a0e5ccb268d98e220dee626dde6bb613b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00001939.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002001.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002001.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea28463cf43c323fe83673f130fead4c8b9a5e3 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002001.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002015.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002015.png new file mode 100644 index 0000000000000000000000000000000000000000..1e0986b80d9dc9520e89a452f024ae31c9067942 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002015.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002029.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002029.png new file mode 100644 index 0000000000000000000000000000000000000000..ff136e6e69560842801f1d51130e3b96557cdace Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002029.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002203.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002203.png new file mode 100644 index 0000000000000000000000000000000000000000..4a871d5179c04ed976fc60a98899688366631ffc Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002203.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002217.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002217.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a1d46abc42e867aacd2a19f5c9af6e273b6bdc Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002217.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002388.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002388.png new file mode 100644 index 0000000000000000000000000000000000000000..44856fd87a3cf2e14462222d1a199cd802962fae Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002388.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002439.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002439.png new file mode 100644 index 0000000000000000000000000000000000000000..d89ec91b131b6040aea0b1097643bbd7b37ed37e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002439.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002559.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002559.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ab27aaa7a502751b12f1211c87f0c570b68aa4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002559.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002565.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002565.png new file mode 100644 index 0000000000000000000000000000000000000000..92377258539854113d0b76538f3f10a48b8208b8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002565.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002571.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002571.png new file mode 100644 index 0000000000000000000000000000000000000000..415130a7c01252a9ebb0aad4eee04dcb925e7d07 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002571.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002767.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002767.png new file mode 100644 index 0000000000000000000000000000000000000000..93bf55c3182340b1fc9c0f0c39461372f732ff10 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002767.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002773.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002773.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe3b62f93e5d26aa990608b7c407aab73716450 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002773.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002798.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002798.png new file mode 100644 index 0000000000000000000000000000000000000000..e9482cc3878149dc9fa32cebbfa022e716ee20bb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002798.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002940.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002940.png new file mode 100644 index 0000000000000000000000000000000000000000..b84622eab79121942f14f9c2cbc6f2ac8d58d9c2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002940.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002954.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002954.png new file mode 100644 index 0000000000000000000000000000000000000000..61250ee151342aaf976d87e60479cfa03f3a6168 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002954.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002968.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002968.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa68e3ee2d136a47905c2e578250d9f530f66e5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002968.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002983.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002983.png new file mode 100644 index 0000000000000000000000000000000000000000..292a7f72deed5d0c518190bccbcfdf18d16e5539 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002983.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002997.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002997.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8acbff86fdb02df9698904a74540b86a2ab420 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00002997.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003041.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003041.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf23e72dc7bfa6c8684294bdaad7fa923286498 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003041.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003055.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003055.png new file mode 100644 index 0000000000000000000000000000000000000000..87b2059535f74cdbf35fecfc04e4e4d73f71fc25 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003055.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003082.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003082.png new file mode 100644 index 0000000000000000000000000000000000000000..590bb440eca6c0447496a975589204424965b7f4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003082.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003096.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003096.png new file mode 100644 index 0000000000000000000000000000000000000000..126eb9dcea25431fbc4145b2ce5be5a98b749f45 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003096.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003109.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003109.png new file mode 100644 index 0000000000000000000000000000000000000000..c8950225865ebada042caa776a3e3a813d21c49b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003109.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003121.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003121.png new file mode 100644 index 0000000000000000000000000000000000000000..a0df6736d4892aff5be50b630ea2aaca1ca924b8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003121.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003135.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003135.png new file mode 100644 index 0000000000000000000000000000000000000000..7b51208e496d1213ba44c2c4f29893b290cd5fa1 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003135.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003323.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003323.png new file mode 100644 index 0000000000000000000000000000000000000000..63297edbeec7c8accca4eb24ffbe6b122597cfa6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003323.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003337.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003337.png new file mode 100644 index 0000000000000000000000000000000000000000..01afe226f4c9db35b7393a93c38215bbc233a81a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003337.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003445.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003445.png new file mode 100644 index 0000000000000000000000000000000000000000..24882446806cdf2be390e432c26f977997e7e2d0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003445.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003451.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003451.png new file mode 100644 index 0000000000000000000000000000000000000000..3541e8360c01e25da76666cdd50edb3fdd90d1de Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003451.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003479.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003479.png new file mode 100644 index 0000000000000000000000000000000000000000..c7793c289e3c05f6df335540a1a79942b4020381 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003479.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003486.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003486.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9ba41802d02595a2a8b88ca0f923e633969ead Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003486.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003492.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003492.png new file mode 100644 index 0000000000000000000000000000000000000000..95148bedc51a4da196440fb7dc345598dc9e3213 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003492.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003647.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003647.png new file mode 100644 index 0000000000000000000000000000000000000000..d771b9c9c3288a95bc710f6a841416844ef98971 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003647.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003653.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003653.png new file mode 100644 index 0000000000000000000000000000000000000000..75a910ec72566ebc3724987723bef07d3c037edb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003653.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003684.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003684.png new file mode 100644 index 0000000000000000000000000000000000000000..8ef1ddf08cb343b994a70e934e3d9825ad928b62 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003684.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003690.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003690.png new file mode 100644 index 0000000000000000000000000000000000000000..4b95df6c6eb950ed3d8d5a06dba4f84b12e72391 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003690.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003727.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003727.png new file mode 100644 index 0000000000000000000000000000000000000000..ee8899810ca0e4f7d50f2e2b76edbaa6aa620265 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003727.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003733.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003733.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f50d9f05ad971120664a7e182a828e582825f5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003733.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003848.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003848.png new file mode 100644 index 0000000000000000000000000000000000000000..7bce1a16c32413fb6d33969a1e9fc6778add677a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003848.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003860.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003860.png new file mode 100644 index 0000000000000000000000000000000000000000..b35d2a236fad90e2c9accc6793a68953ad06d1d5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003860.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003874.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003874.png new file mode 100644 index 0000000000000000000000000000000000000000..35c24141c9c24af3089431081f82effdeb77c331 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003874.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003900.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003900.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f78349abd8daac8bcf17037cd2ac6c8bc83802 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003900.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003914.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003914.png new file mode 100644 index 0000000000000000000000000000000000000000..26ae2f6cb127d43f0edc49483efcd5776835989f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003914.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003928.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003928.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3a5eb66a7726deeb2d09ffc1f3c9950ec9c2b7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00003928.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004048.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004048.png new file mode 100644 index 0000000000000000000000000000000000000000..eb247f1a786e7db1e2c2915b56105d8799a3ef97 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004048.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004100.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004100.png new file mode 100644 index 0000000000000000000000000000000000000000..ab536ce95ac9bee3da09819728eac7f80fa79671 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004100.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004114.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004114.png new file mode 100644 index 0000000000000000000000000000000000000000..3cbeb82f33da2e48ed2c8287cd4df3f2845c0e01 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004114.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004128.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004128.png new file mode 100644 index 0000000000000000000000000000000000000000..4789ec5f5aad284822fec14a1cce944b1daf11ae Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004128.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004302.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004302.png new file mode 100644 index 0000000000000000000000000000000000000000..2aed4a19092b670a0c532b20364f578629eb6300 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004302.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004316.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004316.png new file mode 100644 index 0000000000000000000000000000000000000000..b72eeda747c69ae77a0728e8888935c8ce211856 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00004316.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006298.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006298.png new file mode 100644 index 0000000000000000000000000000000000000000..5da8cf03a09afa2dfa10b4797e7e206e50a942db Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006298.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006501.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006501.png new file mode 100644 index 0000000000000000000000000000000000000000..b17349ae49e69e7611c817e61f5b09715c96fb03 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006501.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006515.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006515.png new file mode 100644 index 0000000000000000000000000000000000000000..052fa6cebe67a402c848ebcf6a0c63842cf47aec Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006515.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006529.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006529.png new file mode 100644 index 0000000000000000000000000000000000000000..5b45ad24758933bc247b570f0bfa8a5a60afed46 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006529.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006688.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006688.png new file mode 100644 index 0000000000000000000000000000000000000000..13e45f2094eeb3b97bffc83104dbe8afed02ec95 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006688.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006703.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006703.png new file mode 100644 index 0000000000000000000000000000000000000000..cb57fd83245275facb8ce3d9dfee887a91e9b8cd Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006703.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006717.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006717.png new file mode 100644 index 0000000000000000000000000000000000000000..68c4af0b2a71416bf9eab783e925fe16b48e1bc0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006717.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006844.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006844.png new file mode 100644 index 0000000000000000000000000000000000000000..89bb9d7771e44e460e898b9093c0ae00d8839055 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006844.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006850.png b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006850.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a0e4d0a8f2ebce36bab5cd3cdb8c3ebc8214df Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/ann_dir/train/00006850.png differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/.DS_Store b/FoodSeg103/data/FoodSeg103/Images/img_dir/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2bf8d9712a348ca22b4fc05135fabfec19e91410 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/.DS_Store differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004458.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004458.jpg new file mode 100644 index 0000000000000000000000000000000000000000..908bdd82dfb6a456ac259d748a7c70499c742307 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004458.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004464.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004464.jpg new file mode 100644 index 0000000000000000000000000000000000000000..574fd1f9ea672c705f6333af3055b609e330df00 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004464.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004470.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004470.jpg new file mode 100644 index 0000000000000000000000000000000000000000..176acbfee17e048130d93958f3cc02bc16349fb6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004470.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004504.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004504.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb8f555f4a201db84508b9c662e3e629e2cec275 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004504.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004505.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004505.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9ee010a4f938459375f5b74e291efa2ba7fc5a55 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004505.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004510.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004510.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e708fce647eecb9e29c5c143722fd2046c1acb19 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004510.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004511.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004511.jpg new file mode 100644 index 0000000000000000000000000000000000000000..393a0f890183bb12f7535637d2f6a148f90bf507 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004511.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004538.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004538.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0e01d8dd17eafd1db7bf6b54dc590d8c315194b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004538.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004539.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004539.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c080a00b4e5930f3187c2453384f3899f5a58f3 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004539.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004666.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004666.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2fccd60c7d3900d7800c8fac4dd102a639aefdcc Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004666.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004672.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004672.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6134257e4b48ca55cd79bdfef9e2353c7d291079 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004672.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004699.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004699.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8413bf6e11a5e9a9e0137d0a0eea48378c97dfb0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004699.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004706.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004706.jpg new file mode 100644 index 0000000000000000000000000000000000000000..babd3dac188f16deaac30a73f660a10458d59b6a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004706.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004707.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004707.jpg new file mode 100644 index 0000000000000000000000000000000000000000..722f49fe4c9e11a1af58d70c2936ca032ebeb409 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004707.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004712.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004712.jpg new file mode 100644 index 0000000000000000000000000000000000000000..733cd32e3b4be7fae0f4d5a065d6ccd31d20ab6d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004712.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004713.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004713.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb2530faf0983f6efe42954f4cbc63fb307e3f4f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004713.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004841.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004841.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16f5350e17f27939570b82cdad2f5dbe943b8857 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004841.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004855.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004855.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a33e51b08af5208222dcae6391d374c80016f3c8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004855.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004869.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004869.jpg new file mode 100644 index 0000000000000000000000000000000000000000..513f0194b6a0feae59beda2d9eaf9f5190343d4b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004869.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004882.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004882.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a22e57e0989fb7b82d618fae99d0fe0f637afa3 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004882.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004896.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004896.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b87ade391366f4aa1a449fee68413eabf1042e2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004896.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004908.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004908.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ce92d8af033c19c373b90f2cc6f26fbe611d85c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004908.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004909.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004909.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4a0754aa0ae7b09cc05412d283e61d78b4e48f2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004909.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004920.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004920.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1caa2c9bf574a1242e01520cf1546688f12fa500 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004920.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004921.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004921.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e60e08e50830cedea3f3a2d30019cc1a040927e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004921.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004934.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004934.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c36dd7d22d1d7716264fc0bd50a1a19436d7f65 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004934.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004935.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004935.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dabc039c2e47b91ca5966dab1b248497c50bb846 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00004935.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005008.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005008.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b28c133ef15ed2fe5dd74db8dab3317afafae237 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005008.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005020.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005020.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de519062ed77ea6e6c2d45630a41f5e732ff0f55 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005020.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005034.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005034.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df9fe4f022728d9bdf7ef9ffda43081db4c8d182 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005034.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005140.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005140.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80d722ad67a5edc82469adbe11223d1435570771 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005140.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005154.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005154.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9ffcc0d20e0f21629fd68e30c56390f47cad3e5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005154.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005168.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005168.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62fb0107cf1513a9af9bdf1abd312dbcc1182830 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005168.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005169.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005169.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b13f6c6db541fe515af2ab5151da758ce016faf Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005169.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005182.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005182.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a8efebf288d5fd13d7ff4a7cdcc89901b32212b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005182.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005183.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005183.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cc38e69f1ab4d2fb51e442d9a2e95fe01b6a559c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005183.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005196.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005196.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1dbb73d3118604dc8fa7429ee5190196198e12cd Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005196.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005197.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005197.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0aeab575228988ad3ed960afd991d589bf4f9bf4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005197.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005222.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005222.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea96aec355d056672b7326473a8545b99ea07677 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005222.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005236.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005236.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2569caa5118695180fb1dcea9fb99791dce9e12 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005236.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005342.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005342.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9bd0fe8394a4bc7968599d2260b65656bf1b17a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005342.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005343.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005343.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d473912b5d94ab62f496ea170741ef4cf804a3d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005343.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005356.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005356.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70640c90446460fec42db69424aa4341aa07a3e5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005356.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005357.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005357.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf8a4d308d5e730991c01953b7525b165b1f3dc9 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005357.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005380.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005380.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7210d0ecf851ee03d18d6ed9a3e4e64814c27160 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005380.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005381.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005381.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa5e7078d31bca51c2aaab64eb8fef66264f753b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005381.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005394.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005394.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ae3b2866bcb8c2d5ed9a03188e59c71fb93eddb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005394.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005395.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005395.jpg new file mode 100644 index 0000000000000000000000000000000000000000..750222a875c85e249a0a84598bb286a594cc6027 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005395.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005418.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005418.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8842035ff465b9134029c9f12e85ec2431865b16 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005418.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005419.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005419.jpg new file mode 100644 index 0000000000000000000000000000000000000000..310af9f5423b1e4b23c2f5cb159f344ef3800ec7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005419.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005424.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005424.jpg new file mode 100644 index 0000000000000000000000000000000000000000..78969221385dd130765b072a8dedaee9ea13893c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005424.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005425.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005425.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40d8b2cb9bafac3d2801c02eda5cd1ea188c4644 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005425.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005430.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005430.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a84d519fd770dac82671b36cd5b3306f543d6f9a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005430.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005431.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005431.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f58fa4f0d7c680112955e69845132754a19018be Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005431.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005544.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005544.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da21f3d1efdf72bb57b328a4e8ebbd45039a963a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005544.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005550.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005550.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0822cbe2af313027d845eb618dbf6dfaa0b20bdd Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005550.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005578.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005578.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cfa894be723fc81a438743b4360c8b5fb764fa1f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005578.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005587.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005587.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4cb6ef8fd70e2acdbb0f23018a2f9b396e8bd031 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005587.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005593.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005593.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23a814fb71e60b3d6ba1bcfa39fe6df3a1df5d4d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005593.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005626.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005626.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bea2bd4055e2ddc33a307def25efca3fbad40d33 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005626.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005627.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005627.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e704cc59d43192aa7c882d3ca7f699ef31ee35a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005627.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005632.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005632.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94b8b6e9d3265cad34c8a80a25176a21440f71df Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005632.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005746.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005746.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc82f63c09537b95d85826f6db654b0f078a47a0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005746.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005752.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005752.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0d6c13e3930dcf556aa88e43dc851917a3ad21e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005752.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005785.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005785.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f20e2a9711d21e18d85b568f0ee37f841731e15f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005785.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005791.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005791.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b806311915ac92725b30ba5a781ed75c26f11c5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005791.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005800.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005800.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ad9e31326be41fba48a2b985cc00aaa742495b8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005800.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005801.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005801.jpg new file mode 100644 index 0000000000000000000000000000000000000000..63c732cc6bfd699bd67c8fd63f2e028f1e4c04d8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005801.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005814.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005814.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a03814fa8e7af8db37253355479a2517446aa77 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005814.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005815.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005815.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34f036734de7876f33a3d9818e65768badf24caf Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005815.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005828.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005828.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9cd8bc9b00a4a805910e3f8edda24607025bcbf Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005828.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005829.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005829.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89286beb6bc4f00999a2ec7409be8e26ec32413c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005829.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005949.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005949.jpg new file mode 100644 index 0000000000000000000000000000000000000000..abcbcf25aa0947d1c6796be1d69dc89ad4a35a10 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005949.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005961.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005961.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2ae8d9c5443702469e54da9f987c674ccc2d773 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005961.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005975.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005975.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a4282c56cef6a26ea30086a0977d98fbf639efe Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00005975.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006059.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006059.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aef5cd86f17428173062c7ae5a0f65b2d1310571 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006059.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006065.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006065.jpg new file mode 100644 index 0000000000000000000000000000000000000000..367f994907e484e35cb0ac2bca884608edebd25d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006065.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006071.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006071.jpg new file mode 100644 index 0000000000000000000000000000000000000000..157512e20a9441e6500fe2b15957f765352086d8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006071.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006104.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006104.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4ab2e58755576350428703358ef688f5ac9fb07 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006104.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006105.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006105.jpg new file mode 100644 index 0000000000000000000000000000000000000000..273627b495ad84b9015104a546027593393796f7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006105.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006110.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006110.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3489f548125afc90920aabcd95afcffeaf247c3 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006110.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006111.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006111.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92d1b8b6ca4b2dd092a87c92ff1b7100356e29c3 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006111.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006138.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006138.jpg new file mode 100644 index 0000000000000000000000000000000000000000..88455cf42cd9bafd4d54784eda445d8ca60c1a5e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006138.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006139.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006139.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b01a2eb9820917c913b95df5c2257930e3a082d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006139.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006267.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006267.jpg new file mode 100644 index 0000000000000000000000000000000000000000..532f411a03b8218f9c213fff8d152cc28262ace4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006267.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006273.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006273.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a34c8fd1be474015eb641adb00a337a45d6cb875 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006273.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006878.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006878.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a1305a4c4ca51d885a6695d33017d9487a81f85 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006878.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006879.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006879.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c28e248331b9dd3aadcda551f0982882541402b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006879.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006886.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006886.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8429779babc71021db32b863e51d3b53a4f640f7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006886.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006887.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006887.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cda7bcbb296be4df301c2124ad2c7360cba1017 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006887.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006892.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006892.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c19611d015958e5254a78f7d2c164253acbda5f0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006892.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006893.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006893.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4123c73e7bc4b8bf4f7c9d60f6292be83da26b1 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006893.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006918.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006918.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c246c9436f2c15090f516733da955c779ea9c49a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006918.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006924.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006924.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79eedc62b13a5ed43e450fe496bdcdd0209bc5a5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006924.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006930.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006930.jpg new file mode 100644 index 0000000000000000000000000000000000000000..700607d3fdac036cbe5e8b5a7c9fbd6c369705cb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00006930.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007018.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007018.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f72dfb86128070e7629acc930173bbba05f919b7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007018.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007019.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007019.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb53a2d3cefb471db58b3c949dc5fb0469def94c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007019.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007025.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007025.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75a3d8cc363db70a8b6e20db285e97160447fafd Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007025.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007030.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007030.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2c30150f34a4cdfb86579bc876843100782fb4d Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007030.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007031.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007031.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1bc67d2b1d09bcf09eda32a48db93712fc5cfbe8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/test/00007031.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000010.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000010.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1e7b88ff2926a79c45538619d849bab65e1c76e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000010.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000038.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000038.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5889a4284f1eaceb5534d460c29dad1f7c5a0d00 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000038.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000158.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000158.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39e14918cc1a45510e97ee4e50a3f5ea5789446f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000158.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000164.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000164.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9ba5fcedd44043e50b7f2c9e41d542de5656df9e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000164.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000170.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000170.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a39a958b05dec4c52bca95bb6b11d636c0a89c13 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000170.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000366.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000366.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e445864c49476c33f776469b2cd498af8cffbdf3 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000366.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000372.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000372.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a483e01c93d2b99859d92a7a6efdede4a00bcdb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000372.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000399.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000399.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04cfa9abb5e59fa8b7a801ba2f12ef7b4b9f9c65 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000399.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3680fdc77094d22c58fd0295e0681a9346a8d7d16f89a617546cdccd3b8f3b38 +size 1630029 diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000400.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000400.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e62b2a87495b2ed41817b22a0af7bfc8378835e2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000400.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000414.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000414.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fcf3c7e09bf63248f6963c9104fbed449652c3f2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000414.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000428.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000428.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57c2d9034e51ec41532b79a2cba3ed8bf86541b0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000428.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000602.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000602.jpg new file mode 100644 index 0000000000000000000000000000000000000000..998103a84d45ae1b2e95a74c0151fc2451e75e5f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000602.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000616.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000616.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ac6671abdd0f20782a4d9f0128f3095bf9ca0fe Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000616.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000762.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000762.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6dc491c070b1ac1cc5e7486fcec66d670f461327 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000762.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000776.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000776.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd40c32f7e527a9c942163d3b1b7af367ccb9b7a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000776.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000819.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000819.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb524278d5a7c0b5c749a5c484b0c2ea27d893da Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000819.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000825.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000825.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b76dbdcb3aebc9626099a11ff3132faac5343be Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000825.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000831.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000831.jpg new file mode 100644 index 0000000000000000000000000000000000000000..248d87be0ad18f95bab5d57861ef9aeb10cdcdeb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000831.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000986.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000986.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c932071909ec1c3ba4fc31f9f260aa7c4bc0061b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000986.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000992.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000992.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60f35fc0a14ef682cc19670d3e80deb607f42fe7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00000992.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001044.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001044.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cfe1c0ec0046d289c71d370cb98fd6c66d815a48 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001044.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001050.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001050.jpg new file mode 100644 index 0000000000000000000000000000000000000000..949b0a73d9c68e5f40a84355edf3cd5d6399245f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001050.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001078.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001078.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db90cc9d924cc25ea92a3ddd6806cce4497cc18c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001078.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001087.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001087.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8788616f92198f9085afba718abfae8b96103c3f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001087.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001093.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001093.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8fe354c0fb891ba12d11220a5dba2f48446e04d3 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001093.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001246.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001246.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d78e755848d3eb9fae01c90d041e5cbc5fc7439e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001246.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001252.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001252.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d76d8ef3f20aaa8ee789bdfe94170895b969491c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001252.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001285.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001285.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb9861e7c8a8ebb552427b226ddb5c1bc4926af6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001285.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001291.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001291.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6cc499f5e1aa6fd7c71ce0effcebd380c5bc424c Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001291.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001326.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001326.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c2734caa4fe9aeab944692d4a0199162c4f58b5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001326.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001332.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001332.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c062282ba8826b7f7fe6553e5c0f6179e47947e1 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001332.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001440.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001440.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc8fe5c67a6abbb476be595c2208ba03a366426e Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001440.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001454.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001454.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83c1211ed9ad485053ceb6a2f187e67ba9c6d6c4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001454.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001468.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001468.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3671c61d60084d82217b654fd42f40391af8a3f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001468.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001508.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001508.jpg new file mode 100644 index 0000000000000000000000000000000000000000..059d777de35d19837bd785af3d5e36dea388558b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001508.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001520.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001520.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65a8b08716b219d96a3f4b2440920ec5b0436714 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001520.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12847a7a556a7764749df4179558e7934bd5c86cb6e65bd41660e278799532fd +size 3515605 diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001534.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001534.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22c043935abb0364773d12ad4cd7fd74b7b6cc6a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001534.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001722.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001722.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c138b25b2ee6ec411cc3c55b2433268df747ca8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001722.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001736.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001736.jpg new file mode 100644 index 0000000000000000000000000000000000000000..581d9441b6617882d8974737ee7b1c248795b04f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001736.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001905.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001905.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30a060d21c76901a171e13e5b19c621bcbdd9bfa --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001905.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:617f201a7fd0330814737e57ea0849578548cf929fefad091ac3c943e1ac95c5 +size 1330618 diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001911.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001911.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f94db960e5b2124e2d644d9bc87226e07a23094 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001911.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001939.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001939.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d6101c12d0de8606e51442b139123017867aafb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00001939.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002001.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd976abc2aa504ccc514abbf0e52b44ae4186cc9 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002001.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002015.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002015.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d6e6d04138ada873df877271428b4c480d801208 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002015.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002029.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002029.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c26c8511f48db3e9a8c1b97baf453c33925f3387 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002029.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002149.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002149.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3322fdc81e319a618774de6c22e08f59549b9e19 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002149.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002161.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd7a9d7761ca155878f4e727fe4ca58d82a0037a Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002161.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002175.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002175.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e646c5d87ab73582b13127ae7ee26a7b66318fb3 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002175.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002203.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002203.jpg new file mode 100644 index 0000000000000000000000000000000000000000..59ad77f413736c86d75f2f6d90fda7db6791b10f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002203.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002217.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002217.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a148747fba1c1bc72697bc7013751e5820c8f7b Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002217.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002559.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002559.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c74727eeccbcbdfc36a4139890851a3ea604ba45 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002559.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81cdba332381550f7cf74084a6cbe8c60afa7506c2053d257573c87c065f82f2 +size 1218352 diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002565.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002565.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07c8028a356552a4a42a9af8ac6039b826d91ec7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002565.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002571.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002571.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a505b9665d86cd68ddef822ca170d84dea3eb02 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002571.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002607.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002607.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7074c5ae975267b3ce8c891c99d0a8e443287536 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002607.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002767.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002767.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ddb87196a9f087098478fd060abeeff51bfb5b79 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002767.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002773.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002773.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b55cec9128097093bd0cac481e6fb7ffcddfe88 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002773.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002798.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002798.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b499acc2d4843fc7f13fa226625e49f81af9c2fa Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002798.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002940.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002940.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c51d36e16067053140b289ee6912826f27613c2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002940.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002954.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002954.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f88a696542c8c3bc572e4d6e56e9ba6e3251fd41 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002954.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002968.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002968.jpg new file mode 100644 index 0000000000000000000000000000000000000000..091bd93570f4571cb42a63ac05df416a5b3ccc60 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002968.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002983.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002983.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a69fcc0a33087aab907fcbe81e718eba37591f48 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002983.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002997.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002997.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b920f2910e0e4fc9ddb482719e84924d8dee81c8 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00002997.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003109.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003109.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fbd458d027f357864b1492b13fad4605bcc11641 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003109.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003121.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003121.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77ecd467cfb7c12163eb26a4d4402c559092aba6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003121.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003135.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003135.jpg new file mode 100644 index 0000000000000000000000000000000000000000..830cbc0a1efeaa1c2537f2a4d886a37c44e69c42 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003135.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003243.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003243.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58325bfd57fbf0db0e07899bad76d2cabe374dde Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003243.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003257.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003257.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4bbe86baf7ac7b5a5befbaca4dab649aecab300 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003257.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003323.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003323.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4224a58c34517d99046f3f1c07373279f4802dbb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003323.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003337.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003337.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d43ac492c890321c5462c3c5b7b2ef90662c90e --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003337.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:298d7aca68117c8e716cda756092169d48ff8f092d11461a40de51b7ba0db795 +size 1195363 diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003445.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003445.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c47dfa832102ee87584eb8b10bae2df14ab7d989 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003445.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003451.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003451.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cf92fdbd5190c5901e45a3cba6af57bcd22510f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003451.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003479.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003479.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3bd2dd8136638224991914ea79635ecd1a2dc541 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003479.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003486.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003486.jpg new file mode 100644 index 0000000000000000000000000000000000000000..944ab4d8481b5f481ca45491c473cf9ccad45975 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003486.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003492.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003492.jpg new file mode 100644 index 0000000000000000000000000000000000000000..add60d74fba0bf03eb4374186729c435023eea23 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003492.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003519.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003519.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f5bca1f026094a6552bcc40c64e8b3baa41b4a60 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003519.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003525.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003525.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f9c09f1861b9e36f05696a8040f37aa99bd7047 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003525.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003531.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003531.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fda39736b722b5ea5f3463cfa665fd609b3c0c4 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003531.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003647.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003647.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e12278dddffa8ad5151710d9eb905922967537bb Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003647.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003653.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003653.jpg new file mode 100644 index 0000000000000000000000000000000000000000..531298d54219a1391f36c7fcd6d5c12db10e5eca Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003653.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003684.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003684.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e056b1e2bcf94e56049ad31088f0beb25f555a8f Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003684.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003690.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003690.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b86b60f62a2e552aa3bc42d3cba1089f062a5d75 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003690.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003848.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003848.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf39b5008b77d9f242849a120a40b7cb2d3375c0 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003848.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003860.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003860.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f528e81320ed6591a5d1aaf48e3deec6394265f7 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003860.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003874.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003874.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91bcea0166cfc20f89c15cacbcdb65993235fb40 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00003874.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004100.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004100.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e5932c93d9772af127344c6ca6248233db41899 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004100.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004114.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004114.jpg new file mode 100644 index 0000000000000000000000000000000000000000..781986e0d5b315cb2ec6c267f43c07389ca906e6 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004114.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4c2deacd7304b964d4345e56abe7981d7b4fa990466897dcdfeccba375fbd7c +size 1304924 diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004128.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004128.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d1ebd14b30e7678238f18b85dd149db8eb052e5 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004128.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004276.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004276.jpg new file mode 100644 index 0000000000000000000000000000000000000000..145f83022acabeb612b2ebff30e805ed294968a6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004276.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004302.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004302.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87b9f213c9ddb06018b57ecdf2c70624fcb77b72 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004302.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004316.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004316.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f1831b1da772fc84bad892e1dd6413281978bec Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00004316.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006298.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006298.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8777f7db56ea38456706eb72527da7dd74867638 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006298.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006307.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006307.jpg new file mode 100644 index 0000000000000000000000000000000000000000..88678f33fa0934731379e27e4a1c124fb2736b18 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006307.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8d28713c834f415665769084f17ee3f3c6857b131cb5455bebd6a5c37cf1f92 +size 1212646 diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006313.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006313.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a33b4d279028bff1b764fe016d8d84bdb996bd64 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006313.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006449.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006449.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6aa1401f83dc3b03959116e1a0052735594462c6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006449.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006461.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006461.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a46c697f8a56eacdb457869ab099ab3034380d6 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006461.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006501.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006501.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a8ab011604996f4049d2ce0b69634bd521bb492 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006501.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006515.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006515.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f04f8471063295736b7d47e005e517e7230e008 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006515.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006529.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006529.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f671f248b2c51d0ff2e0d4a762eddda973cdbdad Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006529.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006703.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006703.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2aa040e83b71afea26f6fcd4b6e4dc4572086459 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006703.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006717.jpg b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006717.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55054500c0a56de9cf36809859abaf090b0144c2 Binary files /dev/null and b/FoodSeg103/data/FoodSeg103/Images/img_dir/train/00006717.jpg differ diff --git a/FoodSeg103/data/FoodSeg103/Readme.txt b/FoodSeg103/data/FoodSeg103/Readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..664e0807510b84280162dfee0fc37d1190d5889d --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/Readme.txt @@ -0,0 +1,17 @@ +``ImageSets'' folder, store the image ids of train and test sets of FoodSeg103: + - train.txt + - test.txt + +``Images'' folder, contains the raw images and masks: + - img_dir + - train + - test + - ann_dir + - train + - test + +category_id.txt: store the category ids and names + +test_recipe1m_id.txt, train_test_recipe1m_id.txt: store the original image ids in Recipe1M dataset of FoodSeg103. You may explore more information based on these original image ids & recipe information in Recipe1M. + +(NOTE: There are some images in the list we do not use in the final FoodSeg103.) \ No newline at end of file diff --git a/FoodSeg103/data/FoodSeg103/category_id(old).txt b/FoodSeg103/data/FoodSeg103/category_id(old).txt new file mode 100644 index 0000000000000000000000000000000000000000..1b5a5c02a4a2bcb73968f8348253af7a1ecfce80 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/category_id(old).txt @@ -0,0 +1 @@ +['backbone.patch_embed.proj.weight', 'backbone.patch_embed.proj.bias', 'backbone.patch_embed.norm.weight', 'backbone.patch_embed.norm.bias', 'backbone.layers.0.blocks.0.norm1.weight', 'backbone.layers.0.blocks.0.norm1.bias', 'backbone.layers.0.blocks.0.attn.relative_position_bias_table', 'backbone.layers.0.blocks.0.attn.relative_position_index', 'backbone.layers.0.blocks.0.attn.qkv.weight', 'backbone.layers.0.blocks.0.attn.qkv.bias', 'backbone.layers.0.blocks.0.attn.proj.weight', 'backbone.layers.0.blocks.0.attn.proj.bias', 'backbone.layers.0.blocks.0.norm2.weight', 'backbone.layers.0.blocks.0.norm2.bias', 'backbone.layers.0.blocks.0.mlp.fc1.weight', 'backbone.layers.0.blocks.0.mlp.fc1.bias', 'backbone.layers.0.blocks.0.mlp.fc2.weight', 'backbone.layers.0.blocks.0.mlp.fc2.bias', 'backbone.layers.0.blocks.1.norm1.weight', 'backbone.layers.0.blocks.1.norm1.bias', 'backbone.layers.0.blocks.1.attn.relative_position_bias_table', 'backbone.layers.0.blocks.1.attn.relative_position_index', 'backbone.layers.0.blocks.1.attn.qkv.weight', 'backbone.layers.0.blocks.1.attn.qkv.bias', 'backbone.layers.0.blocks.1.attn.proj.weight', 'backbone.layers.0.blocks.1.attn.proj.bias', 'backbone.layers.0.blocks.1.norm2.weight', 'backbone.layers.0.blocks.1.norm2.bias', 'backbone.layers.0.blocks.1.mlp.fc1.weight', 'backbone.layers.0.blocks.1.mlp.fc1.bias', 'backbone.layers.0.blocks.1.mlp.fc2.weight', 'backbone.layers.0.blocks.1.mlp.fc2.bias', 'backbone.layers.0.downsample.reduction.weight', 'backbone.layers.0.downsample.norm.weight', 'backbone.layers.0.downsample.norm.bias', 'backbone.layers.1.blocks.0.norm1.weight', 'backbone.layers.1.blocks.0.norm1.bias', 'backbone.layers.1.blocks.0.attn.relative_position_bias_table', 'backbone.layers.1.blocks.0.attn.relative_position_index', 'backbone.layers.1.blocks.0.attn.qkv.weight', 'backbone.layers.1.blocks.0.attn.qkv.bias', 'backbone.layers.1.blocks.0.attn.proj.weight', 'backbone.layers.1.blocks.0.attn.proj.bias', 'backbone.layers.1.blocks.0.norm2.weight', 'backbone.layers.1.blocks.0.norm2.bias', 'backbone.layers.1.blocks.0.mlp.fc1.weight', 'backbone.layers.1.blocks.0.mlp.fc1.bias', 'backbone.layers.1.blocks.0.mlp.fc2.weight', 'backbone.layers.1.blocks.0.mlp.fc2.bias', 'backbone.layers.1.blocks.1.norm1.weight', 'backbone.layers.1.blocks.1.norm1.bias', 'backbone.layers.1.blocks.1.attn.relative_position_bias_table', 'backbone.layers.1.blocks.1.attn.relative_position_index', 'backbone.layers.1.blocks.1.attn.qkv.weight', 'backbone.layers.1.blocks.1.attn.qkv.bias', 'backbone.layers.1.blocks.1.attn.proj.weight', 'backbone.layers.1.blocks.1.attn.proj.bias', 'backbone.layers.1.blocks.1.norm2.weight', 'backbone.layers.1.blocks.1.norm2.bias', 'backbone.layers.1.blocks.1.mlp.fc1.weight', 'backbone.layers.1.blocks.1.mlp.fc1.bias', 'backbone.layers.1.blocks.1.mlp.fc2.weight', 'backbone.layers.1.blocks.1.mlp.fc2.bias', 'backbone.layers.1.downsample.reduction.weight', 'backbone.layers.1.downsample.norm.weight', 'backbone.layers.1.downsample.norm.bias', 'backbone.layers.2.blocks.0.norm1.weight', 'backbone.layers.2.blocks.0.norm1.bias', 'backbone.layers.2.blocks.0.attn.relative_position_bias_table', 'backbone.layers.2.blocks.0.attn.relative_position_index', 'backbone.layers.2.blocks.0.attn.qkv.weight', 'backbone.layers.2.blocks.0.attn.qkv.bias', 'backbone.layers.2.blocks.0.attn.proj.weight', 'backbone.layers.2.blocks.0.attn.proj.bias', 'backbone.layers.2.blocks.0.norm2.weight', 'backbone.layers.2.blocks.0.norm2.bias', 'backbone.layers.2.blocks.0.mlp.fc1.weight', 'backbone.layers.2.blocks.0.mlp.fc1.bias', 'backbone.layers.2.blocks.0.mlp.fc2.weight', 'backbone.layers.2.blocks.0.mlp.fc2.bias', 'backbone.layers.2.blocks.1.norm1.weight', 'backbone.layers.2.blocks.1.norm1.bias', 'backbone.layers.2.blocks.1.attn.relative_position_bias_table', 'backbone.layers.2.blocks.1.attn.relative_position_index', 'backbone.layers.2.blocks.1.attn.qkv.weight', 'backbone.layers.2.blocks.1.attn.qkv.bias', 'backbone.layers.2.blocks.1.attn.proj.weight', 'backbone.layers.2.blocks.1.attn.proj.bias', 'backbone.layers.2.blocks.1.norm2.weight', 'backbone.layers.2.blocks.1.norm2.bias', 'backbone.layers.2.blocks.1.mlp.fc1.weight', 'backbone.layers.2.blocks.1.mlp.fc1.bias', 'backbone.layers.2.blocks.1.mlp.fc2.weight', 'backbone.layers.2.blocks.1.mlp.fc2.bias', 'backbone.layers.2.blocks.2.norm1.weight', 'backbone.layers.2.blocks.2.norm1.bias', 'backbone.layers.2.blocks.2.attn.relative_position_bias_table', 'backbone.layers.2.blocks.2.attn.relative_position_index', 'backbone.layers.2.blocks.2.attn.qkv.weight', 'backbone.layers.2.blocks.2.attn.qkv.bias', 'backbone.layers.2.blocks.2.attn.proj.weight', 'backbone.layers.2.blocks.2.attn.proj.bias', 'backbone.layers.2.blocks.2.norm2.weight', 'backbone.layers.2.blocks.2.norm2.bias', 'backbone.layers.2.blocks.2.mlp.fc1.weight', 'backbone.layers.2.blocks.2.mlp.fc1.bias', 'backbone.layers.2.blocks.2.mlp.fc2.weight', 'backbone.layers.2.blocks.2.mlp.fc2.bias', 'backbone.layers.2.blocks.3.norm1.weight', 'backbone.layers.2.blocks.3.norm1.bias', 'backbone.layers.2.blocks.3.attn.relative_position_bias_table', 'backbone.layers.2.blocks.3.attn.relative_position_index', 'backbone.layers.2.blocks.3.attn.qkv.weight', 'backbone.layers.2.blocks.3.attn.qkv.bias', 'backbone.layers.2.blocks.3.attn.proj.weight', 'backbone.layers.2.blocks.3.attn.proj.bias', 'backbone.layers.2.blocks.3.norm2.weight', 'backbone.layers.2.blocks.3.norm2.bias', 'backbone.layers.2.blocks.3.mlp.fc1.weight', 'backbone.layers.2.blocks.3.mlp.fc1.bias', 'backbone.layers.2.blocks.3.mlp.fc2.weight', 'backbone.layers.2.blocks.3.mlp.fc2.bias', 'backbone.layers.2.blocks.4.norm1.weight', 'backbone.layers.2.blocks.4.norm1.bias', 'backbone.layers.2.blocks.4.attn.relative_position_bias_table', 'backbone.layers.2.blocks.4.attn.relative_position_index', 'backbone.layers.2.blocks.4.attn.qkv.weight', 'backbone.layers.2.blocks.4.attn.qkv.bias', 'backbone.layers.2.blocks.4.attn.proj.weight', 'backbone.layers.2.blocks.4.attn.proj.bias', 'backbone.layers.2.blocks.4.norm2.weight', 'backbone.layers.2.blocks.4.norm2.bias', 'backbone.layers.2.blocks.4.mlp.fc1.weight', 'backbone.layers.2.blocks.4.mlp.fc1.bias', 'backbone.layers.2.blocks.4.mlp.fc2.weight', 'backbone.layers.2.blocks.4.mlp.fc2.bias', 'backbone.layers.2.blocks.5.norm1.weight', 'backbone.layers.2.blocks.5.norm1.bias', 'backbone.layers.2.blocks.5.attn.relative_position_bias_table', 'backbone.layers.2.blocks.5.attn.relative_position_index', 'backbone.layers.2.blocks.5.attn.qkv.weight', 'backbone.layers.2.blocks.5.attn.qkv.bias', 'backbone.layers.2.blocks.5.attn.proj.weight', 'backbone.layers.2.blocks.5.attn.proj.bias', 'backbone.layers.2.blocks.5.norm2.weight', 'backbone.layers.2.blocks.5.norm2.bias', 'backbone.layers.2.blocks.5.mlp.fc1.weight', 'backbone.layers.2.blocks.5.mlp.fc1.bias', 'backbone.layers.2.blocks.5.mlp.fc2.weight', 'backbone.layers.2.blocks.5.mlp.fc2.bias', 'backbone.layers.2.blocks.6.norm1.weight', 'backbone.layers.2.blocks.6.norm1.bias', 'backbone.layers.2.blocks.6.attn.relative_position_bias_table', 'backbone.layers.2.blocks.6.attn.relative_position_index', 'backbone.layers.2.blocks.6.attn.qkv.weight', 'backbone.layers.2.blocks.6.attn.qkv.bias', 'backbone.layers.2.blocks.6.attn.proj.weight', 'backbone.layers.2.blocks.6.attn.proj.bias', 'backbone.layers.2.blocks.6.norm2.weight', 'backbone.layers.2.blocks.6.norm2.bias', 'backbone.layers.2.blocks.6.mlp.fc1.weight', 'backbone.layers.2.blocks.6.mlp.fc1.bias', 'backbone.layers.2.blocks.6.mlp.fc2.weight', 'backbone.layers.2.blocks.6.mlp.fc2.bias', 'backbone.layers.2.blocks.7.norm1.weight', 'backbone.layers.2.blocks.7.norm1.bias', 'backbone.layers.2.blocks.7.attn.relative_position_bias_table', 'backbone.layers.2.blocks.7.attn.relative_position_index', 'backbone.layers.2.blocks.7.attn.qkv.weight', 'backbone.layers.2.blocks.7.attn.qkv.bias', 'backbone.layers.2.blocks.7.attn.proj.weight', 'backbone.layers.2.blocks.7.attn.proj.bias', 'backbone.layers.2.blocks.7.norm2.weight', 'backbone.layers.2.blocks.7.norm2.bias', 'backbone.layers.2.blocks.7.mlp.fc1.weight', 'backbone.layers.2.blocks.7.mlp.fc1.bias', 'backbone.layers.2.blocks.7.mlp.fc2.weight', 'backbone.layers.2.blocks.7.mlp.fc2.bias', 'backbone.layers.2.blocks.8.norm1.weight', 'backbone.layers.2.blocks.8.norm1.bias', 'backbone.layers.2.blocks.8.attn.relative_position_bias_table', 'backbone.layers.2.blocks.8.attn.relative_position_index', 'backbone.layers.2.blocks.8.attn.qkv.weight', 'backbone.layers.2.blocks.8.attn.qkv.bias', 'backbone.layers.2.blocks.8.attn.proj.weight', 'backbone.layers.2.blocks.8.attn.proj.bias', 'backbone.layers.2.blocks.8.norm2.weight', 'backbone.layers.2.blocks.8.norm2.bias', 'backbone.layers.2.blocks.8.mlp.fc1.weight', 'backbone.layers.2.blocks.8.mlp.fc1.bias', 'backbone.layers.2.blocks.8.mlp.fc2.weight', 'backbone.layers.2.blocks.8.mlp.fc2.bias', 'backbone.layers.2.blocks.9.norm1.weight', 'backbone.layers.2.blocks.9.norm1.bias', 'backbone.layers.2.blocks.9.attn.relative_position_bias_table', 'backbone.layers.2.blocks.9.attn.relative_position_index', 'backbone.layers.2.blocks.9.attn.qkv.weight', 'backbone.layers.2.blocks.9.attn.qkv.bias', 'backbone.layers.2.blocks.9.attn.proj.weight', 'backbone.layers.2.blocks.9.attn.proj.bias', 'backbone.layers.2.blocks.9.norm2.weight', 'backbone.layers.2.blocks.9.norm2.bias', 'backbone.layers.2.blocks.9.mlp.fc1.weight', 'backbone.layers.2.blocks.9.mlp.fc1.bias', 'backbone.layers.2.blocks.9.mlp.fc2.weight', 'backbone.layers.2.blocks.9.mlp.fc2.bias', 'backbone.layers.2.blocks.10.norm1.weight', 'backbone.layers.2.blocks.10.norm1.bias', 'backbone.layers.2.blocks.10.attn.relative_position_bias_table', 'backbone.layers.2.blocks.10.attn.relative_position_index', 'backbone.layers.2.blocks.10.attn.qkv.weight', 'backbone.layers.2.blocks.10.attn.qkv.bias', 'backbone.layers.2.blocks.10.attn.proj.weight', 'backbone.layers.2.blocks.10.attn.proj.bias', 'backbone.layers.2.blocks.10.norm2.weight', 'backbone.layers.2.blocks.10.norm2.bias', 'backbone.layers.2.blocks.10.mlp.fc1.weight', 'backbone.layers.2.blocks.10.mlp.fc1.bias', 'backbone.layers.2.blocks.10.mlp.fc2.weight', 'backbone.layers.2.blocks.10.mlp.fc2.bias', 'backbone.layers.2.blocks.11.norm1.weight', 'backbone.layers.2.blocks.11.norm1.bias', 'backbone.layers.2.blocks.11.attn.relative_position_bias_table', 'backbone.layers.2.blocks.11.attn.relative_position_index', 'backbone.layers.2.blocks.11.attn.qkv.weight', 'backbone.layers.2.blocks.11.attn.qkv.bias', 'backbone.layers.2.blocks.11.attn.proj.weight', 'backbone.layers.2.blocks.11.attn.proj.bias', 'backbone.layers.2.blocks.11.norm2.weight', 'backbone.layers.2.blocks.11.norm2.bias', 'backbone.layers.2.blocks.11.mlp.fc1.weight', 'backbone.layers.2.blocks.11.mlp.fc1.bias', 'backbone.layers.2.blocks.11.mlp.fc2.weight', 'backbone.layers.2.blocks.11.mlp.fc2.bias', 'backbone.layers.2.blocks.12.norm1.weight', 'backbone.layers.2.blocks.12.norm1.bias', 'backbone.layers.2.blocks.12.attn.relative_position_bias_table', 'backbone.layers.2.blocks.12.attn.relative_position_index', 'backbone.layers.2.blocks.12.attn.qkv.weight', 'backbone.layers.2.blocks.12.attn.qkv.bias', 'backbone.layers.2.blocks.12.attn.proj.weight', 'backbone.layers.2.blocks.12.attn.proj.bias', 'backbone.layers.2.blocks.12.norm2.weight', 'backbone.layers.2.blocks.12.norm2.bias', 'backbone.layers.2.blocks.12.mlp.fc1.weight', 'backbone.layers.2.blocks.12.mlp.fc1.bias', 'backbone.layers.2.blocks.12.mlp.fc2.weight', 'backbone.layers.2.blocks.12.mlp.fc2.bias', 'backbone.layers.2.blocks.13.norm1.weight', 'backbone.layers.2.blocks.13.norm1.bias', 'backbone.layers.2.blocks.13.attn.relative_position_bias_table', 'backbone.layers.2.blocks.13.attn.relative_position_index', 'backbone.layers.2.blocks.13.attn.qkv.weight', 'backbone.layers.2.blocks.13.attn.qkv.bias', 'backbone.layers.2.blocks.13.attn.proj.weight', 'backbone.layers.2.blocks.13.attn.proj.bias', 'backbone.layers.2.blocks.13.norm2.weight', 'backbone.layers.2.blocks.13.norm2.bias', 'backbone.layers.2.blocks.13.mlp.fc1.weight', 'backbone.layers.2.blocks.13.mlp.fc1.bias', 'backbone.layers.2.blocks.13.mlp.fc2.weight', 'backbone.layers.2.blocks.13.mlp.fc2.bias', 'backbone.layers.2.blocks.14.norm1.weight', 'backbone.layers.2.blocks.14.norm1.bias', 'backbone.layers.2.blocks.14.attn.relative_position_bias_table', 'backbone.layers.2.blocks.14.attn.relative_position_index', 'backbone.layers.2.blocks.14.attn.qkv.weight', 'backbone.layers.2.blocks.14.attn.qkv.bias', 'backbone.layers.2.blocks.14.attn.proj.weight', 'backbone.layers.2.blocks.14.attn.proj.bias', 'backbone.layers.2.blocks.14.norm2.weight', 'backbone.layers.2.blocks.14.norm2.bias', 'backbone.layers.2.blocks.14.mlp.fc1.weight', 'backbone.layers.2.blocks.14.mlp.fc1.bias', 'backbone.layers.2.blocks.14.mlp.fc2.weight', 'backbone.layers.2.blocks.14.mlp.fc2.bias', 'backbone.layers.2.blocks.15.norm1.weight', 'backbone.layers.2.blocks.15.norm1.bias', 'backbone.layers.2.blocks.15.attn.relative_position_bias_table', 'backbone.layers.2.blocks.15.attn.relative_position_index', 'backbone.layers.2.blocks.15.attn.qkv.weight', 'backbone.layers.2.blocks.15.attn.qkv.bias', 'backbone.layers.2.blocks.15.attn.proj.weight', 'backbone.layers.2.blocks.15.attn.proj.bias', 'backbone.layers.2.blocks.15.norm2.weight', 'backbone.layers.2.blocks.15.norm2.bias', 'backbone.layers.2.blocks.15.mlp.fc1.weight', 'backbone.layers.2.blocks.15.mlp.fc1.bias', 'backbone.layers.2.blocks.15.mlp.fc2.weight', 'backbone.layers.2.blocks.15.mlp.fc2.bias', 'backbone.layers.2.blocks.16.norm1.weight', 'backbone.layers.2.blocks.16.norm1.bias', 'backbone.layers.2.blocks.16.attn.relative_position_bias_table', 'backbone.layers.2.blocks.16.attn.relative_position_index', 'backbone.layers.2.blocks.16.attn.qkv.weight', 'backbone.layers.2.blocks.16.attn.qkv.bias', 'backbone.layers.2.blocks.16.attn.proj.weight', 'backbone.layers.2.blocks.16.attn.proj.bias', 'backbone.layers.2.blocks.16.norm2.weight', 'backbone.layers.2.blocks.16.norm2.bias', 'backbone.layers.2.blocks.16.mlp.fc1.weight', 'backbone.layers.2.blocks.16.mlp.fc1.bias', 'backbone.layers.2.blocks.16.mlp.fc2.weight', 'backbone.layers.2.blocks.16.mlp.fc2.bias', 'backbone.layers.2.blocks.17.norm1.weight', 'backbone.layers.2.blocks.17.norm1.bias', 'backbone.layers.2.blocks.17.attn.relative_position_bias_table', 'backbone.layers.2.blocks.17.attn.relative_position_index', 'backbone.layers.2.blocks.17.attn.qkv.weight', 'backbone.layers.2.blocks.17.attn.qkv.bias', 'backbone.layers.2.blocks.17.attn.proj.weight', 'backbone.layers.2.blocks.17.attn.proj.bias', 'backbone.layers.2.blocks.17.norm2.weight', 'backbone.layers.2.blocks.17.norm2.bias', 'backbone.layers.2.blocks.17.mlp.fc1.weight', 'backbone.layers.2.blocks.17.mlp.fc1.bias', 'backbone.layers.2.blocks.17.mlp.fc2.weight', 'backbone.layers.2.blocks.17.mlp.fc2.bias', 'backbone.layers.2.downsample.reduction.weight', 'backbone.layers.2.downsample.norm.weight', 'backbone.layers.2.downsample.norm.bias', 'backbone.layers.3.blocks.0.norm1.weight', 'backbone.layers.3.blocks.0.norm1.bias', 'backbone.layers.3.blocks.0.attn.relative_position_bias_table', 'backbone.layers.3.blocks.0.attn.relative_position_index', 'backbone.layers.3.blocks.0.attn.qkv.weight', 'backbone.layers.3.blocks.0.attn.qkv.bias', 'backbone.layers.3.blocks.0.attn.proj.weight', 'backbone.layers.3.blocks.0.attn.proj.bias', 'backbone.layers.3.blocks.0.norm2.weight', 'backbone.layers.3.blocks.0.norm2.bias', 'backbone.layers.3.blocks.0.mlp.fc1.weight', 'backbone.layers.3.blocks.0.mlp.fc1.bias', 'backbone.layers.3.blocks.0.mlp.fc2.weight', 'backbone.layers.3.blocks.0.mlp.fc2.bias', 'backbone.layers.3.blocks.1.norm1.weight', 'backbone.layers.3.blocks.1.norm1.bias', 'backbone.layers.3.blocks.1.attn.relative_position_bias_table', 'backbone.layers.3.blocks.1.attn.relative_position_index', 'backbone.layers.3.blocks.1.attn.qkv.weight', 'backbone.layers.3.blocks.1.attn.qkv.bias', 'backbone.layers.3.blocks.1.attn.proj.weight', 'backbone.layers.3.blocks.1.attn.proj.bias', 'backbone.layers.3.blocks.1.norm2.weight', 'backbone.layers.3.blocks.1.norm2.bias', 'backbone.layers.3.blocks.1.mlp.fc1.weight', 'backbone.layers.3.blocks.1.mlp.fc1.bias', 'backbone.layers.3.blocks.1.mlp.fc2.weight', 'backbone.layers.3.blocks.1.mlp.fc2.bias', 'backbone.norm0.weight', 'backbone.norm0.bias', 'backbone.norm1.weight', 'backbone.norm1.bias', 'backbone.norm2.weight', 'backbone.norm2.bias', 'backbone.norm3.weight', 'backbone.norm3.bias', 'decode_head.conv_seg.weight', 'decode_head.conv_seg.bias', 'decode_head.psp_modules.0.1.conv.weight', 'decode_head.psp_modules.0.1.bn.weight', 'decode_head.psp_modules.0.1.bn.bias', 'decode_head.psp_modules.0.1.bn.running_mean', 'decode_head.psp_modules.0.1.bn.running_var', 'decode_head.psp_modules.0.1.bn.num_batches_tracked', 'decode_head.psp_modules.1.1.conv.weight', 'decode_head.psp_modules.1.1.bn.weight', 'decode_head.psp_modules.1.1.bn.bias', 'decode_head.psp_modules.1.1.bn.running_mean', 'decode_head.psp_modules.1.1.bn.running_var', 'decode_head.psp_modules.1.1.bn.num_batches_tracked', 'decode_head.psp_modules.2.1.conv.weight', 'decode_head.psp_modules.2.1.bn.weight', 'decode_head.psp_modules.2.1.bn.bias', 'decode_head.psp_modules.2.1.bn.running_mean', 'decode_head.psp_modules.2.1.bn.running_var', 'decode_head.psp_modules.2.1.bn.num_batches_tracked', 'decode_head.psp_modules.3.1.conv.weight', 'decode_head.psp_modules.3.1.bn.weight', 'decode_head.psp_modules.3.1.bn.bias', 'decode_head.psp_modules.3.1.bn.running_mean', 'decode_head.psp_modules.3.1.bn.running_var', 'decode_head.psp_modules.3.1.bn.num_batches_tracked', 'decode_head.bottleneck.conv.weight', 'decode_head.bottleneck.bn.weight', 'decode_head.bottleneck.bn.bias', 'decode_head.bottleneck.bn.running_mean', 'decode_head.bottleneck.bn.running_var', 'decode_head.bottleneck.bn.num_batches_tracked', 'decode_head.lateral_convs.0.conv.weight', 'decode_head.lateral_convs.0.bn.weight', 'decode_head.lateral_convs.0.bn.bias', 'decode_head.lateral_convs.0.bn.running_mean', 'decode_head.lateral_convs.0.bn.running_var', 'decode_head.lateral_convs.0.bn.num_batches_tracked', 'decode_head.lateral_convs.1.conv.weight', 'decode_head.lateral_convs.1.bn.weight', 'decode_head.lateral_convs.1.bn.bias', 'decode_head.lateral_convs.1.bn.running_mean', 'decode_head.lateral_convs.1.bn.running_var', 'decode_head.lateral_convs.1.bn.num_batches_tracked', 'decode_head.lateral_convs.2.conv.weight', 'decode_head.lateral_convs.2.bn.weight', 'decode_head.lateral_convs.2.bn.bias', 'decode_head.lateral_convs.2.bn.running_mean', 'decode_head.lateral_convs.2.bn.running_var', 'decode_head.lateral_convs.2.bn.num_batches_tracked', 'decode_head.fpn_convs.0.conv.weight', 'decode_head.fpn_convs.0.bn.weight', 'decode_head.fpn_convs.0.bn.bias', 'decode_head.fpn_convs.0.bn.running_mean', 'decode_head.fpn_convs.0.bn.running_var', 'decode_head.fpn_convs.0.bn.num_batches_tracked', 'decode_head.fpn_convs.1.conv.weight', 'decode_head.fpn_convs.1.bn.weight', 'decode_head.fpn_convs.1.bn.bias', 'decode_head.fpn_convs.1.bn.running_mean', 'decode_head.fpn_convs.1.bn.running_var', 'decode_head.fpn_convs.1.bn.num_batches_tracked', 'decode_head.fpn_convs.2.conv.weight', 'decode_head.fpn_convs.2.bn.weight', 'decode_head.fpn_convs.2.bn.bias', 'decode_head.fpn_convs.2.bn.running_mean', 'decode_head.fpn_convs.2.bn.running_var', 'decode_head.fpn_convs.2.bn.num_batches_tracked', 'decode_head.fpn_bottleneck.conv.weight', 'decode_head.fpn_bottleneck.bn.weight', 'decode_head.fpn_bottleneck.bn.bias', 'decode_head.fpn_bottleneck.bn.running_mean', 'decode_head.fpn_bottleneck.bn.running_var', 'decode_head.fpn_bottleneck.bn.num_batches_tracked', 'auxiliary_head.conv_seg.weight', 'auxiliary_head.conv_seg.bias', 'auxiliary_head.convs.0.conv.weight', 'auxiliary_head.convs.0.bn.weight', 'auxiliary_head.convs.0.bn.bias', 'auxiliary_head.convs.0.bn.running_mean', 'auxiliary_head.convs.0.bn.running_var', 'auxiliary_head.convs.0.bn.num_batches_tracked']) \ No newline at end of file diff --git a/FoodSeg103/data/FoodSeg103/category_id.txt b/FoodSeg103/data/FoodSeg103/category_id.txt new file mode 100644 index 0000000000000000000000000000000000000000..dbf1ac8b4ada2f466611eeb6e002b1cf96b559b5 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/category_id.txt @@ -0,0 +1,104 @@ +0 background +1 candy +2 egg tart +3 french fries +4 chocolate +5 biscuit +6 popcorn +7 pudding +8 ice cream +9 cheese butter +10 cake +11 wine +12 milkshake +13 coffee +14 juice +15 milk +16 tea +17 almond +18 red beans +19 cashew +20 dried cranberries +21 soy +22 walnut +23 peanut +24 egg +25 apple +26 date +27 apricot +28 avocado +29 banana +30 strawberry +31 cherry +32 blueberry +33 raspberry +34 mango +35 olives +36 peach +37 lemon +38 pear +39 fig +40 pineapple +41 grape +42 kiwi +43 melon +44 orange +45 watermelon +46 steak +47 pork +48 chicken duck +49 sausage +50 fried meat +51 lamb +52 sauce +53 crab +54 fish +55 shellfish +56 shrimp +57 soup +58 bread +59 corn +60 hamburg +61 pizza +62 hanamaki baozi +63 wonton dumplings +64 pasta +65 noodles +66 rice +67 pie +68 tofu +69 eggplant +70 potato +71 garlic +72 cauliflower +73 tomato +74 kelp +75 seaweed +76 spring onion +77 rape +78 ginger +79 okra +80 lettuce +81 pumpkin +82 cucumber +83 white radish +84 carrot +85 asparagus +86 bamboo shoots +87 broccoli +88 celery stick +89 cilantro mint +90 snow peas +91 cabbage +92 bean sprouts +93 onion +94 pepper +95 green beans +96 French beans +97 king oyster mushroom +98 shiitake +99 enoki mushroom +100 oyster mushroom +101 white button mushroom +102 salad +103 other ingredients \ No newline at end of file diff --git a/FoodSeg103/data/FoodSeg103/test_recipe1m_id.txt b/FoodSeg103/data/FoodSeg103/test_recipe1m_id.txt new file mode 100644 index 0000000000000000000000000000000000000000..baa85ebffb476cbb6a03f1cd658a4c73dd6da6a2 --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/test_recipe1m_id.txt @@ -0,0 +1,2416 @@ +00d68c5fa3.jpg +0191f5f062.jpg +01d5819c58.jpg +01edebcbce.jpg +0206acee79.jpg +022edef9a2.jpg +02d021b259.jpg +02e4cccb07.jpg +03041dc01c.jpg +03e3ae939c.jpg +03f8f24712.jpg +04d33728da.jpg +0822b058f0.jpg +09d4103619.jpg +09d62734c3.jpg +0af3dd4fdc.jpg +0b195c7d99.jpg +0b6d7e1daa.jpg +0bd98665f9.jpg +0c1efa2832.jpg +0c26cf3536.jpg +0c390c2f4b.jpg +0cb1254837.jpg +0e5bea5d02.jpg +0fb6b629ef.jpg +10fc3e7cf2.jpg +1275b11468.jpg +12c6cd5830.jpg +12d3763c33.jpg +130515a7a8.jpg +13c176f8b8.jpg +15280bb6f7.jpg +15d9921016.jpg +160cf233eb.jpg +1727f7984b.jpg +17c9f975ed.jpg +1818eb93a4.jpg +182240a5f8.jpg +18c6abcfa0.jpg +1adf4bb236.jpg +1bd8ff40cd.jpg +1bf974682d.jpg +1cc4ea05e8.jpg +1cd6075a07.jpg +1e4decced6.jpg +1ed1cf2056.jpg +1fc6c0ef98.jpg +1fc860debd.jpg +1fdd1367a2.jpg +21f113feac.jpg +227335bc14.jpg +22dbe74913.jpg +22ddd60052.jpg +2314c0ded6.jpg +23fd7cb4a6.jpg +2412f58cac.jpg +25997b88d3.jpg +2612bad6c5.jpg +27d009cfad.jpg +29c9aacac5.jpg +29d020b028.jpg +2a46655e25.jpg +2a76865d1c.jpg +2af385af25.jpg +2b13b82ead.jpg +2bebc0c0e3.jpg +2dd8c59ace.jpg +2e15170436.jpg +31fa443bf2.jpg +33d494df10.jpg +37384ea36c.jpg +379ea5dbf3.jpg +37eabd3c50.jpg +39d1413c42.jpg +3aae6a34c6.jpg +3ac35247a6.jpg +3b24474de7.jpg +3b947ef176.jpg +3ce184723f.jpg +3d3b30b677.jpg +3e12c234a3.jpg +3f335e6d88.jpg +3fea66a254.jpg +40097c6800.jpg +401f8f7a2b.jpg +43a99c333d.jpg +43cb80319e.jpg +454ea61c0a.jpg +45aabd808c.jpg +4603ee3a1a.jpg +4815c35662.jpg +49b8b16d6a.jpg +49ff3ba904.jpg +4bc31a1e57.jpg +4bda87720a.jpg +4cd7c9a1eb.jpg +505f216748.jpg +50734b6209.jpg +514991348a.jpg +51d34fbe0a.jpg +52d9d04b7e.jpg +52de73a667.jpg +545c81cc72.jpg +54d1530a58.jpg +55accb0df8.jpg +56c9d29eb8.jpg +56ff44ba44.jpg +58d357163c.jpg +58d6300e3b.jpg +5a6f3c54a3.jpg +5bd36dc0dc.jpg +5cc2562363.jpg +5d58f14d51.jpg +5dc50f1d81.jpg +5dd5811373.jpg +5e14c8b5a1.jpg +5ed24c0d60.jpg +60862c905a.jpg +61c7f176d4.jpg +62c5c94630.jpg +62e2c7b796.jpg +63dae45462.jpg +63e483e612.jpg +64d9548ab3.jpg +660622d236.jpg +66a3eacd66.jpg +66bb9db1ad.jpg +66c88b059e.jpg +67064fad7b.jpg +67827a91f9.jpg +678ab2ea13.jpg +6ac1f2d41c.jpg +6c0156aab8.jpg +6cc51bedff.jpg +6d18abe16a.jpg +6eda135434.jpg +6ee1601085.jpg +6f41749b6b.jpg +6fe0924dec.jpg +70ab084799.jpg +712216f5ad.jpg +71be9e0226.jpg +735df12326.jpg +739b9f851e.jpg +73d83028df.jpg +73daf3d8ed.jpg +758fefa848.jpg +76d36885be.jpg +77c4a6fe2f.jpg +78f787aee7.jpg +7a12965aeb.jpg +7cc71229a5.jpg +7efc149640.jpg +7fdd694ae3.jpg +80d5656ebf.jpg +80eae77779.jpg +81d8f0b54b.jpg +81db0f1524.jpg +81e862cac9.jpg +82c2e03612.jpg +841ed7f917.jpg +85fa9881dc.jpg +87d2414123.jpg +8a339b0fda.jpg +8ad26d38e1.jpg +8b2c4f1c0d.jpg +8b7e44a3a0.jpg +8bc8f22dd8.jpg +8d118b659b.jpg +8ed145e6f0.jpg +8fab9d6512.jpg +8fc788763e.jpg +9282528cc7.jpg +92d66f7340.jpg +93318880e9.jpg +93e01af057.jpg +93e70a7fe3.jpg +940f8ef0ec.jpg +95b17a452f.jpg +96c6a593bc.jpg +97f491104d.jpg +99b11f3cab.jpg +99cc65caea.jpg +99ed9238f0.jpg +9b39d7c23e.jpg +9cc9d2a497.jpg +9cf35693f2.jpg +9dbba7780f.jpg +9dcaad7d3e.jpg +9e87b6f9dd.jpg +9fc54e11a0.jpg +9febd53e0f.jpg +a0004ee17b.jpg +a015d11a03.jpg +a0e39d9975.jpg +a3d34a5167.jpg +a4655a9970.jpg +a4ce1dcc34.jpg +a53be5bbad.jpg +a72ccdde9f.jpg +a965b847e0.jpg +aa000237f6.jpg +aad93c022e.jpg +aad9c0a5d4.jpg +ab24262d6d.jpg +abefc43402.jpg +abfc3ba5d6.jpg +acaf9a72fa.jpg +ad12e4998e.jpg +ad8c9ae3b7.jpg +aef8bc53a5.jpg +af7086f34a.jpg +afe841696b.jpg +b144043a27.jpg +b1e20ef0c7.jpg +b20e3f0351.jpg +b2e5502c1e.jpg +b3c3ebb34e.jpg +b3c74e915a.jpg +b3ea360f81.jpg +b3f8a6d2c3.jpg +b3fcb198bd.jpg +b4023b997c.jpg +b425fe2c96.jpg +b4443553cf.jpg +b44e393780.jpg +b4588caffe.jpg +b45c2ade13.jpg +b45da763c1.jpg +b474944163.jpg +b48a4c9263.jpg +b49d7c5a0a.jpg +b49ef87f58.jpg +b4a3655f72.jpg +b4acd37467.jpg +b4c08601fd.jpg +b4d93b9564.jpg +b4dda95f17.jpg +b4e82c0a90.jpg +b4eb4378eb.jpg +b4f8054cd1.jpg +b4f932020c.jpg +b4f9c0daee.jpg +b506c6ead3.jpg +b50e1a9588.jpg +b510ee6d52.jpg +b52ea8b8d7.jpg +b539275275.jpg +b554a2a678.jpg +b55c0defeb.jpg +b56856674b.jpg +b56faff103.jpg +b57834ccd0.jpg +b598195847.jpg +b59cdd471b.jpg +b59ea377fc.jpg +b5b14d906f.jpg +b5c3cadf89.jpg +b5c9dce4ea.jpg +b5ca04fc73.jpg +b5cd3e4d3d.jpg +b5ed51a7d3.jpg +b5ef80c532.jpg +b5f9e44e6e.jpg +b5fbf94e9f.jpg +b60037e282.jpg +b601cb87a2.jpg +b606abad20.jpg +b61049bc2a.jpg +b61a885545.jpg +b61b16e01e.jpg +b62b522ee7.jpg +b62d33a770.jpg +b6322d48b0.jpg +b6353110a4.jpg +b6582c297f.jpg +b65a3d67d1.jpg +b662cf7a25.jpg +b66dea22c6.jpg +b675e50542.jpg +b677e1c76d.jpg +b6804e1eba.jpg +b6938abe4f.jpg +b693bd1c5a.jpg +b6a35d1b5d.jpg +b6aa1c69e8.jpg +b6aafe2d28.jpg +b6b1d646f9.jpg +b6b698eeee.jpg +b6bbc6ff44.jpg +b6caeebc65.jpg +b6cafea251.jpg +b6ceb137e8.jpg +b6d2514e01.jpg +b6db23bcc1.jpg +b6ee082d7b.jpg +b6ee61af76.jpg +b6fa3dd3d0.jpg +b6fa57baa7.jpg +b70027d169.jpg +b700929f2c.jpg +b703b46557.jpg +b70e1869fd.jpg +b70f2f4f3e.jpg +b72c1346d6.jpg +b73917164f.jpg +b758ce78b5.jpg +b760db2eaf.jpg +b7643bda23.jpg +b76c4978dc.jpg +b776d35856.jpg +b78ed9dade.jpg +b79e5ae2e2.jpg +b7a417a2fd.jpg +b7c6377b74.jpg +b7cedc6b95.jpg +b7cf18629b.jpg +b7d494d374.jpg +b7d65293e7.jpg +b7d9586b33.jpg +b7dac8a2a1.jpg +b7dc73df0f.jpg +b7e4b0598a.jpg +b7e9bd5841.jpg +b7ed92e5ac.jpg +b7efc6f578.jpg +b7fc00d066.jpg +b7fcb7f2a9.jpg +b804dd359e.jpg +b80db8bcfa.jpg +b85beb82ae.jpg +b864d02bfa.jpg +b86f6e4147.jpg +b87c9c5d2b.jpg +b87e4be539.jpg +b87fafd940.jpg +b885908e90.jpg +b88b4df291.jpg +b8966c93b5.jpg +b897ef28f2.jpg +b89fc16e84.jpg +b8be9123c2.jpg +b8c03c2730.jpg +b8c14ba0da.jpg +b8c268c5b1.jpg +b8c7ee9faa.jpg +b8c9fd913b.jpg +b8cc5eda55.jpg +b8cf2c86d4.jpg +b8d403d5e3.jpg +b8d80fb83e.jpg +b8e00033a6.jpg +b8ebf5655a.jpg +b8f78ea26a.jpg +b906cb7745.jpg +b91be171a3.jpg +b9222cf29f.jpg +b933129f3c.jpg +b93d8ed9b3.jpg +b94d974153.jpg +b959aecb1a.jpg +b96948dd79.jpg +b96a0276a6.jpg +b96dfcd62f.jpg +b977f143f4.jpg +b9795beeae.jpg +b9804a10c5.jpg +b98ead1bd3.jpg +b9ad7c4eae.jpg +b9b31c499d.jpg +b9be3e6585.jpg +b9c9bd81b3.jpg +b9cc63d1e4.jpg +b9d3c5b5fd.jpg +b9ddf180db.jpg +b9de0e7ab7.jpg +b9e260321f.jpg +b9e2d9cf76.jpg +b9e3c4afa4.jpg +b9ef56217a.jpg +b9efbe2e6e.jpg +b9f17f582f.jpg +b9f6dc90d4.jpg +b9fb10ef3c.jpg +ba043911e5.jpg +ba12f25338.jpg +ba2c2fa8ca.jpg +ba2ee0775c.jpg +ba2fad5ec9.jpg +ba3057a3ba.jpg +ba3c976d89.jpg +ba5e28cfba.jpg +ba6281dbce.jpg +ba62993855.jpg +ba6b13cbf4.jpg +ba719ae52c.jpg +ba7c7cfe38.jpg +ba7c9caca3.jpg +ba8477e463.jpg +ba9460d1ab.jpg +ba9b24e1c6.jpg +baab705764.jpg +bab6eb364a.jpg +baba01a651.jpg +babafbef75.jpg +bad289b1da.jpg +bad3039996.jpg +bada3c5741.jpg +badb27dd35.jpg +bade630725.jpg +badea05ab8.jpg +badec96a9d.jpg +bae4cf0dd7.jpg +baeb1dfdb8.jpg +bb08e7c636.jpg +bb10c8691f.jpg +bb24132ffe.jpg +bb3d6c2fc7.jpg +bb69ac181d.jpg +bb6a6f953d.jpg +bb75a214d7.jpg +bb80cf12f1.jpg +bba00814dd.jpg +bbad147555.jpg +bbafae272f.jpg +bbc07f4dd4.jpg +bbc49e6468.jpg +bbc66fef95.jpg +bbc8265d3b.jpg +bbd0cbc068.jpg +bbd6022e71.jpg +bbd942f417.jpg +bbdab0ac49.jpg +bbe2ed3aec.jpg +bbec946e3e.jpg +bbee622301.jpg +bbfdb31a12.jpg +bbfe570570.jpg +bbff29c0bb.jpg +bc0092fba8.jpg +bc015b023a.jpg +bc2ef704e4.jpg +bc6b6e3737.jpg +bc6d8c2008.jpg +bc80ea7f88.jpg +bc9836d343.jpg +bca103f0eb.jpg +bcb4426b6b.jpg +bcc2943ace.jpg +bcc5bd722d.jpg +bccb2ab9da.jpg +bcd189af43.jpg +bcd1cfd8dd.jpg +bcd3c41b87.jpg +bcd56169a2.jpg +bcdd544b76.jpg +bce0e4ed0d.jpg +bce3e89e1a.jpg +bce4575711.jpg +bce9081d29.jpg +bceef32102.jpg +bd0065c0fc.jpg +bd143e9760.jpg +bd14b60ae8.jpg +bd26ae81e9.jpg +bd2e85da31.jpg +bd49556825.jpg +bd52123d7a.jpg +bd63d83988.jpg +bd688f8a05.jpg +bd7ca7806f.jpg +bd8cd75e87.jpg +bd994f8616.jpg +bd9caea7e6.jpg +bda4a4a1bc.jpg +bda9b419eb.jpg +bdabe3b79d.jpg +bdb69d2721.jpg +bdc07e4dac.jpg +bdc75f9fe1.jpg +bdd32d35a0.jpg +bdd9d4cb31.jpg +bde2b91998.jpg +bdeadea939.jpg +bdee86e2c2.jpg +bdf38ca55f.jpg +bdfb4a6ee3.jpg +be0425cb9b.jpg +be26a34d1f.jpg +be2a16d939.jpg +be2be4ec29.jpg +be490a646d.jpg +be4b0d7edd.jpg +be5a4ab3b4.jpg +be7454d19c.jpg +be8732728f.jpg +be9a2a29e9.jpg +bece13a17a.jpg +bed483d502.jpg +bed660c6ab.jpg +bedb8587fa.jpg +bedebedf81.jpg +bee46256c0.jpg +bef2afb102.jpg +bef4b5ece1.jpg +befbc05353.jpg +bf065e0e18.jpg +bf08a2244f.jpg +bf24a90d2b.jpg +bf2be86ea1.jpg +bf30db52d9.jpg +bf3200af07.jpg +bf3e0469c1.jpg +bf60971469.jpg +bf67387993.jpg +bfa4c50b1c.jpg +bfaf5cdcb8.jpg +bfb555dd1f.jpg +bfb716206e.jpg +bfb84e0176.jpg +bfc6b4eca9.jpg +bfcc346e35.jpg +bfcf4d5ac7.jpg +bfe6e3aeae.jpg +bfefcd9c6a.jpg +bff6c02842.jpg +bffa673c43.jpg +c0049d3e6f.jpg +c021039df0.jpg +c04289a4e6.jpg +c06291ebe4.jpg +c08a1c4553.jpg +c0972208fc.jpg +c097db5101.jpg +c0a1a614a7.jpg +c0a621e03d.jpg +c0c010dfdb.jpg +c0c55f72df.jpg +c0c7604196.jpg +c0c7c885cf.jpg +c0c9f95d2e.jpg +c0d500c107.jpg +c0d90358b3.jpg +c0dd3d0754.jpg +c0ea9b99a8.jpg +c0ee9babf4.jpg +c0ef27358d.jpg +c0efe6b772.jpg +c0f00a13dc.jpg +c0f4ab1ad8.jpg +c0f6b63a35.jpg +c10084edc5.jpg +c108a2adb5.jpg +c10fef288c.jpg +c110760eab.jpg +c111b7639b.jpg +c127f65312.jpg +c12ec0b053.jpg +c137265b1d.jpg +c140865619.jpg +c142480461.jpg +c1490382b2.jpg +c16639ff09.jpg +c16bbc2dbe.jpg +c1871db78d.jpg +c194aba626.jpg +c1a0b685ce.jpg +c1ac79d7d3.jpg +c1c033cd38.jpg +c1c3e424f1.jpg +c1d121af72.jpg +c1d339f995.jpg +c1dad80b23.jpg +c1db2d9d21.jpg +c1dfc29b14.jpg +c1e59a4288.jpg +c1e5e658ab.jpg +c1f31cddfe.jpg +c1fc7ade9e.jpg +c2048678d1.jpg +c20ac208c7.jpg +c2233df153.jpg +c22d511747.jpg +c22faa7f82.jpg +c265f2477b.jpg +c2836f78f3.jpg +c28beb5721.jpg +c28fdbac8a.jpg +c2a13a5b69.jpg +c2ad1f9207.jpg +c2af4e2ce1.jpg +c2c17bf415.jpg +c2c31256d0.jpg +c2c59dcf04.jpg +c2c9be3ad4.jpg +c2cf1d5c16.jpg +c2d2ff0066.jpg +c2d461e4cd.jpg +c2dfe9ab5a.jpg +c2e2de0c2a.jpg +c2e5d0a30e.jpg +c2e6f9653e.jpg +c2e884ea70.jpg +c2f01c7c26.jpg +c300921db0.jpg +c316cd7933.jpg +c31818614a.jpg +c31d0c79a6.jpg +c31fae26f4.jpg +c321b7f223.jpg +c321f20de5.jpg +c341a5b021.jpg +c360862cb8.jpg +c3644c52a1.jpg +c3686eb948.jpg +c36d336f79.jpg +c3709c2513.jpg +c37b88e370.jpg +c396a451c3.jpg +c3a6dc70b4.jpg +c3a8157788.jpg +c3a95b2f11.jpg +c3aba46a00.jpg +c3b2153b5b.jpg +c3b721838d.jpg +c3bf7d4c60.jpg +c3c571e812.jpg +c3c7f8a86e.jpg +c3cdeb0660.jpg +c3d20624bf.jpg +c3d627b2df.jpg +c3d6ae1b03.jpg +c3dc12ede6.jpg +c3de96bc8d.jpg +c3e063d469.jpg +c3e3df3f27.jpg +c3e65c927a.jpg +c3e7962913.jpg +c3e7d947d8.jpg +c3eece3bf0.jpg +c3f049193f.jpg +c3f16ea570.jpg +c400cb19fb.jpg +c41e5f5dcd.jpg +c436e37764.jpg +c465f680aa.jpg +c47f4c9b10.jpg +c487452ecf.jpg +c497e7e049.jpg +c4a6bc6a62.jpg +c4a7dfaa6c.jpg +c4ae295169.jpg +c4beb2744c.jpg +c4becf6b4b.jpg +c4bf8a73c5.jpg +c4dea06b64.jpg +c4e2baba0d.jpg +c4e40fbb3e.jpg +c4e6ecaa3f.jpg +c4eee2f0b7.jpg +c4f3acdba8.jpg +c4f6573e26.jpg +c4f97b7011.jpg +c4fc8d9d94.jpg +c513f387a0.jpg +c51b532e4e.jpg +c51b5d1983.jpg +c55aba4154.jpg +c576bb2b2f.jpg +c57f38837c.jpg +c58fc095c4.jpg +c590b2cf41.jpg +c5ae59cd4c.jpg +c5b1ad8c2f.jpg +c5bcb1dc7a.jpg +c5bd23d1dd.jpg +c5bda853a7.jpg +c5c4218b09.jpg +c5c4f19c88.jpg +c5c85f22b3.jpg +c5d1a2d773.jpg +c5d334458e.jpg +c5d8c8032b.jpg +c5e6a25b4f.jpg +c5e892eef0.jpg +c5eff7ecb1.jpg +c5f0f9daba.jpg +c5f3217f8f.jpg +c5f3933042.jpg +c5fe72e422.jpg +c609230f48.jpg +c6159fa27a.jpg +c6164924d9.jpg +c61d05c6ad.jpg +c6248ddb9e.jpg +c627b2dc57.jpg +c62f9728e1.jpg +c63dd1887e.jpg +c67434f57f.jpg +c67af78a33.jpg +c68d1e42c0.jpg +c68f0c09b4.jpg +c692979230.jpg +c696d99156.jpg +c69ac5a308.jpg +c6a669254b.jpg +c6aa8b7898.jpg +c6b574df26.jpg +c6be770922.jpg +c6cf8e0418.jpg +c6d060c22a.jpg +c6ddc2e3a2.jpg +c6e1d8a950.jpg +c6e4e06152.jpg +c6f0501137.jpg +c6f2fb579f.jpg +c6f3406dce.jpg +c6f9a8a4d7.jpg +c6faaf07ca.jpg +c707b66aed.jpg +c715ecb116.jpg +c717486082.jpg +c71933b1f6.jpg +c71f695b65.jpg +c722cd6fb7.jpg +c72983e80a.jpg +c753bcd031.jpg +c783e3de04.jpg +c7857c7abb.jpg +c7b31ae9cd.jpg +c7b48b805f.jpg +c7d445337a.jpg +c7d446613e.jpg +c7dd9e9cf7.jpg +c7e24e8bb7.jpg +c7e95eb754.jpg +c7ec7b98cb.jpg +c7ee06614a.jpg +c7f064c7bf.jpg +c7f0b7e139.jpg +c7fcabebee.jpg +c80b757ffa.jpg +c81cbcc222.jpg +c82134ca61.jpg +c823b00785.jpg +c833a9fea9.jpg +c8492be1fa.jpg +c8522f7d68.jpg +c85539079a.jpg +c85aaf5ea7.jpg +c86a17ee96.jpg +c86f2e50a6.jpg +c86faebe03.jpg +c8839a441f.jpg +c88ed83a0b.jpg +c89beb110b.jpg +c89ec3cd28.jpg +c8bb9751d7.jpg +c8d1841141.jpg +c8de929eed.jpg +c8e2a35667.jpg +c8e81dcb95.jpg +c8e83da1ff.jpg +c8ecc4e5ad.jpg +c8f46b9ab1.jpg +c8f54c1cdf.jpg +c8fa720618.jpg +c906c57281.jpg +c913e7fed0.jpg +c913ea9494.jpg +c91f328c79.jpg +c91fe5952b.jpg +c9333e81ef.jpg +c9355491c0.jpg +c93c1f20e7.jpg +c943a7aa89.jpg +c949419b08.jpg +c951e51e8d.jpg +c994d6627e.jpg +c99920f3a8.jpg +c9af6ed6b1.jpg +c9af83e1ca.jpg +c9afd88cb0.jpg +c9bd3a50a1.jpg +c9c5d39e8e.jpg +c9d40c8b10.jpg +c9d98b7e43.jpg +c9da74649c.jpg +c9e13e249b.jpg +c9e212c39a.jpg +c9e295d476.jpg +c9e5e4e5af.jpg +c9ea94b815.jpg +c9f6294835.jpg +ca15337fca.jpg +ca181fb375.jpg +ca2ddc004e.jpg +ca316a99f3.jpg +ca43c834e2.jpg +ca4d0a473c.jpg +ca6666333a.jpg +ca72a47817.jpg +ca7c98ae8a.jpg +ca8e9f34e7.jpg +ca9af373d8.jpg +cab13d117b.jpg +cab7bb8a63.jpg +cab938d84d.jpg +cabafc0e12.jpg +cac03580db.jpg +cac791a248.jpg +caca0644c7.jpg +cacaebfd21.jpg +cad26248bb.jpg +cad48d88e0.jpg +cad605ff85.jpg +cadc6d01ad.jpg +cadd0e5d11.jpg +cae1f6a6d6.jpg +cae21e7161.jpg +caee5133e1.jpg +caef32bba9.jpg +caf2c1f7e8.jpg +caf4178d10.jpg +caf81a8292.jpg +cafc99244c.jpg +cb017d8a54.jpg +cb0391ed68.jpg +cb04cf2ba3.jpg +cb05ba3834.jpg +cb1ba2009e.jpg +cb1f955ed4.jpg +cb1fbf9809.jpg +cb321d98df.jpg +cb3662fc7d.jpg +cb41b1b213.jpg +cb4ce8f4f0.jpg +cb5be7ec51.jpg +cb5e732332.jpg +cb6391fbf4.jpg +cb6c21f1d5.jpg +cb6e95c775.jpg +cb6fbeae00.jpg +cb72812bd4.jpg +cb80f47d91.jpg +cb84d1dd8c.jpg +cb8d0b8b1d.jpg +cb8d6b6f00.jpg +cb90b1d4f3.jpg +cb9d65f437.jpg +cba7d81b99.jpg +cbb211eac6.jpg +cbbfb06344.jpg +cbc85faf47.jpg +cbd151867a.jpg +cbd1e4e875.jpg +cbd71b2aca.jpg +cbd7753147.jpg +cbdbfc5978.jpg +cbe3bf10fe.jpg +cbe3d82daa.jpg +cbe3ee6b27.jpg +cbe5050d0d.jpg +cbe5eb6696.jpg +cbe6542626.jpg +cbf47a2e17.jpg +cbfb07d1d6.jpg +cc0a587391.jpg +cc0d3d2b12.jpg +cc16df94c1.jpg +cc1c4305f1.jpg +cc2e6f7376.jpg +cc2efaec22.jpg +cc39e651e3.jpg +cc5324dfbf.jpg +cc765cba88.jpg +cc766e4e6a.jpg +cc7e0caed0.jpg +cc9600fb25.jpg +ccb00d349a.jpg +ccb2f113dc.jpg +ccc2cd9d63.jpg +ccc4e0a939.jpg +ccc584f82d.jpg +cccb928e07.jpg +cceb8d60ff.jpg +ccf20b8bc2.jpg +ccfdbf82df.jpg +cd011d4899.jpg +cd11b33940.jpg +cd3a631856.jpg +cd3df7a8e9.jpg +cd42d53ebd.jpg +cd52e3f2fe.jpg +cd5420f681.jpg +cd62492877.jpg +cd648c062e.jpg +cd67f7d265.jpg +cd69563263.jpg +cd90e30a1e.jpg +cd98e62c8f.jpg +cda2fc2df0.jpg +cdaa784932.jpg +cdaf68d4ad.jpg +cdb2353f60.jpg +cdb89349bf.jpg +cdb8945620.jpg +cdb9a4a0ea.jpg +cdc1f4b107.jpg +cdc3ee1b24.jpg +cdc583254a.jpg +cdc6c28796.jpg +cdc7ed032d.jpg +cdc7ef5c9d.jpg +cdc97e5056.jpg +cdcd471f12.jpg +cdce14b70f.jpg +cde29ab29f.jpg +cde9cf4217.jpg +cdf2007659.jpg +cdfeb4e489.jpg +ce01392613.jpg +ce039ff3d4.jpg +ce135e26dd.jpg +ce1491b390.jpg +ce29b9979c.jpg +ce408eb5cf.jpg +ce54d1e381.jpg +ce5fac18d9.jpg +ce60e54766.jpg +ce673267ea.jpg +ce6b23aa71.jpg +ce73863a6c.jpg +ce7969ad4b.jpg +ce7eb74818.jpg +ce8ca9bffb.jpg +cea105a876.jpg +cea1c54379.jpg +cea5173375.jpg +ceaf3903af.jpg +ceb7190c60.jpg +cec57cc583.jpg +cecb797629.jpg +cecce5c6c2.jpg +cecd3fc8c3.jpg +cedc14af2f.jpg +cedc79186e.jpg +ceddcc6b85.jpg +cee2d2dba3.jpg +cee48efd07.jpg +ceefc58ef3.jpg +cef44dcb17.jpg +cef775459d.jpg +cf05ddb0d4.jpg +cf12ba2abc.jpg +cf2cc9c314.jpg +cf2e6999ce.jpg +cf4769299d.jpg +cf5341b194.jpg +cf58d81280.jpg +cf7082aaa1.jpg +cf7aaa1009.jpg +cf826699b0.jpg +cf836d295b.jpg +cf8b687c1c.jpg +cfa7bf3f47.jpg +cfa8b0dbbc.jpg +cfc4a746ac.jpg +cfc9f7b2f2.jpg +cfccf96c6e.jpg +cfcdcc086f.jpg +cfe0dcf244.jpg +cfe2e1c708.jpg +cffba276ec.jpg +d00036ecd7.jpg +d014c494dc.jpg +d03a78328b.jpg +d04ddc5fd9.jpg +d058f2919c.jpg +d05b3297cf.jpg +d05e33069a.jpg +d05ed6c6f8.jpg +d0873ef123.jpg +d08958142b.jpg +d099255c0a.jpg +d0b64d6491.jpg +d0b9d8777f.jpg +d0c3efb066.jpg +d0c655554a.jpg +d0cadfbc89.jpg +d0e586e5ef.jpg +d0fc895a1a.jpg +d10587f9ab.jpg +d105b884c8.jpg +d12de0e958.jpg +d135869f4c.jpg +d141c35e3c.jpg +d1475c2dc0.jpg +d14fff221d.jpg +d15fa51eab.jpg +d1675065f9.jpg +d1742f3bfa.jpg +d184086155.jpg +d19565a007.jpg +d1a9a88f49.jpg +d1af317242.jpg +d1b78cc6db.jpg +d1c7072696.jpg +d1c7d61a42.jpg +d1cbae6be7.jpg +d1d31c8f0e.jpg +d1d466cf4a.jpg +d1d642437d.jpg +d1d6675da4.jpg +d1e539fac8.jpg +d1e78c6508.jpg +d1fec8a32a.jpg +d2001a1e33.jpg +d2075ab1b7.jpg +d20b3c1233.jpg +d20e385a13.jpg +d229ee50c6.jpg +d22ab437cc.jpg +d24009bcc4.jpg +d2436ab6a8.jpg +d25abb5702.jpg +d25db7d5ec.jpg +d26d9bd742.jpg +d29927635e.jpg +d2b9beebaf.jpg +d2c10d84db.jpg +d2c46d53e8.jpg +d2c62282bf.jpg +d2ccba890d.jpg +d2cf48d3ea.jpg +d2d29e81eb.jpg +d2d2ac244a.jpg +d2d53e5a48.jpg +d2d7ad5926.jpg +d2de2684b7.jpg +d2e550cb12.jpg +d2e695d3c4.jpg +d2e9a0fa67.jpg +d2e9c329c4.jpg +d2eaf85d93.jpg +d2f6e95b3f.jpg +d30c2f84a1.jpg +d322b94e9d.jpg +d33ce47122.jpg +d33d7592ba.jpg +d33dd837bf.jpg +d33effb9b9.jpg +d378dc2815.jpg +d379710dc0.jpg +d37e064711.jpg +d38c639500.jpg +d3a3e5e678.jpg +d3b39db71b.jpg +d3c13e3ae1.jpg +d3c7087729.jpg +d3d5ce767f.jpg +d3d604aa99.jpg +d3d82f8722.jpg +d3e8385411.jpg +d3ef4692bc.jpg +d3f00e2c80.jpg +d410d30e39.jpg +d4119e6646.jpg +d415367b34.jpg +d416ed8f37.jpg +d419d014b1.jpg +d42b28b985.jpg +d42b781f87.jpg +d4538671b4.jpg +d45e3fcb85.jpg +d460db4979.jpg +d4702cf61f.jpg +d47769d0b9.jpg +d485c2e9bb.jpg +d48b4985de.jpg +d48bda7efe.jpg +d48e193a2c.jpg +d4acf0b0bd.jpg +d4b44b0850.jpg +d4c380f13b.jpg +d4c3c8060f.jpg +d4c46edd3e.jpg +d4cdbb4299.jpg +d4cffc4752.jpg +d4d1382b70.jpg +d4d5653b60.jpg +d4d613de78.jpg +d4de54c2c6.jpg +d4df4c8163.jpg +d4e001cfe5.jpg +d4eaa1a91e.jpg +d4ffacdf1d.jpg +d505ef9e66.jpg +d50a013518.jpg +d5120f23ba.jpg +d51e770b5e.jpg +d529e578d8.jpg +d551e09afe.jpg +d56f0d3fd5.jpg +d57944c6c3.jpg +d57b611364.jpg +d58317c12d.jpg +d5951ff8df.jpg +d59bdafab9.jpg +d5a9faa59c.jpg +d5ac799607.jpg +d5ad2ce934.jpg +d5b105ff1d.jpg +d5b71ff889.jpg +d5d23d8f21.jpg +d5d500a866.jpg +d5d6165384.jpg +d5deb14bf4.jpg +d5e57a9ff3.jpg +d5fc45ab9f.jpg +d603ab5d4f.jpg +d62be075dd.jpg +d62c0e9261.jpg +d62e21aeb6.jpg +d632a659b4.jpg +d65c82370c.jpg +d65e1b081f.jpg +d6689dda1e.jpg +d66e65c368.jpg +d67acb461d.jpg +d67e56d550.jpg +d69e531384.jpg +d6aa1d4561.jpg +d6b3bfb989.jpg +d6b8c10533.jpg +d6b8f9b74b.jpg +d6b9d5d6d1.jpg +d6c57c383a.jpg +d6c61ab099.jpg +d6d094d366.jpg +d6d8057538.jpg +d6d959ce95.jpg +d6d991ed2b.jpg +d6d9c482a1.jpg +d6dd1d6cec.jpg +d6df68fc4e.jpg +d6e5b8cab2.jpg +d6f79b6e2d.jpg +d6fe5e2828.jpg +d70056bc7c.jpg +d7127c96ae.jpg +d712bd2788.jpg +d71c3a8176.jpg +d7217b590d.jpg +d72ca354ee.jpg +d733d56d15.jpg +d73cb8f701.jpg +d7589a1d8c.jpg +d76151111a.jpg +d7653c5f75.jpg +d76e76762e.jpg +d777321a3e.jpg +d77ca92485.jpg +d781494ce2.jpg +d78a478529.jpg +d78d5cd977.jpg +d790312a52.jpg +d799b48228.jpg +d79b52e09b.jpg +d7a614cb10.jpg +d7adf480d0.jpg +d7c6d18fe6.jpg +d7ce1d52b2.jpg +d7d9313640.jpg +d7dfca5c47.jpg +d7e3c7e348.jpg +d7e99b6259.jpg +d7edcf727d.jpg +d7ee7d0487.jpg +d7eefdccc8.jpg +d7f14ee663.jpg +d7f1ddf8dd.jpg +d7f236b392.jpg +d7f7d797c6.jpg +d7f8d79e78.jpg +d801293214.jpg +d805fbc5b5.jpg +d83d53d778.jpg +d83de3f4c9.jpg +d84d39c8f3.jpg +d85ae16835.jpg +d86e5b1c39.jpg +d874cd3f0b.jpg +d8aeab65af.jpg +d8b1e21926.jpg +d8b65cbf2a.jpg +d8c059d60c.jpg +d8c1423196.jpg +d8c6f61473.jpg +d8c9c0935f.jpg +d8ca4cbcff.jpg +d8cb60d447.jpg +d8d2b51355.jpg +d8d8c31b97.jpg +d8e537f666.jpg +d8ed71b4e6.jpg +d8f193f307.jpg +d8fe45bd8e.jpg +d91111b364.jpg +d9115e5edb.jpg +d9152313cb.jpg +d918e65388.jpg +d91b717086.jpg +d91e76998b.jpg +d91ed1f131.jpg +d91ef12bcc.jpg +d953dde89a.jpg +d954d521d0.jpg +d95a0544ce.jpg +d95a4b2cdb.jpg +d95d89e45b.jpg +d95e1c9924.jpg +d96109257b.jpg +d963189c42.jpg +d964bff4cb.jpg +d9737885d6.jpg +d987a1397f.jpg +d99267a987.jpg +d99f7fd1c8.jpg +d9af976585.jpg +d9b4601624.jpg +d9c3926f71.jpg +d9cf6a6e56.jpg +d9d0c7e0ce.jpg +d9d108d1b9.jpg +d9d227c60e.jpg +d9d2932eb9.jpg +d9d48c11ac.jpg +d9d703626e.jpg +d9d71e731b.jpg +d9e2210f32.jpg +d9e492cdcf.jpg +d9e707621b.jpg +d9f0f20d86.jpg +d9f150d8f0.jpg +d9fa8d549a.jpg +da02b3d8e3.jpg +da0ce9d51b.jpg +da142e5c2f.jpg +da2c6c922c.jpg +da2ecef181.jpg +da2ef729a8.jpg +da3180f2da.jpg +da34e6ccfb.jpg +da3893d1e2.jpg +da4fdc279c.jpg +da53f58c50.jpg +da62d6fcae.jpg +da651f04fd.jpg +da6c35cbf9.jpg +da702ffbf7.jpg +da76d6477b.jpg +da79dcd616.jpg +da7ae7af4c.jpg +da95c751b0.jpg +dab0c180ea.jpg +dab53ceeee.jpg +dabb75c707.jpg +dabca6968f.jpg +dac4293a65.jpg +dac47b7e91.jpg +dac6f6e398.jpg +dac84c3309.jpg +dad3b63df7.jpg +daebd802ba.jpg +daef20a8a2.jpg +daf23f296f.jpg +db18aa43ef.jpg +db1c010668.jpg +db33f568f2.jpg +db384d8da4.jpg +db3a803998.jpg +db5dbad747.jpg +db61f00a69.jpg +db65f82b29.jpg +db67367a89.jpg +db6afaf677.jpg +db6ca3f326.jpg +db6d44ff40.jpg +db87658602.jpg +db8a00e666.jpg +db97519894.jpg +dbac7993f4.jpg +dbad3423f7.jpg +dbb9856c8c.jpg +dbc1634a75.jpg +dbc31310a1.jpg +dbc3fc18c2.jpg +dbd22c9154.jpg +dbd382e9e9.jpg +dbdd2fb273.jpg +dbe2cd2c6f.jpg +dbf669a342.jpg +dc0ce0c2c2.jpg +dc16e46e77.jpg +dc18731819.jpg +dc2a92eb5a.jpg +dc2c1cfefa.jpg +dc4151bd30.jpg +dc417da570.jpg +dc4eaae42d.jpg +dc7633b08a.jpg +dc7e3dcadf.jpg +dc862ae8aa.jpg +dc9da0561d.jpg +dc9ddf27f4.jpg +dc9dfd6250.jpg +dca45da90e.jpg +dca7880fce.jpg +dcb6d1098e.jpg +dcc7900801.jpg +dccc15d8a1.jpg +dcd069b245.jpg +dcd0b25de1.jpg +dcd143cc81.jpg +dcd6036462.jpg +dcde817c42.jpg +dcdf21d450.jpg +dce12f581e.jpg +dd050b138d.jpg +dd0c0579a4.jpg +dd0ef458c3.jpg +dd226d618a.jpg +dd29490d19.jpg +dd2e1804fa.jpg +dd3d7610cb.jpg +dd3d86d4ef.jpg +dd5905222c.jpg +dd78927fd3.jpg +dd94740974.jpg +dd95c56993.jpg +dda7ee0a77.jpg +ddafe46b38.jpg +ddb718d257.jpg +ddc0202960.jpg +ddd416ddd6.jpg +ddd8b5363e.jpg +ddd9058eb7.jpg +ddded69049.jpg +dde76d45fc.jpg +de0558d40b.jpg +de0cb936c8.jpg +de1525ca66.jpg +de1e18c44a.jpg +de1e325f68.jpg +de23d49364.jpg +de25f55745.jpg +de3f383dae.jpg +de5c5040b1.jpg +de6e804239.jpg +de7e43efcc.jpg +de8c8ee8f2.jpg +dea09311cb.jpg +dec050626d.jpg +dec15232a6.jpg +dec5489394.jpg +decad9b151.jpg +ded592bda8.jpg +ded5953ee9.jpg +dedb0e552a.jpg +dee4d9ed27.jpg +deee42dc2b.jpg +def9b26096.jpg +df024881b9.jpg +df035e8f69.jpg +df1bd9e04f.jpg +df1c28ab75.jpg +df24af750e.jpg +df26d1dd80.jpg +df292f8e6d.jpg +df2c48d7c7.jpg +df2d2ddd20.jpg +df68866b1e.jpg +df72ab0cd2.jpg +df7f93f180.jpg +df8e5aa1be.jpg +df9c5153e4.jpg +df9d63ee14.jpg +dfa3003de7.jpg +dfae026f6d.jpg +dfb102819a.jpg +dfb676d53e.jpg +dfc219c56a.jpg +dfc295113b.jpg +dfc3f3b0b9.jpg +dfc55c9152.jpg +dfcaeb611e.jpg +dfd265e60a.jpg +dfd7780d9d.jpg +dfd8af91e6.jpg +dfd8d6904b.jpg +dfd933e53e.jpg +dfe113f4ee.jpg +dfe4485c97.jpg +dfe8706be5.jpg +dfea4826bd.jpg +dff9f11f50.jpg +e0006f0f41.jpg +e01371bd33.jpg +e01ae85fc1.jpg +e023a824d6.jpg +e025ea9b42.jpg +e02826d3da.jpg +e03c948e22.jpg +e044af4d1c.jpg +e050bceada.jpg +e068b69e5b.jpg +e0824aa93b.jpg +e084aba76b.jpg +e08ae32a68.jpg +e08ef1a83d.jpg +e0a728a02e.jpg +e0aa61e4bf.jpg +e0ab12b9a7.jpg +e0aed36f6a.jpg +e0cc1f6237.jpg +e0ce83825c.jpg +e0d073c945.jpg +e0dbaffa04.jpg +e0e5da3707.jpg +e0f0abe9f8.jpg +e0f99505ef.jpg +e10025dcac.jpg +e111113868.jpg +e1135ab381.jpg +e113d4f031.jpg +e12ebdbf91.jpg +e140e245e9.jpg +e147bfc52a.jpg +e1595c8686.jpg +e162036a47.jpg +e168b6a549.jpg +e195d1b2b1.jpg +e1a0a62adc.jpg +e1aa025444.jpg +e1afdf2240.jpg +e1b0d89e75.jpg +e1d10c2b93.jpg +e1d3319f0f.jpg +e1e28a1e83.jpg +e1e82e7dd3.jpg +e1eabf3a60.jpg +e1ed53d17e.jpg +e1f46b5e53.jpg +e200a0888f.jpg +e20f7bd016.jpg +e215137374.jpg +e224d59487.jpg +e22bab4350.jpg +e244e46111.jpg +e24e37e7db.jpg +e250abd7b2.jpg +e261f8c936.jpg +e281e09d4c.jpg +e282839f0e.jpg +e2929a6a6d.jpg +e29cd48980.jpg +e2a350f1bf.jpg +e2a94a61ae.jpg +e2ad33196a.jpg +e2b6a5d47c.jpg +e2c2c2a874.jpg +e2ce32211d.jpg +e2ce77a5a8.jpg +e2d54b2b7a.jpg +e2d55836cd.jpg +e2d8779fb9.jpg +e2db412ea1.jpg +e2dfad9dcc.jpg +e2e796fc0c.jpg +e2f87929b1.jpg +e2f9d6d274.jpg +e2fe3ee140.jpg +e306c9b71a.jpg +e306d09bad.jpg +e3097c26e7.jpg +e32158ae36.jpg +e324b38006.jpg +e3534b24d6.jpg +e353b0f4f5.jpg +e3552b949b.jpg +e35f22cbdd.jpg +e3626273d1.jpg +e36c261ecd.jpg +e36e80c8fb.jpg +e3703002a1.jpg +e37c7d3add.jpg +e38256ea99.jpg +e38c1c764a.jpg +e3926a62ca.jpg +e39e571962.jpg +e3a0abc49d.jpg +e3a631d658.jpg +e3a9e6f2be.jpg +e3af66042a.jpg +e3c3a4bf28.jpg +e3c57ee552.jpg +e3c5e7d760.jpg +e3c97b6e58.jpg +e3d36428cf.jpg +e3d3827bd0.jpg +e3e05ec64a.jpg +e3e6883f3a.jpg +e3e87dc520.jpg +e3f7f7ec34.jpg +e400379a58.jpg +e400f1b151.jpg +e40773b435.jpg +e40d68836b.jpg +e42a478372.jpg +e42e379880.jpg +e433a04dd6.jpg +e442db5ed4.jpg +e44dc4ab74.jpg +e45a162b6d.jpg +e463852b82.jpg +e46639fce9.jpg +e46e03b413.jpg +e477c5d906.jpg +e47f9092f7.jpg +e48fb4f324.jpg +e497a20f60.jpg +e4988de583.jpg +e49b25fe22.jpg +e4a47122a5.jpg +e4a542babd.jpg +e4b18fcc9d.jpg +e4bddde3ff.jpg +e4c0f3f929.jpg +e4cabb2288.jpg +e4cda0e11d.jpg +e4ce16849b.jpg +e4d0e1365c.jpg +e4da32c8fe.jpg +e4da3b6bf3.jpg +e4e12477d4.jpg +e4e271d26d.jpg +e4e3e70171.jpg +e4e54f7848.jpg +e4e733241b.jpg +e4f128a3ec.jpg +e4f793cbdb.jpg +e4fea86130.jpg +e4ff86da58.jpg +e501638b8c.jpg +e503e3f36d.jpg +e5045d3749.jpg +e51ee3a030.jpg +e520556c37.jpg +e53141c362.jpg +e538b6a155.jpg +e53d14fb4e.jpg +e56d464f9e.jpg +e56efdaa5e.jpg +e572af8532.jpg +e578d5306f.jpg +e57b04af85.jpg +e57f3d56c4.jpg +e585701f4a.jpg +e58b7f1fc5.jpg +e5968e30e7.jpg +e5a38f57cd.jpg +e5a8dffb1e.jpg +e5abe81609.jpg +e5b58cda4c.jpg +e5cadba2fa.jpg +e5ccf59b44.jpg +e5d344b6d9.jpg +e5d4fc895c.jpg +e5d9e35412.jpg +e5dddfb237.jpg +e5e0754cf3.jpg +e5f6608455.jpg +e60061b224.jpg +e605e6f297.jpg +e60886de71.jpg +e60b538beb.jpg +e635b20db7.jpg +e6429c4260.jpg +e6507eedf4.jpg +e6577bad84.jpg +e66b0bf434.jpg +e67874255f.jpg +e6942b2456.jpg +e699f615c2.jpg +e69bc8243b.jpg +e6a4218479.jpg +e6ae6930d8.jpg +e6cb0e28d0.jpg +e6cd40782e.jpg +e6d19b14f1.jpg +e6d82e944c.jpg +e6d929c138.jpg +e6df5d430b.jpg +e6e46215b9.jpg +e6fa22ba34.jpg +e6fc15bdef.jpg +e7035a08a6.jpg +e717c0e13a.jpg +e71e056753.jpg +e732b782a9.jpg +e7437938a0.jpg +e74545717a.jpg +e74c43a49d.jpg +e750d77f8b.jpg +e75a58950a.jpg +e75c34287d.jpg +e75e2d8e77.jpg +e764d24e96.jpg +e770eb67d0.jpg +e786246e51.jpg +e791da4018.jpg +e79b1d40d8.jpg +e79ef6cbd3.jpg +e79f9979ee.jpg +e7a7e08300.jpg +e7aa12d8a6.jpg +e7c494541a.jpg +e7c9f9d564.jpg +e7cba41883.jpg +e7ccf54f8d.jpg +e7cd21d7f3.jpg +e7d0240c30.jpg +e7deab7eb2.jpg +e7df9e7d2e.jpg +e7e7aa5039.jpg +e7f53f22b8.jpg +e8080c7598.jpg +e81230d563.jpg +e8146628f4.jpg +e8188f0072.jpg +e81b7688b2.jpg +e82a55e866.jpg +e8305e07ba.jpg +e837c2b02e.jpg +e838ddceea.jpg +e83cbe7e37.jpg +e83fe7ac7d.jpg +e86313b8a4.jpg +e86e8552ab.jpg +e86f01e606.jpg +e876b47068.jpg +e884d8cee6.jpg +e8abe073bd.jpg +e8b9f886f8.jpg +e8bfb3609b.jpg +e8c12da3c8.jpg +e8c4636f10.jpg +e8cb6b4c66.jpg +e8d4256e5a.jpg +e8d7d00977.jpg +e8d88c23ec.jpg +e8da0004f7.jpg +e8db3d5fae.jpg +e8f69cb744.jpg +e905c2a019.jpg +e905e9850a.jpg +e9079c4921.jpg +e908a004ba.jpg +e908ad9444.jpg +e90b504e7c.jpg +e9261a627f.jpg +e93a2afea4.jpg +e93cfb5a6b.jpg +e93ee6cdd3.jpg +e94385ea63.jpg +e946b377ed.jpg +e95255b608.jpg +e9631f47d5.jpg +e9632f11af.jpg +e964042ec4.jpg +e96867a9b4.jpg +e972a9e3b4.jpg +e976a5cf61.jpg +e9a11ed1d0.jpg +e9a120914d.jpg +e9a30d15c7.jpg +e9a310f424.jpg +e9abe9ce29.jpg +e9b0661361.jpg +e9d22f8968.jpg +e9d4088d3b.jpg +e9d600a7e9.jpg +e9d6824b13.jpg +e9d7f5c753.jpg +e9dbc47153.jpg +e9ddd64edc.jpg +e9de51ae12.jpg +e9e5d4095e.jpg +ea01d15db0.jpg +ea1fbb8391.jpg +ea27f112b3.jpg +ea304b5364.jpg +ea40b60bad.jpg +ea4ae02598.jpg +ea5656d0cf.jpg +ea5a23b508.jpg +ea60f5e77f.jpg +ea71f42a76.jpg +ea781fbdac.jpg +ea9b6f6c1a.jpg +eaa2534a45.jpg +eaaf1ad71a.jpg +eaafb18ab3.jpg +eac8c90db7.jpg +eaca3d5f05.jpg +eacfeb3e2a.jpg +ead42e4782.jpg +eae1b37df0.jpg +eae4382bc6.jpg +eae44e5c4f.jpg +eaf451a994.jpg +eaf55cb993.jpg +eaf9084220.jpg +eafd6847da.jpg +eb0ea62abe.jpg +eb27177d02.jpg +eb2a66fcb8.jpg +eb2c6031a0.jpg +eb359044c6.jpg +eb42e1a461.jpg +eb44289a53.jpg +eb47b89ba0.jpg +eb4dc7f162.jpg +eb52138988.jpg +eb566639a5.jpg +eb694b42cc.jpg +eb894b9ecd.jpg +eb900a1041.jpg +eb98ec5901.jpg +eba4f49101.jpg +eba7fe58d8.jpg +ebaa7c1b61.jpg +ebac31e552.jpg +ebb10d4d5f.jpg +ebb729383d.jpg +ebc16b8cc2.jpg +ebc45de34e.jpg +ebc4c57f50.jpg +ebccbe38ca.jpg +ebd2dd4b80.jpg +ebd7747063.jpg +ebd885bc1f.jpg +ebe3414516.jpg +ebe6dfaa45.jpg +ebedeaf347.jpg +ec081fb786.jpg +ec10c7beab.jpg +ec10c9c58d.jpg +ec188b256f.jpg +ec1c72a001.jpg +ec258de1aa.jpg +ec2c20c6b5.jpg +ec34b91092.jpg +ec390ea90f.jpg +ec3f2b8131.jpg +ec3f318740.jpg +ec5d9ae940.jpg +ec65271b73.jpg +ec71afb268.jpg +ec72247f2f.jpg +ec7cd6ebee.jpg +ec7cfb0e2c.jpg +ec902ee7e8.jpg +ec9cb6c33e.jpg +ecaac63437.jpg +ecbfe60f66.jpg +ecc388d0da.jpg +eccd77ef34.jpg +ecd24613cd.jpg +ece1f9cc04.jpg +ecf1f516bd.jpg +ecf4384906.jpg +ecfe40ad99.jpg +ed025cb385.jpg +ed0c62db49.jpg +ed1e1dff48.jpg +ed22be82db.jpg +ed6bc92ed5.jpg +ed6bea58db.jpg +ed6cb97bdc.jpg +ed6ff3b2bf.jpg +ed7941d125.jpg +ed7a82ad7d.jpg +ed7f1910ee.jpg +ed81180504.jpg +ed8a8fb799.jpg +ed8b464e61.jpg +ed8bfd8efe.jpg +edace1f767.jpg +edad5e6979.jpg +edaf8f18b9.jpg +edb15b09bd.jpg +edbac0fb07.jpg +edcde5c4d5.jpg +edd4ce1184.jpg +edd801ae75.jpg +edda4919a8.jpg +eddc9bdbff.jpg +eddd0539c3.jpg +eddec94da7.jpg +edf02a0bd8.jpg +edfa7575c5.jpg +edfb0f8573.jpg +ee0abe2262.jpg +ee0d13b763.jpg +ee297fadbb.jpg +ee33d09958.jpg +ee38a407d4.jpg +ee45f0625c.jpg +ee4aafc392.jpg +ee64707c9a.jpg +ee69f5f847.jpg +ee8a35eff2.jpg +ee8af6406e.jpg +ee8cba9b03.jpg +ee92c64c4c.jpg +ee9c89ab4f.jpg +ee9f12c28e.jpg +eea788d49b.jpg +eea828af89.jpg +eeadcdc883.jpg +eeb44df39b.jpg +eece091209.jpg +eed8346233.jpg +eedc52b015.jpg +eedd3caf9b.jpg +eedd842bd4.jpg +eedeec1833.jpg +eee540b814.jpg +eeef28d4f2.jpg +eeefb3889c.jpg +eef16260c3.jpg +eef7a4aac3.jpg +eef95fed0e.jpg +eefabb1856.jpg +ef064e2efe.jpg +ef09679693.jpg +ef1dde3b3a.jpg +ef281ae43d.jpg +ef2cfe52f1.jpg +ef2f4b491e.jpg +ef45886efa.jpg +ef4cf74215.jpg +ef581fab36.jpg +ef5bf0ae22.jpg +ef5f713cac.jpg +ef67751b04.jpg +ef6c9aa252.jpg +ef6e6c6f4f.jpg +ef743558fd.jpg +ef87574743.jpg +ef9485a3d8.jpg +ef94875e33.jpg +ef95d0da3b.jpg +efa6496e67.jpg +efaa599eb8.jpg +efac19a2d5.jpg +efc093a763.jpg +efc6257759.jpg +efd67da2de.jpg +efd7734530.jpg +efd960cf0f.jpg +efdc27cf84.jpg +efe3ddb4cd.jpg +efeb5d4109.jpg +efebe5cf76.jpg +efeea29d60.jpg +eff0d9d2bd.jpg +eff254ead6.jpg +eff7e509c1.jpg +f000bce0cb.jpg +f002664226.jpg +f009e1838b.jpg +f00ee79625.jpg +f0155948a6.jpg +f01ed35bd6.jpg +f021079aaf.jpg +f023e66bb0.jpg +f023fe7c8a.jpg +f024b7e240.jpg +f02b5a203e.jpg +f02e5275e0.jpg +f060179162.jpg +f06230df37.jpg +f0833d0bcf.jpg +f085a4bbf2.jpg +f09be06af8.jpg +f0b152091d.jpg +f0bd1c31f7.jpg +f0d3dd760b.jpg +f0d9095d3d.jpg +f0de31a50a.jpg +f0e1252199.jpg +f0e1b5d00d.jpg +f0e3070813.jpg +f0e368014c.jpg +f0e540254d.jpg +f0ed5c0da7.jpg +f0f026d431.jpg +f0f0b6d565.jpg +f0f1d96e4a.jpg +f0f370f2d6.jpg +f0f40785b2.jpg +f0f48445e0.jpg +f0f937090f.jpg +f0ff1e1fa3.jpg +f100043ec0.jpg +f1072f7082.jpg +f10938160a.jpg +f130c7d621.jpg +f14860234a.jpg +f14bdc6ae2.jpg +f150c77056.jpg +f1595c12a1.jpg +f161dd9a79.jpg +f17dc2d316.jpg +f17dd023d0.jpg +f187f4f801.jpg +f18e31cfdb.jpg +f18f51352e.jpg +f1941cce89.jpg +f1ac96118a.jpg +f1acc1c5bc.jpg +f1b9a04723.jpg +f1b9f90a8d.jpg +f1bee42b76.jpg +f1da75d72f.jpg +f1dc4ae917.jpg +f1e840eed1.jpg +f1f6c57f91.jpg +f1fcf52e62.jpg +f20ad4e46f.jpg +f20ce255e6.jpg +f2155b0dce.jpg +f218b7dbb3.jpg +f221e2b9cf.jpg +f22398714d.jpg +f224098250.jpg +f23885e558.jpg +f244c231d9.jpg +f246926909.jpg +f257c713e1.jpg +f25d95ef71.jpg +f26c120010.jpg +f27177e65f.jpg +f28d0b7c1e.jpg +f2a198af42.jpg +f2a503b8f5.jpg +f2ac5ae9ef.jpg +f2b5e8804e.jpg +f2bd71e871.jpg +f2bef79f35.jpg +f2c4998f5e.jpg +f2c7307e80.jpg +f2ca64ff21.jpg +f2cd50cf05.jpg +f2ce974123.jpg +f2d143b7eb.jpg +f2d599908f.jpg +f2db9483ec.jpg +f2e9ef6f83.jpg +f2ee39cb18.jpg +f2f276072a.jpg +f2fe0bdbc6.jpg +f30419b330.jpg +f30ba97237.jpg +f30bc8dd02.jpg +f3104f82e0.jpg +f324bbcf69.jpg +f324bc3468.jpg +f32abb455d.jpg +f32b2a0705.jpg +f32e9dc62a.jpg +f32f47dae3.jpg +f33121211c.jpg +f3373dd7ed.jpg +f3418b7625.jpg +f3429e3b49.jpg +f35c2a73a5.jpg +f36071fd7e.jpg +f36831a791.jpg +f36ffa9bfd.jpg +f38641e176.jpg +f38809ef39.jpg +f39191bf60.jpg +f3a5e9d530.jpg +f3ace53166.jpg +f3c4efec63.jpg +f3c5a78ba7.jpg +f3c7dcd5d1.jpg +f3ca599f02.jpg +f3d25ee7c8.jpg +f3d5f98878.jpg +f3d621d1ff.jpg +f3d7afe7cb.jpg +f3db0dcf5c.jpg +f3e1f4faaf.jpg +f3e37884c8.jpg +f41206c55f.jpg +f4151401ec.jpg +f42256e812.jpg +f43503c98d.jpg +f43eede7e1.jpg +f44decf1ae.jpg +f44e36a8b0.jpg +f4529f1487.jpg +f4681e55f1.jpg +f46b5595ec.jpg +f46d01181a.jpg +f47077b123.jpg +f476d30f77.jpg +f48e03b69c.jpg +f493c96aa8.jpg +f496efdf51.jpg +f49e7a9e85.jpg +f4af70630b.jpg +f4c2579d99.jpg +f4c4bc7110.jpg +f4c5a615c2.jpg +f4c5b538a1.jpg +f4d40b4746.jpg +f4db2ac66b.jpg +f4dd76da02.jpg +f4e71e0826.jpg +f4f371364c.jpg +f4fa6bbb18.jpg +f4fb0823af.jpg +f5102d464a.jpg +f521e7d9bc.jpg +f526e99c1d.jpg +f52a0c174a.jpg +f52c47226d.jpg +f52d567c77.jpg +f52d95f3f2.jpg +f5304733a4.jpg +f541dcd6ae.jpg +f56673ee2d.jpg +f56c482e0c.jpg +f56ef7c25f.jpg +f570337f9b.jpg +f579f6c1ac.jpg +f57a90c5ee.jpg +f57b69a246.jpg +f582a217a6.jpg +f583e03bf0.jpg +f59313deaf.jpg +f595261887.jpg +f59b1cc3fd.jpg +f59cd92806.jpg +f5b7baac80.jpg +f5c09e7aa3.jpg +f5c9f45799.jpg +f5ca962644.jpg +f5ce4a6b25.jpg +f5dc837547.jpg +f5e019c574.jpg +f5e0ba250f.jpg +f5e117f768.jpg +f5e5745b02.jpg +f5ef9a962e.jpg +f5f282fd5a.jpg +f5f5d1352a.jpg +f5fa41a1b7.jpg +f5fdee9c5a.jpg +f601d45831.jpg +f6023f9414.jpg +f61f56e28d.jpg +f62096f01a.jpg +f620dd6a22.jpg +f6256c3788.jpg +f62a400740.jpg +f63e97d752.jpg +f64386010d.jpg +f654d25aaf.jpg +f655313abc.jpg +f65d7fcbe7.jpg +f66317ea4e.jpg +f67285c244.jpg +f679fc7610.jpg +f68f68a7e7.jpg +f6a30c1a34.jpg +f6b0db8e3a.jpg +f6b4684472.jpg +f6cb734783.jpg +f6d29447ce.jpg +f6d4b56ead.jpg +f6e59937fe.jpg +f6e5a0ad93.jpg +f6e6cfd1d8.jpg +f6f475c668.jpg +f71741fbec.jpg +f7180c7f12.jpg +f720da2e34.jpg +f72d8619d5.jpg +f73262da47.jpg +f73c3656b5.jpg +f742e36eaf.jpg +f74426ff3c.jpg +f789ffdeeb.jpg +f78d2bccaa.jpg +f78fcc6b58.jpg +f792dcfb02.jpg +f7954faa07.jpg +f7b0d10ed0.jpg +f7c9054ca7.jpg +f7ca5ff8f3.jpg +f7d0d357b7.jpg +f7d0e62782.jpg +f7d33c8ce5.jpg +f7db0aeaa3.jpg +f7db17a545.jpg +f7de0a9d76.jpg +f7e68821ce.jpg +f7eadd56da.jpg +f8043aa26f.jpg +f8188efcc8.jpg +f81b3d6c07.jpg +f81ccaa506.jpg +f82898bf83.jpg +f8309569e2.jpg +f839a879d5.jpg +f83c851eed.jpg +f84ea4ee57.jpg +f84eac40cf.jpg +f85968710c.jpg +f85f6afb5b.jpg +f86718f0b9.jpg +f870122a8e.jpg +f88cd9cb43.jpg +f8a051d47b.jpg +f8a47a9000.jpg +f8a790a92c.jpg +f8b8c68a45.jpg +f8bc0af218.jpg +f8c3a02c93.jpg +f8c4ae3735.jpg +f8c9c393c0.jpg +f8d0bca885.jpg +f8d3316d9e.jpg +f8d41c7c83.jpg +f8d4db89f1.jpg +f8db271663.jpg +f8df3f65c1.jpg +f8e7ff27ef.jpg +f8e8d20edf.jpg +f8f4c3f8f2.jpg +f8ffa48886.jpg +f900a03006.jpg +f9015aec38.jpg +f9040d6527.jpg +f90a53c5b3.jpg +f90d03b9ae.jpg +f9141f4421.jpg +f920b3f617.jpg +f93a0897ea.jpg +f93bedd42a.jpg +f9472ace4d.jpg +f95c1f229a.jpg +f961289a1a.jpg +f96ab2c8e2.jpg +f972bad39f.jpg +f9748797fb.jpg +f977c04311.jpg +f97ff33824.jpg +f9847422d6.jpg +f98b4ea01a.jpg +f98ec7e7be.jpg +f99835f64c.jpg +f9b3d6fc40.jpg +f9b9359ea3.jpg +f9c2cc9e67.jpg +f9c2fd0156.jpg +f9c8c2d72f.jpg +f9d224cf37.jpg +f9d428c247.jpg +f9da44d887.jpg +f9dbb719d4.jpg +f9e215f6c1.jpg +f9e647a263.jpg +f9e915b69f.jpg +f9eb732282.jpg +f9ebe0422c.jpg +f9ee45e677.jpg +f9eea5543c.jpg +f9f29a14c5.jpg +f9f421a804.jpg +f9f57c4db7.jpg +f9f62f0b2b.jpg +f9f7d4837d.jpg +f9ff1f2e43.jpg +fa27e83a3d.jpg +fa29dfb2b8.jpg +fa3752de76.jpg +fa3ec248be.jpg +fa4baab93c.jpg +fa590765bf.jpg +fa638ccf56.jpg +fa70be5f12.jpg +fa813e4d05.jpg +fa8c616057.jpg +fa8ce256cf.jpg +fa9286015b.jpg +fa93585ccd.jpg +fa942964ae.jpg +faa38c20af.jpg +faa84debb4.jpg +fab25a98aa.jpg +fabab3b5b5.jpg +fac5671d7a.jpg +fac70e561c.jpg +fac8fa96bc.jpg +fad20ebf41.jpg +fad22762f1.jpg +fad46e91b1.jpg +fad581b5b8.jpg +fad9caf352.jpg +fadc388205.jpg +fadd41fb5d.jpg +fade4b9315.jpg +fadf90c407.jpg +fae57f5974.jpg +fae584df46.jpg +fae70ad247.jpg +faf3474850.jpg +faf43b7283.jpg +faf4533938.jpg +fb03513f48.jpg +fb038c9374.jpg +fb0e99ead2.jpg +fb228a0b3f.jpg +fb28c567a5.jpg +fb340ace2e.jpg +fb34cd8704.jpg +fb3ec13c4d.jpg +fb42ef2835.jpg +fb4548e8f8.jpg +fb4c364566.jpg +fb4d2e8e88.jpg +fb5259dbd9.jpg +fb7b88f8cf.jpg +fb7ce59a1b.jpg +fb800d7a6f.jpg +fb9b7a7f45.jpg +fb9ea031d6.jpg +fba1c788bd.jpg +fba99f5df9.jpg +fbba14b0e2.jpg +fbbee3053f.jpg +fbc0a2bcbd.jpg +fbc13d017d.jpg +fbc522b43f.jpg +fbc8c7d584.jpg +fbd8a31067.jpg +fbe7bf5bf7.jpg +fbe97e3a95.jpg +fbea2dc389.jpg +fbee0859b1.jpg +fbefbdccd4.jpg +fbf07591f3.jpg +fbf3e834ea.jpg +fbfcd92c4e.jpg +fbfd9fa139.jpg +fbfdf2f1e3.jpg +fc06de1d9d.jpg +fc0db3f4ad.jpg +fc0dbf8e1f.jpg +fc0e8f7876.jpg +fc2a63d2b2.jpg +fc3ed0012f.jpg +fc3fd24d12.jpg +fc4c590cb1.jpg +fc52d6007b.jpg +fc579c828e.jpg +fc761dca1d.jpg +fc7a212b9d.jpg +fc8ea183be.jpg +fc99763178.jpg +fca31dd881.jpg +fcaadd368b.jpg +fcac1ed9a7.jpg +fcbe148582.jpg +fcc07ea9a8.jpg +fcc4143787.jpg +fcc69ea51e.jpg +fcc7f82ce0.jpg +fcda90fe71.jpg +fcdbe38b82.jpg +fcde9ae93a.jpg +fce7784b79.jpg +fce9c92932.jpg +fcedb2ab99.jpg +fcf9c856da.jpg +fd02504e6e.jpg +fd140163ff.jpg +fd162d7502.jpg +fd17814e0a.jpg +fd1bfedf71.jpg +fd20fe76cc.jpg +fd258cb2d6.jpg +fd33cf9dd4.jpg +fd45d40d4a.jpg +fd59afc8dc.jpg +fd5ce5e1b3.jpg +fd6cb68f69.jpg +fd6e426be7.jpg +fd8d13f171.jpg +fda20489de.jpg +fda45b5266.jpg +fda5d6a16c.jpg +fdb179ae53.jpg +fdbe07cbdb.jpg +fdc4deb59a.jpg +fdcb68c1b6.jpg +fdcef8f7d9.jpg +fdd20a486d.jpg +fdd566bafd.jpg +fddd4793c0.jpg +fde48a2d1f.jpg +fde50fe566.jpg +fde547487c.jpg +fde684638b.jpg +fdead1249f.jpg +fdefafbb68.jpg +fdf8df9f55.jpg +fdfa4baf9f.jpg +fdfdef9956.jpg +fe15f23201.jpg +fe18299961.jpg +fe188ababd.jpg +fe1e8c7d7f.jpg +fe1f14da0c.jpg +fe24bf3e4e.jpg +fe29776c5c.jpg +fe35a4b222.jpg +fe36845f27.jpg +fe3d6a9206.jpg +fe4b226c9e.jpg +fe50609214.jpg +fe5062701c.jpg +fe59749d78.jpg +fe623168b9.jpg +fe771a8464.jpg +fe78ce0f33.jpg +fe7aa5b59d.jpg +fe7e782603.jpg +fe7eb2f711.jpg +fe8a433602.jpg +fe908d212e.jpg +fe9a5fd3bc.jpg +fe9abc89a1.jpg +fea3504677.jpg +fea72a6707.jpg +fea9b374d6.jpg +feac3675d4.jpg +febf3ddf72.jpg +fec71714fb.jpg +fec919e0bd.jpg +fecbd4e02c.jpg +fecdf654da.jpg +fed13b967b.jpg +fed4317a3c.jpg +fed47f53dd.jpg +fed7391781.jpg +fed92a7767.jpg +fedbe6a98a.jpg +feefd9e1ba.jpg +fef39b2805.jpg +fef57e19c5.jpg +fefc2aef0c.jpg +fefdc069da.jpg +ff0e05b330.jpg +ff107fa1dd.jpg +ff3b6be5f6.jpg +ff4091a5c1.jpg +ff4ddde631.jpg +ff574eb682.jpg +ff59357e75.jpg +ff5a278ce2.jpg +ff618d0698.jpg +ff672f2b5c.jpg +ff6c081c3a.jpg +ff7603f56c.jpg +ff7e4bcc1e.jpg +ff832a44b2.jpg +ff83643180.jpg +ffae0373d2.jpg +ffb19880c1.jpg +ffba632b59.jpg +ffbb518aed.jpg +ffc3b83fa2.jpg +ffc811f3f7.jpg +ffc8ce4288.jpg +ffca6a355b.jpg +ffcad78225.jpg +ffcbef0a69.jpg +ffcd6496c0.jpg +ffd3659fa6.jpg +ffd58c0e39.jpg +ffd6c40af1.jpg +ffd7999571.jpg +ffe91252e8.jpg +ffeaa2778a.jpg +ffed2bf1b7.jpg +fffa0d5bf4.jpg +fffb1bae06.jpg diff --git a/FoodSeg103/data/FoodSeg103/train_test_recipe1m_id.txt b/FoodSeg103/data/FoodSeg103/train_test_recipe1m_id.txt new file mode 100644 index 0000000000000000000000000000000000000000..8431882666f2d90ed2df772ac6ebc124d06a5fdc --- /dev/null +++ b/FoodSeg103/data/FoodSeg103/train_test_recipe1m_id.txt @@ -0,0 +1,7392 @@ +000e2242f4.jpg +001ba88662.jpg +002ec68cc0.jpg +0035d6e852.jpg +005b8ca3c7.jpg +0065d1fd90.jpg +008246daa6.jpg +009aadfee3.jpg +009d406a46.jpg +009e5c1b61.jpg +00a4369321.jpg +00b8167a9e.jpg +00c2d2b3c3.jpg +00c5af983f.jpg +00c9473bf6.jpg +00d1d9526e.jpg +00d68c5fa3.jpg +00db260287.jpg +00e2436568.jpg +00eb8ea6a7.jpg +00ee30333b.jpg +00ef614918.jpg +00f0fd1d40.jpg +00f1f3b98b.jpg +01095b5241.jpg +0125ccb360.jpg +012d496758.jpg +0134b5efc7.jpg +013f42161e.jpg +0145f2a6da.jpg +014d1370c8.jpg +0179284f82.jpg +017a9dec4c.jpg +018abf908a.jpg +018dacb6e4.jpg +018dbb78c7.jpg +0191f5f062.jpg +0193a799db.jpg +01a8f6611e.jpg +01c27319df.jpg +01c85029ec.jpg +01cac9914d.jpg +01d32b09fc.jpg +01d5819c58.jpg +01df87d9f6.jpg +01e511dd0a.jpg +01e59422b4.jpg +01edebcbce.jpg +01ef116440.jpg +01f1b8341e.jpg +0206acee79.jpg +022bfc4821.jpg +022d215634.jpg +022edef9a2.jpg +02316c8186.jpg +0238bbb2bb.jpg +0239d0d5a7.jpg +023a796a76.jpg +024ecbe636.jpg +025cfec5be.jpg +0278898711.jpg +028a5cc045.jpg +028f33ab7c.jpg +028f6f02dc.jpg +029dccef6c.jpg +02aa4dd8e0.jpg +02b6041220.jpg +02c69f4bba.jpg +02ca0bd11a.jpg +02d021b259.jpg +02d6fdde8f.jpg +02dc80bb2c.jpg +02e4cccb07.jpg +02eba48e14.jpg +02f5bba666.jpg +02fa3d9b8f.jpg +02fbd005a8.jpg +02fddb62d6.jpg +030032ca2e.jpg +03041dc01c.jpg +031dc349ff.jpg +032e125685.jpg +035c53bf20.jpg +036a2defb7.jpg +03738629b3.jpg +03746f23c4.jpg +037cc04300.jpg +037f30a4e3.jpg +038b7aa019.jpg +0393c27955.jpg +03a6a8a570.jpg +03ad81c7b5.jpg +03c2d7f857.jpg +03c32dddf8.jpg +03c47ef88d.jpg +03cc1edd0e.jpg +03cd09c91f.jpg +03cd80ed06.jpg +03d149d165.jpg +03d22720aa.jpg +03d3c27f7a.jpg +03e3ae939c.jpg +03e3b90ca4.jpg +03f356fe17.jpg +03f8f24712.jpg +03fae3159a.jpg +04036c7252.jpg +041cd91ca1.jpg +04273762f8.jpg +043269baaf.jpg +04422875b1.jpg +04485d9a84.jpg +0452977bb1.jpg +04847008b9.jpg +049c923c84.jpg +04a734e8fe.jpg +04abde7da2.jpg +04bb1e0060.jpg +04c3d716fe.jpg +04c6959507.jpg +04d33728da.jpg +04d8254fae.jpg +04d91746ac.jpg +04da4eae15.jpg +04e627551d.jpg +04eead3204.jpg +04f8432a85.jpg +04fae812b6.jpg +051940c6a8.jpg +051c6e7953.jpg +051cd8938b.jpg +052848d83f.jpg +0561a723c2.jpg +056f2717f0.jpg +0593141037.jpg +05964ba10f.jpg +059724fedf.jpg +059f59685b.jpg +05aa6bd703.jpg +05b1c6eb5e.jpg +05ba0fbc8b.jpg +05bc8981ae.jpg +05c61c4de6.jpg +05cfbcd37e.jpg +05d3daf506.jpg +05d717f3f1.jpg +05dcd69230.jpg +05dcfc5d65.jpg +05dd944449.jpg +05e1e680c4.jpg +05e7b956a1.jpg +05f554924d.jpg +05f877bb0f.jpg +05fb2c51b4.jpg +05fe631f10.jpg +060ce9d3b2.jpg +0614b84c02.jpg +0621aae746.jpg +06280e0e90.jpg +063213d78d.jpg +0643c063b4.jpg +06484d73cd.jpg +0654d29579.jpg +065be5032f.jpg +065cd93b30.jpg +066bd76a53.jpg +067a6aa6b2.jpg +06835c0a9b.jpg +0688cfa5b0.jpg +068d858210.jpg +068eb22d54.jpg +069b06412b.jpg +06b55befef.jpg +06bd9b5d5d.jpg +06c4788dc8.jpg +06c703d6c0.jpg +06cf3bdbd3.jpg +06d75254e9.jpg +06eb65e412.jpg +06ecfa577b.jpg +06f98e4d59.jpg +07013bcfad.jpg +07028bd256.jpg +0724a69146.jpg +072d349b8c.jpg +072f9c71e2.jpg +0766698b5b.jpg +0792fbfc5f.jpg +079924a993.jpg +079a5a59b6.jpg +079ae89273.jpg +079ec30196.jpg +07a5cc719e.jpg +07bd801e60.jpg +07c38a0173.jpg +07ca89c1bc.jpg +07d0d23063.jpg +07d2fe875b.jpg +07de525f7e.jpg +07e415c279.jpg +07e520a249.jpg +07efb71591.jpg +07fb4f4204.jpg +08003e498c.jpg +0803501c37.jpg +080dc1a3ae.jpg +081480fce5.jpg +0821b23834.jpg +0822b058f0.jpg +08552469cb.jpg +088e2f2031.jpg +08bcbf1ef6.jpg +08bce8125e.jpg +08c3509acc.jpg +08c48211cf.jpg +08c85fa5da.jpg +08c8b5e5ec.jpg +08df7b8dff.jpg +08dfa2a4af.jpg +08e430193c.jpg +08e545731e.jpg +08e7706a76.jpg +08e9b77f69.jpg +08eb787186.jpg +08fab173b1.jpg +091d0a6004.jpg +092352d4b5.jpg +092f69576c.jpg +093e1dfa3c.jpg +093e5804fc.jpg +094d99950f.jpg +096f0043fc.jpg +097644b0bc.jpg +098cbe56d6.jpg +09985ebeae.jpg +09aa34390a.jpg +09b4301033.jpg +09bd1764de.jpg +09c33dc374.jpg +09cc594c9d.jpg +09d4103619.jpg +09d62734c3.jpg +09d7b2b2d2.jpg +09f449e0e2.jpg +09f6c5633b.jpg +09f9dcacc4.jpg +0a063d3b6c.jpg +0a171577e4.jpg +0a19b1cc1c.jpg +0a2aacf4f1.jpg +0a3091ecbc.jpg +0a4c8f7d0f.jpg +0a4fc6271d.jpg +0a6ab701f1.jpg +0a9afbf719.jpg +0abf6a45cc.jpg +0ac1292dea.jpg +0ac55a5b7e.jpg +0ac7727a6e.jpg +0acae8f493.jpg +0acbe91a79.jpg +0acde8999a.jpg +0ad78a9010.jpg +0ae65d92ec.jpg +0aeae60b72.jpg +0aee3b209a.jpg +0aef935a2e.jpg +0af3dd4fdc.jpg +0af5f94d33.jpg +0b182945e3.jpg +0b195c7d99.jpg +0b1a066d82.jpg +0b2ba8649e.jpg +0b2bddd667.jpg +0b30f680db.jpg +0b514c4934.jpg +0b5d7152d0.jpg +0b6c2debff.jpg +0b6d7e1daa.jpg +0b8e369385.jpg +0b8e43390e.jpg +0b9ddd4512.jpg +0ba09a8bdb.jpg +0bae1f29a1.jpg +0baf714b04.jpg +0bc0416dce.jpg +0bc2b4b7b1.jpg +0bccdc6987.jpg +0bd24c214e.jpg +0bd98665f9.jpg +0bdce5b08e.jpg +0bded8f743.jpg +0bdf5bb0d1.jpg +0beb979657.jpg +0beebf87ed.jpg +0c003d0c29.jpg +0c04399618.jpg +0c08129941.jpg +0c0b57a78a.jpg +0c135cb04b.jpg +0c1efa2832.jpg +0c2263c920.jpg +0c232a54ab.jpg +0c26cf3536.jpg +0c2b705853.jpg +0c2e04a08d.jpg +0c304a4ff3.jpg +0c390c2f4b.jpg +0c3ef7f144.jpg +0c59058810.jpg +0c71cf2630.jpg +0c7acc1825.jpg +0c7d923e02.jpg +0c956284b1.jpg +0caa11b5d4.jpg +0cac96a888.jpg +0caf4525bc.jpg +0cb1254837.jpg +0cbd7768e3.jpg +0cbe310ae5.jpg +0cc61221c0.jpg +0cd617999d.jpg +0cd9f7db4a.jpg +0cdcffe483.jpg +0cddc1311f.jpg +0cde690540.jpg +0cdf21510a.jpg +0cdfa5296b.jpg +0cdfc959e2.jpg +0ced00666a.jpg +0cf26a167f.jpg +0cf43265b1.jpg +0cfb95a072.jpg +0d083776ba.jpg +0d11c49af9.jpg +0d2c37a71a.jpg +0d37f2728d.jpg +0d4d00f3ed.jpg +0d4d894d96.jpg +0d4d8ba6fc.jpg +0d5b3d55b0.jpg +0d5dabbb26.jpg +0d633aa172.jpg +0d69047b0c.jpg +0d6b6f2735.jpg +0d72d16574.jpg +0d7a27c574.jpg +0d8f22c724.jpg +0d9a8cb6fa.jpg +0d9e7979c4.jpg +0d9f92d646.jpg +0da9ae0dcd.jpg +0dbfd1fee0.jpg +0dcbc9737d.jpg +0dd5aece23.jpg +0dddd2c218.jpg +0de95a6876.jpg +0def2c71d9.jpg +0df1403d58.jpg +0df1f4904a.jpg +0e000f7de6.jpg +0e1f444d47.jpg +0e1fc02b80.jpg +0e47bc1579.jpg +0e48e58488.jpg +0e541f9bdd.jpg +0e5bea5d02.jpg +0e6283108d.jpg +0e65f28295.jpg +0e66320fbe.jpg +0e7127de63.jpg +0e74b6efe5.jpg +0e791ea9a4.jpg +0e7b1231b4.jpg +0e7bf8c62c.jpg +0eac3e0250.jpg +0eacbcee9a.jpg +0eb1e470a9.jpg +0ec3ebb974.jpg +0ec7d23b02.jpg +0ec7e10f15.jpg +0ec8a31f51.jpg +0ed0e1dfbd.jpg +0ed6d872ec.jpg +0edd209330.jpg +0edda912c4.jpg +0ee6b4a092.jpg +0ee737b7d6.jpg +0ef36a04fa.jpg +0efa8bea3e.jpg +0efb6bcd25.jpg +0efbf2cb55.jpg +0f0ef0763a.jpg +0f0f31f45b.jpg +0f1e23a821.jpg +0f32f1f007.jpg +0f4bfd02c6.jpg +0f61066af8.jpg +0f6e7e856b.jpg +0f76597651.jpg +0f78cc0bb7.jpg +0f79a18e5e.jpg +0f86cfedb5.jpg +0f86e3bff3.jpg +0f9d2ecaad.jpg +0fa70ae245.jpg +0fb6b629ef.jpg +0fbbd13a46.jpg +0fc38c3ebf.jpg +0fc3b8cc4c.jpg +0fd1ced2e9.jpg +0fdda22904.jpg +0feac1473f.jpg +0ff9de5e04.jpg +0ffc787f30.jpg +100042e57f.jpg +100238cc9a.jpg +10037c35f0.jpg +1010c2c9d5.jpg +1018c2dc90.jpg +101e152ba2.jpg +1026d89758.jpg +102eefe79c.jpg +1035241ae8.jpg +10353d120d.jpg +10355a5693.jpg +1037e5fa9c.jpg +10598ea5f0.jpg +105e6c78bb.jpg +106059feee.jpg +10632ce742.jpg +106f49c70c.jpg +106ff651c2.jpg +1076de97b3.jpg +108ab35fa6.jpg +1094c72cc7.jpg +10a2bde9b4.jpg +10a66686d2.jpg +10a7df1164.jpg +10abaae8d8.jpg +10bc205943.jpg +10c5520861.jpg +10cb0a3001.jpg +10cbc0fa73.jpg +10d057d0e0.jpg +10d651d87d.jpg +10db452333.jpg +10ddfecce0.jpg +10df5d7f4e.jpg +10df6f4a9a.jpg +10e632ef99.jpg +10ed34bc30.jpg +10f066fb8e.jpg +10f61d159d.jpg +10fc3e7cf2.jpg +110ed916b5.jpg +112bdd852a.jpg +112d616168.jpg +11542f2920.jpg +115737a627.jpg +116b0a8482.jpg +117ee56e2b.jpg +1180d01d5d.jpg +11957c8bda.jpg +11c14d047a.jpg +11d004253e.jpg +11d54de10a.jpg +11d671723f.jpg +11d931cbfa.jpg +11daa3e486.jpg +11dce53da0.jpg +11e3e446dc.jpg +11e472ea95.jpg +11e8ede6a9.jpg +11e9ec9652.jpg +11fc010999.jpg +120a9929a4.jpg +1220df4d8a.jpg +1224c4ce8c.jpg +12276f9762.jpg +1227d2f511.jpg +1232dc6eb7.jpg +1238c792c8.jpg +1246398e48.jpg +125ea03033.jpg +12635233d7.jpg +1264734b0e.jpg +12656aa63f.jpg +126d287d4b.jpg +126f8af52b.jpg +1275b11468.jpg +1279223077.jpg +1287d90a11.jpg +128cda091a.jpg +12a4048442.jpg +12b75eb6a1.jpg +12c6cd5830.jpg +12d1b2fb88.jpg +12d3763c33.jpg +12d842cbdc.jpg +12d87845ed.jpg +12d93bf184.jpg +12e535ae3d.jpg +12ea9832d3.jpg +130515a7a8.jpg +130e3f1b87.jpg +1325b56071.jpg +1326625c16.jpg +1330cdf81c.jpg +133a789a1e.jpg +1351c1c7c9.jpg +135392d039.jpg +135433f328.jpg +135f449f68.jpg +136e39657a.jpg +1374b31454.jpg +137c90cb27.jpg +137f2a6891.jpg +1386824d7a.jpg +1387cd8162.jpg +13bd790622.jpg +13bfd56239.jpg +13c176f8b8.jpg +13c902757a.jpg +13cb630a69.jpg +13cc1f5ad5.jpg +13ce17a1b2.jpg +13d5454679.jpg +13d8024a90.jpg +13db3406ff.jpg +13e739fec9.jpg +13eb6f3154.jpg +1406f4cac3.jpg +1407f87147.jpg +140b100346.jpg +140d275340.jpg +140df1c8fe.jpg +1410b27ac6.jpg +1416fa6f6a.jpg +1420eb832a.jpg +142aaec83c.jpg +142b5b4734.jpg +145c49c671.jpg +145f612e6e.jpg +14604aafc3.jpg +14682ed227.jpg +1470b4d430.jpg +1479d8f07f.jpg +147b6ab08f.jpg +149f9af31d.jpg +14c086bc32.jpg +14cd9b118e.jpg +14d16e5632.jpg +14d206a3a0.jpg +14d2157d92.jpg +14d3a530cf.jpg +14e7baf099.jpg +14eb23e5c2.jpg +14f316b423.jpg +14f42fa5e1.jpg +14fe19cb8e.jpg +15280bb6f7.jpg +152cdf47f8.jpg +153bfa77f1.jpg +15421aec54.jpg +1542c84c4d.jpg +154e86dcf6.jpg +154e9756c6.jpg +15531ad586.jpg +15592c2381.jpg +156606a82f.jpg +15688120aa.jpg +15806afab4.jpg +15934dc3bc.jpg +1598c75335.jpg +159b1942a3.jpg +15a3a5d104.jpg +15b5577a55.jpg +15c41b9219.jpg +15c486bb61.jpg +15c70b5be8.jpg +15cf3b2f26.jpg +15d3cd244d.jpg +15d9921016.jpg +15d9ca47b1.jpg +15dda1c602.jpg +15e665b55e.jpg +15e69f1158.jpg +15e6bdf1ea.jpg +15ed6eeda0.jpg +15ef743b2b.jpg +15f6d322e9.jpg +1606bd62e5.jpg +160a9d7f37.jpg +160cf233eb.jpg +161c460afc.jpg +161f763355.jpg +162a689ded.jpg +162e79b756.jpg +1641bfb29f.jpg +16542ee965.jpg +1658b11c29.jpg +165d061c3e.jpg +1666f7c9c4.jpg +166da9ae4c.jpg +168d2182c0.jpg +168da00144.jpg +169269120d.jpg +1693b0138d.jpg +16983c107e.jpg +169ae64f73.jpg +16a1e63bbb.jpg +16a3ac5447.jpg +16a60d6a6f.jpg +16bea00358.jpg +16c55921b9.jpg +16c76896a0.jpg +16dbc1e91b.jpg +16f552b4a4.jpg +16f66331e6.jpg +16fdb6fac0.jpg +17043d4ea8.jpg +170be51f68.jpg +170d163d2f.jpg +1718d68fdf.jpg +171c89eff8.jpg +1724c9a90f.jpg +1727f7984b.jpg +172d06a45e.jpg +174efd5f2f.jpg +174fe15531.jpg +1754d7d3fc.jpg +1759c28bc9.jpg +175a1290ad.jpg +1760e37e82.jpg +1762d5ae0f.jpg +1765856838.jpg +177318c696.jpg +177cffb6fb.jpg +17872c73b5.jpg +1792b2f6f8.jpg +179f24ecca.jpg +17abc9cf88.jpg +17ba190d71.jpg +17c6c112aa.jpg +17c9f975ed.jpg +17cd064dc8.jpg +17cd413068.jpg +17cf4923e1.jpg +17d1aa2f3c.jpg +17e8326606.jpg +17ebb7e636.jpg +17f4d7d1d2.jpg +17f8bd9bc5.jpg +17faf5aa10.jpg +180789c774.jpg +180f2122bb.jpg +1810f4be03.jpg +1815c32f98.jpg +181896bff6.jpg +1818eb93a4.jpg +181d53ce86.jpg +181dd25635.jpg +181e94f15c.jpg +181fb527dc.jpg +182240a5f8.jpg +182d383285.jpg +184e148514.jpg +185a807f1a.jpg +186d59ed96.jpg +186f151502.jpg +1872ad111b.jpg +1878d8273b.jpg +18822c112a.jpg +189585d1c6.jpg +1895b250ac.jpg +18c6abcfa0.jpg +18ce9a3330.jpg +18d289b39f.jpg +18e2d97fcd.jpg +191c49bff3.jpg +191cfa1c8a.jpg +1942e1af5e.jpg +19520a7a5f.jpg +197ca1588f.jpg +198bc22f13.jpg +19948823bc.jpg +199a20f910.jpg +199c05a788.jpg +199e49c557.jpg +19a2ee8b32.jpg +19a4226f0d.jpg +19af302f29.jpg +19b552211d.jpg +19b70e45a8.jpg +19bdd4622a.jpg +19c1cde389.jpg +19ce4b10df.jpg +19d2332070.jpg +19d587fb80.jpg +19dec01b2c.jpg +19e45cfea3.jpg +19f0b8969e.jpg +19f24d9ec6.jpg +19fe677413.jpg +1a0124169d.jpg +1a01902f2b.jpg +1a0319bb85.jpg +1a045b66ba.jpg +1a284ceb3c.jpg +1a35f6f228.jpg +1a374bb63a.jpg +1a3ae61f9d.jpg +1a53856b44.jpg +1a542383ea.jpg +1a6337a46d.jpg +1a6e57fe4a.jpg +1a73e9a66e.jpg +1a82e248fc.jpg +1a87efb8c8.jpg +1a8c6ae384.jpg +1a988e8eb7.jpg +1aa33c815f.jpg +1aaf7ce177.jpg +1ab10dff64.jpg +1ab7656852.jpg +1abc86ee10.jpg +1ac6f0206b.jpg +1acc61b070.jpg +1acdf03b95.jpg +1ad1047a73.jpg +1adf4bb236.jpg +1ae2d4864d.jpg +1aee965cf7.jpg +1af229b12d.jpg +1affcfa05b.jpg +1b01560260.jpg +1b031e28b3.jpg +1b27b961c6.jpg +1b299a318d.jpg +1b379b3bd3.jpg +1b3e517f38.jpg +1b6f72c45e.jpg +1b7ca3010f.jpg +1b80dfad06.jpg +1b824b72d4.jpg +1b84723605.jpg +1b8745334b.jpg +1b8a2b4eea.jpg +1b96810073.jpg +1ba7012db7.jpg +1bb0cb4d26.jpg +1bbc64465e.jpg +1bc2d2bb08.jpg +1bc5848101.jpg +1bc8c79a4c.jpg +1bca704f23.jpg +1bd8ff40cd.jpg +1bdb63afd8.jpg +1bdf48bab8.jpg +1bf974682d.jpg +1c042aae77.jpg +1c0b0afb0b.jpg +1c192fa4a7.jpg +1c2e600b67.jpg +1c33dc15c5.jpg +1c3aaad9a0.jpg +1c4c474579.jpg +1c5768f044.jpg +1c5b40df80.jpg +1c7d015cbc.jpg +1c7fa2aab4.jpg +1c86a355cd.jpg +1c9a578d6a.jpg +1cb2cca9ca.jpg +1cbafd783b.jpg +1cc481e0df.jpg +1cc4ea05e8.jpg +1ccd6c2940.jpg +1cd148399b.jpg +1cd6075a07.jpg +1cdb1e44e1.jpg +1cdc19f7e2.jpg +1cded3f00d.jpg +1ce0a35072.jpg +1ce12646f2.jpg +1ce9e04492.jpg +1cffb1948b.jpg +1d1371f3ea.jpg +1d150d0674.jpg +1d1b057a9a.jpg +1d2177e9d5.jpg +1d23a229d5.jpg +1d2a241ec4.jpg +1d2a7bbb65.jpg +1d2a9006d0.jpg +1d2f4a8689.jpg +1d318cf2a7.jpg +1d38f0f70b.jpg +1d49bf2d0e.jpg +1d4bfc4ed9.jpg +1d52f0f9ba.jpg +1d5c2c59fa.jpg +1d5dedb8c3.jpg +1d6d63595b.jpg +1d6fa4df6b.jpg +1d73418abb.jpg +1d81383aaa.jpg +1d8d6dd5a4.jpg +1d99797e25.jpg +1da741c658.jpg +1db2057f7d.jpg +1db220edc7.jpg +1db23dc150.jpg +1db49e30ea.jpg +1db7e31c43.jpg +1dbc887ef3.jpg +1dc9c667b2.jpg +1dd332a2a8.jpg +1dd3bb5f72.jpg +1dd77c682e.jpg +1ddcd9e7c7.jpg +1dddb4bdab.jpg +1dded0c1f8.jpg +1de9df5e05.jpg +1df363b0b6.jpg +1e175c30f8.jpg +1e1ed231c2.jpg +1e1fb08f8b.jpg +1e40cc31c9.jpg +1e46504144.jpg +1e4decced6.jpg +1e6805aa58.jpg +1e6c577b87.jpg +1e7f951e65.jpg +1e9426779c.jpg +1e951eefae.jpg +1e96e5bfe3.jpg +1e9b656b08.jpg +1ea72b04b6.jpg +1ec0e7f6c3.jpg +1ec58b4b7a.jpg +1ec8e6135c.jpg +1eca98abd8.jpg +1ed1cf2056.jpg +1ed4c5ab96.jpg +1ed52a133f.jpg +1edb0fdd46.jpg +1ee1c5be98.jpg +1ee9fb6080.jpg +1eed09cbfa.jpg +1eed0ff4a3.jpg +1eed3d60c0.jpg +1eee53201d.jpg +1ef019c2f6.jpg +1efbba4ed8.jpg +1f044328cd.jpg +1f1ab7f715.jpg +1f1f95e6c4.jpg +1f23dda965.jpg +1f2526c587.jpg +1f28bfc381.jpg +1f33deefd7.jpg +1f3aba1930.jpg +1f4104ffbc.jpg +1f4aaa2728.jpg +1f4d297a3e.jpg +1f51eea028.jpg +1f6c577a27.jpg +1f73b33c8d.jpg +1f7f2fbc57.jpg +1f95199144.jpg +1fa3e586bf.jpg +1fa44ddd29.jpg +1faaff6953.jpg +1facaec831.jpg +1fb785c088.jpg +1fc0340826.jpg +1fc2696914.jpg +1fc6c0ef98.jpg +1fc860debd.jpg +1fca4d3580.jpg +1fcb5a5582.jpg +1fcd637f36.jpg +1fcdae465c.jpg +1fcf27a85c.jpg +1fd239ceb9.jpg +1fd5b6f19f.jpg +1fdd1367a2.jpg +1ff104206c.jpg +1ffa0f2c14.jpg +200b4e755f.jpg +2017d59af1.jpg +20234db29b.jpg +203f6023a0.jpg +204530cdcb.jpg +20498bd310.jpg +2057baddae.jpg +2060fd64b9.jpg +206a34fee4.jpg +209f2fc2f5.jpg +20a99beb3d.jpg +20b3b2edd8.jpg +20b8a23875.jpg +20bdaca3a9.jpg +20c60c83f1.jpg +20c9444828.jpg +20ca619a11.jpg +20d544dd68.jpg +20d7be20df.jpg +20db77d84d.jpg +20e5291f14.jpg +20e6e69fde.jpg +20eae143a5.jpg +20f1d7ec75.jpg +210d365ae0.jpg +21168c9487.jpg +211786e79d.jpg +2117c08f77.jpg +211d825b0d.jpg +2120b1d2e1.jpg +214dad7eba.jpg +2165757401.jpg +2174f98387.jpg +2176c1949b.jpg +2178bdedb2.jpg +2189b810f3.jpg +2189e7cecc.jpg +218d4d2dbd.jpg +21963ff531.jpg +21c2b6ab89.jpg +21c3357ea5.jpg +21c4efbaa3.jpg +21c5b24405.jpg +21d9c768e7.jpg +21d9d680f2.jpg +21e63d0b78.jpg +21e67c7e0b.jpg +21eea9ee95.jpg +21f113feac.jpg +21f2149c9f.jpg +21f890998c.jpg +21f93e488e.jpg +21fe2b050e.jpg +2204c16a4b.jpg +220e000ac6.jpg +220f883b7b.jpg +2217b45885.jpg +22194e054b.jpg +22284c6c4c.jpg +223210ee56.jpg +225f7bb56f.jpg +226eb2e742.jpg +227335bc14.jpg +227db2879d.jpg +228b75e14c.jpg +228fb87425.jpg +22a4de5af9.jpg +22a9672d76.jpg +22ba78ec04.jpg +22c05cbf0b.jpg +22c5427e4a.jpg +22c946d35c.jpg +22cc3d2dcc.jpg +22d4b9d2a4.jpg +22dbe74913.jpg +22ddd60052.jpg +22df5af41d.jpg +22dfe58afa.jpg +22f0400166.jpg +22f278cd4d.jpg +22fde93fe0.jpg +22ff5900ff.jpg +2301f97931.jpg +23049ff496.jpg +2306d0d515.jpg +23072cfd09.jpg +2314c0ded6.jpg +2315bc9015.jpg +232c71c92c.jpg +234f6b6ccf.jpg +234fb5a197.jpg +235254cfe2.jpg +2358ee9dae.jpg +235e0f9b2b.jpg +235e304960.jpg +238ba4d6ae.jpg +239968fc2b.jpg +23a2ba5807.jpg +23b63f2b20.jpg +23bb9395a0.jpg +23c283de23.jpg +23c3e69301.jpg +23cb782b40.jpg +23cfca0463.jpg +23d133aed1.jpg +23d9c07708.jpg +23db64bbaa.jpg +23e3102640.jpg +23e3e97fd0.jpg +23e814b9e9.jpg +23f159fc6f.jpg +23f4833bb4.jpg +23fcb8fd0d.jpg +23fd7cb4a6.jpg +240034f269.jpg +24050ec976.jpg +2407dbe469.jpg +2412f58cac.jpg +243257f4eb.jpg +2434e23aa8.jpg +243c7caeab.jpg +244020d5df.jpg +244b327271.jpg +244d08a347.jpg +246dab1e13.jpg +2470461d92.jpg +24798308df.jpg +24876b7f88.jpg +249cbd5b43.jpg +24a098332a.jpg +24ac7aecff.jpg +24acce11bc.jpg +24c1e063f6.jpg +24c5c599fc.jpg +24c9d79f17.jpg +24d244bbcb.jpg +24d30aba80.jpg +24d3467858.jpg +24d3dbe446.jpg +24d4ea3def.jpg +24dd084656.jpg +24e139cdca.jpg +24e9cf442a.jpg +24efe8c2ab.jpg +24fc0ca3d3.jpg +24ffbffd4f.jpg +24ffcd0084.jpg +2509bb05d2.jpg +250cbb62f8.jpg +25264958c9.jpg +25466a2e20.jpg +25673bc6b3.jpg +256e700cf2.jpg +2588a7749c.jpg +2593614346.jpg +2597f94b50.jpg +25997b88d3.jpg +259b80ee58.jpg +259e9d5357.jpg +259f2e0d9f.jpg +25a673744b.jpg +25afaa5204.jpg +25b5740bf5.jpg +25b975c5d2.jpg +25bb04ccdf.jpg +25c0367664.jpg +25c64f4b46.jpg +25c8d17a5a.jpg +25d617ecdb.jpg +25d73a607d.jpg +25dc077e29.jpg +25dfc3e644.jpg +25e2364bc5.jpg +25ee5727e3.jpg +25f6148b88.jpg +2612bad6c5.jpg +261e367f83.jpg +262a4a4558.jpg +262a6ac352.jpg +264726dd50.jpg +264e1195b9.jpg +264e1f2514.jpg +264f53ac00.jpg +265c354481.jpg +2662012948.jpg +267ccc5cb1.jpg +268aefbfe4.jpg +268c35f9f4.jpg +26948ac5f2.jpg +2697d313c8.jpg +269eacf173.jpg +269f346871.jpg +26a32f2b3c.jpg +26b4d3f93d.jpg +26cbc4bfa1.jpg +26d1c4a6cb.jpg +26d297e26e.jpg +26d460b6e5.jpg +26df6c8373.jpg +26e06762de.jpg +26e21e4871.jpg +26ea34ede6.jpg +26f2da4672.jpg +26ff5b9368.jpg +270ad27295.jpg +2722d48b25.jpg +27303f93ec.jpg +273184a519.jpg +2732d0cb88.jpg +274812f6cb.jpg +2768f4c3cc.jpg +27747c2ffe.jpg +27752973a4.jpg +2775dc4f36.jpg +278b4a9223.jpg +278c13af87.jpg +27a4944974.jpg +27b59aad99.jpg +27b7bbc937.jpg +27c9bff601.jpg +27d009cfad.jpg +27d9a151b6.jpg +27dd1dfff9.jpg +27e1bcd34c.jpg +27e5fb1a22.jpg +27fb6e7ecb.jpg +27fd68b0ef.jpg +280a45057f.jpg +282c67714f.jpg +282d352f0a.jpg +282eb2d540.jpg +283a89daa5.jpg +283b9d6370.jpg +28495f140f.jpg +28511fb11e.jpg +285c0ed9a0.jpg +288ce1a364.jpg +289b3b190f.jpg +28a2badea4.jpg +28c746cd92.jpg +28ce5ad5b4.jpg +28d1d577e3.jpg +28d21b8ef9.jpg +28db26f35a.jpg +28e295e3ad.jpg +28f2dacbb6.jpg +28f9c13504.jpg +2902e8c0b0.jpg +2907b934b5.jpg +290a3a3811.jpg +291f47c406.jpg +291fafca91.jpg +292ed99145.jpg +295335ec54.jpg +2958d6bd31.jpg +296de4bc83.jpg +29750a17b0.jpg +297766ca83.jpg +29778c7a88.jpg +2982d0c680.jpg +2985d93847.jpg +299021ff24.jpg +2999396e50.jpg +29b5db2061.jpg +29c1979a1f.jpg +29c87791c0.jpg +29c9aacac5.jpg +29cd643dc7.jpg +29d020b028.jpg +29d2ad5d48.jpg +29d404a5a3.jpg +29d8e2432b.jpg +29de2bddda.jpg +29debf9472.jpg +29e11632ba.jpg +29e2d12147.jpg +29fa5b54fd.jpg +2a03045925.jpg +2a06986e7d.jpg +2a0bf546b0.jpg +2a0f0cf323.jpg +2a1ba1b6f4.jpg +2a1cfad9d3.jpg +2a23d3c77e.jpg +2a3051c049.jpg +2a37a3e95a.jpg +2a4138dd9b.jpg +2a432d3df0.jpg +2a46655e25.jpg +2a503483d8.jpg +2a59ab4017.jpg +2a59e50b49.jpg +2a621bb147.jpg +2a76865d1c.jpg +2a872a675e.jpg +2aabea8fe5.jpg +2ac9c16c5e.jpg +2acb855d49.jpg +2acbb58837.jpg +2adb8e5f75.jpg +2ae47dab6f.jpg +2aeec1f648.jpg +2af385af25.jpg +2afe54db38.jpg +2afe744e20.jpg +2b063917d4.jpg +2b07685141.jpg +2b126cff01.jpg +2b13b82ead.jpg +2b15ada604.jpg +2b22a552d3.jpg +2b22b25945.jpg +2b27c5113b.jpg +2b31b85ce7.jpg +2b386deb7a.jpg +2b40c73cea.jpg +2b41d81215.jpg +2b5278ec0b.jpg +2b62c1a1fe.jpg +2b6851fef4.jpg +2b729ab583.jpg +2b7f741336.jpg +2b80692474.jpg +2b9741e802.jpg +2b97b411c1.jpg +2b9e548289.jpg +2bab9bd485.jpg +2bc3311fc7.jpg +2bc53baefd.jpg +2bc5b32f07.jpg +2bc9a70455.jpg +2bcaa0952a.jpg +2bcb94f40c.jpg +2bccbbb586.jpg +2bd0bef1b0.jpg +2bd625964c.jpg +2bdb01deab.jpg +2bdcb7f738.jpg +2bdd617760.jpg +2be5ee456d.jpg +2bebc0c0e3.jpg +2bed94883e.jpg +2bedb2db73.jpg +2c030a50c5.jpg +2c1928ba8d.jpg +2c4425fa5c.jpg +2c4829c0d8.jpg +2c51bfd67d.jpg +2c6f2a4553.jpg +2c6fd04fbe.jpg +2c7aa17512.jpg +2c804f261d.jpg +2c82657315.jpg +2c94827ea4.jpg +2caac0a658.jpg +2cabc070de.jpg +2cc5d0d36d.jpg +2ccaa53145.jpg +2cce4ccafc.jpg +2ccf5d8d51.jpg +2cd1135bbb.jpg +2cdb79d93d.jpg +2cdbf3701a.jpg +2cdf699a42.jpg +2cff5508ab.jpg +2d0d258abc.jpg +2d125a2750.jpg +2d131bea99.jpg +2d2603fe6a.jpg +2d3247c5ab.jpg +2d38818607.jpg +2d4d05e184.jpg +2d54495a40.jpg +2d60fa95f2.jpg +2d67bd63ce.jpg +2d6f310618.jpg +2d70786107.jpg +2d7a79f999.jpg +2d7fc374a1.jpg +2d84f76ecd.jpg +2d871c5d2d.jpg +2d8d493285.jpg +2d9297b006.jpg +2d94236cf4.jpg +2db314c970.jpg +2dc3839775.jpg +2dc6edf768.jpg +2dc8e7ab68.jpg +2dcaf4f1ae.jpg +2dd45f13d7.jpg +2dd8c59ace.jpg +2dd95d82ef.jpg +2dd99a60a4.jpg +2dd99fe83a.jpg +2dda2b515a.jpg +2ddadc8ee8.jpg +2ddca3e307.jpg +2de079c0d4.jpg +2de1295ec8.jpg +2df7675678.jpg +2df7db0398.jpg +2df95b6bb6.jpg +2dfc7e562c.jpg +2dfed7b9a8.jpg +2e0204afb1.jpg +2e037d0348.jpg +2e04274b65.jpg +2e06038e86.jpg +2e08500b6b.jpg +2e0c6a3426.jpg +2e15170436.jpg +2e17194184.jpg +2e20e24d05.jpg +2e497b59b9.jpg +2e4d50d9b5.jpg +2e50bb7112.jpg +2e5378f4e9.jpg +2e548cf3cd.jpg +2e6c18d4d1.jpg +2e6ef86d11.jpg +2e75827c95.jpg +2e7fb1643f.jpg +2e8873a75c.jpg +2e9d39f020.jpg +2eb21afce4.jpg +2eb61c4aa6.jpg +2ebe7ad44e.jpg +2ec7bfdd42.jpg +2ec7fbcb0a.jpg +2ec8b2e403.jpg +2edd6a9510.jpg +2edd7f6426.jpg +2eefbd311b.jpg +2ef269215d.jpg +2ef58d055d.jpg +2efaeff89f.jpg +2f0008de6a.jpg +2f0c07b18d.jpg +2f0faa8ec3.jpg +2f1158d876.jpg +2f1609d0ef.jpg +2f1c47a72f.jpg +2f1eaa286e.jpg +2f24d3de52.jpg +2f38df326c.jpg +2f43cc2cf4.jpg +2f5d01f24f.jpg +2f60e2e1eb.jpg +2f6a70ef7e.jpg +2f6c63d1f1.jpg +2f6e86181d.jpg +2f81739e78.jpg +2f8b8ee24f.jpg +2f8f3d0911.jpg +2fa15ee1a8.jpg +2fa5bdaf8b.jpg +2fac9a2c9d.jpg +2fb7f7f441.jpg +2fc747c9aa.jpg +2fcb5b8b1b.jpg +2fd3ac2e81.jpg +2fd48c2d80.jpg +2fda7a3145.jpg +2fe0d0d947.jpg +2fe51bf0d1.jpg +3002b59676.jpg +30051ee4a1.jpg +3005430d29.jpg +30075005ca.jpg +3013a4c452.jpg +301c11ee1c.jpg +301db4839b.jpg +304fe3afed.jpg +305ec569bc.jpg +306d1ff7be.jpg +3076a5d361.jpg +3083b0d08d.jpg +308b4dbd6a.jpg +309465d496.jpg +30a6321da3.jpg +30bc6ec89a.jpg +30bcd78bd3.jpg +30bede681f.jpg +30c2c46109.jpg +30c3c24113.jpg +30c5fe4aeb.jpg +30ca6254e7.jpg +30cd7c7327.jpg +30d0225e76.jpg +30da287e62.jpg +30df788a2b.jpg +30e01d60e5.jpg +30ea1ea341.jpg +30fa73558b.jpg +30fea35e76.jpg +3100469503.jpg +3106c00667.jpg +310cf979ea.jpg +310e8a5104.jpg +3111a28983.jpg +31185ad749.jpg +311fa37c20.jpg +312a1206ca.jpg +312a9c874d.jpg +313272b44a.jpg +313b86c342.jpg +314a36b899.jpg +316b3720a1.jpg +318b34c8ba.jpg +319e707641.jpg +31a3464eed.jpg +31b6cee24a.jpg +31be528ec0.jpg +31c42d8d49.jpg +31c6dfc997.jpg +31ccb84ea3.jpg +31ddfb4110.jpg +31f298fb32.jpg +31f38e649b.jpg +31f85f532f.jpg +31fa443bf2.jpg +31fa9c1f5a.jpg +31fd959687.jpg +32045e78a3.jpg +32133cf143.jpg +322ed74368.jpg +323a350f92.jpg +323ea75397.jpg +325f868e6e.jpg +3262f8be53.jpg +3269b71332.jpg +3270803ec4.jpg +327200cf59.jpg +32835a4b6d.jpg +3295271038.jpg +32a47cb30f.jpg +32a55996ec.jpg +32a8508223.jpg +32b7563849.jpg +32ba785964.jpg +32c51954fd.jpg +32c5c1d8fd.jpg +32c7dc03dc.jpg +32c991be20.jpg +32ca65987e.jpg +32cc378a8d.jpg +32d0ec6236.jpg +32da4646e7.jpg +32dfcd6359.jpg +32e3a074ab.jpg +32e70b0f53.jpg +32f18e96db.jpg +3305411c03.jpg +3317432703.jpg +331e369e0d.jpg +3322e6491b.jpg +3328abc4b0.jpg +334b934ab2.jpg +3357caf6ed.jpg +33617b8dfa.jpg +336d676d05.jpg +337d2d900f.jpg +33836b8ad0.jpg +3395333a74.jpg +3398a95e41.jpg +33a2e66f7f.jpg +33a7e37c0e.jpg +33c028b6d4.jpg +33c44d1886.jpg +33c4659ae9.jpg +33c48f1697.jpg +33d494df10.jpg +33d948a76a.jpg +33e0c452f8.jpg +33e2dadde0.jpg +33e6cac66f.jpg +33e7ef56d3.jpg +33eb9f3d74.jpg +33f01c31b3.jpg +33f7ea3937.jpg +33fe91efc4.jpg +34204b79dd.jpg +34214f8e73.jpg +342605b812.jpg +3426ca8534.jpg +342d8b1f6d.jpg +3433da4dcf.jpg +343425c845.jpg +34366016da.jpg +343f724081.jpg +3440f61518.jpg +3441284576.jpg +344a4aa3a4.jpg +34529ae106.jpg +345de705b9.jpg +3479d2550b.jpg +3483deb353.jpg +348740609a.jpg +348d6ded0d.jpg +349537d78f.jpg +349fbbee75.jpg +34a5c6b9e7.jpg +34ac57cf71.jpg +34ade396a5.jpg +34b8e5f702.jpg +34bd0272d7.jpg +34c054d349.jpg +34c1bbc000.jpg +34c8d0344b.jpg +34cb76a905.jpg +34d483f136.jpg +34d619687c.jpg +34dbc418f1.jpg +34dcc16e48.jpg +34dd57b626.jpg +34e2242cb8.jpg +34e48eacf9.jpg +34e4dece1e.jpg +34ec442c8c.jpg +34ee85ac88.jpg +3505ce9121.jpg +351cdcc015.jpg +353ef36e99.jpg +35588a9aba.jpg +35596f3a61.jpg +35597f8ddc.jpg +358430f1fe.jpg +35b961cc96.jpg +35c318b935.jpg +35c563c044.jpg +35ca4a89e5.jpg +35d77fd8f9.jpg +35d9fdf333.jpg +35de99bb2f.jpg +35e4fbbc00.jpg +35f2a46b6e.jpg +35f4fe89de.jpg +35f7a48dac.jpg +35f9d3ffdd.jpg +3612656538.jpg +3618f9ada2.jpg +3628d7e3ee.jpg +362e9bf2ef.jpg +3636f65e5a.jpg +363dd687ba.jpg +36458e3d67.jpg +3652524eec.jpg +3656ceecea.jpg +365fb7d1d9.jpg +3664cfcf0c.jpg +366b0a14e0.jpg +368706589f.jpg +368d7b7b1e.jpg +369bb06041.jpg +369c32e7b4.jpg +369f9b268e.jpg +36a7e316a6.jpg +36b1550969.jpg +36c17f90ab.jpg +36c64f9cff.jpg +36cbc9a7f4.jpg +36cdc5282c.jpg +36d467c1d6.jpg +36e017ff4a.jpg +36e746984a.jpg +36f2158219.jpg +36fe6a372f.jpg +37065ce5c2.jpg +3708605ebf.jpg +371c920a7e.jpg +37384ea36c.jpg +3744cbf028.jpg +374c977066.jpg +375cae9a99.jpg +375e1cb026.jpg +376f099775.jpg +379ea5dbf3.jpg +37a288a16d.jpg +37a6a1c4e7.jpg +37c71f4e61.jpg +37d04fdb5d.jpg +37d34392eb.jpg +37db19610e.jpg +37db198c6c.jpg +37e228bfa6.jpg +37eabd3c50.jpg +37ee76df71.jpg +37f9c9eb9b.jpg +37fe73ce26.jpg +3826264e4a.jpg +383439dee0.jpg +383b6c27b5.jpg +383ec64ad3.jpg +38431292d1.jpg +38496ff638.jpg +3857adf671.jpg +386756e960.jpg +38777c3868.jpg +388066a94e.jpg +3881ae02d1.jpg +3891555950.jpg +389ddcfc3a.jpg +38b21591f0.jpg +38ba45bc18.jpg +38cab74b1b.jpg +38ce25cbea.jpg +38d23dc53a.jpg +38d37d5e8c.jpg +38d550f892.jpg +38d5594831.jpg +38dca6c3c5.jpg +38dcfca863.jpg +38e24e78ab.jpg +38eec993d6.jpg +38f6b1b0d6.jpg +392bf1da68.jpg +392c5e79ca.jpg +39385b8cc7.jpg +393b58ad51.jpg +393c047300.jpg +393f2ad1fc.jpg +3949310211.jpg +39565df5d9.jpg +396a433bcc.jpg +396b3d55ae.jpg +396fbd2d52.jpg +3978ebdb51.jpg +3979fb907b.jpg +397febea5d.jpg +3982493a8c.jpg +398dad15f1.jpg +398f0a7ae9.jpg +3994c80bc9.jpg +3995620f3e.jpg +39a777179d.jpg +39b4076e5e.jpg +39b742f7da.jpg +39bb3b2290.jpg +39cce3ef08.jpg +39ccf756d1.jpg +39ce7be06b.jpg +39d1413c42.jpg +39d2eaf92b.jpg +39d3058618.jpg +39d58b0d3b.jpg +39d5c57c75.jpg +39dc13e015.jpg +39e0045b3e.jpg +39e296bf64.jpg +39e54d3e8d.jpg +39eb12071d.jpg +39eb960ef5.jpg +39ec607202.jpg +39ef3afe35.jpg +39f1343628.jpg +39f418a23a.jpg +39ff4f6aa6.jpg +3a1e71a749.jpg +3a2c7d8876.jpg +3a2cf07216.jpg +3a3953c910.jpg +3a3ba14306.jpg +3a6402028c.jpg +3a6c975555.jpg +3a8edbd8c0.jpg +3a8fe6ebbc.jpg +3a9668c3e4.jpg +3aadc614b8.jpg +3aae6a34c6.jpg +3abb3f0d99.jpg +3abded4a8e.jpg +3ac002a6a4.jpg +3ac35247a6.jpg +3ad19d2ce3.jpg +3ad4bbd50f.jpg +3ad4e37858.jpg +3adbad140f.jpg +3ae1bf28c5.jpg +3aeda49909.jpg +3af6d490f4.jpg +3afece59ef.jpg +3b000c05ef.jpg +3b071b72bc.jpg +3b0a48dd0b.jpg +3b24474de7.jpg +3b2d0b5ecd.jpg +3b2e40eb64.jpg +3b2e56b2b6.jpg +3b42514797.jpg +3b585358a9.jpg +3b5999ca2f.jpg +3b702c1124.jpg +3b7a55e193.jpg +3b7e6fcd66.jpg +3b80b7181f.jpg +3b810c3f73.jpg +3b8b507571.jpg +3b8d1a03ce.jpg +3b8f0a607f.jpg +3b947ef176.jpg +3b99dd481c.jpg +3bbe6889e9.jpg +3bcba416cb.jpg +3bd15af01c.jpg +3bd2106a64.jpg +3bd4855adb.jpg +3bd4977a86.jpg +3be135305b.jpg +3bedbf0df0.jpg +3bf19389b8.jpg +3bf3577778.jpg +3bfa57c53a.jpg +3bfece5b2f.jpg +3bfffa7edd.jpg +3c004c5a27.jpg +3c04cb78f1.jpg +3c17cc854a.jpg +3c25a8d9ad.jpg +3c504accf1.jpg +3c53d67788.jpg +3c56b492ca.jpg +3c5b821f4a.jpg +3c6b723d86.jpg +3c6f3b63e4.jpg +3c76c4ab55.jpg +3c7cb9abae.jpg +3c7dc24622.jpg +3c8abf17a4.jpg +3c8d168a89.jpg +3c8fc39a68.jpg +3cad6563a5.jpg +3cadc4a7b4.jpg +3cae0ce4c3.jpg +3cb0963d0b.jpg +3cb6ccf410.jpg +3cbb3a416a.jpg +3cc829a98c.jpg +3cc9a6acb5.jpg +3cd1cc4347.jpg +3cde274cd1.jpg +3ce184723f.jpg +3ce3248c0c.jpg +3ce347b251.jpg +3ce7825862.jpg +3cf10340e3.jpg +3cf438a2ad.jpg +3cf9efbd13.jpg +3cfa0e2280.jpg +3cfc54bfd2.jpg +3cfd065aca.jpg +3cfeb45c63.jpg +3d054888a4.jpg +3d0d49e74d.jpg +3d0e25c7fc.jpg +3d20771f58.jpg +3d23ef35a6.jpg +3d2d274acb.jpg +3d2f657bc0.jpg +3d3b30b677.jpg +3d4c7dcaad.jpg +3d50f7f5d5.jpg +3d51679110.jpg +3d62272f71.jpg +3d6ae3952e.jpg +3d8020dc10.jpg +3d822cf01d.jpg +3d8275de25.jpg +3d8a49e2de.jpg +3d959e53f6.jpg +3d97f73b9e.jpg +3db71009fb.jpg +3dbaada79f.jpg +3dcdbaabf9.jpg +3dcf220ea0.jpg +3dd64fd861.jpg +3dd7c1c9d6.jpg +3ddca27320.jpg +3ddeb400bc.jpg +3de0c9b504.jpg +3de1ddee98.jpg +3de27609ae.jpg +3de6c5d3b8.jpg +3de91d290f.jpg +3de9e0d226.jpg +3dfd2060e7.jpg +3dfd90c4a3.jpg +3e02f32726.jpg +3e0e7db41c.jpg +3e12c234a3.jpg +3e227d3797.jpg +3e2be0c1da.jpg +3e3940c0d3.jpg +3e3abb7458.jpg +3e4a495588.jpg +3e4e72ae08.jpg +3e63e8d575.jpg +3e770156e4.jpg +3e88fc0138.jpg +3e8c8fa2e0.jpg +3e9105d4eb.jpg +3eb9c4747c.jpg +3ec32e10cb.jpg +3ec480ee42.jpg +3ec9ee626c.jpg +3eccb61abb.jpg +3ed1347071.jpg +3ed992795a.jpg +3edcaac9fe.jpg +3ee3e0c120.jpg +3eeaa4eac2.jpg +3ef506707c.jpg +3ef5ad979d.jpg +3f017cb874.jpg +3f0431b5a5.jpg +3f1abdb411.jpg +3f27c891b4.jpg +3f293f8622.jpg +3f335e6d88.jpg +3f5c43ea8d.jpg +3f66a7d89d.jpg +3f6814fca7.jpg +3f709c9cdf.jpg +3f74a50507.jpg +3f7ac5dd62.jpg +3f7e178bfa.jpg +3fba58950d.jpg +3fbced6b04.jpg +3fc4a0dfc2.jpg +3fc6eaaeae.jpg +3fcb1ba50e.jpg +3fd70338f6.jpg +3fd85569aa.jpg +3fdb9693af.jpg +3fdc0fb07c.jpg +3fdd54522e.jpg +3fdf128260.jpg +3fea66a254.jpg +3ff30e49b8.jpg +3ffa095829.jpg +40097c6800.jpg +401f8f7a2b.jpg +4023d9b0e9.jpg +4026f135b0.jpg +402a9d3357.jpg +403c70eae9.jpg +40515916d7.jpg +4080607c2c.jpg +408d0dccf4.jpg +4093c46846.jpg +40956af9e0.jpg +40a4629187.jpg +40a7cae762.jpg +40b6cd77b6.jpg +40bc503ea1.jpg +40c905b749.jpg +40c95e4a11.jpg +40cc0ed4e2.jpg +40ccf98e36.jpg +40cde6e513.jpg +40db0cdd42.jpg +40dff054f4.jpg +40e8d3d9c7.jpg +40ebd1c22f.jpg +40f0b7d547.jpg +41021c5dcc.jpg +410d72108a.jpg +412ba526a2.jpg +4155fa3210.jpg +415b8c063d.jpg +416203fc7a.jpg +4162367bb8.jpg +4162f457e4.jpg +41974680ae.jpg +419b2c7f49.jpg +41a4db0866.jpg +41b4d3566c.jpg +41c1f35f3d.jpg +41c5f1847d.jpg +41d438d114.jpg +41db3affa8.jpg +41dcf78aa4.jpg +41e204f3c3.jpg +41e5d9ddcb.jpg +4205530bc5.jpg +420feb877e.jpg +4219812fd8.jpg +422e2b1a85.jpg +422e42f8cd.jpg +423d5d74fc.jpg +424491a6dd.jpg +424a763110.jpg +424f501cf7.jpg +425b262026.jpg +427daa3582.jpg +4280b69f69.jpg +428a74971a.jpg +428b0caffd.jpg +429465cef7.jpg +42948ee45a.jpg +4297b15943.jpg +429f416305.jpg +42a63bc866.jpg +42b1b08167.jpg +42baaaae33.jpg +42c186d9fd.jpg +42cdbff20b.jpg +42d933f346.jpg +42df55664a.jpg +42e40d395d.jpg +42ed7614f3.jpg +42ef00a305.jpg +42f1efb2bb.jpg +42f6416514.jpg +431997d3bd.jpg +432616cbf0.jpg +435251367e.jpg +435d7f641e.jpg +4360a8c278.jpg +4370455b95.jpg +43812483cf.jpg +438d1db371.jpg +439b6073a7.jpg +43a384bb59.jpg +43a99c333d.jpg +43aa6b932e.jpg +43ac85caa0.jpg +43b75378de.jpg +43b7e3207e.jpg +43ba578038.jpg +43bdade3cb.jpg +43cb80319e.jpg +43cbb9624d.jpg +43cc023a72.jpg +43d18ba037.jpg +43d2999ffd.jpg +43d8788b03.jpg +43de9812a4.jpg +43ee33ab7c.jpg +43ef7d3ba6.jpg +43f2d719e7.jpg +43fafa453a.jpg +441aa9d6fd.jpg +441d58ea7c.jpg +441e385636.jpg +442c0d82a6.jpg +4431e89ecf.jpg +44384a3eab.jpg +444ad81931.jpg +444de721cc.jpg +4452b10bc8.jpg +4459db57ba.jpg +44839e9b2f.jpg +448c5b86a0.jpg +44a391efc6.jpg +44ac06003d.jpg +44ae190763.jpg +44b1e91408.jpg +44b929c161.jpg +44bd4c7f4c.jpg +44c182e193.jpg +44c186332c.jpg +44c590c718.jpg +44ccd867f2.jpg +44d954b314.jpg +44db32ba57.jpg +44de52f710.jpg +44e30cea99.jpg +44ec12a7c4.jpg +44f3762dfa.jpg +44fd525c15.jpg +450ea8abef.jpg +4518c17b13.jpg +4530a7dbb7.jpg +454ea61c0a.jpg +455397c36e.jpg +45572eea27.jpg +455aedcda9.jpg +4583567b25.jpg +4585850fed.jpg +458b9774da.jpg +459aae5aa1.jpg +459f3bd0db.jpg +45a1ca49b9.jpg +45a47cb80b.jpg +45aabd808c.jpg +45c11e3ea4.jpg +45c4abecda.jpg +45ca06baa9.jpg +45ca230d4f.jpg +45d489eca3.jpg +45d793f0c7.jpg +45d8aea413.jpg +45d8c28fba.jpg +45d9df57c8.jpg +45da843e30.jpg +45dd2c471f.jpg +45e25635fd.jpg +45e434d7cc.jpg +45e4f32ac2.jpg +45e794f612.jpg +45e9498999.jpg +45fc08221e.jpg +460083b654.jpg +4601b694e9.jpg +4603d6c59e.jpg +4603ee3a1a.jpg +460c7ec872.jpg +46232abfba.jpg +462e34e96a.jpg +462e3776ea.jpg +464e557a32.jpg +46599a2d64.jpg +465f15ec92.jpg +46608be135.jpg +46659e5819.jpg +46686eeaeb.jpg +4668fee098.jpg +466e7e7717.jpg +467c6e1585.jpg +4686a262b6.jpg +468b37adc9.jpg +46aa555acf.jpg +46d248f0c3.jpg +46d705d157.jpg +46d71ef06a.jpg +46db9edd4c.jpg +46dccd77fe.jpg +46dd321ba3.jpg +46f140e9f3.jpg +46f7310a60.jpg +46f866dea3.jpg +47033cc933.jpg +471ad4ac7f.jpg +471bb4e1ed.jpg +471c9fa56d.jpg +4720e2f414.jpg +472e4f266a.jpg +47303db6bc.jpg +4730e94e10.jpg +473804fd06.jpg +473bcf5316.jpg +47497c44bd.jpg +4756fabca7.jpg +476590243c.jpg +4775eaa65d.jpg +4787d24f49.jpg +47897d5159.jpg +47983a947b.jpg +47af7b339d.jpg +47b9777596.jpg +47c772b0ad.jpg +47d47c5ae3.jpg +47d71bccac.jpg +47e6809353.jpg +47e9067be7.jpg +47ed469723.jpg +47edc0c4cd.jpg +47ee6acc4d.jpg +47f3e70a7d.jpg +47fa9a7a11.jpg +47fcc3313c.jpg +480510ef30.jpg +4815c35662.jpg +4818b46cb3.jpg +4829b537d4.jpg +482a029bd6.jpg +482eb005fb.jpg +482f0d08ea.jpg +4841da2637.jpg +484c8d6ce7.jpg +484e26de95.jpg +4866b33258.jpg +486c075e6a.jpg +4876f9a672.jpg +488aef0f8e.jpg +48931a19ce.jpg +4899bcbc65.jpg +489e5891d0.jpg +48c03e44f4.jpg +48c06b57cb.jpg +48c6a427c5.jpg +48c8ee7119.jpg +48d48b0f29.jpg +48dfa723fb.jpg +48e985db94.jpg +48f0842ab6.jpg +48f2c14356.jpg +490bdcf936.jpg +490d1461ce.jpg +490e0f2aae.jpg +4923a00256.jpg +492ef65ddc.jpg +493b71e6ba.jpg +493cf0c01e.jpg +494a728f9d.jpg +495e4374c9.jpg +495e64dd1b.jpg +495f713219.jpg +497440facf.jpg +497bb7f5c5.jpg +4986225098.jpg +4994418593.jpg +499ba2bc2d.jpg +49abd8bbff.jpg +49b0d5b994.jpg +49b8b16d6a.jpg +49c1cc6ceb.jpg +49d0910e21.jpg +49de2785a8.jpg +49df495fd8.jpg +49dfe170d6.jpg +49e86725c0.jpg +49f1d00657.jpg +49ff3ba904.jpg +4a07b020b8.jpg +4a140a77ed.jpg +4a21d874dd.jpg +4a2746422b.jpg +4a533f368c.jpg +4a6745eb79.jpg +4a7b786513.jpg +4a7f3536d0.jpg +4a81cd24bb.jpg +4a846911e0.jpg +4a8b443dc2.jpg +4a9761a1bc.jpg +4aa363fcfa.jpg +4aae6b06af.jpg +4aaf742676.jpg +4aafe4cdf5.jpg +4abb1b579b.jpg +4ac078b19a.jpg +4ac315c2c7.jpg +4ac5a8dbbc.jpg +4ac5d452d1.jpg +4ad00cb6de.jpg +4ad49df96e.jpg +4adab3e58c.jpg +4ade1b82c5.jpg +4adfe4151f.jpg +4ae3a12f1e.jpg +4ae76fa7c0.jpg +4af0a9c189.jpg +4af8fb2ee1.jpg +4b164aa005.jpg +4b38e755cb.jpg +4b43b0fc27.jpg +4b450a0eda.jpg +4b45c8131b.jpg +4b4ed49b66.jpg +4b615898b8.jpg +4b822085e4.jpg +4b85cb03a1.jpg +4b8cdbd157.jpg +4b8dcf65d4.jpg +4b8f1200a0.jpg +4b8f67d12a.jpg +4b928dbe81.jpg +4bb2bc874a.jpg +4bc31a1e57.jpg +4bc355359a.jpg +4bcb285fb8.jpg +4bd98a1855.jpg +4bda804263.jpg +4bda87720a.jpg +4bdf11fae9.jpg +4be292a6f2.jpg +4bed79be4c.jpg +4c032c52ee.jpg +4c05334e8d.jpg +4c05426aca.jpg +4c118ce8a2.jpg +4c1bdb7644.jpg +4c21a39b9e.jpg +4c227bcb61.jpg +4c4d304c80.jpg +4c4eab83a9.jpg +4c58165f8c.jpg +4c5d558d1f.jpg +4c85152cdd.jpg +4c8634f7a0.jpg +4c8cb69155.jpg +4cbceb341d.jpg +4cc4a897f8.jpg +4cc58ce310.jpg +4ccaf75e7b.jpg +4ccb238ce3.jpg +4cd254e5ca.jpg +4cd3d9710c.jpg +4cd7c9a1eb.jpg +4cdde45fdf.jpg +4ce1b83f21.jpg +4ceab60ade.jpg +4cf055f543.jpg +4cfb2762f6.jpg +4d2a76ff7d.jpg +4d2cfda952.jpg +4d4afb13a2.jpg +4d4e901a28.jpg +4d60a5dbae.jpg +4d68c8e210.jpg +4d69b57c3d.jpg +4d6d81e201.jpg +4d789c32db.jpg +4d857d129b.jpg +4da3b39ea0.jpg +4da406a1bf.jpg +4da78d192f.jpg +4dad6e87f7.jpg +4dc2c2f9d2.jpg +4dc3577a5c.jpg +4dc74840c6.jpg +4dd562b6fe.jpg +4de1141339.jpg +4de20e7246.jpg +4de7d38fc6.jpg +4de89f9051.jpg +4dea82009d.jpg +4df218300f.jpg +4dfc7ac873.jpg +4dfc7f0fc7.jpg +4e043d7abc.jpg +4e12e5d02a.jpg +4e17929c8e.jpg +4e1ad244ba.jpg +4e20f3a8e3.jpg +4e312c9d9d.jpg +4e4f2df517.jpg +4e65b706e3.jpg +4e76b82aed.jpg +4e7d0a17ef.jpg +4e8c890470.jpg +4e94d46219.jpg +4e9520d026.jpg +4ed162759c.jpg +4ed4fd87c0.jpg +4ed9e510bd.jpg +4eda151e77.jpg +4edd042d41.jpg +4ef2a1badd.jpg +4efec9f327.jpg +4f079f3f03.jpg +4f12c26e8c.jpg +4f174f35dd.jpg +4f2a753097.jpg +4f2bb3f937.jpg +4f3834fdae.jpg +4f3b038aa6.jpg +4f41348492.jpg +4f4f461b7a.jpg +4f5bd6ed43.jpg +4f5fea3883.jpg +4f60276500.jpg +4f6b8e0748.jpg +4f9ad511ec.jpg +4f9ff55bb0.jpg +4fa33c29f2.jpg +4fac1a1123.jpg +4fb3cb4f52.jpg +4fb499f12d.jpg +4fd5982a88.jpg +4fd7bb7b48.jpg +4fd814b738.jpg +4fda3c8227.jpg +4fdf485381.jpg +4fe5fe2e88.jpg +4fe788d5b1.jpg +4fe804ea50.jpg +4fe94696cc.jpg +4ffb835fb9.jpg +4ffce76192.jpg +500238d0da.jpg +500599e84e.jpg +50075692d9.jpg +500a6e6c0c.jpg +502998e75d.jpg +503bf41744.jpg +5042ce5fe4.jpg +50562948c1.jpg +505f216748.jpg +506ce552b2.jpg +506e270291.jpg +50734b6209.jpg +507781203e.jpg +508b87dbf0.jpg +509c7a8a7a.jpg +50b1df22bb.jpg +50c2643d3f.jpg +50cc8f5800.jpg +50cd2b41ac.jpg +50f0348fc4.jpg +50f15ece16.jpg +50fb6229af.jpg +50ffbe6a3f.jpg +5106956359.jpg +51097ac8e7.jpg +510f8f0812.jpg +5110f9d1c8.jpg +511a28741f.jpg +5120440559.jpg +51214eb753.jpg +512a742992.jpg +513dfe5269.jpg +514991348a.jpg +5155c6479e.jpg +5158dbb65b.jpg +515c97d7a7.jpg +515f5e961e.jpg +5163cbf0ad.jpg +516848ea8b.jpg +517229eb0c.jpg +518d6b06fc.jpg +518f223b2c.jpg +519a77f6a5.jpg +519b1f0b7e.jpg +51a499a584.jpg +51a7fbb971.jpg +51b4ba2085.jpg +51cb94fc4d.jpg +51cd72470b.jpg +51d0950f88.jpg +51d1a2a390.jpg +51d34fbe0a.jpg +51dd261ef3.jpg +51de345256.jpg +51e0623c04.jpg +51e0d38808.jpg +51e3a2d8c9.jpg +51ea3fa1e6.jpg +51f7f963f0.jpg +51fdcf7974.jpg +52004a56db.jpg +5200554700.jpg +52077c2d56.jpg +5207ae7bf4.jpg +522ff0c12a.jpg +5247b36c3c.jpg +5249e639b6.jpg +52504396e8.jpg +525b3b8d8e.jpg +525d22e50e.jpg +5268b47b91.jpg +527954d870.jpg +527a63b62c.jpg +5285d87233.jpg +529f296efb.jpg +52b5616956.jpg +52ba6502f8.jpg +52c9df8d7f.jpg +52d3976131.jpg +52d9d04b7e.jpg +52de401699.jpg +52de73a667.jpg +52e1ca47c1.jpg +52e85d1f6b.jpg +52e9fa4522.jpg +52fd9ba558.jpg +52fe387570.jpg +5300689d5f.jpg +5308c8b3e0.jpg +53225d663b.jpg +5324ea1e23.jpg +5325094c91.jpg +532b557500.jpg +53490e0317.jpg +53874a4f5e.jpg +538bb5674a.jpg +539e08811b.jpg +53a5bb3bf6.jpg +53c15dc005.jpg +53c2c80626.jpg +53cbf82ebc.jpg +53d33841f6.jpg +53d45ca1cd.jpg +53d47c3620.jpg +53dc68ae2c.jpg +53dca96741.jpg +53ddc0d277.jpg +53e7f6ba1e.jpg +53ef61effe.jpg +53fc9cafac.jpg +5408f3d0cb.jpg +540dd4050c.jpg +5434e0d027.jpg +5439a18aae.jpg +5449847e56.jpg +544b3085b0.jpg +544d780d7a.jpg +544e4e6089.jpg +545733ac3a.jpg +5458ce416f.jpg +545c81cc72.jpg +54718b2eb9.jpg +548ed9f097.jpg +5491bd7f07.jpg +54a22f82e2.jpg +54a7d2c2e6.jpg +54b90db20c.jpg +54c777ff92.jpg +54cdb035c3.jpg +54d0ed031e.jpg +54d1530a58.jpg +54d2f5bd55.jpg +54d439da4c.jpg +54e6dbd327.jpg +54eb4991ef.jpg +54f13fd672.jpg +54fb00e8ec.jpg +55025f5532.jpg +5509dabe01.jpg +5509f3ad1a.jpg +55149fbde6.jpg +55162b8b20.jpg +551b70b659.jpg +551e87de65.jpg +5520d8317b.jpg +5536aca8f5.jpg +5544cc5678.jpg +554c7d7c6e.jpg +555e420ce8.jpg +556ebd6c3a.jpg +556ec8c705.jpg +556f37b366.jpg +557d224922.jpg +5584a988b7.jpg +5593b35725.jpg +55ac245de7.jpg +55accb0df8.jpg +55b2494ac3.jpg +55c2ec0015.jpg +55c8f96ac7.jpg +55cc9f5074.jpg +55d2106072.jpg +55d3a5c11f.jpg +55d748c4db.jpg +55db266b4a.jpg +55eb7c3691.jpg +55f1a3a7a3.jpg +561e61a8ed.jpg +562bcb869e.jpg +562c4875cf.jpg +56323fa71b.jpg +5641abb2bb.jpg +5643b5f02d.jpg +565c3bf955.jpg +565e1b3b93.jpg +5666ee0caf.jpg +56711b9a43.jpg +5680f76757.jpg +568276dd51.jpg +569313f1b3.jpg +569477d282.jpg +56aa83267c.jpg +56bbaef7fd.jpg +56c13c2565.jpg +56c5e7e56e.jpg +56c9d29eb8.jpg +56cc2924fb.jpg +56ce77bd51.jpg +56d94523aa.jpg +56dda3df1b.jpg +56defd68a1.jpg +56e5df295a.jpg +56f3ba3b7a.jpg +56f4ef9754.jpg +56fb9f6de4.jpg +56ff44ba44.jpg +570de92d14.jpg +571b1faad8.jpg +5725097380.jpg +572ec26e26.jpg +572f1c5688.jpg +57388a802e.jpg +573dc09c4a.jpg +574227a243.jpg +5752582166.jpg +5752b5e1f6.jpg +5760a61944.jpg +5766a98e96.jpg +576f229924.jpg +577403859e.jpg +577ddf8cbc.jpg +5786d14075.jpg +578ff10825.jpg +5791e84be5.jpg +579d309c67.jpg +57a71e8c40.jpg +57aace8d6d.jpg +57d4d79f6f.jpg +57d4f1affd.jpg +57d856da13.jpg +57df468295.jpg +57e2e37c16.jpg +57e8fac630.jpg +57e9c5b96c.jpg +57f2834652.jpg +57fb682e85.jpg +57fc5d953d.jpg +58046d8ea1.jpg +580aedb9e8.jpg +580b11a9b0.jpg +580ee050fe.jpg +5812f65402.jpg +5831d42227.jpg +583cc773f4.jpg +5848ec3604.jpg +584c85c694.jpg +584eefab86.jpg +585daf7aaa.jpg +5861dae004.jpg +586d517a27.jpg +5878155838.jpg +587ab3b8fe.jpg +587ca0804c.jpg +587e2aa0d1.jpg +58860a9e53.jpg +5894f12a88.jpg +589cff3624.jpg +58c33bb1fa.jpg +58c6dbb15b.jpg +58c834978a.jpg +58c8394b9c.jpg +58c9da27e3.jpg +58cb5ad81b.jpg +58cff4e55c.jpg +58d0b2233b.jpg +58d357163c.jpg +58d527ad59.jpg +58d6300e3b.jpg +58d8f1abe0.jpg +58da3b1ed7.jpg +58dab6b015.jpg +58dacdc3fe.jpg +58ebd09d97.jpg +58ef27bc6f.jpg +58f0551d9f.jpg +59021ecccb.jpg +590e3a02f2.jpg +5912f2e148.jpg +592e50d009.jpg +593a7e147a.jpg +593c043b09.jpg +5940db00e9.jpg +5944732d83.jpg +594c4cfe7e.jpg +594db0c77a.jpg +59585037e7.jpg +596bd20a56.jpg +598a111816.jpg +5990fe2008.jpg +599285c92c.jpg +59a5357183.jpg +59a5b38d24.jpg +59b6679359.jpg +59c5be94d1.jpg +59c65a861d.jpg +59c9195d9a.jpg +59cafa2e55.jpg +59ccfcdf64.jpg +59dd48340a.jpg +59de70687a.jpg +59dfda7404.jpg +59eb4e4f8b.jpg +59ed8059d6.jpg +59eddcc363.jpg +59f0029b6b.jpg +59fc432e67.jpg +5a06efcb98.jpg +5a2709badc.jpg +5a288a8dcc.jpg +5a2e776068.jpg +5a3ef2aaef.jpg +5a446355aa.jpg +5a54558824.jpg +5a6b319dc6.jpg +5a6f3c54a3.jpg +5a756552c0.jpg +5a75f23137.jpg +5a76c39155.jpg +5a7c35b12c.jpg +5a7ed0d685.jpg +5aad7704dc.jpg +5ab3f08686.jpg +5abadb8505.jpg +5acbb99ae1.jpg +5adb207f31.jpg +5adfe46863.jpg +5ae03d46af.jpg +5ae5bbe40b.jpg +5ae6e73667.jpg +5aec518e85.jpg +5af01fb5d1.jpg +5afb6bd872.jpg +5b0018ef0a.jpg +5b0c0faa16.jpg +5b0f1530f9.jpg +5b13cdca80.jpg +5b1e29f549.jpg +5b29437a74.jpg +5b2bab096c.jpg +5b3870d4fa.jpg +5b4bef995c.jpg +5b4bf7aeed.jpg +5b56559e7a.jpg +5b58cfa3dc.jpg +5b5cc01e62.jpg +5b62917c9a.jpg +5b6660b31a.jpg +5b9325feda.jpg +5b96e0769a.jpg +5baa6ec254.jpg +5bd36dc0dc.jpg +5bdadc6c75.jpg +5be091d0b1.jpg +5be285787c.jpg +5be44a3fe4.jpg +5be7bc2463.jpg +5bf04cd09c.jpg +5bf5a63ee9.jpg +5bf7f0a54d.jpg +5c1d02e7da.jpg +5c256b19f8.jpg +5c3f1df607.jpg +5c444854bb.jpg +5c48288033.jpg +5c4cd7c604.jpg +5c5a7de594.jpg +5c5f6ab739.jpg +5c646574d1.jpg +5c67819b7e.jpg +5c6b6fc34a.jpg +5c7d060f5a.jpg +5c82f1a8eb.jpg +5c8a4263d4.jpg +5c8c8cef43.jpg +5c90b65fca.jpg +5c944ef9ab.jpg +5cc2562363.jpg +5cc6adf75e.jpg +5cd16a2157.jpg +5cd22e4189.jpg +5cd54de13a.jpg +5cda058595.jpg +5ced45cd42.jpg +5cf3386b55.jpg +5d08c39177.jpg +5d10c46ffe.jpg +5d11e4982a.jpg +5d1756f5ce.jpg +5d1d85f3d4.jpg +5d27b4da50.jpg +5d353a2e18.jpg +5d3a0efe5a.jpg +5d3bee1e40.jpg +5d3dff8144.jpg +5d509b09c4.jpg +5d5803cbae.jpg +5d58f14d51.jpg +5d615d87be.jpg +5d6e7f4ef4.jpg +5d7042a4b9.jpg +5d7b1863af.jpg +5d7c89b387.jpg +5d8e0163b2.jpg +5d9322f552.jpg +5db4bac5bb.jpg +5dbac2d1d8.jpg +5dbcf2c918.jpg +5dc2ed0800.jpg +5dc50f1d81.jpg +5dc61a6319.jpg +5dc79e1dec.jpg +5dcd9de6b7.jpg +5dd5811373.jpg +5ddbf9305f.jpg +5dde1bd74e.jpg +5de3187e9e.jpg +5dee2ac99d.jpg +5e02881bac.jpg +5e1029f60a.jpg +5e14c8b5a1.jpg +5e1df8fe72.jpg +5e2a1e0ed3.jpg +5e31bf7d29.jpg +5e6ef94332.jpg +5e7162ea09.jpg +5e785714b4.jpg +5e8076175b.jpg +5e8a365312.jpg +5e8f201fdc.jpg +5e974b5b2a.jpg +5ec1887cbd.jpg +5ec8a73eea.jpg +5ecadcb3ca.jpg +5ed24c0d60.jpg +5ee04d0975.jpg +5ee06f31bc.jpg +5ee51624f7.jpg +5ee6ef7b16.jpg +5ee8408aa2.jpg +5eea6ea5cc.jpg +5ef5ae14c0.jpg +5eff150e8d.jpg +5f0bcba571.jpg +5f0e7454e2.jpg +5f0eaa330e.jpg +5f2bddd646.jpg +5f2e533772.jpg +5f3166ff92.jpg +5f43c6a673.jpg +5f4c2e1d2f.jpg +5f57c9cb02.jpg +5f7d3972b1.jpg +5f7fdd8f9f.jpg +5f87304b89.jpg +5f95b8ea80.jpg +5f95beded8.jpg +5faaa92f03.jpg +5facfceb08.jpg +5fb120821f.jpg +5fc21c172c.jpg +5fc59ecfc5.jpg +5fc5a2aa90.jpg +5fd11c7f1a.jpg +5fd1376543.jpg +5fd6a753b4.jpg +5fdabd74be.jpg +5fdce43b7a.jpg +5fdd879301.jpg +5fe366306a.jpg +5fe918eb70.jpg +5fe967c808.jpg +5fe9b84128.jpg +5ff1be002c.jpg +5ff358149f.jpg +5ff7b53e10.jpg +5ffe832b69.jpg +60070381b6.jpg +601f22ff38.jpg +603b997ad8.jpg +604b56a0ae.jpg +6053495556.jpg +605d5be57a.jpg +605feb233c.jpg +606f035981.jpg +60740588f3.jpg +608501aa55.jpg +608530dda4.jpg +60862c905a.jpg +6095a9ba11.jpg +609d1d9fae.jpg +60a299f361.jpg +60c66227ad.jpg +60cb64755b.jpg +60cc53e796.jpg +60d238d3ac.jpg +60d47b7038.jpg +60db18fcef.jpg +60deb136d8.jpg +60debddfcc.jpg +60e70f5033.jpg +60e859fe4a.jpg +60ecd4e607.jpg +60fa75a6b0.jpg +60ffd3d303.jpg +610073f8d9.jpg +61028e2f1b.jpg +6113fa809f.jpg +6114a423d5.jpg +612babb1b9.jpg +613281f9c3.jpg +613b949f0e.jpg +614e5b7498.jpg +61615f7053.jpg +6164ebd76b.jpg +616a604c3c.jpg +61771eb2f7.jpg +617b1c970a.jpg +617bac782a.jpg +617ce24f75.jpg +61802ea85b.jpg +618afc45a4.jpg +6192e2361d.jpg +61a961cc7b.jpg +61c1ea1682.jpg +61c7f176d4.jpg +61c90e6521.jpg +61d021ba55.jpg +61d35f33bb.jpg +61d636fed4.jpg +61d7cae943.jpg +61de337ecc.jpg +61e530e5b4.jpg +61e700ca97.jpg +61ea660def.jpg +61ebb842e2.jpg +620feb3b42.jpg +622c812da0.jpg +6235bc36a5.jpg +623b5965ab.jpg +623c2a3444.jpg +625e31527a.jpg +626608ab55.jpg +626f31f552.jpg +6273dbe670.jpg +627ce675be.jpg +627eb539f1.jpg +62926d033c.jpg +629655ce7b.jpg +629c0aa814.jpg +62b2290155.jpg +62c2c6101d.jpg +62c5c94630.jpg +62c7d49490.jpg +62d4614c82.jpg +62da85e04e.jpg +62dab407c3.jpg +62df951ba6.jpg +62e2c7b796.jpg +62f9ee370a.jpg +62fa056269.jpg +62fdffdaef.jpg +630a321be2.jpg +632030a0cc.jpg +6320bd64a2.jpg +632b51c683.jpg +632f12e104.jpg +6345f731d9.jpg +634bfbb4f3.jpg +637a059cf8.jpg +638014bef1.jpg +638bf68b53.jpg +638bf8fcd0.jpg +638dfaa981.jpg +639aa05c0c.jpg +63aca7f84d.jpg +63ba3d6e2b.jpg +63bbb210e4.jpg +63c61efeb3.jpg +63cb1d4bc4.jpg +63cfb56e66.jpg +63dae45462.jpg +63e483e612.jpg +63ea8dbc2b.jpg +63edbebc1d.jpg +63f150ce18.jpg +63fe622a97.jpg +6402df9aa1.jpg +6403d926ad.jpg +640afbba4d.jpg +6450767d64.jpg +64619b1bfc.jpg +64774901b5.jpg +64779a56c3.jpg +647c08cc32.jpg +6486b7e268.jpg +648b2d2c84.jpg +648c1d2050.jpg +648cf55145.jpg +649109fa9d.jpg +64b9ce9544.jpg +64c35ad53b.jpg +64c904a0ba.jpg +64d096f6c8.jpg +64d9548ab3.jpg +64dbe9407e.jpg +64dc8a1fe1.jpg +64dcb8d860.jpg +64ddd255e2.jpg +64ddebd16d.jpg +64de168bba.jpg +64df6db409.jpg +64e110579d.jpg +64e16315c6.jpg +6500bbd377.jpg +650568c763.jpg +65071ac365.jpg +6508a69e36.jpg +650c2b5ac7.jpg +6512b46c75.jpg +65143fe5ad.jpg +651b9b612c.jpg +654e958552.jpg +65558955d8.jpg +655b7c7da2.jpg +655e9f530f.jpg +6565bc54a3.jpg +65a286e3d1.jpg +65b06cee66.jpg +65b561ffa5.jpg +65c8b7f023.jpg +65d479ece6.jpg +65d7075e0c.jpg +65d7134410.jpg +65de8b75cf.jpg +65dfa3643b.jpg +65f2f06c89.jpg +65fdd4facb.jpg +660622d236.jpg +661d0936d9.jpg +661daef7ed.jpg +6622273dad.jpg +6635be6a5a.jpg +664d0c09dd.jpg +66561ab77b.jpg +66587264f8.jpg +66617d051b.jpg +66696a5775.jpg +666d80a54e.jpg +666e3f5a73.jpg +66802c2246.jpg +6695e8f5c2.jpg +669f82cd26.jpg +66a245da06.jpg +66a349dab0.jpg +66a3eacd66.jpg +66a50de09c.jpg +66af5ff752.jpg +66bb9db1ad.jpg +66c88b059e.jpg +66cd412990.jpg +66d1afbeb0.jpg +66d23ca7d8.jpg +66d274e1f0.jpg +66d2f98e51.jpg +66dc3d2cc1.jpg +66e2ff0be6.jpg +66e4bc9440.jpg +66e63ae728.jpg +66e7ed6865.jpg +66e8b8b6dc.jpg +66ea988a7d.jpg +66f7ba4732.jpg +66fac1975a.jpg +66fc0d7c36.jpg +67001afee3.jpg +67064fad7b.jpg +670e004027.jpg +67199a60ed.jpg +67266cbecc.jpg +6744fd2bb8.jpg +674e0b31f4.jpg +674e3c0a09.jpg +675d800f87.jpg +6768b29751.jpg +676fd31ecb.jpg +67827a91f9.jpg +678ab2ea13.jpg +678afd3e20.jpg +679405a670.jpg +6798372c08.jpg +679b811827.jpg +679f10db89.jpg +67aa3188fe.jpg +67ac0aa670.jpg +67bb213f33.jpg +67bee37c7a.jpg +67c4bec4c6.jpg +67c82a0f0d.jpg +67c8394802.jpg +67c9174d81.jpg +67d1e7ac11.jpg +67d3787cfa.jpg +67d389b5f4.jpg +67d4da8828.jpg +67e5783c4e.jpg +67e911383a.jpg +67f18528ce.jpg +67fe7768b7.jpg +68077fe0bc.jpg +6818aa0105.jpg +681ddda26b.jpg +682d4087a7.jpg +683d3d3f24.jpg +68438520f6.jpg +687f54400a.jpg +688b048f08.jpg +6894e8da4c.jpg +6897f2d0bb.jpg +689cd413bd.jpg +68acd7880a.jpg +68b6418be2.jpg +68b8241411.jpg +68c596c720.jpg +68cb81135b.jpg +68cc4ac95b.jpg +68ceb11799.jpg +68ceb20bc5.jpg +68d547b311.jpg +68d6148556.jpg +68d7b629ba.jpg +68dcd5dea5.jpg +68dd6486b6.jpg +68e29eb255.jpg +68e54ca6c6.jpg +68e5e2d756.jpg +68e7c0dcdf.jpg +68ea7b51bf.jpg +68f5e7064a.jpg +69067fb4fb.jpg +691dd29538.jpg +6945fb3eb8.jpg +694cfb1269.jpg +6951947730.jpg +6966924621.jpg +6975c98cef.jpg +6984fa30eb.jpg +69a4f314a8.jpg +69baf9d474.jpg +69caa6d17e.jpg +69ceab316b.jpg +69d5ad9730.jpg +69d6df42e0.jpg +69d8cfa604.jpg +69e3e370dc.jpg +69e5225541.jpg +6a00f63712.jpg +6a0de82e4d.jpg +6a1016412a.jpg +6a16ba1a2f.jpg +6a1e4cbe28.jpg +6a1eaab2ff.jpg +6a37b31875.jpg +6a43a6c57a.jpg +6a47edbebc.jpg +6a64107599.jpg +6a6486711b.jpg +6a67d8e132.jpg +6a6de47cd7.jpg +6a7640d69b.jpg +6a8442e1fb.jpg +6a8724ebc3.jpg +6a8b965ba1.jpg +6a9cabc513.jpg +6aa102fdd8.jpg +6ab18b5951.jpg +6ab351f001.jpg +6ac06cc852.jpg +6ac1f2d41c.jpg +6acee71f3f.jpg +6ad6b27d80.jpg +6adab5e725.jpg +6adfb51b5c.jpg +6adfd81cbb.jpg +6ae9635673.jpg +6aea228257.jpg +6aeb18e951.jpg +6aef34a797.jpg +6aefc82529.jpg +6af2105ce6.jpg +6afa0c6ad8.jpg +6b02d25d04.jpg +6b05410c5f.jpg +6b16dc4c9a.jpg +6b1c39d74e.jpg +6b316ac331.jpg +6b40b98e8f.jpg +6b4a618a95.jpg +6b5320a01c.jpg +6b5667ec6e.jpg +6b6c53165a.jpg +6b7713f4a2.jpg +6b7ee26536.jpg +6b8527d645.jpg +6b8e8e3c31.jpg +6b9aab1044.jpg +6bab6e3ec2.jpg +6bd45139d3.jpg +6bd779d5ee.jpg +6bda3da6d7.jpg +6bf11ac260.jpg +6bf157ea92.jpg +6bf5a03f1f.jpg +6bfd4bae8d.jpg +6c0156aab8.jpg +6c0fd7035b.jpg +6c11e6178f.jpg +6c13efb46d.jpg +6c159ddb98.jpg +6c215c18d5.jpg +6c2ca39f47.jpg +6c3265ec97.jpg +6c3a0e5b8f.jpg +6c41a322d9.jpg +6c59bd8f1f.jpg +6c6aeba071.jpg +6c75837500.jpg +6c81f91c3b.jpg +6c851bc5cd.jpg +6c8a3f18db.jpg +6c8c8baff8.jpg +6c9577a2f9.jpg +6c981771c0.jpg +6c9857aa32.jpg +6c9dd306b6.jpg +6caa7f9cf1.jpg +6cb90ddea7.jpg +6cc51bedff.jpg +6cd075f143.jpg +6cd0c43cd9.jpg +6ce1490279.jpg +6ce26dec07.jpg +6ce40d00b1.jpg +6ce48ef329.jpg +6cf340ceb8.jpg +6cf526651e.jpg +6cfa97e75b.jpg +6cff5f6361.jpg +6d11ebccfd.jpg +6d131e1628.jpg +6d18abe16a.jpg +6d25cdb9bc.jpg +6d2ef59644.jpg +6d3233f9b4.jpg +6d4c16ea58.jpg +6d4dcac0e7.jpg +6d5f826248.jpg +6d64fdccba.jpg +6d65125c53.jpg +6d7cbe849d.jpg +6d7f55084d.jpg +6d89ea86c5.jpg +6d90517f3f.jpg +6da66ba982.jpg +6db01c37ae.jpg +6dc451010f.jpg +6dd215d6c4.jpg +6de188105b.jpg +6de2f92198.jpg +6de810d29c.jpg +6deaba3bf1.jpg +6deade086e.jpg +6df09e736f.jpg +6df907b0b3.jpg +6e0294669b.jpg +6e227603c0.jpg +6e59ac9e6f.jpg +6e66333515.jpg +6e6bfd6b50.jpg +6e759f2590.jpg +6e86672002.jpg +6e891b56c9.jpg +6e909b0c02.jpg +6e91512ca3.jpg +6e9971f0df.jpg +6e9ad0ea17.jpg +6ea53f3303.jpg +6ead3e4b87.jpg +6eb0188053.jpg +6ec4d8495c.jpg +6ec5a84bd9.jpg +6ecb763533.jpg +6ecc5e4fa1.jpg +6ed104f4c1.jpg +6ed4dfe30c.jpg +6eda135434.jpg +6ee1601085.jpg +6ee9351b16.jpg +6eec228c7e.jpg +6eecd787bb.jpg +6ef26e9a49.jpg +6efbbf84b0.jpg +6f167b216f.jpg +6f1da6ad83.jpg +6f234e4562.jpg +6f25c3ab65.jpg +6f364f47e7.jpg +6f41749b6b.jpg +6f50459f10.jpg +6f62952887.jpg +6f62d092a7.jpg +6f66506efb.jpg +6f6e8229a8.jpg +6f7284c81c.jpg +6f8bf874d1.jpg +6f9c8de503.jpg +6fa96d76a1.jpg +6faa478441.jpg +6fb616875e.jpg +6fb9f98f56.jpg +6fba401871.jpg +6fc009ccbc.jpg +6fc75de0d4.jpg +6fd298ee31.jpg +6fd302a241.jpg +6fd59e213b.jpg +6fd6d90af0.jpg +6fde541068.jpg +6fdf586629.jpg +6fdf62a42f.jpg +6fdf8c27c0.jpg +6fe0924dec.jpg +6fe4f7724a.jpg +6ff433aec4.jpg +6ff4b42c21.jpg +6ffd07c2e3.jpg +700a420c62.jpg +7020f6f39a.jpg +702bc2bc2a.jpg +70321d0c50.jpg +7039157baa.jpg +703bffa333.jpg +70435ad287.jpg +70483bb011.jpg +704ae8aa91.jpg +704e6fe216.jpg +7052b49a36.jpg +705a551c18.jpg +70703ab023.jpg +707cfb0749.jpg +707df45167.jpg +707fde35c7.jpg +709fd97ff2.jpg +70a2987306.jpg +70ab084799.jpg +70ba868fb3.jpg +70c188f274.jpg +70c1fc8ce7.jpg +70c361b1fe.jpg +70c45db041.jpg +70ca54172c.jpg +70cbd3d323.jpg +70cc26499f.jpg +70ceb2fae7.jpg +70d18dd65c.jpg +70d654c341.jpg +70dd43ce37.jpg +70e245bb0c.jpg +70eaf7274b.jpg +70f31b70cd.jpg +70fb21e3a3.jpg +71134ff0c2.jpg +712216f064.jpg +712216f5ad.jpg +7124f5ce90.jpg +712c1837c3.jpg +713c14f023.jpg +7149ee6f0e.jpg +715070ad6b.jpg +715221e110.jpg +715a513301.jpg +717967d863.jpg +7189c225b5.jpg +719209904f.jpg +7194777526.jpg +719ebd50eb.jpg +71a3d4815c.jpg +71be9e0226.jpg +71c76c2423.jpg +71c9817899.jpg +71cabb58ee.jpg +71cb7c432f.jpg +71d142a629.jpg +71d311f933.jpg +71d8791cbc.jpg +71dfdaca84.jpg +71e73dc634.jpg +71efe6d40b.jpg +71f5abb145.jpg +72040d895a.jpg +7204c30e88.jpg +72187eb2e3.jpg +72200eb473.jpg +72208f732e.jpg +72209a97e3.jpg +722661ea66.jpg +7227c70fcd.jpg +722d5f4afb.jpg +723a9f0930.jpg +725a4ac1b7.jpg +726c3c5613.jpg +727974efb3.jpg +72838757f2.jpg +7292f3ca4c.jpg +72a432d2ef.jpg +72a9f8d5dd.jpg +72c183d06f.jpg +72ce48c197.jpg +72d172883b.jpg +72de7be99b.jpg +72e076c5f1.jpg +72e18779bf.jpg +72e38d5eb5.jpg +72eddd5449.jpg +72f96bb24d.jpg +72f9d91c14.jpg +73078abfe8.jpg +731cd398c5.jpg +73215f5975.jpg +732d21d0b6.jpg +732ed4f479.jpg +7349bc2cda.jpg +734b0781c6.jpg +734e0ca057.jpg +734fbb2722.jpg +735df12326.jpg +735f65b906.jpg +7365808834.jpg +737dd892fe.jpg +739550b738.jpg +739a4b0aa2.jpg +739a5f4f5a.jpg +739b9f851e.jpg +739d048893.jpg +73a083b70e.jpg +73a89c881c.jpg +73af80abe2.jpg +73c5bdf068.jpg +73d1ab2cfe.jpg +73d3b40fad.jpg +73d3d01cf4.jpg +73d6152589.jpg +73d83028df.jpg +73d8af07f5.jpg +73da81552d.jpg +73daf3d8ed.jpg +73db354128.jpg +73e6246714.jpg +73ed9fdfcc.jpg +73ee637603.jpg +73f40f4c5f.jpg +73fa67fcbe.jpg +7401c06155.jpg +74032e560a.jpg +740382c048.jpg +740539d76f.jpg +7415ce0b47.jpg +742162a2eb.jpg +7465ce9dc6.jpg +746af9a6e3.jpg +74771dbf8c.jpg +7479ea76b2.jpg +74888bfa60.jpg +749a424954.jpg +749b01b28b.jpg +749b8f3c96.jpg +74ae76058d.jpg +74c986de71.jpg +74ce48ea06.jpg +74d69a6a93.jpg +74d8899da7.jpg +74ef447bd9.jpg +74f5998f5a.jpg +74fc4dff54.jpg +75039e1f6c.jpg +7528e4576c.jpg +752ba5d2c8.jpg +755a68bf49.jpg +755c5d749f.jpg +756d1e5bd5.jpg +75751aaa81.jpg +757c38bb8c.jpg +757d6ee48b.jpg +757f1e6a50.jpg +758a75c9ed.jpg +758c8fb20c.jpg +758fefa848.jpg +7591e0cda3.jpg +75a00982bb.jpg +75a1d164c3.jpg +75b3279d66.jpg +75c0023814.jpg +75c9c5e9dc.jpg +75ccf1d791.jpg +75db7110a8.jpg +75e1f95c11.jpg +75ea8ff077.jpg +75f3027229.jpg +75fb494041.jpg +76005433f3.jpg +7604313470.jpg +7606d341c4.jpg +7609f842ab.jpg +76273fd6d4.jpg +762be21feb.jpg +762d90b239.jpg +762e6e143d.jpg +7658916964.jpg +765a3931c1.jpg +765e3844c1.jpg +766ef8666c.jpg +7672084b9c.jpg +76728f61ed.jpg +7674e0c5bf.jpg +7676d59b08.jpg +768bd97752.jpg +76a9dc1337.jpg +76b61c4a34.jpg +76bd2bb960.jpg +76ca6baab7.jpg +76d36885be.jpg +76d46ea344.jpg +76d7765fec.jpg +76d7e2ea1d.jpg +76d9e44bc3.jpg +76db7a3598.jpg +76e131b081.jpg +76e2c6a8fc.jpg +76e2d3b7e6.jpg +76e94f63f0.jpg +7700ac5cdc.jpg +77027ff036.jpg +7704194a88.jpg +770a91539c.jpg +770eaa21de.jpg +771b6cba53.jpg +771c058c09.jpg +7739b8b9fe.jpg +774570af04.jpg +7748f3466f.jpg +7757afc1e6.jpg +775900f26a.jpg +777e575632.jpg +7783358e78.jpg +77859239d5.jpg +7787e80b02.jpg +77be7c68de.jpg +77bf6139ee.jpg +77c4a6fe2f.jpg +77c639c76a.jpg +77c6764157.jpg +77cb5fd082.jpg +77d28d711c.jpg +77d2f7f462.jpg +77d40d49fd.jpg +77d89ad5e8.jpg +77e42c6f7f.jpg +77e520f65e.jpg +77e8818d95.jpg +77f4244e79.jpg +780fe4e3b8.jpg +7813fc0e56.jpg +7815d8e551.jpg +781da87812.jpg +781fb8ed8d.jpg +782e19561e.jpg +7831d9e960.jpg +783e2110dd.jpg +7842678dba.jpg +7844ab20e4.jpg +784dbc0024.jpg +785257a6bb.jpg +785c1f36c7.jpg +785d8f7fdc.jpg +786e81a2b3.jpg +786ea8078b.jpg +787ab2ecd8.jpg +787ab64dc5.jpg +78801a773e.jpg +789257322e.jpg +789c33a1c7.jpg +78af38df6b.jpg +78cdd692b5.jpg +78d4c775bc.jpg +78ec4ff918.jpg +78f054adcb.jpg +78f4f55267.jpg +78f787aee7.jpg +78fd6ef5c2.jpg +7923dc877b.jpg +793e2b7c38.jpg +794c49d9e4.jpg +794ca6d27f.jpg +7953972839.jpg +795a493665.jpg +795c8164ee.jpg +7973fb266b.jpg +7974b99d54.jpg +797a8eff69.jpg +797b5f8fa0.jpg +7980346fbd.jpg +798b90eaa0.jpg +798c2c9b3b.jpg +798ea5936e.jpg +79a7dcb00f.jpg +79a9c5f77b.jpg +79ac0ec398.jpg +79aebca8e0.jpg +79bddbf219.jpg +79c00f4f0d.jpg +79c5baaf18.jpg +79c7d57822.jpg +79cf25b3ca.jpg +79d6895235.jpg +79d90bba6c.jpg +79de0c9625.jpg +79dfa2fefe.jpg +79e8f713f7.jpg +79eacdd6bf.jpg +79f79e9fd4.jpg +79fe56cb30.jpg +7a092a8f5c.jpg +7a12965aeb.jpg +7a1a8a09b3.jpg +7a1af73907.jpg +7a20bfd0b6.jpg +7a20db4982.jpg +7a22b3de9a.jpg +7a42924c41.jpg +7a443b0e2d.jpg +7a4f87c3e2.jpg +7a587310a4.jpg +7a6c2dfe45.jpg +7a752ed824.jpg +7a80d5cc5e.jpg +7a835bdceb.jpg +7a85bc8960.jpg +7a8cf8a8e4.jpg +7a97af5e2f.jpg +7aa56a51db.jpg +7aab1ebb47.jpg +7ab376d7c2.jpg +7ac3ac3dff.jpg +7ac6684347.jpg +7acc247f22.jpg +7ad4e65ff5.jpg +7ad98e6f6f.jpg +7adc12316d.jpg +7add9fb269.jpg +7ade5adbf4.jpg +7aea50857a.jpg +7aecc61378.jpg +7af870e87f.jpg +7afb200e0d.jpg +7b1017b86c.jpg +7b11d74a52.jpg +7b246afdc1.jpg +7b2e5d9027.jpg +7b382480c3.jpg +7b426760da.jpg +7b47d249a2.jpg +7b4da6cc38.jpg +7b51e3f5ac.jpg +7b57df0c9b.jpg +7b6b481810.jpg +7b751b0fb1.jpg +7b7711cfdb.jpg +7b873fa7ab.jpg +7b8c7d8241.jpg +7ba1286c53.jpg +7bb9921563.jpg +7bbba79a53.jpg +7bd46aedcb.jpg +7bf102627f.jpg +7bf2324994.jpg +7bf9171824.jpg +7bfa67b3ca.jpg +7c01694b96.jpg +7c02e53845.jpg +7c20ef43a2.jpg +7c2aa3ec4a.jpg +7c2f518f7e.jpg +7c395040c6.jpg +7c4ea661bc.jpg +7c5258f276.jpg +7c55d5e3c1.jpg +7c658791aa.jpg +7c6ee0be57.jpg +7c7965e769.jpg +7c824556d7.jpg +7c8a145ab3.jpg +7c9eb3ca46.jpg +7ca41c8ae7.jpg +7ca70a6955.jpg +7ca9512455.jpg +7cb138f841.jpg +7cb52e181f.jpg +7cba900ed1.jpg +7cc35c3dd2.jpg +7cc71229a5.jpg +7cc8802072.jpg +7cd32028d3.jpg +7cd495cdf6.jpg +7cdab22b2a.jpg +7cdb8604d5.jpg +7ce000144c.jpg +7ce1426760.jpg +7ce158d1aa.jpg +7d0ce4062b.jpg +7d20fca9ae.jpg +7d2151b821.jpg +7d2f9d252d.jpg +7d3a735383.jpg +7d6734f960.jpg +7d6e8b51e3.jpg +7d7b897da1.jpg +7d7cffdc53.jpg +7d9bbf29a4.jpg +7dac011ef8.jpg +7dae242b60.jpg +7dbc8329a4.jpg +7dc539f945.jpg +7dc5463ede.jpg +7dcd19a68f.jpg +7dcdc4527a.jpg +7dd3ce8c97.jpg +7dd4319b36.jpg +7dd43e4fcd.jpg +7dd84e612c.jpg +7dda593d9f.jpg +7ddcb9b2fa.jpg +7de242d875.jpg +7de8cd2fa2.jpg +7df32a992e.jpg +7df9f2fc23.jpg +7e1a5dd9e8.jpg +7e1ee37c06.jpg +7e2cec7cb3.jpg +7e3634f7da.jpg +7e3e60c344.jpg +7e8da867f5.jpg +7e9b716c27.jpg +7ebb4fb49c.jpg +7ebd107d2a.jpg +7ec2708f11.jpg +7ec3e5dc05.jpg +7ec999d5cc.jpg +7ecb90a979.jpg +7ed117156b.jpg +7ed3b361bb.jpg +7ee80af193.jpg +7ee97d3c97.jpg +7eec5cf913.jpg +7ef5fd4b9c.jpg +7efc149640.jpg +7eff14d613.jpg +7f02ef7ff2.jpg +7f066a6ebf.jpg +7f09fce652.jpg +7f1969bb3f.jpg +7f1e2949a9.jpg +7f34ae953e.jpg +7f36e8259a.jpg +7f41332baa.jpg +7f4658fb5b.jpg +7f4e806dcf.jpg +7f5432bd87.jpg +7f589113d6.jpg +7f5af15e1b.jpg +7f5e21b0e1.jpg +7f5f7c5924.jpg +7f68d3cd29.jpg +7f7d9a0d68.jpg +7f83438459.jpg +7fb10c1d3c.jpg +7fb6726fe8.jpg +7fc854ae57.jpg +7fcd6d6718.jpg +7fda424bfe.jpg +7fdbc7f4eb.jpg +7fdd694ae3.jpg +7fdf78861c.jpg +7fe12fd989.jpg +8015dfbd5a.jpg +801cf35754.jpg +802b7272c3.jpg +8037b9ac60.jpg +804e6feaeb.jpg +805c332c7b.jpg +806440c580.jpg +806c9720de.jpg +808ddbd0c6.jpg +808e05f105.jpg +80915bfa79.jpg +809b5ea14b.jpg +809cc1b445.jpg +80a9d6c414.jpg +80adad1410.jpg +80be64ef86.jpg +80c1a5dafc.jpg +80cd98738f.jpg +80d5656ebf.jpg +80d59addc5.jpg +80eae77779.jpg +8100d1be0d.jpg +811255f486.jpg +811879aa37.jpg +81303ee38a.jpg +813174740a.jpg +8133cf60ba.jpg +813823ada9.jpg +813b008402.jpg +814b1bac72.jpg +81522fa666.jpg +815eec039d.jpg +81665f76c8.jpg +81667ceeb7.jpg +816d22c136.jpg +817bbc310a.jpg +817c41d274.jpg +817fb8e12b.jpg +817fd915ea.jpg +819b9ea813.jpg +81a6dcf294.jpg +81a84c9f22.jpg +81b9f041c0.jpg +81c19569c8.jpg +81c3053153.jpg +81c9d34283.jpg +81cde162bf.jpg +81d8f0b54b.jpg +81d9737470.jpg +81da2e32ac.jpg +81dac8d254.jpg +81db0f1524.jpg +81de70a4c0.jpg +81deb42786.jpg +81dfc0edbc.jpg +81e4d21e81.jpg +81e6bcb45e.jpg +81e862cac9.jpg +81ee848160.jpg +81eeebb780.jpg +82001639a5.jpg +82100210d4.jpg +82371912e5.jpg +82402be50d.jpg +8240db2dbc.jpg +826065d196.jpg +827a419093.jpg +827ac3fd32.jpg +8282422a45.jpg +82833fafd4.jpg +82a2f781e9.jpg +82a8108174.jpg +82a9c15e36.jpg +82b0c91f8a.jpg +82b71740ef.jpg +82b9b353a9.jpg +82b9ee0a02.jpg +82bd5384c0.jpg +82c2e03612.jpg +82c49991a5.jpg +82c82f5ca6.jpg +82ca497aa6.jpg +82cd61b038.jpg +82cf084288.jpg +82e36f5def.jpg +82e4acff77.jpg +82e8b0b961.jpg +82e9641b54.jpg +82ec730717.jpg +82eea9ba43.jpg +82eeb40cb4.jpg +82fd8475ea.jpg +83037dbd5b.jpg +8318f99fd3.jpg +831da973e9.jpg +831f285d8e.jpg +8320919df7.jpg +8327d105b5.jpg +833ad9ac4a.jpg +835aa6d739.jpg +836584a150.jpg +83689bbe29.jpg +836c7124e3.jpg +8371380368.jpg +83a4602632.jpg +83a7faee7f.jpg +83b209fa21.jpg +83b7193187.jpg +83b9b62d54.jpg +83c0429c89.jpg +83c58c02b4.jpg +83c716ac7a.jpg +83caab3234.jpg +83cc8e7208.jpg +83d301440d.jpg +83d865b2d8.jpg +83ddd4940f.jpg +83e22278e7.jpg +83e60d369d.jpg +83ec89a7dc.jpg +83faf2832a.jpg +83fee7c981.jpg +84021c68ec.jpg +841cff4736.jpg +841ed7f917.jpg +842a8ad50d.jpg +842cbb35fb.jpg +843f7ddcfd.jpg +8452abd0d2.jpg +8462e9b6d4.jpg +8471850c92.jpg +8473736446.jpg +847c588b7c.jpg +847e6ac90c.jpg +8483d641bd.jpg +848bb37828.jpg +849dfcf5f6.jpg +849efc9f02.jpg +849fa59435.jpg +84adb19034.jpg +84b9d88edf.jpg +84c09c24e6.jpg +84d6393b0a.jpg +84d8c94818.jpg +84d9aba810.jpg +84df469cd9.jpg +84e2cb6a0f.jpg +84e42557fd.jpg +84e73f9f9d.jpg +84e7cd8de1.jpg +84ec488c77.jpg +84ff63d3af.jpg +850046fdd2.jpg +8508a13f07.jpg +8510f76e5c.jpg +851c07aeb8.jpg +85262ba186.jpg +85288e0a86.jpg +85383c68e5.jpg +8552803df6.jpg +8557c9968d.jpg +856f7226b1.jpg +857b270e1d.jpg +857cffc4fa.jpg +857e32dbe5.jpg +859baaeeaa.jpg +859e3aa8fc.jpg +85a104e958.jpg +85a7ce7afb.jpg +85ac0449de.jpg +85b269b75e.jpg +85c3b80253.jpg +85c46d6be1.jpg +85c6fdccd3.jpg +85c9694850.jpg +85cbff23d4.jpg +85cd944689.jpg +85dad90948.jpg +85dc677526.jpg +85f78544ad.jpg +85fa9881dc.jpg +860e0d5d73.jpg +86120c1087.jpg +86154465ac.jpg +8629e890fe.jpg +8648f19fcc.jpg +864f303b32.jpg +8650edb159.jpg +865b98bd13.jpg +8661e198eb.jpg +86858ae8ba.jpg +8690a99692.jpg +869b1a5c7d.jpg +86a1c5638b.jpg +86ac807409.jpg +86c2476f31.jpg +86c5846cdf.jpg +86d3720b67.jpg +86d70f71a7.jpg +86eb86b81a.jpg +86facc6149.jpg +8706c1e121.jpg +870e70dccc.jpg +872e666d65.jpg +8752f2b56c.jpg +8757030eb8.jpg +8768274944.jpg +87692949a1.jpg +876e9a6703.jpg +878084097e.jpg +878fc75fc2.jpg +879ca2f42b.jpg +879da5a7b3.jpg +87a5b84d07.jpg +87a767e285.jpg +87b4b3c37a.jpg +87bb257e5f.jpg +87bfe18518.jpg +87c6c3ce1e.jpg +87d2414123.jpg +87d44ff7a3.jpg +87e428405c.jpg +87ed32ce92.jpg +87efb74950.jpg +87f4f2fe59.jpg +87f8bf456d.jpg +87f99f8955.jpg +87fcbf92ea.jpg +87fdd2e577.jpg +8802a87849.jpg +8819adb69e.jpg +882113a91f.jpg +882b9133ef.jpg +884a3bfb8c.jpg +884c70d547.jpg +88544d990d.jpg +88617a212f.jpg +887499f9f0.jpg +88753c454f.jpg +88777d34fc.jpg +88801bf33f.jpg +888b21c0d8.jpg +88c374692c.jpg +88c8fde51a.jpg +88d178a409.jpg +88d1abdca0.jpg +88d20528ea.jpg +88d6cb9640.jpg +88d8b99250.jpg +88e12519ea.jpg +88e2066c0d.jpg +88e63d7975.jpg +88e88d862f.jpg +88ecd1b160.jpg +8915d2e02b.jpg +8927f2838d.jpg +893c400c3d.jpg +8945021dda.jpg +894659f76a.jpg +894ae01b79.jpg +894f158b35.jpg +895dc9278d.jpg +896da36234.jpg +897cc63d4b.jpg +89822bde71.jpg +898acc270b.jpg +8991e63a1c.jpg +899c268b49.jpg +89a2badb86.jpg +89ac242d6c.jpg +89af26a1cb.jpg +89b4e8f6d4.jpg +89b4fb07cd.jpg +89c3640842.jpg +89cd3fcc4a.jpg +89d14aac2e.jpg +89d14faa5f.jpg +89dd1b503a.jpg +89e0b63aaf.jpg +89e2db54d1.jpg +89eafa8fb9.jpg +89f760d49c.jpg +8a076cf400.jpg +8a0b6b82f8.jpg +8a26f63574.jpg +8a339b0fda.jpg +8a33d10c5e.jpg +8a47e8dd21.jpg +8a61ce9442.jpg +8a6373b520.jpg +8a6a2ef11c.jpg +8a6c2786c6.jpg +8a6ebcbc4b.jpg +8a7df1a6f7.jpg +8a8c1f30fc.jpg +8aa4000edf.jpg +8abdd78837.jpg +8ac112cfab.jpg +8ac3c81311.jpg +8ad26d38e1.jpg +8ad4422a9e.jpg +8adcc61845.jpg +8ae9a87b55.jpg +8aec6b3f9a.jpg +8aee1e68d3.jpg +8aeecd5ecc.jpg +8b06a65e30.jpg +8b0e27a403.jpg +8b110bddc1.jpg +8b14ca4a26.jpg +8b2311d936.jpg +8b2c4f1c0d.jpg +8b39e4e74d.jpg +8b3b3da32f.jpg +8b4a3023d8.jpg +8b62f2cf7d.jpg +8b6f28250b.jpg +8b7e44a3a0.jpg +8b8a91b4f6.jpg +8b8d6f1610.jpg +8b94c80a67.jpg +8baaa8a810.jpg +8bba594fcd.jpg +8bc8f22dd8.jpg +8bce21a7e1.jpg +8bd4debafc.jpg +8bdb2ca0c5.jpg +8bdbf449c7.jpg +8bdc0048f4.jpg +8bdcf7fadd.jpg +8bea669b1a.jpg +8c07875b00.jpg +8c1289b35b.jpg +8c132f411e.jpg +8c21ac2ca8.jpg +8c2bbd91a0.jpg +8c3bd9a14f.jpg +8c4c6909ef.jpg +8c51c775a3.jpg +8c619c9bb5.jpg +8c8edc1392.jpg +8ca3960c22.jpg +8ca608d152.jpg +8cb626cb73.jpg +8cba55b6bb.jpg +8cbb73e0c4.jpg +8cc194a403.jpg +8cc2037bb3.jpg +8ccb8c0d56.jpg +8ccc4eae32.jpg +8cce621c1e.jpg +8ccf96a231.jpg +8cd401405c.jpg +8cd682a975.jpg +8ce2db0ebb.jpg +8cf5503cc5.jpg +8cf79bc0e3.jpg +8d031c12c1.jpg +8d118b659b.jpg +8d20983205.jpg +8d2c7190b2.jpg +8d48b0e610.jpg +8d6cf5e28e.jpg +8d7f336380.jpg +8d9b745ae9.jpg +8da4a567ad.jpg +8db142902f.jpg +8db3a09f2c.jpg +8db8786ea1.jpg +8dc7e511e2.jpg +8dc8b06e30.jpg +8dcbad4c1d.jpg +8dd15412e1.jpg +8de0ecf414.jpg +8de142a6b9.jpg +8de4d5f370.jpg +8de8a54158.jpg +8deb574a24.jpg +8deea19db1.jpg +8df01a2dd9.jpg +8df0ae9524.jpg +8df2d87dad.jpg +8e13b2325c.jpg +8e13cc43e7.jpg +8e319188b9.jpg +8e32461a36.jpg +8e36da9ffe.jpg +8e3703b7b0.jpg +8e373e3df8.jpg +8e41af9b65.jpg +8e535085f9.jpg +8e61d747e8.jpg +8e86c3a54c.jpg +8e8c6dbe2c.jpg +8e96b9ebd2.jpg +8ec1a6658a.jpg +8ec7b5756e.jpg +8ecbb3144d.jpg +8ed02690f6.jpg +8ed145e6f0.jpg +8ed20d73e9.jpg +8ed33dbfb6.jpg +8ed6345ae5.jpg +8ee589ea50.jpg +8ee9fffbba.jpg +8eee9c5376.jpg +8ef1206fdc.jpg +8ef429b011.jpg +8ef7ec4451.jpg +8efc2dd967.jpg +8f00dec39c.jpg +8f01477ff2.jpg +8f114d3d99.jpg +8f2fb895a1.jpg +8f53fff43f.jpg +8f6fd8fb65.jpg +8f70e70996.jpg +8f7920ff02.jpg +8f8d888197.jpg +8f8f1c292a.jpg +8f9dd4224e.jpg +8f9e52e6a9.jpg +8f9f093533.jpg +8fab9d6512.jpg +8faf5dada0.jpg +8fb041594a.jpg +8fbe29f7de.jpg +8fc6dffcd0.jpg +8fc788763e.jpg +8fc873336d.jpg +8fc9d0aa16.jpg +8fd928a211.jpg +8fd970604a.jpg +8fdc68049c.jpg +8ff5fe39d6.jpg +90097d78c3.jpg +901c2ba10a.jpg +901c71a7d8.jpg +90232a22a7.jpg +90298b9bb0.jpg +9041861da4.jpg +9044ff1291.jpg +904c67ea98.jpg +90581850b7.jpg +905d1bfbed.jpg +9062d2522b.jpg +906a7659d9.jpg +9074e85982.jpg +90752c45a3.jpg +90778f481f.jpg +907c7947a6.jpg +907d71f549.jpg +907eee3c0a.jpg +908038eb02.jpg +908bf51fdc.jpg +90a9a13e24.jpg +90bef7ff24.jpg +90c48614dd.jpg +90c9533ad0.jpg +90ce12d262.jpg +90d0606c31.jpg +90d259839e.jpg +90d3c72c4c.jpg +90d7a6ced6.jpg +90db410a9b.jpg +90dc328514.jpg +91038e0d3f.jpg +910ce3e83b.jpg +910f8558e1.jpg +911b589579.jpg +91302d82da.jpg +913c323753.jpg +913fe07371.jpg +9144d6d680.jpg +915b281cbe.jpg +916259e4be.jpg +9167b2ee6b.jpg +918a34ba11.jpg +91be0cdf89.jpg +91c38cce1b.jpg +91cc5bb352.jpg +91d08cfd18.jpg +91d7a17deb.jpg +91d88f2530.jpg +91d89f44ed.jpg +91e025d243.jpg +91e2d4e667.jpg +91e3ba7d77.jpg +91e3d71e49.jpg +91e4aa7cff.jpg +91ed381ac0.jpg +91ee3a35df.jpg +920534206a.jpg +921d412cef.jpg +92232a6a79.jpg +922f7cbf2b.jpg +9233f435ba.jpg +9234fc6022.jpg +923792ff59.jpg +923cec9dfe.jpg +924a685600.jpg +925e7fd1c3.jpg +926348835e.jpg +9265acbef7.jpg +92760fc9ff.jpg +9282528cc7.jpg +9282cfa5f8.jpg +92881f2b71.jpg +928a4e9dab.jpg +9291618987.jpg +929a3c7820.jpg +929f0f3144.jpg +92a3f8f3b7.jpg +92b108a3dc.jpg +92b820de35.jpg +92c067611f.jpg +92c3b536bc.jpg +92c9589a02.jpg +92cfa273e2.jpg +92d00543bf.jpg +92d5a77649.jpg +92d66f7340.jpg +92daadfc66.jpg +92e1386b8e.jpg +92eb1668e4.jpg +92ed8455d5.jpg +92f7defd67.jpg +92f8f3d0d3.jpg +92fd5c47e6.jpg +93049e7828.jpg +930db89989.jpg +930de2adb9.jpg +930fed03bf.jpg +932216bbf8.jpg +93221cb870.jpg +932a2f2ce3.jpg +93318880e9.jpg +934dfea6f1.jpg +934f8d2755.jpg +9362d5312a.jpg +9364c0dafd.jpg +9368c51933.jpg +937d630ade.jpg +937db81e93.jpg +939a5a5bcc.jpg +939a808588.jpg +93a99a9e91.jpg +93af48619a.jpg +93bbc8b299.jpg +93c081e579.jpg +93c402f751.jpg +93c5e7d4ce.jpg +93cec220b3.jpg +93da25a79f.jpg +93dc66e397.jpg +93e01af057.jpg +93e18a47cf.jpg +93e70a7fe3.jpg +93ecc85e68.jpg +93ee9bca9d.jpg +93f2200bb8.jpg +93f29fc9a3.jpg +93f80a0165.jpg +93f95fe27f.jpg +94063bec27.jpg +94075de1b4.jpg +940adeac64.jpg +940f8ef0ec.jpg +94166f4a36.jpg +9416ea47ad.jpg +941bb6825f.jpg +94402b7098.jpg +944e42d0ad.jpg +94563465af.jpg +945f144dd9.jpg +9463022bc8.jpg +9465504cb0.jpg +946d63fbe7.jpg +946ef70b27.jpg +9498bf0eb3.jpg +949d4d93c8.jpg +94a34617af.jpg +94a849e530.jpg +94b95b5e04.jpg +94c1e6ee82.jpg +94c5761725.jpg +94d0a1882a.jpg +94d41d2b3e.jpg +94d9ee17ab.jpg +94de08c454.jpg +94ef3e8784.jpg +94f575b36d.jpg +950c66f666.jpg +9510146318.jpg +9515ca37d6.jpg +95268f307c.jpg +9527bbe6e6.jpg +9529fb6927.jpg +95303292ed.jpg +9535fa76d4.jpg +953bf74c56.jpg +9541e42a29.jpg +95443fbce7.jpg +955fdb5bbe.jpg +959a4a0501.jpg +959b1f6e7f.jpg +95a0e8709e.jpg +95a7c5dc67.jpg +95b1335f35.jpg +95b17a452f.jpg +95b312a691.jpg +95bda917aa.jpg +95c49a674d.jpg +95c8a6ca68.jpg +95cc499e1f.jpg +95ce38a95c.jpg +95d3597475.jpg +95d4b44912.jpg +95d4e1a6d8.jpg +95d6a53e6c.jpg +95d8e43ee4.jpg +95e1805d73.jpg +95e5178927.jpg +95e5f73dc8.jpg +95ea9be464.jpg +95f35f5f0f.jpg +95f3b80d4d.jpg +95fc9b9efa.jpg +95fdf31833.jpg +96068e415e.jpg +960de7348d.jpg +96119dafcf.jpg +96146e18bd.jpg +96383673bd.jpg +964eb76e28.jpg +965198c137.jpg +9658b005a7.jpg +967c772b30.jpg +9686ce15b0.jpg +969e2c8c5b.jpg +96a35df225.jpg +96a6966afc.jpg +96ae398932.jpg +96c4ff8b5c.jpg +96c6a593bc.jpg +96c7260e4b.jpg +96ceebdf1d.jpg +96d32d9583.jpg +96d579356c.jpg +96d95c87d1.jpg +96dfa1e656.jpg +96e0a99d57.jpg +96e53cb6f6.jpg +96e9f8b3eb.jpg +96ed242bdf.jpg +96f1a51edc.jpg +96f39f81f4.jpg +971c296df4.jpg +971def76e1.jpg +971f75568f.jpg +9735da7839.jpg +973a6289a7.jpg +9740ca5d75.jpg +97427c60e5.jpg +97532a18c4.jpg +976650d4c0.jpg +9776ab4a9d.jpg +97963850fa.jpg +97966a211e.jpg +97a174da15.jpg +97c06ea4fb.jpg +97c5c02bb1.jpg +97c9ee4dc7.jpg +97cebecf43.jpg +97d0c84278.jpg +97d0f1cd4b.jpg +97d6b0c5db.jpg +97e1c754c0.jpg +97e446a658.jpg +97e57ebd67.jpg +97ea6721cb.jpg +97ef57df79.jpg +97f491104d.jpg +98005a58d0.jpg +981244e9bb.jpg +981cd02ec3.jpg +981d154c4b.jpg +982e99e425.jpg +9852429ff5.jpg +9859f4e9ba.jpg +986c51fe99.jpg +986d7f7161.jpg +98887b6814.jpg +9898bfa06f.jpg +98a5fb1f3f.jpg +98a7a0937b.jpg +98a7debfa8.jpg +98aac4f5c3.jpg +98c5bfc5ba.jpg +98c63b2aaa.jpg +98cb68a7dc.jpg +98d0cadb1a.jpg +98d2c199f9.jpg +98d2dc5f5c.jpg +98d4394f9b.jpg +98db131c41.jpg +98dc4f9615.jpg +98ec550483.jpg +98ee7fe824.jpg +98f19a96d1.jpg +98fdfa0a67.jpg +99030e8414.jpg +9907ac7315.jpg +990eee08bb.jpg +991ffab459.jpg +9924aea41c.jpg +992b22a9ab.jpg +992ba98121.jpg +993320b99a.jpg +9936561041.jpg +993b5277bf.jpg +993ea78901.jpg +994206fe9f.jpg +994698abc3.jpg +994c3879a1.jpg +994c9bcc4d.jpg +99508ed65c.jpg +9952267dda.jpg +996410240c.jpg +99667e04ae.jpg +99692e9ff0.jpg +9974b9cdd5.jpg +997c32af09.jpg +998b1b133d.jpg +99980e0ea1.jpg +999e5fe5a6.jpg +99b11f3cab.jpg +99b2525117.jpg +99c779adb5.jpg +99cc65caea.jpg +99d720f2c4.jpg +99dc7dbcac.jpg +99de4be083.jpg +99df183331.jpg +99e2d2006e.jpg +99ed9238f0.jpg +99ee16feb6.jpg +99fbd124dc.jpg +99ff614098.jpg +9a03170676.jpg +9a17ceac8c.jpg +9a1debcdef.jpg +9a260f327b.jpg +9a26f14d65.jpg +9a3041e17b.jpg +9a3360c8da.jpg +9a37ac5633.jpg +9a47ad0b5c.jpg +9a4b39d4a0.jpg +9a4e4f4932.jpg +9a52e7b09b.jpg +9a54b96fc1.jpg +9a580908cd.jpg +9a7c9f24ed.jpg +9a7cc93f34.jpg +9a8240f637.jpg +9a82ce0405.jpg +9a88c6d443.jpg +9a8b401c7d.jpg +9a9b5776bc.jpg +9aa4f436a3.jpg +9ac3fec7ee.jpg +9ac4a39b57.jpg +9acc1599f7.jpg +9adcc827ff.jpg +9addff771c.jpg +9adf83bf0d.jpg +9ae3501d98.jpg +9aec5d5a39.jpg +9aeda0fc27.jpg +9aefb68154.jpg +9af0c9d6cd.jpg +9afa06bb45.jpg +9afb27b25a.jpg +9afd87cade.jpg +9b1d222700.jpg +9b23d4fb6c.jpg +9b2a8fc6e0.jpg +9b39d7c23e.jpg +9b4bb32733.jpg +9b4d85b0ff.jpg +9b5c2b0e8f.jpg +9b5f8d0fe4.jpg +9b6367dd68.jpg +9b6fca8b05.jpg +9b7c32d56a.jpg +9b97616520.jpg +9b98e884c3.jpg +9ba9b92275.jpg +9bb14cfebf.jpg +9bc0b3aaf0.jpg +9bc2333d3d.jpg +9bc7c93af3.jpg +9bcdb997a9.jpg +9bd05d090c.jpg +9bd72bb58e.jpg +9bd9cf6e86.jpg +9bdcaf51db.jpg +9c08460aaa.jpg +9c13beb4e7.jpg +9c13e439ba.jpg +9c1fcac8f0.jpg +9c31546449.jpg +9c31f44483.jpg +9c335c32dd.jpg +9c3f8e06ce.jpg +9c4cebc486.jpg +9c52db5153.jpg +9c5ea44a9e.jpg +9c693fd419.jpg +9c8e84c5bd.jpg +9c8ec2002e.jpg +9c919917a3.jpg +9c928ff598.jpg +9caed7b7ce.jpg +9cb1f8cdb7.jpg +9cb3569c53.jpg +9cc2010f73.jpg +9cc7983e5a.jpg +9cc89bcb9a.jpg +9cc92d8149.jpg +9cc9d2a497.jpg +9cc9de8835.jpg +9ccc1dfb32.jpg +9cd4936910.jpg +9cd546943f.jpg +9ce487e10e.jpg +9ce76237f4.jpg +9ceeff9936.jpg +9cf35693f2.jpg +9d0092ef3e.jpg +9d035e1f52.jpg +9d2586f7a4.jpg +9d29d46249.jpg +9d2a32c6d7.jpg +9d3b9684d3.jpg +9d678574d5.jpg +9d72c1f9bf.jpg +9d7c069634.jpg +9d82707e8c.jpg +9d93b540c7.jpg +9d94391e00.jpg +9d95064777.jpg +9d98e5e29f.jpg +9d9af9b28f.jpg +9da38d38cd.jpg +9da423d301.jpg +9da68a758a.jpg +9db488ea3b.jpg +9db9ce2b59.jpg +9dbba7780f.jpg +9dc06c6291.jpg +9dc20a1dc3.jpg +9dc4d4bb59.jpg +9dc8bf5516.jpg +9dcaad7d3e.jpg +9dd1077233.jpg +9dd11720d4.jpg +9dd176c38e.jpg +9dde3b9264.jpg +9de0edf5a4.jpg +9e191a2c3a.jpg +9e2102b082.jpg +9e27f77e1e.jpg +9e2e361396.jpg +9e4a62421a.jpg +9e4d14de85.jpg +9e50da7457.jpg +9e6b8e269d.jpg +9e72aa248d.jpg +9e785bd2d3.jpg +9e7a93ba43.jpg +9e7ce0facb.jpg +9e7d2cccba.jpg +9e87b6f9dd.jpg +9ea72eb34b.jpg +9eadbd2c00.jpg +9eb93b306d.jpg +9ebaea2702.jpg +9ec06a3171.jpg +9ec665bbcc.jpg +9ed5033f4e.jpg +9ee3ec7b99.jpg +9eeed7ad08.jpg +9ef15bf5d7.jpg +9ef24dfb56.jpg +9f05fd7a50.jpg +9f0d5ba33f.jpg +9f2e36a026.jpg +9f3811d20c.jpg +9f3bb17728.jpg +9f549b7a5c.jpg +9f5b3cb591.jpg +9f6adfc23d.jpg +9f6c2f0203.jpg +9f6c86880a.jpg +9f84cccfa6.jpg +9f8bac77e3.jpg +9f8fa5e5d0.jpg +9f9110ea80.jpg +9fa5c6e60d.jpg +9faab0000b.jpg +9facd2c4c3.jpg +9fc244a437.jpg +9fc2536ba4.jpg +9fc54e11a0.jpg +9fc78ee8d2.jpg +9fd63575aa.jpg +9fd69853fa.jpg +9fd78e983a.jpg +9fdc69f853.jpg +9fdd5695e2.jpg +9febd53e0f.jpg +9fecf6b0c9.jpg +9ff216d4a5.jpg +9ff9e53bad.jpg +a0004ee17b.jpg +a005edcbc0.jpg +a0117fcbbc.jpg +a015d11a03.jpg +a01b466df7.jpg +a024de9bd4.jpg +a029a5d254.jpg +a02c92f16c.jpg +a02f316edb.jpg +a035e51ff8.jpg +a040c11c9a.jpg +a0496dfa4c.jpg +a06a2a3c0a.jpg +a07fbaddef.jpg +a0818bf43c.jpg +a08fe4044a.jpg +a0962b3d43.jpg +a09bc116d3.jpg +a0a1143b6c.jpg +a0af468667.jpg +a0bc34ebb4.jpg +a0bfcbcc0d.jpg +a0d05d1e42.jpg +a0d9cb3ac0.jpg +a0e39d9975.jpg +a0e66a0a65.jpg +a0e6a59224.jpg +a0f40f08dd.jpg +a0f654c4a0.jpg +a0fdac16c7.jpg +a1015a2859.jpg +a1033ab9c1.jpg +a107e058a5.jpg +a1104a8242.jpg +a11cef3e9e.jpg +a11cfb028f.jpg +a123225126.jpg +a140e0b14b.jpg +a17c58f9cb.jpg +a17e05eb09.jpg +a1855b9bf1.jpg +a1863303ac.jpg +a18f7460be.jpg +a19e9d4414.jpg +a1a5b3c708.jpg +a1a78a5ee7.jpg +a1a9e6899d.jpg +a1cda8fe39.jpg +a1d035b065.jpg +a1dc0a9e5f.jpg +a1e0bc1e3f.jpg +a1e7810ce2.jpg +a1e7c76dee.jpg +a1e90fd0dd.jpg +a21743ffdd.jpg +a22e4b09cf.jpg +a23b924f94.jpg +a24eab8d45.jpg +a25c8590fd.jpg +a26232e8aa.jpg +a262dab701.jpg +a2688c674f.jpg +a28ce8065e.jpg +a29c66e36f.jpg +a2b68500d5.jpg +a2c25c9ac7.jpg +a2d414e018.jpg +a2d6d820fb.jpg +a2dd37641e.jpg +a2e6230a8a.jpg +a2f383c764.jpg +a2fa13107b.jpg +a2fb06a810.jpg +a2fd940ff0.jpg +a30345bf6c.jpg +a305d8abb8.jpg +a306ecdf17.jpg +a3099e20b5.jpg +a30dff2400.jpg +a31dafdd87.jpg +a3280d15a8.jpg +a32cf75c30.jpg +a33c22248a.jpg +a34236d3a1.jpg +a377d8ced1.jpg +a37e6c783c.jpg +a386db0d65.jpg +a391784df7.jpg +a3a8f3e9ce.jpg +a3bd357d78.jpg +a3c273cefa.jpg +a3c819d08f.jpg +a3ccb659da.jpg +a3ce6c65c9.jpg +a3d34a5167.jpg +a3e1b8ae97.jpg +a3e303f6e5.jpg +a3e508ed3f.jpg +a3e5f0a222.jpg +a3e632c401.jpg +a3e651e1db.jpg +a3f0b07db6.jpg +a3f1336a1b.jpg +a3f5544604.jpg +a3fb82cc48.jpg +a41470ce3a.jpg +a4197c5685.jpg +a41c8721d4.jpg +a426994af8.jpg +a42706b0c3.jpg +a435f50bce.jpg +a446ac8860.jpg +a44f87951a.jpg +a4655a9970.jpg +a4681a3a66.jpg +a468622ad5.jpg +a46d5962ae.jpg +a48029b471.jpg +a485b5605c.jpg +a48e6a4bd5.jpg +a49593b85d.jpg +a498bce248.jpg +a49a2e574a.jpg +a49bc4b6c2.jpg +a4a06ef061.jpg +a4a171a86c.jpg +a4aebe6dc9.jpg +a4b416920c.jpg +a4bc688c0f.jpg +a4c04f72c1.jpg +a4c3598004.jpg +a4c44ab37b.jpg +a4ca91eb60.jpg +a4ce1dcc34.jpg +a4d517229d.jpg +a4dbd71dea.jpg +a4dfcf112a.jpg +a4e41d159a.jpg +a4e563f28d.jpg +a4e7797188.jpg +a4ecc86a5f.jpg +a4edca097b.jpg +a4feaea33e.jpg +a521451c6c.jpg +a523736a84.jpg +a5370e5c19.jpg +a53be5bbad.jpg +a53c548b15.jpg +a5423668c0.jpg +a5821ba670.jpg +a59537c7a1.jpg +a5a6a7bce5.jpg +a5a9fa3a66.jpg +a5bc7e85aa.jpg +a5cb2732f4.jpg +a5dec952e1.jpg +a5e12c47d8.jpg +a5e21a3faf.jpg +a5ea98d000.jpg +a5eb0d66ef.jpg +a6036d93ef.jpg +a60644d7e2.jpg +a63633428e.jpg +a6364585d6.jpg +a63b3b67d8.jpg +a64bbb0915.jpg +a6644fca95.jpg +a6686a5b75.jpg +a66c6ef6d8.jpg +a66e652bee.jpg +a673cfa63c.jpg +a677916714.jpg +a67989bfa0.jpg +a68241118d.jpg +a68dfb6024.jpg +a68fb7758d.jpg +a69da3c59c.jpg +a6bc5e2a43.jpg +a6be6de263.jpg +a6c7e4919c.jpg +a6d606aa6b.jpg +a6de0153fe.jpg +a6e82c0c67.jpg +a6ee097b99.jpg +a6f123b9b6.jpg +a6f1448adc.jpg +a6f5f000e5.jpg +a705ad8daa.jpg +a709e3c7e0.jpg +a716828258.jpg +a7208acec2.jpg +a72ac6d352.jpg +a72ccdde9f.jpg +a74dedf85c.jpg +a75e4a0b65.jpg +a76e8f52ad.jpg +a7749253f6.jpg +a774f33976.jpg +a7857ee2ef.jpg +a78d21207a.jpg +a79726bd82.jpg +a79b5e9301.jpg +a79dc1e005.jpg +a7ab6e9e70.jpg +a7abb19298.jpg +a7c06b5bba.jpg +a7c2f50d17.jpg +a7f9fa6ad3.jpg +a7fccc2cee.jpg +a7fefd661d.jpg +a81504409f.jpg +a81931c8d2.jpg +a8329bf474.jpg +a840e93a56.jpg +a85c68adb6.jpg +a860f20f26.jpg +a86cef5230.jpg +a882731aba.jpg +a885f71ba6.jpg +a88c90c721.jpg +a89a9196ca.jpg +a8b1905b7c.jpg +a8b8d937b4.jpg +a8b8ea5614.jpg +a8c34104c4.jpg +a8c9eb3390.jpg +a8cacb8963.jpg +a8cf476a40.jpg +a8dd96957a.jpg +a8e1049368.jpg +a8e7057dbb.jpg +a8e9509ed9.jpg +a8f1b166b2.jpg +a8f33a4bbd.jpg +a90b85b6d9.jpg +a912e70737.jpg +a913643106.jpg +a91668857a.jpg +a92b3284d0.jpg +a932bb0a5f.jpg +a93575f0aa.jpg +a93cbb85af.jpg +a93e8e3481.jpg +a946b8849a.jpg +a952f10824.jpg +a956a7fbf1.jpg +a965b847e0.jpg +a96c69651a.jpg +a98d5b6505.jpg +a98fbb6eaf.jpg +a99fa8458f.jpg +a9a12d0d32.jpg +a9abd903ea.jpg +a9afa976dc.jpg +a9b95783f3.jpg +a9c6b965eb.jpg +a9c7759263.jpg +a9cba2fbe3.jpg +a9cbd3feee.jpg +a9ce55f046.jpg +a9d260f013.jpg +a9d2b4ef8d.jpg +a9d46a71e5.jpg +a9dcba211e.jpg +a9df2890b6.jpg +a9dfc59a3d.jpg +a9e332253c.jpg +a9e5ff1f5a.jpg +a9e81d0bae.jpg +a9e8a558d7.jpg +a9e94ff7bb.jpg +a9fa7f65b7.jpg +a9fbd1e384.jpg +aa000237f6.jpg +aa03414956.jpg +aa071a1f50.jpg +aa1b4ac828.jpg +aa35c42ecc.jpg +aa3f8b7310.jpg +aa4cc72508.jpg +aa4d6b9b2e.jpg +aa4f4352d1.jpg +aa6468e20c.jpg +aa67052029.jpg +aa68530d22.jpg +aa6939f0d1.jpg +aa72cecd0d.jpg +aa7442304b.jpg +aa75b6df15.jpg +aa7a5d834d.jpg +aa8077c598.jpg +aa829bae0b.jpg +aa8d268e61.jpg +aa9f8ef4a0.jpg +aaa5a505cb.jpg +aaad8c3c47.jpg +aaba5b6429.jpg +aac25ccde7.jpg +aacc17bd1f.jpg +aacc897450.jpg +aad1b0c8b0.jpg +aad54a974d.jpg +aad93c022e.jpg +aad9c0a5d4.jpg +aad9c48145.jpg +aadbcceac4.jpg +aade1b7287.jpg +aae75be5b6.jpg +aaebfafda4.jpg +aaf0ac106a.jpg +aafb4e8a3e.jpg +ab0207cdc2.jpg +ab05aef9eb.jpg +ab09d72353.jpg +ab0d6b538f.jpg +ab13940611.jpg +ab24262d6d.jpg +ab29afd8dc.jpg +ab3e51bf88.jpg +ab42ba70f2.jpg +ab42c5c0de.jpg +ab4c6de3f2.jpg +ab59c647c1.jpg +ab6448d5af.jpg +ab6af651c7.jpg +ab956f6ce9.jpg +ab98f90d6c.jpg +ab9a1c4c7e.jpg +aba45d0de7.jpg +aba59d117d.jpg +abac795d4a.jpg +abb9bf9f6b.jpg +abc289d2f6.jpg +abc334e33f.jpg +abc66bdfea.jpg +abc86051c5.jpg +abcabcacc5.jpg +abcda10d20.jpg +abd90fadcb.jpg +abda2ca4e4.jpg +abe5661ffb.jpg +abe8ab5fc2.jpg +abe9ef99cc.jpg +abedf51bb0.jpg +abefc43402.jpg +abf3bc4ef2.jpg +abfc3ba5d6.jpg +ac02eadada.jpg +ac0b770730.jpg +ac0c9d8ce0.jpg +ac3a80dd3e.jpg +ac3ad0e3bd.jpg +ac57d13d16.jpg +ac6c3668b8.jpg +ac6f48b95c.jpg +ac7028c0ff.jpg +ac76d6b518.jpg +ac7caf9eea.jpg +ac97fd87df.jpg +aca1d8e4fe.jpg +acabb66d8f.jpg +acaf9a72fa.jpg +acbfe08c4b.jpg +acc15d8049.jpg +acc7b28939.jpg +acd499a093.jpg +acd5dc4a97.jpg +acdf83e7d6.jpg +ace1f07867.jpg +ace4732b6c.jpg +ace7e1c8f8.jpg +ace9efbf7a.jpg +acf007eddc.jpg +acfb4995f4.jpg +ad0561415b.jpg +ad1116c190.jpg +ad12e4998e.jpg +ad221d15b7.jpg +ad225eddf8.jpg +ad2648d7c9.jpg +ad29b425a1.jpg +ad2ac135a3.jpg +ad3245b731.jpg +ad3aa9050d.jpg +ad5243d1df.jpg +ad5498968c.jpg +ad738627c6.jpg +ad75c90e7f.jpg +ad88ff5ad4.jpg +ad8c9ae3b7.jpg +ad9a7fe059.jpg +ada8d4c039.jpg +adaca89f31.jpg +adbe8b1f08.jpg +adc1e1f8b2.jpg +adc61cde2b.jpg +adcdb814a3.jpg +add20f532c.jpg +addb9bb043.jpg +ade1b100fe.jpg +ade4bf6a52.jpg +ade5195431.jpg +adeb5df4cb.jpg +adf4af218e.jpg +adf622db1c.jpg +adfa8875f8.jpg +ae2128c18c.jpg +ae233416db.jpg +ae25389994.jpg +ae3c8158ce.jpg +ae3d3d223a.jpg +ae4dc4f613.jpg +ae6c1c9f0e.jpg +ae787d9b2f.jpg +ae7cbb99a3.jpg +ae7d97c32a.jpg +ae807934d9.jpg +ae8402b5bc.jpg +ae94baf534.jpg +ae952fdb9b.jpg +ae96d2c1e3.jpg +ae9f0efd7d.jpg +aea7298023.jpg +aeac1799b3.jpg +aeb0e753df.jpg +aeb83163bb.jpg +aec089fb0f.jpg +aec2eaeca9.jpg +aec6f79910.jpg +aed6028258.jpg +aed917d33c.jpg +aedd93d361.jpg +aee0e4d3d5.jpg +aee4c2b39f.jpg +aeebccd1db.jpg +aef0bd6d9a.jpg +aef110f28a.jpg +aef622e1a7.jpg +aef70d7f65.jpg +aef8bc53a5.jpg +af033cb3de.jpg +af0589ffa5.jpg +af12c7a49d.jpg +af16b3707b.jpg +af21d32a2e.jpg +af3c818240.jpg +af40ac66e3.jpg +af5163739a.jpg +af52b53db6.jpg +af55406bf3.jpg +af7086f34a.jpg +af736cf3f9.jpg +af902f6229.jpg +af9878aacb.jpg +af9b8b0f6e.jpg +afc5831f67.jpg +afd0654525.jpg +afd4a5fcbc.jpg +afdba126b0.jpg +afe1114746.jpg +afe11eaad0.jpg +afe241c74a.jpg +afe2f4e325.jpg +afe4306535.jpg +afe841696b.jpg +afec2fc3a5.jpg +aff300befb.jpg +aff83d1fc7.jpg +b00599786e.jpg +b009e04d6a.jpg +b0156f53fa.jpg +b0290b73f6.jpg +b02e5c70d7.jpg +b04f7d362a.jpg +b05e44c828.jpg +b06630e2d9.jpg +b06e5ac68f.jpg +b0798399ff.jpg +b09b1bf247.jpg +b0a63e2c90.jpg +b0b442ad46.jpg +b0bc8c80b8.jpg +b0bf80ffaf.jpg +b0c8e3304d.jpg +b0d3972a75.jpg +b0d63fb502.jpg +b0d848d5af.jpg +b0d948f6e2.jpg +b0e06e751a.jpg +b0eaf6770e.jpg +b0f0a457eb.jpg +b0f5afba5e.jpg +b0f88e30a0.jpg +b0fa11c81a.jpg +b1038f6bb6.jpg +b1117a76fb.jpg +b11bebb769.jpg +b12caa1c9e.jpg +b144043a27.jpg +b14f4436cd.jpg +b156ae44a0.jpg +b15b66e642.jpg +b17466acde.jpg +b183c54857.jpg +b18c2bedc9.jpg +b18c81c795.jpg +b19bf57fcf.jpg +b1b1c4ead8.jpg +b1b9df2e84.jpg +b1c04b1bed.jpg +b1c5fe68bf.jpg +b1d169e3e0.jpg +b1dcabb5e0.jpg +b1dfdaa72f.jpg +b1e20ef0c7.jpg +b1e6fe092c.jpg +b1e7d115f2.jpg +b1ef13461e.jpg +b1fe1cded4.jpg +b20e3f0351.jpg +b20fda2cb7.jpg +b215e4cafb.jpg +b21d2d0333.jpg +b21f5892a2.jpg +b22a84f7bc.jpg +b230f46d78.jpg +b23b9bcff9.jpg +b24e13ea57.jpg +b2515cb937.jpg +b25dd03617.jpg +b26c13cd90.jpg +b284e4c1bc.jpg +b29e1153d5.jpg +b2a8229436.jpg +b2b163f100.jpg +b2bd336508.jpg +b2c907adff.jpg +b2d401f368.jpg +b2d4543970.jpg +b2d5b8192d.jpg +b2d7bf564d.jpg +b2e5502c1e.jpg +b2e846981a.jpg +b2f9a00d39.jpg +b307227285.jpg +b313b08920.jpg +b3185f3da6.jpg +b3526cf3d7.jpg +b37484065e.jpg +b37aabbb39.jpg +b39375b0d4.jpg +b3a79255a6.jpg +b3b9cd026e.jpg +b3bc7fbfdc.jpg +b3c02e8aee.jpg +b3c3d30f73.jpg +b3c3ebb34e.jpg +b3c74e915a.jpg +b3ea360f81.jpg +b3f8a6d2c3.jpg +b3fcb198bd.jpg +b4023b997c.jpg +b425e35736.jpg +b425fe2c96.jpg +b428aa56a8.jpg +b4443553cf.jpg +b44e393780.jpg +b4588caffe.jpg +b45c2ade13.jpg +b45da763c1.jpg +b474944163.jpg +b48a4c9263.jpg +b49d7c5a0a.jpg +b49ef87f58.jpg +b4a3655f72.jpg +b4acd37467.jpg +b4c08601fd.jpg +b4d93b9564.jpg +b4dda95f17.jpg +b4e82c0a90.jpg +b4eb4378eb.jpg +b4f8054cd1.jpg +b4f932020c.jpg +b4f9c0daee.jpg +b506c6ead3.jpg +b50e1a9588.jpg +b510ee6d52.jpg +b52ea8b8d7.jpg +b539275275.jpg +b554a2a678.jpg +b55c0defeb.jpg +b56856674b.jpg +b56faff103.jpg +b57834ccd0.jpg +b598195847.jpg +b59cdd471b.jpg +b59ea377fc.jpg +b5b125d9e9.jpg +b5b14d906f.jpg +b5bf9513d9.jpg +b5c3cadf89.jpg +b5c9dce4ea.jpg +b5ca04fc73.jpg +b5cd3e4d3d.jpg +b5d50fd2c9.jpg +b5da5755e9.jpg +b5ed51a7d3.jpg +b5ef80c532.jpg +b5f9e44e6e.jpg +b5fbf94e9f.jpg +b60037e282.jpg +b601cb87a2.jpg +b606abad20.jpg +b61049bc2a.jpg +b61a885545.jpg +b61b16e01e.jpg +b62b522ee7.jpg +b62d33a770.jpg +b6322d48b0.jpg +b6353110a4.jpg +b6582c297f.jpg +b65a3d67d1.jpg +b65faee402.jpg +b662cf7a25.jpg +b66dea22c6.jpg +b675e50542.jpg +b677e1c76d.jpg +b6804e1eba.jpg +b6938abe4f.jpg +b693bd1c5a.jpg +b6a35d1b5d.jpg +b6aa1c69e8.jpg +b6aafe2d28.jpg +b6b1d646f9.jpg +b6b698eeee.jpg +b6bbc6ff44.jpg +b6caeebc65.jpg +b6cafea251.jpg +b6ceb137e8.jpg +b6d2514e01.jpg +b6db23bcc1.jpg +b6ee082d7b.jpg +b6ee61af76.jpg +b6fa3dd3d0.jpg +b6fa57baa7.jpg +b70027d169.jpg +b700929f2c.jpg +b703b46557.jpg +b70c7babeb.jpg +b70e1869fd.jpg +b70f2f4f3e.jpg +b72c1346d6.jpg +b73917164f.jpg +b7432e2055.jpg +b758ce78b5.jpg +b760db2eaf.jpg +b7643bda23.jpg +b76c4978dc.jpg +b776d35856.jpg +b78ed9dade.jpg +b79e5ae2e2.jpg +b7a417a2fd.jpg +b7c59d2577.jpg +b7c6377b74.jpg +b7cedc6b95.jpg +b7cf18629b.jpg +b7d02f534f.jpg +b7d494d374.jpg +b7d65293e7.jpg +b7d9586b33.jpg +b7dac8a2a1.jpg +b7dc73df0f.jpg +b7e4b0598a.jpg +b7e9bd5841.jpg +b7ed92e5ac.jpg +b7efc6f578.jpg +b7fc00d066.jpg +b7fcb7f2a9.jpg +b804dd359e.jpg +b80db8bcfa.jpg +b85beb82ae.jpg +b864d02bfa.jpg +b868560999.jpg +b86f6e4147.jpg +b87c9c5d2b.jpg +b87e4be539.jpg +b87fafd940.jpg +b885908e90.jpg +b88b4df291.jpg +b8966c93b5.jpg +b897ef28f2.jpg +b89fc16e84.jpg +b8a2dea135.jpg +b8be9123c2.jpg +b8c03c2730.jpg +b8c14ba0da.jpg +b8c268c5b1.jpg +b8c7ee9faa.jpg +b8c9fd913b.jpg +b8cc5eda55.jpg +b8cf2c86d4.jpg +b8d403d5e3.jpg +b8d80fb83e.jpg +b8e00033a6.jpg +b8ebf5655a.jpg +b8f5fc86f3.jpg +b8f78ea26a.jpg +b906cb7745.jpg +b91be171a3.jpg +b9222cf29f.jpg +b933129f3c.jpg +b93d8ed9b3.jpg +b94d974153.jpg +b959aecb1a.jpg +b96948dd79.jpg +b96a0276a6.jpg +b96dfcd62f.jpg +b9755249a2.jpg +b977f143f4.jpg +b9795beeae.jpg +b9804a10c5.jpg +b983e056a6.jpg +b98ead1bd3.jpg +b9ad7c4eae.jpg +b9b31c499d.jpg +b9be3e6585.jpg +b9c9bd81b3.jpg +b9cc63d1e4.jpg +b9d3c5b5fd.jpg +b9d72867cc.jpg +b9ddf180db.jpg +b9de0e7ab7.jpg +b9e260321f.jpg +b9e2d9cf76.jpg +b9e3c4afa4.jpg +b9ef56217a.jpg +b9efbe2e6e.jpg +b9f17f582f.jpg +b9f6dc90d4.jpg +b9fb10ef3c.jpg +ba043911e5.jpg +ba12f25338.jpg +ba2c2fa8ca.jpg +ba2ee0775c.jpg +ba2fad5ec9.jpg +ba3057a3ba.jpg +ba3c976d89.jpg +ba5e28cfba.jpg +ba6281dbce.jpg +ba62993855.jpg +ba6b13cbf4.jpg +ba719ae52c.jpg +ba7c7cfe38.jpg +ba7c9caca3.jpg +ba8477e463.jpg +ba9460d1ab.jpg +ba9b24e1c6.jpg +baab705764.jpg +bab6eb364a.jpg +baba01a651.jpg +babafbef75.jpg +bad289b1da.jpg +bad3039996.jpg +bada3c5741.jpg +badb27dd35.jpg +bade630725.jpg +badea05ab8.jpg +badec96a9d.jpg +bae4cf0dd7.jpg +baeb1dfdb8.jpg +baf12e34a3.jpg +bb08e7c636.jpg +bb10c8691f.jpg +bb24132ffe.jpg +bb3d6c2fc7.jpg +bb47da015e.jpg +bb69ac181d.jpg +bb6a6f953d.jpg +bb75a214d7.jpg +bb80cf12f1.jpg +bb99cf0a90.jpg +bba00814dd.jpg +bbad147555.jpg +bbafae272f.jpg +bbbf7d9925.jpg +bbc07f4dd4.jpg +bbc49e6468.jpg +bbc66fef95.jpg +bbc8265d3b.jpg +bbd0cbc068.jpg +bbd6022e71.jpg +bbd942f417.jpg +bbdab0ac49.jpg +bbe2ed3aec.jpg +bbe9f6866b.jpg +bbec946e3e.jpg +bbee622301.jpg +bbfdb31a12.jpg +bbfe570570.jpg +bbff29c0bb.jpg +bc0092fba8.jpg +bc015b023a.jpg +bc096ee00e.jpg +bc2ef704e4.jpg +bc3e1fc435.jpg +bc6b6e3737.jpg +bc6d8c2008.jpg +bc80ea7f88.jpg +bc9836d343.jpg +bca103f0eb.jpg +bcb4426b6b.jpg +bcc2943ace.jpg +bcc5bd722d.jpg +bccb2ab9da.jpg +bcd189af43.jpg +bcd1cfd8dd.jpg +bcd3c41b87.jpg +bcd56169a2.jpg +bcdd544b76.jpg +bce0e4ed0d.jpg +bce3e89e1a.jpg +bce4575711.jpg +bce9081d29.jpg +bceef32102.jpg +bd0065c0fc.jpg +bd143e9760.jpg +bd14b60ae8.jpg +bd26ae81e9.jpg +bd2cac5554.jpg +bd2e85da31.jpg +bd3d289cec.jpg +bd49556825.jpg +bd51ff9b30.jpg +bd52123d7a.jpg +bd63d83988.jpg +bd688f8a05.jpg +bd7ca7806f.jpg +bd8cd75e87.jpg +bd994f8616.jpg +bd9caea7e6.jpg +bda4a4a1bc.jpg +bda9b419eb.jpg +bdabe3b79d.jpg +bdb69d2721.jpg +bdc07e4dac.jpg +bdc75f9fe1.jpg +bdd32d35a0.jpg +bdd9d4cb31.jpg +bde2b91998.jpg +bde65feaee.jpg +bdeadea939.jpg +bdee86e2c2.jpg +bdf38ca55f.jpg +bdfb4a6ee3.jpg +be0425cb9b.jpg +be0ad300ef.jpg +be1d23c6b9.jpg +be26a34d1f.jpg +be2a16d939.jpg +be2be4ec29.jpg +be37905aa8.jpg +be490a646d.jpg +be4b0d7edd.jpg +be5096a8a1.jpg +be544dd93d.jpg +be5a4ab3b4.jpg +be6ac1102b.jpg +be7454d19c.jpg +be8732728f.jpg +be9a2a29e9.jpg +bece13a17a.jpg +bed483d502.jpg +bed660c6ab.jpg +bedb8587fa.jpg +bedebedf81.jpg +bee46256c0.jpg +bef2afb102.jpg +bef4b5ece1.jpg +befbc05353.jpg +bf065e0e18.jpg +bf08a2244f.jpg +bf1afee158.jpg +bf24a90d2b.jpg +bf2be86ea1.jpg +bf30db52d9.jpg +bf3200af07.jpg +bf38f80869.jpg +bf3e0469c1.jpg +bf52f7e6a4.jpg +bf5e6fac92.jpg +bf60971469.jpg +bf67387993.jpg +bf8dd61722.jpg +bfa4c50b1c.jpg +bfaf5cdcb8.jpg +bfb555dd1f.jpg +bfb716206e.jpg +bfb84e0176.jpg +bfc6b4eca9.jpg +bfcc346e35.jpg +bfcf4d5ac7.jpg +bfe6e3aeae.jpg +bfefcd9c6a.jpg +bff6c02842.jpg +bffa673c43.jpg +c0037cc45d.jpg +c0049d3e6f.jpg +c021039df0.jpg +c04289a4e6.jpg +c04c84edc0.jpg +c06291ebe4.jpg +c06a572a4b.jpg +c08a1c4553.jpg +c0972208fc.jpg +c097db5101.jpg +c0a1a614a7.jpg +c0a621e03d.jpg +c0c010dfdb.jpg +c0c55f72df.jpg +c0c7604196.jpg +c0c7c885cf.jpg +c0c7d00b9e.jpg +c0c9f95d2e.jpg +c0d500c107.jpg +c0d90358b3.jpg +c0dd3d0754.jpg +c0e24d9907.jpg +c0ea9b99a8.jpg +c0ee9babf4.jpg +c0ef27358d.jpg +c0efe6b772.jpg +c0f00a13dc.jpg +c0f4ab1ad8.jpg +c0f6b63a35.jpg +c10084edc5.jpg +c108a2adb5.jpg +c10fef288c.jpg +c110760eab.jpg +c111b7639b.jpg +c127f65312.jpg +c12ec0b053.jpg +c137265b1d.jpg +c140865619.jpg +c142480461.jpg +c143c1f708.jpg +c1490382b2.jpg +c16639ff09.jpg +c16bbc2dbe.jpg +c1871db78d.jpg +c194aba626.jpg +c19a4ba6ea.jpg +c19cecc203.jpg +c1a0b685ce.jpg +c1ac79d7d3.jpg +c1c033cd38.jpg +c1c3e424f1.jpg +c1d121af72.jpg +c1d339f995.jpg +c1dad80b23.jpg +c1db2d9d21.jpg +c1dfc29b14.jpg +c1e59a4288.jpg +c1e5e658ab.jpg +c1f31cddfe.jpg +c1fc7ade9e.jpg +c2048678d1.jpg +c20ac208c7.jpg +c2233df153.jpg +c22d511747.jpg +c22faa7f82.jpg +c265f2477b.jpg +c2836f78f3.jpg +c285d22f42.jpg +c28beb5721.jpg +c28fdbac8a.jpg +c296ec4b28.jpg +c2a13a5b69.jpg +c2ad1f9207.jpg +c2af4e2ce1.jpg +c2c17bf415.jpg +c2c31256d0.jpg +c2c59dcf04.jpg +c2c9be3ad4.jpg +c2cf1d5c16.jpg +c2d2ff0066.jpg +c2d461e4cd.jpg +c2dfe9ab5a.jpg +c2e2de0c2a.jpg +c2e5d0a30e.jpg +c2e6f9653e.jpg +c2e884ea70.jpg +c2f01c7c26.jpg +c300921db0.jpg +c316cd7933.jpg +c31818614a.jpg +c31d0c79a6.jpg +c31fae26f4.jpg +c321b7f223.jpg +c321f20de5.jpg +c341a5b021.jpg +c360862cb8.jpg +c3644c52a1.jpg +c3686eb948.jpg +c36d336f79.jpg +c3709c2513.jpg +c37b88e370.jpg +c396a451c3.jpg +c3a6dc70b4.jpg +c3a8157788.jpg +c3a95b2f11.jpg +c3aba46a00.jpg +c3b2153b5b.jpg +c3b721838d.jpg +c3bf7d4c60.jpg +c3c571e812.jpg +c3c7f8a86e.jpg +c3cdeb0660.jpg +c3d20624bf.jpg +c3d627b2df.jpg +c3d6ae1b03.jpg +c3dc12ede6.jpg +c3de96bc8d.jpg +c3e063d469.jpg +c3e3df3f27.jpg +c3e65c927a.jpg +c3e7962913.jpg +c3e7d947d8.jpg +c3eece3bf0.jpg +c3f049193f.jpg +c3f16ea570.jpg +c400cb19fb.jpg +c41e5f5dcd.jpg +c436e37764.jpg +c44f1ac1b8.jpg +c465f680aa.jpg +c47f4c9b10.jpg +c487452ecf.jpg +c497e7e049.jpg +c4a6bc6a62.jpg +c4a7dfaa6c.jpg +c4ae295169.jpg +c4beb2744c.jpg +c4becf6b4b.jpg +c4bf8a73c5.jpg +c4dea06b64.jpg +c4e2baba0d.jpg +c4e40fbb3e.jpg +c4e6ecaa3f.jpg +c4eee2f0b7.jpg +c4f3acdba8.jpg +c4f6573e26.jpg +c4f97b7011.jpg +c4fc8d9d94.jpg +c513f387a0.jpg +c51b532e4e.jpg +c51b5d1983.jpg +c55aba4154.jpg +c576bb2b2f.jpg +c57f38837c.jpg +c58fc095c4.jpg +c590b2cf41.jpg +c5ae59cd4c.jpg +c5b1ad8c2f.jpg +c5bcb1dc7a.jpg +c5bd23d1dd.jpg +c5bda853a7.jpg +c5c4218b09.jpg +c5c4f19c88.jpg +c5c85f22b3.jpg +c5d1a2d773.jpg +c5d334458e.jpg +c5d8c8032b.jpg +c5e6a25b4f.jpg +c5e892eef0.jpg +c5eff7ecb1.jpg +c5f0f9daba.jpg +c5f3217f8f.jpg +c5f3933042.jpg +c5fe72e422.jpg +c609230f48.jpg +c6159fa27a.jpg +c6164924d9.jpg +c61d05c6ad.jpg +c6248ddb9e.jpg +c627b2dc57.jpg +c62f9728e1.jpg +c63dd1887e.jpg +c67434f57f.jpg +c67af78a33.jpg +c68d1e42c0.jpg +c68f0c09b4.jpg +c692979230.jpg +c696d99156.jpg +c69ac5a308.jpg +c6a669254b.jpg +c6aa8b7898.jpg +c6b574df26.jpg +c6be770922.jpg +c6cf8e0418.jpg +c6d060c22a.jpg +c6ddc2e3a2.jpg +c6e1d8a950.jpg +c6e4e06152.jpg +c6f0501137.jpg +c6f2fb579f.jpg +c6f3406dce.jpg +c6f9a8a4d7.jpg +c6faaf07ca.jpg +c707b66aed.jpg +c715ecb116.jpg +c717486082.jpg +c71933b1f6.jpg +c71f695b65.jpg +c722cd6fb7.jpg +c72983e80a.jpg +c753bcd031.jpg +c783e3de04.jpg +c7857c7abb.jpg +c7b31ae9cd.jpg +c7b48b805f.jpg +c7d445337a.jpg +c7d446613e.jpg +c7dd9e9cf7.jpg +c7e24e8bb7.jpg +c7e95eb754.jpg +c7ec7b98cb.jpg +c7ee06614a.jpg +c7f064c7bf.jpg +c7f0b7e139.jpg +c7fcabebee.jpg +c80b757ffa.jpg +c81cbcc222.jpg +c82134ca61.jpg +c823b00785.jpg +c833a9fea9.jpg +c8492be1fa.jpg +c8522f7d68.jpg +c85539079a.jpg +c85aaf5ea7.jpg +c86a17ee96.jpg +c86f2e50a6.jpg +c86faebe03.jpg +c8839a441f.jpg +c88ed83a0b.jpg +c89beb110b.jpg +c89ec3cd28.jpg +c8bb9751d7.jpg +c8d1841141.jpg +c8de929eed.jpg +c8e2a35667.jpg +c8e81dcb95.jpg +c8e83da1ff.jpg +c8ecc4e5ad.jpg +c8f46b9ab1.jpg +c8f54c1cdf.jpg +c8fa720618.jpg +c906c57281.jpg +c913e7fed0.jpg +c913ea9494.jpg +c91f328c79.jpg +c91fe5952b.jpg +c9333e81ef.jpg +c9355491c0.jpg +c93c1f20e7.jpg +c943a7aa89.jpg +c949419b08.jpg +c951e51e8d.jpg +c994d6627e.jpg +c99920f3a8.jpg +c9af6ed6b1.jpg +c9af83e1ca.jpg +c9afd88cb0.jpg +c9bd3a50a1.jpg +c9c5d39e8e.jpg +c9d40c8b10.jpg +c9d98b7e43.jpg +c9da74649c.jpg +c9e13e249b.jpg +c9e212c39a.jpg +c9e295d476.jpg +c9e5e4e5af.jpg +c9ea94b815.jpg +c9f6294835.jpg +ca15337fca.jpg +ca181fb375.jpg +ca2ddc004e.jpg +ca316a99f3.jpg +ca43c834e2.jpg +ca4d0a473c.jpg +ca6666333a.jpg +ca72a47817.jpg +ca7c98ae8a.jpg +ca8e9f34e7.jpg +ca9af373d8.jpg +cab13d117b.jpg +cab7bb8a63.jpg +cab938d84d.jpg +cabafc0e12.jpg +cabc2328c5.jpg +cac03580db.jpg +cac791a248.jpg +caca0644c7.jpg +cacaebfd21.jpg +cad26248bb.jpg +cad48d88e0.jpg +cad605ff85.jpg +cadc6d01ad.jpg +cadd0e5d11.jpg +cae1f6a6d6.jpg +cae21e7161.jpg +caee5133e1.jpg +caef32bba9.jpg +caf2c1f7e8.jpg +caf4178d10.jpg +caf81a8292.jpg +cafc99244c.jpg +cb017d8a54.jpg +cb0391ed68.jpg +cb04cf2ba3.jpg +cb05ba3834.jpg +cb1ba2009e.jpg +cb1f955ed4.jpg +cb1fbf9809.jpg +cb321d98df.jpg +cb3662fc7d.jpg +cb41b1b213.jpg +cb4ce8f4f0.jpg +cb5be7ec51.jpg +cb5e732332.jpg +cb6391fbf4.jpg +cb6c21f1d5.jpg +cb6e95c775.jpg +cb6fbeae00.jpg +cb72812bd4.jpg +cb80f47d91.jpg +cb84d1dd8c.jpg +cb8d0b8b1d.jpg +cb8d6b6f00.jpg +cb90b1d4f3.jpg +cb9d65f437.jpg +cba7d81b99.jpg +cbb211eac6.jpg +cbbfb06344.jpg +cbc85faf47.jpg +cbd151867a.jpg +cbd1e4e875.jpg +cbd71b2aca.jpg +cbd7753147.jpg +cbdbfc5978.jpg +cbe3bf10fe.jpg +cbe3d82daa.jpg +cbe3ee6b27.jpg +cbe5050d0d.jpg +cbe5eb6696.jpg +cbe6542626.jpg +cbf47a2e17.jpg +cbfb07d1d6.jpg +cc0a587391.jpg +cc0d3d2b12.jpg +cc16df94c1.jpg +cc1c4305f1.jpg +cc2e6f7376.jpg +cc2efaec22.jpg +cc39e651e3.jpg +cc5324dfbf.jpg +cc765cba88.jpg +cc766e4e6a.jpg +cc7e0caed0.jpg +cc9600fb25.jpg +ccb00d349a.jpg +ccb2f113dc.jpg +ccc2cd9d63.jpg +ccc4e0a939.jpg +ccc584f82d.jpg +cccb928e07.jpg +cceb8d60ff.jpg +ccf20b8bc2.jpg +ccfdbf82df.jpg +cd011d4899.jpg +cd11b33940.jpg +cd3a631856.jpg +cd3df7a8e9.jpg +cd42d53ebd.jpg +cd52e3f2fe.jpg +cd5420f681.jpg +cd62492877.jpg +cd648c062e.jpg +cd67f7d265.jpg +cd69563263.jpg +cd90e30a1e.jpg +cd98e62c8f.jpg +cda2fc2df0.jpg +cdaa784932.jpg +cdaf68d4ad.jpg +cdb2353f60.jpg +cdb89349bf.jpg +cdb8945620.jpg +cdb9a4a0ea.jpg +cdc1f4b107.jpg +cdc3ee1b24.jpg +cdc583254a.jpg +cdc6c28796.jpg +cdc7ed032d.jpg +cdc7ef5c9d.jpg +cdc97e5056.jpg +cdcd471f12.jpg +cdce14b70f.jpg +cde29ab29f.jpg +cde9cf4217.jpg +cdf2007659.jpg +cdfeb4e489.jpg +ce01392613.jpg +ce039ff3d4.jpg +ce135e26dd.jpg +ce1491b390.jpg +ce29b9979c.jpg +ce408eb5cf.jpg +ce54d1e381.jpg +ce5fac18d9.jpg +ce60e54766.jpg +ce673267ea.jpg +ce6b23aa71.jpg +ce73863a6c.jpg +ce7969ad4b.jpg +ce7eb74818.jpg +ce8ca9bffb.jpg +cea105a876.jpg +cea1c54379.jpg +cea5173375.jpg +ceaf3903af.jpg +ceb7190c60.jpg +cec57cc583.jpg +cecb797629.jpg +cecce5c6c2.jpg +cecd3fc8c3.jpg +cedc14af2f.jpg +cedc79186e.jpg +ceddcc6b85.jpg +cee2d2dba3.jpg +cee48efd07.jpg +ceefc58ef3.jpg +cef44dcb17.jpg +cef775459d.jpg +cf05ddb0d4.jpg +cf12ba2abc.jpg +cf2cc9c314.jpg +cf2e6999ce.jpg +cf4769299d.jpg +cf5341b194.jpg +cf58d81280.jpg +cf7082aaa1.jpg +cf7aaa1009.jpg +cf826699b0.jpg +cf836d295b.jpg +cf8b687c1c.jpg +cfa7bf3f47.jpg +cfa8b0dbbc.jpg +cfc4a746ac.jpg +cfc9f7b2f2.jpg +cfccf96c6e.jpg +cfcdcc086f.jpg +cfe0dcf244.jpg +cfe2e1c708.jpg +cffba276ec.jpg +d00036ecd7.jpg +d014c494dc.jpg +d03a78328b.jpg +d04ddc5fd9.jpg +d058f2919c.jpg +d05b3297cf.jpg +d05e33069a.jpg +d05ed6c6f8.jpg +d0873ef123.jpg +d08958142b.jpg +d099255c0a.jpg +d0b64d6491.jpg +d0b9d8777f.jpg +d0c3efb066.jpg +d0c655554a.jpg +d0cadfbc89.jpg +d0e586e5ef.jpg +d0fc895a1a.jpg +d10587f9ab.jpg +d105b884c8.jpg +d12de0e958.jpg +d135869f4c.jpg +d141c35e3c.jpg +d1475c2dc0.jpg +d14fff221d.jpg +d15fa51eab.jpg +d1675065f9.jpg +d1742f3bfa.jpg +d184086155.jpg +d19565a007.jpg +d1966e5294.jpg +d1a9a88f49.jpg +d1af317242.jpg +d1b78cc6db.jpg +d1c7072696.jpg +d1c7d61a42.jpg +d1cbae6be7.jpg +d1d31c8f0e.jpg +d1d466cf4a.jpg +d1d642437d.jpg +d1d6675da4.jpg +d1e539fac8.jpg +d1e78c6508.jpg +d1fec8a32a.jpg +d2001a1e33.jpg +d2075ab1b7.jpg +d20b3c1233.jpg +d20e385a13.jpg +d229ee50c6.jpg +d22ab437cc.jpg +d24009bcc4.jpg +d2436ab6a8.jpg +d25abb5702.jpg +d25db7d5ec.jpg +d26d9bd742.jpg +d29927635e.jpg +d2b9beebaf.jpg +d2c10d84db.jpg +d2c46d53e8.jpg +d2c62282bf.jpg +d2ccba890d.jpg +d2cf48d3ea.jpg +d2d29e81eb.jpg +d2d2ac244a.jpg +d2d53e5a48.jpg +d2d7ad5926.jpg +d2de2684b7.jpg +d2e550cb12.jpg +d2e695d3c4.jpg +d2e9a0fa67.jpg +d2e9c329c4.jpg +d2eaf85d93.jpg +d2f6e95b3f.jpg +d30c2f84a1.jpg +d322b94e9d.jpg +d33ce47122.jpg +d33d7592ba.jpg +d33dd837bf.jpg +d33effb9b9.jpg +d359aa8ad5.jpg +d378dc2815.jpg +d379710dc0.jpg +d37e064711.jpg +d38c639500.jpg +d3a3e5e678.jpg +d3b39db71b.jpg +d3c13e3ae1.jpg +d3c7087729.jpg +d3d5ce767f.jpg +d3d604aa99.jpg +d3d82f8722.jpg +d3e8385411.jpg +d3ef4692bc.jpg +d3f00e2c80.jpg +d410d30e39.jpg +d4119e6646.jpg +d415367b34.jpg +d416ed8f37.jpg +d419d014b1.jpg +d42b28b985.jpg +d42b781f87.jpg +d4538671b4.jpg +d45e3fcb85.jpg +d460db4979.jpg +d4702cf61f.jpg +d47769d0b9.jpg +d485c2e9bb.jpg +d48b4985de.jpg +d48bda7efe.jpg +d48e193a2c.jpg +d4acf0b0bd.jpg +d4b44b0850.jpg +d4c380f13b.jpg +d4c3c8060f.jpg +d4c46edd3e.jpg +d4cdbb4299.jpg +d4cffc4752.jpg +d4d1382b70.jpg +d4d5653b60.jpg +d4d613de78.jpg +d4de54c2c6.jpg +d4df4c8163.jpg +d4e001cfe5.jpg +d4eaa1a91e.jpg +d4ffacdf1d.jpg +d505ef9e66.jpg +d50a013518.jpg +d5120f23ba.jpg +d51e770b5e.jpg +d529e578d8.jpg +d551e09afe.jpg +d56f0d3fd5.jpg +d57944c6c3.jpg +d57b611364.jpg +d58317c12d.jpg +d5951ff8df.jpg +d59bdafab9.jpg +d5a9faa59c.jpg +d5ac799607.jpg +d5ad2ce934.jpg +d5b105ff1d.jpg +d5b71ff889.jpg +d5d23d8f21.jpg +d5d500a866.jpg +d5d6165384.jpg +d5deb14bf4.jpg +d5e57a9ff3.jpg +d5fc45ab9f.jpg +d603ab5d4f.jpg +d62be075dd.jpg +d62c0e9261.jpg +d62e21aeb6.jpg +d632a659b4.jpg +d65c82370c.jpg +d65e1b081f.jpg +d6689dda1e.jpg +d66e65c368.jpg +d67acb461d.jpg +d67e56d550.jpg +d69e531384.jpg +d6aa1d4561.jpg +d6b3bfb989.jpg +d6b8c10533.jpg +d6b8f9b74b.jpg +d6b9d5d6d1.jpg +d6c57c383a.jpg +d6c61ab099.jpg +d6d094d366.jpg +d6d8057538.jpg +d6d959ce95.jpg +d6d991ed2b.jpg +d6d9c482a1.jpg +d6dd1d6cec.jpg +d6df68fc4e.jpg +d6e5b8cab2.jpg +d6f79b6e2d.jpg +d6fe5e2828.jpg +d70056bc7c.jpg +d7127c96ae.jpg +d712bd2788.jpg +d71c3a8176.jpg +d7217b590d.jpg +d72ca354ee.jpg +d72ee01d15.jpg +d733d56d15.jpg +d73cb8f701.jpg +d7589a1d8c.jpg +d76151111a.jpg +d7653c5f75.jpg +d76e76762e.jpg +d777321a3e.jpg +d77ca92485.jpg +d781494ce2.jpg +d78a478529.jpg +d78d5cd977.jpg +d790312a52.jpg +d799b48228.jpg +d79b52e09b.jpg +d7a614cb10.jpg +d7adf480d0.jpg +d7c6d18fe6.jpg +d7ce1d52b2.jpg +d7d9313640.jpg +d7dfca5c47.jpg +d7e3c7e348.jpg +d7e99b6259.jpg +d7edcf727d.jpg +d7ee7d0487.jpg +d7eefdccc8.jpg +d7f14ee663.jpg +d7f1ddf8dd.jpg +d7f236b392.jpg +d7f7d797c6.jpg +d7f8d79e78.jpg +d801293214.jpg +d805fbc5b5.jpg +d83d53d778.jpg +d83de3f4c9.jpg +d84d39c8f3.jpg +d85ae16835.jpg +d86e5b1c39.jpg +d874cd3f0b.jpg +d8aeab65af.jpg +d8b1e21926.jpg +d8b65cbf2a.jpg +d8c059d60c.jpg +d8c1423196.jpg +d8c6f61473.jpg +d8c9c0935f.jpg +d8ca4cbcff.jpg +d8cb60d447.jpg +d8d2b51355.jpg +d8d8c31b97.jpg +d8e537f666.jpg +d8ed71b4e6.jpg +d8f193f307.jpg +d8fe45bd8e.jpg +d91111b364.jpg +d9115e5edb.jpg +d9152313cb.jpg +d918e65388.jpg +d91b717086.jpg +d91e76998b.jpg +d91ed1f131.jpg +d91ef12bcc.jpg +d953dde89a.jpg +d954d521d0.jpg +d95a0544ce.jpg +d95a4b2cdb.jpg +d95d89e45b.jpg +d95e1c9924.jpg +d96109257b.jpg +d963189c42.jpg +d964bff4cb.jpg +d9737885d6.jpg +d987a1397f.jpg +d99267a987.jpg +d99f7fd1c8.jpg +d9af976585.jpg +d9b4601624.jpg +d9c3926f71.jpg +d9cf6a6e56.jpg +d9d0c7e0ce.jpg +d9d108d1b9.jpg +d9d227c60e.jpg +d9d2932eb9.jpg +d9d48c11ac.jpg +d9d703626e.jpg +d9d71e731b.jpg +d9e2210f32.jpg +d9e492cdcf.jpg +d9e707621b.jpg +d9f0f20d86.jpg +d9f150d8f0.jpg +d9fa8d549a.jpg +da02b3d8e3.jpg +da0ce9d51b.jpg +da142e5c2f.jpg +da2c6c922c.jpg +da2ecef181.jpg +da2ef729a8.jpg +da3180f2da.jpg +da34e6ccfb.jpg +da3893d1e2.jpg +da4fdc279c.jpg +da53f58c50.jpg +da62d6fcae.jpg +da651f04fd.jpg +da6c35cbf9.jpg +da702ffbf7.jpg +da76d6477b.jpg +da79dcd616.jpg +da7ae7af4c.jpg +da95c751b0.jpg +dab0c180ea.jpg +dab53ceeee.jpg +dabb75c707.jpg +dabca6968f.jpg +dac4293a65.jpg +dac47b7e91.jpg +dac6f6e398.jpg +dac84c3309.jpg +dad3b63df7.jpg +daebd802ba.jpg +daef20a8a2.jpg +daf23f296f.jpg +db18aa43ef.jpg +db1c010668.jpg +db33f568f2.jpg +db384d8da4.jpg +db3a803998.jpg +db5dbad747.jpg +db61f00a69.jpg +db65f82b29.jpg +db67367a89.jpg +db6afaf677.jpg +db6ca3f326.jpg +db6d44ff40.jpg +db87658602.jpg +db8a00e666.jpg +db97519894.jpg +db97b483e2.jpg +dbac7993f4.jpg +dbad3423f7.jpg +dbb9856c8c.jpg +dbc1634a75.jpg +dbc31310a1.jpg +dbc3fc18c2.jpg +dbd22c9154.jpg +dbd382e9e9.jpg +dbdd2fb273.jpg +dbe2cd2c6f.jpg +dbf669a342.jpg +dc0ce0c2c2.jpg +dc16e46e77.jpg +dc18731819.jpg +dc21b9f400.jpg +dc2a92eb5a.jpg +dc2c1cfefa.jpg +dc4151bd30.jpg +dc417da570.jpg +dc4eaae42d.jpg +dc7633b08a.jpg +dc7e3dcadf.jpg +dc862ae8aa.jpg +dc9da0561d.jpg +dc9ddf27f4.jpg +dc9dfd6250.jpg +dca45da90e.jpg +dca7880fce.jpg +dcb6d1098e.jpg +dcc7900801.jpg +dccc15d8a1.jpg +dcd069b245.jpg +dcd0b25de1.jpg +dcd143cc81.jpg +dcd6036462.jpg +dcde817c42.jpg +dcdf21d450.jpg +dce12f581e.jpg +dd050b138d.jpg +dd0c0579a4.jpg +dd0ef458c3.jpg +dd226d618a.jpg +dd29490d19.jpg +dd2e1804fa.jpg +dd3d7610cb.jpg +dd3d86d4ef.jpg +dd5905222c.jpg +dd78927fd3.jpg +dd94740974.jpg +dd95c56993.jpg +dda7ee0a77.jpg +ddafe46b38.jpg +ddb718d257.jpg +ddc0202960.jpg +ddd416ddd6.jpg +ddd8b5363e.jpg +ddd9058eb7.jpg +ddded69049.jpg +dde76d45fc.jpg +de0558d40b.jpg +de0cb936c8.jpg +de1525ca66.jpg +de1e18c44a.jpg +de1e325f68.jpg +de23d49364.jpg +de25f55745.jpg +de3f383dae.jpg +de5c5040b1.jpg +de6e804239.jpg +de7e43efcc.jpg +de8c8ee8f2.jpg +dea09311cb.jpg +dec050626d.jpg +dec15232a6.jpg +dec5489394.jpg +decad9b151.jpg +ded592bda8.jpg +ded5953ee9.jpg +dedb0e552a.jpg +dee4d9ed27.jpg +deee42dc2b.jpg +def9b26096.jpg +df024881b9.jpg +df035e8f69.jpg +df1bd9e04f.jpg +df1c28ab75.jpg +df24af750e.jpg +df26d1dd80.jpg +df292f8e6d.jpg +df2c48d7c7.jpg +df2d2ddd20.jpg +df68866b1e.jpg +df72ab0cd2.jpg +df7f93f180.jpg +df8e5aa1be.jpg +df9c5153e4.jpg +df9d63ee14.jpg +dfa3003de7.jpg +dfae026f6d.jpg +dfb102819a.jpg +dfb676d53e.jpg +dfc219c56a.jpg +dfc295113b.jpg +dfc3f3b0b9.jpg +dfc55c9152.jpg +dfcaeb611e.jpg +dfd265e60a.jpg +dfd7780d9d.jpg +dfd8af91e6.jpg +dfd8d6904b.jpg +dfd933e53e.jpg +dfe113f4ee.jpg +dfe4485c97.jpg +dfe8706be5.jpg +dfea4826bd.jpg +dff9f11f50.jpg +e0006f0f41.jpg +e01371bd33.jpg +e01ae85fc1.jpg +e023a824d6.jpg +e025ea9b42.jpg +e02826d3da.jpg +e03c948e22.jpg +e044af4d1c.jpg +e050bceada.jpg +e068b69e5b.jpg +e0824aa93b.jpg +e084aba76b.jpg +e08ae32a68.jpg +e08afd73a6.jpg +e08ef1a83d.jpg +e0a728a02e.jpg +e0aa61e4bf.jpg +e0ab12b9a7.jpg +e0aed36f6a.jpg +e0cc1f6237.jpg +e0ce83825c.jpg +e0d073c945.jpg +e0dbaffa04.jpg +e0e5da3707.jpg +e0f0abe9f8.jpg +e0f99505ef.jpg +e10025dcac.jpg +e111113868.jpg +e1135ab381.jpg +e113d4f031.jpg +e12ebdbf91.jpg +e140e245e9.jpg +e147bfc52a.jpg +e1595c8686.jpg +e162036a47.jpg +e168b6a549.jpg +e195d1b2b1.jpg +e1a0a62adc.jpg +e1aa025444.jpg +e1afdf2240.jpg +e1b0d89e75.jpg +e1d10c2b93.jpg +e1d3319f0f.jpg +e1e28a1e83.jpg +e1e82e7dd3.jpg +e1eabf3a60.jpg +e1ed53d17e.jpg +e1f46b5e53.jpg +e200a0888f.jpg +e20f7bd016.jpg +e215137374.jpg +e224d59487.jpg +e22bab4350.jpg +e244e46111.jpg +e24e37e7db.jpg +e250abd7b2.jpg +e261f8c936.jpg +e281e09d4c.jpg +e282839f0e.jpg +e2929a6a6d.jpg +e29cd48980.jpg +e2a350f1bf.jpg +e2a94a61ae.jpg +e2ad33196a.jpg +e2b6a5d47c.jpg +e2c2c2a874.jpg +e2ce32211d.jpg +e2ce77a5a8.jpg +e2d54b2b7a.jpg +e2d55836cd.jpg +e2d8779fb9.jpg +e2db412ea1.jpg +e2dfad9dcc.jpg +e2e796fc0c.jpg +e2f87929b1.jpg +e2f9d6d274.jpg +e2fe3ee140.jpg +e306c9b71a.jpg +e306d09bad.jpg +e3097c26e7.jpg +e31eb71b89.jpg +e32158ae36.jpg +e324b38006.jpg +e3534b24d6.jpg +e353b0f4f5.jpg +e3552b949b.jpg +e35f22cbdd.jpg +e3626273d1.jpg +e36c261ecd.jpg +e36e80c8fb.jpg +e3703002a1.jpg +e37c7d3add.jpg +e38256ea99.jpg +e38c1c764a.jpg +e3926a62ca.jpg +e39e571962.jpg +e3a0abc49d.jpg +e3a631d658.jpg +e3a9e6f2be.jpg +e3af66042a.jpg +e3c3a4bf28.jpg +e3c57ee552.jpg +e3c5e7d760.jpg +e3c97b6e58.jpg +e3d36428cf.jpg +e3d3827bd0.jpg +e3e05ec64a.jpg +e3e6883f3a.jpg +e3e87dc520.jpg +e3f7f7ec34.jpg +e400379a58.jpg +e400f1b151.jpg +e40773b435.jpg +e40d68836b.jpg +e42a478372.jpg +e42e379880.jpg +e433a04dd6.jpg +e442db5ed4.jpg +e44dc4ab74.jpg +e45a162b6d.jpg +e463852b82.jpg +e46639fce9.jpg +e46e03b413.jpg +e477c5d906.jpg +e47f9092f7.jpg +e48fb4f324.jpg +e497a20f60.jpg +e4988de583.jpg +e49b25fe22.jpg +e4a47122a5.jpg +e4a542babd.jpg +e4b18fcc9d.jpg +e4bddde3ff.jpg +e4c0f3f929.jpg +e4cabb2288.jpg +e4cda0e11d.jpg +e4ce16849b.jpg +e4d0e1365c.jpg +e4da32c8fe.jpg +e4da3b6bf3.jpg +e4e12477d4.jpg +e4e271d26d.jpg +e4e3e70171.jpg +e4e54f7848.jpg +e4e733241b.jpg +e4f128a3ec.jpg +e4f793cbdb.jpg +e4fea86130.jpg +e4ff86da58.jpg +e501638b8c.jpg +e503e3f36d.jpg +e5045d3749.jpg +e51ee3a030.jpg +e520556c37.jpg +e53141c362.jpg +e538b6a155.jpg +e53d14fb4e.jpg +e56d464f9e.jpg +e56efdaa5e.jpg +e572af8532.jpg +e578d5306f.jpg +e57b04af85.jpg +e57f3d56c4.jpg +e585701f4a.jpg +e58b7f1fc5.jpg +e5968e30e7.jpg +e5a38f57cd.jpg +e5a8dffb1e.jpg +e5abe81609.jpg +e5b58cda4c.jpg +e5cadba2fa.jpg +e5ccf59b44.jpg +e5d344b6d9.jpg +e5d4fc895c.jpg +e5d9e35412.jpg +e5dddfb237.jpg +e5e0754cf3.jpg +e5f6608455.jpg +e60061b224.jpg +e605e6f297.jpg +e60886de71.jpg +e60b538beb.jpg +e635b20db7.jpg +e6429c4260.jpg +e6507eedf4.jpg +e6577bad84.jpg +e66b0bf434.jpg +e67874255f.jpg +e6942b2456.jpg +e699f615c2.jpg +e69bc8243b.jpg +e6a4218479.jpg +e6ae6930d8.jpg +e6cb0e28d0.jpg +e6cd40782e.jpg +e6d19b14f1.jpg +e6d82e944c.jpg +e6d929c138.jpg +e6df5d430b.jpg +e6e46215b9.jpg +e6fa22ba34.jpg +e6fc15bdef.jpg +e7035a08a6.jpg +e717c0e13a.jpg +e71e056753.jpg +e732b782a9.jpg +e7437938a0.jpg +e74545717a.jpg +e74c43a49d.jpg +e750d77f8b.jpg +e75a58950a.jpg +e75c34287d.jpg +e75e2d8e77.jpg +e764d24e96.jpg +e770eb67d0.jpg +e786246e51.jpg +e791da4018.jpg +e79b1d40d8.jpg +e79ef6cbd3.jpg +e79f9979ee.jpg +e7a7e08300.jpg +e7aa12d8a6.jpg +e7c494541a.jpg +e7c9f9d564.jpg +e7cba41883.jpg +e7ccf54f8d.jpg +e7cd21d7f3.jpg +e7d0240c30.jpg +e7deab7eb2.jpg +e7df9e7d2e.jpg +e7e7aa5039.jpg +e7f53f22b8.jpg +e8080c7598.jpg +e81230d563.jpg +e8146628f4.jpg +e8188f0072.jpg +e81b7688b2.jpg +e82a55e866.jpg +e8305e07ba.jpg +e837c2b02e.jpg +e838ddceea.jpg +e83cbe7e37.jpg +e83fe7ac7d.jpg +e86313b8a4.jpg +e86e8552ab.jpg +e86f01e606.jpg +e876b47068.jpg +e884d8cee6.jpg +e8abe073bd.jpg +e8b9f886f8.jpg +e8bfb3609b.jpg +e8c12da3c8.jpg +e8c4636f10.jpg +e8cb6b4c66.jpg +e8cbbac3de.jpg +e8d4256e5a.jpg +e8d7d00977.jpg +e8d88c23ec.jpg +e8da0004f7.jpg +e8db3d5fae.jpg +e8f69cb744.jpg +e905c2a019.jpg +e905e9850a.jpg +e9079c4921.jpg +e908a004ba.jpg +e908ad9444.jpg +e90b504e7c.jpg +e9261a627f.jpg +e93a2afea4.jpg +e93cfb5a6b.jpg +e93ee6cdd3.jpg +e94385ea63.jpg +e946b377ed.jpg +e95255b608.jpg +e9631f47d5.jpg +e9632f11af.jpg +e964042ec4.jpg +e96867a9b4.jpg +e972a9e3b4.jpg +e976a5cf61.jpg +e9a11ed1d0.jpg +e9a120914d.jpg +e9a30d15c7.jpg +e9a310f424.jpg +e9abe9ce29.jpg +e9b0661361.jpg +e9d22f8968.jpg +e9d4088d3b.jpg +e9d600a7e9.jpg +e9d6824b13.jpg +e9d7f5c753.jpg +e9dbc47153.jpg +e9ddd64edc.jpg +e9de51ae12.jpg +e9e5d4095e.jpg +ea01d15db0.jpg +ea1fbb8391.jpg +ea27f112b3.jpg +ea304b5364.jpg +ea40b60bad.jpg +ea4ae02598.jpg +ea5656d0cf.jpg +ea5a23b508.jpg +ea60f5e77f.jpg +ea71f42a76.jpg +ea781fbdac.jpg +ea9b6f6c1a.jpg +eaa2534a45.jpg +eaaf1ad71a.jpg +eaafb18ab3.jpg +eac8c90db7.jpg +eaca3d5f05.jpg +eacfeb3e2a.jpg +ead42e4782.jpg +eae1b37df0.jpg +eae4382bc6.jpg +eae44e5c4f.jpg +eaf451a994.jpg +eaf55cb993.jpg +eaf9084220.jpg +eafd6847da.jpg +eb0ea62abe.jpg +eb13c93b82.jpg +eb27177d02.jpg +eb2a66fcb8.jpg +eb2c6031a0.jpg +eb359044c6.jpg +eb42e1a461.jpg +eb44289a53.jpg +eb47b89ba0.jpg +eb4dc7f162.jpg +eb52138988.jpg +eb566639a5.jpg +eb694b42cc.jpg +eb894b9ecd.jpg +eb900a1041.jpg +eb98ec5901.jpg +eba4f49101.jpg +eba7fe58d8.jpg +ebaa7c1b61.jpg +ebac31e552.jpg +ebb10d4d5f.jpg +ebb729383d.jpg +ebc16b8cc2.jpg +ebc45de34e.jpg +ebc4c57f50.jpg +ebccbe38ca.jpg +ebd2dd4b80.jpg +ebd7747063.jpg +ebd885bc1f.jpg +ebe3414516.jpg +ebe6dfaa45.jpg +ebedeaf347.jpg +ec081fb786.jpg +ec10c7beab.jpg +ec10c9c58d.jpg +ec188b256f.jpg +ec1c72a001.jpg +ec258de1aa.jpg +ec2c20c6b5.jpg +ec34b91092.jpg +ec390ea90f.jpg +ec3f2b8131.jpg +ec3f318740.jpg +ec5d9ae940.jpg +ec65271b73.jpg +ec71afb268.jpg +ec72247f2f.jpg +ec777ca065.jpg +ec7cd6ebee.jpg +ec7cfb0e2c.jpg +ec902ee7e8.jpg +ec9cb6c33e.jpg +eca656bb01.jpg +ecaac63437.jpg +ecbfe60f66.jpg +ecc388d0da.jpg +eccd77ef34.jpg +ecd24613cd.jpg +ece1f9cc04.jpg +ecf1f516bd.jpg +ecf4384906.jpg +ecfe40ad99.jpg +ed025cb385.jpg +ed0c62db49.jpg +ed1e1dff48.jpg +ed22be82db.jpg +ed6bc92ed5.jpg +ed6bea58db.jpg +ed6cb97bdc.jpg +ed6ff3b2bf.jpg +ed7941d125.jpg +ed7a82ad7d.jpg +ed7f1910ee.jpg +ed81180504.jpg +ed8a8fb799.jpg +ed8b464e61.jpg +ed8bfd8efe.jpg +edace1f767.jpg +edad5e6979.jpg +edaf8f18b9.jpg +edb15b09bd.jpg +edbac0fb07.jpg +edcde5c4d5.jpg +edd4ce1184.jpg +edd801ae75.jpg +edda4919a8.jpg +eddc9bdbff.jpg +eddd0539c3.jpg +eddec94da7.jpg +edf02a0bd8.jpg +edfa7575c5.jpg +edfb0f8573.jpg +ee0abe2262.jpg +ee0d13b763.jpg +ee297fadbb.jpg +ee33d09958.jpg +ee38a407d4.jpg +ee45f0625c.jpg +ee4aafc392.jpg +ee64707c9a.jpg +ee69f5f847.jpg +ee8a35eff2.jpg +ee8af6406e.jpg +ee8cba9b03.jpg +ee92c64c4c.jpg +ee9c89ab4f.jpg +ee9f12c28e.jpg +eea788d49b.jpg +eea828af89.jpg +eeadcdc883.jpg +eeb44df39b.jpg +eece091209.jpg +eed8346233.jpg +eedc52b015.jpg +eedd3caf9b.jpg +eedd842bd4.jpg +eedeec1833.jpg +eee540b814.jpg +eeef28d4f2.jpg +eeefb3889c.jpg +eef16260c3.jpg +eef7a4aac3.jpg +eef95fed0e.jpg +eefabb1856.jpg +ef064e2efe.jpg +ef09679693.jpg +ef1dde3b3a.jpg +ef281ae43d.jpg +ef2cfe52f1.jpg +ef2f4b491e.jpg +ef45886efa.jpg +ef4cf74215.jpg +ef581fab36.jpg +ef5bf0ae22.jpg +ef5f713cac.jpg +ef67751b04.jpg +ef6c9aa252.jpg +ef6e6c6f4f.jpg +ef743558fd.jpg +ef87574743.jpg +ef9485a3d8.jpg +ef94875e33.jpg +ef95d0da3b.jpg +efa6496e67.jpg +efaa599eb8.jpg +efac19a2d5.jpg +efc093a763.jpg +efc6257759.jpg +efd67da2de.jpg +efd7734530.jpg +efd960cf0f.jpg +efdc27cf84.jpg +efe3ddb4cd.jpg +efeb5d4109.jpg +efebe5cf76.jpg +efeea29d60.jpg +eff0d9d2bd.jpg +eff254ead6.jpg +eff7e509c1.jpg +f000bce0cb.jpg +f002664226.jpg +f009e1838b.jpg +f00ee79625.jpg +f0155948a6.jpg +f01ed35bd6.jpg +f021079aaf.jpg +f023e66bb0.jpg +f023fe7c8a.jpg +f024b7e240.jpg +f02b5a203e.jpg +f02e5275e0.jpg +f060179162.jpg +f06230df37.jpg +f0833d0bcf.jpg +f085a4bbf2.jpg +f09be06af8.jpg +f0b152091d.jpg +f0bd1c31f7.jpg +f0d3dd760b.jpg +f0d9095d3d.jpg +f0de31a50a.jpg +f0e1252199.jpg +f0e1b5d00d.jpg +f0e3070813.jpg +f0e368014c.jpg +f0e540254d.jpg +f0ed5c0da7.jpg +f0f026d431.jpg +f0f0b6d565.jpg +f0f1d96e4a.jpg +f0f370f2d6.jpg +f0f40785b2.jpg +f0f48445e0.jpg +f0f937090f.jpg +f0ff1e1fa3.jpg +f100043ec0.jpg +f1072f7082.jpg +f10938160a.jpg +f130c7d621.jpg +f14860234a.jpg +f14bdc6ae2.jpg +f150c77056.jpg +f1595c12a1.jpg +f161dd9a79.jpg +f17dc2d316.jpg +f17dd023d0.jpg +f187f4f801.jpg +f18e31cfdb.jpg +f18f51352e.jpg +f1941cce89.jpg +f1ac96118a.jpg +f1acc1c5bc.jpg +f1b9a04723.jpg +f1b9f90a8d.jpg +f1bd86dab5.jpg +f1bee42b76.jpg +f1da75d72f.jpg +f1dc4ae917.jpg +f1e840eed1.jpg +f1f6c57f91.jpg +f1fcf52e62.jpg +f20ad4e46f.jpg +f20ce255e6.jpg +f2155b0dce.jpg +f218b7dbb3.jpg +f221e2b9cf.jpg +f22398714d.jpg +f224098250.jpg +f23885e558.jpg +f244c231d9.jpg +f246926909.jpg +f257c713e1.jpg +f25d95ef71.jpg +f26c120010.jpg +f27177e65f.jpg +f28d0b7c1e.jpg +f2a198af42.jpg +f2a503b8f5.jpg +f2ac5ae9ef.jpg +f2b5e8804e.jpg +f2bd71e871.jpg +f2bef79f35.jpg +f2c4998f5e.jpg +f2c7307e80.jpg +f2ca64ff21.jpg +f2cd50cf05.jpg +f2ce974123.jpg +f2d143b7eb.jpg +f2d599908f.jpg +f2db9483ec.jpg +f2e9ef6f83.jpg +f2ee39cb18.jpg +f2f276072a.jpg +f2fe0bdbc6.jpg +f30419b330.jpg +f30ba97237.jpg +f30bc8dd02.jpg +f3104f82e0.jpg +f324bbcf69.jpg +f324bc3468.jpg +f32abb455d.jpg +f32b2a0705.jpg +f32e9dc62a.jpg +f32f47dae3.jpg +f33121211c.jpg +f3373dd7ed.jpg +f3418b7625.jpg +f3429e3b49.jpg +f35c2a73a5.jpg +f36071fd7e.jpg +f36831a791.jpg +f36ffa9bfd.jpg +f38641e176.jpg +f38809ef39.jpg +f39191bf60.jpg +f3a5e9d530.jpg +f3ace53166.jpg +f3c4efec63.jpg +f3c5a78ba7.jpg +f3c7dcd5d1.jpg +f3ca599f02.jpg +f3d25ee7c8.jpg +f3d5f98878.jpg +f3d621d1ff.jpg +f3d7afe7cb.jpg +f3db0dcf5c.jpg +f3e1f4faaf.jpg +f3e37884c8.jpg +f41206c55f.jpg +f4151401ec.jpg +f42256e812.jpg +f43503c98d.jpg +f43eede7e1.jpg +f44decf1ae.jpg +f44e36a8b0.jpg +f4529f1487.jpg +f4681e55f1.jpg +f46b5595ec.jpg +f46d01181a.jpg +f47077b123.jpg +f476d30f77.jpg +f48e03b69c.jpg +f493c96aa8.jpg +f496efdf51.jpg +f49e7a9e85.jpg +f4af70630b.jpg +f4c2579d99.jpg +f4c4bc7110.jpg +f4c5a615c2.jpg +f4c5b538a1.jpg +f4d40b4746.jpg +f4db2ac66b.jpg +f4dd76da02.jpg +f4e71e0826.jpg +f4f371364c.jpg +f4fa6bbb18.jpg +f4fb0823af.jpg +f5102d464a.jpg +f521e7d9bc.jpg +f526e99c1d.jpg +f52a0c174a.jpg +f52c47226d.jpg +f52d567c77.jpg +f52d95f3f2.jpg +f5304733a4.jpg +f541dcd6ae.jpg +f56673ee2d.jpg +f56c482e0c.jpg +f56ef7c25f.jpg +f570337f9b.jpg +f579f6c1ac.jpg +f57a90c5ee.jpg +f57b69a246.jpg +f582a217a6.jpg +f583e03bf0.jpg +f59313deaf.jpg +f595261887.jpg +f59b1cc3fd.jpg +f59cd92806.jpg +f5b7baac80.jpg +f5c09e7aa3.jpg +f5c9f45799.jpg +f5ca962644.jpg +f5ce4a6b25.jpg +f5dc837547.jpg +f5e019c574.jpg +f5e0ba250f.jpg +f5e117f768.jpg +f5e5745b02.jpg +f5ef9a962e.jpg +f5f282fd5a.jpg +f5f5d1352a.jpg +f5fa41a1b7.jpg +f5fdee9c5a.jpg +f601d45831.jpg +f6023f9414.jpg +f61f56e28d.jpg +f62096f01a.jpg +f620dd6a22.jpg +f6256c3788.jpg +f62a400740.jpg +f63e97d752.jpg +f64386010d.jpg +f654d25aaf.jpg +f655313abc.jpg +f65d7fcbe7.jpg +f66317ea4e.jpg +f67285c244.jpg +f679fc7610.jpg +f68f68a7e7.jpg +f6a30c1a34.jpg +f6b0db8e3a.jpg +f6b4684472.jpg +f6cb734783.jpg +f6d29447ce.jpg +f6d4b56ead.jpg +f6e59937fe.jpg +f6e5a0ad93.jpg +f6e6cfd1d8.jpg +f6f475c668.jpg +f71741fbec.jpg +f7180c7f12.jpg +f720da2e34.jpg +f72d8619d5.jpg +f73262da47.jpg +f73c3656b5.jpg +f742e36eaf.jpg +f74426ff3c.jpg +f789ffdeeb.jpg +f78d2bccaa.jpg +f78fcc6b58.jpg +f792dcfb02.jpg +f7954faa07.jpg +f7b0d10ed0.jpg +f7c9054ca7.jpg +f7ca5ff8f3.jpg +f7d0d357b7.jpg +f7d0e62782.jpg +f7d33c8ce5.jpg +f7db0aeaa3.jpg +f7db17a545.jpg +f7de0a9d76.jpg +f7e68821ce.jpg +f7eadd56da.jpg +f8043aa26f.jpg +f8188efcc8.jpg +f81b3d6c07.jpg +f81ccaa506.jpg +f82898bf83.jpg +f8309569e2.jpg +f839a879d5.jpg +f83c851eed.jpg +f84ea4ee57.jpg +f84eac40cf.jpg +f85968710c.jpg +f85f6afb5b.jpg +f86718f0b9.jpg +f870122a8e.jpg +f88cd9cb43.jpg +f8a051d47b.jpg +f8a47a9000.jpg +f8a790a92c.jpg +f8b8c68a45.jpg +f8bc0af218.jpg +f8c3a02c93.jpg +f8c4ae3735.jpg +f8c9c393c0.jpg +f8d0bca885.jpg +f8d3316d9e.jpg +f8d41c7c83.jpg +f8d4db89f1.jpg +f8d9122bb1.jpg +f8db271663.jpg +f8df3f65c1.jpg +f8e7ff27ef.jpg +f8e8d20edf.jpg +f8f4c3f8f2.jpg +f8ffa48886.jpg +f900a03006.jpg +f9015aec38.jpg +f9040d6527.jpg +f90a53c5b3.jpg +f90d03b9ae.jpg +f9141f4421.jpg +f920b3f617.jpg +f93a0897ea.jpg +f93bedd42a.jpg +f9472ace4d.jpg +f95c1f229a.jpg +f961289a1a.jpg +f96ab2c8e2.jpg +f972bad39f.jpg +f9748797fb.jpg +f977c04311.jpg +f97ff33824.jpg +f9847422d6.jpg +f98b4ea01a.jpg +f98ec7e7be.jpg +f99835f64c.jpg +f9b3d6fc40.jpg +f9b9359ea3.jpg +f9c2cc9e67.jpg +f9c2fd0156.jpg +f9c8c2d72f.jpg +f9d224cf37.jpg +f9d428c247.jpg +f9da44d887.jpg +f9dbb719d4.jpg +f9e215f6c1.jpg +f9e647a263.jpg +f9e915b69f.jpg +f9eb732282.jpg +f9ebe0422c.jpg +f9ee45e677.jpg +f9eea5543c.jpg +f9f29a14c5.jpg +f9f421a804.jpg +f9f57c4db7.jpg +f9f62f0b2b.jpg +f9f7d4837d.jpg +f9ff1f2e43.jpg +fa27e83a3d.jpg +fa29dfb2b8.jpg +fa3752de76.jpg +fa3ec248be.jpg +fa4baab93c.jpg +fa590765bf.jpg +fa638ccf56.jpg +fa70be5f12.jpg +fa813e4d05.jpg +fa8c616057.jpg +fa8ce256cf.jpg +fa9286015b.jpg +fa93585ccd.jpg +fa942964ae.jpg +faa38c20af.jpg +faa84debb4.jpg +fab25a98aa.jpg +fabab3b5b5.jpg +fac5671d7a.jpg +fac70e561c.jpg +fac8fa96bc.jpg +fad20ebf41.jpg +fad22762f1.jpg +fad46e91b1.jpg +fad581b5b8.jpg +fad9caf352.jpg +fadc388205.jpg +fadd41fb5d.jpg +fade4b9315.jpg +fadf90c407.jpg +fae57f5974.jpg +fae584df46.jpg +fae70ad247.jpg +faf3474850.jpg +faf43b7283.jpg +faf4533938.jpg +fb03513f48.jpg +fb038c9374.jpg +fb0e99ead2.jpg +fb228a0b3f.jpg +fb28c567a5.jpg +fb340ace2e.jpg +fb34cd8704.jpg +fb3ec13c4d.jpg +fb42ef2835.jpg +fb4548e8f8.jpg +fb4c364566.jpg +fb4d2e8e88.jpg +fb5259dbd9.jpg +fb5d14435d.jpg +fb7b88f8cf.jpg +fb7ce59a1b.jpg +fb800d7a6f.jpg +fb9b7a7f45.jpg +fb9ea031d6.jpg +fba1c788bd.jpg +fba99f5df9.jpg +fbba14b0e2.jpg +fbbee3053f.jpg +fbc0a2bcbd.jpg +fbc13d017d.jpg +fbc522b43f.jpg +fbc8c7d584.jpg +fbd8a31067.jpg +fbe7bf5bf7.jpg +fbe97e3a95.jpg +fbea2dc389.jpg +fbee0859b1.jpg +fbefbdccd4.jpg +fbf07591f3.jpg +fbf3e834ea.jpg +fbfcd92c4e.jpg +fbfd9fa139.jpg +fbfdf2f1e3.jpg +fc06de1d9d.jpg +fc0db3f4ad.jpg +fc0dbf8e1f.jpg +fc0e8f7876.jpg +fc2a63d2b2.jpg +fc3ed0012f.jpg +fc3fd24d12.jpg +fc4c590cb1.jpg +fc52d6007b.jpg +fc579c828e.jpg +fc761dca1d.jpg +fc7a212b9d.jpg +fc8ea183be.jpg +fc99763178.jpg +fca31dd881.jpg +fcaadd368b.jpg +fcac1ed9a7.jpg +fcbe148582.jpg +fcc07ea9a8.jpg +fcc4143787.jpg +fcc69ea51e.jpg +fcc7f82ce0.jpg +fcda90fe71.jpg +fcdbe38b82.jpg +fcde9ae93a.jpg +fce7784b79.jpg +fce9c92932.jpg +fcedb2ab99.jpg +fcf9c856da.jpg +fd02504e6e.jpg +fd140163ff.jpg +fd162d7502.jpg +fd17814e0a.jpg +fd1bfedf71.jpg +fd20fe76cc.jpg +fd258cb2d6.jpg +fd33cf9dd4.jpg +fd45d40d4a.jpg +fd59afc8dc.jpg +fd5ce5e1b3.jpg +fd6cb68f69.jpg +fd6e426be7.jpg +fd8d13f171.jpg +fda20489de.jpg +fda45b5266.jpg +fda5d6a16c.jpg +fda9527bb9.jpg +fdb179ae53.jpg +fdbe07cbdb.jpg +fdc4deb59a.jpg +fdcb68c1b6.jpg +fdcef8f7d9.jpg +fdd20a486d.jpg +fdd566bafd.jpg +fddd4793c0.jpg +fde48a2d1f.jpg +fde50fe566.jpg +fde547487c.jpg +fde684638b.jpg +fdead1249f.jpg +fdefafbb68.jpg +fdf8df9f55.jpg +fdfa4baf9f.jpg +fdfdef9956.jpg +fe15f23201.jpg +fe18299961.jpg +fe188ababd.jpg +fe1e8c7d7f.jpg +fe1f14da0c.jpg +fe24bf3e4e.jpg +fe29776c5c.jpg +fe35a4b222.jpg +fe36845f27.jpg +fe3d6a9206.jpg +fe4b226c9e.jpg +fe50609214.jpg +fe5062701c.jpg +fe59749d78.jpg +fe623168b9.jpg +fe771a8464.jpg +fe78ce0f33.jpg +fe7aa5b59d.jpg +fe7e782603.jpg +fe7eb2f711.jpg +fe8a433602.jpg +fe908d212e.jpg +fe9a5fd3bc.jpg +fe9abc89a1.jpg +fea3504677.jpg +fea72a6707.jpg +fea9b374d6.jpg +feac3675d4.jpg +febf3ddf72.jpg +fec71714fb.jpg +fec919e0bd.jpg +fecbd4e02c.jpg +fecdf654da.jpg +fed13b967b.jpg +fed4317a3c.jpg +fed47f53dd.jpg +fed7391781.jpg +fed92a7767.jpg +fedbe6a98a.jpg +feefd9e1ba.jpg +fef39b2805.jpg +fef57e19c5.jpg +fefc2aef0c.jpg +fefdc069da.jpg +ff0e05b330.jpg +ff107fa1dd.jpg +ff17968b8e.jpg +ff3b6be5f6.jpg +ff4091a5c1.jpg +ff4ddde631.jpg +ff574eb682.jpg +ff59357e75.jpg +ff5a278ce2.jpg +ff618d0698.jpg +ff672f2b5c.jpg +ff6c081c3a.jpg +ff7603f56c.jpg +ff7e4bcc1e.jpg +ff832a44b2.jpg +ff83643180.jpg +ffae0373d2.jpg +ffb19880c1.jpg +ffba632b59.jpg +ffbb518aed.jpg +ffc3b83fa2.jpg +ffc811f3f7.jpg +ffc8ce4288.jpg +ffca6a355b.jpg +ffcad78225.jpg +ffcbef0a69.jpg +ffcd6496c0.jpg +ffd3659fa6.jpg +ffd58c0e39.jpg +ffd6c40af1.jpg +ffd7999571.jpg +ffe91252e8.jpg +ffeaa2778a.jpg +ffed2bf1b7.jpg +fffa0d5bf4.jpg +fffb1bae06.jpg \ No newline at end of file diff --git a/FoodSeg103/demo/.DS_Store b/FoodSeg103/demo/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2fb478374f9d18fc659857270c31c218c2c7e118 Binary files /dev/null and b/FoodSeg103/demo/.DS_Store differ diff --git a/FoodSeg103/demo/MMSegmentation_Tutorial.ipynb b/FoodSeg103/demo/MMSegmentation_Tutorial.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..127ad4e6a7d14d83ddca96ca519a26e5ba52eb64 --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/demo/demo.png b/FoodSeg103/demo/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..1e82d7a0773cea14b36f0021fea603de0961b5d8 Binary files /dev/null and b/FoodSeg103/demo/demo.png differ diff --git a/FoodSeg103/demo/image_demo(original).py b/FoodSeg103/demo/image_demo(original).py new file mode 100644 index 0000000000000000000000000000000000000000..a18ac67a9395d075fbc30ab2308590b66bd7728f --- /dev/null +++ b/FoodSeg103/demo/image_demo(original).py @@ -0,0 +1,32 @@ +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) + #update to CPU + model = init_segmentor(args.config, args.checkpoint, device='cpu') + + # 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/FoodSeg103/demo/image_demo.py b/FoodSeg103/demo/image_demo.py new file mode 100644 index 0000000000000000000000000000000000000000..529266074659e33816563ac9e26bd9e4660d3d4b --- /dev/null +++ b/FoodSeg103/demo/image_demo.py @@ -0,0 +1,84 @@ +import argparse +import os.path as osp + +import mmcv +import numpy as np +import cv2 +from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot + + +palette = np.random.randint(0, 255, (104, 3)) +DEFAULT_PALETTE = palette + + + + +def parse_args(): + parser = argparse.ArgumentParser(description='MMSeg Inference') + parser.add_argument('img', help='Image file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument('--device', default='cpu', help='Device used for inference') + args = parser.parse_args() + return args + +def compute_all_segments_area(image): + """ + Computes the pixel area for each segment in the image. + Args: + - image: A 2D numpy array representing the segmented image (grayscale). + + Returns: + - A dictionary with segment values as keys and their corresponding areas (in pixels) as values. + """ + # Ensure image is grayscale (single channel) + assert len(image.shape) == 2, "Image should be grayscale" + + unique_values, counts = np.unique(image, return_counts=True) + return dict(zip(unique_values, counts)) + +def main(): + args = parse_args() + + # build the model from a config file and a checkpoint file + model = init_segmentor(args.config, args.checkpoint, device=args.device) + + # Load class names from the provided file + with open('../data/FoodSeg103/category_id.txt', 'r') as f: + class_names = [line.strip().split('\t')[1] for line in f.readlines()] + + model.CLASSES = class_names + + + # test a single image + result = inference_segmentor(model, args.img) + + # show the results + print("Inside image_demo DEFAULT_PALETTE.shape:", DEFAULT_PALETTE.shape) + + + + # Calculate segment areas + segment_areas = compute_all_segments_area(result[0]) + + # Map segment values to their respective class names + segment_classes = {class_names[segment_value]: area for segment_value, area in segment_areas.items()} + + # Print segment areas with their class names + for class_name, area in segment_classes.items(): + print(f"Segment for class '{class_name}': Area = {area} pixels") + + #show_result_pyplot(model, args.img, result, DEFAULT_PALETTE) + class_names = model.CLASSES if model.CLASSES is not None else ['class_{}'.format(i) for i in range(104)] + output_path = '../output_images/segmented_result.jpg' + show_result_pyplot(model, args.img, result, DEFAULT_PALETTE, out_file=output_path, class_names=class_names) + + # Assuming you've already loaded the model and have the segmentation result + class_names = model.CLASSES if model.CLASSES is not None else ['class_{}'.format(i) for i in range(104)] + + + +if __name__ == '__main__': + main() + + diff --git a/FoodSeg103/demo/inference_demo.ipynb b/FoodSeg103/demo/inference_demo.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..e47d964e3c41d1db5e348d22d8ec01641c8aa88b --- /dev/null +++ b/FoodSeg103/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/FoodSeg103/demo/mmcv/.DS_Store b/FoodSeg103/demo/mmcv/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..01f4eb5fbb2f72c9bc20411cbb67a6dfdd62000f Binary files /dev/null and b/FoodSeg103/demo/mmcv/.DS_Store differ diff --git a/FoodSeg103/demo/mmcv/.circleci/config.yml b/FoodSeg103/demo/mmcv/.circleci/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..4660422fa105ae4acae54c884fa09079a4a2bffd --- /dev/null +++ b/FoodSeg103/demo/mmcv/.circleci/config.yml @@ -0,0 +1,32 @@ +version: 2.1 + +# this allows you to use CircleCI's dynamic configuration feature +setup: true + +# the path-filtering orb is required to continue a pipeline based on +# the path of an updated fileset +orbs: + path-filtering: circleci/path-filtering@0.1.2 + +workflows: + # the always-run workflow is always triggered, regardless of the pipeline parameters. + always-run: + jobs: + # the path-filtering/filter job determines which pipeline + # parameters to update. + - path-filtering/filter: + name: check-updated-files + # 3-column, whitespace-delimited mapping. One mapping per + # line: + # + mapping: | + mmcv/.* lint_only false + requirements/.* lint_only false + tests/.* lint_only false + .circleci/.* lint_only false + base-revision: main + # this is the path of the configuration we should trigger once + # path filtering and pipeline parameter value updates are + # complete. In this case, we are using the parent dynamic + # configuration itself. + config-path: .circleci/test.yml diff --git a/FoodSeg103/demo/mmcv/.circleci/docker/Dockerfile b/FoodSeg103/demo/mmcv/.circleci/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..db5ab86e3a01ce22ab354620ca76a728793957c4 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.circleci/docker/Dockerfile @@ -0,0 +1,15 @@ +ARG PYTORCH="1.8.1" +ARG CUDA="10.2" +ARG CUDNN="7" + +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +# Set MKL_THREADING_LAYER=GNU to fix issue: +# https://github.com/pytorch/pytorch/issues/37377 +ENV MKL_THREADING_LAYER GNU + +# To fix GPG key error when running apt-get update +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + +RUN apt-get update && apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx ffmpeg libturbojpeg git diff --git a/FoodSeg103/demo/mmcv/.circleci/test.yml b/FoodSeg103/demo/mmcv/.circleci/test.yml new file mode 100644 index 0000000000000000000000000000000000000000..a5c72b55392131ed0b41c30ddf12c838c10839b0 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.circleci/test.yml @@ -0,0 +1,292 @@ +version: 2.1 + +# the default pipeline parameters, which will be updated according to +# the results of the path-filtering orb +parameters: + lint_only: + type: boolean + default: true + +jobs: + lint: + docker: + - image: cimg/python:3.7.4 + steps: + - checkout + - run: + name: Install pre-commit hook + command: | + pip install pre-commit + pre-commit install + - run: + name: Linting + command: pre-commit run --all-files + build_without_torch: + parameters: + # The python version must match available image tags in + # https://circleci.com/developer/images/image/cimg/python + python: + type: string + default: "3.7.4" + docker: + - image: cimg/python:<< parameters.python >> + resource_class: large + steps: + - checkout + - run: + name: Install Libraries + command: | + sudo apt-get update + sudo apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx libjpeg-dev zlib1g-dev libtinfo-dev libncurses5 ffmpeg libturbojpeg + - run: + name: Upgrade pip + command: | + pip install pip --upgrade + pip --version + - run: + name: Install MMEngine from main branch + command: pip install git+https://github.com/open-mmlab/mmengine.git@main + - run: + name: Build MMCV from source + command: pip install -e . -v + environment: + MMCV_WITH_OPS: 0 + - run: + name: Install unit tests dependencies + command: pip install -r requirements/test.txt + - run: + name: Run unit tests + command: pytest tests/test_image tests/test_transforms tests/test_video tests/test_arraymisc.py tests/test_visualization.py tests/test_utils/test_env.py --ignore=tests/test_image/test_io.py + build_without_ops: + parameters: + # The python version must match available image tags in + # https://circleci.com/developer/images/image/cimg/python + python: + type: string + default: "3.7.4" + torch: + type: string + torchvision: + type: string + docker: + - image: cimg/python:<< parameters.python >> + resource_class: large + steps: + - checkout + - run: + name: Install Libraries + command: | + sudo apt-get update + sudo apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx libjpeg-dev zlib1g-dev libtinfo-dev libncurses5 ffmpeg libturbojpeg + - run: + name: Configure Python & pip + command: | + pip install --upgrade pip + pip install wheel + - run: + name: Install PyTorch + command: pip install torch==<< parameters.torch >>+cpu torchvision==<< parameters.torchvision >>+cpu -f https://download.pytorch.org/whl/torch_stable.html + - run: + name: Install MMEngine from main branch + command: pip install git+https://github.com/open-mmlab/mmengine.git@main + - run: + name: Create sdist and untar + command: | + sed -i "s/os.getenv('MMCV_WITH_OPS', '1')/os.getenv('MMCV_WITH_OPS', '0')/g" setup.py + python setup.py sdist + tar zxvf dist/mmcv* -C /tmp + rm -r mmcv + - run: + name: Build and install from sdist + command: | + pushd /tmp/mmcv* + pip install -e . -v + popd + - run: + name: Install unit tests dependencies + command: pip install -r requirements/test.txt + - run: + name: Run unit tests + command: pytest tests --ignore=tests/test_ops + build_cpu: + parameters: + # The python version must match available image tags in + # https://circleci.com/developer/images/image/cimg/python + python: + type: string + torch: + type: string + torchvision: + type: string + docker: + - image: cimg/python:<< parameters.python >> + resource_class: large + steps: + - checkout + - run: + name: Install Libraries + command: | + sudo apt-get update + sudo apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx libjpeg-dev zlib1g-dev libtinfo-dev libncurses5 ffmpeg libturbojpeg + - run: + name: Configure Python & pip + command: | + pip install --upgrade pip + pip install wheel + - run: + name: Install PyTorch + command: pip install torch==<< parameters.torch >>+cpu torchvision==<< parameters.torchvision >>+cpu -f https://download.pytorch.org/whl/torch_stable.html + - run: + name: Install MMEngine from main branch + command: pip install git+https://github.com/open-mmlab/mmengine.git@main + - run: + name: Install ninja to speed the compilation + command: pip install ninja + - run: + name: Create sdist and untar + command: | + python setup.py sdist + tar zxvf dist/mmcv* -C /tmp + rm -r mmcv + - run: + name: Build and install from sdist + command: | + pushd /tmp/mmcv* + pip install -e . -v + popd + - run: + name: Install unit tests dependencies + command: pip install -r requirements/test.txt + - run: + name: Run unit tests + command: | + coverage run --branch --source mmcv -m pytest tests/ + coverage xml + coverage report -m + build_cuda: + parameters: + torch: + type: string + cuda: + type: enum + enum: ["10.1", "10.2", "11.1", "11.7"] + cudnn: + type: integer + default: 7 + machine: + image: ubuntu-2004-cuda-11.4:202110-01 + docker_layer_caching: true + resource_class: gpu.nvidia.small + steps: + - checkout + - run: + name: Build Docker image + command: | + docker build .circleci/docker -t mmcv:gpu --build-arg PYTORCH=<< parameters.torch >> --build-arg CUDA=<< parameters.cuda >> --build-arg CUDNN=<< parameters.cudnn >> + docker run --gpus all -t -d -v /home/circleci/project:/mmcv -w /mmcv --name mmcv mmcv:gpu + - run: + name: Install MMEngine from main branch + command: docker exec mmcv pip install git+https://github.com/open-mmlab/mmengine.git@main + - run: + name: Install ninja to speed the compilation + command: docker exec mmcv pip install ninja + - run: + name: Build MMCV from source + command: docker exec mmcv pip install -e . -v + - run: + name: Install unit tests dependencies + command: docker exec mmcv pip install -r requirements/test.txt + - run: + name: Run unit tests + command: docker exec mmcv python -m pytest tests/ + +workflows: + pr_stage_lint: + when: << pipeline.parameters.lint_only >> + jobs: + - lint: + name: lint + filters: + branches: + ignore: + - main + pr_stage_test: + when: + not: + << pipeline.parameters.lint_only >> + jobs: + - lint: + name: lint + filters: + branches: + ignore: + - main + - build_without_torch: + name: build_without_torch + requires: + - lint + - build_without_ops: + name: build_without_ops + torch: 1.8.1 + torchvision: 0.9.1 + requires: + - build_without_torch + - build_cpu: + name: minimum_version_cpu + torch: 1.8.1 + torchvision: 0.9.1 + python: 3.7.4 + requires: + - build_without_ops + - build_cpu: + name: maximum_version_cpu + torch: 2.0.0 + torchvision: 0.15.1 + python: 3.9.0 + requires: + - minimum_version_cpu + - hold_cuda_test: + type: approval + - build_cuda: + name: minimum_version_gpu + torch: 1.8.1 + # Use double quotation mark to explicitly specify its type + # as string instead of number + cuda: "10.2" + requires: + - hold_cuda_test + - build_cuda: + name: maximum_version_gpu + torch: 2.0.0 + # Use double quotation mark to explicitly specify its type + # as string instead of number + cuda: "11.7" + cudnn: 8 + requires: + - hold_cuda_test + merge_stage_test: + when: + not: + << pipeline.parameters.lint_only >> + jobs: + - build_cuda: + name: minimum_version_gpu + torch: 1.8.1 + # Use double quotation mark to explicitly specify its type + # as string instead of number + cuda: "10.2" + filters: + branches: + only: + - main + - build_cuda: + name: maximum_version_gpu + torch: 2.0.0 + # Use double quotation mark to explicitly specify its type + # as string instead of number + cuda: "11.7" + cudnn: 8 + filters: + branches: + only: + - main diff --git a/FoodSeg103/demo/mmcv/.dev_scripts/check_installation.py b/FoodSeg103/demo/mmcv/.dev_scripts/check_installation.py new file mode 100644 index 0000000000000000000000000000000000000000..739c1e11028865b5230438b88b706f80e203576d --- /dev/null +++ b/FoodSeg103/demo/mmcv/.dev_scripts/check_installation.py @@ -0,0 +1,44 @@ +import numpy as np +import torch + +from mmcv.ops import box_iou_rotated +from mmcv.utils import collect_env + + +def check_installation(): + """Check whether mmcv has been installed successfully.""" + np_boxes1 = np.asarray( + [[1.0, 1.0, 3.0, 4.0, 0.5], [2.0, 2.0, 3.0, 4.0, 0.6], + [7.0, 7.0, 8.0, 8.0, 0.4]], + dtype=np.float32) + np_boxes2 = np.asarray( + [[0.0, 2.0, 2.0, 5.0, 0.3], [2.0, 1.0, 3.0, 3.0, 0.5], + [5.0, 5.0, 6.0, 7.0, 0.4]], + dtype=np.float32) + boxes1 = torch.from_numpy(np_boxes1) + boxes2 = torch.from_numpy(np_boxes2) + + # test mmcv with CPU ops + box_iou_rotated(boxes1, boxes2) + print('CPU ops were compiled successfully.') + + # test mmcv with both CPU and CUDA ops + if torch.cuda.is_available(): + boxes1 = boxes1.cuda() + boxes2 = boxes2.cuda() + box_iou_rotated(boxes1, boxes2) + print('CUDA ops were compiled successfully.') + else: + print('No CUDA runtime is found, skipping the checking of CUDA ops.') + + +if __name__ == '__main__': + print('Start checking the installation of mmcv ...') + check_installation() + print('mmcv has been installed successfully.\n') + + env_info_dict = collect_env() + env_info = '\n'.join([(f'{k}: {v}') for k, v in env_info_dict.items()]) + dash_line = '-' * 60 + '\n' + print('Environment information:') + print(dash_line + env_info + '\n' + dash_line) diff --git a/FoodSeg103/demo/mmcv/.dockerignore b/FoodSeg103/demo/mmcv/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..8c22f226d3e2d8a625515290691d2cfc6ed87f2e --- /dev/null +++ b/FoodSeg103/demo/mmcv/.dockerignore @@ -0,0 +1,6 @@ +.git +.gitignore +*.egg-info +.eggs/ +.mypy-cache +pip-wheel-metadata diff --git a/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/1-bug-report.yml b/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/1-bug-report.yml new file mode 100644 index 0000000000000000000000000000000000000000..d6d0a081b60f28a964d77ea5fdfbb713b14e9273 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -0,0 +1,94 @@ +name: "🐞 Bug report" +description: "Create a report to help us reproduce and fix the bug" +labels: bug +title: "[Bug] " + +body: + - type: markdown + attributes: + value: | + ## Note + For general usage questions or idea discussions, please post it to our [**Forum**](https://github.com/open-mmlab/mmcv/discussions) + Please fill in as **much** of the following form as you're able to. **The clearer the description, the shorter it will take to solve it.** + + - type: checkboxes + attributes: + label: Prerequisite + description: Please check the following items before creating a new issue. + options: + - label: I have searched [Issues](https://github.com/open-mmlab/mmcv/issues) and [Discussions](https://github.com/open-mmlab/mmcv/discussions) but cannot get the expected help. + required: true + - label: The bug has not been fixed in the latest version(https://github.com/open-mmlab/mmcv). + required: true + + - type: textarea + attributes: + label: Environment + description: | + Please run `python -c "from mmcv.utils import collect_env; print(collect_env())"` to collect necessary environment information and copy-paste it here. + You may add additional information that may be helpful for locating the problem, such as + - How you installed PyTorch \[e.g., pip, conda, source\] + - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) + validations: + required: true + + - type: textarea + attributes: + label: Reproduces the problem - code sample + description: | + Please provide a code sample that reproduces the problem you ran into. It can be a Colab link or just a code snippet. + placeholder: | + ```python + # Sample code to reproduce the problem + ``` + validations: + required: true + + - type: textarea + attributes: + label: Reproduces the problem - command or script + description: | + What command or script did you run? + placeholder: | + ```shell + The command or script you run. + ``` + validations: + required: true + + - type: textarea + attributes: + label: Reproduces the problem - error message + description: | + Please provide the error message or logs you got, with the full traceback. + + Tip: You can attach images or log files by dragging them into the text area.. + placeholder: | + ``` + The error message or logs you got, with the full traceback. + ``` + validations: + required: true + + - type: textarea + attributes: + label: Additional information + description: | + Tell us anything else you think we should know. + + Tip: You can attach images or log files by dragging them into the text area. + placeholder: | + 1. What's your expected result? + 2. What dataset did you use? + 3. What do you think might be the reason? + + - type: markdown + attributes: + value: | + ## Acknowledgement + Thanks for taking the time to fill out this report. + + If you have already identified the reason, we strongly appreciate you creating a new PR to fix it [**Here**](https://github.com/open-mmlab/mmcv/pulls)! + Please refer to [**Contribution Guide**](https://mmcv.readthedocs.io/en/latest/community/contributing.html) for contributing. + + Welcome to join our [**Community (TODO)**](https://mmcv.readthedocs.io/en/latest/contact.html) to discuss together. 👬 diff --git a/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/2-feature_request.yml b/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/2-feature_request.yml new file mode 100644 index 0000000000000000000000000000000000000000..eb122cdb88aba478a14d283c6c9bb0cdb3cf4e7a --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/2-feature_request.yml @@ -0,0 +1,39 @@ +name: 🚀 Feature request +description: Suggest an idea for this project +labels: [feature-request] +title: "[Feature] " + +body: + - type: markdown + attributes: + value: | + ## Note + For general usage questions or idea discussions, please post it to our [**Forum**](https://github.com/open-mmlab/mmcv/discussions) + + Please fill in as **much** of the following form as you're able to. **The clearer the description, the shorter it will take to solve it.** + + - type: textarea + attributes: + label: What is the feature? + description: Tell us more about the feature and how this feature can help. + placeholder: | + E.g., It is inconvenient when \[....\]. + validations: + required: true + + - type: textarea + attributes: + label: Any other context? + description: | + Have you considered any alternative solutions or features? If so, what are they? Also, feel free to add any other context or screenshots about the feature request here. + + - type: markdown + attributes: + value: | + ## Acknowledgement + Thanks for taking the time to fill out this report. + + We strongly appreciate you creating a new PR to implement it [**Here**](https://github.com/open-mmlab/mmcv/pulls)! + Please refer to [**Contribution Guide**](https://mmcv.readthedocs.io/en/latest/community/contributing.html) for contributing. + + Welcome to join our [**Community (TODO)**](https://mmcv.readthedocs.io/en/latest/contact.html) to discuss together. 👬 diff --git a/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/3-documentation.yml b/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/3-documentation.yml new file mode 100644 index 0000000000000000000000000000000000000000..e68fd841f1030eebd9ac2e5c709c6ded422e470e --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/3-documentation.yml @@ -0,0 +1,37 @@ +name: 📚 Documentation +description: Report an issue related to the documentation. +labels: "docs" +title: "[Docs] " + +body: + - type: markdown + attributes: + value: | + ## Note + For general usage questions or idea discussions, please post it to our [**Forum**](https://github.com/open-mmlab/mmcv/discussions) + Please fill in as **much** of the following form as you're able to. **The clearer the description, the shorter it will take to solve it.** + + - type: textarea + attributes: + label: 📚 The doc issue + description: > + A clear and concise description the issue. + validations: + required: true + + - type: textarea + attributes: + label: Suggest a potential alternative/fix + description: > + Tell us how we could improve the documentation in this regard. + + - type: markdown + attributes: + value: | + ## Acknowledgement + Thanks for taking the time to fill out this report. + + If you have already identified the reason, we strongly appreciate you creating a new PR to fix it [**here**](https://github.com/open-mmlab/mmcv/pulls)! + Please refer to [**Contribution Guide**](https://mmcv.readthedocs.io/en/latest/community/contributing.html) for contributing. + + Welcome to join our [**Community(TODO)**](https://mmcv.readthedocs.io/en/latest/contact.html) to discuss together. 👬 diff --git a/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/config.yml b/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..3338ac5a94a872444e152d8ce8064fb8f4dc6a29 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,12 @@ +blank_issues_enabled: false + +contact_links: + - name: 💬 Forum + url: https://github.com/open-mmlab/mmcv/discussions + about: Ask general usage questions and discuss with other mmcv community members + - name: MMCV Documentation + url: https://mmcv.readthedocs.io/en/latest/ + about: Check if your question is answered in docs + - name: 🌐 Explore OpenMMLab + url: https://openmmlab.com/ + about: Get know more about OpenMMLab diff --git a/FoodSeg103/demo/mmcv/.github/pull_request_template.md b/FoodSeg103/demo/mmcv/.github/pull_request_template.md new file mode 100644 index 0000000000000000000000000000000000000000..0980b85db1c5fc90b2a8c32aa5fbdf923b25bf32 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/pull_request_template.md @@ -0,0 +1,33 @@ +Thanks for your contribution and we appreciate it a lot. The following instructions would make your pull request more healthy and more easily get feedback. If you do not understand some items, don't worry, just make the pull request and seek help from maintainers. + +## Motivation + +Please describe the motivation of this PR and the goal you want to achieve through this PR. + +## Modification + +Please briefly describe what modification is made in this PR. + +## BC-breaking (Optional) + +Does the modification introduce changes that break the backward-compatibility of the downstream repositories? +If so, please describe how it breaks the compatibility and how the downstream projects should modify their code to keep compatibility with this PR. + +## Use cases (Optional) + +If this PR introduces a new feature, it is better to list some use cases here, and update the documentation. + +## Checklist + +**Before PR**: + +- [ ] I have read and followed the workflow indicated in the [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/blob/master/CONTRIBUTING.md) to create this PR. +- [ ] Pre-commit or linting tools indicated in [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/blob/master/CONTRIBUTING.md) are used to fix the potential lint issues. +- [ ] Bug fixes are covered by unit tests, the case that causes the bug should be added in the unit tests. +- [ ] New functionalities are covered by complete unit tests. If not, please add more unit test to ensure the correctness. +- [ ] The documentation has been modified accordingly, including docstring or example tutorials. + +**After PR**: + +- [ ] If the modification has potential influence on downstream or other related projects, this PR should be tested with some of those projects, like MMDet or MMCls. +- [ ] CLA has been signed and all committers have signed the CLA in this PR. diff --git a/FoodSeg103/demo/mmcv/.github/workflows/build_macos_wheel.yml b/FoodSeg103/demo/mmcv/.github/workflows/build_macos_wheel.yml new file mode 100644 index 0000000000000000000000000000000000000000..a9410ab78d817421d0aa0e80f3f4697bb46a1c76 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/workflows/build_macos_wheel.yml @@ -0,0 +1,72 @@ +name: build macos wheel + +on: push + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build_macos10_wheel: + runs-on: macos-10.15 + if: contains(github.event.head_commit.message, 'Bump version to') + strategy: + matrix: + torch: [1.8.0, 1.9.0, 1.10.0, 1.11.0, 1.12.0, 1.13.0, 2.0.0] + python-version: [3.7, 3.8, 3.9, '3.10', '3.11'] + include: + - torch: 1.8.0 + torchvision: 0.9.0 + - torch: 1.9.0 + torchvision: 0.10.0 + - torch: 1.10.0 + torchvision: 0.11.0 + - torch: 1.11.0 + torchvision: 0.12.0 + - torch: 1.12.0 + torchvision: 0.13.0 + - torch: 1.13.0 + torchvision: 0.14.0 + - torch: 2.0.0 + torchvision: 0.15.1 + exclude: + - torch: 1.8.0 + python-version: '3.10' + - torch: 1.9.0 + python-version: '3.10' + - torch: 1.10.0 + python-version: '3.10' + - torch: 1.8.0 + python-version: '3.11' + - torch: 1.9.0 + python-version: '3.11' + - torch: 1.10.0 + python-version: '3.11' + - torch: 1.10.0 + python-version: '3.11' + - torch: 1.11.0 + python-version: '3.11' + - torch: 1.12.0 + python-version: '3.11' + - torch: 1.13.0 + python-version: '3.11' + - torch: 2.0.0 + python-version: 3.7 + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install psutil + run: pip install psutil + - name: Install PyTorch + run: pip install torch==${{matrix.torch}} torchvision==${{matrix.torchvision}} --no-cache-dir + - name: Build and install + run: | + pip install wheel + python setup.py bdist_wheel + - uses: actions/upload-artifact@v3 + with: + name: ${{matrix.torch}} + path: dist/ diff --git a/FoodSeg103/demo/mmcv/.github/workflows/lint.yml b/FoodSeg103/demo/mmcv/.github/workflows/lint.yml new file mode 100644 index 0000000000000000000000000000000000000000..ac5afd597a9c1696c3f20699edebd30cde43314a --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/workflows/lint.yml @@ -0,0 +1,29 @@ +name: lint + +on: [push, pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 + with: + python-version: 3.7 + - name: Install pre-commit hook + run: | + pip install pre-commit + pre-commit install + - name: Linting + run: pre-commit run --all-files + - name: Format c/cuda codes with clang-format + uses: DoozyX/clang-format-lint-action@v0.11 + with: + source: mmcv/ops/csrc + extensions: h,c,cpp,hpp,cu,cuh + style: google diff --git a/FoodSeg103/demo/mmcv/.github/workflows/merge_stage_test.yml b/FoodSeg103/demo/mmcv/.github/workflows/merge_stage_test.yml new file mode 100644 index 0000000000000000000000000000000000000000..a2a5dc1345db1e4cb344a18f9b0bf8fa1c96bb89 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/workflows/merge_stage_test.yml @@ -0,0 +1,375 @@ +name: merge_stage_test + +on: + push: + paths-ignore: + - ".github/**.md" + - "docker/**" + - "docs/**" + - 'examples/**' + - '.dev_scripts/**' + - "README.md" + - "README_zh-CN.md" + - "CONTRIBUTING.md" + - ".pre-commit-config.yaml" + - ".pre-commit-config-zh-cn.yaml" + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build_without_torch: + runs-on: ubuntu-22.04 + env: + MMCV_WITH_OPS: 0 + strategy: + matrix: + python-version: [3.7] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install system dependencies + run: sudo apt-get update && sudo apt-get install -y ffmpeg libturbojpeg + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests + run: pytest tests/test_image tests/test_transforms tests/test_video tests/test_arraymisc.py tests/test_visualization.py tests/test_utils/test_env.py --ignore=tests/test_image/test_io.py + build_without_ops: + runs-on: ubuntu-22.04 + env: + MMCV_WITH_OPS: 0 + strategy: + matrix: + python-version: [3.7] + torch: [1.8.1, 1.9.1] + include: + - torch: 1.8.1 + torchvision: 0.9.1 + - torch: 1.9.1 + torchvision: 0.10.1 + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install system dependencies + run: sudo apt-get update && sudo apt-get install -y ffmpeg libturbojpeg + - name: Install PyTorch + run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests + run: pytest tests --ignore=tests/test_ops + build_cpu_py: + runs-on: ubuntu-22.04 + strategy: + matrix: + python-version: [3.8, 3.9, '3.10'] + torch: [1.13.0] + include: + - torch: 1.13.0 + torchvision: 0.14.0 + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install system dependencies + run: sudo apt-get update && sudo apt-get install -y ffmpeg libturbojpeg + - name: Upgrade pip and wheel + run: pip install pip wheel --upgrade + - name: Install PyTorch + run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests and generate coverage report + run: | + coverage run --branch --source mmcv -m pytest tests/ + coverage xml + coverage report -m + build_cpu_pt: + runs-on: ubuntu-22.04 + strategy: + matrix: + python-version: [3.7] + torch: [1.8.1, 1.9.1, 1.10.1, 1.11.0, 1.12.0, 1.13.0, 2.0.0] + include: + - torch: 1.8.1 + torchvision: 0.9.1 + - torch: 1.9.1 + torchvision: 0.10.1 + - torch: 1.10.1 + torchvision: 0.11.2 + - torch: 1.11.0 + torchvision: 0.12.0 + - torch: 1.12.0 + torchvision: 0.13.0 + - torch: 1.13.0 + torchvision: 0.14.0 + - torch: 2.0.0 + torchvision: 0.15.1 + python-version: 3.8 + exclude: + - torch: 2.0.0 + python-version: 3.7 + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install system dependencies + run: sudo apt-get update && sudo apt-get install -y ffmpeg libturbojpeg + - name: Upgrade pip and wheel + run: pip install pip wheel --upgrade + - name: Install PyTorch + run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests and generate coverage report + run: | + coverage run --branch --source mmcv -m pytest tests/ + coverage xml + coverage report -m + # Only upload coverage report for python3.7 && pytorch1.8.1 cpu + - name: Upload coverage to Codecov + if: ${{matrix.torch == '1.8.1' && matrix.python-version == '3.8'}} + uses: codecov/codecov-action@v1.0.14 + with: + file: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false + build_cu102: + runs-on: ubuntu-22.04 + container: + image: pytorch/pytorch:1.8.1-cuda10.2-cudnn7-devel + env: + FORCE_CUDA: 1 + MMCV_CUDA_ARGS: -gencode=arch=compute_61,code=sm_61 + strategy: + matrix: + python-version: [3.7] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip and wheel + run: pip install pip wheel --upgrade + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + - name: Install system dependencies + run: apt-get update && apt-get install -y git ffmpeg libturbojpeg + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests and generate coverage report + run: | + coverage run --branch --source mmcv -m pytest tests/ + coverage xml + coverage report -m + build_cu111: + runs-on: ubuntu-22.04 + container: + image: pytorch/pytorch:1.8.1-cuda11.1-cudnn8-devel + env: + FORCE_CUDA: 1 + MMCV_CUDA_ARGS: -gencode=arch=compute_61,code=sm_61 + strategy: + matrix: + python-version: [3.7] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip and wheel + run: pip install pip wheel --upgrade + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + - name: Install system dependencies + run: apt-get update && apt-get install -y git ffmpeg libturbojpeg + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests and generate coverage report + run: | + coverage run --branch --source mmcv -m pytest tests/ + coverage xml + coverage report -m + build_cu116: + runs-on: ubuntu-22.04 + container: + image: pytorch/pytorch:1.13.0-cuda11.6-cudnn8-devel + env: + FORCE_CUDA: 1 + MMCV_CUDA_ARGS: -gencode=arch=compute_61,code=sm_61 + strategy: + matrix: + python-version: [3.7] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip and wheel + run: pip install pip wheel --upgrade + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + - name: Install system dependencies + run: apt-get update && apt-get install -y git ffmpeg libturbojpeg + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests and generate coverage report + run: | + coverage run --branch --source mmcv -m pytest tests + coverage xml + coverage report -m + build_windows_without_ops: + runs-on: windows-2019 + env: + MMCV_WITH_OPS: 0 + strategy: + matrix: + python-version: [3.7] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip and wheel + run: python -m pip install pip wheel --upgrade + - name: Install PyTorch + run: pip install torch==1.8.1+cpu torchvision==0.9.1+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests + run: pytest tests --ignore=tests/test_ops --ignore tests/test_image/test_io.py + build_windows: + runs-on: windows-2019 + strategy: + matrix: + torch: [1.8.1, 2.0.0] + include: + - torch: 1.8.1 + torchvision: 0.9.1 + python-version: 3.7 + - torch: 2.0.0 + torchvision: 0.15.1 + python-version: 3.8 + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip and wheel + run: python -m pip install pip wheel --upgrade + - name: Install PyTorch + run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests + run: pytest tests/ --ignore tests/test_image/test_io.py + build_macos: + runs-on: macos-latest + strategy: + matrix: + torch: [1.8.1, 2.0.0] + include: + - torch: 1.8.1 + torchvision: 0.9.1 + python-version: 3.7 + - torch: 2.0.0 + torchvision: 0.15.1 + python-version: 3.8 + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install system dependencies + run: brew install ffmpeg jpeg-turbo + - name: Upgrade pip and wheel + run: pip install pip wheel --upgrade + - name: Install PyTorch + run: pip install torch==${{ matrix.torch }} torchvision==${{ matrix.torchvision }} + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests + run: pytest tests/ diff --git a/FoodSeg103/demo/mmcv/.github/workflows/pr_stage_test.yml b/FoodSeg103/demo/mmcv/.github/workflows/pr_stage_test.yml new file mode 100644 index 0000000000000000000000000000000000000000..d790384f14416e8bb071cd86a2363933e072c880 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/workflows/pr_stage_test.yml @@ -0,0 +1,196 @@ +name: pr_stage_test + +on: + pull_request: + paths-ignore: + - ".github/**.md" + - "docker/**" + - "docs/**" + - 'examples/**' + - '.dev_scripts/**' + - "README.md" + - "README_zh-CN.md" + - "CONTRIBUTING.md" + - ".pre-commit-config.yaml" + - ".pre-commit-config-zh-cn.yaml" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build_cu102: + runs-on: ubuntu-22.04 + container: + image: pytorch/pytorch:1.8.1-cuda10.2-cudnn7-devel + env: + FORCE_CUDA: 1 + MMCV_CUDA_ARGS: -gencode=arch=compute_61,code=sm_61 + strategy: + matrix: + python-version: [3.7] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip and wheel + run: pip install pip wheel --upgrade + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + - name: Install system dependencies + run: apt-get update && apt-get install -y git ffmpeg libturbojpeg + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests and generate coverage report + run: | + coverage run --branch --source mmcv -m pytest tests/ + coverage xml + coverage report -m + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1.0.14 + with: + file: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false + build_cu111: + runs-on: ubuntu-22.04 + container: + image: pytorch/pytorch:1.8.1-cuda11.1-cudnn8-devel + env: + FORCE_CUDA: 1 + MMCV_CUDA_ARGS: -gencode=arch=compute_61,code=sm_61 + strategy: + matrix: + python-version: [3.7] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip and wheel + run: pip install pip wheel --upgrade + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + - name: Install system dependencies + run: apt-get update && apt-get install -y git ffmpeg libturbojpeg + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests and generate coverage report + run: | + coverage run --branch --source mmcv -m pytest tests/ + coverage xml + coverage report -m + build_windows_without_ops: + runs-on: windows-2019 + env: + MMCV_WITH_OPS: 0 + strategy: + matrix: + python-version: [3.7] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip and wheel + run: python -m pip install pip wheel --upgrade + - name: Install PyTorch + run: pip install torch==1.8.1+cpu torchvision==0.9.1+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests + run: pytest tests --ignore=tests/test_ops --ignore tests/test_image/test_io.py + build_windows: + runs-on: windows-2019 + strategy: + matrix: + torch: [1.8.1, 2.0.0] + include: + - torch: 1.8.1 + torchvision: 0.9.1 + python-version: 3.7 + - torch: 2.0.0 + torchvision: 0.15.1 + python-version: 3.8 + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip and wheel + run: python -m pip install pip wheel --upgrade + - name: Install PyTorch + run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests + run: pytest tests/ --ignore tests/test_image/test_io.py + build_macos: + runs-on: macos-latest + strategy: + matrix: + torch: [1.8.1, 2.0.0] + include: + - torch: 1.8.1 + torchvision: 0.9.1 + python-version: 3.7 + - torch: 2.0.0 + torchvision: 0.15.1 + python-version: 3.8 + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install system dependencies + run: brew install ffmpeg jpeg-turbo + - name: Upgrade pip and wheel + run: pip install pip wheel --upgrade + - name: Install PyTorch + run: pip install torch==${{ matrix.torch }} torchvision==${{ matrix.torchvision }} + - name: Install MMEngine from main branch + run: pip install git+https://github.com/open-mmlab/mmengine.git@main + - name: Install ninja to speed the compilation + run: pip install ninja psutil + - name: Build MMCV from source + run: pip install -e . -v + - name: Install unit tests dependencies + run: pip install -r requirements/test.txt + - name: Run unit tests + run: pytest tests/ diff --git a/FoodSeg103/demo/mmcv/.github/workflows/publish-to-pypi.yml b/FoodSeg103/demo/mmcv/.github/workflows/publish-to-pypi.yml new file mode 100644 index 0000000000000000000000000000000000000000..5ed8e7cd96b2d1ed06d9a1553676024ff60e0e2f --- /dev/null +++ b/FoodSeg103/demo/mmcv/.github/workflows/publish-to-pypi.yml @@ -0,0 +1,46 @@ +name: deploy + +on: push + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-n-publish_without_ops: + runs-on: ubuntu-22.04 + if: startsWith(github.event.ref, 'refs/tags') + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Upgrade Setuptools + run: pip install setuptools wheel --upgrade + - name: Build MMCV + run: | + sed -i "s/os.getenv('MMCV_WITH_OPS', '1')/os.getenv('MMCV_WITH_OPS', '0')/g" setup.py + python setup.py sdist bdist_wheel + - name: Publish distribution to PyPI + run: | + pip install twine + twine upload dist/* -u __token__ -p ${{ secrets.pypi_password }} + + build-n-publish_with_ops: + runs-on: ubuntu-22.04 + if: startsWith(github.event.ref, 'refs/tags') + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Upgrade Setuptools + run: pip install setuptools --upgrade + - name: Build MMCV with ops + run: python setup.py sdist + - name: Publish distribution to PyPI + run: | + pip install twine + twine upload dist/* -u __token__ -p ${{ secrets.pypi_password }} diff --git a/FoodSeg103/demo/mmcv/.gitignore b/FoodSeg103/demo/mmcv/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..1769eff2de51a7d5b451afd1140850bd58c0f7b8 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.gitignore @@ -0,0 +1,125 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# PyTorch checkpoint +*.pth + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +mlu-ops/ +mlu-ops.* + +# 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/en/_build/ +docs/en/api/generated/ +docs/zh_cn/_build/ +docs/zh_cn/api/generated/ + +# 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/ + +# editors and IDEs +.idea/ +.vscode/ + +# custom +.DS_Store + +# datasets and logs and checkpoints +data/ +work_dir/ + +src/ diff --git a/FoodSeg103/demo/mmcv/.pre-commit-config-zh-cn.yaml b/FoodSeg103/demo/mmcv/.pre-commit-config-zh-cn.yaml new file mode 100644 index 0000000000000000000000000000000000000000..313c83c84be160867736215ee35232857f2a35d2 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.pre-commit-config-zh-cn.yaml @@ -0,0 +1,72 @@ +exclude: ^tests/data/ +repos: + - repo: https://gitee.com/openmmlab/mirrors-flake8 + rev: 5.0.4 + hooks: + - id: flake8 + - repo: https://gitee.com/openmmlab/mirrors-isort + rev: 5.11.5 + hooks: + - id: isort + - repo: https://gitee.com/openmmlab/mirrors-yapf + rev: v0.32.0 + hooks: + - id: yapf + - repo: https://gitee.com/openmmlab/mirrors-pre-commit-hooks + rev: v4.3.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://gitee.com/openmmlab/mirrors-codespell + rev: v2.2.1 + hooks: + - id: codespell + - repo: https://gitee.com/openmmlab/mirrors-mdformat + rev: 0.7.9 + hooks: + - id: mdformat + args: ["--number"] + additional_dependencies: + - mdformat-openmmlab + - mdformat_frontmatter + - linkify-it-py + - repo: https://gitee.com/openmmlab/mirrors-docformatter + rev: v1.3.1 + hooks: + - id: docformatter + args: ["--in-place", "--wrap-descriptions", "79"] + - repo: https://github.com/asottile/pyupgrade + rev: v3.0.0 + hooks: + - id: pyupgrade + args: ["--py36-plus"] + - repo: https://gitee.com/openmmlab/pre-commit-hooks + rev: v0.2.0 # Use the ref you want to point at + hooks: + - id: check-copyright + args: ["mmcv", "tests", "--excludes", "mmcv/ops"] + - repo: https://gitee.com/openmmlab/mirrors-mypy + rev: v0.812 + hooks: + - id: mypy + exclude: |- + (?x)( + ^test + | ^docs + ) + # - repo: local + # hooks: + # - id: clang-format + # name: clang-format + # description: Format files with ClangFormat + # entry: clang-format -style=google -i + # language: system + # files: \.(c|cc|cxx|cpp|cu|h|hpp|hxx|cuh|proto)$ diff --git a/FoodSeg103/demo/mmcv/.pre-commit-config.yaml b/FoodSeg103/demo/mmcv/.pre-commit-config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..76ded556f9fa40d49f2a773162a5483c091e1c9e --- /dev/null +++ b/FoodSeg103/demo/mmcv/.pre-commit-config.yaml @@ -0,0 +1,72 @@ +exclude: ^tests/data/ +repos: + - repo: https://github.com/PyCQA/flake8 + rev: 5.0.4 + hooks: + - id: flake8 + - repo: https://github.com/PyCQA/isort + rev: 5.11.5 + hooks: + - id: isort + - repo: https://github.com/pre-commit/mirrors-yapf + rev: v0.32.0 + hooks: + - id: yapf + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.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/codespell-project/codespell + rev: v2.2.1 + hooks: + - id: codespell + - repo: https://github.com/executablebooks/mdformat + rev: 0.7.9 + hooks: + - id: mdformat + args: ["--number"] + additional_dependencies: + - mdformat-openmmlab + - mdformat_frontmatter + - linkify-it-py + - repo: https://github.com/myint/docformatter + rev: v1.3.1 + hooks: + - id: docformatter + args: ["--in-place", "--wrap-descriptions", "79"] + - repo: https://github.com/asottile/pyupgrade + rev: v3.0.0 + hooks: + - id: pyupgrade + args: ["--py36-plus"] + - repo: https://github.com/open-mmlab/pre-commit-hooks + rev: v0.2.0 # Use the ref you want to point at + hooks: + - id: check-copyright + args: ["mmcv", "tests", "--excludes", "mmcv/ops"] + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v0.812 + hooks: + - id: mypy + exclude: |- + (?x)( + ^test + | ^docs + ) + # - repo: local + # hooks: + # - id: clang-format + # name: clang-format + # description: Format files with ClangFormat + # entry: clang-format -style=google -i + # language: system + # files: \.(c|cc|cxx|cpp|cu|h|hpp|hxx|cuh|proto)$ diff --git a/FoodSeg103/demo/mmcv/.readthedocs.yml b/FoodSeg103/demo/mmcv/.readthedocs.yml new file mode 100644 index 0000000000000000000000000000000000000000..7d5f1c2060a64e5cf9c2bec433cd24532a283164 --- /dev/null +++ b/FoodSeg103/demo/mmcv/.readthedocs.yml @@ -0,0 +1,9 @@ +version: 2 + +formats: all + +python: + version: 3.7 + install: + - requirements: requirements/runtime.txt + - requirements: requirements/docs.txt diff --git a/FoodSeg103/demo/mmcv/CITATION.cff b/FoodSeg103/demo/mmcv/CITATION.cff new file mode 100644 index 0000000000000000000000000000000000000000..786117aac3e063efc18ad1b55e163d570a09e379 --- /dev/null +++ b/FoodSeg103/demo/mmcv/CITATION.cff @@ -0,0 +1,8 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: + - name: "MMCV Contributors" +title: "OpenMMLab Computer Vision Foundation" +date-released: 2018-08-22 +url: "https://github.com/open-mmlab/mmcv" +license: Apache-2.0 diff --git a/FoodSeg103/demo/mmcv/CONTRIBUTING.md b/FoodSeg103/demo/mmcv/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..a60cd994305bc8b548c71951c9b57d544c1ec21d --- /dev/null +++ b/FoodSeg103/demo/mmcv/CONTRIBUTING.md @@ -0,0 +1,258 @@ +## Contributing to OpenMMLab + +Welcome to the MMCV community, we are committed to building a cutting-edge computer vision foundational library and all kinds of contributions are welcomed, including but not limited to + +**Fix bug** + +You can directly post a Pull Request to fix typo in code or documents + +The steps to fix the bug of code implementation are as follows. + +1. If the modification involve significant changes, you should create an issue first and describe the error information and how to trigger the bug. Other developers will discuss with you and propose an proper solution. + +2. Posting a pull request after fixing the bug and adding corresponding unit test. + +**New Feature or Enhancement** + +1. If the modification involve significant changes, you should create an issue to discuss with our developers to propose an proper design. +2. Post a Pull Request after implementing the new feature or enhancement and add corresponding unit test. + +**Document** + +You can directly post a pull request to fix documents. If you want to add a document, you should first create an issue to check if it is reasonable. + +### Pull Request Workflow + +If you're not familiar with Pull Request, don't worry! The following guidance will tell you how to create a Pull Request step by step. If you want to dive into the develop mode of Pull Request, you can refer to the [official documents](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) + +#### 1. Fork and clone + +If you are posting a pull request for the first time, you should fork the OpenMMLab repositories by clicking the **Fork** button in the top right corner of the GitHub page, and the forked repositories will appear under your GitHub profile. + + + +Then, you can clone the repositories to local: + +```shell +git clone git@github.com:{username}/mmcv.git +``` + +After that, you should ddd official repository as the upstream repository + +```bash +git remote add upstream git@github.com:open-mmlab/mmcv +``` + +Check whether remote repository has been added successfully by `git remote -v` + +```bash +origin git@github.com:{username}/mmcv.git (fetch) +origin git@github.com:{username}/mmcv.git (push) +upstream git@github.com:open-mmlab/mmcv (fetch) +upstream git@github.com:open-mmlab/mmcv (push) +``` + +> Here's a brief introduction to origin and upstream. When we use "git clone", we create an "origin" remote by default, which points to the repository cloned from. As for "upstream", we add it ourselves to point to the target repository. Of course, if you don't like the name "upstream", you could name it as you wish. Usually, we'll push the code to "origin". If the pushed code conflicts with the latest code in official("upstream"), we should pull the latest code from upstream to resolve the conflicts, and then push to "origin" again. The posted Pull Request will be updated automatically. + +#### 2. Configure pre-commit + +You should configure [pre-commit](https://pre-commit.com/#intro) in the local development environment to make sure the code style matches that of OpenMMLab. **Note**: The following code should be executed under the MMCV directory. + +```shell +pip install -U pre-commit +pre-commit install +``` + +Check that pre-commit is configured successfully, and install the hooks defined in `.pre-commit-config.yaml`. + +```shell +pre-commit run --all-files +``` + + + + + +If the installation process is interrupted, you can repeatedly run `pre-commit run ... ` to continue the installation. + +If the code does not conform to the code style specification, pre-commit will raise a warning and fixes some of the errors automatically. + + + +If we want to commit our code bypassing the pre-commit hook, we can use the `--no-verify` option(**only for temporarily commit**). + +```shell +git commit -m "xxx" --no-verify +``` + +#### 3. Create a development branch + +After configuring the pre-commit, we should create a branch based on the master branch to develop the new feature or fix the bug. The proposed branch name is `username/pr_name` + +```shell +git checkout -b yhc/refactor_contributing_doc +``` + +In subsequent development, if the master branch of the local repository is behind the master branch of "upstream", we need to pull the upstream for synchronization, and then execute the above command: + +```shell +git pull upstream master +``` + +#### 4. Commit the code and pass the unit test + +- MMCV introduces mypy to do static type checking to increase the robustness of the code. Therefore, we need to add Type Hints to our code and pass the mypy check. If you are not familiar with Type Hints, you can refer to [this tutorial](https://docs.python.org/3/library/typing.html). + +- The committed code should pass through the unit test + + ```shell + # Pass all unit tests + pytest tests + + # Pass the unit test of runner + pytest tests/test_runner/test_runner.py + ``` + + If the unit test fails for lack of dependencies, you can install the dependencies referring to the [guidance](#unit-test) + +- If the documents are modified/added, we should check the rendering result referring to [guidance](#document-rendering) + +#### 5. Push the code to remote + +We could push the local commits to remote after passing through the check of unit test and pre-commit. You can associate the local branch with remote branch by adding `-u` option. + +```shell +git push -u origin {branch_name} +``` + +This will allow you to use the `git push` command to push code directly next time, without having to specify a branch or the remote repository. + +#### 6. Create a Pull Request + +(1) Create a pull request in GitHub's Pull request interface + + + +(2) Modify the PR description according to the guidelines so that other developers can better understand your changes + + + +Find more details about Pull Request description in [pull request guidelines](#pr-specs). + +**note** + +(a) The Pull Request description should contain the reason for the change, the content of the change, and the impact of the change, and be associated with the relevant Issue (see [documentation](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) + +(b) If it is your first contribution, please sign the CLA + + + +(c) Check whether the Pull Request pass through the CI + + + +MMCV will run unit test for the posted Pull Request on different platforms (Linux, Window, Mac), based on different versions of Python, PyTorch, CUDA to make sure the code is correct. We can see the specific test information by clicking `Details` in the above image so that we can modify the code. + +(3) If the Pull Request passes the CI, then you can wait for the review from other developers. You'll modify the code based on the reviewer's comments, and repeat the steps [4](#4-commit-the-code-and-pass-the-unit-test)-[5](#5-push-the-code-to-remote) until all reviewers approve it. Then, we will merge it ASAP. + + + +#### 7. Resolve conflicts + +If your local branch conflicts with the latest master branch of "upstream", you'll need to resolove them. There are two ways to do this: + +```shell +git fetch --all --prune +git rebase upstream/master +``` + +or + +```shell +git fetch --all --prune +git merge upstream/master +``` + +If you are very good at handling conflicts, then you can use rebase to resolve conflicts, as this will keep your commit logs tidy. If you are not familiar with `rebase`, then you can use `merge` to resolve conflicts. + +### Guidance + +#### Unit test + +If you cannot run the unit test of some modules for lacking of some dependencies, such as [video](https://github.com/open-mmlab/mmcv/tree/master/mmcv/video) module, you can try to install the following dependencies: + +```shell +# Linux +sudo apt-get update -y +sudo apt-get install -y libturbojpeg +sudo apt-get install -y ffmpeg + +# Windows +conda install ffmpeg +``` + +We should also make sure the committed code will not decrease the coverage of unit test, we could run the following command to check the coverage of unit test: + +```shell +python -m coverage run -m pytest /path/to/test_file +python -m coverage html +# check file in htmlcov/index.html +``` + +#### Document rendering + +If the documents are modified/added, we should check the rendering result. We could install the dependencies and run the following command to render the documents and check the results: + +```shell +pip install -r requirements/docs.txt +cd docs/zh_cn/ +# or docs/en +make html +# check file in ./docs/zh_cn/_build/html/index.html +``` + +### Code style + +#### Python + +We adopt [PEP8](https://www.python.org/dev/peps/pep-0008/) as the preferred code style. + +We use the following tools for linting and formatting: + +- [flake8](https://github.com/PyCQA/flake8): A wrapper around some linter tools. +- [isort](https://github.com/timothycrosley/isort): A Python utility to sort imports. +- [yapf](https://github.com/google/yapf): A formatter for Python files. +- [codespell](https://github.com/codespell-project/codespell): A Python utility to fix common misspellings in text files. +- [mdformat](https://github.com/executablebooks/mdformat): Mdformat is an opinionated Markdown formatter that can be used to enforce a consistent style in Markdown files. +- [docformatter](https://github.com/myint/docformatter): A formatter to format docstring. + +Style configurations of yapf and isort can be found in [setup.cfg](./setup.cfg). + +We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`, `markdown files`, +fixes `end-of-files`, `double-quoted-strings`, `python-encoding-pragma`, `mixed-line-ending`, sorts `requirments.txt` automatically on every commit. +The config for a pre-commit hook is stored in [.pre-commit-config](./.pre-commit-config.yaml). + +#### C++ and CUDA + +We follow the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html). + +### PR Specs + +1. Use [pre-commit](https://pre-commit.com) hook to avoid issues of code style + +2. One short-time branch should be matched with only one PR + +3. Accomplish a detailed change in one PR. Avoid large PR + + - Bad: Support Faster R-CNN + - Acceptable: Add a box head to Faster R-CNN + - Good: Add a parameter to box head to support custom conv-layer number + +4. Provide clear and significant commit message + +5. Provide clear and meaningful PR description + + - Task name should be clarified in title. The general format is: \[Prefix\] Short description of the PR (Suffix) + - Prefix: add new feature \[Feature\], fix bug \[Fix\], related to documents \[Docs\], in developing \[WIP\] (which will not be reviewed temporarily) + - Introduce main changes, results and influences on other modules in short description + - Associate related issues and pull requests with a milestone diff --git a/FoodSeg103/demo/mmcv/CONTRIBUTING_zh-CN.md b/FoodSeg103/demo/mmcv/CONTRIBUTING_zh-CN.md new file mode 100644 index 0000000000000000000000000000000000000000..00622031dd567957829f38d0425d3d23741c8f2f --- /dev/null +++ b/FoodSeg103/demo/mmcv/CONTRIBUTING_zh-CN.md @@ -0,0 +1,274 @@ +## 贡献代码 + +欢迎加入 MMCV 社区,我们致力于打造最前沿的计算机视觉基础库,我们欢迎任何类型的贡献,包括但不限于 + +**修复错误** + +修复代码实现错误的步骤如下: + +1. 如果提交的代码改动较大,建议先提交 issue,并正确描述 issue 的现象、原因和复现方式,讨论后确认修复方案。 +2. 修复错误并补充相应的单元测试,提交拉取请求。 + +**新增功能或组件** + +1. 如果新功能或模块涉及较大的代码改动,建议先提交 issue,确认功能的必要性。 +2. 实现新增功能并添单元测试,提交拉取请求。 + +**文档补充** + +修复文档可以直接提交拉取请求 + +添加文档或将文档翻译成其他语言步骤如下 + +1. 提交 issue,确认添加文档的必要性。 +2. 添加文档,提交拉取请求。 + +### 拉取请求工作流 + +如果你对拉取请求不了解,没关系,接下来的内容将会从零开始,一步一步地指引你如何创建一个拉取请求。如果你想深入了解拉取请求的开发模式,可以参考 github [官方文档](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) + +#### 1. 复刻仓库 + +当你第一次提交拉取请求时,先复刻 OpenMMLab 原代码库,点击 GitHub 页面右上角的 **Fork** 按钮,复刻后的代码库将会出现在你的 GitHub 个人主页下。 + + + +将代码克隆到本地 + +```shell +git clone git@github.com:{username}/mmcv.git +``` + +添加原代码库为上游代码库 + +```bash +git remote add upstream git@github.com:open-mmlab/mmcv +``` + +检查 remote 是否添加成功,在终端输入 `git remote -v` + +```bash +origin git@github.com:{username}/mmcv.git (fetch) +origin git@github.com:{username}/mmcv.git (push) +upstream git@github.com:open-mmlab/mmcv (fetch) +upstream git@github.com:open-mmlab/mmcv (push) +``` + +> 这里对 origin 和 upstream 进行一个简单的介绍,当我们使用 git clone 来克隆代码时,会默认创建一个 origin 的 remote,它指向我们克隆的代码库地址,而 upstream 则是我们自己添加的,用来指向原始代码库地址。当然如果你不喜欢他叫 upstream,也可以自己修改,比如叫 open-mmlab。我们通常向 origin 提交代码(即 fork 下来的远程仓库),然后向 upstream 提交一个 pull request。如果提交的代码和最新的代码发生冲突,再从 upstream 拉取最新的代码,和本地分支解决冲突,再提交到 origin。 + +#### 2. 配置 pre-commit + +在本地开发环境中,我们使用 [pre-commit](https://pre-commit.com/#intro) 来检查代码风格,以确保代码风格的统一。在提交代码,需要先安装 pre-commit(需要在 MMCV 目录下执行): + +```shell +pip install -U pre-commit +pre-commit install +``` + +检查 pre-commit 是否配置成功,并安装 `.pre-commit-config.yaml` 中的钩子: + +```shell +pre-commit run --all-files +``` + + + + + +> 如果你是中国用户,由于网络原因,可能会出现安装失败的情况,这时可以使用国内源 + +> pre-commit install -c .pre-commit-config-zh-cn.yaml + +> pre-commit run --all-files -c .pre-commit-config-zh-cn.yaml + +如果安装过程被中断,可以重复执行 `pre-commit run ...` 继续安装。 + +如果提交的代码不符合代码风格规范,pre-commit 会发出警告,并自动修复部分错误。 + + + +如果我们想临时绕开 pre-commit 的检查提交一次代码,可以在 `git commit` 时加上 `--no-verify`(需要保证最后推送至远程仓库的代码能够通过 pre-commit 检查)。 + +```shell +git commit -m "xxx" --no-verify +``` + +#### 3. 创建开发分支 + +安装完 pre-commit 之后,我们需要基于 master 创建开发分支,建议的分支命名规则为 `username/pr_name`。 + +```shell +git checkout -b yhc/refactor_contributing_doc +``` + +在后续的开发中,如果本地仓库的 master 分支落后于 upstream 的 master 分支,我们需要先拉取 upstream 的代码进行同步,再执行上面的命令 + +```shell +git pull upstream master +``` + +#### 4. 提交代码并在本地通过单元测试 + +- MMCV 引入了 mypy 来做静态类型检查,以增加代码的鲁棒性。因此我们在提交代码时,需要补充 Type Hints。具体规则可以参考[教程](https://zhuanlan.zhihu.com/p/519335398)。 + +- 提交的代码同样需要通过单元测试 + + ```shell + # 通过全量单元测试 + pytest tests + + # 我们需要保证提交的代码能够通过修改模块的单元测试,以 runner 为例 + pytest tests/test_runner/test_runner.py + ``` + + 如果你由于缺少依赖无法运行修改模块的单元测试,可以参考[指引-单元测试](#单元测试) + +- 如果修改/添加了文档,参考[指引](#文档渲染)确认文档渲染正常。 + +#### 5. 推送代码到远程 + +代码通过单元测试和 pre-commit 检查后,将代码推送到远程仓库,如果是第一次推送,可以在 `git push` 后加上 `-u` 参数以关联远程分支 + +```shell +git push -u origin {branch_name} +``` + +这样下次就可以直接使用 `git push` 命令推送代码了,而无需指定分支和远程仓库。 + +#### 6. 提交拉取请求(PR) + +(1) 在 GitHub 的 Pull request 界面创建拉取请求 + + +(2) 根据指引修改 PR 描述,以便于其他开发者更好地理解你的修改 + + + +描述规范详见[拉取请求规范](#拉取请求规范) + +  + +**注意事项** + +(a) PR 描述应该包含修改理由、修改内容以及修改后带来的影响,并关联相关 Issue(具体方式见[文档](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)) + +(b) 如果是第一次为 OpenMMLab 做贡献,需要签署 CLA + + + +(c) 检查提交的 PR 是否通过 CI(集成测试) + + + +MMCV 会在不同的平台(Linux、Window、Mac),基于不同版本的 Python、PyTorch、CUDA 对提交的代码进行单元测试,以保证代码的正确性,如果有任何一个没有通过,我们可点击上图中的 `Details` 来查看具体的测试信息,以便于我们修改代码。 + +(3) 如果 PR 通过了 CI,那么就可以等待其他开发者的 review,并根据 reviewer 的意见,修改代码,并重复 [4](#4-提交代码并本地通过单元测试)-[5](#5-推送代码到远程) 步骤,直到 reviewer 同意合入 PR。 + + + +所有 reviewer 同意合入 PR 后,我们会尽快将 PR 合并到主分支。 + +#### 7. 解决冲突 + +随着时间的推移,我们的代码库会不断更新,这时候,如果你的 PR 与主分支存在冲突,你需要解决冲突,解决冲突的方式有两种: + +```shell +git fetch --all --prune +git rebase upstream/master +``` + +或者 + +```shell +git fetch --all --prune +git merge upstream/master +``` + +如果你非常善于处理冲突,那么可以使用 rebase 的方式来解决冲突,因为这能够保证你的 commit log 的整洁。如果你不太熟悉 `rebase` 的使用,那么可以使用 `merge` 的方式来解决冲突。 + +### 指引 + +#### 单元测试 + +如果你无法正常执行部分模块的单元测试,例如 [video](https://github.com/open-mmlab/mmcv/tree/master/mmcv/video) 模块,可能是你的当前环境没有安装以下依赖 + +```shell +# Linux +sudo apt-get update -y +sudo apt-get install -y libturbojpeg +sudo apt-get install -y ffmpeg + +# Windows +conda install ffmpeg +``` + +在提交修复代码错误或新增特性的拉取请求时,我们应该尽可能的让单元测试覆盖所有提交的代码,计算单元测试覆盖率的方法如下 + +```shell +python -m coverage run -m pytest /path/to/test_file +python -m coverage html +# check file in htmlcov/index.html +``` + +#### 文档渲染 + +在提交修复代码错误或新增特性的拉取请求时,可能会需要修改/新增模块的 docstring。我们需要确认渲染后的文档样式是正确的。 +本地生成渲染后的文档的方法如下 + +```shell +pip install -r requirements/docs.txt +cd docs/zh_cn/ +# or docs/en +make html +# check file in ./docs/zh_cn/_build/html/index.html +``` + +### 代码风格 + +#### Python + +[PEP8](https://www.python.org/dev/peps/pep-0008/) 作为 OpenMMLab 算法库首选的代码规范,我们使用以下工具检查和格式化代码 + +- [flake8](https://github.com/PyCQA/flake8): Python 官方发布的代码规范检查工具,是多个检查工具的封装 +- [isort](https://github.com/timothycrosley/isort): 自动调整模块导入顺序的工具 +- [yapf](https://github.com/google/yapf): Google 发布的代码规范检查工具 +- [codespell](https://github.com/codespell-project/codespell): 检查单词拼写是否有误 +- [mdformat](https://github.com/executablebooks/mdformat): 检查 markdown 文件的工具 +- [docformatter](https://github.com/myint/docformatter): 格式化 docstring 的工具 + +yapf 和 isort 的配置可以在 [setup.cfg](./setup.cfg) 找到 + +通过配置 [pre-commit hook](https://pre-commit.com/) ,我们可以在提交代码时自动检查和格式化 `flake8`、`yapf`、`isort`、`trailing whitespaces`、`markdown files`, +修复 `end-of-files`、`double-quoted-strings`、`python-encoding-pragma`、`mixed-line-ending`,调整 `requirments.txt` 的包顺序。 +pre-commit 钩子的配置可以在 [.pre-commit-config](./.pre-commit-config.yaml) 找到。 + +pre-commit 具体的安装使用方式见[拉取请求](#2-配置-pre-commit)。 + +更具体的规范请参考 [OpenMMLab 代码规范](code_style.md)。 + +#### C++ and CUDA + +C++ 和 CUDA 的代码规范遵从 [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) + +### 拉取请求规范 + +1. 使用 [pre-commit hook](https://pre-commit.com),尽量减少代码风格相关问题 + +2. 一个`拉取请求`对应一个短期分支 + +3. 粒度要细,一个`拉取请求`只做一件事情,避免超大的`拉取请求` + + - Bad:实现 Faster R-CNN + - Acceptable:给 Faster R-CNN 添加一个 box head + - Good:给 box head 增加一个参数来支持自定义的 conv 层数 + +4. 每次 Commit 时需要提供清晰且有意义 commit 信息 + +5. 提供清晰且有意义的`拉取请求`描述 + + - 标题写明白任务名称,一般格式:\[Prefix\] Short description of the pull request (Suffix) + - prefix: 新增功能 \[Feature\], 修 bug \[Fix\], 文档相关 \[Docs\], 开发中 \[WIP\] (暂时不会被review) + - 描述里介绍`拉取请求`的主要修改内容,结果,以及对其他部分的影响, 参考`拉取请求`模板 + - 关联相关的`议题` (issue) 和其他`拉取请求` + +6. 如果引入了其他三方库,或借鉴了三方库的代码,请确认他们的许可证和 mmcv 兼容,并在借鉴的代码上补充 `This code is inspired from http://` diff --git a/FoodSeg103/demo/mmcv/LICENSE b/FoodSeg103/demo/mmcv/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..f02314255d824c0816b0bf1648aac8ab78976199 --- /dev/null +++ b/FoodSeg103/demo/mmcv/LICENSE @@ -0,0 +1,203 @@ +Copyright (c) OpenMMLab. 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 2018-2020 Open-MMLab. All rights reserved. + + 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/FoodSeg103/demo/mmcv/LICENSES.md b/FoodSeg103/demo/mmcv/LICENSES.md new file mode 100644 index 0000000000000000000000000000000000000000..3cdeddf6ff1d09ed8e2d9042f2d930e20599a0b1 --- /dev/null +++ b/FoodSeg103/demo/mmcv/LICENSES.md @@ -0,0 +1,11 @@ +# Licenses for special operations + +In this file, we list the operations with other licenses instead of Apache 2.0. Users should be careful about adopting these operations in any commercial matters. + +| Operation | Files | License | +| :--------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------: | +| upfirdn2d | [mmcv/ops/csrc/pytorch/cuda/upfirdn2d_kernel.cu](https://github.com/open-mmlab/mmcv/tree/2.x/mmcv/ops/csrc/pytorch/cuda/upfirdn2d_kernel.cu) | NVIDIA License | +| fused_leaky_relu | [mmcv/ops/csrc/pytorch/cuda/fused_bias_leakyrelu_cuda.cu](https://github.com/open-mmlab/mmcv/tree/2.x/mmcv/ops/csrc/pytorch/cuda/fused_bias_leakyrelu_cuda.cu) | NVIDIA License | +| bias_act | [mmcv/ops/csrc/pytorch/cuda/bias_act_cuda.cu](https://github.com/open-mmlab/mmcv/tree/2.x/mmcv/ops/csrc/pytorch/cuda/bias_act_cuda.cu) | NVIDIA License | +| filtered_lrelu | [mmcv/ops/csrc/pytorch/cuda/filtered_lrelu.cu](https://github.com/open-mmlab/mmcv/tree/2.x/mmcv/ops/csrc/pytorch/cuda/filtered_lrelu.cu) | NVIDIA License | +| conv2d_gradfix | [mmcv/ops/conv2d_gradfix.py](https://github.com/open-mmlab/mmcv/tree/2.x/mmcv/ops/conv2d_gradfix.py) | NVIDIA License | diff --git a/FoodSeg103/demo/mmcv/MANIFEST.in b/FoodSeg103/demo/mmcv/MANIFEST.in new file mode 100644 index 0000000000000000000000000000000000000000..622635caa1ec01f78d95c684b87658df87c63b38 --- /dev/null +++ b/FoodSeg103/demo/mmcv/MANIFEST.in @@ -0,0 +1,6 @@ +include requirements/runtime.txt +include mmcv/ops/csrc/common/cuda/*.cuh mmcv/ops/csrc/common/cuda/*.hpp mmcv/ops/csrc/common/*.hpp +include mmcv/ops/csrc/pytorch/*.cpp mmcv/ops/csrc/pytorch/cuda/*.cu mmcv/ops/csrc/pytorch/cuda/*.cpp mmcv/ops/csrc/pytorch/cpu/*.cpp +include mmcv/ops/csrc/parrots/*.h mmcv/ops/csrc/parrots/*.cpp +include mmcv/ops/csrc/pytorch/mps/*.mm mmcv/ops/csrc/common/mps/*.h mmcv/ops/csrc/common/mps/*.mm +recursive-include mmcv/ops/csrc/ *.h *.hpp *.cpp *.cuh *.cu *.mm diff --git a/FoodSeg103/demo/mmcv/README.md b/FoodSeg103/demo/mmcv/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f0ca668b1220e5124bb9c8aac63a095e62009a64 --- /dev/null +++ b/FoodSeg103/demo/mmcv/README.md @@ -0,0 +1,187 @@ +
+ +
 
+
+ OpenMMLab website + + + HOT + + +      + OpenMMLab platform + + + TRY IT OUT + + +
+
 
+ +[![platform](https://img.shields.io/badge/platform-Linux%7CWindows%7CmacOS-blue)](https://mmcv.readthedocs.io/en/latest/get_started/installation.html) +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mmcv)](https://pypi.org/project/mmcv/) +[![pytorch](https://img.shields.io/badge/pytorch-1.8~2.0-orange)](https://pytorch.org/get-started/previous-versions/) +[![cuda](https://img.shields.io/badge/cuda-10.1~11.8-green)](https://developer.nvidia.com/cuda-downloads) +[![PyPI](https://img.shields.io/pypi/v/mmcv)](https://pypi.org/project/mmcv) +[![badge](https://github.com/open-mmlab/mmcv/workflows/build/badge.svg)](https://github.com/open-mmlab/mmcv/actions) +[![codecov](https://codecov.io/gh/open-mmlab/mmcv/branch/master/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmcv) +[![license](https://img.shields.io/github/license/open-mmlab/mmcv.svg)](https://github.com/open-mmlab/mmcv/blob/master/LICENSE) + +[📘Documentation](https://mmcv.readthedocs.io/en/latest/) | +[🛠️Installation](https://mmcv.readthedocs.io/en/latest/get_started/installation.html) | +[🤔Reporting Issues](https://github.com/open-mmlab/mmcv/issues/new/choose) + +
+ +
+ +English | [简体中文](README_zh-CN.md) + +
+ +## Highlights + +The OpenMMLab team released a new generation of training engine [MMEngine](https://github.com/open-mmlab/mmengine) at the World Artificial Intelligence Conference on September 1, 2022. It is a foundational library for training deep learning models. Compared with MMCV, it provides a universal and powerful runner, an open architecture with a more unified interface, and a more customizable training process. + +MMCV v2.0.0 official version was released on April 6, 2023. In version 2.x, it removed components related to the training process and added a data transformation module. Also, starting from 2.x, it renamed the package names **mmcv** to **mmcv-lite** and **mmcv-full** to **mmcv**. For details, see [Compatibility Documentation](docs/en/compatibility.md). + +MMCV will maintain both [1.x](https://github.com/open-mmlab/mmcv/tree/1.x) (corresponding to the original [master](https://github.com/open-mmlab/mmcv/tree/master) branch) and **2.x** (corresponding to the **main** branch, now the default branch) versions simultaneously. For details, see [Branch Maintenance Plan](README.md#branch-maintenance-plan). + +## Introduction + +MMCV is a foundational library for computer vision research and it provides the following functionalities: + +- [Image/Video processing](https://mmcv.readthedocs.io/en/latest/understand_mmcv/data_process.html) +- [Image and annotation visualization](https://mmcv.readthedocs.io/en/latest/understand_mmcv/visualization.html) +- [Image transformation](https://mmcv.readthedocs.io/en/latest/understand_mmcv/data_transform.html) +- [Various CNN architectures](https://mmcv.readthedocs.io/en/latest/understand_mmcv/cnn.html) +- [High-quality implementation of common CPU and CUDA ops](https://mmcv.readthedocs.io/en/latest/understand_mmcv/ops.html) + +It supports the following systems: + +- Linux +- Windows +- macOS + +See the [documentation](http://mmcv.readthedocs.io/en/latest) for more features and usage. + +Note: MMCV requires Python 3.7+. + +## Installation + +There are two versions of MMCV: + +- **mmcv**: comprehensive, with full features and various CUDA ops out of the box. It takes longer time to build. +- **mmcv-lite**: lite, without CUDA ops but all other features, similar to mmcv\<1.0.0. It is useful when you do not need those CUDA ops. + +**Note**: Do not install both versions in the same environment, otherwise you may encounter errors like `ModuleNotFound`. You need to uninstall one before installing the other. `Installing the full version is highly recommended if CUDA is available`. + +### Install mmcv + +Before installing mmcv, make sure that PyTorch has been successfully installed following the [PyTorch official installation guide](https://github.com/pytorch/pytorch#installation). For apple silicon users, please use PyTorch 1.13+. + +The command to install mmcv: + +```bash +pip install -U openmim +mim install mmcv +``` + +If you need to specify the version of mmcv, you can use the following command: + +```bash +mim install mmcv==2.0.0 +``` + +If you find that the above installation command does not use a pre-built package ending with `.whl` but a source package ending with `.tar.gz`, you may not have a pre-build package corresponding to the PyTorch or CUDA or mmcv version, in which case you can [build mmcv from source](https://mmcv.readthedocs.io/en/latest/get_started/build.html). + +
+Installation log using pre-built packages + +Looking in links: https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/index.html
+Collecting mmcv
+Downloading https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/mmcv-2.0.0-cp38-cp38-manylinux1_x86_64.whl + +
+ +
+Installation log using source packages + +Looking in links: https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/index.html
+Collecting mmcv==2.0.0
+Downloading mmcv-2.0.0.tar.gz + +
+ +For more installation methods, please refer to the [Installation documentation](https://mmcv.readthedocs.io/en/latest/get_started/installation.html). + +### Install mmcv-lite + +If you need to use PyTorch-related modules, make sure PyTorch has been successfully installed in your environment by referring to the [PyTorch official installation guide](https://github.com/pytorch/pytorch#installation). + +```bash +pip install -U openmim +mim install mmcv-lite +``` + +## FAQ + +If you face some installation issues, CUDA related issues or RuntimeErrors, +you may first refer to this [Frequently Asked Questions](https://mmcv.readthedocs.io/en/latest/faq.html). + +If you face installation problems or runtime issues, you may first refer to this [Frequently Asked Questions](https://mmcv.readthedocs.io/en/latest/faq.html) to see if there is a solution. If the problem is still not solved, feel free to open an [issue](https://github.com/open-mmlab/mmcv/issues). + +## Citation + +If you find this project useful in your research, please consider cite: + +```latex +@misc{mmcv, + title={{MMCV: OpenMMLab} Computer Vision Foundation}, + author={MMCV Contributors}, + howpublished = {\url{https://github.com/open-mmlab/mmcv}}, + year={2018} +} +``` + +## Contributing + +We appreciate all contributions to improve MMCV. Please refer to [CONTRIBUTING.md](CONTRIBUTING.md) for the contributing guideline. + +## License + +MMCV is released under the Apache 2.0 license, while some specific operations in this library are with other licenses. Please refer to [LICENSES.md](LICENSES.md) for the careful check, if you are using our code for commercial matters. + +## Branch Maintenance Plan + +MMCV currently has four branches, namely main, 1.x, master, and 2.x, where 2.x is an alias for the main branch, and master is an alias for the 1.x branch. The 2.x and master branches will be deleted in the future. MMCV's branches go through the following three stages: + +| Phase | Time | Branch | description | +| -------------------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| RC Period | 2022.9.1 - 2023.4.5 | Release candidate code (2.x version) will be released on 2.x branch. Default master branch is still 1.x version | Master and 2.x branches iterate normally | +| Compatibility Period | 2023.4.6 - 2023.12.31 | **The 2.x branch has been renamed to the main branch and set as the default branch**, and 1.x branch will correspond to 1.x version | We still maintain the old version 1.x, respond to user needs, but try not to introduce changes that break compatibility; main branch iterates normally | +| Maintenance Period | From 2024/1/1 | Default main branch corresponds to 2.x version and 1.x branch is 1.x version | 1.x branch is in maintenance phase, no more new feature support; main branch is iterating normally | + +## Projects in OpenMMLab + +- [MMEngine](https://github.com/open-mmlab/mmengine): OpenMMLab foundational library for training deep learning models. +- [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab foundational library for computer vision. +- [MIM](https://github.com/open-mmlab/mim): MIM installs OpenMMLab packages. +- [MMClassification](https://github.com/open-mmlab/mmclassification): OpenMMLab image classification toolbox and benchmark. +- [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab detection toolbox and benchmark. +- [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab's next-generation platform for general 3D object detection. +- [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab rotated object detection toolbox and benchmark. +- [MMYOLO](https://github.com/open-mmlab/mmyolo): OpenMMLab YOLO series toolbox and benchmark. +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation): OpenMMLab semantic segmentation toolbox and benchmark. +- [MMOCR](https://github.com/open-mmlab/mmocr): OpenMMLab text detection, recognition, and understanding toolbox. +- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab pose estimation toolbox and benchmark. +- [MMHuman3D](https://github.com/open-mmlab/mmhuman3d): OpenMMLab 3D human parametric model toolbox and benchmark. +- [MMSelfSup](https://github.com/open-mmlab/mmselfsup): OpenMMLab self-supervised learning toolbox and benchmark. +- [MMRazor](https://github.com/open-mmlab/mmrazor): OpenMMLab model compression toolbox and benchmark. +- [MMFewShot](https://github.com/open-mmlab/mmfewshot): OpenMMLab fewshot learning toolbox and benchmark. +- [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab's next-generation action understanding toolbox and benchmark. +- [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab video perception toolbox and benchmark. +- [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab optical flow toolbox and benchmark. +- [MMEditing](https://github.com/open-mmlab/mmediting): OpenMMLab image and video editing toolbox. +- [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab image and video generative models toolbox. +- [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab model deployment framework. diff --git a/FoodSeg103/demo/mmcv/README_zh-CN.md b/FoodSeg103/demo/mmcv/README_zh-CN.md new file mode 100644 index 0000000000000000000000000000000000000000..e48f33bd7f402858e42c916cdc0186d13ec404f2 --- /dev/null +++ b/FoodSeg103/demo/mmcv/README_zh-CN.md @@ -0,0 +1,210 @@ +
+ +
 
+
+ OpenMMLab 官网 + + + HOT + + +      + OpenMMLab 开放平台 + + + TRY IT OUT + + +
+
 
+ +[![platform](https://img.shields.io/badge/platform-Linux%7CWindows%7CmacOS-blue)](https://mmcv.readthedocs.io/zh_CN/latest/get_started/installation.html) +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mmcv)](https://pypi.org/project/mmcv/) +[![pytorch](https://img.shields.io/badge/pytorch-1.8~2.0-orange)](https://pytorch.org/get-started/previous-versions/) +[![cuda](https://img.shields.io/badge/cuda-10.1~11.8-green)](https://developer.nvidia.com/cuda-downloads) +[![PyPI](https://img.shields.io/pypi/v/mmcv)](https://pypi.org/project/mmcv) +[![badge](https://github.com/open-mmlab/mmcv/workflows/build/badge.svg)](https://github.com/open-mmlab/mmcv/actions) +[![codecov](https://codecov.io/gh/open-mmlab/mmcv/branch/master/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmcv) +[![license](https://img.shields.io/github/license/open-mmlab/mmcv.svg)](https://github.com/open-mmlab/mmcv/blob/master/LICENSE) + +[📘使用文档](https://mmcv.readthedocs.io/zh_CN/latest/) | +[🛠️安装教程](https://mmcv.readthedocs.io/zh_CN/latest/get_started/installation.html) | +[🤔报告问题](https://github.com/open-mmlab/mmcv/issues/new/choose) + +
+ +
+ +[English](README.md) | 简体中文 + +
+ +
+ + + + + + + + + + + + + + + + + +
+ +## Highlights + +OpenMMLab 团队于 2022 年 9 月 1 日在世界人工智能大会发布了新一代训练引擎 [MMEngine](https://github.com/open-mmlab/mmengine),它是一个用于训练深度学习模型的基础库。相比于 MMCV,它提供了更高级且通用的训练器、接口更加统一的开放架构以及可定制化程度更高的训练流程。 + +MMCV v2.0.0 正式版本于 2023 年 4 月 6 日发布。在 2.x 版本中,它删除了和训练流程相关的组件,并新增了数据变换模块。另外,从 2.x 版本开始,重命名包名 **mmcv** 为 **mmcv-lite** 以及 **mmcv-full** 为 **mmcv**。详情见[兼容性文档](docs/zh_cn/compatibility.md)。 + +MMCV 会同时维护 [1.x](https://github.com/open-mmlab/mmcv/tree/1.x) (对应原 [master](https://github.com/open-mmlab/mmcv/tree/master) 分支) 和 **2.x**(对应 **main** 分支,现为默认分支)版本,详情见[分支维护计划](README_zh-CN.md#分支维护计划)。 + +## 简介 + +MMCV 是一个面向计算机视觉的基础库,它提供了以下功能: + +- [图像和视频处理](https://mmcv.readthedocs.io/zh_CN/latest/understand_mmcv/data_process.html) +- [图像和标注结果可视化](https://mmcv.readthedocs.io/zh_CN/latest/understand_mmcv/visualization.html) +- [图像变换](https://mmcv.readthedocs.io/zh_CN/latest/understand_mmcv/data_transform.html) +- [多种 CNN 网络结构](https://mmcv.readthedocs.io/zh_CN/latest/understand_mmcv/cnn.html) +- [高质量实现的常见 CUDA 算子](https://mmcv.readthedocs.io/zh_CN/latest/understand_mmcv/ops.html) + +MMCV 支持多种平台,包括: + +- Linux +- Windows +- macOS + +如想了解更多特性和使用,请参考[文档](http://mmcv.readthedocs.io/zh_CN/latest)。 + +提示: MMCV 需要 Python 3.7 以上版本。 + +## 安装 + +MMCV 有两个版本: + +- **mmcv**: 完整版,包含所有的特性以及丰富的开箱即用的 CUDA 算子。注意完整版本可能需要更长时间来编译。 +- **mmcv-lite**: 精简版,不包含 CUDA 算子但包含其余所有特性和功能,类似 MMCV 1.0 之前的版本。如果你不需要使用 CUDA 算子的话,精简版可以作为一个考虑选项。 + +**注意**: 请不要在同一个环境中安装两个版本,否则可能会遇到类似 `ModuleNotFound` 的错误。在安装一个版本之前,需要先卸载另一个。`如果 CUDA 可用,强烈推荐安装 mmcv`。 + +### 安装 mmcv + +在安装 mmcv 之前,请确保 PyTorch 已经成功安装在环境中,可以参考 [PyTorch 官方安装文档](https://github.com/pytorch/pytorch#installation)。如果你使用的是搭载 apple silicon 的 mac 设备,请安装 PyTorch 1.13+ 的版本。 + +安装 mmcv 的命令如下: + +```bash +pip install -U openmim +mim install mmcv +``` + +如果需要指定 mmcv 的版本,可以使用以下命令 + +```bash +mim install mmcv==2.0.0 +``` + +如果发现上述的安装命令没有使用预编译包(以 `.whl` 结尾)而是使用源码包(以 `.tar.gz` 结尾)安装,则有可能是我们没有提供和当前环境的 PyTorch 版本、CUDA 版本相匹配的 mmcv 预编译包,此时,你可以[源码安装 mmcv](https://mmcv.readthedocs.io/zh_CN/latest/get_started/build.html)。 + +
+使用预编译包的安装日志 + +Looking in links: https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/index.html
+Collecting mmcv
+Downloading https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/mmcv-2.0.0-cp38-cp38-manylinux1_x86_64.whl + +
+ +
+使用源码包的安装日志 + +Looking in links: https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/index.html
+Collecting mmcv==2.0.0
+Downloading mmcv-2.0.0.tar.gz + +
+ +更多安装方式请参考[安装文档](https://mmcv.readthedocs.io/zh_CN/latest/get_started/installation.html)。 + +### 安装 mmcv-lite + +如果你需要使用和 PyTorch 相关的模块,请确保 PyTorch 已经成功安装在环境中,可以参考 [PyTorch 官方安装文档](https://github.com/pytorch/pytorch#installation)。 + +```bash +pip install -U openmim +mim install mmcv-lite +``` + +## FAQ + +如果你遇到了安装问题或者运行时问题,请查看[问题解决页面](https://mmcv.readthedocs.io/zh_CN/latest/faq.html)是否已有解决方案。如果问题仍然没有解决,欢迎提 [issue](https://github.com/open-mmlab/mmcv/issues)。 + +## 贡献指南 + +我们感谢所有的贡献者为改进和提升 MMCV 所作出的努力。请参考[贡献指南](CONTRIBUTING.md)来了解参与项目贡献的相关指引。 + +## 许可证 + +`MMCV` 目前以 Apache 2.0 的许可证发布,但是其中有一部分功能并不是使用的 Apache2.0 许可证,我们在 [许可证](LICENSES.md) 中详细地列出了这些功能以及他们对应的许可证,如果您正在从事盈利性活动,请谨慎参考此文档。 + +## 分支维护计划 + +MMCV 目前有四个分支,分别是 main、1.x、master 和 2.x,其中 2.x 为 main 分支的别名,master 为 1.x 分支的别名,2.x 和 master 这两个分支在将来会被删除。MMCV 的分支经历以下三个阶段: + +| 阶段 | 时间 | 分支 | 说明 | +| ------ | --------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| 公测期 | 2022.9.1 - 2023.4.5 | 公测版代码发布在 2.x 分支;默认主分支 master 仍对应 1.x 版本 | master 和 2.x 分支正常进行迭代 | +| 兼容期 | 2023.4.6 - 2023.12.31 | **2.x 分支重命名为 main 分支并设置为默认分支**;1.x 分支对应 1.x 版本 | 保持对旧版本 1.x 的维护和开发,响应用户需求,但尽量不引进破坏旧版本兼容性的改动;main 分支正常进行迭代 | +| 维护期 | 2024.1.1 - 待定 | 默认主分支 main 为 2.x 版本;1.x 分支对应 1.x 版本 | 1.x 分支进入维护阶段,不再进行新功能支持;main 分支正常进行迭代 | + +## OpenMMLab 的其他项目 + +- [MMEngine](https://github.com/open-mmlab/mmengine): OpenMMLab 深度学习模型训练基础库 +- [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab 计算机视觉基础库 +- [MIM](https://github.com/open-mmlab/mim): MIM 是 OpenMMlab 项目、算法、模型的统一入口 +- [MMClassification](https://github.com/open-mmlab/mmclassification): OpenMMLab 图像分类工具箱 +- [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab 目标检测工具箱 +- [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab 新一代通用 3D 目标检测平台 +- [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab 旋转框检测工具箱与测试基准 +- [MMYOLO](https://github.com/open-mmlab/mmyolo): OpenMMLab YOLO 系列工具箱与测试基准 +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation): OpenMMLab 语义分割工具箱 +- [MMOCR](https://github.com/open-mmlab/mmocr): OpenMMLab 全流程文字检测识别理解工具箱 +- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab 姿态估计工具箱 +- [MMHuman3D](https://github.com/open-mmlab/mmhuman3d): OpenMMLab 人体参数化模型工具箱与测试基准 +- [MMSelfSup](https://github.com/open-mmlab/mmselfsup): OpenMMLab 自监督学习工具箱与测试基准 +- [MMRazor](https://github.com/open-mmlab/mmrazor): OpenMMLab 模型压缩工具箱与测试基准 +- [MMFewShot](https://github.com/open-mmlab/mmfewshot): OpenMMLab 少样本学习工具箱与测试基准 +- [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab 新一代视频理解工具箱 +- [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab 一体化视频目标感知平台 +- [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab 光流估计工具箱与测试基准 +- [MMEditing](https://github.com/open-mmlab/mmediting): OpenMMLab 图像视频编辑工具箱 +- [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab 图片视频生成模型工具箱 +- [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab 模型部署框架 + +## 欢迎加入 OpenMMLab 社区 + +扫描下方的二维码可关注 OpenMMLab 团队的 [知乎官方账号](https://www.zhihu.com/people/openmmlab),加入 OpenMMLab 团队的 [官方交流 QQ 群](https://jq.qq.com/?_wv=1027&k=K0QI8ByU),或添加微信小助手”OpenMMLabwx“加入官方交流微信群。 + +
+ +
+ +我们会在 OpenMMLab 社区为大家 + +- 📢 分享 AI 框架的前沿核心技术 +- 💻 解读 PyTorch 常用模块源码 +- 📰 发布 OpenMMLab 的相关新闻 +- 🚀 介绍 OpenMMLab 开发的前沿算法 +- 🏃 获取更高效的问题答疑和意见反馈 +- 🔥 提供与各行各业开发者充分交流的平台 + +干货满满 📘,等你来撩 💗,OpenMMLab 社区期待您的加入 👬 diff --git a/FoodSeg103/demo/mmcv/TERMINOLOGY.md b/FoodSeg103/demo/mmcv/TERMINOLOGY.md new file mode 100644 index 0000000000000000000000000000000000000000..07411b7774c2ed713f472c1287b98b871c7f4d02 --- /dev/null +++ b/FoodSeg103/demo/mmcv/TERMINOLOGY.md @@ -0,0 +1,30 @@ +# English-Chinese terminology comparison (英汉术语对照) + +This document is used as a reference for English-Chinese terminology translation. + +该文档用作中英文翻译对照参考。 + +| English | 中文 | +| :---------------: | :----------: | +| annotation | 标注 | +| backbone | 主干网络 | +| benchmark | 基准测试 | +| checkpoint | 模型权重文件 | +| classifier | 分类器 | +| cls_head | 分类头 | +| decoder | 解码器 | +| detector | 检测器 | +| encoder | 编码器 | +| finetune | 微调 | +| ground truth | 真实标签 | +| hook | 钩子 | +| localizer | 定位器 | +| neck | 模型颈部 | +| pipeline | 流水线 | +| recognizer | 识别器 | +| register | 注册器 | +| schedule | 调整 | +| scheduler | 调度器 | +| segmentor | 分割器 | +| tensor | 张量 | +| training schedule | 训练策略 | diff --git a/FoodSeg103/demo/mmcv/docker/README.md b/FoodSeg103/demo/mmcv/docker/README.md new file mode 100644 index 0000000000000000000000000000000000000000..60d5c9de5da8faa7e0ae7e0def19a4320a2a7a5e --- /dev/null +++ b/FoodSeg103/demo/mmcv/docker/README.md @@ -0,0 +1,70 @@ +# Docker images + +There are two `Dockerfile` files to build docker images, one to build an image with the mmcv pre-built package and the other with the mmcv development environment. + +```text +. +|-- README.md +|-- dev # build with mmcv development environment +| `-- Dockerfile +`-- release # build with mmcv pre-built package + `-- Dockerfile +``` + +## Build docker images + +### Build with mmcv pre-built package + +Build with local repository + +```bash +git clone https://github.com/open-mmlab/mmcv.git && cd mmcv +docker build -t mmcv -f docker/release/Dockerfile . +``` + +Or build with remote repository + +```bash +docker build -t mmcv https://github.com/open-mmlab/mmcv.git#master:docker/release +``` + +The [Dockerfile](release/Dockerfile) installs latest released version of mmcv by default, but you can specify mmcv versions to install expected versions. + +```bash +docker image build -t mmcv -f docker/release/Dockerfile --build-arg MMCV=2.0.0rc1 . +``` + +If you also want to use other versions of PyTorch and CUDA, you can also pass them when building docker images. + +An example to build an image with PyTorch 1.11 and CUDA 11.3. + +```bash +docker build -t mmcv -f docker/release/Dockerfile \ + --build-arg PYTORCH=1.9.0 \ + --build-arg CUDA=11.1 \ + --build-arg CUDNN=8 \ + --build-arg MMCV=2.0.0rc1 . +``` + +More available versions of PyTorch and CUDA can be found at [dockerhub/pytorch](https://hub.docker.com/r/pytorch/pytorch/tags). + +### Build with mmcv development environment + +If you want to build an docker image with the mmcv development environment, you can use the following command + +```bash +git clone https://github.com/open-mmlab/mmcv.git && cd mmcv +docker build -t mmcv -f docker/dev/Dockerfile --build-arg CUDA_ARCH=7.5 . +``` + +Note that `CUDA_ARCH` is the cumpute capability of your GPU and you can find it at [Compute Capability](https://developer.nvidia.com/cuda-gpus#compute). + +The building process may take 10 minutes or more. + +## Run images + +```bash +docker run --gpus all --shm-size=8g -it mmcv +``` + +See [docker run](https://docs.docker.com/engine/reference/commandline/run/) for more usages. diff --git a/FoodSeg103/demo/mmcv/docker/dev/Dockerfile b/FoodSeg103/demo/mmcv/docker/dev/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..a4d9e23fcfaa6e1af104aaa0e9cbb2a348b3cd34 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docker/dev/Dockerfile @@ -0,0 +1,31 @@ +ARG PYTORCH="1.8.1" +ARG CUDA="10.2" +ARG CUDNN="7" + +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +# To fix GPG key error when running apt-get update +RUN rm /etc/apt/sources.list.d/cuda.list \ + && rm /etc/apt/sources.list.d/nvidia-ml.list \ + && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub \ + && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + +# Install git and system dependencies for opencv-python +RUN apt-get update && apt-get install -y git \ + && apt-get update && apt-get install -y libgl1 libglib2.0-0 + +# Install system dependencies for unit tests +RUN apt-get install -y ffmpeg libturbojpeg \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# build mmcv from source with develop mode +ARG HTTPS_PROXY="" +ENV https_proxy=${HTTPS_PROXY} +ENV FORCE_CUDA="1" +ARG CUDA_ARCH="" +ENV TORCH_CUDA_ARCH_LIST=${CUDA_ARCH} +RUN git clone https://github.com/open-mmlab/mmcv.git /mmcv +WORKDIR /mmcv +RUN git checkout 2.x && git rev-parse --short HEAD +RUN pip install --no-cache-dir -e .[all] -v && pip install pre-commit && pre-commit install diff --git a/FoodSeg103/demo/mmcv/docker/release/Dockerfile b/FoodSeg103/demo/mmcv/docker/release/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..d5e25e9eb70a87ab1c47a629cc6ed9706ade83c6 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docker/release/Dockerfile @@ -0,0 +1,23 @@ +ARG PYTORCH="1.8.1" +ARG CUDA="10.2" +ARG CUDNN="7" + +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +# To fix GPG key error when running apt-get update +RUN rm /etc/apt/sources.list.d/cuda.list \ + && rm /etc/apt/sources.list.d/nvidia-ml.list \ + && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub \ + && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + +# Install system dependencies for opencv-python +RUN apt-get update && apt-get install -y libgl1 libglib2.0-0 \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install mmcv +ARG MMCV="" +RUN if [ "${MMCV}" = "" ]; then pip install -U openmim && mim install 'mmcv>=2.0.0rc1'; else pip install -U openmim && mim install mmcv==${MMCV}; fi + +# Verify the installation +RUN python -c 'import mmcv;print(mmcv.__version__)' diff --git a/FoodSeg103/demo/mmcv/docs/en/Makefile b/FoodSeg103/demo/mmcv/docs/en/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..51285967a7d9722c5bdee4f6a81c154a56aa0846 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +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/FoodSeg103/demo/mmcv/docs/en/_static/community/1.png b/FoodSeg103/demo/mmcv/docs/en/_static/community/1.png new file mode 100644 index 0000000000000000000000000000000000000000..1837fbc8ca1dd46fc169d3c16fd2aef73645af92 Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/community/1.png differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/community/2.png b/FoodSeg103/demo/mmcv/docs/en/_static/community/2.png new file mode 100644 index 0000000000000000000000000000000000000000..76e21def858b2f9392a90999d741cb653e766ae5 Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/community/2.png differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/community/3.png b/FoodSeg103/demo/mmcv/docs/en/_static/community/3.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8ef1315f92933436f4be14eb43669a85e9e098 Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/community/3.png differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/css/readthedocs.css b/FoodSeg103/demo/mmcv/docs/en/_static/css/readthedocs.css new file mode 100644 index 0000000000000000000000000000000000000000..9e3a567d5f78aedb606600bb3111034a1003b362 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/_static/css/readthedocs.css @@ -0,0 +1,10 @@ +.header-logo { + background-image: url("../image/mmcv-logo.png"); + background-size: 85px 40px; + height: 40px; + width: 85px; +} + +table.colwidths-auto td { + width: 50% +} diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/flow_img2toimg1.png b/FoodSeg103/demo/mmcv/docs/en/_static/flow_img2toimg1.png new file mode 100644 index 0000000000000000000000000000000000000000..12df0a17ddd3290f5f05072c2bcd38ae79d9f100 Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/flow_img2toimg1.png differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/flow_raw_images.png b/FoodSeg103/demo/mmcv/docs/en/_static/flow_raw_images.png new file mode 100644 index 0000000000000000000000000000000000000000..fdf3cd98a392d110ef0c2a0c4cd9efe927f5daf7 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/_static/flow_raw_images.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01c88e247d12d8bdbdcdfb7080572e4f6c9191c944381c8349e7232bcf2f1337 +size 1515531 diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/flow_visualization.png b/FoodSeg103/demo/mmcv/docs/en/_static/flow_visualization.png new file mode 100644 index 0000000000000000000000000000000000000000..4b2e026a058f85d31c70d51cabd11c02d7b26c35 Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/flow_visualization.png differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/flow_warp.png b/FoodSeg103/demo/mmcv/docs/en/_static/flow_warp.png new file mode 100644 index 0000000000000000000000000000000000000000..c3764118dde74517a83ad1098e6e4d767341f5cb Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/flow_warp.png differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/flow_warp_diff.png b/FoodSeg103/demo/mmcv/docs/en/_static/flow_warp_diff.png new file mode 100644 index 0000000000000000000000000000000000000000..7989c9636bd852ce7512457c64192e630ea27cb7 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/_static/flow_warp_diff.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa0e1308dca16a1c60e43e451b933221c43b857774523d1584ff6166b35b7603 +size 1379939 diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/image/mmcv-logo.png b/FoodSeg103/demo/mmcv/docs/en/_static/image/mmcv-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc5759f8fe3bc7d191d411c38a9e1d3c1c27a84 Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/image/mmcv-logo.png differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/parallel_progress.gif b/FoodSeg103/demo/mmcv/docs/en/_static/parallel_progress.gif new file mode 100644 index 0000000000000000000000000000000000000000..943603058e4d4c3652fa37875ec146609db1848a Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/parallel_progress.gif differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/parallel_progress.png b/FoodSeg103/demo/mmcv/docs/en/_static/parallel_progress.png new file mode 100644 index 0000000000000000000000000000000000000000..3affeeb3cf59a07db44b0025b8e483f06d144c24 Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/parallel_progress.png differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/progress.gif b/FoodSeg103/demo/mmcv/docs/en/_static/progress.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2a6208a84c31c09c6448e495fbd4ca769ce833e Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/progress.gif differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/progress.png b/FoodSeg103/demo/mmcv/docs/en/_static/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..a4070e0052427373c59967ed07bb9f936ca8df59 Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/_static/progress.png differ diff --git a/FoodSeg103/demo/mmcv/docs/en/_static/version.json b/FoodSeg103/demo/mmcv/docs/en/_static/version.json new file mode 100644 index 0000000000000000000000000000000000000000..522c371ce1b2846f5f488d442450f841926207db --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/_static/version.json @@ -0,0 +1,738 @@ +{ + "Linux": [ + { + "cuda": "11.8", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "11.7", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "11.7", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "11.6", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "11.6", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.5", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.0", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.2", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.2", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.1", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.1", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.1", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "9.2", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "9.2", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "cpu", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "cpu", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + } + ], + "Windows": [ + { + "cuda": "11.8", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "11.7", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "11.7", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "11.6", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "11.6", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.5", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3" + ] + }, + { + "cuda": "10.2", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.1", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.1", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3" + ] + }, + { + "cuda": "10.1", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "cpu", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "cpu", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + } + ], + "macOS": [ + { + "cuda": "cpu", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "mps", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3" + ] + }, + { + "cuda": "cpu", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2" + ] + }, + { + "cuda": "cpu", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2" + ] + } + ] +} diff --git a/FoodSeg103/demo/mmcv/docs/en/_templates/classtemplate.rst b/FoodSeg103/demo/mmcv/docs/en/_templates/classtemplate.rst new file mode 100644 index 0000000000000000000000000000000000000000..4f74842394ec9807fb1ae2d8f05a8a57e9a2e24c --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/_templates/classtemplate.rst @@ -0,0 +1,14 @@ +.. role:: hidden + :class: hidden-section +.. currentmodule:: {{ module }} + + +{{ name | underline}} + +.. autoclass:: {{ name }} + :members: + + +.. + autogenerated from source/_templates/classtemplate.rst + note it does not have :inherited-members: diff --git a/FoodSeg103/demo/mmcv/docs/en/api/arraymisc.rst b/FoodSeg103/demo/mmcv/docs/en/api/arraymisc.rst new file mode 100644 index 0000000000000000000000000000000000000000..28975eb76e94994c50d2fe52b8f34c7ce533e788 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/api/arraymisc.rst @@ -0,0 +1,19 @@ +.. role:: hidden + :class: hidden-section + +mmcv.arraymisc +=================================== + +.. contents:: mmcv.arraymisc + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.arraymisc + +.. autosummary:: + :toctree: generated + :nosignatures: + + quantize + dequantize diff --git a/FoodSeg103/demo/mmcv/docs/en/api/cnn.rst b/FoodSeg103/demo/mmcv/docs/en/api/cnn.rst new file mode 100644 index 0000000000000000000000000000000000000000..022191f179fdbe3b1644abbb96ffdc92e4e37e06 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/api/cnn.rst @@ -0,0 +1,71 @@ +.. role:: hidden + :class: hidden-section + +mmcv.cnn +=================================== + +.. contents:: mmcv.cnn + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.cnn + +Module +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + ContextBlock + Conv2d + Conv3d + ConvAWS2d + ConvModule + ConvTranspose2d + ConvTranspose3d + ConvWS2d + DepthwiseSeparableConvModule + GeneralizedAttention + HSigmoid + HSwish + LayerScale + Linear + MaxPool2d + MaxPool3d + NonLocal1d + NonLocal2d + NonLocal3d + Scale + Swish + Conv2dRFSearchOp + +Build Function +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + build_activation_layer + build_conv_layer + build_norm_layer + build_padding_layer + build_plugin_layer + build_upsample_layer + +Miscellaneous +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + fuse_conv_bn + conv_ws_2d + is_norm + make_res_layer + make_vgg_layer + get_model_complexity_info diff --git a/FoodSeg103/demo/mmcv/docs/en/api/image.rst b/FoodSeg103/demo/mmcv/docs/en/api/image.rst new file mode 100644 index 0000000000000000000000000000000000000000..3b93484952cd0c45b9d103088b0677f93fe5615d --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/api/image.rst @@ -0,0 +1,100 @@ +.. role:: hidden + :class: hidden-section + +mmcv.image +=================================== + +.. contents:: mmcv.image + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.image + +IO +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + imfrombytes + imread + imwrite + use_backend + +Color Space +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + bgr2gray + bgr2hls + bgr2hsv + bgr2rgb + bgr2ycbcr + gray2bgr + gray2rgb + hls2bgr + hsv2bgr + imconvert + rgb2bgr + rgb2gray + rgb2ycbcr + ycbcr2bgr + ycbcr2rgb + +Geometric +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + cutout + imcrop + imflip + impad + impad_to_multiple + imrescale + imresize + imresize_like + imresize_to_multiple + imrotate + imshear + imtranslate + rescale_size + +Photometric +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + adjust_brightness + adjust_color + adjust_contrast + adjust_hue + adjust_lighting + adjust_sharpness + auto_contrast + clahe + imdenormalize + imequalize + iminvert + imnormalize + lut_transform + posterize + solarize + +Miscellaneous +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + tensor2imgs diff --git a/FoodSeg103/demo/mmcv/docs/en/api/ops.rst b/FoodSeg103/demo/mmcv/docs/en/api/ops.rst new file mode 100644 index 0000000000000000000000000000000000000000..b0290457bfa0c08f14d7fe346efccb33f388bdae --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/api/ops.rst @@ -0,0 +1,135 @@ +.. role:: hidden + :class: hidden-section + +mmcv.ops +=================================== + +.. contents:: mmcv.ops + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.ops + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + BorderAlign + CARAFE + CARAFENaive + CARAFEPack + Conv2d + ConvTranspose2d + CornerPool + Correlation + CrissCrossAttention + DeformConv2d + DeformConv2dPack + DeformRoIPool + DeformRoIPoolPack + DynamicScatter + FusedBiasLeakyReLU + GroupAll + Linear + MaskedConv2d + MaxPool2d + ModulatedDeformConv2d + ModulatedDeformConv2dPack + ModulatedDeformRoIPoolPack + MultiScaleDeformableAttention + PSAMask + PointsSampler + PrRoIPool + QueryAndGroup + RiRoIAlignRotated + RoIAlign + RoIAlignRotated + RoIAwarePool3d + RoIPointPool3d + RoIPool + SAConv2d + SigmoidFocalLoss + SimpleRoIAlign + SoftmaxFocalLoss + SparseConv2d + SparseConv3d + SparseConvTensor + SparseConvTranspose2d + SparseConvTranspose3d + SparseInverseConv2d + SparseInverseConv3d + SparseMaxPool2d + SparseMaxPool3d + SparseModule + SparseSequential + SubMConv2d + SubMConv3d + SyncBatchNorm + TINShift + Voxelization + +.. autosummary:: + :toctree: generated + :nosignatures: + + active_rotated_filter + assign_score_withk + ball_query + batched_nms + bbox_overlaps + border_align + box_iou_rotated + boxes_iou3d + boxes_iou_bev + boxes_overlap_bev + carafe + carafe_naive + chamfer_distance + contour_expand + convex_giou + convex_iou + deform_conv2d + deform_roi_pool + diff_iou_rotated_2d + diff_iou_rotated_3d + dynamic_scatter + furthest_point_sample + furthest_point_sample_with_dist + fused_bias_leakyrelu + gather_points + grouping_operation + knn + masked_conv2d + min_area_polygons + modulated_deform_conv2d + nms + nms3d + nms3d_normal + nms_bev + nms_match + nms_normal_bev + nms_rotated + pixel_group + point_sample + points_in_boxes_all + points_in_boxes_cpu + points_in_boxes_part + points_in_polygons + prroi_pool + rel_roi_point_to_rel_img_point + riroi_align_rotated + roi_align + roi_align_rotated + roi_pool + rotated_feature_align + scatter_nd + sigmoid_focal_loss + soft_nms + softmax_focal_loss + three_interpolate + three_nn + tin_shift + upfirdn2d + voxelization diff --git a/FoodSeg103/demo/mmcv/docs/en/api/transforms.rst b/FoodSeg103/demo/mmcv/docs/en/api/transforms.rst new file mode 100644 index 0000000000000000000000000000000000000000..b080133d6b7736398b855174c325169b8af92aae --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/api/transforms.rst @@ -0,0 +1,60 @@ +.. role:: hidden + :class: hidden-section + +mmcv.transforms +=================================== + +.. currentmodule:: mmcv.transforms + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + BaseTransform + TestTimeAug + +Loading +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + LoadAnnotations + LoadImageFromFile + +Processing +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + CenterCrop + MultiScaleFlipAug + Normalize + Pad + RandomChoiceResize + RandomFlip + RandomGrayscale + RandomResize + Resize + ToTensor + ImageToTensor + +Wrapper +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + Compose + KeyMapper + RandomApply + RandomChoice + TransformBroadcaster diff --git a/FoodSeg103/demo/mmcv/docs/en/api/utils.rst b/FoodSeg103/demo/mmcv/docs/en/api/utils.rst new file mode 100644 index 0000000000000000000000000000000000000000..f2ff4c2a3872bc9ae0c2942debac5e5b523bd071 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/api/utils.rst @@ -0,0 +1,23 @@ +.. role:: hidden + :class: hidden-section + +mmcv.utils +=================================== + +.. contents:: mmcv.utils + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.utils + +.. autosummary:: + :toctree: generated + :nosignatures: + + IS_CUDA_AVAILABLE + IS_MLU_AVAILABLE + IS_MPS_AVAILABLE + collect_env + jit + skip_no_elena diff --git a/FoodSeg103/demo/mmcv/docs/en/api/video.rst b/FoodSeg103/demo/mmcv/docs/en/api/video.rst new file mode 100644 index 0000000000000000000000000000000000000000..a6ebca0eb73afcf3f3f11aae8520e2782a310f13 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/api/video.rst @@ -0,0 +1,56 @@ +.. role:: hidden + :class: hidden-section + +mmcv.video +=================================== + +.. contents:: mmcv.video + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.video + +IO +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + VideoReader + Cache + +.. autosummary:: + :toctree: generated + :nosignatures: + + frames2video + +Optical Flow +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + dequantize_flow + flow_from_bytes + flow_warp + flowread + flowwrite + quantize_flow + sparse_flow_from_bytes + +Video Processing +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + concat_video + convert_video + cut_video + resize_video diff --git a/FoodSeg103/demo/mmcv/docs/en/api/visualization.rst b/FoodSeg103/demo/mmcv/docs/en/api/visualization.rst new file mode 100644 index 0000000000000000000000000000000000000000..8f43ef27a441dcd9001a352cf18e97f8e615676d --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/api/visualization.rst @@ -0,0 +1,50 @@ +.. role:: hidden + :class: hidden-section + +mmcv.visualization +=================================== + +.. contents:: mmcv.visualization + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.visualization + +Color +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + Color + +.. autosummary:: + :toctree: generated + :nosignatures: + + color_val + +Image +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + imshow + imshow_bboxes + imshow_det_bboxes + +Optical Flow +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + flow2rgb + flowshow + make_color_wheel diff --git a/FoodSeg103/demo/mmcv/docs/en/community/contributing.md b/FoodSeg103/demo/mmcv/docs/en/community/contributing.md new file mode 100644 index 0000000000000000000000000000000000000000..303fd0d79431d8c317d8306049360732cc06404b --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/community/contributing.md @@ -0,0 +1,267 @@ +## Contributing to OpenMMLab + +Welcome to the MMCV community, we are committed to building a cutting-edge computer vision foundational library and all kinds of contributions are welcomed, including but not limited to + +**Fix bug** + +You can directly post a Pull Request to fix typo in code or documents + +The steps to fix the bug of code implementation are as follows. + +1. If the modification involve significant changes, you should create an issue first and describe the error information and how to trigger the bug. Other developers will discuss with you and propose an proper solution. + +2. Posting a pull request after fixing the bug and adding corresponding unit test. + +**New Feature or Enhancement** + +1. If the modification involve significant changes, you should create an issue to discuss with our developers to propose an proper design. +2. Post a Pull Request after implementing the new feature or enhancement and add corresponding unit test. + +**Document** + +You can directly post a pull request to fix documents. If you want to add a document, you should first create an issue to check if it is reasonable. + +### Pull Request Workflow + +If you're not familiar with Pull Request, don't worry! The following guidance will tell you how to create a Pull Request step by step. If you want to dive into the develop mode of Pull Request, you can refer to the [official documents](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) + +#### 1. Fork and clone + +If you are posting a pull request for the first time, you should fork the OpenMMLab repositories by clicking the **Fork** button in the top right corner of the GitHub page, and the forked repositories will appear under your GitHub profile. + + + +Then, you can clone the repositories to local: + +```shell +git clone git@github.com:{username}/mmcv.git +``` + +After that, you should ddd official repository as the upstream repository + +```bash +git remote add upstream git@github.com:open-mmlab/mmcv +``` + +Check whether remote repository has been added successfully by `git remote -v` + +```bash +origin git@github.com:{username}/mmcv.git (fetch) +origin git@github.com:{username}/mmcv.git (push) +upstream git@github.com:open-mmlab/mmcv (fetch) +upstream git@github.com:open-mmlab/mmcv (push) +``` + +```{note} +Here's a brief introduction to origin and upstream. When we use "git clone", we create an "origin" remote by default, which points to the repository cloned from. As for "upstream", we add it ourselves to point to the target repository. Of course, if you don't like the name "upstream", you could name it as you wish. Usually, we'll push the code to "origin". If the pushed code conflicts with the latest code in official("upstream"), we should pull the latest code from upstream to resolve the conflicts, and then push to "origin" again. The posted Pull Request will be updated automatically. +``` + +#### 2. Configure pre-commit + +You should configure [pre-commit](https://pre-commit.com/#intro) in the local development environment to make sure the code style matches that of OpenMMLab. **Note**: The following code should be executed under the MMCV directory. + +```shell +pip install -U pre-commit +pre-commit install +``` + +Check that pre-commit is configured successfully, and install the hooks defined in `.pre-commit-config.yaml`. + +```shell +pre-commit run --all-files +``` + + + + + +```{note} +Chinese users may fail to download the pre-commit hooks due to the network issue. In this case, you could download these hooks from gitee by setting the .pre-commit-config-zh-cn.yaml + +pre-commit install -c .pre-commit-config-zh-cn.yaml +pre-commit run --all-files -c .pre-commit-config-zh-cn.yaml +``` + +If the installation process is interrupted, you can repeatedly run `pre-commit run ... ` to continue the installation. + +If the code does not conform to the code style specification, pre-commit will raise a warning and fixes some of the errors automatically. + + + +If we want to commit our code bypassing the pre-commit hook, we can use the `--no-verify` option(**only for temporarily commit**. + +```shell +git commit -m "xxx" --no-verify +``` + +#### 3. Create a development branch + +After configuring the pre-commit, we should create a branch based on the main branch to develop the new feature or fix the bug. The proposed branch name is `username/pr_name` + +```shell +git checkout -b yhc/refactor_contributing_doc +``` + +In subsequent development, if the main branch of the local repository is behind the main branch of "upstream", we need to pull the upstream for synchronization, and then execute the above command: + +```shell +git pull upstream main +``` + +#### 4. Commit the code and pass the unit test + +- MMCV introduces mypy to do static type checking to increase the robustness of the code. Therefore, we need to add Type Hints to our code and pass the mypy check. If you are not familiar with Type Hints, you can refer to [this tutorial](https://docs.python.org/3/library/typing.html). + +- The committed code should pass through the unit test + + ```shell + # Pass all unit tests + pytest tests + + # Pass the unit test of runner + pytest tests/test_runner/test_runner.py + ``` + + If the unit test fails for lack of dependencies, you can install the dependencies referring to the [guidance](#unit-test) + +- If the documents are modified/added, we should check the rendering result referring to [guidance](#document-rendering) + +#### 5. Push the code to remote + +We could push the local commits to remote after passing through the check of unit test and pre-commit. You can associate the local branch with remote branch by adding `-u` option. + +```shell +git push -u origin {branch_name} +``` + +This will allow you to use the `git push` command to push code directly next time, without having to specify a branch or the remote repository. + +#### 6. Create a Pull Request + +(1) Create a pull request in GitHub's Pull request interface + + + +(2) Modify the PR description according to the guidelines so that other developers can better understand your changes + + + +Find more details about Pull Request description in [pull request guidelines](#pr-specs). + +**note** + +(a) The Pull Request description should contain the reason for the change, the content of the change, and the impact of the change, and be associated with the relevant Issue (see [documentation](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) + +(b) If it is your first contribution, please sign the CLA + + + +(c) Check whether the Pull Request pass through the CI + + + +MMCV will run unit test for the posted Pull Request on different platforms (Linux, Window, Mac), based on different versions of Python, PyTorch, CUDA to make sure the code is correct. We can see the specific test information by clicking `Details` in the above image so that we can modify the code. + +(3) If the Pull Request passes the CI, then you can wait for the review from other developers. You'll modify the code based on the reviewer's comments, and repeat the steps [4](#4-commit-the-code-and-pass-the-unit-test)-[5](#5-push-the-code-to-remote) until all reviewers approve it. Then, we will merge it ASAP. + + + +#### 7. Resolve conflicts + +If your local branch conflicts with the latest main branch of "upstream", you'll need to resolove them. There are two ways to do this: + +```shell +git fetch --all --prune +git rebase upstream/main +``` + +or + +```shell +git fetch --all --prune +git merge upstream/main +``` + +If you are very good at handling conflicts, then you can use rebase to resolve conflicts, as this will keep your commit logs tidy. If you are not familiar with `rebase`, then you can use `merge` to resolve conflicts. + +### Guidance + +#### Unit test + +If you cannot run the unit test of some modules for lacking of some dependencies, such as [video](https://github.com/open-mmlab/mmcv/tree/main/mmcv/video) module, you can try to install the following dependencies: + +```shell +# Linux +sudo apt-get update -y +sudo apt-get install -y libturbojpeg +sudo apt-get install -y ffmpeg + +# Windows +conda install ffmpeg +``` + +We should also make sure the committed code will not decrease the coverage of unit test, we could run the following command to check the coverage of unit test: + +```shell +python -m coverage run -m pytest /path/to/test_file +python -m coverage html +# check file in htmlcov/index.html +``` + +#### Document rendering + +If the documents are modified/added, we should check the rendering result. We could install the dependencies and run the following command to render the documents and check the results: + +```shell +pip install -r requirements/docs.txt +cd docs/zh_cn/ +# or docs/en +make html +# check file in ./docs/zh_cn/_build/html/index.html +``` + +### Code style + +#### Python + +We adopt [PEP8](https://www.python.org/dev/peps/pep-0008/) as the preferred code style. + +We use the following tools for linting and formatting: + +- [flake8](https://github.com/PyCQA/flake8): A wrapper around some linter tools. +- [isort](https://github.com/timothycrosley/isort): A Python utility to sort imports. +- [yapf](https://github.com/google/yapf): A formatter for Python files. +- [codespell](https://github.com/codespell-project/codespell): A Python utility to fix common misspellings in text files. +- [mdformat](https://github.com/executablebooks/mdformat): Mdformat is an opinionated Markdown formatter that can be used to enforce a consistent style in Markdown files. +- [docformatter](https://github.com/myint/docformatter): A formatter to format docstring. + +Style configurations of yapf and isort can be found in [setup.cfg](./setup.cfg). + +We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`, `markdown files`, +fixes `end-of-files`, `double-quoted-strings`, `python-encoding-pragma`, `mixed-line-ending`, sorts `requirments.txt` automatically on every commit. +The config for a pre-commit hook is stored in [.pre-commit-config](./.pre-commit-config.yaml). + +#### C++ and CUDA + +We follow the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html). + +### PR Specs + +1. Use [pre-commit](https://pre-commit.com) hook to avoid issues of code style + +2. One short-time branch should be matched with only one PR + +3. Accomplish a detailed change in one PR. Avoid large PR + + - Bad: Support Faster R-CNN + - Acceptable: Add a box head to Faster R-CNN + - Good: Add a parameter to box head to support custom conv-layer number + +4. Provide clear and significant commit message + +5. Provide clear and meaningful PR description + + - Task name should be clarified in title. The general format is: \[Prefix\] Short description of the PR (Suffix) + - Prefix: add new feature \[Feature\], fix bug \[Fix\], related to documents \[Docs\], in developing \[WIP\] (which will not be reviewed temporarily) + - Introduce main changes, results and influences on other modules in short description + - Associate related issues and pull requests with a milestone diff --git a/FoodSeg103/demo/mmcv/docs/en/community/pr.md b/FoodSeg103/demo/mmcv/docs/en/community/pr.md new file mode 100644 index 0000000000000000000000000000000000000000..1bdd90f2bc41867e5c17403690f6a35cfe2c07b7 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/community/pr.md @@ -0,0 +1,3 @@ +## Pull Request (PR) + +Content has been migrated to [contributing guidance](contributing.md). diff --git a/FoodSeg103/demo/mmcv/docs/en/compatibility.md b/FoodSeg103/demo/mmcv/docs/en/compatibility.md new file mode 100644 index 0000000000000000000000000000000000000000..09d25e1629944190d92718b6c605fdb2e521296d --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/compatibility.md @@ -0,0 +1,231 @@ +### v2.0.0 + +The OpenMMLab team released a new generation of training engine [MMEngine](https://github.com/open-mmlab/mmengine) at the World Artificial Intelligence Conference on September 1, 2022. It is a foundational library for training deep learning models. Compared with MMCV, it provides a universal and powerful runner, an open architecture with a more unified interface, and a more customizable training process. + +The OpenMMLab team released MMCV v2.0.0 on April 6, 2023. In the 2.x version, it has the following significant changes: + +(1) It removed the following components: + +- `mmcv.fileio` module, removed in PR [#2179](https://github.com/open-mmlab/mmcv/pull/2179). FileIO module from mmengine will be used wherever required. +- `mmcv.runner`, `mmcv.parallel`, `mmcv. engine` and `mmcv.device`, removed in PR [#2216](https://github.com/open-mmlab/mmcv/pull/2216). +- All classes in `mmcv.utils` (eg `Config` and `Registry`) and many functions, removed in PR [#2217](https://github.com/open-mmlab/mmcv/pull/2217). Only a few functions related to mmcv are reserved. +- `mmcv.onnx`, `mmcv.tensorrt` modules and related functions, removed in PR [#2225](https://github.com/open-mmlab/mmcv/pull/2225). +- Removed all root registrars in MMCV and registered classes or functions to the [root registrar](https://github.com/open-mmlab/mmengine/blob/main/mmengine/registry/root.py) in MMEngine. + +(2) It added the [`mmcv.transforms`](https://github.com/open-mmlab/mmcv/tree/main/mmcv/transforms) data transformation module. + +(3) It renamed the package name **mmcv** to **mmcv-lite** and **mmcv-full** to **mmcv** in PR [#2235](https://github.com/open-mmlab/mmcv/pull/2235). Also, change the default value of the environment variable `MMCV_WITH_OPS` from 0 to 1. + + + + + + + + + + + + +
MMCV < 2.0MMCV >= 2.0
+ +```bash +# Contains ops, because the highest version of mmcv-full is less than 2.0.0, so there is no need to add version restrictions +pip install openmim +mim install mmcv-full + +# do not contain ops +pip install openmim +mim install "mmcv < 2.0.0" +``` + + + +```bash +# Contains ops +pip install openmim +mim install mmcv + +# Ops are not included, because the starting version of mmcv-lite is 2.0.0rc1, so there is no need to add version restrictions +pip install openmim +mim install mmcv-lite +``` + +
+ +### v1.3.18 + +Some ops have different implementations on different devices. Lots of macros and type checks are scattered in several files, which makes the code hard to maintain. For example: + +```c++ + if (input.device().is_cuda()) { +#ifdef MMCV_WITH_CUDA + CHECK_CUDA_INPUT(input); + CHECK_CUDA_INPUT(rois); + CHECK_CUDA_INPUT(output); + CHECK_CUDA_INPUT(argmax_y); + CHECK_CUDA_INPUT(argmax_x); + + roi_align_forward_cuda(input, rois, output, argmax_y, argmax_x, + aligned_height, aligned_width, spatial_scale, + sampling_ratio, pool_mode, aligned); +#else + AT_ERROR("RoIAlign is not compiled with GPU support"); +#endif + } else { + CHECK_CPU_INPUT(input); + CHECK_CPU_INPUT(rois); + CHECK_CPU_INPUT(output); + CHECK_CPU_INPUT(argmax_y); + CHECK_CPU_INPUT(argmax_x); + roi_align_forward_cpu(input, rois, output, argmax_y, argmax_x, + aligned_height, aligned_width, spatial_scale, + sampling_ratio, pool_mode, aligned); + } +``` + +Registry and dispatcher are added to manage these implementations. + +```c++ + +void ROIAlignForwardCUDAKernelLauncher(Tensor input, Tensor rois, Tensor output, + Tensor argmax_y, Tensor argmax_x, + int aligned_height, int aligned_width, + float spatial_scale, int sampling_ratio, + int pool_mode, bool aligned); + +void roi_align_forward_cuda(Tensor input, Tensor rois, Tensor output, + Tensor argmax_y, Tensor argmax_x, + int aligned_height, int aligned_width, + float spatial_scale, int sampling_ratio, + int pool_mode, bool aligned) { + ROIAlignForwardCUDAKernelLauncher( + input, rois, output, argmax_y, argmax_x, aligned_height, aligned_width, + spatial_scale, sampling_ratio, pool_mode, aligned); +} + +// register cuda implementation +void roi_align_forward_impl(Tensor input, Tensor rois, Tensor output, + Tensor argmax_y, Tensor argmax_x, + int aligned_height, int aligned_width, + float spatial_scale, int sampling_ratio, + int pool_mode, bool aligned); +REGISTER_DEVICE_IMPL(roi_align_forward_impl, CUDA, roi_align_forward_cuda); + +// roi_align.cpp +// use the dispatcher to invoke different implementation depending on device type of input tensors. +void roi_align_forward_impl(Tensor input, Tensor rois, Tensor output, + Tensor argmax_y, Tensor argmax_x, + int aligned_height, int aligned_width, + float spatial_scale, int sampling_ratio, + int pool_mode, bool aligned) { + DISPATCH_DEVICE_IMPL(roi_align_forward_impl, input, rois, output, argmax_y, + argmax_x, aligned_height, aligned_width, spatial_scale, + sampling_ratio, pool_mode, aligned); +} + +``` + +### v1.3.11 + +In order to flexibly support more backends and hardwares like `NVIDIA GPUs` and `AMD GPUs`, the directory of `mmcv/ops/csrc` is refactored. Note that this refactoring will not affect the usage in API. For related information, please refer to [PR1206](https://github.com/open-mmlab/mmcv/pull/1206). + +The original directory was organized as follows. + +``` +. +├── common_cuda_helper.hpp +├── ops_cuda_kernel.cuh +├── pytorch_cpp_helper.hpp +├── pytorch_cuda_helper.hpp +├── parrots_cpp_helper.hpp +├── parrots_cuda_helper.hpp +├── parrots_cudawarpfunction.cuh +├── onnxruntime +│   ├── onnxruntime_register.h +│   ├── onnxruntime_session_options_config_keys.h +│   ├── ort_mmcv_utils.h +│   ├── ... +│   ├── onnx_ops.h +│   └── cpu +│ ├── onnxruntime_register.cpp +│      ├── ... +│      └── onnx_ops_impl.cpp +├── parrots +│   ├── ... +│   ├── ops.cpp +│   ├── ops_cuda.cu +│   ├── ops_parrots.cpp +│   └── ops_pytorch.h +├── pytorch +│   ├── ... +│   ├── ops.cpp +│   ├── ops_cuda.cu +│   ├── pybind.cpp +└── tensorrt + ├── trt_cuda_helper.cuh + ├── trt_plugin_helper.hpp + ├── trt_plugin.hpp + ├── trt_serialize.hpp + ├── ... + ├── trt_ops.hpp + └── plugins +    ├── trt_cuda_helper.cu +    ├── trt_plugin.cpp +    ├── ... +    ├── trt_ops.cpp +    └── trt_ops_kernel.cu +``` + +After refactored, it is organized as follows. + +``` +. +├── common +│ ├── box_iou_rotated_utils.hpp +│ ├── parrots_cpp_helper.hpp +│ ├── parrots_cuda_helper.hpp +│ ├── pytorch_cpp_helper.hpp +│ ├── pytorch_cuda_helper.hpp +│   └── cuda +│   ├── common_cuda_helper.hpp +│   ├── parrots_cudawarpfunction.cuh +│   ├── ... +│   └── ops_cuda_kernel.cuh +├── onnxruntime +│   ├── onnxruntime_register.h +│   ├── onnxruntime_session_options_config_keys.h +│   ├── ort_mmcv_utils.h +│   ├── ... +│   ├── onnx_ops.h +│   └── cpu +│ ├── onnxruntime_register.cpp +│      ├── ... +│      └── onnx_ops_impl.cpp +├── parrots +│   ├── ... +│   ├── ops.cpp +│   ├── ops_parrots.cpp +│   └── ops_pytorch.h +├── pytorch +│   ├── info.cpp +│   ├── pybind.cpp +│   ├── ... +│   ├── ops.cpp +│   └── cuda +│      ├── ... +│      └── ops_cuda.cu +└── tensorrt + ├── trt_cuda_helper.cuh + ├── trt_plugin_helper.hpp + ├── trt_plugin.hpp + ├── trt_serialize.hpp + ├── ... + ├── trt_ops.hpp + └── plugins +    ├── trt_cuda_helper.cu +    ├── trt_plugin.cpp +    ├── ... +    ├── trt_ops.cpp +    └── trt_ops_kernel.cu +``` diff --git a/FoodSeg103/demo/mmcv/docs/en/conf.py b/FoodSeg103/demo/mmcv/docs/en/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..471bd225adeede01787a236ac0d370d0056b960a --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/conf.py @@ -0,0 +1,215 @@ +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- 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 sys + +import pytorch_sphinx_theme +from sphinx.builders.html import StandaloneHTMLBuilder + +sys.path.insert(0, os.path.abspath('../..')) + +version_file = '../../mmcv/version.py' +with open(version_file) as f: + exec(compile(f.read(), version_file, 'exec')) +__version__ = locals()['__version__'] + +# -- Project information ----------------------------------------------------- + +project = 'mmcv' +copyright = '2018-2022, OpenMMLab' +author = 'MMCV Authors' + +# The short X.Y version +version = __version__ +# The full version, including alpha/beta/rc tags +release = __version__ + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# 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.autosummary', + 'sphinx.ext.intersphinx', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'sphinx_markdown_tables', + 'myst_parser', + 'sphinx_copybutton', +] # yapf: disable + +myst_heading_anchors = 4 + +myst_enable_extensions = ['colon_fence'] + +# Configuration for intersphinx +intersphinx_mapping = { + 'python': ('https://docs.python.org/3', None), + 'numpy': ('https://numpy.org/doc/stable', None), + 'torch': ('https://pytorch.org/docs/stable/', None), + 'mmengine': ('https://mmengine.readthedocs.io/en/latest', None), +} + +autodoc_mock_imports = ['mmcv._ext', 'mmcv.utils.ext_loader', 'torchvision'] + +# 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' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# 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'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# -- 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' +html_theme = 'pytorch_sphinx_theme' +html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +html_theme_options = { + 'menu': [ + { + 'name': 'GitHub', + 'url': 'https://github.com/open-mmlab/mmcv' + }, + ], + # Specify the language of shared menu + 'menu_lang': 'en', +} + +# 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'] +html_css_files = ['css/readthedocs.css'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'mmcvdoc' + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'mmcv.tex', 'mmcv Documentation', 'MMCV Contributors', + 'manual'), +] + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [(master_doc, 'mmcv', 'mmcv Documentation', [author], 1)] + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'mmcv', 'mmcv Documentation', author, 'mmcv', + 'One line description of project.', 'Miscellaneous'), +] + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# set priority when building html +StandaloneHTMLBuilder.supported_image_types = [ + 'image/svg+xml', 'image/gif', 'image/png', 'image/jpeg' +] +# -- Extension configuration ------------------------------------------------- +# Ignore >>> when copying code +copybutton_prompt_text = r'>>> |\.\.\. ' +copybutton_prompt_is_regexp = True diff --git a/FoodSeg103/demo/mmcv/docs/en/deployment/mmcv_ops_definition.md b/FoodSeg103/demo/mmcv/docs/en/deployment/mmcv_ops_definition.md new file mode 100644 index 0000000000000000000000000000000000000000..37097259bdba7ed10fcef03ec227a453bcdc95c4 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/deployment/mmcv_ops_definition.md @@ -0,0 +1,686 @@ +# MMCV Operators + +To make custom operators in MMCV more standard, precise definitions of each operator are listed in this document. + + + +- [MMCV Operators](#mmcv-operators) + - [MMCVBorderAlign](#mmcvborderalign) + - [Description](#description) + - [Parameters](#parameters) + - [Inputs](#inputs) + - [Outputs](#outputs) + - [Type Constraints](#type-constraints) + - [MMCVCARAFE](#mmcvcarafe) + - [Description](#description-1) + - [Parameters](#parameters-1) + - [Inputs](#inputs-1) + - [Outputs](#outputs-1) + - [Type Constraints](#type-constraints-1) + - [MMCVCAWeight](#mmcvcaweight) + - [Description](#description-2) + - [Parameters](#parameters-2) + - [Inputs](#inputs-2) + - [Outputs](#outputs-2) + - [Type Constraints](#type-constraints-2) + - [MMCVCAMap](#mmcvcamap) + - [Description](#description-3) + - [Parameters](#parameters-3) + - [Inputs](#inputs-3) + - [Outputs](#outputs-3) + - [Type Constraints](#type-constraints-3) + - [MMCVCornerPool](#mmcvcornerpool) + - [Description](#description-4) + - [Parameters](#parameters-4) + - [Inputs](#inputs-4) + - [Outputs](#outputs-4) + - [Type Constraints](#type-constraints-4) + - [MMCVDeformConv2d](#mmcvdeformconv2d) + - [Description](#description-5) + - [Parameters](#parameters-5) + - [Inputs](#inputs-5) + - [Outputs](#outputs-5) + - [Type Constraints](#type-constraints-5) + - [MMCVModulatedDeformConv2d](#mmcvmodulateddeformconv2d) + - [Description](#description-6) + - [Parameters](#parameters-6) + - [Inputs](#inputs-6) + - [Outputs](#outputs-6) + - [Type Constraints](#type-constraints-6) + - [MMCVDeformRoIPool](#mmcvdeformroipool) + - [Description](#description-7) + - [Parameters](#parameters-7) + - [Inputs](#inputs-7) + - [Outputs](#outputs-7) + - [Type Constraints](#type-constraints-7) + - [MMCVMaskedConv2d](#mmcvmaskedconv2d) + - [Description](#description-8) + - [Parameters](#parameters-8) + - [Inputs](#inputs-8) + - [Outputs](#outputs-8) + - [Type Constraints](#type-constraints-8) + - [MMCVPSAMask](#mmcvpsamask) + - [Description](#description-9) + - [Parameters](#parameters-9) + - [Inputs](#inputs-9) + - [Outputs](#outputs-9) + - [Type Constraints](#type-constraints-9) + - [NonMaxSuppression](#nonmaxsuppression) + - [Description](#description-10) + - [Parameters](#parameters-10) + - [Inputs](#inputs-10) + - [Outputs](#outputs-10) + - [Type Constraints](#type-constraints-10) + - [MMCVRoIAlign](#mmcvroialign) + - [Description](#description-11) + - [Parameters](#parameters-11) + - [Inputs](#inputs-11) + - [Outputs](#outputs-11) + - [Type Constraints](#type-constraints-11) + - [MMCVRoIAlignRotated](#mmcvroialignrotated) + - [Description](#description-12) + - [Parameters](#parameters-12) + - [Inputs](#inputs-12) + - [Outputs](#outputs-12) + - [Type Constraints](#type-constraints-12) + - [grid_sampler\*](#grid_sampler) + - [Description](#description-13) + - [Parameters](#parameters-13) + - [Inputs](#inputs-13) + - [Outputs](#outputs-13) + - [Type Constraints](#type-constraints-13) + - [cummax\*](#cummax) + - [Description](#description-14) + - [Parameters](#parameters-14) + - [Inputs](#inputs-14) + - [Outputs](#outputs-14) + - [Type Constraints](#type-constraints-14) + - [cummin\*](#cummin) + - [Description](#description-15) + - [Parameters](#parameters-15) + - [Inputs](#inputs-15) + - [Outputs](#outputs-15) + - [Type Constraints](#type-constraints-15) + - [Reminders](#reminders) + + + +## MMCVBorderAlign + +### Description + +Applies `border_align` over the input feature based on predicted bboxes. + +For each border line (e.g. top, left, bottom or right) of each box, +border_align does the following: + +- uniformly samples `pool_size`+1 positions on this line, involving the start and end points. +- the corresponding features on these points are computed by bilinear interpolation. +- max pooling over all the `pool_size`+1 positions are used for computing pooled feature. + +Read [BorderDet: Border Feature for Dense Object Detection](ttps://arxiv.org/abs/2007.11056) for more detailed information. + +### Parameters + +| Type | Parameter | Description | +| ----- | ----------- | ----------------------------------------------------------------------------------- | +| `int` | `pool_size` | number of positions sampled over the boxes' borders(e.g. top, bottom, left, right). | + +### Inputs + +
+
input: T
+
Features with shape [N,4C,H,W]. Channels ranged in [0,C), [C,2C), [2C,3C), [3C,4C) represent the top, left, bottom, right features respectively
+
boxes: T
+
Boxes with shape [N,H*W,4]. Coordinate format (x1,y1,x2,y2).
+
+ +### Outputs + +
+
output: T
+
Pooled features with shape [N,C,H*W,4]. The order is(top,left,bottom,right) for the last dimension.
+
+ +### Type Constraints + +- T:tensor(float32) + +## MMCVCARAFE + +### Description + +CARAFE operator performs feature upsampling. + +Read [CARAFE: Content-Aware ReAssembly of FEatures](https://arxiv.org/abs/1905.02188) for more detailed information. + +### Parameters + +| Type | Parameter | Description | +| ------- | -------------- | --------------------------------------------- | +| `int` | `kernel_size` | reassemble kernel size, should be odd integer | +| `int` | `group_size` | reassemble group size | +| `float` | `scale_factor` | upsample ratio(>=1) | + +### Inputs + +
+
features: T
+
Input features. 4-D tensor of shape (N, C, H, W). N is the batch size.
+
masks: T
+
The input mask
+
+ +### Outputs + +
+
output: T
+
The upsampled features. 4-D tensor of shape (N, C, H * scale_factor, W * scale_factor). N is the batch size.
+
+ +### Type Constraints + +- T:tensor(float32) + +## MMCVCAWeight + +### Description + +Operator for Criss-Cross Attention +Read [CCNet: Criss-Cross Attention for SemanticSegmentation](https://arxiv.org/pdf/1811.11721.pdf) for more detailed information. + +### Parameters + +None + +### Inputs + +
+
t: T
+
The query matrix of shape (N, C', H, W).
+
f: T
+
The key matrix of shape (N, C', H, W).
+
+ +### Outputs + +
+
weight: T
+
The attention map of shape (N, H+W-1, H, W).
+
+ +### Type Constraints + +- T:tensor(float32) + +## MMCVCAMap + +### Description + +Operator for Criss-Cross Attention +Read [CCNet: Criss-Cross Attention for SemanticSegmentation](https://arxiv.org/pdf/1811.11721.pdf) for more detailed information. + +### Parameters + +None + +### Inputs + +
+
weight: T
+
Output from the operator MMCVCAWeight.
+
value: T
+
The value matrix of shape (N, C, H, W).
+
+ +### Outputs + +
+
output: T
+
Output tensor of aggregated contextual information
+
+ +### Type Constraints + +- T:tensor(float32) + +## MMCVCornerPool + +### Description + +Perform CornerPool on `input` features. Read [CornerNet -- Detecting Objects as Paired Keypoints](https://arxiv.org/abs/1808.01244) for more details. + +### Parameters + +| Type | Parameter | Description | +| ----- | --------- | ---------------------------------------------------------------- | +| `int` | `mode` | corner pool mode, (0: `top`, 1: `bottom`, 2: `left`, 3: `right`) | + +### Inputs + +
+
input: T
+
Input features. 4-D tensor of shape (N, C, H, W). N is the batch size.
+
+ +### Outputs + +
+
output: T
+
The pooled features. 4-D tensor of shape (N, C, H, W).
+
+ +### Type Constraints + +- T:tensor(float32) + +## MMCVDeformConv2d + +### Description + +Applies a deformable 2D convolution over an input signal composed of several input planes. + +Read [Deformable Convolutional Networks](https://arxiv.org/pdf/1703.06211.pdf) for detail. + +### Parameters + +| Type | Parameter | Description | +| -------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------- | +| `list of ints` | `stride` | The stride of the convolving kernel, (sH, sW). Defaults to `(1, 1)`. | +| `list of ints` | `padding` | Paddings on both sides of the input, (padH, padW). Defaults to `(0, 0)`. | +| `list of ints` | `dilation` | The spacing between kernel elements (dH, dW). Defaults to `(1, 1)`. | +| `int` | `groups` | Split input into groups. `input_channel` should be divisible by the number of groups. Defaults to `1`. | +| `int` | `deformable_groups` | Groups of deformable offset. Defaults to `1`. | +| `int` | `bias` | Whether to add a learnable bias to the output. `0` stands for `False` and `1` stands for `True`. Defaults to `0`. | +| `int` | `im2col_step` | Groups of deformable offset. Defaults to `32`. | + +### Inputs + +
+
input: T
+
Input feature; 4-D tensor of shape (N, C, inH, inW), where N is the batch size, C is the number of channels, inH and inW are the height and width of the data.
+
offset: T
+
Input offset; 4-D tensor of shape (N, deformable_group* 2* kH* kW, outH, outW), where kH and kW are the height and width of weight, outH and outW is the height and width of offset and output.
+
weight: T
+
Input weight; 4-D tensor of shape (output_channel, input_channel, kH, kW).
+
+ +### Outputs + +
+
output: T
+
Output feature; 4-D tensor of shape (N, output_channel, outH, outW).
+
+ +### Type Constraints + +- T:tensor(float32, Linear) + +## MMCVModulatedDeformConv2d + +### Description + +Perform Modulated Deformable Convolution on input feature, read [Deformable ConvNets v2: More Deformable, Better Results](https://arxiv.org/abs/1811.11168?from=timeline) for detail. + +### Parameters + +| Type | Parameter | Description | +| -------------- | ------------------- | ------------------------------------------------------------------------------------- | +| `list of ints` | `stride` | The stride of the convolving kernel. (sH, sW) | +| `list of ints` | `padding` | Paddings on both sides of the input. (padH, padW) | +| `list of ints` | `dilation` | The spacing between kernel elements. (dH, dW) | +| `int` | `deformable_groups` | Groups of deformable offset. | +| `int` | `groups` | Split input into groups. `input_channel` should be divisible by the number of groups. | + +### Inputs + +
+
feature: T
+
Input feature; 4-D tensor of shape (N, C, inH, inW), where N is the batch size, C is the number of channels, inH and inW are the height and width of the data.
+
offset: T
+
Input offset; 4-D tensor of shape (N, deformable_group* 2* kH* kW, outH, outW), where kH and kW are the height and width of weight, outH and outW are the height and width of offset and output.
+
mask: T
+
Input mask; 4-D tensor of shape (N, deformable_group* kH* kW, outH, outW), where kH and kW are the height and width of weight, outH and outW are the height and width of offset and output.
+
weight]: T
+
Input weight; 4-D tensor of shape (output_channel, input_channel, kH, kW).
+
bias: T, optional
+
Input bias; 1-D tensor of shape (output_channel).
+
+ +### Outputs + +
+
output: T
+
Output feature; 4-D tensor of shape (N, output_channel, outH, outW).
+
+ +### Type Constraints + +- T:tensor(float32, Linear) + +## MMCVDeformRoIPool + +### Description + +Deformable roi pooling layer + +### Parameters + +| Type | Parameter | Description | +| ------- | ---------------- | ------------------------------------------------------------------------------------------------------------- | +| `int` | `output_height` | height of output roi | +| `int` | `output_width` | width of output roi | +| `float` | `spatial_scale` | used to scale the input boxes | +| `int` | `sampling_ratio` | number of input samples to take for each output sample. `0` means to take samples densely for current models. | +| `float` | `gamma` | gamma | + +### Inputs + +
+
input: T
+
Input feature map; 4D tensor of shape (N, C, H, W), where N is the batch size, C is the numbers of channels, H and W are the height and width of the data.
+
rois: T
+
RoIs (Regions of Interest) to pool over; 2-D tensor of shape (num_rois, 5) given as [[batch_index, x1, y1, x2, y2], ...]. The RoIs' coordinates are the coordinate system of input.
+
offset: T
+
offset of height and width. Defaults to a tensor of zero
+
+ +### Outputs + +
+
feat: T
+
RoI pooled output, 4-D tensor of shape (num_rois, C, output_height, output_width). The r-th batch element feat[r-1] is a pooled feature map corresponding to the r-th RoI RoIs[r-1].
+
+ +### Type Constraints + +- T:tensor(float32) + +## MMCVMaskedConv2d + +### Description + +Performs a masked 2D convolution from PixelRNN +Read [Pixel Recurrent Neural Networks](https://arxiv.org/abs/1601.06759) for more detailed information. + +### Parameters + +| Type | Parameter | Description | +| -------------- | --------- | -------------------------------------------------------------------------------- | +| `list of ints` | `stride` | The stride of the convolving kernel. (sH, sW). **Only support stride=1 in mmcv** | +| `list of ints` | `padding` | Paddings on both sides of the input. (padH, padW). Defaults to `(0, 0)`. | + +### Inputs + +
+
features: T
+
Input features; 4D tensor of shape (N, C, H, W), where N is the batch size, C is the numbers of channels, H and W are the height and width of the data.
+
mask: T
+
Input mask; 3D tensor of shape (N, H, W)
+
weight: T
+
The learnable weights of the module
+
bias: T
+
The learnable bias of the module
+
+ +### Outputs + +
+
output: T
+
The output convolved feature
+
+ +### Type Constraints + +- T:tensor(float32) + +## MMCVPSAMask + +### Description + +An operator from PSANet. + +Read [PSANet: Point-wise Spatial Attention Network for Scene Parsing](https://hszhao.github.io/papers/eccv18_psanet.pdf) for more detailed information. + +### Parameters + +| Type | Parameter | Description | +| -------------- | ----------- | -------------------------------------------- | +| `int` | `psa_type` | `0` means collect and `1` means `distribute` | +| `list of ints` | `mask_size` | The size of mask | + +### Inputs + +
+
input: T
+
Input feature; 4D tensor of shape (N, C, H, W), where N is the batch size, C is the numbers of channels, H and W are the height and width of the data.
+
+ +### Outputs + +
+
output: T
+
Output tensor of shape (N, H * W, H, W)
+
+ +### Type Constraints + +- T:tensor(float32) + +## NonMaxSuppression + +### Description + +Filter out boxes has high IoU overlap with previously selected boxes or low score. Output the indices of valid boxes. + +Note this definition is slightly different with [onnx: NonMaxSuppression](https://github.com/onnx/onnx/blob/main/docs/Operators.md#nonmaxsuppression) + +### Parameters + +| Type | Parameter | Description | +| ------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `int` | `center_point_box` | 0 - the box data is supplied as \[y1, x1, y2, x2\], 1-the box data is supplied as \[x_center, y_center, width, height\]. | +| `int` | `max_output_boxes_per_class` | The maximum number of boxes to be selected per batch per class. Default to 0, number of output boxes equal to number of input boxes. | +| `float` | `iou_threshold` | The threshold for deciding whether boxes overlap too much with respect to IoU. Value range \[0, 1\]. Default to 0. | +| `float` | `score_threshold` | The threshold for deciding when to remove boxes based on score. | +| `int` | `offset` | 0 or 1, boxes' width or height is (x2 - x1 + offset). | + +### Inputs + +
+
boxes: T
+
Input boxes. 3-D tensor of shape (num_batches, spatial_dimension, 4).
+
scores: T
+
Input scores. 3-D tensor of shape (num_batches, num_classes, spatial_dimension).
+
+ +### Outputs + +
+
indices: tensor(int32, Linear)
+
Selected indices. 2-D tensor of shape (num_selected_indices, 3) as [[batch_index, class_index, box_index], ...].
+
num_selected_indices=num_batches* num_classes* min(max_output_boxes_per_class, spatial_dimension).
+
All invalid indices will be filled with -1.
+
+ +### Type Constraints + +- T:tensor(float32, Linear) + +## MMCVRoIAlign + +### Description + +Perform RoIAlign on output feature, used in bbox_head of most two-stage detectors. + +### Parameters + +| Type | Parameter | Description | +| ------- | ---------------- | ------------------------------------------------------------------------------------------------------------- | +| `int` | `output_height` | height of output roi | +| `int` | `output_width` | width of output roi | +| `float` | `spatial_scale` | used to scale the input boxes | +| `int` | `sampling_ratio` | number of input samples to take for each output sample. `0` means to take samples densely for current models. | +| `str` | `mode` | pooling mode in each bin. `avg` or `max` | +| `int` | `aligned` | If `aligned=0`, use the legacy implementation in MMDetection. Else, align the results more perfectly. | + +### Inputs + +
+
input: T
+
Input feature map; 4D tensor of shape (N, C, H, W), where N is the batch size, C is the numbers of channels, H and W are the height and width of the data.
+
rois: T
+
RoIs (Regions of Interest) to pool over; 2-D tensor of shape (num_rois, 5) given as [[batch_index, x1, y1, x2, y2], ...]. The RoIs' coordinates are the coordinate system of input.
+
+ +### Outputs + +
+
feat: T
+
RoI pooled output, 4-D tensor of shape (num_rois, C, output_height, output_width). The r-th batch element feat[r-1] is a pooled feature map corresponding to the r-th RoI RoIs[r-1].
+
+ +### Type Constraints + +- T:tensor(float32) + +## MMCVRoIAlignRotated + +### Description + +Perform RoI align pooling for rotated proposals + +### Parameters + +| Type | Parameter | Description | +| ------- | ---------------- | ------------------------------------------------------------------------------------------------------------- | +| `int` | `output_height` | height of output roi | +| `int` | `output_width` | width of output roi | +| `float` | `spatial_scale` | used to scale the input boxes | +| `int` | `sampling_ratio` | number of input samples to take for each output sample. `0` means to take samples densely for current models. | +| `str` | `mode` | pooling mode in each bin. `avg` or `max` | +| `int` | `aligned` | If `aligned=0`, use the legacy implementation in MMDetection. Else, align the results more perfectly. | +| `int` | `clockwise` | If `aligned=0`, use the legacy implementation in MMDetection. Else, align the results more perfectly. | + +### Inputs + +
+
features: T
+
Input feature map; 4D tensor of shape (N, C, H, W)
+
rois: T
+
RoIs (Regions of Interest) to pool over; 2-D tensor of shape (num_rois, 5) given as [[batch_index, x1, y1, x2, y2], ...]. The RoIs' coordinates are the coordinate system of input.
+
+ +### Outputs + +
+
RoI pooled output, 4-D tensor of shape (num_rois, C, output_height, output_width). The r-th batch element feat[r-1] is a pooled feature map corresponding to the r-th RoI RoIs[r-1].
+
+ +### Type Constraints + +- T:tensor(float32) + +## grid_sampler\* + +### Description + +Perform sample from `input` with pixel locations from `grid`. + +Check [torch.nn.functional.grid_sample](https://pytorch.org/docs/stable/generated/torch.nn.functional.grid_sample.html?highlight=grid_sample#torch.nn.functional.grid_sample) for more information. + +### Parameters + +| Type | Parameter | Description | +| ----- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `int` | `interpolation_mode` | Interpolation mode to calculate output values. (0: `bilinear` , 1: `nearest`) | +| `int` | `padding_mode` | Padding mode for outside grid values. (0: `zeros`, 1: `border`, 2: `reflection`) | +| `int` | `align_corners` | If `align_corners=1`, the extrema (`-1` and `1`) are considered as referring to the center points of the input's corner pixels. If `align_corners=0`, they are instead considered as referring to the corner points of the input's corner pixels, making the sampling more resolution agnostic. | + +### Inputs + +
+
input: T
+
Input feature; 4-D tensor of shape (N, C, inH, inW), where N is the batch size, C is the numbers of channels, inH and inW are the height and width of the data.
+
grid: T
+
Input offset; 4-D tensor of shape (N, outH, outW, 2), where outH and outW are the height and width of offset and output.
+
+ +### Outputs + +
+
output: T
+
Output feature; 4-D tensor of shape (N, C, outH, outW).
+
+ +### Type Constraints + +- T:tensor(float32, Linear) + +## cummax\* + +### Description + +Returns a tuple (`values`, `indices`) where `values` is the cumulative maximum elements of `input` in the dimension `dim`. And `indices` is the index location of each maximum value found in the dimension `dim`. Read [torch.cummax](https://pytorch.org/docs/stable/generated/torch.cummax.html) for more details. + +### Parameters + +| Type | Parameter | Description | +| ----- | --------- | -------------------------------------- | +| `int` | `dim` | the dimension to do the operation over | + +### Inputs + +
+
input: T
+
The input tensor with various shapes. Tensor with empty element is also supported.
+
+ +### Outputs + +
+
output: T
+
Output the cumulative maximum elements of `input` in the dimension `dim`, with the same shape and dtype as `input`.
+
indices: tensor(int64)
+
Output the index location of each cumulative maximum value found in the dimension `dim`, with the same shape as `input`.
+
+ +### Type Constraints + +- T:tensor(float32) + +## cummin\* + +### Description + +Returns a tuple (`values`, `indices`) where `values` is the cumulative minimum elements of `input` in the dimension `dim`. And `indices` is the index location of each minimum value found in the dimension `dim`. Read [torch.cummin](https://pytorch.org/docs/stable/generated/torch.cummin.html) for more details. + +### Parameters + +| Type | Parameter | Description | +| ----- | --------- | -------------------------------------- | +| `int` | `dim` | the dimension to do the operation over | + +### Inputs + +
+
input: T
+
The input tensor with various shapes. Tensor with empty element is also supported.
+
+ +### Outputs + +
+
output: T
+
Output the cumulative minimum elements of `input` in the dimension `dim`, with the same shape and dtype as `input`.
+
indices: tensor(int64)
+
Output the index location of each cumulative minimum value found in the dimension `dim`, with the same shape as `input`.
+
+ +### Type Constraints + +- T:tensor(float32) + +## Reminders + +- Operators endwith `*` are defined in Torch and are included here for the conversion to ONNX. diff --git a/FoodSeg103/demo/mmcv/docs/en/docutils.conf b/FoodSeg103/demo/mmcv/docs/en/docutils.conf new file mode 100644 index 0000000000000000000000000000000000000000..0c00c84688701117f231fd0c8ec295fb747b7d8f --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/docutils.conf @@ -0,0 +1,2 @@ +[html writers] +table_style: colwidths-auto diff --git a/FoodSeg103/demo/mmcv/docs/en/faq.md b/FoodSeg103/demo/mmcv/docs/en/faq.md new file mode 100644 index 0000000000000000000000000000000000000000..02d31c233a9ff66d5e8f3f288b5d5f64e5c5298c --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/faq.md @@ -0,0 +1,93 @@ +## Frequently Asked Questions + +We list some common troubles faced by many users and their corresponding solutions here. +Feel free to enrich the list if you find any frequent issues and have ways to help others to solve them. + +### Installation + +- KeyError: "xxx: 'yyy is not in the zzz registry'" + + The registry mechanism will be triggered only when the file of the module is imported. + So you need to import that file somewhere. More details can be found at [KeyError: "MaskRCNN: 'RefineRoIHead is not in the models registry'"](https://github.com/open-mmlab/mmdetection/issues/5974). + +- "No module named 'mmcv.ops'"; "No module named 'mmcv.\_ext'" + + 1. Uninstall existing mmcv in the environment using `pip uninstall mmcv` + 2. Install mmcv-full following the [installation instruction](https://mmcv.readthedocs.io/en/latest/get_started/installation.html) or [Build MMCV from source](https://mmcv.readthedocs.io/en/latest/get_started/build.html) + +- "invalid device function" or "no kernel image is available for execution" + + 1. Check the CUDA compute capability of you GPU + 2. Run `python mmdet/utils/collect_env.py` to check whether PyTorch, torchvision, and MMCV are built for the correct GPU architecture. You may need to set `TORCH_CUDA_ARCH_LIST` to reinstall MMCV. The compatibility issue could happen when using old GPUS, e.g., Tesla K80 (3.7) on colab. + 3. Check whether the running environment is the same as that when mmcv/mmdet is compiled. For example, you may compile mmcv using CUDA 10.0 bug run it on CUDA9.0 environments + +- "undefined symbol" or "cannot open xxx.so" + + 1. If those symbols are CUDA/C++ symbols (e.g., libcudart.so or GLIBCXX), check + whether the CUDA/GCC runtimes are the same as those used for compiling mmcv + 2. If those symbols are Pytorch symbols (e.g., symbols containing caffe, aten, and TH), check whether the Pytorch version is the same as that used for compiling mmcv + 3. Run `python mmdet/utils/collect_env.py` to check whether PyTorch, torchvision, and MMCV are built by and running on the same environment + +- "RuntimeError: CUDA error: invalid configuration argument" + + This error may be caused by the poor performance of GPU. Try to decrease the value of [THREADS_PER_BLOCK](https://github.com/open-mmlab/mmcv/blob/cac22f8cf5a904477e3b5461b1cc36856c2793da/mmcv/ops/csrc/common_cuda_helper.hpp#L10) + and recompile mmcv. + +- "RuntimeError: nms is not compiled with GPU support" + + This error is because your CUDA environment is not installed correctly. + You may try to re-install your CUDA environment and then delete the build/ folder before re-compile mmcv. + +- "Segmentation fault" + + 1. Check your GCC version and use GCC >= 5.4. This usually caused by the incompatibility between PyTorch and the environment (e.g., GCC \< 4.9 for PyTorch). We also recommend the users to avoid using GCC 5.5 because many feedbacks report that GCC 5.5 will cause "segmentation fault" and simply changing it to GCC 5.4 could solve the problem + 2. Check whether PyTorch is correctly installed and could use CUDA op, e.g. type the following command in your terminal and see whether they could correctly output results + ```shell + python -c 'import torch; print(torch.cuda.is_available())' + ``` + 3. If PyTorch is correctly installed, check whether MMCV is correctly installed. If MMCV is correctly installed, then there will be no issue of the command + ```shell + python -c 'import mmcv; import mmcv.ops' + ``` + 4. If MMCV and PyTorch are correctly installed, you can use `ipdb` to set breakpoints or directly add `print` to debug and see which part leads the `segmentation fault` + +- "libtorch_cuda_cu.so: cannot open shared object file" + + `mmcv-full` depends on the share object but it can not be found. We can check whether the object exists in `~/miniconda3/envs/{environment-name}/lib/python3.7/site-packages/torch/lib` or try to re-install the PyTorch. + +- "fatal error C1189: #error: -- unsupported Microsoft Visual Studio version!" + + If you are building mmcv-full on Windows and the version of CUDA is 9.2, you will probably encounter the error `"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include\crt/host_config.h(133): fatal error C1189: #error: -- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!"`, in which case you can use a lower version of Microsoft Visual Studio like vs2017. + +- "error: member "torch::jit::detail::ModulePolicy::all_slots" may not be initialized" + + If your version of PyTorch is 1.5.0 and you are building mmcv-full on Windows, you will probably encounter the error `- torch/csrc/jit/api/module.h(474): error: member "torch::jit::detail::ModulePolicy::all_slots" may not be initialized`. The way to solve the error is to replace all the `static constexpr bool all_slots = false;` with `static bool all_slots = false;` at this file `https://github.com/pytorch/pytorch/blob/v1.5.0/torch/csrc/jit/api/module.h`. More details can be found at [member "torch::jit::detail::AttributePolicy::all_slots" may not be initialized](https://github.com/pytorch/pytorch/issues/39394). + +- "error: a member with an in-class initializer must be const" + + If your version of PyTorch is 1.6.0 and you are building mmcv-full on Windows, you will probably encounter the error `"- torch/include\torch/csrc/jit/api/module.h(483): error: a member with an in-class initializer must be const"`. The way to solve the error is to replace all the `CONSTEXPR_EXCEPT_WIN_CUDA ` with `const` at `torch/include\torch/csrc/jit/api/module.h`. More details can be found at [Ninja: build stopped: subcommand failed](https://github.com/open-mmlab/mmcv/issues/575). + +- "error: member "torch::jit::ProfileOptionalOp::Kind" may not be initialized" + + If your version of PyTorch is 1.7.0 and you are building mmcv-full on Windows, you will probably encounter the error `torch/include\torch/csrc/jit/ir/ir.h(1347): error: member "torch::jit::ProfileOptionalOp::Kind" may not be initialized`. The way to solve the error needs to modify several local files of PyTorch: + + - delete `static constexpr Symbol Kind = ::c10::prim::profile;` and `tatic constexpr Symbol Kind = ::c10::prim::profile_optional;` at `torch/include\torch/csrc/jit/ir/ir.h` + - replace `explicit operator type&() { return *(this->value); }` with `explicit operator type&() { return *((type*)this->value); }` at `torch\include\pybind11\cast.h` + - replace all the `CONSTEXPR_EXCEPT_WIN_CUDA` with `const` at `torch/include\torch/csrc/jit/api/module.h` + + More details can be found at [Ensure default extra_compile_args](https://github.com/pytorch/pytorch/pull/45956). + +- Compatibility issue between MMCV and MMDetection; "ConvWS is already registered in conv layer" + + Please install the correct version of MMCV for the version of your MMDetection following the [installation instruction](https://mmdetection.readthedocs.io/en/latest/get_started.html#installation). + +### Usage + +- "RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one" + + 1. This error indicates that your module has parameters that were not used in producing loss. This phenomenon may be caused by running different branches in your code in DDP mode. More datails at [Expected to have finished reduction in the prior iteration before starting a new one](https://github.com/pytorch/pytorch/issues/55582). + 2. You can set ` find_unused_parameters = True` in the config to solve the above problems or find those unused parameters manually + +- "RuntimeError: Trying to backward through the graph a second time" + + `GradientCumulativeOptimizerHook` and `OptimizerHook` are both set which causes the `loss.backward()` to be called twice so `RuntimeError` was raised. We can only use one of these. More datails at [Trying to backward through the graph a second time](https://github.com/open-mmlab/mmcv/issues/1379). diff --git a/FoodSeg103/demo/mmcv/docs/en/get_started/build.md b/FoodSeg103/demo/mmcv/docs/en/get_started/build.md new file mode 100644 index 0000000000000000000000000000000000000000..742e60c35650da5b9ce5ff4e37e9b0cf4d4bf18b --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/get_started/build.md @@ -0,0 +1,349 @@ +## Build MMCV from source + +### Build mmcv + +Before installing mmcv, make sure that PyTorch has been successfully installed following the [PyTorch official installation guide](https://pytorch.org/get-started/locally/#start-locally). This can be verified using the following command + +```bash +python -c 'import torch;print(torch.__version__)' +``` + +If version information is output, then PyTorch is installed. + +```{note} +If you would like to use `opencv-python-headless` instead of `opencv-python`, +e.g., in a minimum container environment or servers without GUI, +you can first install it before installing MMCV to skip the installation of `opencv-python`. +``` + +#### Build on Linux + +1. Clone the repo + + ```bash + git clone https://github.com/open-mmlab/mmcv.git + cd mmcv + ``` + +2. Install `ninja` and `psutil` to speed up the compilation + + ```bash + pip install -r requirements/optional.txt + ``` + +3. Check the nvcc version (requires 9.2+. Skip if no GPU available.) + + ```bash + nvcc --version + ``` + + If the above command outputs the following message, it means that the nvcc setting is OK, otherwise you need to set CUDA_HOME. + + ``` + nvcc: NVIDIA (R) Cuda compiler driver + Copyright (c) 2005-2020 NVIDIA Corporation + Built on Mon_Nov_30_19:08:53_PST_2020 + Cuda compilation tools, release 11.2, V11.2.67 + Build cuda_11.2.r11.2/compiler.29373293_0 + ``` + + :::{note} + If you want to support ROCm, you can refer to [AMD ROCm](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation-Guide.html) to install ROCm. + ::: + +4. Check the gcc version (requires 5.4+) + + ```bash + gcc --version + ``` + +5. Start building (takes 10+ min) + + ```bash + pip install -e . -v + ``` + +6. Validate the installation + + ```bash + python .dev_scripts/check_installation.py + ``` + + If no error is reported by the above command, the installation is successful. If there is an error reported, please check [Frequently Asked Questions](../faq.md) to see if there is already a solution. + + If no solution is found, please feel free to open an [issue](https://github.com/open-mmlab/mmcv/issues). + +#### Build on macOS + +```{note} +If you are using a mac with apple silicon chip, install the PyTorch 1.13+, otherwise you will encounter the problem in [issues#2218](https://github.com/open-mmlab/mmcv/issues/2218). +``` + +1. Clone the repo + + ```bash + git clone https://github.com/open-mmlab/mmcv.git + cd mmcv + ``` + +2. Install `ninja` and `psutil` to speed up the compilation + + ```bash + pip install -r requirements/optional.txt + ``` + +3. Start building + + ```bash + MMCV_WITH_OPS=1 pip install -e . + ``` + +4. Validate the installation + + ```bash + python .dev_scripts/check_installation.py + ``` + + If no error is reported by the above command, the installation is successful. If there is an error reported, please check [Frequently Asked Questions](../faq.md) to see if there is already a solution. + + If no solution is found, please feel free to open an [issue](https://github.com/open-mmlab/mmcv/issues). + +#### Build on Windows + +Building MMCV on Windows is a bit more complicated than that on Linux. +The following instructions show how to get this accomplished. + +##### Prerequisite + +The following software is required for building MMCV on windows. +Install them first. + +- [Git](https://git-scm.com/download/win) + - During installation, tick **add git to Path**. +- [Visual Studio Community 2019](https://visualstudio.microsoft.com) + - A compiler for C++ and CUDA codes. +- [Miniconda](https://docs.conda.io/en/latest/miniconda.html) + - Official distributions of Python should work too. +- [CUDA 10.2](https://developer.nvidia.com/cuda-10.2-download-archive) + - Not required for building CPU version. + - Customize the installation if necessary. As a recommendation, skip the driver installation if a newer version is already installed. + +```{note} +You should know how to set up environment variables, especially `Path`, on Windows. The following instruction relies heavily on this skill. +``` + +##### Common steps + +1. Launch Anaconda prompt from Windows Start menu + + Do not use raw `cmd.exe` s instruction is based on PowerShell syntax. + +2. Create a new conda environment + + ```powershell + (base) PS C:\Users\xxx> conda create --name mmcv python=3.7 + (base) PS C:\Users\xxx> conda activate mmcv # make sure to activate environment before any operation + ``` + +3. Install PyTorch. Choose a version based on your need. + + ```powershell + # CUDA version + (mmcv) PS C:\Users\xxx> conda install pytorch torchvision cudatoolkit=10.2 -c pytorch + # CPU version + (mmcv) PS C:\Users\xxx> conda install install pytorch torchvision cpuonly -c pytorch + ``` + +4. Clone the repo + + ```powershell + (mmcv) PS C:\Users\xxx> git clone https://github.com/open-mmlab/mmcv.git + (mmcv) PS C:\Users\xxx\mmcv> cd mmcv + ``` + +5. Install `ninja` and `psutil` to speed up the compilation + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> pip install -r requirements/optional.txt + ``` + +6. Set up MSVC compiler + + Set Environment variable, add `C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\Hostx86\x64` to `PATH`, so that `cl.exe` will be available in prompt, as shown below. + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> cl + Microsoft (R) C/C++ Optimizing Compiler Version 19.27.29111 for x64 + Copyright (C) Microsoft Corporation. All rights reserved. + + usage: cl [ option... ] filename... [ / link linkoption... ] + ``` + + For compatibility, we use the x86-hosted and x64-targeted compiler. note `Hostx86\x64` in the path. + + You may want to change the system language to English because pytorch will parse text output from `cl.exe` to check its version. However only utf-8 is recognized. Navigate to Control Panel -> Region -> Administrative -> Language for Non-Unicode programs and change it to English. + +##### Build and install MMCV + +mmcv can be built in two ways: + +1. Full version (CPU ops) + + Module `ops` will be compiled as a pytorch extension, but only x86 code will be compiled. The compiled ops can be executed on CPU only. + +2. Full version (CUDA ops) + + Both x86 and CUDA codes of `ops` module will be compiled. The compiled version can be run on both CPU and CUDA-enabled GPU (if implemented). + +###### CPU version + +Build and install + +```powershell +(mmcv) PS C:\Users\xxx\mmcv> python setup.py build_ext +(mmcv) PS C:\Users\xxx\mmcv> python setup.py develop +``` + +###### GPU version + +1. Make sure `CUDA_PATH` or `CUDA_HOME` is already set in `envs` via `ls env:`, desired output is shown as below: + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> ls env: + + Name Value + ---- ----- + CUDA_PATH C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2 + CUDA_PATH_V10_1 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1 + CUDA_PATH_V10_2 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2 + ``` + + This should already be done by CUDA installer. If not, or you have multiple version of CUDA toolkit installed, set it with + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> $env:CUDA_HOME = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2" + # OR + (mmcv) PS C:\Users\xxx\mmcv> $env:CUDA_HOME = $env:CUDA_PATH_V10_2 # if CUDA_PATH_V10_2 is in envs: + ``` + +2. Set CUDA target arch + + ```shell + # Here you need to change to the target architecture corresponding to your GPU + (mmcv) PS C:\Users\xxx\mmcv> $env:TORCH_CUDA_ARCH_LIST="7.5" + ``` + + :::{note} + Check your the compute capability of your GPU from [here](https://developer.nvidia.com/cuda-gpus). + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> &"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite\deviceQuery.exe" + Device 0: "NVIDIA GeForce GTX 1660 SUPER" + CUDA Driver Version / Runtime Version 11.7 / 11.1 + CUDA Capability Major/Minor version number: 7.5 + ``` + + The 7.5 above indicates the target architecture. Note: You need to replace v10.2 with your CUDA version in the above command. + ::: + +3. Build and install + + ```powershell + # build + python setup.py build_ext # if success, cl will be launched to compile ops + # install + python setup.py develop + ``` + + ```{note} + If you are compiling against PyTorch 1.6.0, you might meet some errors from PyTorch as described in [this issue](https://github.com/pytorch/pytorch/issues/42467). Follow [this pull request](https://github.com/pytorch/pytorch/pull/43380/files) to modify the source code in your local PyTorch installation. + ``` + +##### Validate installation + +```powershell +(mmcv) PS C:\Users\xxx\mmcv> python .dev_scripts/check_installation.py +``` + +If no error is reported by the above command, the installation is successful. If there is an error reported, please check [Frequently Asked Questions](../faq.md) to see if there is already a solution. +If no solution is found, please feel free to open an [issue](https://github.com/open-mmlab/mmcv/issues). + +### Build mmcv-lite + +If you need to use PyTorch-related modules, make sure PyTorch has been successfully installed in your environment by referring to the [PyTorch official installation guide](https://github.com/pytorch/pytorch#installation). + +1. Clone the repo + + ```bash + git clone https://github.com/open-mmlab/mmcv.git + cd mmcv + ``` + +2. Start building + + ```bash + MMCV_WITH_OPS=0 pip install -e . -v + ``` + +3. Validate installation + + ```bash + python -c 'import mmcv;print(mmcv.__version__)' + ``` + +### Build mmcv-full on Cambricon MLU Devices + +#### Install torch_mlu + +##### Option1: Install mmcv-full based on Cambricon docker image + +Firstly, install and pull Cambricon docker image (please email service@cambricon.com for the latest release docker): + +```bash +docker pull ${docker image} +``` + +Run and attach to the docker, [Install mmcv-full on MLU device](#install-mmcv\-full-on-cambricon-mlu-device) and [make sure you've installed mmcv-full on MLU device successfully](#test-code) + +##### Option2: Install mmcv-full from compiling Cambricon PyTorch source code + +Please email service@cambricon.com or contact with Cambricon engineers for a suitable version of CATCH package. After you get the suitable version of CATCH package, please follow the steps in ${CATCH-path}/CONTRIBUTING.md to install Cambricon PyTorch. + +#### Install mmcv-full on Cambricon MLU device + +Clone the repo + +```bash +git clone https://github.com/open-mmlab/mmcv.git +``` + +The mlu-ops library will be downloaded to the default directory (mmcv/mlu-ops) while building MMCV. You can also set `MMCV_MLU_OPS_PATH` to an existing mlu-ops library before building as follows: + +```bash +export MMCV_MLU_OPS_PATH=/xxx/xxx/mlu-ops +``` + +Install mmcv-full + +```bash +cd mmcv +export MMCV_WITH_OPS=1 +export FORCE_MLU=1 +python setup.py install +``` + +#### Test Code + +After finishing previous steps, you can run the following python code to make sure that you've installed mmcv-full on MLU device successfully + +```python +import torch +import torch_mlu +from mmcv.ops import sigmoid_focal_loss +x = torch.randn(3, 10).mlu() +x.requires_grad = True +y = torch.tensor([1, 5, 3]).mlu() +w = torch.ones(10).float().mlu() +output = sigmoid_focal_loss(x, y, 2.0, 0.25, w, 'none') +print(output) +``` diff --git a/FoodSeg103/demo/mmcv/docs/en/get_started/installation.md b/FoodSeg103/demo/mmcv/docs/en/get_started/installation.md new file mode 100644 index 0000000000000000000000000000000000000000..ce7d92d66e7eb0084c699fa53042832fe742747d --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/get_started/installation.md @@ -0,0 +1,348 @@ +## Installation + +There are two versions of MMCV: + +- **mmcv**: comprehensive, with full features and various CUDA ops out of box. It takes longer time to build. +- **mmcv-lite**: lite, without CUDA ops but all other features, similar to mmcv\<1.0.0. It is useful when you do not need those CUDA ops. + +```{warning} +Do not install both versions in the same environment, otherwise you may encounter errors like `ModuleNotFound`. You need to uninstall one before installing the other. `Installing the full version is highly recommended if CUDA is avaliable`. +``` + +### Install mmcv + +Before installing mmcv, make sure that PyTorch has been successfully installed following the [PyTorch official installation guide](https://pytorch.org/get-started/locally/#start-locally). This can be verified using the following command + +```bash +python -c 'import torch;print(torch.__version__)' +``` + +If version information is output, then PyTorch is installed. + +#### Install with mim (recommended) + +[mim](https://github.com/open-mmlab/mim) is the package management tool for the OpenMMLab projects, which makes it easy to install mmcv + +```bash +pip install -U openmim +mim install mmcv +``` + +If you find that the above installation command does not use a pre-built package ending with `.whl` but a source package ending with `.tar.gz`, you may not have a pre-build package corresponding to the PyTorch or CUDA or mmcv version, in which case you can [build mmcv from source](build.md). + +
+Installation log using pre-built packages + +Looking in links: https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/index.html
+Collecting mmcv
+Downloading https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/mmcv-2.0.0-cp38-cp38-manylinux1_x86_64.whl + +
+ +
+Installation log using source packages + +Looking in links: https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/index.html
+Collecting mmcv==2.0.0
+Downloading mmcv-2.0.0.tar.gz + +
+ +To install a specific version of mmcv, for example, mmcv version 2.0.0, you can use the following command + +```bash +mim install mmcv==2.0.0 +``` + +:::{note} +If you would like to use `opencv-python-headless` instead of `opencv-python`, +e.g., in a minimum container environment or servers without GUI, +you can first install it before installing MMCV to skip the installation of `opencv-python`. + +Alternatively, if it takes too long to install a dependency library, you can specify the pypi source + +```bash +mim install mmcv -i https://pypi.tuna.tsinghua.edu.cn/simple +``` + +::: + +You can run [check_installation.py](https://github.com/open-mmlab/mmcv/blob/main/.dev_scripts/check_installation.py) to check the installation of mmcv-full after running the installation commands. + +#### Install with pip + +Use the following command to check the version of CUDA and PyTorch + +```bash +python -c 'import torch;print(torch.__version__);print(torch.version.cuda)' +``` + +Select the appropriate installation command depending on the type of system, CUDA version, PyTorch version, and MMCV version + + + + +
+ + + + +
+

+
+
+
+
+If you do not find a corresponding version in the dropdown box above, you probably do not have a pre-built package corresponding to the PyTorch or CUDA or mmcv version, at which point you can [build mmcv from source](build.md).
+
+:::{note}
+mmcv is only compiled on PyTorch 1.x.0 because the compatibility
+usually holds between 1.x.0 and 1.x.1. If your PyTorch version is 1.x.1, you
+can install mmcv compiled with PyTorch 1.x.0 and it usually works well.
+For example, if your PyTorch version is 1.8.1, you can feel free to choose 1.8.x.
+:::
+
+:::{note}
+If you would like to use `opencv-python-headless` instead of `opencv-python`,
+e.g., in a minimum container environment or servers without GUI,
+you can first install it before installing MMCV to skip the installation of `opencv-python`.
+
+Alternatively, if it takes too long to install a dependency library, you can specify the pypi source
+
+```bash
+mim install mmcv -i https://pypi.tuna.tsinghua.edu.cn/simple
+```
+
+:::
+
+You can run [check_installation.py](https://github.com/open-mmlab/mmcv/blob/main/.dev_scripts/check_installation.py) to check the installation of mmcv after running the installation commands.
+
+#### Using mmcv with Docker
+
+Build with local repository
+
+```bash
+git clone https://github.com/open-mmlab/mmcv.git && cd mmcv
+docker build -t mmcv -f docker/release/Dockerfile .
+```
+
+Or build with remote repository
+
+```bash
+docker build -t mmcv https://github.com/open-mmlab/mmcv.git#main:docker/release
+```
+
+The [Dockerfile](release/Dockerfile) installs latest released version of mmcv-full by default, but you can specify mmcv versions to install expected versions.
+
+```bash
+docker image build -t mmcv -f docker/release/Dockerfile --build-arg MMCV=2.0.0 .
+```
+
+If you also want to use other versions of PyTorch and CUDA, you can also pass them when building docker images.
+
+An example to build an image with PyTorch 1.11 and CUDA 11.3.
+
+```bash
+docker build -t mmcv -f docker/release/Dockerfile \
+    --build-arg PYTORCH=1.11.0 \
+    --build-arg CUDA=11.3 \
+    --build-arg CUDNN=8 \
+    --build-arg MMCV=2.0.0 .
+```
+
+More available versions of PyTorch and CUDA can be found at [dockerhub/pytorch](https://hub.docker.com/r/pytorch/pytorch/tags).
+
+### Install mmcv-lite
+
+If you need to use PyTorch-related modules, make sure PyTorch has been successfully installed in your environment by referring to the [PyTorch official installation guide](https://github.com/pytorch/pytorch#installation).
+
+```python
+pip install mmcv-lite
+```
diff --git a/FoodSeg103/demo/mmcv/docs/en/get_started/introduction.md b/FoodSeg103/demo/mmcv/docs/en/get_started/introduction.md
new file mode 100644
index 0000000000000000000000000000000000000000..461fcc725bbcf4a84296e95789303b64e7b2e9c5
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/en/get_started/introduction.md
@@ -0,0 +1,36 @@
+## Introduction
+
+MMCV is a foundational library for computer vision research and provides the following functionalities.
+
+- [Image/Video processing](../understand_mmcv/data_process.md)
+- [Image and annotation visualization](../understand_mmcv/visualization.md)
+- [Image transformation](../understand_mmcv/data_transform.md)
+- [Various CNN architectures](../understand_mmcv/cnn.md)
+- [High-quality implementation of common CUDA ops](../understand_mmcv/ops.md)
+
+It supports the following systems:
+
+- Linux
+- Windows
+- macOS
+
+It supports many research projects as below:
+
+- [MMClassification](https://github.com/open-mmlab/mmclassification): OpenMMLab image classification toolbox and benchmark.
+- [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab detection toolbox and benchmark.
+- [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab's next-generation platform for general 3D object detection.
+- [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab rotated object detection toolbox and benchmark.
+- [MMYOLO](https://github.com/open-mmlab/mmyolo): OpenMMLab YOLO series toolbox and benchmark.
+- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation): OpenMMLab semantic segmentation toolbox and benchmark.
+- [MMOCR](https://github.com/open-mmlab/mmocr): OpenMMLab text detection, recognition, and understanding toolbox.
+- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab pose estimation toolbox and benchmark.
+- [MMHuman3D](https://github.com/open-mmlab/mmhuman3d): OpenMMLab 3D human parametric model toolbox and benchmark.
+- [MMSelfSup](https://github.com/open-mmlab/mmselfsup): OpenMMLab self-supervised learning toolbox and benchmark.
+- [MMRazor](https://github.com/open-mmlab/mmrazor): OpenMMLab model compression toolbox and benchmark.
+- [MMFewShot](https://github.com/open-mmlab/mmfewshot): OpenMMLab fewshot learning toolbox and benchmark.
+- [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab's next-generation action understanding toolbox and benchmark.
+- [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab video perception toolbox and benchmark.
+- [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab optical flow toolbox and benchmark.
+- [MMEditing](https://github.com/open-mmlab/mmediting): OpenMMLab image and video editing toolbox.
+- [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab image and video generative models toolbox.
+- [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab model deployment framework.
diff --git a/FoodSeg103/demo/mmcv/docs/en/get_started/previous_versions.md b/FoodSeg103/demo/mmcv/docs/en/get_started/previous_versions.md
new file mode 100644
index 0000000000000000000000000000000000000000..a9c3717667fec3e8f338c319413aa6ad639dc6d3
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/en/get_started/previous_versions.md
@@ -0,0 +1,47 @@
+## OTHER VERSIONS OF PYTORCH BUILT FOR MMCV-FULL
+
+We no longer provide `mmcv-full` packages compiled under lower versions of `PyTorch`, but for your convenience, you can find them below.
+
+### PyTorch 1.4
+
+| 1.0.0 \<= mmcv_version \<= 1.2.1
+
+#### CUDA 10.1
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.4.0/index.html
+```
+
+#### CUDA 9.2
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.4.0/index.html
+```
+
+#### CPU
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cpu/torch1.4.0/index.html
+```
+
+### PyTorch v1.3
+
+| 1.0.0 \<= mmcv_version \<= 1.3.16
+
+#### CUDA 10.1
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.3.0/index.html
+```
+
+#### CUDA 9.2
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.3.0/index.html
+```
+
+#### CPU
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cpu/torch1.3.0/index.html
+```
diff --git a/FoodSeg103/demo/mmcv/docs/en/index.rst b/FoodSeg103/demo/mmcv/docs/en/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..dee2c37507fb77df42fef5e51fe501214c13d7ce
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/en/index.rst
@@ -0,0 +1,69 @@
+Welcome to MMCV's documentation!
+================================
+
+You can switch between Chinese and English documents in the lower-left corner of the layout.
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Get Started
+
+   get_started/introduction.md
+   get_started/installation.md
+   get_started/build.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Understand MMCV
+
+   understand_mmcv/data_process.md
+   understand_mmcv/data_transform.md
+   understand_mmcv/visualization.md
+   understand_mmcv/cnn.md
+   understand_mmcv/ops.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Deployment
+
+   deployment/mmcv_ops_definition.md
+
+.. toctree::
+   :caption: Switch Language
+
+   switch_language.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Compatibility
+
+   compatibility.md
+
+.. toctree::
+
+   faq.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Community
+
+   community/contributing.md
+   community/pr.md
+
+.. toctree::
+   :maxdepth: 1
+   :caption: API Reference
+
+   mmcv.image 
+   mmcv.video 
+   mmcv.visualization 
+   mmcv.cnn 
+   mmcv.ops 
+   mmcv.transforms 
+   mmcv.arraymisc 
+   mmcv.utils 
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
diff --git a/FoodSeg103/demo/mmcv/docs/en/make.bat b/FoodSeg103/demo/mmcv/docs/en/make.bat
new file mode 100644
index 0000000000000000000000000000000000000000..7893348a1b7dbb588983a48e6991282eae7e1b55
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/en/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%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+
+:end
+popd
diff --git a/FoodSeg103/demo/mmcv/docs/en/mmcv-logo.png b/FoodSeg103/demo/mmcv/docs/en/mmcv-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..bcc5759f8fe3bc7d191d411c38a9e1d3c1c27a84
Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/en/mmcv-logo.png differ
diff --git a/FoodSeg103/demo/mmcv/docs/en/switch_language.md b/FoodSeg103/demo/mmcv/docs/en/switch_language.md
new file mode 100644
index 0000000000000000000000000000000000000000..9dc7b34b4fac6a972abedd8c2b0b80d03441d2b9
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/en/switch_language.md
@@ -0,0 +1,3 @@
+## English
+
+## 简体中文
diff --git a/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/cnn.md b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/cnn.md
new file mode 100644
index 0000000000000000000000000000000000000000..12f5318bc727868488aebb63f7be4e9721cd66fa
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/cnn.md
@@ -0,0 +1,79 @@
+## CNN
+
+We provide some building bricks for CNNs, including layer building, module bundles and weight initialization.
+
+### Layer building
+
+We may need to try different layers of the same type when running experiments,
+but do not want to modify the code from time to time.
+Here we provide some layer building methods to construct layers from a dict,
+which can be written in configs or specified via command line arguments.
+
+#### Usage
+
+A simplest example is
+
+```python
+from mmcv.cnn import build_conv_layer
+
+cfg = dict(type='Conv3d')
+layer = build_conv_layer(cfg, in_channels=3, out_channels=8, kernel_size=3)
+```
+
+- `build_conv_layer`: Supported types are Conv1d, Conv2d, Conv3d, Conv (alias for Conv2d).
+- `build_norm_layer`: Supported types are BN1d, BN2d, BN3d, BN (alias for BN2d), SyncBN, GN, LN, IN1d, IN2d, IN3d, IN (alias for IN2d).
+- `build_activation_layer`: Supported types are ReLU, LeakyReLU, PReLU, RReLU, ReLU6, ELU, Sigmoid, Tanh, GELU.
+- `build_upsample_layer`: Supported types are nearest, bilinear, deconv, pixel_shuffle.
+- `build_padding_layer`: Supported types are zero, reflect, replicate.
+
+#### Extension
+
+We also allow extending the building methods with custom layers and operators.
+
+1. Write and register your own module.
+
+   ```python
+   from mmengine.registry import MODELS
+
+   @MODELS.register_module()
+   class MyUpsample:
+
+       def __init__(self, scale_factor):
+           pass
+
+       def forward(self, x):
+           pass
+   ```
+
+2. Import `MyUpsample` somewhere (e.g., in `__init__.py`) and then use it.
+
+   ```python
+   from mmcv.cnn import build_upsample_layer
+
+   cfg = dict(type='MyUpsample', scale_factor=2)
+   layer = build_upsample_layer(cfg)
+   ```
+
+### Module bundles
+
+We also provide common module bundles to facilitate the network construction.
+`ConvModule` is a bundle of convolution, normalization and activation layers,
+please refer to the [api](api.html#mmcv.cnn.ConvModule) for details.
+
+```python
+from mmcv.cnn import ConvModule
+
+# conv + bn + relu
+conv = ConvModule(3, 8, 2, norm_cfg=dict(type='BN'))
+# conv + gn + relu
+conv = ConvModule(3, 8, 2, norm_cfg=dict(type='GN', num_groups=2))
+# conv + relu
+conv = ConvModule(3, 8, 2)
+# conv
+conv = ConvModule(3, 8, 2, act_cfg=None)
+# conv + leaky relu
+conv = ConvModule(3, 8, 3, padding=1, act_cfg=dict(type='LeakyReLU'))
+# bn + conv + relu
+conv = ConvModule(
+    3, 8, 2, norm_cfg=dict(type='BN'), order=('norm', 'conv', 'act'))
+```
diff --git a/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/data_process.md b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/data_process.md
new file mode 100644
index 0000000000000000000000000000000000000000..167928f88528ee6b682a559582a1584c369a5d39
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/data_process.md
@@ -0,0 +1,286 @@
+## Data Process
+
+### Image
+
+This module provides some image processing methods, which requires `opencv` to be installed first.
+
+#### Read/Write/Show
+
+To read or write images files, use `imread` or `imwrite`.
+
+```python
+import mmcv
+
+img = mmcv.imread('test.jpg')
+img = mmcv.imread('test.jpg', flag='grayscale')
+img_ = mmcv.imread(img)  # nothing will happen, img_ = img
+mmcv.imwrite(img, 'out.jpg')
+```
+
+To read images from bytes
+
+```python
+with open('test.jpg', 'rb') as f:
+    data = f.read()
+img = mmcv.imfrombytes(data)
+```
+
+To show an image file or a loaded image
+
+```python
+mmcv.imshow('tests/data/color.jpg')
+# this is equivalent to
+
+for i in range(10):
+    img = np.random.randint(256, size=(100, 100, 3), dtype=np.uint8)
+    mmcv.imshow(img, win_name='test image', wait_time=200)
+```
+
+#### Color space conversion
+
+Supported conversion methods:
+
+- bgr2gray
+- gray2bgr
+- bgr2rgb
+- rgb2bgr
+- bgr2hsv
+- hsv2bgr
+
+```python
+img = mmcv.imread('tests/data/color.jpg')
+img1 = mmcv.bgr2rgb(img)
+img2 = mmcv.rgb2gray(img1)
+img3 = mmcv.bgr2hsv(img)
+```
+
+#### Resize
+
+There are three resize methods. All `imresize_*` methods have an argument `return_scale`,
+if this argument is `False`, then the return value is merely the resized image, otherwise
+is a tuple `(resized_img, scale)`.
+
+```python
+# resize to a given size
+mmcv.imresize(img, (1000, 600), return_scale=True)
+
+# resize to the same size of another image
+mmcv.imresize_like(img, dst_img, return_scale=False)
+
+# resize by a ratio
+mmcv.imrescale(img, 0.5)
+
+# resize so that the max edge no longer than 1000, short edge no longer than 800
+# without changing the aspect ratio
+mmcv.imrescale(img, (1000, 800))
+```
+
+#### Rotate
+
+To rotate an image by some angle, use `imrotate`. The center can be specified,
+which is the center of original image by default. There are two modes of rotating,
+one is to keep the image size unchanged so that some parts of the image will be
+cropped after rotating, the other is to extend the image size to fit the rotated
+image.
+
+```python
+img = mmcv.imread('tests/data/color.jpg')
+
+# rotate the image clockwise by 30 degrees.
+img_ = mmcv.imrotate(img, 30)
+
+# rotate the image counterclockwise by 90 degrees.
+img_ = mmcv.imrotate(img, -90)
+
+# rotate the image clockwise by 30 degrees, and rescale it by 1.5x at the same time.
+img_ = mmcv.imrotate(img, 30, scale=1.5)
+
+# rotate the image clockwise by 30 degrees, with (100, 100) as the center.
+img_ = mmcv.imrotate(img, 30, center=(100, 100))
+
+# rotate the image clockwise by 30 degrees, and extend the image size.
+img_ = mmcv.imrotate(img, 30, auto_bound=True)
+```
+
+#### Flip
+
+To flip an image, use `imflip`.
+
+```python
+img = mmcv.imread('tests/data/color.jpg')
+
+# flip the image horizontally
+mmcv.imflip(img)
+
+# flip the image vertically
+mmcv.imflip(img, direction='vertical')
+```
+
+#### Crop
+
+`imcrop` can crop the image with one or more regions. Each region is represented by the upper left and lower right coordinates as (x1, y1, x2, y2).
+
+```python
+import mmcv
+import numpy as np
+
+img = mmcv.imread('tests/data/color.jpg')
+
+# crop the region (10, 10, 100, 120)
+bboxes = np.array([10, 10, 100, 120])
+patch = mmcv.imcrop(img, bboxes)
+
+# crop two regions (10, 10, 100, 120) and (0, 0, 50, 50)
+bboxes = np.array([[10, 10, 100, 120], [0, 0, 50, 50]])
+patches = mmcv.imcrop(img, bboxes)
+
+# crop two regions, and rescale the patches by 1.2x
+patches = mmcv.imcrop(img, bboxes, scale=1.2)
+```
+
+#### Padding
+
+There are two methods, `impad` and `impad_to_multiple`, to pad an image to the
+specific size with given values.
+
+```python
+img = mmcv.imread('tests/data/color.jpg')
+
+# pad the image to (1000, 1200) with all zeros
+img_ = mmcv.impad(img, shape=(1000, 1200), pad_val=0)
+
+# pad the image to (1000, 1200) with different values for three channels.
+img_ = mmcv.impad(img, shape=(1000, 1200), pad_val=(100, 50, 200))
+
+# pad the image on left, right, top, bottom borders with all zeros
+img_ = mmcv.impad(img, padding=(10, 20, 30, 40), pad_val=0)
+
+# pad the image on left, right, top, bottom borders with different values
+# for three channels.
+img_ = mmcv.impad(img, padding=(10, 20, 30, 40), pad_val=(100, 50, 200))
+
+# pad an image so that each edge is a multiple of some value.
+img_ = mmcv.impad_to_multiple(img, 32)
+```
+
+### Video
+
+This module provides the following functionalities:
+
+- A `VideoReader` class with friendly apis to read and convert videos.
+- Some methods for editing (cut, concat, resize) videos.
+- Optical flow read/write/warp.
+
+#### VideoReader
+
+The `VideoReader` class provides sequence like apis to access video frames.
+It will internally cache the frames which have been visited.
+
+```python
+video = mmcv.VideoReader('test.mp4')
+
+# obtain basic information
+print(len(video))
+print(video.width, video.height, video.resolution, video.fps)
+
+# iterate over all frames
+for frame in video:
+    print(frame.shape)
+
+# read the next frame
+img = video.read()
+
+# read a frame by index
+img = video[100]
+
+# read some frames
+img = video[5:10]
+```
+
+To convert a video to images or generate a video from a image directory.
+
+```python
+# split a video into frames and save to a folder
+video = mmcv.VideoReader('test.mp4')
+video.cvt2frames('out_dir')
+
+# generate video from frames
+mmcv.frames2video('out_dir', 'test.avi')
+```
+
+#### Editing utils
+
+There are also some methods for editing videos, which wraps the commands of ffmpeg.
+
+```python
+# cut a video clip
+mmcv.cut_video('test.mp4', 'clip1.mp4', start=3, end=10, vcodec='h264')
+
+# join a list of video clips
+mmcv.concat_video(['clip1.mp4', 'clip2.mp4'], 'joined.mp4', log_level='quiet')
+
+# resize a video with the specified size
+mmcv.resize_video('test.mp4', 'resized1.mp4', (360, 240))
+
+# resize a video with a scaling ratio of 2
+mmcv.resize_video('test.mp4', 'resized2.mp4', ratio=2)
+```
+
+#### Optical flow
+
+`mmcv` provides the following methods to operate on optical flows.
+
+- IO
+- Visualization
+- Flow warping
+
+We provide two options to dump optical flow files: uncompressed and compressed.
+The uncompressed way just dumps the floating numbers to a binary file. It is
+lossless but the dumped file has a larger size.
+The compressed way quantizes the optical flow to 0-255 and dumps it as a
+jpeg image. The flow of x-dim and y-dim will be concatenated into a single image.
+
+1. IO
+
+```python
+flow = np.random.rand(800, 600, 2).astype(np.float32)
+# dump the flow to a flo file (~3.7M)
+mmcv.flowwrite(flow, 'uncompressed.flo')
+# dump the flow to a jpeg file (~230K)
+# the shape of the dumped image is (800, 1200)
+mmcv.flowwrite(flow, 'compressed.jpg', quantize=True, concat_axis=1)
+
+# read the flow file, the shape of loaded flow is (800, 600, 2) for both ways
+flow = mmcv.flowread('uncompressed.flo')
+flow = mmcv.flowread('compressed.jpg', quantize=True, concat_axis=1)
+```
+
+2. Visualization
+
+It is possible to visualize optical flows with `mmcv.flowshow()`.
+
+```python
+mmcv.flowshow(flow)
+```
+
+![progress](../_static/flow_visualization.png)
+
+3. Flow warping
+
+```python
+img1 = mmcv.imread('img1.jpg')
+flow = mmcv.flowread('flow.flo')
+warped_img2 = mmcv.flow_warp(img1, flow)
+```
+
+img1 (left) and img2 (right)
+
+![raw images](../_static/flow_raw_images.png)
+
+optical flow (img2 -> img1)
+
+![optical flow](../_static/flow_img2toimg1.png)
+
+warped image and difference with ground truth
+
+![warped image](../_static/flow_warp_diff.png)
diff --git a/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/data_transform.md b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/data_transform.md
new file mode 100644
index 0000000000000000000000000000000000000000..64c3af980eab0b07d7a298cee2c41465803911f8
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/data_transform.md
@@ -0,0 +1,341 @@
+# Data Transformation
+
+In the OpenMMLab algorithm library, dataset construction and data preparation are decoupled. Usually, the construction of the dataset only parses the dataset and records the basic information of each sample, while the data preparation is a series of data transformations including data loading, preprocessing, formatting, and other operations performed according to the basic information of the sample.
+
+## Design of data transformation
+
+In MMCV, we use various callable data transformation classes to manipulate data. These data transformation classes can accept several configuration parameters for the instantiation and then process the input data dictionary by `__call__` method. All data transformation methods accept a dictionary as the input and produce the output as a dictionary as well. A simple example is as follows:
+
+```python
+>>> import numpy as np
+>>> from mmcv.transforms import Resize
+>>>
+>>> transform = Resize(scale=(224, 224))
+>>> data_dict = {'img': np.random.rand(256, 256, 3)}
+>>> data_dict = transform(data_dict)
+>>> print(data_dict['img'].shape)
+(224, 224, 3)
+```
+
+The data transformation class reads some fields of the input dictionary and may add or update some fields. The keys of these fields are mostly fixed. For example, `Resize` will always read fields such as `"img"` in the input dictionary. More information about the conventions for input and output fields could be found in the documentation of the corresponding class.
+
+```{note}
+By convention, the order of image shape which is used as **initialization parameters** in data transformation (such as Resize, Pad) is (width, height). In the dictionary returned by the data transformation, the image related shape, such as `img_shape`, `ori_shape`, `pad_shape`, etc., is (height, width).
+```
+
+MMCV provides a unified base class called `BaseTransform` for all data transformation classes:
+
+```python
+class BaseTransform(metaclass=ABCMeta):
+
+    def __call__(self, results: dict) -> dict:
+
+        return self.transform(results)
+
+    @abstractmethod
+    def transform(self, results: dict) -> dict:
+        pass
+```
+
+All data transformation classes must inherit `BaseTransform` and implement the `transform` method. Both the input and output of the `transform` method are a dictionary. In the **Custom data transformation class** section, we will describe how to implement a data transformation class in more detail.
+
+## Data pipeline
+
+As mentioned above, the inputs and outputs of all data transformations are dictionaries. Moreover, according to the \[Convention on Datasets\] (TODO) in OpenMMLab, the basic information of each sample in the dataset is also a dictionary. This way, we can connect all data transformation operations end to end and combine them into a data pipeline. This pipeline inputs the information dictionary of the samples in the dataset and outputs the information dictionary after a series of processing.
+
+Taking the classification task as an example, we show a typical data pipeline in the figure below. For each sample, the information stored in the dataset is a dictionary, as shown on the far left in the figure. After each data transformation operation represented by the blue block, a new field (marked in green) will be added to the data dictionary or an existing field (marked in orange) will be updated.
+
+
+ +
+ +The data pipeline is a list of several data transformation configuration dictionaries in the configuration file. Each dataset needs to set the parameter `pipeline` to define the data preparation operations the dataset needs to perform. The configuration of the above data pipeline in the configuration file is as follows: + +```python +pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=256, keep_ratio=True), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375]), + dict(type='ClsFormatBundle') +] + +dataset = dict( + ... + pipeline=pipeline, + ... +) +``` + +## Common data transformation classes + +The commonly used data transformation classes can be roughly divided into data loading, data preprocessing and augmentation, and data formatting. In MMCV, we provide some commonly used classes as follows: + +### Data loading + +To support the loading of large-scale datasets, data is usually not loaded when `Dataset` is initialized. Only the corresponding path is loaded. Therefore, it is necessary to load specific data in the data pipeline. + +| Class | Feature | +| :-------------------------: | :--------------------------------------------: | +| [`LoadImageFromFile`](TODO) | Load from file path | +| [`LoadAnnotations`](TODO) | Load and organize the annotations (bbox, etc.) | + +### Data preprocessing and enhancement + +Data preprocessing and augmentation usually involve transforming the image itself, such as cropping, padding, scaling, etc. + +| Class | Feature | +| :------------------------------: | :----------------------------------------------------: | +| [`Pad`](TODO) | Padding | +| [`CenterCrop`](TODO) | Center crop | +| [`Normalize`](TODO) | Image normalization | +| [`Resize`](TODO) | Resize to the specified size or ratio | +| [`RandomResize`](TODO) | Scale the image randomly within the specified range | +| [`RandomMultiscaleResize`](TODO) | Scale the image to a random size from multiple options | +| [`RandomGrayscale`](TODO) | Random grayscale | +| [`RandomFlip`](TODO) | Random flip | +| [`MultiScaleFlipAug`](TODO) | Support scaling and flipping during the testing | + +### Data formatting + +Data formatting operations are type conversions performed on the data. + +| Class | Feature | +| :---------------------: | :------------------------------------------: | +| [`ToTensor`](TODO) | Convert the specified data to `torch.Tensor` | +| [`ImageToTensor`](TODO) | Convert the image to `torch.Tensor` | + +## Customize data transformation classes + +To implement a new data transformation class, you must inherit `BaseTransform` and implement the `transform` method. Here, we use a simple flip transform (`MyFlip`) as an example: + +```python +import random +import mmcv +from mmcv.transforms import BaseTransform, TRANSFORMS + +@TRANSFORMS.register_module() +class MyFlip(BaseTransform): + def __init__(self, direction: str): + super().__init__() + self.direction = direction + + def transform(self, results: dict) -> dict: + img = results['img'] + results['img'] = mmcv.imflip(img, direction=self.direction) + return results +``` + +Now, we can instantiate `MyFlip` as a callable object to handle our data dictionary. + +```python +import numpy as np + +transform = MyFlip(direction='horizontal') +data_dict = {'img': np.random.rand(224, 224, 3)} +data_dict = transform(data_dict) +processed_img = data_dict['img'] +``` + +Alternatively, use `MyFlip` transform in the `pipeline` of the config file. + +```python +pipeline = [ + ... + dict(type='MyFlip', direction='horizontal'), + ... +] +``` + +It should be noted that if you want to use it in the configuration file, you must ensure that the file where the `MyFlip` class is located can be imported at the runtime. + +## Transform wrapper + +Transform wrappers are a special class of data transformations. They do not operate on images, labels or other information in the data dictionary by themselves. Instead, they enhance the behavior of data transformations defined in them. + +### KeyMapper + +`KeyMapper` is used to map fields in the data dictionary. For example, image processing transforms usually get their values from the `"img"` field in the data dictionary. But sometimes we want these transforms to handle images in other fields in the data dictionary, such as the `"gt_img"` field. + +When used with registry and configuration file, the field map wrapper should be used as follows: + +```python +pipeline = [ + ... + dict(type='KeyMapper', + mapping={ + 'img': 'gt_img', # map "gt_img" to "img" + 'mask': ..., # The "mask" field in the raw data is not used. That is, for wrapped data transformations, the "mask" field is not included in the data + }, + auto_remap=True, # remap "img" back to "gt_img" after the transformation + transforms=[ + # only need to specify "img" in `RandomFlip` + dict(type='RandomFlip'), + ]) + ... +] +``` + +With `KeyMapper`, we don't need to consider various possible input field names in the `transform` method when we implement the data transformation class. We only need to deal with the default fields. + +### RandomChoice and RandomApply + +`RandomChoice` is used to randomly select a data transformation pipeline from the given choices. With this wrapper, we can easily implement some data augmentation functions, such as AutoAugment. + +In configuration file, you can use `RandomChoice` as follows: + +```python +pipeline = [ + ... + dict(type='RandomChoice', + transforms=[ + [ + dict(type='Posterize', bits=4), + dict(type='Rotate', angle=30.) + ], # the first combo option + [ + dict(type='Equalize'), + dict(type='Rotate', angle=30) + ], # the second combo option + ], + prob=[0.4, 0.6] # the prob of each combo + ) + ... +] +``` + +`RandomApply` is used to randomly perform a combination of data transformations with a specified probability. For example: + +```python +pipeline = [ + ... + dict(type='RandomApply', + transforms=[dict(type='Rotate', angle=30.)], + prob=0.3) # perform the transformation with prob as 0.3 + ... +] +``` + +### TransformBroadcaster + +Usually, a data transformation class only reads the target of an operation from one field. While we can also use `KeyMapper` to change the fields read, there is no way to apply transformations to the data of multiple fields at once. To achieve this, we need to use the multi-target extension wrapper `TransformBroadcaster`. + +`TransformBroadcaster` has two uses, one is to apply data transformation to multiple specified fields, and the other is to apply data transformation to a group of targets under a field. + +1. Apply to multiple fields + + Suppose we need to apply a data transformation to images in two fields `"lq"` (low-quality) and `"gt"` (ground-truth). + + ```python + pipeline = [ + dict(type='TransformBroadcaster', + # apply to the "lq" and "gt" fields respectively, and set the "img" field to both + mapping={'img': ['lq', 'gt']}, + # remap the "img" field back to the original field after the transformation + auto_remap=True, + # whether to share random variables in the transformation of each target + # more introduction will be referred in the following chapters (random variable sharing) + share_random_params=True, + transforms=[ + # only need to manipulate the "img" field in the `RandomFlip` class + dict(type='RandomFlip'), + ]) + ] + ``` + + In the `mapping` setting of the multi-target extension, we can also use `...` to ignore the specified original field. As shown in the following example, the wrapped `RandomCrop` will crop the image in the field `"img"` and update the size of the cropped image if the field `"img_shape"` exists. If we want to do the same random cropping for both image fields `"lq"` and `"gt"` at the same time but update the `"img_shape"` field only once, we can do it as in the example: + + ```python + pipeline = [ + dict(type='TransformBroadcaster', + mapping={ + 'img': ['lq', 'gt'], + 'img_shape': ['img_shape', ...], + }, + # remap the "img" and "img_shape" fields back to their original fields after the transformation + auto_remap=True, + # whether to share random variables in the transformation of each target + # more introduction will be referred in the following chapters (random variable sharing) + share_random_params=True, + transforms=[ + # "img" and "img_shape" fields are manipulated in the `RandomCrop` class + # if "img_shape" is missing, only operate on "img" + dict(type='RandomCrop'), + ]) + ] + ``` + +2. A set of targets applied to a field + + Suppose we need to apply a data transformation to the `"images"` field, which is a list of images. + + ```python + pipeline = [ + dict(type='TransformBroadcaster', + # map each image under the "images" field to the "img" field + mapping={'img': 'images'}, + # remap the images under the "img" field back to the list in the "images" field after the transformation + auto_remap=True, + # whether to share random variables in the transformation of each target + share_random_params=True, + transforms=[ + # in the `RandomFlip` transformation class, we only need to manipulate the "img" field + dict(type='RandomFlip'), + ]) + ] + ``` + +#### Decorator `cache_randomness` + +In `TransformBroadcaster`, we provide the `share_random_params` option to support sharing random states across multiple data transformations. For example, in a super-resolution task, we want to apply **the same** random transformations **simultaneously** to the low-resolution image and the original image. If we use this function in a custom data transformation class, we need to mark which random variables support sharing in the class. This can be achieved with the decorator `cache_randomness`. + +Taking `MyFlip` from the above example, we want to perform flipping randomly with a certain probability: + +```python +from mmcv.transforms.utils import cache_randomness + +@TRANSFORMS.register_module() +class MyRandomFlip(BaseTransform): + def __init__(self, prob: float, direction: str): + super().__init__() + self.prob = prob + self.direction = direction + + @cache_randomness # label the output of the method as a shareable random variable + def do_flip(self): + flip = True if random.random() > self.prob else False + return flip + + def transform(self, results: dict) -> dict: + img = results['img'] + if self.do_flip(): + results['img'] = mmcv.imflip(img, direction=self.direction) + return results +``` + +In the above example, we decorate the `do_flip` method with `cache_randomness`, marking the method return value `flip` as a random variable that supports sharing. Therefore, in the transformation of `TransformBroadcaster` to multiple targets, the value of this variable will remain the same. + +#### Decorator `avoid_cache_randomness` + +In some cases, we cannot separate the process of generating random variables in data transformation into a class method. For example, modules from third-party libraries used in data transformation encapsulate the relevant parts of random variables inside, making them impossible to be extracted as class methods for data transformation. Such data transformations cannot support shared random variables through the decorator `cache_randomness` annotation, and thus cannot share random variables during multi-objective expansion. + +To avoid misuse of such data transformations in multi-object extensions, we provide another decorator, `avoid_cache_randomness`, to mark such data transformations: + +```python +from mmcv.transforms.utils import avoid_cache_randomness + +@TRANSFORMS.register_module() +@avoid_cache_randomness +class MyRandomTransform(BaseTransform): + + def transform(self, results: dict) -> dict: + ... +``` + +Data transformation classes marked with `avoid_cache_randomness` will throw an exception when their instance is wrapped by `TransformBroadcaster` and the parameter `share_random_params` is set to True. This reminds the user not to use it in this way. + +There are a few things to keep in mind when using `avoid_cache_randomness`: + +1. `avoid_cache_randomness` is only used to decorate data transformation classes (subclasses of `BaseTransfrom`) and cannot be used to decorate other general classes, class methods, or functions +2. When a data transformation decorated with `avoid_cache_randomness` is used as a base class, its subclasses **will not inherit** its feature. If the subclass is still unable to share random variables, `avoid_cache_randomness` should be used again. +3. A data transformation needs to be modified with `avoid_cache_randomness` only when a data transformation is random and cannot share its random parameters. Data transformations without randomness require no decoration diff --git a/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/ops.md b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/ops.md new file mode 100644 index 0000000000000000000000000000000000000000..265327bc5cca61fbecc833f14a9c752b8c09b670 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/ops.md @@ -0,0 +1,66 @@ +## ops + +We implement common ops used in detection, segmentation, etc. + +| Device | CPU | CUDA | MLU | MPS | Ascend | +| ---------------------------- | --- | ---- | --- | --- | ------ | +| ActiveRotatedFilter | √ | √ | | | √ | +| AssignScoreWithK | | √ | | | | +| BallQuery | | √ | √ | | | +| BBoxOverlaps | | √ | √ | √ | √ | +| BorderAlign | | √ | | | | +| BoxIouRotated | √ | √ | √ | | √ | +| BoxIouQuadri | √ | √ | | | | +| CARAFE | | √ | √ | | | +| ChamferDistance | | √ | | | | +| CrissCrossAttention | | √ | | | | +| ContourExpand | √ | | | | | +| ConvexIoU | | √ | | | | +| CornerPool | | √ | | | | +| Correlation | | √ | | | | +| Deformable Convolution v1/v2 | √ | √ | √ | | √ | +| Deformable RoIPool | | √ | √ | | √ | +| DiffIoURotated | | √ | √ | | | +| DynamicScatter | | √ | √ | | | +| FurthestPointSample | | √ | | | | +| FurthestPointSampleWithDist | | √ | | | | +| FusedBiasLeakyrelu | | √ | | | √ | +| GatherPoints | | √ | | | √ | +| GroupPoints | | √ | | | | +| Iou3d | | √ | √ | | | +| KNN | | √ | | | | +| MaskedConv | | √ | √ | | √ | +| MergeCells | | √ | | | | +| MinAreaPolygon | | √ | | | | +| ModulatedDeformConv2d | √ | √ | √ | | √ | +| MultiScaleDeformableAttn | | √ | √ | | | +| NMS | √ | √ | √ | | √ | +| NMSRotated | √ | √ | √ | | √ | +| NMSQuadri | √ | √ | | | | +| PixelGroup | √ | | | | | +| PointsInBoxes | √ | √ | | | | +| PointsInPolygons | | √ | | | √ | +| PSAMask | √ | √ | √ | | √ | +| RotatedFeatureAlign | √ | √ | √ | | | +| RoIPointPool3d | | √ | √ | | | +| RoIPool | | √ | √ | | √ | +| RoIAlignRotated | √ | √ | √ | | | +| RiRoIAlignRotated | | √ | | | | +| RoIAlign | √ | √ | √ | | √ | +| RoIAwarePool3d | | √ | √ | | | +| SAConv2d | | √ | | | | +| SigmoidFocalLoss | | √ | √ | | √ | +| SoftmaxFocalLoss | | √ | | | √ | +| SoftNMS | | √ | | | | +| Sparse Convolution | | √ | √ | | | +| Synchronized BatchNorm | | √ | | | | +| ThreeInterpolate | | √ | | | | +| ThreeNN | | √ | √ | | | +| TINShift | | √ | √ | | | +| UpFirDn2d | | √ | | | | +| Voxelization | √ | √ | √ | | √ | +| PrRoIPool | | √ | | | | +| BezierAlign | √ | √ | | | | +| BiasAct | | √ | | | | +| FilteredLrelu | | √ | | | | +| Conv2dGradfix | | √ | | | | diff --git a/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/visualization.md b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/visualization.md new file mode 100644 index 0000000000000000000000000000000000000000..968e350589aafdf79c32593a6b5968329d5afa2a --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/en/understand_mmcv/visualization.md @@ -0,0 +1,24 @@ +## Visualization + +`mmcv` can show images and annotations (currently supported types include bounding boxes). + +```python +# show an image file +mmcv.imshow('a.jpg') + +# show a loaded image +img = np.random.rand(100, 100, 3) +mmcv.imshow(img) + +# show image with bounding boxes +img = np.random.rand(100, 100, 3) +bboxes = np.array([[0, 0, 50, 50], [20, 20, 60, 60]]) +mmcv.imshow_bboxes(img, bboxes) +``` + +`mmcv` can also visualize special images such as optical flows. + +```python +flow = mmcv.flowread('test.flo') +mmcv.flowshow(flow) +``` diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/Makefile b/FoodSeg103/demo/mmcv/docs/zh_cn/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..51285967a7d9722c5bdee4f6a81c154a56aa0846 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +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/FoodSeg103/demo/mmcv/docs/zh_cn/_static/css/readthedocs.css b/FoodSeg103/demo/mmcv/docs/zh_cn/_static/css/readthedocs.css new file mode 100644 index 0000000000000000000000000000000000000000..9e3a567d5f78aedb606600bb3111034a1003b362 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/_static/css/readthedocs.css @@ -0,0 +1,10 @@ +.header-logo { + background-image: url("../image/mmcv-logo.png"); + background-size: 85px 40px; + height: 40px; + width: 85px; +} + +table.colwidths-auto td { + width: 50% +} diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/_static/image/mmcv-logo.png b/FoodSeg103/demo/mmcv/docs/zh_cn/_static/image/mmcv-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc5759f8fe3bc7d191d411c38a9e1d3c1c27a84 Binary files /dev/null and b/FoodSeg103/demo/mmcv/docs/zh_cn/_static/image/mmcv-logo.png differ diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/_static/version.json b/FoodSeg103/demo/mmcv/docs/zh_cn/_static/version.json new file mode 100644 index 0000000000000000000000000000000000000000..522c371ce1b2846f5f488d442450f841926207db --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/_static/version.json @@ -0,0 +1,738 @@ +{ + "Linux": [ + { + "cuda": "11.8", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "11.7", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "11.7", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "11.6", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "11.6", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.5", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.0", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.2", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.2", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.1", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.1", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.1", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "9.2", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "9.2", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "cpu", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "cpu", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + } + ], + "Windows": [ + { + "cuda": "11.8", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "11.7", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "11.7", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "11.6", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "11.6", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.5", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.3", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "11.1", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.2", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3" + ] + }, + { + "cuda": "10.2", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "10.1", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "10.1", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3" + ] + }, + { + "cuda": "10.1", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "cpu", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + }, + { + "cuda": "cpu", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0rc1" + ] + } + ], + "macOS": [ + { + "cuda": "cpu", + "torch": "2.0.x", + "mmcv": [ + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0" + ] + }, + { + "cuda": "mps", + "torch": "1.13.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3" + ] + }, + { + "cuda": "cpu", + "torch": "1.12.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.11.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.10.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.9.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.8.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2", + "2.0.0" + ] + }, + { + "cuda": "cpu", + "torch": "1.7.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2" + ] + }, + { + "cuda": "cpu", + "torch": "1.6.x", + "mmcv": [ + "2.0.0rc4", + "2.0.0rc3", + "2.0.0rc2" + ] + } + ] +} diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/_templates/classtemplate.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/_templates/classtemplate.rst new file mode 100644 index 0000000000000000000000000000000000000000..4f74842394ec9807fb1ae2d8f05a8a57e9a2e24c --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/_templates/classtemplate.rst @@ -0,0 +1,14 @@ +.. role:: hidden + :class: hidden-section +.. currentmodule:: {{ module }} + + +{{ name | underline}} + +.. autoclass:: {{ name }} + :members: + + +.. + autogenerated from source/_templates/classtemplate.rst + note it does not have :inherited-members: diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/api/arraymisc.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/api/arraymisc.rst new file mode 100644 index 0000000000000000000000000000000000000000..28975eb76e94994c50d2fe52b8f34c7ce533e788 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/api/arraymisc.rst @@ -0,0 +1,19 @@ +.. role:: hidden + :class: hidden-section + +mmcv.arraymisc +=================================== + +.. contents:: mmcv.arraymisc + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.arraymisc + +.. autosummary:: + :toctree: generated + :nosignatures: + + quantize + dequantize diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/api/cnn.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/api/cnn.rst new file mode 100644 index 0000000000000000000000000000000000000000..022191f179fdbe3b1644abbb96ffdc92e4e37e06 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/api/cnn.rst @@ -0,0 +1,71 @@ +.. role:: hidden + :class: hidden-section + +mmcv.cnn +=================================== + +.. contents:: mmcv.cnn + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.cnn + +Module +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + ContextBlock + Conv2d + Conv3d + ConvAWS2d + ConvModule + ConvTranspose2d + ConvTranspose3d + ConvWS2d + DepthwiseSeparableConvModule + GeneralizedAttention + HSigmoid + HSwish + LayerScale + Linear + MaxPool2d + MaxPool3d + NonLocal1d + NonLocal2d + NonLocal3d + Scale + Swish + Conv2dRFSearchOp + +Build Function +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + build_activation_layer + build_conv_layer + build_norm_layer + build_padding_layer + build_plugin_layer + build_upsample_layer + +Miscellaneous +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + fuse_conv_bn + conv_ws_2d + is_norm + make_res_layer + make_vgg_layer + get_model_complexity_info diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/api/image.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/api/image.rst new file mode 100644 index 0000000000000000000000000000000000000000..3b93484952cd0c45b9d103088b0677f93fe5615d --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/api/image.rst @@ -0,0 +1,100 @@ +.. role:: hidden + :class: hidden-section + +mmcv.image +=================================== + +.. contents:: mmcv.image + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.image + +IO +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + imfrombytes + imread + imwrite + use_backend + +Color Space +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + bgr2gray + bgr2hls + bgr2hsv + bgr2rgb + bgr2ycbcr + gray2bgr + gray2rgb + hls2bgr + hsv2bgr + imconvert + rgb2bgr + rgb2gray + rgb2ycbcr + ycbcr2bgr + ycbcr2rgb + +Geometric +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + cutout + imcrop + imflip + impad + impad_to_multiple + imrescale + imresize + imresize_like + imresize_to_multiple + imrotate + imshear + imtranslate + rescale_size + +Photometric +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + adjust_brightness + adjust_color + adjust_contrast + adjust_hue + adjust_lighting + adjust_sharpness + auto_contrast + clahe + imdenormalize + imequalize + iminvert + imnormalize + lut_transform + posterize + solarize + +Miscellaneous +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + tensor2imgs diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/api/ops.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/api/ops.rst new file mode 100644 index 0000000000000000000000000000000000000000..b0290457bfa0c08f14d7fe346efccb33f388bdae --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/api/ops.rst @@ -0,0 +1,135 @@ +.. role:: hidden + :class: hidden-section + +mmcv.ops +=================================== + +.. contents:: mmcv.ops + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.ops + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + BorderAlign + CARAFE + CARAFENaive + CARAFEPack + Conv2d + ConvTranspose2d + CornerPool + Correlation + CrissCrossAttention + DeformConv2d + DeformConv2dPack + DeformRoIPool + DeformRoIPoolPack + DynamicScatter + FusedBiasLeakyReLU + GroupAll + Linear + MaskedConv2d + MaxPool2d + ModulatedDeformConv2d + ModulatedDeformConv2dPack + ModulatedDeformRoIPoolPack + MultiScaleDeformableAttention + PSAMask + PointsSampler + PrRoIPool + QueryAndGroup + RiRoIAlignRotated + RoIAlign + RoIAlignRotated + RoIAwarePool3d + RoIPointPool3d + RoIPool + SAConv2d + SigmoidFocalLoss + SimpleRoIAlign + SoftmaxFocalLoss + SparseConv2d + SparseConv3d + SparseConvTensor + SparseConvTranspose2d + SparseConvTranspose3d + SparseInverseConv2d + SparseInverseConv3d + SparseMaxPool2d + SparseMaxPool3d + SparseModule + SparseSequential + SubMConv2d + SubMConv3d + SyncBatchNorm + TINShift + Voxelization + +.. autosummary:: + :toctree: generated + :nosignatures: + + active_rotated_filter + assign_score_withk + ball_query + batched_nms + bbox_overlaps + border_align + box_iou_rotated + boxes_iou3d + boxes_iou_bev + boxes_overlap_bev + carafe + carafe_naive + chamfer_distance + contour_expand + convex_giou + convex_iou + deform_conv2d + deform_roi_pool + diff_iou_rotated_2d + diff_iou_rotated_3d + dynamic_scatter + furthest_point_sample + furthest_point_sample_with_dist + fused_bias_leakyrelu + gather_points + grouping_operation + knn + masked_conv2d + min_area_polygons + modulated_deform_conv2d + nms + nms3d + nms3d_normal + nms_bev + nms_match + nms_normal_bev + nms_rotated + pixel_group + point_sample + points_in_boxes_all + points_in_boxes_cpu + points_in_boxes_part + points_in_polygons + prroi_pool + rel_roi_point_to_rel_img_point + riroi_align_rotated + roi_align + roi_align_rotated + roi_pool + rotated_feature_align + scatter_nd + sigmoid_focal_loss + soft_nms + softmax_focal_loss + three_interpolate + three_nn + tin_shift + upfirdn2d + voxelization diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/api/transforms.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/api/transforms.rst new file mode 100644 index 0000000000000000000000000000000000000000..b080133d6b7736398b855174c325169b8af92aae --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/api/transforms.rst @@ -0,0 +1,60 @@ +.. role:: hidden + :class: hidden-section + +mmcv.transforms +=================================== + +.. currentmodule:: mmcv.transforms + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + BaseTransform + TestTimeAug + +Loading +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + LoadAnnotations + LoadImageFromFile + +Processing +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + CenterCrop + MultiScaleFlipAug + Normalize + Pad + RandomChoiceResize + RandomFlip + RandomGrayscale + RandomResize + Resize + ToTensor + ImageToTensor + +Wrapper +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + Compose + KeyMapper + RandomApply + RandomChoice + TransformBroadcaster diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/api/utils.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/api/utils.rst new file mode 100644 index 0000000000000000000000000000000000000000..f2ff4c2a3872bc9ae0c2942debac5e5b523bd071 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/api/utils.rst @@ -0,0 +1,23 @@ +.. role:: hidden + :class: hidden-section + +mmcv.utils +=================================== + +.. contents:: mmcv.utils + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.utils + +.. autosummary:: + :toctree: generated + :nosignatures: + + IS_CUDA_AVAILABLE + IS_MLU_AVAILABLE + IS_MPS_AVAILABLE + collect_env + jit + skip_no_elena diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/api/video.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/api/video.rst new file mode 100644 index 0000000000000000000000000000000000000000..a6ebca0eb73afcf3f3f11aae8520e2782a310f13 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/api/video.rst @@ -0,0 +1,56 @@ +.. role:: hidden + :class: hidden-section + +mmcv.video +=================================== + +.. contents:: mmcv.video + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.video + +IO +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + VideoReader + Cache + +.. autosummary:: + :toctree: generated + :nosignatures: + + frames2video + +Optical Flow +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + dequantize_flow + flow_from_bytes + flow_warp + flowread + flowwrite + quantize_flow + sparse_flow_from_bytes + +Video Processing +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + concat_video + convert_video + cut_video + resize_video diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/api/visualization.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/api/visualization.rst new file mode 100644 index 0000000000000000000000000000000000000000..8f43ef27a441dcd9001a352cf18e97f8e615676d --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/api/visualization.rst @@ -0,0 +1,50 @@ +.. role:: hidden + :class: hidden-section + +mmcv.visualization +=================================== + +.. contents:: mmcv.visualization + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcv.visualization + +Color +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + Color + +.. autosummary:: + :toctree: generated + :nosignatures: + + color_val + +Image +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + imshow + imshow_bboxes + imshow_det_bboxes + +Optical Flow +---------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + + flow2rgb + flowshow + make_color_wheel diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/community/code_style.md b/FoodSeg103/demo/mmcv/docs/zh_cn/community/code_style.md new file mode 100644 index 0000000000000000000000000000000000000000..8ddb87c2391e07b848aa073287cc2a230da8c3ec --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/community/code_style.md @@ -0,0 +1,609 @@ +## 代码规范 + +### 代码规范标准 + +#### PEP 8 —— Python 官方代码规范 + +[Python 官方的代码风格指南](https://www.python.org/dev/peps/pep-0008/),包含了以下几个方面的内容: + +- 代码布局,介绍了 Python 中空行、断行以及导入相关的代码风格规范。比如一个常见的问题:当我的代码较长,无法在一行写下时,何处可以断行? + +- 表达式,介绍了 Python 中表达式空格相关的一些风格规范。 + +- 尾随逗号相关的规范。当列表较长,无法一行写下而写成如下逐行列表时,推荐在末项后加逗号,从而便于追加选项、版本控制等。 + + ```python + # Correct: + FILES = ['setup.cfg', 'tox.ini'] + # Correct: + FILES = [ + 'setup.cfg', + 'tox.ini', + ] + # Wrong: + FILES = ['setup.cfg', 'tox.ini',] + # Wrong: + FILES = [ + 'setup.cfg', + 'tox.ini' + ] + ``` + +- 命名相关规范、注释相关规范、类型注解相关规范,我们将在后续章节中做详细介绍。 + + "A style guide is about consistency. Consistency with this style guide is important. Consistency within a project is more important. Consistency within one module or function is the most important." PEP 8 -- Style Guide for Python Code + +:::{note} +PEP 8 的代码规范并不是绝对的,项目内的一致性要优先于 PEP 8 的规范。OpenMMLab 各个项目都在 setup.cfg 设定了一些代码规范的设置,请遵照这些设置。一个例子是在 PEP 8 中有如下一个例子: + +```python +# Correct: +hypot2 = x*x + y*y +# Wrong: +hypot2 = x * x + y * y +``` + +这一规范是为了指示不同优先级,但 OpenMMLab 的设置中通常没有启用 yapf 的 `ARITHMETIC_PRECEDENCE_INDICATION` 选项,因而格式规范工具不会按照推荐样式格式化,以设置为准。 +::: + +#### Google 开源项目风格指南 + +[Google 使用的编程风格指南](https://google.github.io/styleguide/pyguide.html),包括了 Python 相关的章节。相较于 PEP 8,该指南提供了更为详尽的代码指南。该指南包括了语言规范和风格规范两个部分。 + +其中,语言规范对 Python 中很多语言特性进行了优缺点的分析,并给出了使用指导意见,如异常、Lambda 表达式、列表推导式、metaclass 等。 + +风格规范的内容与 PEP 8 较为接近,大部分约定建立在 PEP 8 的基础上,也有一些更为详细的约定,如函数长度、TODO 注释、文件与 socket 对象的访问等。 + +推荐将该指南作为参考进行开发,但不必严格遵照,一来该指南存在一些 Python 2 兼容需求,例如指南中要求所有无基类的类应当显式地继承 Object, 而在仅使用 Python 3 的环境中,这一要求是不必要的,依本项目中的惯例即可。二来 OpenMMLab 的项目作为框架级的开源软件,不必对一些高级技巧过于避讳,尤其是 MMCV。但尝试使用这些技巧前应当认真考虑是否真的有必要,并寻求其他开发人员的广泛评估。 + +另外需要注意的一处规范是关于包的导入,在该指南中,要求导入本地包时必须使用路径全称,且导入的每一个模块都应当单独成行,通常这是不必要的,而且也不符合目前项目的开发惯例,此处进行如下约定: + +```python +# Correct +from mmcv.cnn.bricks import (Conv2d, build_norm_layer, DropPath, MaxPool2d, + Linear) +from ..utils import ext_loader + +# Wrong +from mmcv.cnn.bricks import Conv2d, build_norm_layer, DropPath, MaxPool2d, \ + Linear # 使用括号进行连接,而不是反斜杠 +from ...utils import is_str # 最多向上回溯一层,过多的回溯容易导致结构混乱 +``` + +OpenMMLab 项目使用 pre-commit 工具自动格式化代码,详情见[贡献代码](./contributing.md#代码风格)。 + +### 命名规范 + +#### 命名规范的重要性 + +优秀的命名是良好代码可读的基础。基础的命名规范对各类变量的命名做了要求,使读者可以方便地根据代码名了解变量是一个类 / 局部变量 / 全局变量等。而优秀的命名则需要代码作者对于变量的功能有清晰的认识,以及良好的表达能力,从而使读者根据名称就能了解其含义,甚至帮助了解该段代码的功能。 + +#### 基础命名规范 + +| 类型 | 公有 | 私有 | +| --------------- | ---------------- | ------------------ | +| 模块 | lower_with_under | \_lower_with_under | +| 包 | lower_with_under | | +| 类 | CapWords | \_CapWords | +| 异常 | CapWordsError | | +| 函数(方法) | lower_with_under | \_lower_with_under | +| 函数 / 方法参数 | lower_with_under | | +| 全局 / 类内常量 | CAPS_WITH_UNDER | \_CAPS_WITH_UNDER | +| 全局 / 类内变量 | lower_with_under | \_lower_with_under | +| 变量 | lower_with_under | \_lower_with_under | +| 局部变量 | lower_with_under | | + +注意: + +- 尽量避免变量名与保留字冲突,特殊情况下如不可避免,可使用一个后置下划线,如 class\_ +- 尽量不要使用过于简单的命名,除了约定俗成的循环变量 i,文件变量 f,错误变量 e 等。 +- 不会被用到的变量可以命名为 \_,逻辑检查器会将其忽略。 + +#### 命名技巧 + +良好的变量命名需要保证三点: + +1. 含义准确,没有歧义 +2. 长短适中 +3. 前后统一 + +```python +# Wrong +class Masks(metaclass=ABCMeta): # 命名无法表现基类;Instance or Semantic? + pass + +# Correct +class BaseInstanceMasks(metaclass=ABCMeta): + pass + +# Wrong,不同地方含义相同的变量尽量用统一的命名 +def __init__(self, inplanes, planes): + pass + +def __init__(self, in_channels, out_channels): + pass +``` + +常见的函数命名方法: + +- 动宾命名法:crop_img, init_weights +- 动宾倒置命名法:imread, bbox_flip + +注意函数命名与参数的顺序,保证主语在前,符合语言习惯: + +- check_keys_exist(key, container) +- check_keys_contain(container, key) + +注意避免非常规或统一约定的缩写,如 nb -> num_blocks,in_nc -> in_channels + +### docstring 规范 + +#### 为什么要写 docstring + +docstring 是对一个类、一个函数功能与 API 接口的详细描述,有两个功能,一是帮助其他开发者了解代码功能,方便 debug 和复用代码;二是在 Readthedocs 文档中自动生成相关的 API reference 文档,帮助不了解源代码的社区用户使用相关功能。 + +#### 如何写 docstring + +与注释不同,一份规范的 docstring 有着严格的格式要求,以便于 Python 解释器以及 sphinx 进行文档解析,详细的 docstring 约定参见 [PEP 257](https://www.python.org/dev/peps/pep-0257/)。此处以例子的形式介绍各种文档的标准格式,参考格式为 [Google 风格](https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/#comments)。 + +1. 模块文档 + + 代码风格规范推荐为每一个模块(即 Python 文件)编写一个 docstring,但目前 OpenMMLab 项目大部分没有此类 docstring,因此不做硬性要求。 + + ```python + """A one line summary of the module or program, terminated by a period. + + Leave one blank line. The rest of this docstring should contain an + overall description of the module or program. Optionally, it may also + contain a brief description of exported classes and functions and/or usage + examples. + + Typical usage example: + + foo = ClassFoo() + bar = foo.FunctionBar() + """ + ``` + +2. 类文档 + + 类文档是我们最常需要编写的,此处,按照 OpenMMLab 的惯例,我们使用了与 Google 风格不同的写法。如下例所示,文档中没有使用 Attributes 描述类属性,而是使用 Args 描述 __init__ 函数的参数。 + + 在 Args 中,遵照 `parameter (type): Description.` 的格式,描述每一个参数类型和功能。其中,多种类型可使用 `(float or str)` 的写法,可以为 None 的参数可以写为 `(int, optional)`。 + + ```python + class BaseRunner(metaclass=ABCMeta): + """The base class of Runner, a training helper for PyTorch. + + All subclasses should implement the following APIs: + + - ``run()`` + - ``train()`` + - ``val()`` + - ``save_checkpoint()`` + + Args: + model (:obj:`torch.nn.Module`): The model to be run. + batch_processor (callable, optional): A callable method that process + a data batch. The interface of this method should be + ``batch_processor(model, data, train_mode) -> dict``. + Defaults to None. + optimizer (dict or :obj:`torch.optim.Optimizer`, optional): It can be + either an optimizer (in most cases) or a dict of optimizers + (in models that requires more than one optimizer, e.g., GAN). + Defaults to None. + work_dir (str, optional): The working directory to save checkpoints + and logs. Defaults to None. + logger (:obj:`logging.Logger`): Logger used during training. + Defaults to None. (The default value is just for backward + compatibility) + meta (dict, optional): A dict records some import information such as + environment info and seed, which will be logged in logger hook. + Defaults to None. + max_epochs (int, optional): Total training epochs. Defaults to None. + max_iters (int, optional): Total training iterations. Defaults to None. + """ + + def __init__(self, + model, + batch_processor=None, + optimizer=None, + work_dir=None, + logger=None, + meta=None, + max_iters=None, + max_epochs=None): + ... + ``` + + 另外,在一些算法实现的主体类中,建议加入原论文的链接;如果参考了其他开源代码的实现,则应加入 modified from,而如果是直接复制了其他代码库的实现,则应加入 copied from ,并注意源码的 License。如有必要,也可以通过 .. math:: 来加入数学公式 + + ```python + # 参考实现 + # This func is modified from `detectron2 + # `_. + + # 复制代码 + # This code was copied from the `ubelt + # library`_. + + # 引用论文 & 添加公式 + class LabelSmoothLoss(nn.Module): + r"""Initializer for the label smoothed cross entropy loss. + + Refers to `Rethinking the Inception Architecture for Computer Vision + `_. + + This decreases gap between output scores and encourages generalization. + Labels provided to forward can be one-hot like vectors (NxC) or class + indices (Nx1). + And this accepts linear combination of one-hot like labels from mixup or + cutmix except multi-label task. + + Args: + label_smooth_val (float): The degree of label smoothing. + num_classes (int, optional): Number of classes. Defaults to None. + mode (str): Refers to notes, Options are "original", "classy_vision", + "multi_label". Defaults to "classy_vision". + reduction (str): The method used to reduce the loss. + Options are "none", "mean" and "sum". Defaults to 'mean'. + loss_weight (float): Weight of the loss. Defaults to 1.0. + + Note: + if the ``mode`` is "original", this will use the same label smooth + method as the original paper as: + + .. math:: + (1-\epsilon)\delta_{k, y} + \frac{\epsilon}{K} + + where :math:`\epsilon` is the ``label_smooth_val``, :math:`K` is + the ``num_classes`` and :math:`\delta_{k,y}` is Dirac delta, + which equals 1 for k=y and 0 otherwise. + + if the ``mode`` is "classy_vision", this will use the same label + smooth method as the `facebookresearch/ClassyVision + `_ repo as: + + .. math:: + \frac{\delta_{k, y} + \epsilon/K}{1+\epsilon} + + if the ``mode`` is "multi_label", this will accept labels from + multi-label task and smoothing them as: + + .. math:: + (1-2\epsilon)\delta_{k, y} + \epsilon + ``` + +```{note} +注意 \`\`here\`\`、\`here\`、"here" 三种引号功能是不同。 + +在 reStructured 语法中,\`\`here\`\` 表示一段代码;\`here\` 表示斜体;"here" 无特殊含义,一般可用来表示字符串。其中 \`here\` 的用法与 Markdown 中不同,需要多加留意。 +另外还有 :obj:\`type\` 这种更规范的表示类的写法,但鉴于长度,不做特别要求,一般仅用于表示非常用类型。 +``` + +3. 方法(函数)文档 + + 函数文档与类文档的结构基本一致,但需要加入返回值文档。对于较为复杂的函数和类,可以使用 Examples 字段加入示例;如果需要对参数加入一些较长的备注,可以加入 Note 字段进行说明。 + + 对于使用较为复杂的类或函数,比起看大段大段的说明文字和参数文档,添加合适的示例更能帮助用户迅速了解其用法。需要注意的是,这些示例最好是能够直接在 Python 交互式环境中运行的,并给出一些相对应的结果。如果存在多个示例,可以使用注释简单说明每段示例,也能起到分隔作用。 + + ```python + def import_modules_from_strings(imports, allow_failed_imports=False): + """Import modules from the given list of strings. + + Args: + imports (list | str | None): The given module names to be imported. + allow_failed_imports (bool): If True, the failed imports will return + None. Otherwise, an ImportError is raise. Defaults to False. + + Returns: + List[module] | module | None: The imported modules. + All these three lines in docstring will be compiled into the same + line in readthedocs. + + Examples: + >>> osp, sys = import_modules_from_strings( + ... ['os.path', 'sys']) + >>> import os.path as osp_ + >>> import sys as sys_ + >>> assert osp == osp_ + >>> assert sys == sys_ + """ + ... + ``` + + 如果函数接口在某个版本发生了变化,需要在 docstring 中加入相关的说明,必要时添加 Note 或者 Warning 进行说明,例如: + + ```python + class CheckpointHook(Hook): + """Save checkpoints periodically. + + Args: + out_dir (str, optional): The root directory to save checkpoints. If + not specified, ``runner.work_dir`` will be used by default. If + specified, the ``out_dir`` will be the concatenation of + ``out_dir`` and the last level directory of ``runner.work_dir``. + Defaults to None. `Changed in version 1.3.15.` + file_client_args (dict, optional): Arguments to instantiate a + FileClient. See :class:`mmcv.fileio.FileClient` for details. + Defaults to None. `New in version 1.3.15.` + + Warning: + Before v1.3.15, the ``out_dir`` argument indicates the path where the + checkpoint is stored. However, in v1.3.15 and later, ``out_dir`` + indicates the root directory and the final path to save checkpoint is + the concatenation of out_dir and the last level directory of + ``runner.work_dir``. Suppose the value of ``out_dir`` is + "/path/of/A" and the value of ``runner.work_dir`` is "/path/of/B", + then the final path will be "/path/of/A/B". + ``` + + 如果参数或返回值里带有需要展开描述字段的 dict,则应该采用如下格式: + + ```python + def func(x): + r""" + Args: + x (None): A dict with 2 keys, ``padded_targets``, and ``targets``. + + - ``targets`` (list[Tensor]): A list of tensors. + Each tensor has the shape of :math:`(T_i)`. Each + element is the index of a character. + - ``padded_targets`` (Tensor): A tensor of shape :math:`(N)`. + Each item is the length of a word. + + Returns: + dict: A dict with 2 keys, ``padded_targets``, and ``targets``. + + - ``targets`` (list[Tensor]): A list of tensors. + Each tensor has the shape of :math:`(T_i)`. Each + element is the index of a character. + - ``padded_targets`` (Tensor): A tensor of shape :math:`(N)`. + Each item is the length of a word. + """ + return x + ``` + +```{important} +为了生成 readthedocs 文档,文档的编写需要按照 ReStructrued 文档格式,否则会产生文档渲染错误,在提交 PR 前,最好生成并预览一下文档效果。 +语法规范参考: + +- [reStructuredText Primer - Sphinx documentation](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#) +- [Example Google Style Python Docstrings ‒ napoleon 0.7 documentation](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html#example-google) +``` + +### 注释规范 + +#### 为什么要写注释 + +对于一个开源项目,团队合作以及社区之间的合作是必不可少的,因而尤其要重视合理的注释。不写注释的代码,很有可能过几个月自己也难以理解,造成额外的阅读和修改成本。 + +#### 如何写注释 + +最需要写注释的是代码中那些技巧性的部分。如果你在下次代码审查的时候必须解释一下,那么你应该现在就给它写注释。对于复杂的操作,应该在其操作开始前写上若干行注释。对于不是一目了然的代码,应在其行尾添加注释。 +—— Google 开源项目风格指南 + +```python +# We use a weighted dictionary search to find out where i is in +# the array. We extrapolate position based on the largest num +# in the array and the array size and then do binary search to +# get the exact number. +if i & (i-1) == 0: # True if i is 0 or a power of 2. +``` + +为了提高可读性, 注释应该至少离开代码2个空格. +另一方面, 绝不要描述代码. 假设阅读代码的人比你更懂Python, 他只是不知道你的代码要做什么. +—— Google 开源项目风格指南 + +```python +# Wrong: +# Now go through the b array and make sure whenever i occurs +# the next element is i+1 + +# Wrong: +if i & (i-1) == 0: # True if i bitwise and i-1 is 0. +``` + +在注释中,可以使用 Markdown 语法,因为开发人员通常熟悉 Markdown 语法,这样可以便于交流理解,如可使用单反引号表示代码和变量(注意不要和 docstring 中的 ReStructured 语法混淆) + +```python +# `_reversed_padding_repeated_twice` is the padding to be passed to +# `F.pad` if needed (e.g., for non-zero padding types that are +# implemented as two ops: padding + conv). `F.pad` accepts paddings in +# reverse order than the dimension. +self._reversed_padding_repeated_twice = _reverse_repeat_tuple(self.padding, 2) +``` + +#### 注释示例 + +1. 出自 `mmcv/utils/registry.py`,对于较为复杂的逻辑结构,通过注释,明确了优先级关系。 + + ```python + # self.build_func will be set with the following priority: + # 1. build_func + # 2. parent.build_func + # 3. build_from_cfg + if build_func is None: + if parent is not None: + self.build_func = parent.build_func + else: + self.build_func = build_from_cfg + else: + self.build_func = build_func + ``` + +2. 出自 `mmcv/runner/checkpoint.py`,对于 bug 修复中的一些特殊处理,可以附带相关的 issue 链接,帮助其他人了解 bug 背景。 + + ```python + def _save_ckpt(checkpoint, file): + # The 1.6 release of PyTorch switched torch.save to use a new + # zipfile-based file format. It will cause RuntimeError when a + # checkpoint was saved in high version (PyTorch version>=1.6.0) but + # loaded in low version (PyTorch version<1.6.0). More details at + # https://github.com/open-mmlab/mmpose/issues/904 + if digit_version(TORCH_VERSION) >= digit_version('1.6.0'): + torch.save(checkpoint, file, _use_new_zipfile_serialization=False) + else: + torch.save(checkpoint, file) + ``` + +### 类型注解 + +#### 为什么要写类型注解 + +类型注解是对函数中变量的类型做限定或提示,为代码的安全性提供保障、增强代码的可读性、避免出现类型相关的错误。 +Python 没有对类型做强制限制,类型注解只起到一个提示作用,通常你的 IDE 会解析这些类型注解,然后在你调用相关代码时对类型做提示。另外也有类型注解检查工具,这些工具会根据类型注解,对代码中可能出现的问题进行检查,减少 bug 的出现。 +需要注意的是,通常我们不需要注释模块中的所有函数: + +1. 公共的 API 需要注释 +2. 在代码的安全性,清晰性和灵活性上进行权衡是否注释 +3. 对于容易出现类型相关的错误的代码进行注释 +4. 难以理解的代码请进行注释 +5. 若代码中的类型已经稳定,可以进行注释. 对于一份成熟的代码,多数情况下,即使注释了所有的函数,也不会丧失太多的灵活性. + +#### 如何写类型注解 + +1. 函数 / 方法类型注解,通常不对 self 和 cls 注释。 + + ```python + from typing import Optional, List, Tuple + + # 全部位于一行 + def my_method(self, first_var: int) -> int: + pass + + # 另起一行 + def my_method( + self, first_var: int, + second_var: float) -> Tuple[MyLongType1, MyLongType1, MyLongType1]: + pass + + # 单独成行(具体的应用场合与行宽有关,建议结合 yapf 自动化格式使用) + def my_method( + self, first_var: int, second_var: float + ) -> Tuple[MyLongType1, MyLongType1, MyLongType1]: + pass + + # 引用尚未被定义的类型 + class MyClass: + def __init__(self, + stack: List["MyClass"]) -> None: + pass + ``` + + 注:类型注解中的类型可以是 Python 内置类型,也可以是自定义类,还可以使用 Python 提供的 wrapper 类对类型注解进行装饰,一些常见的注解如下: + + ```python + # 数值类型 + from numbers import Number + + # 可选类型,指参数可以为 None + from typing import Optional + def foo(var: Optional[int] = None): + pass + + # 联合类型,指同时接受多种类型 + from typing import Union + def foo(var: Union[float, str]): + pass + + from typing import Sequence # 序列类型 + from typing import Iterable # 可迭代类型 + from typing import Any # 任意类型 + from typing import Callable # 可调用类型 + + from typing import List, Dict # 列表和字典的泛型类型 + from typing import Tuple # 元组的特殊格式 + # 虽然在 Python 3.9 中,list, tuple 和 dict 本身已支持泛型,但为了支持之前的版本 + # 我们在进行类型注解时还是需要使用 List, Tuple, Dict 类型 + # 另外,在对参数类型进行注解时,尽量使用 Sequence & Iterable & Mapping + # List, Tuple, Dict 主要用于返回值类型注解 + # 参见 https://docs.python.org/3/library/typing.html#typing.List + ``` + +2. 变量类型注解,一般用于难以直接推断其类型时 + + ```python + # Recommend: 带类型注解的赋值 + a: Foo = SomeUndecoratedFunction() + a: List[int]: [1, 2, 3] # List 只支持单一类型泛型,可使用 Union + b: Tuple[int, int] = (1, 2) # 长度固定为 2 + c: Tuple[int, ...] = (1, 2, 3) # 变长 + d: Dict[str, int] = {'a': 1, 'b': 2} + + # Not Recommend:行尾类型注释 + # 虽然这种方式被写在了 Google 开源指南中,但这是一种为了支持 Python 2.7 版本 + # 而补充的注释方式,鉴于我们只支持 Python 3, 为了风格统一,不推荐使用这种方式。 + a = SomeUndecoratedFunction() # type: Foo + a = [1, 2, 3] # type: List[int] + b = (1, 2, 3) # type: Tuple[int, ...] + c = (1, "2", 3.5) # type: Tuple[int, Text, float] + ``` + +3. 泛型 + + 上文中我们知道,typing 中提供了 list 和 dict 的泛型类型,那么我们自己是否可以定义类似的泛型呢? + + ```python + from typing import TypeVar, Generic + + KT = TypeVar('KT') + VT = TypeVar('VT') + + class Mapping(Generic[KT, VT]): + def __init__(self, data: Dict[KT, VT]): + self._data = data + + def __getitem__(self, key: KT) -> VT: + return self._data[key] + ``` + + 使用上述方法,我们定义了一个拥有泛型能力的映射类,实际用法如下: + + ```python + mapping = Mapping[str, float]({'a': 0.5}) + value: float = example['a'] + ``` + + 另外,我们也可以利用 TypeVar 在函数签名中指定联动的多个类型: + + ```python + from typing import TypeVar, List + + T = TypeVar('T') # Can be anything + A = TypeVar('A', str, bytes) # Must be str or bytes + + + def repeat(x: T, n: int) -> List[T]: + """Return a list containing n references to x.""" + return [x]*n + + + def longest(x: A, y: A) -> A: + """Return the longest of two strings.""" + return x if len(x) >= len(y) else y + ``` + +更多关于类型注解的写法请参考 [typing](https://docs.python.org/3/library/typing.html)。 + +#### 类型注解检查工具 + +[mypy](https://mypy.readthedocs.io/en/stable/) 是一个 Python 静态类型检查工具。根据你的类型注解,mypy 会检查传参、赋值等操作是否符合类型注解,从而避免可能出现的 bug。 + +例如如下的一个 Python 脚本文件 test.py: + +```python +def foo(var: int) -> float: + return float(var) + +a: str = foo('2.0') +b: int = foo('3.0') # type: ignore +``` + +运行 mypy test.py 可以得到如下检查结果,分别指出了第 4 行在函数调用和返回值赋值两处类型错误。而第 5 行同样存在两个类型错误,由于使用了 type: ignore 而被忽略了,只有部分特殊情况可能需要此类忽略。 + +``` +test.py:4: error: Incompatible types in assignment (expression has type "float", variable has type "int") +test.py:4: error: Argument 1 to "foo" has incompatible type "str"; expected "int" +Found 2 errors in 1 file (checked 1 source file) +``` diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/community/contributing.md b/FoodSeg103/demo/mmcv/docs/zh_cn/community/contributing.md new file mode 100644 index 0000000000000000000000000000000000000000..3805223a220aba26e9bed2776a610b7a0f055f8d --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/community/contributing.md @@ -0,0 +1,278 @@ +## 贡献代码 + +欢迎加入 MMCV 社区,我们致力于打造最前沿的计算机视觉基础库,我们欢迎任何类型的贡献,包括但不限于 + +**修复错误** + +修复代码实现错误的步骤如下: + +1. 如果提交的代码改动较大,建议先提交 issue,并正确描述 issue 的现象、原因和复现方式,讨论后确认修复方案。 +2. 修复错误并补充相应的单元测试,提交拉取请求。 + +**新增功能或组件** + +1. 如果新功能或模块涉及较大的代码改动,建议先提交 issue,确认功能的必要性。 +2. 实现新增功能并添单元测试,提交拉取请求。 + +**文档补充** + +修复文档可以直接提交拉取请求 + +添加文档或将文档翻译成其他语言步骤如下 + +1. 提交 issue,确认添加文档的必要性。 +2. 添加文档,提交拉取请求。 + +### 拉取请求工作流 + +如果你对拉取请求不了解,没关系,接下来的内容将会从零开始,一步一步地指引你如何创建一个拉取请求。如果你想深入了解拉取请求的开发模式,可以参考 github [官方文档](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) + +#### 1. 复刻仓库 + +当你第一次提交拉取请求时,先复刻 OpenMMLab 原代码库,点击 GitHub 页面右上角的 **Fork** 按钮,复刻后的代码库将会出现在你的 GitHub 个人主页下。 + + + +将代码克隆到本地 + +```shell +git clone git@github.com:{username}/mmcv.git +``` + +添加原代码库为上游代码库 + +```bash +git remote add upstream git@github.com:open-mmlab/mmcv +``` + +检查 remote 是否添加成功,在终端输入 `git remote -v` + +```bash +origin git@github.com:{username}/mmcv.git (fetch) +origin git@github.com:{username}/mmcv.git (push) +upstream git@github.com:open-mmlab/mmcv (fetch) +upstream git@github.com:open-mmlab/mmcv (push) +``` + +```{note} +这里对 origin 和 upstream 进行一个简单的介绍,当我们使用 git clone 来克隆代码时,会默认创建一个 origin 的 remote,它指向我们克隆的代码库地址,而 upstream 则是我们自己添加的,用来指向原始代码库地址。当然如果你不喜欢他叫 upstream,也可以自己修改,比如叫 open-mmlab。我们通常向 origin 提交代码(即 fork 下来的远程仓库),然后向 upstream 提交一个 pull request。如果提交的代码和最新的代码发生冲突,再从 upstream 拉取最新的代码,和本地分支解决冲突,再提交到 origin。 +``` + +#### 2. 配置 pre-commit + +在本地开发环境中,我们使用 [pre-commit](https://pre-commit.com/#intro) 来检查代码风格,以确保代码风格的统一。在提交代码,需要先安装 pre-commit(需要在 MMCV 目录下执行): + +```shell +pip install -U pre-commit +pre-commit install +``` + +检查 pre-commit 是否配置成功,并安装 `.pre-commit-config.yaml` 中的钩子: + +```shell +pre-commit run --all-files +``` + + + + + +```{note} +如果你是中国用户,由于网络原因,可能会出现安装失败的情况,这时可以使用国内源 + +pre-commit install -c .pre-commit-config-zh-cn.yaml + +pre-commit run --all-files -c .pre-commit-config-zh-cn.yaml +``` + +如果安装过程被中断,可以重复执行 `pre-commit run ...` 继续安装。 + +如果提交的代码不符合代码风格规范,pre-commit 会发出警告,并自动修复部分错误。 + + + +如果我们想临时绕开 pre-commit 的检查提交一次代码,可以在 `git commit` 时加上 `--no-verify`(需要保证最后推送至远程仓库的代码能够通过 pre-commit 检查)。 + +```shell +git commit -m "xxx" --no-verify +``` + +#### 3. 创建开发分支 + +安装完 pre-commit 之后,我们需要基于 main 创建开发分支,建议的分支命名规则为 `username/pr_name`。 + +```shell +git checkout -b yhc/refactor_contributing_doc +``` + +在后续的开发中,如果本地仓库的 main 分支落后于 upstream 的 main 分支,我们需要先拉取 upstream 的代码进行同步,再执行上面的命令 + +```shell +git pull upstream main +``` + +#### 4. 提交代码并在本地通过单元测试 + +- MMCV 引入了 mypy 来做静态类型检查,以增加代码的鲁棒性。因此我们在提交代码时,需要补充 Type Hints。具体规则可以参考[教程](https://zhuanlan.zhihu.com/p/519335398)。 + +- 提交的代码同样需要通过单元测试 + + ```shell + # 通过全量单元测试 + pytest tests + + # 我们需要保证提交的代码能够通过修改模块的单元测试,以 runner 为例 + pytest tests/test_runner/test_runner.py + ``` + + 如果你由于缺少依赖无法运行修改模块的单元测试,可以参考[指引-单元测试](#单元测试) + +- 如果修改/添加了文档,参考[指引](#文档渲染)确认文档渲染正常。 + +#### 5. 推送代码到远程 + +代码通过单元测试和 pre-commit 检查后,将代码推送到远程仓库,如果是第一次推送,可以在 `git push` 后加上 `-u` 参数以关联远程分支 + +```shell +git push -u origin {branch_name} +``` + +这样下次就可以直接使用 `git push` 命令推送代码了,而无需指定分支和远程仓库。 + +#### 6. 提交拉取请求(PR) + +(1) 在 GitHub 的 Pull request 界面创建拉取请求 + + +(2) 根据指引修改 PR 描述,以便于其他开发者更好地理解你的修改 + + + +描述规范详见[拉取请求规范](#拉取请求规范) + +  + +**注意事项** + +(a) PR 描述应该包含修改理由、修改内容以及修改后带来的影响,并关联相关 Issue(具体方式见[文档](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)) + +(b) 如果是第一次为 OpenMMLab 做贡献,需要签署 CLA + + + +(c) 检查提交的 PR 是否通过 CI(集成测试) + + + +MMCV 会在不同的平台(Linux、Window、Mac),基于不同版本的 Python、PyTorch、CUDA 对提交的代码进行单元测试,以保证代码的正确性,如果有任何一个没有通过,我们可点击上图中的 `Details` 来查看具体的测试信息,以便于我们修改代码。 + +(3) 如果 PR 通过了 CI,那么就可以等待其他开发者的 review,并根据 reviewer 的意见,修改代码,并重复 [4](#4-提交代码并本地通过单元测试)-[5](#5-推送代码到远程) 步骤,直到 reviewer 同意合入 PR。 + + + +所有 reviewer 同意合入 PR 后,我们会尽快将 PR 合并到主分支。 + +#### 7. 解决冲突 + +随着时间的推移,我们的代码库会不断更新,这时候,如果你的 PR 与主分支存在冲突,你需要解决冲突,解决冲突的方式有两种: + +```shell +git fetch --all --prune +git rebase upstream/main +``` + +或者 + +```shell +git fetch --all --prune +git merge upstream/main +``` + +如果你非常善于处理冲突,那么可以使用 rebase 的方式来解决冲突,因为这能够保证你的 commit log 的整洁。如果你不太熟悉 `rebase` 的使用,那么可以使用 `merge` 的方式来解决冲突。 + +### 指引 + +#### 单元测试 + +如果你无法正常执行部分模块的单元测试,例如 [video](https://github.com/open-mmlab/mmcv/tree/main/mmcv/video) 模块,可能是你的当前环境没有安装以下依赖 + +```shell +# Linux +sudo apt-get update -y +sudo apt-get install -y libturbojpeg +sudo apt-get install -y ffmpeg + +# Windows +conda install ffmpeg +``` + +在提交修复代码错误或新增特性的拉取请求时,我们应该尽可能的让单元测试覆盖所有提交的代码,计算单元测试覆盖率的方法如下 + +```shell +python -m coverage run -m pytest /path/to/test_file +python -m coverage html +# check file in htmlcov/index.html +``` + +#### 文档渲染 + +在提交修复代码错误或新增特性的拉取请求时,可能会需要修改/新增模块的 docstring。我们需要确认渲染后的文档样式是正确的。 +本地生成渲染后的文档的方法如下 + +```shell +pip install -r requirements/docs.txt +cd docs/zh_cn/ +# or docs/en +make html +# check file in ./docs/zh_cn/_build/html/index.html +``` + +### 代码风格 + +#### Python + +[PEP8](https://www.python.org/dev/peps/pep-0008/) 作为 OpenMMLab 算法库首选的代码规范,我们使用以下工具检查和格式化代码 + +- [flake8](https://github.com/PyCQA/flake8): Python 官方发布的代码规范检查工具,是多个检查工具的封装 +- [isort](https://github.com/timothycrosley/isort): 自动调整模块导入顺序的工具 +- [yapf](https://github.com/google/yapf): Google 发布的代码规范检查工具 +- [codespell](https://github.com/codespell-project/codespell): 检查单词拼写是否有误 +- [mdformat](https://github.com/executablebooks/mdformat): 检查 markdown 文件的工具 +- [docformatter](https://github.com/myint/docformatter): 格式化 docstring 的工具 + +yapf 和 isort 的配置可以在 [setup.cfg](./setup.cfg) 找到 + +通过配置 [pre-commit hook](https://pre-commit.com/) ,我们可以在提交代码时自动检查和格式化 `flake8`、`yapf`、`isort`、`trailing whitespaces`、`markdown files`, +修复 `end-of-files`、`double-quoted-strings`、`python-encoding-pragma`、`mixed-line-ending`,调整 `requirments.txt` 的包顺序。 +pre-commit 钩子的配置可以在 [.pre-commit-config](./.pre-commit-config.yaml) 找到。 + +pre-commit 具体的安装使用方式见[拉取请求](#2-配置-pre-commit)。 + +更具体的规范请参考 [OpenMMLab 代码规范](code_style.md)。 + +#### C++ and CUDA + +C++ 和 CUDA 的代码规范遵从 [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) + +### 拉取请求规范 + +1. 使用 [pre-commit hook](https://pre-commit.com),尽量减少代码风格相关问题 + +2. 一个`拉取请求`对应一个短期分支 + +3. 粒度要细,一个`拉取请求`只做一件事情,避免超大的`拉取请求` + + - Bad:实现 Faster R-CNN + - Acceptable:给 Faster R-CNN 添加一个 box head + - Good:给 box head 增加一个参数来支持自定义的 conv 层数 + +4. 每次 Commit 时需要提供清晰且有意义 commit 信息 + +5. 提供清晰且有意义的`拉取请求`描述 + + - 标题写明白任务名称,一般格式:\[Prefix\] Short description of the pull request (Suffix) + - prefix: 新增功能 \[Feature\], 修 bug \[Fix\], 文档相关 \[Docs\], 开发中 \[WIP\] (暂时不会被review) + - 描述里介绍`拉取请求`的主要修改内容,结果,以及对其他部分的影响, 参考`拉取请求`模板 + - 关联相关的`议题` (issue) 和其他`拉取请求` + +6. 如果引入了其他三方库,或借鉴了三方库的代码,请确认他们的许可证和 mmcv 兼容,并在借鉴的代码上补充 `This code is inspired from http://` diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/community/pr.md b/FoodSeg103/demo/mmcv/docs/zh_cn/community/pr.md new file mode 100644 index 0000000000000000000000000000000000000000..427fdf9e4965e404970c761676e7edd29e7b2e56 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/community/pr.md @@ -0,0 +1,3 @@ +## 拉取请求 + +本文档的内容已迁移到[贡献指南](contributing.md)。 diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/compatibility.md b/FoodSeg103/demo/mmcv/docs/zh_cn/compatibility.md new file mode 100644 index 0000000000000000000000000000000000000000..2729243f9fc8a5d82c6f7a9a90b9bbfa5accae1b --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/compatibility.md @@ -0,0 +1,231 @@ +### v2.0.0 + +OpenMMLab 团队于 2022 年 9 月 1 日在世界人工智能大会发布了新一代训练引擎 [MMEngine](https://github.com/open-mmlab/mmengine),它是一个用于训练深度学习模型的基础库。相比于 MMCV,它提供了更高级且通用的训练器、接口更加统一的开放架构以及可定制化程度更高的训练流程。 + +OpenMMLab 团队于 2023 年 4 月 6 日发布 MMCV [v2.0.0](https://github.com/open-mmlab/mmcv/releases/tag/v2.0.0)。在 2.x 版本中,它有以下重大变化: + +(1)删除了以下组件: + +- `mmcv.fileio` 模块,删除于 PR [#2179](https://github.com/open-mmlab/mmcv/pull/2179)。在需要使用 FileIO 的地方使用 mmengine 中的 FileIO 模块 +- `mmcv.runner`、`mmcv.parallel`、`mmcv.engine` 和 `mmcv.device`,删除于 PR [#2216](https://github.com/open-mmlab/mmcv/pull/2216) +- `mmcv.utils` 的所有类(例如 `Config` 和 `Registry`)和大部分函数,删除于 PR [#2217](https://github.com/open-mmlab/mmcv/pull/2217),只保留少数和 mmcv 相关的函数 +- `mmcv.onnx`、`mmcv.tensorrt` 模块以及相关的函数,删除于 PR [#2225](https://github.com/open-mmlab/mmcv/pull/2225) +- 删除 MMCV 所有的根注册器并将类或者函数注册到 MMEngine 的[根注册器](https://github.com/open-mmlab/mmengine/blob/main/mmengine/registry/root.py) + +(2)新增了 [`mmcv.transforms`](https://github.com/open-mmlab/mmcv/tree/main/mmcv/transforms) 数据变换模块 + +(3)在 PR [#2235](https://github.com/open-mmlab/mmcv/pull/2235) 中将包名 **mmcv** 重命名为 **mmcv-lite**、 **mmcv-full** 重命名为 **mmcv**。此外,将环境变量 `MMCV_WITH_OPS` 的默认值从 0 改为 1 + + + + + + + + + + + + +
MMCV < 2.0MMCV >= 2.0
+ +```bash +# 包含算子,因为 mmcv-full 的最高版本小于 2.0.0,所以无需加版本限制 +pip install openmim +mim install mmcv-full + +# 不包含算子 +pip install openmim +mim install "mmcv < 2.0.0" +``` + + + +```bash +# 包含算子 +pip install openmim +mim install mmcv + +# 不包含算子,因为 mmcv-lite 的起始版本为 2.0.0,所以无需加版本限制 +pip install openmim +mim install mmcv-lite +``` + +
+ +### v1.3.18 + +部分自定义算子对于不同的设备有不同实现,为此添加的大量宏命令与类型检查使得代码变得难以维护。例如: + +```c++ + if (input.device().is_cuda()) { +#ifdef MMCV_WITH_CUDA + CHECK_CUDA_INPUT(input); + CHECK_CUDA_INPUT(rois); + CHECK_CUDA_INPUT(output); + CHECK_CUDA_INPUT(argmax_y); + CHECK_CUDA_INPUT(argmax_x); + + roi_align_forward_cuda(input, rois, output, argmax_y, argmax_x, + aligned_height, aligned_width, spatial_scale, + sampling_ratio, pool_mode, aligned); +#else + AT_ERROR("RoIAlign is not compiled with GPU support"); +#endif + } else { + CHECK_CPU_INPUT(input); + CHECK_CPU_INPUT(rois); + CHECK_CPU_INPUT(output); + CHECK_CPU_INPUT(argmax_y); + CHECK_CPU_INPUT(argmax_x); + roi_align_forward_cpu(input, rois, output, argmax_y, argmax_x, + aligned_height, aligned_width, spatial_scale, + sampling_ratio, pool_mode, aligned); + } +``` + +为此我们设计了注册与分发的机制以更好的管理这些算子实现。 + +```c++ + +void ROIAlignForwardCUDAKernelLauncher(Tensor input, Tensor rois, Tensor output, + Tensor argmax_y, Tensor argmax_x, + int aligned_height, int aligned_width, + float spatial_scale, int sampling_ratio, + int pool_mode, bool aligned); + +void roi_align_forward_cuda(Tensor input, Tensor rois, Tensor output, + Tensor argmax_y, Tensor argmax_x, + int aligned_height, int aligned_width, + float spatial_scale, int sampling_ratio, + int pool_mode, bool aligned) { + ROIAlignForwardCUDAKernelLauncher( + input, rois, output, argmax_y, argmax_x, aligned_height, aligned_width, + spatial_scale, sampling_ratio, pool_mode, aligned); +} + +// 注册算子的cuda实现 +void roi_align_forward_impl(Tensor input, Tensor rois, Tensor output, + Tensor argmax_y, Tensor argmax_x, + int aligned_height, int aligned_width, + float spatial_scale, int sampling_ratio, + int pool_mode, bool aligned); +REGISTER_DEVICE_IMPL(roi_align_forward_impl, CUDA, roi_align_forward_cuda); + +// roi_align.cpp +// 使用dispatcher根据参数中的Tensor device类型对实现进行分发 +void roi_align_forward_impl(Tensor input, Tensor rois, Tensor output, + Tensor argmax_y, Tensor argmax_x, + int aligned_height, int aligned_width, + float spatial_scale, int sampling_ratio, + int pool_mode, bool aligned) { + DISPATCH_DEVICE_IMPL(roi_align_forward_impl, input, rois, output, argmax_y, + argmax_x, aligned_height, aligned_width, spatial_scale, + sampling_ratio, pool_mode, aligned); +} + +``` + +### v1.3.11 + +为了灵活地支持更多的后端和硬件,例如 `NVIDIA GPUs` 、`AMD GPUs`,我们重构了 `mmcv/ops/csrc` 目录。注意,这次重构不会影响 API 的使用。更多相关信息,请参考 [PR1206](https://github.com/open-mmlab/mmcv/pull/1206)。 + +原始的目录结构如下所示 + +``` +. +├── common_cuda_helper.hpp +├── ops_cuda_kernel.cuh +├── pytorch_cpp_helper.hpp +├── pytorch_cuda_helper.hpp +├── parrots_cpp_helper.hpp +├── parrots_cuda_helper.hpp +├── parrots_cudawarpfunction.cuh +├── onnxruntime +│   ├── onnxruntime_register.h +│   ├── onnxruntime_session_options_config_keys.h +│   ├── ort_mmcv_utils.h +│   ├── ... +│   ├── onnx_ops.h +│   └── cpu +│ ├── onnxruntime_register.cpp +│      ├── ... +│      └── onnx_ops_impl.cpp +├── parrots +│   ├── ... +│   ├── ops.cpp +│   ├── ops_cuda.cu +│   ├── ops_parrots.cpp +│   └── ops_pytorch.h +├── pytorch +│   ├── ... +│   ├── ops.cpp +│   ├── ops_cuda.cu +│   ├── pybind.cpp +└── tensorrt + ├── trt_cuda_helper.cuh + ├── trt_plugin_helper.hpp + ├── trt_plugin.hpp + ├── trt_serialize.hpp + ├── ... + ├── trt_ops.hpp + └── plugins +    ├── trt_cuda_helper.cu +    ├── trt_plugin.cpp +    ├── ... +    ├── trt_ops.cpp +    └── trt_ops_kernel.cu +``` + +重构之后,它的结构如下所示 + +``` +. +├── common +│ ├── box_iou_rotated_utils.hpp +│ ├── parrots_cpp_helper.hpp +│ ├── parrots_cuda_helper.hpp +│ ├── pytorch_cpp_helper.hpp +│ ├── pytorch_cuda_helper.hpp +│   └── cuda +│   ├── common_cuda_helper.hpp +│   ├── parrots_cudawarpfunction.cuh +│   ├── ... +│   └── ops_cuda_kernel.cuh +├── onnxruntime +│   ├── onnxruntime_register.h +│   ├── onnxruntime_session_options_config_keys.h +│   ├── ort_mmcv_utils.h +│   ├── ... +│   ├── onnx_ops.h +│   └── cpu +│ ├── onnxruntime_register.cpp +│      ├── ... +│      └── onnx_ops_impl.cpp +├── parrots +│   ├── ... +│   ├── ops.cpp +│   ├── ops_parrots.cpp +│   └── ops_pytorch.h +├── pytorch +│   ├── info.cpp +│   ├── pybind.cpp +│   ├── ... +│   ├── ops.cpp +│   └── cuda +│      ├── ... +│      └── ops_cuda.cu +└── tensorrt + ├── trt_cuda_helper.cuh + ├── trt_plugin_helper.hpp + ├── trt_plugin.hpp + ├── trt_serialize.hpp + ├── ... + ├── trt_ops.hpp + └── plugins +    ├── trt_cuda_helper.cu +    ├── trt_plugin.cpp +    ├── ... +    ├── trt_ops.cpp +    └── trt_ops_kernel.cu +``` diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/conf.py b/FoodSeg103/demo/mmcv/docs/zh_cn/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..7bfb9c23a726bb917761c725472d307e6d1d865a --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/conf.py @@ -0,0 +1,217 @@ +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- 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 sys + +import pytorch_sphinx_theme +from sphinx.builders.html import StandaloneHTMLBuilder + +sys.path.insert(0, os.path.abspath('../..')) + +version_file = '../../mmcv/version.py' +with open(version_file) as f: + exec(compile(f.read(), version_file, 'exec')) +__version__ = locals()['__version__'] + +# -- Project information ----------------------------------------------------- + +project = 'mmcv' +copyright = '2018-2022, OpenMMLab' +author = 'MMCV Authors' + +# The short X.Y version +version = __version__ +# The full version, including alpha/beta/rc tags +release = __version__ + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# 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.autosummary', + 'sphinx.ext.intersphinx', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'sphinx.ext.autosectionlabel', + 'sphinx_markdown_tables', + 'myst_parser', + 'sphinx_copybutton', +] # yapf: disable + +myst_heading_anchors = 4 + +myst_enable_extensions = ['colon_fence'] + +# Configuration for intersphinx +intersphinx_mapping = { + 'python': ('https://docs.python.org/3', None), + 'numpy': ('https://numpy.org/doc/stable', None), + 'torch': ('https://pytorch.org/docs/stable/', None), + 'mmengine': ('https://mmengine.readthedocs.io/en/latest', None), +} + +autodoc_mock_imports = ['mmcv._ext', 'mmcv.utils.ext_loader', 'torchvision'] +autosectionlabel_prefix_document = True + +# 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' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'zh_CN' + +# 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'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# -- 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' +html_theme = 'pytorch_sphinx_theme' +html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +html_theme_options = { + 'menu': [ + { + 'name': 'GitHub', + 'url': 'https://github.com/open-mmlab/mmcv' + }, + ], + # Specify the language of shared menu + 'menu_lang': 'cn', +} + +# 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'] +html_css_files = ['css/readthedocs.css'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'mmcvdoc' + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'mmcv.tex', 'mmcv Documentation', 'MMCV Contributors', + 'manual'), +] + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [(master_doc, 'mmcv', 'mmcv Documentation', [author], 1)] + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'mmcv', 'mmcv Documentation', author, 'mmcv', + 'One line description of project.', 'Miscellaneous'), +] + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# set priority when building html +StandaloneHTMLBuilder.supported_image_types = [ + 'image/svg+xml', 'image/gif', 'image/png', 'image/jpeg' +] +# -- Extension configuration ------------------------------------------------- +# Ignore >>> when copying code +copybutton_prompt_text = r'>>> |\.\.\. ' +copybutton_prompt_is_regexp = True diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/docutils.conf b/FoodSeg103/demo/mmcv/docs/zh_cn/docutils.conf new file mode 100644 index 0000000000000000000000000000000000000000..0c00c84688701117f231fd0c8ec295fb747b7d8f --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/docutils.conf @@ -0,0 +1,2 @@ +[html writers] +table_style: colwidths-auto diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/faq.md b/FoodSeg103/demo/mmcv/docs/zh_cn/faq.md new file mode 100644 index 0000000000000000000000000000000000000000..6cfb100c631b101fa0cff0650105a3cc7d735e7b --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/faq.md @@ -0,0 +1,91 @@ +## 常见问题 + +在这里我们列出了用户经常遇到的问题以及对应的解决方法。如果您遇到了其他常见的问题,并且知道可以帮到大家的解决办法, +欢迎随时丰富这个列表。 + +### 安装问题 + +- KeyError: "xxx: 'yyy is not in the zzz registry'" + + 只有模块所在的文件被导入时,注册机制才会被触发,所以您需要在某处导入该文件,更多详情请查看 [KeyError: "MaskRCNN: 'RefineRoIHead is not in the models registry'"](https://github.com/open-mmlab/mmdetection/issues/5974)。 + +- "No module named 'mmcv.ops'"; "No module named 'mmcv.\_ext'" + + 1. 使用 `pip uninstall mmcv` 卸载您环境中的 mmcv + 2. 参考 [installation instruction](https://mmcv.readthedocs.io/en/latest/get_started/installation.html) 或者 [Build MMCV from source](https://mmcv.readthedocs.io/en/latest/get_started/build.html) 安装 mmcv-full + +- "invalid device function" 或者 "no kernel image is available for execution" + + 1. 检查 GPU 的 CUDA 计算能力 + 2. 运行 `python mmdet/utils/collect_env.py` 来检查 PyTorch、torchvision 和 MMCV 是否是针对正确的 GPU 架构构建的,您可能需要去设置 `TORCH_CUDA_ARCH_LIST` 来重新安装 MMCV。兼容性问题可能会出现在使用旧版的 GPUs,如:colab 上的 Tesla K80 (3.7) + 3. 检查运行环境是否和 mmcv/mmdet 编译时的环境相同。例如,您可能使用 CUDA 10.0 编译 mmcv,但在 CUDA 9.0 的环境中运行它 + +- "undefined symbol" 或者 "cannot open xxx.so" + + 1. 如果符号和 CUDA/C++ 相关(例如:libcudart.so 或者 GLIBCXX),请检查 CUDA/GCC 运行时的版本是否和编译 mmcv 的一致 + 2. 如果符号和 PyTorch 相关(例如:符号包含 caffe、aten 和 TH),请检查 PyTorch 运行时的版本是否和编译 mmcv 的一致 + 3. 运行 `python mmdet/utils/collect_env.py` 以检查 PyTorch、torchvision 和 MMCV 构建和运行的环境是否相同 + +- "RuntimeError: CUDA error: invalid configuration argument" + + 这个错误可能是由于您的 GPU 性能不佳造成的。尝试降低 [THREADS_PER_BLOCK](https://github.com/open-mmlab/mmcv/blob/cac22f8cf5a904477e3b5461b1cc36856c2793da/mmcv/ops/csrc/common_cuda_helper.hpp#L10) + 的值并重新编译 mmcv。 + +- "RuntimeError: nms is not compiled with GPU support" + + 这个错误是由于您的 CUDA 环境没有正确安装。 + 您可以尝试重新安装您的 CUDA 环境,然后删除 mmcv/build 文件夹并重新编译 mmcv。 + +- "Segmentation fault" + + 1. 检查 GCC 的版本,通常是因为 PyTorch 版本与 GCC 版本不匹配 (例如 GCC \< 4.9 ),我们推荐用户使用 GCC 5.4,我们也不推荐使用 GCC 5.5, 因为有反馈 GCC 5.5 会导致 "segmentation fault" 并且切换到 GCC 5.4 就可以解决问题 + 2. 检查是否正确安装 CUDA 版本的 PyTorc。输入以下命令并检查是否返回 True + ```shell + python -c 'import torch; print(torch.cuda.is_available())' + ``` + 3. 如果 `torch` 安装成功,那么检查 MMCV 是否安装成功。输入以下命令,如果没有报错说明 mmcv-full 安装成。 + ```shell + python -c 'import mmcv; import mmcv.ops' + ``` + 4. 如果 MMCV 与 PyTorch 都安装成功了,则可以使用 `ipdb` 设置断点或者使用 `print` 函数,分析是哪一部分的代码导致了 `segmentation fault` + +- "libtorch_cuda_cu.so: cannot open shared object file" + + `mmcv-full` 依赖 `libtorch_cuda_cu.so` 文件,但程序运行时没能找到该文件。我们可以检查该文件是否存在 `~/miniconda3/envs/{environment-name}/lib/python3.7/site-packages/torch/lib` 也可以尝试重装 PyTorch。 + +- "fatal error C1189: #error: -- unsupported Microsoft Visual Studio version!" + + 如果您在 Windows 上编译 mmcv-full 并且 CUDA 的版本是 9.2,您很可能会遇到这个问题 `"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include\crt/host_config.h(133): fatal error C1189: #error: -- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!"`,您可以尝试使用低版本的 Microsoft Visual Studio,例如 vs2017。 + +- "error: member "torch::jit::detail::ModulePolicy::all_slots" may not be initialized" + + 如果您在 Windows 上编译 mmcv-full 并且 PyTorch 的版本是 1.5.0,您很可能会遇到这个问题 `- torch/csrc/jit/api/module.h(474): error: member "torch::jit::detail::ModulePolicy::all_slots" may not be initialized`。解决这个问题的方法是将 `torch/csrc/jit/api/module.h` 文件中所有 `static constexpr bool all_slots = false;` 替换为 `static bool all_slots = false;`。更多细节可以查看 [member "torch::jit::detail::AttributePolicy::all_slots" may not be initialized](https://github.com/pytorch/pytorch/issues/39394)。 + +- "error: a member with an in-class initializer must be const" + + 如果您在 Windows 上编译 mmcv-full 并且 PyTorch 的版本是 1.6.0,您很可能会遇到这个问题 `"- torch/include\torch/csrc/jit/api/module.h(483): error: a member with an in-class initializer must be const"`. 解决这个问题的方法是将 `torch/include\torch/csrc/jit/api/module.h` 文件中的所有 `CONSTEXPR_EXCEPT_WIN_CUDA ` 替换为 `const`。更多细节可以查看 [Ninja: build stopped: subcommand failed](https://github.com/open-mmlab/mmcv/issues/575)。 + +- "error: member "torch::jit::ProfileOptionalOp::Kind" may not be initialized" + + 如果您在 Windows 上编译 mmcv-full 并且 PyTorch 的版本是 1.7.0,您很可能会遇到这个问题 `torch/include\torch/csrc/jit/ir/ir.h(1347): error: member "torch::jit::ProfileOptionalOp::Kind" may not be initialized`. 解决这个问题的方法是修改 PyTorch 中的几个文件: + + - 删除 `torch/include\torch/csrc/jit/ir/ir.h` 文件中的 `static constexpr Symbol Kind = ::c10::prim::profile;` 和 `tatic constexpr Symbol Kind = ::c10::prim::profile_optional;` + - 将 `torch\include\pybind11\cast.h` 文件中的 `explicit operator type&() { return *(this->value); }` 替换为 `explicit operator type&() { return *((type*)this->value); }` + - 将 `torch/include\torch/csrc/jit/api/module.h` 文件中的 所有 `CONSTEXPR_EXCEPT_WIN_CUDA` 替换为 `const` + + 更多细节可以查看 [Ensure default extra_compile_args](https://github.com/pytorch/pytorch/pull/45956)。 + +- MMCV 和 MMDetection 的兼容性问题;"ConvWS is already registered in conv layer" + + 请参考 [installation instruction](https://mmdetection.readthedocs.io/en/latest/get_started.html#installation) 为您的 MMDetection 版本安装正确版本的 MMCV。 + +### 使用问题 + +- "RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one" + + 1. 这个错误是因为有些参数没有参与 loss 的计算,可能是代码中存在多个分支,导致有些分支没有参与 loss 的计算。更多细节见 [Expected to have finished reduction in the prior iteration before starting a new one](https://github.com/pytorch/pytorch/issues/55582)。 + 2. 你可以设置 DDP 中的 `find_unused_parameters` 为 `True`,或者手动查找哪些参数没有用到。 + +- "RuntimeError: Trying to backward through the graph a second time" + + 不能同时设置 `GradientCumulativeOptimizerHook` 和 `OptimizerHook`,这会导致 `loss.backward()` 被调用两次,于是程序抛出 `RuntimeError`。我们只需设置其中的一个。更多细节见 [Trying to backward through the graph a second time](https://github.com/open-mmlab/mmcv/issues/1379)。 diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/article.md b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/article.md new file mode 100644 index 0000000000000000000000000000000000000000..96768502cedb607d58ea2dc8d17b3dd8b9af20b2 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/article.md @@ -0,0 +1,63 @@ +## 解读文章汇总 + +这篇文章汇总了 [OpenMMLab](https://www.zhihu.com/people/openmmlab) 解读的部分文章(更多文章和视频见 [OpenMMLabCourse](https://github.com/open-mmlab/OpenMMLabCourse)),如果您有推荐的文章(不一定是 OpenMMLab 发布的文章,可以是自己写的文章),非常欢迎提 [Pull Request](http://127.0.0.1:5501/mmcv/docs/zh_cn/_build/html/community/pr.html) 添加到这里。 + +### MMCV 解读文章 + +#### 框架解读 + +- [MMCV 核心组件分析(一):整体概述](https://zhuanlan.zhihu.com/p/336081587) +- [MMCV 核心组件分析(二):FileHandler](https://zhuanlan.zhihu.com/p/336097883) +- [MMCV 核心组件分析(三): FileClient](https://zhuanlan.zhihu.com/p/339190576) +- [MMCV 核心组件分析(四): Config](https://zhuanlan.zhihu.com/p/346203167) +- [MMCV 核心组件分析(五): Registry](https://zhuanlan.zhihu.com/p/355271993) +- [MMCV 核心组件分析(六): Hook](https://zhuanlan.zhihu.com/p/355272220) +- [MMCV 核心组件分析(七): Runner](https://zhuanlan.zhihu.com/p/355272459) +- [MMCV Hook 食用指南](https://zhuanlan.zhihu.com/p/448600739) +- [PyTorch & MMCV Dispatcher 机制解析](https://zhuanlan.zhihu.com/p/451671838) + +#### 工具解读 + +- [训练可视化工具哪款是你的菜?MMCV一行代码随你挑](https://zhuanlan.zhihu.com/p/387078211) + +#### 安装指南 + +- [久等了!Windows 平台 MMCV 的预编译包终于来了!](https://zhuanlan.zhihu.com/p/441653536) +- [Windows 环境从零安装 mmcv-full](https://zhuanlan.zhihu.com/p/434491590) + +#### 知乎问答 + +- [深度学习科研,如何高效进行代码和实验管理?](https://www.zhihu.com/question/269707221/answer/2480772257) +- [深度学习方面的科研工作中的实验代码有什么规范和写作技巧?如何妥善管理实验数据?](https://www.zhihu.com/question/268193800/answer/2586000037) + +### 下游算法库解读文章 + +- [MMDetection](https://mmdetection.readthedocs.io/zh_CN/latest/article.html) + +### PyTorch 解读文章 + +- [PyTorch1.11 亮点一览:TorchData、functorch、DDP 静态图](https://zhuanlan.zhihu.com/p/486222256) +- [PyTorch1.12 亮点一览:DataPipe + TorchArrow 新的数据加载与处理范式](https://zhuanlan.zhihu.com/p/537868554) +- [PyTorch 源码解读之 nn.Module:核心网络模块接口详解](https://zhuanlan.zhihu.com/p/340453841) +- [PyTorch 源码解读之 torch.autograd:梯度计算详解](https://zhuanlan.zhihu.com/p/321449610) +- [PyTorch 源码解读之 torch.utils.data:解析数据处理全流程](https://zhuanlan.zhihu.com/p/337850513) +- [PyTorch 源码解读之 torch.optim:优化算法接口详解](https://zhuanlan.zhihu.com/p/346205754) +- [PyTorch 源码解读之 DP & DDP:模型并行和分布式训练解析](https://zhuanlan.zhihu.com/p/343951042) +- [PyTorch 源码解读之 BN & SyncBN:BN 与 多卡同步 BN 详解](https://zhuanlan.zhihu.com/p/337732517) +- [PyTorch 源码解读之 torch.cuda.amp: 自动混合精度详解](https://zhuanlan.zhihu.com/p/348554267) +- [PyTorch 源码解读之 cpp_extension:揭秘 C++/CUDA 算子实现和调用全流程](https://zhuanlan.zhihu.com/p/348555597) +- [PyTorch 源码解读之即时编译篇](https://zhuanlan.zhihu.com/p/361101354) +- [PyTorch 源码解读之分布式训练了解一下?](https://zhuanlan.zhihu.com/p/361314953) +- [PyTorch 源码解读之 torch.serialization & torch.hub](https://zhuanlan.zhihu.com/p/364239544) + +### 其他 + +- [困扰我 48 小时的深拷贝,今天终于...](https://zhuanlan.zhihu.com/p/470892209) +- [拿什么拯救我的 4G 显卡](https://zhuanlan.zhihu.com/p/430123077) +- [是谁偷偷动了我的 logger](https://zhuanlan.zhihu.com/p/481383590) +- [三句话,让 logger 言听计从](https://zhuanlan.zhihu.com/p/487524917) +- [Logging 不为人知的二三事](https://zhuanlan.zhihu.com/p/502610682) +- [Type Hints 入门教程,让代码更加规范整洁](https://zhuanlan.zhihu.com/p/519335398) +- [手把手教你如何高效地在 MMCV 中贡献算子](https://zhuanlan.zhihu.com/p/464492627) +- [OpenMMLab 支持 IPU 训练芯片](https://zhuanlan.zhihu.com/p/517527926) +- [基于 MMCV 走上开源大佬之路?](https://zhuanlan.zhihu.com/p/391144979) diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/build.md b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/build.md new file mode 100644 index 0000000000000000000000000000000000000000..8c2ad15d641a4f910ace360e8580a5ec3d55560e --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/build.md @@ -0,0 +1,404 @@ +## 从源码编译 MMCV + +### 编译 mmcv + +在编译 mmcv 之前,请确保 PyTorch 已经成功安装在环境中,可以参考 [PyTorch 官方安装文档](https://pytorch.org/get-started/locally/#start-locally)。可使用以下命令验证 + +```bash +python -c 'import torch;print(torch.__version__)' +``` + +:::{note} + +- 如果克隆代码仓库的速度过慢,可以使用以下命令克隆(注意:gitee 的 mmcv 不一定和 github 的保持一致,因为每天只同步一次) + +```bash +git clone https://gitee.com/open-mmlab/mmcv.git +``` + +- 如果打算使用 `opencv-python-headless` 而不是 `opencv-python`,例如在一个很小的容器环境或者没有图形用户界面的服务器中,你可以先安装 `opencv-python-headless`,这样在安装 mmcv 依赖的过程中会跳过 `opencv-python`。 + +- 如果编译过程安装依赖库的时间过长,可以[设置 pypi 源](https://mirrors.tuna.tsinghua.edu.cn/help/pypi/) + +```bash +pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple +``` + +::: + +#### 在 Linux 上编译 mmcv + +| TODO: 视频教程 + +1. 克隆代码仓库 + + ```bash + git clone https://github.com/open-mmlab/mmcv.git + cd mmcv + ``` + +2. 安装 `ninja` 和 `psutil` 以加快编译速度 + + ```bash + pip install -r requirements/optional.txt + ``` + +3. 检查 nvcc 的版本(要求大于等于 9.2,如果没有 GPU,可以跳过) + + ```bash + nvcc --version + ``` + + 上述命令如果输出以下信息,表示 nvcc 的设置没有问题,否则需要设置 CUDA_HOME + + ``` + nvcc: NVIDIA (R) Cuda compiler driver + Copyright (c) 2005-2020 NVIDIA Corporation + Built on Mon_Nov_30_19:08:53_PST_2020 + Cuda compilation tools, release 11.2, V11.2.67 + Build cuda_11.2.r11.2/compiler.29373293_0 + ``` + + :::{note} + 如果想要支持 ROCm,可以参考 [AMD ROCm](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation-Guide.html) 安装 ROCm。 + ::: + +4. 检查 gcc 的版本(要求大于等于**5.4**) + + ```bash + gcc --version + ``` + +5. 开始编译(预估耗时 10 分钟) + + ```bash + pip install -e . -v + ``` + +6. 验证安装 + + ```bash + python .dev_scripts/check_installation.py + ``` + + 如果上述命令没有报错,说明安装成功。如有报错,请查看[问题解决页面](../faq.html)是否已经有解决方案。 + + 如果没有找到解决方案,欢迎提 [issue](https://github.com/open-mmlab/mmcv/issues)。 + +#### 在 macOS 上编译 mmcv + +| TODO: 视频教程 + +```{note} +如果你使用的是搭载 apple silicon 的 mac 设备,请安装 PyTorch 1.13+ 的版本,否则会遇到 [issues#2218](https://github.com/open-mmlab/mmcv/issues/2218) 中的问题。 +``` + +1. 克隆代码仓库 + + ```bash + git clone https://github.com/open-mmlab/mmcv.git + cd mmcv + ``` + +2. 安装 `ninja` 和 `psutil` 以加快编译速度 + + ```bash + pip install -r requirements/optional.txt + ``` + +3. 开始编译 + + ```bash + pip install -e . + ``` + +4. 验证安装 + + ```bash + python .dev_scripts/check_installation.py + ``` + + 如果上述命令没有报错,说明安装成功。如有报错,请查看[问题解决页面](../faq.md)是否已经有解决方案。 + + 如果没有找到解决方案,欢迎提 [issue](https://github.com/open-mmlab/mmcv/issues)。 + +#### 在 Windows 上编译 mmcv + +| TODO: 视频教程 + +在 Windows 上编译 mmcv 比 Linux 复杂,本节将一步步介绍如何在 Windows 上编译 mmcv。 + +##### 依赖项 + +请先安装以下的依赖项: + +- [Git](https://git-scm.com/download/win):安装期间,请选择 **add git to Path** +- [Visual Studio Community 2019](https://visualstudio.microsoft.com):用于编译 C++ 和 CUDA 代码 +- [Miniconda](https://docs.conda.io/en/latest/miniconda.html):包管理工具 +- [CUDA 10.2](https://developer.nvidia.com/cuda-10.2-download-archive):如果只需要 CPU 版本可以不安装 CUDA,安装 CUDA 时,可根据需要进行自定义安装。如果已经安装新版本的显卡驱动,建议取消驱动程序的安装 + +```{note} +如果不清楚如何安装以上依赖,请参考[Windows 环境从零安装 mmcv](https://zhuanlan.zhihu.com/p/434491590)。 +另外,你需要知道如何在 Windows 上设置变量环境,尤其是 "PATH" 的设置,以下安装过程都会用到。 +``` + +##### 通用步骤 + +1. 从 Windows 菜单启动 Anaconda 命令行 + + 如 Miniconda 安装程序建议,不要使用原始的 `cmd.exe` 或是 `powershell.exe`。命令行有两个版本,一个基于 PowerShell,一个基于传统的 `cmd.exe`。请注意以下说明都是使用的基于 PowerShell + +2. 创建一个新的 Conda 环境 + + ```powershell + (base) PS C:\Users\xxx> conda create --name mmcv python=3.7 + (base) PS C:\Users\xxx> conda activate mmcv # 确保做任何操作前先激活环境 + ``` + +3. 安装 PyTorch 时,可以根据需要安装支持 CUDA 或不支持 CUDA 的版本 + + ```powershell + # CUDA version + (mmcv) PS C:\Users\xxx> conda install pytorch torchvision cudatoolkit=10.2 -c pytorch + # CPU version + (mmcv) PS C:\Users\xxx> conda install install pytorch torchvision cpuonly -c pytorch + ``` + +4. 克隆代码仓库 + + ```powershell + (mmcv) PS C:\Users\xxx> git clone https://github.com/open-mmlab/mmcv.git + (mmcv) PS C:\Users\xxx> cd mmcv + ``` + +5. 安装 `ninja` 和 `psutil` 以加快编译速度 + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> pip install -r requirements/optional.txt + ``` + +6. 设置 MSVC 编译器 + + 设置环境变量。添加 `C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\Hostx86\x64` 到 `PATH`,则 `cl.exe` 可以在命令行中运行,如下所示。 + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> cl + Microsoft (R) C/C++ Optimizing Compiler Version 19.27.29111 for x64 + Copyright (C) Microsoft Corporation. All rights reserved. + + usage: cl [ option... ] filename... [ / link linkoption... ] + ``` + + 为了兼容性,我们使用 x86-hosted 以及 x64-targeted 版本,即路径中的 `Hostx86\x64` 。 + + 因为 PyTorch 将解析 `cl.exe` 的输出以检查其版本,只有 utf-8 将会被识别,你可能需要将系统语言更改为英语。控制面板 -> 地区-> 管理-> 非 Unicode 来进行语言转换。 + +##### 编译与安装 mmcv + +mmcv 有两个版本: + +- 只包含 CPU 算子的版本 + + 编译 CPU 算子,但只有 x86 将会被编译,并且编译版本只能在 CPU only 情况下运行 + +- 既包含 CPU 算子,又包含 CUDA 算子的版本 + + 同时编译 CPU 和 CUDA 算子,`ops` 模块的 x86 与 CUDA 的代码都可以被编译。同时编译的版本可以在 CUDA 上调用 GPU + +###### CPU 版本 + +编译安装 + +```powershell +(mmcv) PS C:\Users\xxx\mmcv> python setup.py build_ext # 如果成功, cl 将被启动用于编译算子 +(mmcv) PS C:\Users\xxx\mmcv> python setup.py develop # 安装 +``` + +###### GPU 版本 + +1. 检查 `CUDA_PATH` 或者 `CUDA_HOME` 环境变量已经存在在 `envs` 之中 + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> ls env: + + Name Value + ---- ----- + CUDA_PATH C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2 + CUDA_PATH_V10_1 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1 + CUDA_PATH_V10_2 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2 + ``` + + 如果没有,你可以按照下面的步骤设置 + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> $env:CUDA_HOME = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2" + # 或者 + (mmcv) PS C:\Users\xxx\mmcv> $env:CUDA_HOME = $env:CUDA_PATH_V10_2 # CUDA_PATH_V10_2 已经在环境变量中 + ``` + +2. 设置 CUDA 的目标架构 + + ```powershell + # 这里需要改成你的显卡对应的目标架构 + (mmcv) PS C:\Users\xxx\mmcv> $env:TORCH_CUDA_ARCH_LIST="7.5" + ``` + + :::{note} + 可以点击 [cuda-gpus](https://developer.nvidia.com/cuda-gpus) 查看 GPU 的计算能力,也可以通过 CUDA 目录下的 deviceQuery.exe 工具查看 + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> &"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite\deviceQuery.exe" + Device 0: "NVIDIA GeForce GTX 1660 SUPER" + CUDA Driver Version / Runtime Version 11.7 / 11.1 + CUDA Capability Major/Minor version number: 7.5 + ``` + + 上面的 7.5 表示目标架构。注意:需把上面命令的 v10.2 换成你的 CUDA 版本。 + ::: + +3. 编译安装 + + ```powershell + (mmcv) PS C:\Users\xxx\mmcv> python setup.py build_ext # 如果成功, cl 将被启动用于编译算子 + (mmcv) PS C:\Users\xxx\mmcv> python setup.py develop # 安装 + ``` + + ```{note} + 如果你的 PyTorch 版本是 1.6.0,你可能会遇到一些 [issue](https://github.com/pytorch/pytorch/issues/42467) 提到的错误,你可以参考这个 [pull request](https://github.com/pytorch/pytorch/pull/43380/files) 修改本地环境的 PyTorch 源代码 + ``` + +##### 验证安装 + +```powershell +(mmcv) PS C:\Users\xxx\mmcv> python .dev_scripts/check_installation.py +``` + +如果上述命令没有报错,说明安装成功。如有报错,请查看[问题解决页面](../faq.md)是否已经有解决方案。 +如果没有找到解决方案,欢迎提 [issue](https://github.com/open-mmlab/mmcv/issues)。 + +### 编译 mmcv-lite + +如果你需要使用和 PyTorch 相关的模块,请确保 PyTorch 已经成功安装在环境中,可以参考 [PyTorch 官方安装文档](https://pytorch.org/get-started/locally/#start-locally)。 + +1. 克隆代码仓库 + + ```bash + git clone https://github.com/open-mmlab/mmcv.git + cd mmcv + ``` + +2. 开始编译 + + ```bash + MMCV_WITH_OPS=0 pip install -e . -v + ``` + +3. 验证安装 + + ```bash + python -c 'import mmcv;print(mmcv.__version__)' + ``` + +### 在寒武纪 MLU 机器编译 mmcv-full + +#### 安装 torch_mlu + +##### 选项1: 基于寒武纪 docker image 安装 + +首先请下载并且拉取寒武纪 docker (请向 service@cambricon.com 发邮件以获得最新的寒武纪 pytorch 发布 docker)。 + +``` +docker pull ${docker image} +``` + +进入 docker, [编译 MMCV MLU](#编译mmcv-mlu) 并[进行验证](#验证是否成功安装)。 + +##### 选项2:基于 cambricon pytorch 源码编译安装 + +请向 service@cambricon.com 发送邮件或联系 Cambricon 工程师以获取合适版本的 CATCH 软件包,在您获得合适版本的 CATCH 软件包后,请参照 ${CATCH-path}/CONTRIBUTING.md 中的步骤安装 CATCH。 + +#### 编译 MMCV + +克隆代码仓库 + +```bash +git clone https://github.com/open-mmlab/mmcv.git +``` + +算子库 mlu-ops 在编译 MMCV 时自动下载到默认路径(mmcv/mlu-ops),你也可以在编译前设置环境变量 MMCV_MLU_OPS_PATH 指向已经存在的 mlu-ops 算子库路径。 + +```bash +export MMCV_MLU_OPS_PATH=/xxx/xxx/mlu-ops +``` + +开始编译 + +```bash +cd mmcv +export MMCV_WITH_OPS=1 +export FORCE_MLU=1 +python setup.py install +``` + +#### 验证是否成功安装 + +完成上述安装步骤之后,您可以尝试运行下面的 Python 代码以测试您是否成功在 MLU 设备上安装了 mmcv-full + +```python +import torch +import torch_mlu +from mmcv.ops import sigmoid_focal_loss +x = torch.randn(3, 10).mlu() +x.requires_grad = True +y = torch.tensor([1, 5, 3]).mlu() +w = torch.ones(10).float().mlu() +output = sigmoid_focal_loss(x, y, 2.0, 0.25, w, 'none') +``` + +### 在昇腾 NPU 机器编译 mmcv + +在编译 mmcv 前,需要安装 torch_npu,完整安装教程详见 [PyTorch 安装指南](https://gitee.com/ascend/pytorch/blob/master/docs/zh/PyTorch%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97/PyTorch%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97.md#pytorch%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97) + +#### 选项 1: 使用 NPU 设备源码编译安装 mmcv (推荐方式) + +- 拉取 [MMCV 源码](https://github.com/open-mmlab/mmcv.git) + +```bash +git pull https://github.com/open-mmlab/mmcv.git +``` + +- 编译 + +```bash +MMCV_WITH_OPS=1 MAX_JOBS=8 FORCE_NPU=1 python setup.py build_ext +``` + +- 安装 + +```bash +MMCV_WITH_OPS=1 FORCE_NPU=1 python setup.py develop +``` + +#### 选项 2: 使用 pip 安装 Ascend 编译版本的 mmcv + +Ascend 编译版本的 mmcv 在 mmcv >= 1.7.0 时已经支持直接 pip 安装 + +```bash +pip install mmcv -f https://download.openmmlab.com/mmcv/dist/ascend/torch1.8.0/index.html +``` + +#### 验证 + +```python +import torch +import torch_npu +from mmcv.ops import softmax_focal_loss + +# Init tensor to the NPU +x = torch.randn(3, 10).npu() +y = torch.tensor([1, 5, 3]).npu() +w = torch.ones(10).float().npu() + +output = softmax_focal_loss(x, y, 2.0, 0.25, w, 'none') +print(output) +``` diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/installation.md b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/installation.md new file mode 100644 index 0000000000000000000000000000000000000000..16cb007628f4ea35fe51c16c341c6a90fb625ccb --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/installation.md @@ -0,0 +1,369 @@ +## 安装 MMCV + +MMCV 有两个版本: + +- **mmcv**: 完整版,包含所有的特性以及丰富的开箱即用的 CPU 和 CUDA 算子。注意,完整版本可能需要更长时间来编译。 +- **mmcv-lite**: 精简版,不包含 CPU 和 CUDA 算子但包含其余所有特性和功能,类似 MMCV 1.0 之前的版本。如果你不需要使用算子的话,精简版可以作为一个考虑选项。 + +```{warning} +请不要在同一个环境中安装两个版本,否则可能会遇到类似 `ModuleNotFound` 的错误。在安装一个版本之前,需要先卸载另一个。`如果 CUDA 可用,强烈推荐安装 mmcv`。 +``` + +### 安装 mmcv + +在安装 mmcv 之前,请确保 PyTorch 已经成功安装在环境中,可以参考 [PyTorch 官方安装文档](https://pytorch.org/get-started/locally/#start-locally)。可使用以下命令验证 + +```bash +python -c 'import torch;print(torch.__version__)' +``` + +如果输出版本信息,则表示 PyTorch 已安装。 + +#### 使用 mim 安装(推荐) + +[mim](https://github.com/open-mmlab/mim) 是 OpenMMLab 项目的包管理工具,使用它可以很方便地安装 mmcv。 + +```bash +pip install -U openmim +mim install mmcv +``` + +如果发现上述的安装命令没有使用预编译包(以 `.whl` 结尾)而是使用源码包(以 `.tar.gz` 结尾)安装,则有可能是我们没有提供和当前环境的 PyTorch 版本、CUDA 版本相匹配的 mmcv 预编译包,此时,你可以[源码安装 mmcv](build.md)。 + +
+使用预编译包的安装日志 + +Looking in links: https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/index.html
+Collecting mmcv
+Downloading https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/mmcv-2.0.0-cp38-cp38-manylinux1_x86_64.whl + +
+ +
+使用源码包的安装日志 + +Looking in links: https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/index.html
+Collecting mmcv==2.0.0
+Downloading mmcv-2.0.0.tar.gz + +
+ +如需安装指定版本的 mmcv,例如安装 2.0.0 版本的 mmcv,可使用以下命令 + +```bash +mim install mmcv==2.0.0 +``` + +:::{note} +如果你打算使用 `opencv-python-headless` 而不是 `opencv-python`,例如在一个很小的容器环境或者没有图形用户界面的服务器中,你可以先安装 `opencv-python-headless`,这样在安装 mmcv 依赖的过程中会跳过 `opencv-python`。 + +另外,如果安装依赖库的时间过长,可以指定 pypi 源 + +```bash +mim install "mmcv>=2.0.0rc1" -i https://pypi.tuna.tsinghua.edu.cn/simple +``` + +::: + +安装完成后可以运行 [check_installation.py](https://github.com/open-mmlab/mmcv/blob/main/.dev_scripts/check_installation.py) 脚本检查 mmcv 是否安装成功。 + +#### 使用 pip 安装 + +使用以下命令查看 CUDA 和 PyTorch 的版本 + +```bash +python -c 'import torch;print(torch.__version__);print(torch.version.cuda)' +``` + +根据系统的类型、CUDA 版本、PyTorch 版本以及 MMCV 版本选择相应的安装命令 + + + + +
+ + + + +
+

+
+
+
+
+如果在上面的下拉框中没有找到对应的版本,则可能是没有对应 PyTorch 或者 CUDA 或者 mmcv 版本的预编译包,此时,你可以[源码安装 mmcv](build.md)。
+
+:::{note}
+PyTorch 在 1.x.0 和 1.x.1 之间通常是兼容的,故 mmcv 只提供 1.x.0 的编译包。如果你
+的 PyTorch 版本是 1.x.1,你可以放心地安装在 1.x.0 版本编译的 mmcv。例如,如果你的
+PyTorch 版本是 1.8.1,你可以放心选择 1.8.x。
+:::
+
+:::{note}
+如果你打算使用 `opencv-python-headless` 而不是 `opencv-python`,例如在一个很小的容器环境或者没有图形用户界面的服务器中,你可以先安装 `opencv-python-headless`,这样在安装 mmcv 依赖的过程中会跳过 `opencv-python`。
+
+另外,如果安装依赖库的时间过长,可以指定 pypi 源
+
+```bash
+pip install mmcv -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html -i https://pypi.tuna.tsinghua.edu.cn/simple
+```
+
+:::
+
+安装完成后可以运行 [check_installation.py](https://github.com/open-mmlab/mmcv/blob/main/.dev_scripts/check_installation.py) 脚本检查 mmcv 是否安装成功。
+
+#### 使用 docker 镜像
+
+先将算法库克隆到本地再构建镜像
+
+```bash
+git clone https://github.com/open-mmlab/mmcv.git && cd mmcv
+docker build -t mmcv -f docker/release/Dockerfile .
+```
+
+也可以直接使用下面的命令构建镜像
+
+```bash
+docker build -t mmcv https://github.com/open-mmlab/mmcv.git#main:docker/release
+```
+
+[Dockerfile](release/Dockerfile) 默认安装最新的 mmcv,如果你想要指定版本,可以使用下面的命令
+
+```bash
+docker image build -t mmcv -f docker/release/Dockerfile --build-arg MMCV=2.0.0 .
+```
+
+如果你想要使用其他版本的 PyTorch 和 CUDA,你可以在构建镜像时指定它们的版本。
+
+例如指定 PyTorch 的版本是 1.11,CUDA 的版本是 11.3
+
+```bash
+docker build -t mmcv -f docker/release/Dockerfile \
+    --build-arg PYTORCH=1.11.0 \
+    --build-arg CUDA=11.3 \
+    --build-arg CUDNN=8 \
+    --build-arg MMCV=2.0.0 .
+```
+
+更多 PyTorch 和 CUDA 镜像可以点击 [dockerhub/pytorch](https://hub.docker.com/r/pytorch/pytorch/tags) 查看。
+
+### 安装 mmcv-lite
+
+如果你需要使用和 PyTorch 相关的模块,请确保 PyTorch 已经成功安装在环境中,可以参考 [PyTorch 官方安装文档](https://pytorch.org/get-started/locally/#start-locally)。
+
+```python
+pip install mmcv-lite
+```
diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/introduction.md b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/introduction.md
new file mode 100644
index 0000000000000000000000000000000000000000..4c735b94d3db71e484d04794fb5509cabbed68a9
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/introduction.md
@@ -0,0 +1,36 @@
+## 介绍 MMCV
+
+MMCV 是一个面向计算机视觉的基础库,它提供了以下功能:
+
+- [图像和视频处理](../understand_mmcv/data_process.md)
+- [图像和标注结果可视化](../understand_mmcv/visualization.md)
+- [图像变换](../understand_mmcv/data_transform.md)
+- [多种 CNN 网络结构](../understand_mmcv/cnn.md)
+- [高质量实现的常见 CUDA 算子](../understand_mmcv/ops.md)
+
+MMCV 支持多种平台,包括:
+
+- Linux
+- Windows
+- macOS
+
+它支持的 OpenMMLab 项目:
+
+- [MMClassification](https://github.com/open-mmlab/mmclassification): OpenMMLab 图像分类工具箱
+- [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab 目标检测工具箱
+- [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab 新一代通用 3D 目标检测平台
+- [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab 旋转框检测工具箱与测试基准
+- [MMYOLO](https://github.com/open-mmlab/mmyolo): OpenMMLab YOLO 系列工具箱与测试基准
+- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation): OpenMMLab 语义分割工具箱
+- [MMOCR](https://github.com/open-mmlab/mmocr): OpenMMLab 全流程文字检测识别理解工具箱
+- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab 姿态估计工具箱
+- [MMHuman3D](https://github.com/open-mmlab/mmhuman3d): OpenMMLab 人体参数化模型工具箱与测试基准
+- [MMSelfSup](https://github.com/open-mmlab/mmselfsup): OpenMMLab 自监督学习工具箱与测试基准
+- [MMRazor](https://github.com/open-mmlab/mmrazor): OpenMMLab 模型压缩工具箱与测试基准
+- [MMFewShot](https://github.com/open-mmlab/mmfewshot): OpenMMLab 少样本学习工具箱与测试基准
+- [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab 新一代视频理解工具箱
+- [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab 一体化视频目标感知平台
+- [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab 光流估计工具箱与测试基准
+- [MMEditing](https://github.com/open-mmlab/mmediting): OpenMMLab 图像视频编辑工具箱
+- [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab 图片视频生成模型工具箱
+- [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab 模型部署框架
diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/previous_versions.md b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/previous_versions.md
new file mode 100644
index 0000000000000000000000000000000000000000..d543818752b51985169d4489bd46708725ce422d
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/zh_cn/get_started/previous_versions.md
@@ -0,0 +1,47 @@
+## 其他版本的 PyTorch
+
+我们不再提供在较低的 `PyTorch` 版本下编译的 `mmcv-full` 包,但为了您的方便,您可以在下面找到它们。
+
+### PyTorch 1.4
+
+| 1.0.0 \<= mmcv_version \<= 1.2.1
+
+#### CUDA 10.1
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.4.0/index.html
+```
+
+#### CUDA 9.2
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.4.0/index.html
+```
+
+#### CPU
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cpu/torch1.4.0/index.html
+```
+
+### PyTorch v1.3
+
+| 1.0.0 \<= mmcv_version \<= 1.3.16
+
+#### CUDA 10.1
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.3.0/index.html
+```
+
+#### CUDA 9.2
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.3.0/index.html
+```
+
+#### CPU
+
+```bash
+pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/cpu/torch1.3.0/index.html
+```
diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/index.rst b/FoodSeg103/demo/mmcv/docs/zh_cn/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..98cf08890618e699c7ac4731093818a07e862362
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/zh_cn/index.rst
@@ -0,0 +1,66 @@
+欢迎来到 MMCV 的中文文档!
+=============================
+
+您可以在页面左下角切换中英文文档。
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 介绍与安装
+
+   get_started/introduction.md
+   get_started/installation.md
+   get_started/build.md
+   get_started/article.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 深入理解 MMCV
+
+   understand_mmcv/data_process.md
+   understand_mmcv/data_transform.md
+   understand_mmcv/visualization.md
+   understand_mmcv/cnn.md
+   understand_mmcv/ops.md
+
+.. toctree::
+   :caption: 语言切换
+
+   switch_language.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 兼容性
+
+   compatibility.md
+
+.. toctree::
+
+   faq.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 社区
+
+   community/contributing.md
+   community/pr.md
+   community/code_style.md
+
+.. toctree::
+   :maxdepth: 1
+   :caption: API 文档
+
+   mmcv.image 
+   mmcv.video 
+   mmcv.visualization 
+   mmcv.cnn 
+   mmcv.ops 
+   mmcv.transforms 
+   mmcv.arraymisc 
+   mmcv.utils 
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/make.bat b/FoodSeg103/demo/mmcv/docs/zh_cn/make.bat
new file mode 100644
index 0000000000000000000000000000000000000000..7893348a1b7dbb588983a48e6991282eae7e1b55
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/zh_cn/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%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+
+:end
+popd
diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/switch_language.md b/FoodSeg103/demo/mmcv/docs/zh_cn/switch_language.md
new file mode 100644
index 0000000000000000000000000000000000000000..e4ac4b229ad520f142243f3a918748c542e9989f
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/zh_cn/switch_language.md
@@ -0,0 +1,3 @@
+## English
+
+## 简体中文
diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/cnn.md b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/cnn.md
new file mode 100644
index 0000000000000000000000000000000000000000..faba7c59187d3112d80e1c163e456734aa1b4bde
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/cnn.md
@@ -0,0 +1,75 @@
+## 卷积神经网络
+
+我们为卷积神经网络提供了一些构建模块,包括层构建、模块组件和权重初始化。
+
+### 网络层的构建
+
+在运行实验时,我们可能需要尝试同属一种类型但不同配置的层,但又不希望每次都修改代码。于是我们提供一些层构建方法,可以从字典构建层,字典可以在配置文件中配置,也可以通过命令行参数指定。
+
+#### 用法
+
+一个简单的例子:
+
+```python
+from mmcv.cnn import build_conv_layer
+
+cfg = dict(type='Conv3d')
+layer = build_conv_layer(cfg, in_channels=3, out_channels=8, kernel_size=3)
+```
+
+- `build_conv_layer`: 支持的类型包括 Conv1d、Conv2d、Conv3d、Conv (Conv是Conv2d的别名)
+- `build_norm_layer`: 支持的类型包括 BN1d、BN2d、BN3d、BN (alias for BN2d)、SyncBN、GN、LN、IN1d、IN2d、IN3d、IN(IN是IN2d的别名)
+- `build_activation_layer`:支持的类型包括 ReLU、LeakyReLU、PReLU、RReLU、ReLU6、ELU、Sigmoid、Tanh、GELU
+- `build_upsample_layer`: 支持的类型包括 nearest、bilinear、deconv、pixel_shuffle
+- `build_padding_layer`: 支持的类型包括 zero、reflect、replicate
+
+#### 拓展
+
+我们还允许自定义层和算子来扩展构建方法。
+
+1. 编写和注册自己的模块:
+
+   ```python
+   from mmengine.registry import MODELS
+
+   @MODELS.register_module()
+   class MyUpsample:
+
+       def __init__(self, scale_factor):
+           pass
+
+       def forward(self, x):
+           pass
+   ```
+
+2. 在某处导入 `MyUpsample` (例如 `__init__.py` )然后使用它:
+
+   ```python
+   from mmcv.cnn import build_upsample_layer
+
+   cfg = dict(type='MyUpsample', scale_factor=2)
+   layer = build_upsample_layer(cfg)
+   ```
+
+### 模块组件
+
+我们还提供了常用的模块组件,以方便网络构建。
+卷积组件 `ConvModule` 由 convolution、normalization以及activation layers 组成,更多细节请参考 [ConvModule api](api.html#mmcv.cnn.ConvModule)。
+
+```python
+from mmcv.cnn import ConvModule
+
+# conv + bn + relu
+conv = ConvModule(3, 8, 2, norm_cfg=dict(type='BN'))
+# conv + gn + relu
+conv = ConvModule(3, 8, 2, norm_cfg=dict(type='GN', num_groups=2))
+# conv + relu
+conv = ConvModule(3, 8, 2)
+# conv
+conv = ConvModule(3, 8, 2, act_cfg=None)
+# conv + leaky relu
+conv = ConvModule(3, 8, 3, padding=1, act_cfg=dict(type='LeakyReLU'))
+# bn + conv + relu
+conv = ConvModule(
+    3, 8, 2, norm_cfg=dict(type='BN'), order=('norm', 'conv', 'act'))
+```
diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/data_process.md b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/data_process.md
new file mode 100644
index 0000000000000000000000000000000000000000..7e0afd1e690b51d43d6e5b88cfa198dee32eb3d2
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/data_process.md
@@ -0,0 +1,275 @@
+## 数据处理
+
+### 图像
+
+图像模块提供了一些图像预处理的函数,该模块依赖 `opencv` 。
+
+#### 读取/保存/显示
+
+使用 `imread` 和 `imwrite` 函数可以读取和保存图像。
+
+```python
+import mmcv
+
+img = mmcv.imread('test.jpg')
+img = mmcv.imread('test.jpg', flag='grayscale')
+img_ = mmcv.imread(img)  # 相当于什么也没做
+mmcv.imwrite(img, 'out.jpg')
+```
+
+从二进制中读取图像
+
+```python
+with open('test.jpg', 'rb') as f:
+    data = f.read()
+img = mmcv.imfrombytes(data)
+```
+
+显示图像文件或已读取的图像
+
+```python
+mmcv.imshow('tests/data/color.jpg')
+
+for i in range(10):
+    img = np.random.randint(256, size=(100, 100, 3), dtype=np.uint8)
+    mmcv.imshow(img, win_name='test image', wait_time=200)
+```
+
+#### 色彩空间转换
+
+支持的转换函数:
+
+- bgr2gray
+- gray2bgr
+- bgr2rgb
+- rgb2bgr
+- bgr2hsv
+- hsv2bgr
+
+```python
+img = mmcv.imread('tests/data/color.jpg')
+img1 = mmcv.bgr2rgb(img)
+img2 = mmcv.rgb2gray(img1)
+img3 = mmcv.bgr2hsv(img)
+```
+
+#### 缩放
+
+有三种缩放图像的方法。所有以 `imresize_*` 开头的函数都有一个 `return_scale` 参数,如果
+该参数为 `False` ,函数的返回值只有调整之后的图像,否则是一个元组 `(resized_img, scale)` 。
+
+```python
+# 缩放图像至给定的尺寸
+mmcv.imresize(img, (1000, 600), return_scale=True)
+
+# 缩放图像至与给定的图像同样的尺寸
+mmcv.imresize_like(img, dst_img, return_scale=False)
+
+# 以一定的比例缩放图像
+mmcv.imrescale(img, 0.5)
+
+# 缩放图像至最长的边不大于1000、最短的边不大于800并且没有改变图像的长宽比
+mmcv.imrescale(img, (1000, 800))
+```
+
+#### 旋转
+
+我们可以使用 `imrotate` 旋转图像一定的角度。旋转的中心需要指定,默认值是原始图像的中心。有
+两种旋转的模式,一种保持图像的尺寸不变,因此旋转后原始图像中的某些部分会被裁剪,另一种是扩大
+图像的尺寸进而保留完整的原始图像。
+
+```python
+img = mmcv.imread('tests/data/color.jpg')
+
+# 顺时针旋转图像30度
+img_ = mmcv.imrotate(img, 30)
+
+# 逆时针旋转图像90度
+img_ = mmcv.imrotate(img, -90)
+
+# 顺时针旋转图像30度并且缩放图像为原始图像的1.5倍
+img_ = mmcv.imrotate(img, 30, scale=1.5)
+
+# 以坐标(100, 100)为中心顺时针旋转图像30度
+img_ = mmcv.imrotate(img, 30, center=(100, 100))
+
+# 顺时针旋转图像30度并扩大图像的尺寸
+img_ = mmcv.imrotate(img, 30, auto_bound=True)
+```
+
+#### 翻转
+
+我们可以使用 `imflip` 翻转图像。
+
+```python
+img = mmcv.imread('tests/data/color.jpg')
+
+# 水平翻转图像
+mmcv.imflip(img)
+
+# 垂直翻转图像
+mmcv.imflip(img, direction='vertical')
+```
+
+#### 裁剪
+
+`imcrop` 可以裁剪图像的一个或多个区域,每个区域用左上角和右下角坐标表示,形如(x1, y1, x2, y2)
+
+```python
+import mmcv
+import numpy as np
+
+img = mmcv.imread('tests/data/color.jpg')
+
+# 裁剪区域 (10, 10, 100, 120)
+bboxes = np.array([10, 10, 100, 120])
+patch = mmcv.imcrop(img, bboxes)
+
+# 裁剪两个区域,分别是 (10, 10, 100, 120) 和 (0, 0, 50, 50)
+bboxes = np.array([[10, 10, 100, 120], [0, 0, 50, 50]])
+patches = mmcv.imcrop(img, bboxes)
+
+# 裁剪两个区域并且缩放区域1.2倍
+patches = mmcv.imcrop(img, bboxes, scale=1.2)
+```
+
+#### 填充
+
+`impad` and `impad_to_multiple` 可以用给定的值将图像填充至给定的尺寸。
+
+```python
+img = mmcv.imread('tests/data/color.jpg')
+
+# 用给定值将图像填充至 (1000, 1200)
+img_ = mmcv.impad(img, shape=(1000, 1200), pad_val=0)
+
+# 用给定值分别填充图像的3个通道至 (1000, 1200)
+img_ = mmcv.impad(img, shape=(1000, 1200), pad_val=(100, 50, 200))
+
+# 用给定值填充图像的左、右、上、下四条边
+img_ = mmcv.impad(img, padding=(10, 20, 30, 40), pad_val=0)
+
+# 用3个值分别填充图像的左、右、上、下四条边的3个通道
+img_ = mmcv.impad(img, padding=(10, 20, 30, 40), pad_val=(100, 50, 200))
+
+# 将图像的四条边填充至能够被给定值整除
+img_ = mmcv.impad_to_multiple(img, 32)
+```
+
+### 视频
+
+视频模块提供了以下的功能:
+
+- 一个 `VideoReader` 类,具有友好的 API 接口可以读取和转换视频
+- 一些编辑视频的方法,包括 `cut` , `concat` , `resize`
+- 光流的读取/保存/变换
+
+#### VideoReader
+
+`VideoReader` 类提供了和序列一样的接口去获取视频帧。该类会缓存所有被访问过的帧。
+
+```python
+video = mmcv.VideoReader('test.mp4')
+
+# 获取基本的信息
+print(len(video))
+print(video.width, video.height, video.resolution, video.fps)
+
+# 遍历所有的帧
+for frame in video:
+    print(frame.shape)
+
+# 读取下一帧
+img = video.read()
+
+# 使用索引获取帧
+img = video[100]
+
+# 获取指定范围的帧
+img = video[5:10]
+```
+
+将视频切成帧并保存至给定目录或者从给定目录中生成视频。
+
+```python
+# 将视频切成帧并保存至目录
+video = mmcv.VideoReader('test.mp4')
+video.cvt2frames('out_dir')
+
+# 从给定目录中生成视频
+mmcv.frames2video('out_dir', 'test.avi')
+```
+
+#### 编辑函数
+
+有几个用于编辑视频的函数,这些函数是对 `ffmpeg` 的封装。
+
+```python
+# 裁剪视频
+mmcv.cut_video('test.mp4', 'clip1.mp4', start=3, end=10, vcodec='h264')
+
+# 将多个视频拼接成一个视频
+mmcv.concat_video(['clip1.mp4', 'clip2.mp4'], 'joined.mp4', log_level='quiet')
+
+# 将视频缩放至给定的尺寸
+mmcv.resize_video('test.mp4', 'resized1.mp4', (360, 240))
+
+# 将视频缩放至给定的倍率
+mmcv.resize_video('test.mp4', 'resized2.mp4', ratio=2)
+```
+
+#### 光流
+
+`mmcv` 提供了以下用于操作光流的函数:
+
+- 读取/保存
+- 可视化
+- 流变换
+
+我们提供了两种将光流dump到文件的方法,分别是非压缩和压缩的方法。非压缩的方法直接将浮点数值的光流
+保存至二进制文件,虽然光流无损但文件会比较大。而压缩的方法先量化光流至 0-255 整形数值再保存为
+jpeg图像。光流的x维度和y维度会被拼接到图像中。
+
+1. 读取/保存
+
+```python
+flow = np.random.rand(800, 600, 2).astype(np.float32)
+# 保存光流到flo文件 (~3.7M)
+mmcv.flowwrite(flow, 'uncompressed.flo')
+# 保存光流为jpeg图像 (~230K),图像的尺寸为 (800, 1200)
+mmcv.flowwrite(flow, 'compressed.jpg', quantize=True, concat_axis=1)
+
+# 读取光流文件,以下两种方式读取的光流尺寸均为 (800, 600, 2)
+flow = mmcv.flowread('uncompressed.flo')
+flow = mmcv.flowread('compressed.jpg', quantize=True, concat_axis=1)
+```
+
+2. 可视化
+
+使用 `mmcv.flowshow()` 可视化光流
+
+```python
+mmcv.flowshow(flow)
+```
+
+![progress](../../en/_static/flow_visualization.png)
+
+1. 流变换
+
+```python
+img1 = mmcv.imread('img1.jpg')
+flow = mmcv.flowread('flow.flo')
+warped_img2 = mmcv.flow_warp(img1, flow)
+```
+
+img1 (左) and img2 (右)
+
+![raw images](../../en/_static/flow_raw_images.png)
+
+光流 (img2 -> img1)
+
+![optical flow](../../en/_static/flow_img2toimg1.png)
+
+变换后的图像和真实图像的差异
+
+![warped image](../../en/_static/flow_warp_diff.png)
diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/data_transform.md b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/data_transform.md
new file mode 100644
index 0000000000000000000000000000000000000000..47d16e1b5279cdcdf8700876d3d94e152b3181a0
--- /dev/null
+++ b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/data_transform.md
@@ -0,0 +1,341 @@
+# 数据变换
+
+在 OpenMMLab 算法库中,数据集的构建和数据的准备是相互解耦的。通常,数据集的构建只对数据集进行解析,记录每个样本的基本信息;而数据的准备则是通过一系列的数据变换,根据样本的基本信息进行数据加载、预处理、格式化等操作。
+
+## 数据变换的设计
+
+在 MMCV 中,我们使用各种可调用的数据变换类来进行数据的操作。这些数据变换类可以接受若干配置参数进行实例化,之后通过调用的方式对输入的数据字典进行处理。同时,我们约定所有数据变换都接受一个字典作为输入,并将处理后的数据输出为一个字典。一个简单的例子如下:
+
+```python
+>>> import numpy as np
+>>> from mmcv.transforms import Resize
+>>>
+>>> transform = Resize(scale=(224, 224))
+>>> data_dict = {'img': np.random.rand(256, 256, 3)}
+>>> data_dict = transform(data_dict)
+>>> print(data_dict['img'].shape)
+(224, 224, 3)
+```
+
+数据变换类会读取输入字典的某些字段,并且可能添加、或者更新某些字段。这些字段的键大部分情况下是固定的,如 `Resize` 会固定地读取输入字典中的 `"img"` 等字段。我们可以在对应类的文档中了解对输入输出字段的约定。
+
+```{note}
+默认情况下,在需要图像尺寸作为**初始化参数**的数据变换 (如Resize, Pad) 中,图像尺寸的顺序均为 (width, height)。在数据变换**返回的字典**中,图像相关的尺寸, 如 `img_shape`、`ori_shape`、`pad_shape` 等,均为 (height, width)。
+```
+
+MMCV 为所有的数据变换类提供了一个统一的基类 (`BaseTransform`):
+
+```python
+class BaseTransform(metaclass=ABCMeta):
+
+    def __call__(self, results: dict) -> dict:
+
+        return self.transform(results)
+
+    @abstractmethod
+    def transform(self, results: dict) -> dict:
+        pass
+```
+
+所有的数据变换类都需要继承 `BaseTransform`,并实现 `transform` 方法。`transform` 方法的输入和输出均为一个字典。在**自定义数据变换类**一节中,我们会更详细地介绍如何实现一个数据变换类。
+
+## 数据流水线
+
+如上所述,所有数据变换的输入和输出都是一个字典,而且根据 OpenMMLab 中 [有关数据集的约定](TODO),数据集中每个样本的基本信息都是一个字典。这样一来,我们可以将所有的数据变换操作首尾相接,组合成为一条数据流水线(data pipeline),输入数据集中样本的信息字典,输出完成一系列处理后的信息字典。
+
+以分类任务为例,我们在下图展示了一个典型的数据流水线。对每个样本,数据集中保存的基本信息是一个如图中最左侧所示的字典,之后每经过一个由蓝色块代表的数据变换操作,数据字典中都会加入新的字段(标记为绿色)或更新现有的字段(标记为橙色)。
+
+
+ +
+ +在配置文件中,数据流水线是一个若干数据变换配置字典组成的列表,每个数据集都需要设置参数 `pipeline` 来定义该数据集需要进行的数据准备操作。如上数据流水线在配置文件中的配置如下: + +```python +pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=256, keep_ratio=True), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375]), + dict(type='ClsFormatBundle') +] + +dataset = dict( + ... + pipeline=pipeline, + ... +) +``` + +## 常用的数据变换类 + +按照功能,常用的数据变换类可以大致分为数据加载、数据预处理与增强、数据格式化。在 MMCV 中,我们提供了一些常用的数据变换类如下: + +### 数据加载 + +为了支持大规模数据集的加载,通常在 `Dataset` 初始化时不加载数据,只加载相应的路径。因此需要在数据流水线中进行具体数据的加载。 + +| class | 功能 | +| :-------------------------: | :---------------------------------------: | +| [`LoadImageFromFile`](TODO) | 根据路径加载图像 | +| [`LoadAnnotations`](TODO) | 加载和组织标注信息,如 bbox、语义分割图等 | + +### 数据预处理及增强 + +数据预处理和增强通常是对图像本身进行变换,如裁剪、填充、缩放等。 + +| class | 功能 | +| :------------------------------: | :--------------------------------: | +| [`Pad`](TODO) | 填充图像边缘 | +| [`CenterCrop`](TODO) | 居中裁剪 | +| [`Normalize`](TODO) | 对图像进行归一化 | +| [`Resize`](TODO) | 按照指定尺寸或比例缩放图像 | +| [`RandomResize`](TODO) | 缩放图像至指定范围的随机尺寸 | +| [`RandomMultiscaleResize`](TODO) | 缩放图像至多个尺寸中的随机一个尺寸 | +| [`RandomGrayscale`](TODO) | 随机灰度化 | +| [`RandomFlip`](TODO) | 图像随机翻转 | +| [`MultiScaleFlipAug`](TODO) | 支持缩放和翻转的测试时数据增强 | + +### 数据格式化 + +数据格式化操作通常是对数据进行的类型转换。 + +| class | 功能 | +| :---------------------: | :-------------------------------: | +| [`ToTensor`](TODO) | 将指定的数据转换为 `torch.Tensor` | +| [`ImageToTensor`](TODO) | 将图像转换为 `torch.Tensor` | + +## 自定义数据变换类 + +要实现一个新的数据变换类,需要继承 `BaseTransform`,并实现 `transform` 方法。这里,我们使用一个简单的翻转变换(`MyFlip`)作为示例: + +```python +import random +import mmcv +from mmcv.transforms import BaseTransform, TRANSFORMS + +@TRANSFORMS.register_module() +class MyFlip(BaseTransform): + def __init__(self, direction: str): + super().__init__() + self.direction = direction + + def transform(self, results: dict) -> dict: + img = results['img'] + results['img'] = mmcv.imflip(img, direction=self.direction) + return results +``` + +从而,我们可以实例化一个 `MyFlip` 对象,并将之作为一个可调用对象,来处理我们的数据字典。 + +```python +import numpy as np + +transform = MyFlip(direction='horizontal') +data_dict = {'img': np.random.rand(224, 224, 3)} +data_dict = transform(data_dict) +processed_img = data_dict['img'] +``` + +又或者,在配置文件的 pipeline 中使用 `MyFlip` 变换 + +```python +pipeline = [ + ... + dict(type='MyFlip', direction='horizontal'), + ... +] +``` + +需要注意的是,如需在配置文件中使用,需要保证 `MyFlip` 类所在的文件在运行时能够被导入。 + +## 变换包装 + +变换包装是一种特殊的数据变换类,他们本身并不操作数据字典中的图像、标签等信息,而是对其中定义的数据变换的行为进行增强。 + +### 字段映射(KeyMapper) + +字段映射包装(`KeyMapper`)用于对数据字典中的字段进行映射。例如,一般的图像处理变换都从数据字典中的 `"img"` 字段获得值。但有些时候,我们希望这些变换处理数据字典中其他字段中的图像,比如 `"gt_img"` 字段。 + +如果配合注册器和配置文件使用的话,在配置文件中数据集的 `pipeline` 中如下例使用字段映射包装: + +```python +pipeline = [ + ... + dict(type='KeyMapper', + mapping={ + 'img': 'gt_img', # 将 "gt_img" 字段映射至 "img" 字段 + 'mask': ..., # 不使用原始数据中的 "mask" 字段。即对于被包装的数据变换,数据中不包含 "mask" 字段 + }, + auto_remap=True, # 在完成变换后,将 "img" 重映射回 "gt_img" 字段 + transforms=[ + # 在 `RandomFlip` 变换类中,我们只需要操作 "img" 字段即可 + dict(type='RandomFlip'), + ]) + ... +] +``` + +利用字段映射包装,我们在实现数据变换类时,不需要考虑在 `transform` 方法中考虑各种可能的输入字段名,只需要处理默认的字段即可。 + +### 随机选择(RandomChoice)和随机执行(RandomApply) + +随机选择包装(`RandomChoice`)用于从一系列数据变换组合中随机应用一个数据变换组合。利用这一包装,我们可以简单地实现一些数据增强功能,比如 AutoAugment。 + +如果配合注册器和配置文件使用的话,在配置文件中数据集的 `pipeline` 中如下例使用随机选择包装: + +```python +pipeline = [ + ... + dict(type='RandomChoice', + transforms=[ + [ + dict(type='Posterize', bits=4), + dict(type='Rotate', angle=30.) + ], # 第一种随机变化组合 + [ + dict(type='Equalize'), + dict(type='Rotate', angle=30) + ], # 第二种随机变换组合 + ], + prob=[0.4, 0.6] # 两种随机变换组合各自的选用概率 + ) + ... +] +``` + +随机执行包装(`RandomApply`)用于以指定概率随机执行数据变换组合。例如: + +```python +pipeline = [ + ... + dict(type='RandomApply', + transforms=[dict(type='Rotate', angle=30.)], + prob=0.3) # 以 0.3 的概率执行被包装的数据变换 + ... +] +``` + +### 多目标扩展(TransformBroadcaster) + +通常,一个数据变换类只会从一个固定的字段读取操作目标。虽然我们也可以使用 `KeyMapper` 来改变读取的字段,但无法将变换一次性应用于多个字段的数据。为了实现这一功能,我们需要借助多目标扩展包装(`TransformBroadcaster`)。 + +多目标扩展包装(`TransformBroadcaster`)有两个用法,一是将数据变换作用于指定的多个字段,二是将数据变换作用于某个字段下的一组目标中。 + +1. 应用于多个字段 + + 假设我们需要将数据变换应用于 `"lq"` (low-quality) 和 `"gt"` (ground-truth) 两个字段中的图像上。 + + ```python + pipeline = [ + dict(type='TransformBroadcaster', + # 分别应用于 "lq" 和 "gt" 两个字段,并将二者应设置 "img" 字段 + mapping={'img': ['lq', 'gt']}, + # 在完成变换后,将 "img" 字段重映射回原先的字段 + auto_remap=True, + # 是否在对各目标的变换中共享随机变量 + # 更多介绍参加后续章节(随机变量共享) + share_random_params=True, + transforms=[ + # 在 `RandomFlip` 变换类中,我们只需要操作 "img" 字段即可 + dict(type='RandomFlip'), + ]) + ] + ``` + + 在多目标扩展的 `mapping` 设置中,我们同样可以使用 `...` 来忽略指定的原始字段。如以下例子中,被包裹的 `RandomCrop` 会对字段 `"img"` 中的图像进行裁剪,并且在字段 `"img_shape"` 存在时更新剪裁后的图像大小。如果我们希望同时对两个图像字段 `"lq"` 和 `"gt"` 进行相同的随机裁剪,但只更新一次 `"img_shape"` 字段,可以通过例子中的方式实现: + + ```python + pipeline = [ + dict(type='TransformBroadcaster', + mapping={ + 'img': ['lq', 'gt'], + 'img_shape': ['img_shape', ...], + }, + # 在完成变换后,将 "img" 和 "img_shape" 字段重映射回原先的字段 + auto_remap=True, + # 是否在对各目标的变换中共享随机变量 + # 更多介绍参加后续章节(随机变量共享) + share_random_params=True, + transforms=[ + # `RandomCrop` 类中会操作 "img" 和 "img_shape" 字段。若 "img_shape" 空缺, + # 则只操作 "img" + dict(type='RandomCrop'), + ]) + ] + ``` + +2. 应用于一个字段的一组目标 + + 假设我们需要将数据变换应用于 `"images"` 字段,该字段为一个图像组成的 list。 + + ```python + pipeline = [ + dict(type='TransformBroadcaster', + # 将 "images" 字段下的每张图片映射至 "img" 字段 + mapping={'img': 'images'}, + # 在完成变换后,将 "img" 字段下的图片重映射回 "images" 字段的列表中 + auto_remap=True, + # 是否在对各目标的变换中共享随机变量 + share_random_params=True, + transforms=[ + # 在 `RandomFlip` 变换类中,我们只需要操作 "img" 字段即可 + dict(type='RandomFlip'), + ]) + ] + ``` + +#### 装饰器 `cache_randomness` + +在 `TransformBroadcaster` 中,我们提供了 `share_random_params` 选项来支持在多次数据变换中共享随机状态。例如,在超分辨率任务中,我们希望将随机变换**同步**作用于低分辨率图像和原始图像。如果我们希望在自定义的数据变换类中使用这一功能,需要在类中标注哪些随机变量是支持共享的。这可以通过装饰器 `cache_randomness` 来实现。 + +以上文中的 `MyFlip` 为例,我们希望以一定的概率随机执行翻转: + +```python +from mmcv.transforms.utils import cache_randomness + +@TRANSFORMS.register_module() +class MyRandomFlip(BaseTransform): + def __init__(self, prob: float, direction: str): + super().__init__() + self.prob = prob + self.direction = direction + + @cache_randomness # 标注该方法的输出为可共享的随机变量 + def do_flip(self): + flip = True if random.random() > self.prob else False + return flip + + def transform(self, results: dict) -> dict: + img = results['img'] + if self.do_flip(): + results['img'] = mmcv.imflip(img, direction=self.direction) + return results +``` + +在上面的例子中,我们用`cache_randomness` 装饰 `do_flip`方法,即将该方法返回值 `flip` 标注为一个支持共享的随机变量。进而,在 `TransformBroadcaster` 对多个目标的变换中,这一变量的值都会保持一致。 + +#### 装饰器 `avoid_cache_randomness` + +在一些情况下,我们无法将数据变换中产生随机变量的过程单独放在类方法中。例如数据变换中使用的来自第三方库的模块,这些模块将随机变量相关的部分封装在了内部,导致无法将其抽出为数据变换的类方法。这样的数据变换无法通过装饰器 `cache_randomness` 标注支持共享的随机变量,进而无法在多目标扩展时共享随机变量。 + +为了避免在多目标扩展中误用此类数据变换,我们提供了另一个装饰器 `avoid_cache_randomness`,用来对此类数据变换进行标记: + +```python +from mmcv.transforms.utils import avoid_cache_randomness + +@TRANSFORMS.register_module() +@avoid_cache_randomness +class MyRandomTransform(BaseTransform): + + def transform(self, results: dict) -> dict: + ... +``` + +用 `avoid_cache_randomness` 标记的数据变换类,当其实例被 `TransformBroadcaster` 包装且将参数 `share_random_params` 设置为 True 时,会抛出异常,以此提醒用户不能这样使用。 + +在使用 `avoid_cache_randomness` 时需要注意以下几点: + +1. `avoid_cache_randomness` 只用于装饰数据变换类(BaseTransfrom 的子类),而不能用与装饰其他一般的类、类方法或函数 +2. 被 `avoid_cache_randomness` 修饰的数据变换作为基类时,其子类将**不会继承**这一特性。如果子类仍无法共享随机变量,则应再次使用 `avoid_cache_randomness` 修饰 +3. 只有当一个数据变换具有随机性,且无法共享随机参数时,才需要以 `avoid_cache_randomness` 修饰。无随机性的数据变换不需要修饰 diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/ops.md b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/ops.md new file mode 100644 index 0000000000000000000000000000000000000000..ba744daf110da2e78ccf596ff2cd629a2280344b --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/ops.md @@ -0,0 +1,66 @@ +## 算子 + +MMCV 提供了检测、分割等任务中常用的算子 + +| Device | CPU | CUDA | MLU | MPS | Ascend | +| ---------------------------- | --- | ---- | --- | --- | ------ | +| ActiveRotatedFilter | √ | √ | | | √ | +| AssignScoreWithK | | √ | | | | +| BallQuery | | √ | √ | | | +| BBoxOverlaps | | √ | √ | √ | √ | +| BorderAlign | | √ | | | | +| BoxIouRotated | √ | √ | √ | | √ | +| BoxIouQuadri | √ | √ | | | | +| CARAFE | | √ | √ | | | +| ChamferDistance | | √ | | | | +| CrissCrossAttention | | √ | | | | +| ContourExpand | √ | | | | | +| ConvexIoU | | √ | | | | +| CornerPool | | √ | | | | +| Correlation | | √ | | | | +| Deformable Convolution v1/v2 | √ | √ | √ | | √ | +| Deformable RoIPool | | √ | √ | | √ | +| DiffIoURotated | | √ | √ | | | +| DynamicScatter | | √ | √ | | | +| FurthestPointSample | | √ | | | | +| FurthestPointSampleWithDist | | √ | | | | +| FusedBiasLeakyrelu | | √ | | | √ | +| GatherPoints | | √ | | | √ | +| GroupPoints | | √ | | | | +| Iou3d | | √ | √ | | | +| KNN | | √ | | | | +| MaskedConv | | √ | √ | | √ | +| MergeCells | | √ | | | | +| MinAreaPolygon | | √ | | | | +| ModulatedDeformConv2d | √ | √ | √ | | √ | +| MultiScaleDeformableAttn | | √ | √ | | | +| NMS | √ | √ | √ | | √ | +| NMSRotated | √ | √ | √ | | √ | +| NMSQuadri | √ | √ | | | | +| PixelGroup | √ | | | | | +| PointsInBoxes | √ | √ | | | | +| PointsInPolygons | | √ | | | | +| PSAMask | √ | √ | √ | | √ | +| RotatedFeatureAlign | √ | √ | √ | | | +| RoIPointPool3d | | √ | √ | | | +| RoIPool | | √ | √ | | √ | +| RoIAlignRotated | √ | √ | √ | | | +| RiRoIAlignRotated | | √ | | | | +| RoIAlign | √ | √ | √ | | √ | +| RoIAwarePool3d | | √ | √ | | | +| SAConv2d | | √ | | | | +| SigmoidFocalLoss | | √ | √ | | √ | +| SoftmaxFocalLoss | | √ | | | √ | +| SoftNMS | | √ | | | | +| Sparse Convolution | | √ | √ | | | +| Synchronized BatchNorm | | √ | | | | +| ThreeInterpolate | | √ | | | | +| ThreeNN | | √ | √ | | | +| TINShift | | √ | √ | | | +| UpFirDn2d | | √ | | | | +| Voxelization | √ | √ | √ | | √ | +| PrRoIPool | | √ | | | | +| BezierAlign | √ | √ | | | | +| BiasAct | | √ | | | | +| FilteredLrelu | | √ | | | | +| Conv2dGradfix | | √ | | | | diff --git a/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/visualization.md b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/visualization.md new file mode 100644 index 0000000000000000000000000000000000000000..9ad26c6a822cae0c084c52e204baa07b88627b97 --- /dev/null +++ b/FoodSeg103/demo/mmcv/docs/zh_cn/understand_mmcv/visualization.md @@ -0,0 +1,24 @@ +## 可视化 + +`mmcv` 可以展示图像以及标注(目前只支持标注框) + +```python +# 展示图像文件 +mmcv.imshow('a.jpg') + +# 展示已加载的图像 +img = np.random.rand(100, 100, 3) +mmcv.imshow(img) + +# 展示带有标注框的图像 +img = np.random.rand(100, 100, 3) +bboxes = np.array([[0, 0, 50, 50], [20, 20, 60, 60]]) +mmcv.imshow_bboxes(img, bboxes) +``` + +`mmcv` 也可以展示特殊的图像,例如光流 + +```python +flow = mmcv.flowread('test.flo') +mmcv.flowshow(flow) +``` diff --git a/FoodSeg103/demo/mmcv/mmcv/__init__.py b/FoodSeg103/demo/mmcv/mmcv/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2410ea555e905acb450792a427596764e16f62d3 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# flake8: noqa +from .arraymisc import * +from .image import * +from .transforms import * +from .version import * +from .video import * +from .visualization import * + +# The following modules are not imported to this level, so mmcv may be used +# without PyTorch. +# - op +# - utils diff --git a/FoodSeg103/demo/mmcv/mmcv/arraymisc/__init__.py b/FoodSeg103/demo/mmcv/mmcv/arraymisc/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..4b4700d6139ae3d604ff6e542468cce4200c020c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/arraymisc/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .quantization import dequantize, quantize + +__all__ = ['quantize', 'dequantize'] diff --git a/FoodSeg103/demo/mmcv/mmcv/arraymisc/quantization.py b/FoodSeg103/demo/mmcv/mmcv/arraymisc/quantization.py new file mode 100644 index 0000000000000000000000000000000000000000..6182710d51787061304cfc7304ec97d565822536 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/arraymisc/quantization.py @@ -0,0 +1,65 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Union + +import numpy as np + + +def quantize(arr: np.ndarray, + min_val: Union[int, float], + max_val: Union[int, float], + levels: int, + dtype=np.int64) -> tuple: + """Quantize an array of (-inf, inf) to [0, levels-1]. + + Args: + arr (ndarray): Input array. + min_val (int or float): Minimum value to be clipped. + max_val (int or float): Maximum value to be clipped. + levels (int): Quantization levels. + dtype (np.type): The type of the quantized array. + + Returns: + tuple: Quantized array. + """ + if not (isinstance(levels, int) and levels > 1): + raise ValueError( + f'levels must be a positive integer, but got {levels}') + if min_val >= max_val: + raise ValueError( + f'min_val ({min_val}) must be smaller than max_val ({max_val})') + + arr = np.clip(arr, min_val, max_val) - min_val + quantized_arr = np.minimum( + np.floor(levels * arr / (max_val - min_val)).astype(dtype), levels - 1) + + return quantized_arr + + +def dequantize(arr: np.ndarray, + min_val: Union[int, float], + max_val: Union[int, float], + levels: int, + dtype=np.float64) -> tuple: + """Dequantize an array. + + Args: + arr (ndarray): Input array. + min_val (int or float): Minimum value to be clipped. + max_val (int or float): Maximum value to be clipped. + levels (int): Quantization levels. + dtype (np.type): The type of the dequantized array. + + Returns: + tuple: Dequantized array. + """ + if not (isinstance(levels, int) and levels > 1): + raise ValueError( + f'levels must be a positive integer, but got {levels}') + if min_val >= max_val: + raise ValueError( + f'min_val ({min_val}) must be smaller than max_val ({max_val})') + + dequantized_arr = (arr + 0.5).astype(dtype) * (max_val - + min_val) / levels + min_val + + return dequantized_arr diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/__init__.py b/FoodSeg103/demo/mmcv/mmcv/cnn/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..10e7e027e4da544f42a6a4fe3400d9413a57e081 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/__init__.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .alexnet import AlexNet +# yapf: disable +from .bricks import (ContextBlock, Conv2d, Conv3d, ConvAWS2d, ConvModule, + ConvTranspose2d, ConvTranspose3d, ConvWS2d, + DepthwiseSeparableConvModule, GeneralizedAttention, + HSigmoid, HSwish, Linear, MaxPool2d, MaxPool3d, + NonLocal1d, NonLocal2d, NonLocal3d, Scale, Swish, + build_activation_layer, build_conv_layer, + build_norm_layer, build_padding_layer, build_plugin_layer, + build_upsample_layer, conv_ws_2d, is_norm) +# yapf: enable +from .resnet import ResNet, make_res_layer +from .rfsearch import Conv2dRFSearchOp, RFSearchHook +from .utils import fuse_conv_bn, get_model_complexity_info +from .vgg import VGG, make_vgg_layer + +__all__ = [ + 'AlexNet', 'VGG', 'make_vgg_layer', 'ResNet', 'make_res_layer', + 'ConvModule', 'build_activation_layer', 'build_conv_layer', + 'build_norm_layer', 'build_padding_layer', 'build_upsample_layer', + 'build_plugin_layer', 'is_norm', 'NonLocal1d', 'NonLocal2d', 'NonLocal3d', + 'ContextBlock', 'HSigmoid', 'Swish', 'HSwish', 'GeneralizedAttention', + 'Scale', 'conv_ws_2d', 'ConvAWS2d', 'ConvWS2d', + 'DepthwiseSeparableConvModule', 'Linear', 'Conv2d', 'ConvTranspose2d', + 'MaxPool2d', 'ConvTranspose3d', 'MaxPool3d', 'Conv3d', 'fuse_conv_bn', + 'get_model_complexity_info', 'Conv2dRFSearchOp', 'RFSearchHook' +] diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/alexnet.py b/FoodSeg103/demo/mmcv/mmcv/cnn/alexnet.py new file mode 100644 index 0000000000000000000000000000000000000000..309be24b66049c86837c67d24ee0e790e6396abc --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/alexnet.py @@ -0,0 +1,63 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +from typing import Optional + +import torch +import torch.nn as nn +from mmengine.runner import load_checkpoint + + +class AlexNet(nn.Module): + """AlexNet backbone. + + Args: + num_classes (int): number of classes for classification. + """ + + def __init__(self, num_classes: int = -1): + super().__init__() + self.num_classes = num_classes + self.features = nn.Sequential( + nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2), + nn.ReLU(inplace=True), + nn.MaxPool2d(kernel_size=3, stride=2), + nn.Conv2d(64, 192, kernel_size=5, padding=2), + nn.ReLU(inplace=True), + nn.MaxPool2d(kernel_size=3, stride=2), + nn.Conv2d(192, 384, kernel_size=3, padding=1), + nn.ReLU(inplace=True), + nn.Conv2d(384, 256, kernel_size=3, padding=1), + nn.ReLU(inplace=True), + nn.Conv2d(256, 256, kernel_size=3, padding=1), + nn.ReLU(inplace=True), + nn.MaxPool2d(kernel_size=3, stride=2), + ) + if self.num_classes > 0: + self.classifier = nn.Sequential( + nn.Dropout(), + nn.Linear(256 * 6 * 6, 4096), + nn.ReLU(inplace=True), + nn.Dropout(), + nn.Linear(4096, 4096), + nn.ReLU(inplace=True), + nn.Linear(4096, num_classes), + ) + + def init_weights(self, pretrained: Optional[str] = None) -> None: + if isinstance(pretrained, str): + logger = logging.getLogger() + load_checkpoint(self, pretrained, strict=False, logger=logger) + elif pretrained is None: + # use default initializer + pass + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x: torch.Tensor) -> torch.Tensor: + + x = self.features(x) + if self.num_classes > 0: + x = x.view(x.size(0), 256 * 6 * 6) + x = self.classifier(x) + + return x diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/__init__.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..6c74986953bf1a23a246c92c51fd14e033b6d682 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/__init__.py @@ -0,0 +1,32 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .activation import build_activation_layer +from .context_block import ContextBlock +from .conv import build_conv_layer +from .conv2d_adaptive_padding import Conv2dAdaptivePadding +from .conv_module import ConvModule +from .conv_ws import ConvAWS2d, ConvWS2d, conv_ws_2d +from .depthwise_separable_conv_module import DepthwiseSeparableConvModule +from .drop import Dropout, DropPath +from .generalized_attention import GeneralizedAttention +from .hsigmoid import HSigmoid +from .hswish import HSwish +from .non_local import NonLocal1d, NonLocal2d, NonLocal3d +from .norm import build_norm_layer, is_norm +from .padding import build_padding_layer +from .plugin import build_plugin_layer +from .scale import LayerScale, Scale +from .swish import Swish +from .upsample import build_upsample_layer +from .wrappers import (Conv2d, Conv3d, ConvTranspose2d, ConvTranspose3d, + Linear, MaxPool2d, MaxPool3d) + +__all__ = [ + 'ConvModule', 'build_activation_layer', 'build_conv_layer', + 'build_norm_layer', 'build_padding_layer', 'build_upsample_layer', + 'build_plugin_layer', 'is_norm', 'HSigmoid', 'HSwish', 'NonLocal1d', + 'NonLocal2d', 'NonLocal3d', 'ContextBlock', 'GeneralizedAttention', + 'Scale', 'ConvAWS2d', 'ConvWS2d', 'conv_ws_2d', + 'DepthwiseSeparableConvModule', 'Swish', 'Linear', 'Conv2dAdaptivePadding', + 'Conv2d', 'ConvTranspose2d', 'MaxPool2d', 'ConvTranspose3d', 'MaxPool3d', + 'Conv3d', 'Dropout', 'DropPath', 'LayerScale' +] diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/activation.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/activation.py new file mode 100644 index 0000000000000000000000000000000000000000..ae99714b940913c946fa169883584ea193f645ea --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/activation.py @@ -0,0 +1,114 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Dict + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.registry import MODELS +from mmengine.utils import digit_version +from mmengine.utils.dl_utils import TORCH_VERSION + +for module in [ + nn.ReLU, nn.LeakyReLU, nn.PReLU, nn.RReLU, nn.ReLU6, nn.ELU, + nn.Sigmoid, nn.Tanh +]: + MODELS.register_module(module=module) + +if digit_version(torch.__version__) >= digit_version('1.7.0'): + MODELS.register_module(module=nn.SiLU, name='SiLU') +else: + + class SiLU(nn.Module): + """Sigmoid Weighted Liner Unit.""" + + def __init__(self, inplace=False): + super().__init__() + self.inplace = inplace + + def forward(self, inputs) -> torch.Tensor: + if self.inplace: + return inputs.mul_(torch.sigmoid(inputs)) + else: + return inputs * torch.sigmoid(inputs) + + MODELS.register_module(module=SiLU, name='SiLU') + + +@MODELS.register_module(name='Clip') +@MODELS.register_module() +class Clamp(nn.Module): + """Clamp activation layer. + + This activation function is to clamp the feature map value within + :math:`[min, max]`. More details can be found in ``torch.clamp()``. + + Args: + min (Number | optional): Lower-bound of the range to be clamped to. + Default to -1. + max (Number | optional): Upper-bound of the range to be clamped to. + Default to 1. + """ + + def __init__(self, min: float = -1., max: float = 1.): + super().__init__() + self.min = min + self.max = max + + def forward(self, x) -> torch.Tensor: + """Forward function. + + Args: + x (torch.Tensor): The input tensor. + + Returns: + torch.Tensor: Clamped tensor. + """ + return torch.clamp(x, min=self.min, max=self.max) + + +class GELU(nn.Module): + r"""Applies the Gaussian Error Linear Units function: + + .. math:: + \text{GELU}(x) = x * \Phi(x) + where :math:`\Phi(x)` is the Cumulative Distribution Function for + Gaussian Distribution. + + Shape: + - Input: :math:`(N, *)` where `*` means, any number of additional + dimensions + - Output: :math:`(N, *)`, same shape as the input + + .. image:: scripts/activation_images/GELU.png + + Examples:: + + >>> m = nn.GELU() + >>> input = torch.randn(2) + >>> output = m(input) + """ + + def forward(self, input: torch.Tensor) -> torch.Tensor: + return F.gelu(input) + + +if (TORCH_VERSION == 'parrots' + or digit_version(TORCH_VERSION) < digit_version('1.4')): + MODELS.register_module(module=GELU) +else: + MODELS.register_module(module=nn.GELU) + + +def build_activation_layer(cfg: Dict) -> nn.Module: + """Build activation layer. + + Args: + cfg (dict): The activation layer config, which should contain: + + - type (str): Layer type. + - layer args: Args needed to instantiate an activation layer. + + Returns: + nn.Module: Created activation layer. + """ + return MODELS.build(cfg) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/context_block.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/context_block.py new file mode 100644 index 0000000000000000000000000000000000000000..1e78df8648b779124091a8595282aad7a8d0d305 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/context_block.py @@ -0,0 +1,126 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Union + +import torch +from mmengine.model import constant_init, kaiming_init +from mmengine.registry import MODELS +from torch import nn + + +def last_zero_init(m: Union[nn.Module, nn.Sequential]) -> None: + if isinstance(m, nn.Sequential): + constant_init(m[-1], val=0) + else: + constant_init(m, val=0) + + +@MODELS.register_module() +class ContextBlock(nn.Module): + """ContextBlock module in GCNet. + + See 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + (https://arxiv.org/abs/1904.11492) for details. + + Args: + in_channels (int): Channels of the input feature map. + ratio (float): Ratio of channels of transform bottleneck + pooling_type (str): Pooling method for context modeling. + Options are 'att' and 'avg', stand for attention pooling and + average pooling respectively. Default: 'att'. + fusion_types (Sequence[str]): Fusion method for feature fusion, + Options are 'channels_add', 'channel_mul', stand for channelwise + addition and multiplication respectively. Default: ('channel_add',) + """ + + _abbr_ = 'context_block' + + def __init__(self, + in_channels: int, + ratio: float, + pooling_type: str = 'att', + fusion_types: tuple = ('channel_add', )): + super().__init__() + assert pooling_type in ['avg', 'att'] + assert isinstance(fusion_types, (list, tuple)) + valid_fusion_types = ['channel_add', 'channel_mul'] + assert all([f in valid_fusion_types for f in fusion_types]) + assert len(fusion_types) > 0, 'at least one fusion should be used' + self.in_channels = in_channels + self.ratio = ratio + self.planes = int(in_channels * ratio) + self.pooling_type = pooling_type + self.fusion_types = fusion_types + if pooling_type == 'att': + self.conv_mask = nn.Conv2d(in_channels, 1, kernel_size=1) + self.softmax = nn.Softmax(dim=2) + else: + self.avg_pool = nn.AdaptiveAvgPool2d(1) + if 'channel_add' in fusion_types: + self.channel_add_conv = nn.Sequential( + nn.Conv2d(self.in_channels, self.planes, kernel_size=1), + nn.LayerNorm([self.planes, 1, 1]), + nn.ReLU(inplace=True), # yapf: disable + nn.Conv2d(self.planes, self.in_channels, kernel_size=1)) + else: + self.channel_add_conv = None + if 'channel_mul' in fusion_types: + self.channel_mul_conv = nn.Sequential( + nn.Conv2d(self.in_channels, self.planes, kernel_size=1), + nn.LayerNorm([self.planes, 1, 1]), + nn.ReLU(inplace=True), # yapf: disable + nn.Conv2d(self.planes, self.in_channels, kernel_size=1)) + else: + self.channel_mul_conv = None + self.reset_parameters() + + def reset_parameters(self): + if self.pooling_type == 'att': + kaiming_init(self.conv_mask, mode='fan_in') + self.conv_mask.inited = True + + if self.channel_add_conv is not None: + last_zero_init(self.channel_add_conv) + if self.channel_mul_conv is not None: + last_zero_init(self.channel_mul_conv) + + def spatial_pool(self, x: torch.Tensor) -> torch.Tensor: + batch, channel, height, width = x.size() + if self.pooling_type == 'att': + input_x = x + # [N, C, H * W] + input_x = input_x.view(batch, channel, height * width) + # [N, 1, C, H * W] + input_x = input_x.unsqueeze(1) + # [N, 1, H, W] + context_mask = self.conv_mask(x) + # [N, 1, H * W] + context_mask = context_mask.view(batch, 1, height * width) + # [N, 1, H * W] + context_mask = self.softmax(context_mask) + # [N, 1, H * W, 1] + context_mask = context_mask.unsqueeze(-1) + # [N, 1, C, 1] + context = torch.matmul(input_x, context_mask) + # [N, C, 1, 1] + context = context.view(batch, channel, 1, 1) + else: + # [N, C, 1, 1] + context = self.avg_pool(x) + + return context + + def forward(self, x: torch.Tensor) -> torch.Tensor: + # [N, C, 1, 1] + context = self.spatial_pool(x) + + out = x + if self.channel_mul_conv is not None: + # [N, C, 1, 1] + channel_mul_term = torch.sigmoid(self.channel_mul_conv(context)) + out = out * channel_mul_term + if self.channel_add_conv is not None: + # [N, C, 1, 1] + channel_add_term = self.channel_add_conv(context) + out = out + channel_add_term + + return out diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv.py new file mode 100644 index 0000000000000000000000000000000000000000..a00b0a52cee31ff7d4dd8df00b1e1046767a6903 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv.py @@ -0,0 +1,51 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import inspect +from typing import Dict, Optional + +from mmengine.registry import MODELS +from torch import nn + +MODELS.register_module('Conv1d', module=nn.Conv1d) +MODELS.register_module('Conv2d', module=nn.Conv2d) +MODELS.register_module('Conv3d', module=nn.Conv3d) +MODELS.register_module('Conv', module=nn.Conv2d) + + +def build_conv_layer(cfg: Optional[Dict], *args, **kwargs) -> nn.Module: + """Build convolution layer. + + Args: + cfg (None or dict): The conv layer config, which should contain: + - type (str): Layer type. + - layer args: Args needed to instantiate an conv layer. + args (argument list): Arguments passed to the `__init__` + method of the corresponding conv layer. + kwargs (keyword arguments): Keyword arguments passed to the `__init__` + method of the corresponding conv layer. + + Returns: + nn.Module: Created conv layer. + """ + if cfg is None: + cfg_ = dict(type='Conv2d') + else: + if not isinstance(cfg, dict): + raise TypeError('cfg must be a dict') + if 'type' not in cfg: + raise KeyError('the cfg dict must contain the key "type"') + cfg_ = cfg.copy() + + layer_type = cfg_.pop('type') + if inspect.isclass(layer_type): + return layer_type(*args, **kwargs, **cfg_) # type: ignore + # Switch registry to the target scope. If `conv_layer` cannot be found + # in the registry, fallback to search `conv_layer` in the + # mmengine.MODELS. + with MODELS.switch_scope_and_registry(None) as registry: + conv_layer = registry.get(layer_type) + if conv_layer is None: + raise KeyError(f'Cannot find {conv_layer} in registry under scope ' + f'name {registry.scope}') + layer = conv_layer(*args, **kwargs, **cfg_) + + return layer diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv2d_adaptive_padding.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv2d_adaptive_padding.py new file mode 100644 index 0000000000000000000000000000000000000000..0ac9949e4830c64161036b519594685f7dae72c2 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv2d_adaptive_padding.py @@ -0,0 +1,63 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +from typing import Tuple, Union + +import torch +from mmengine.registry import MODELS +from torch import nn +from torch.nn import functional as F + + +@MODELS.register_module() +class Conv2dAdaptivePadding(nn.Conv2d): + """Implementation of 2D convolution in tensorflow with `padding` as "same", + which applies padding to input (if needed) so that input image gets fully + covered by filter and stride you specified. For stride 1, this will ensure + that output image size is same as input. For stride of 2, output dimensions + will be half, for example. + + Args: + in_channels (int): Number of channels in the input image + out_channels (int): Number of channels produced by the convolution + kernel_size (int or tuple): Size of the convolving kernel + stride (int or tuple, optional): Stride of the convolution. Default: 1 + padding (int or tuple, optional): Zero-padding added to both sides of + the input. Default: 0 + dilation (int or tuple, optional): Spacing between kernel elements. + Default: 1 + groups (int, optional): Number of blocked connections from input + channels to output channels. Default: 1 + bias (bool, optional): If ``True``, adds a learnable bias to the + output. Default: ``True`` + """ + + def __init__(self, + in_channels: int, + out_channels: int, + kernel_size: Union[int, Tuple[int, int]], + stride: Union[int, Tuple[int, int]] = 1, + padding: Union[int, Tuple[int, int]] = 0, + dilation: Union[int, Tuple[int, int]] = 1, + groups: int = 1, + bias: bool = True): + super().__init__(in_channels, out_channels, kernel_size, stride, 0, + dilation, groups, bias) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + img_h, img_w = x.size()[-2:] + kernel_h, kernel_w = self.weight.size()[-2:] + stride_h, stride_w = self.stride + output_h = math.ceil(img_h / stride_h) + output_w = math.ceil(img_w / stride_w) + pad_h = ( + max((output_h - 1) * self.stride[0] + + (kernel_h - 1) * self.dilation[0] + 1 - img_h, 0)) + pad_w = ( + max((output_w - 1) * self.stride[1] + + (kernel_w - 1) * self.dilation[1] + 1 - img_w, 0)) + if pad_h > 0 or pad_w > 0: + x = F.pad(x, [ + pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2 + ]) + return F.conv2d(x, self.weight, self.bias, self.stride, self.padding, + self.dilation, self.groups) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv_module.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv_module.py new file mode 100644 index 0000000000000000000000000000000000000000..760e3788125300e47769bce0bc34156e8385791b --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv_module.py @@ -0,0 +1,338 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from functools import partial +from typing import Dict, Optional, Tuple, Union + +import torch +import torch.nn as nn +from mmengine.model import constant_init, kaiming_init +from mmengine.registry import MODELS +from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm, _InstanceNorm + +from .activation import build_activation_layer +from .conv import build_conv_layer +from .norm import build_norm_layer +from .padding import build_padding_layer + + +def efficient_conv_bn_eval_forward(bn: _BatchNorm, + conv: nn.modules.conv._ConvNd, + x: torch.Tensor): + """ + Implementation based on https://arxiv.org/abs/2305.11624 + "Tune-Mode ConvBN Blocks For Efficient Transfer Learning" + It leverages the associative law between convolution and affine transform, + i.e., normalize (weight conv feature) = (normalize weight) conv feature. + It works for Eval mode of ConvBN blocks during validation, and can be used + for training as well. It reduces memory and computation cost. + + Args: + bn (_BatchNorm): a BatchNorm module. + conv (nn._ConvNd): a conv module + x (torch.Tensor): Input feature map. + """ + # These lines of code are designed to deal with various cases + # like bn without affine transform, and conv without bias + weight_on_the_fly = conv.weight + if conv.bias is not None: + bias_on_the_fly = conv.bias + else: + bias_on_the_fly = torch.zeros_like(bn.running_var) + + if bn.weight is not None: + bn_weight = bn.weight + else: + bn_weight = torch.ones_like(bn.running_var) + + if bn.bias is not None: + bn_bias = bn.bias + else: + bn_bias = torch.zeros_like(bn.running_var) + + # shape of [C_out, 1, 1, 1] in Conv2d + weight_coeff = torch.rsqrt(bn.running_var + + bn.eps).reshape([-1] + [1] * + (len(conv.weight.shape) - 1)) + # shape of [C_out, 1, 1, 1] in Conv2d + coefff_on_the_fly = bn_weight.view_as(weight_coeff) * weight_coeff + + # shape of [C_out, C_in, k, k] in Conv2d + weight_on_the_fly = weight_on_the_fly * coefff_on_the_fly + # shape of [C_out] in Conv2d + bias_on_the_fly = bn_bias + coefff_on_the_fly.flatten() *\ + (bias_on_the_fly - bn.running_mean) + + return conv._conv_forward(x, weight_on_the_fly, bias_on_the_fly) + + +@MODELS.register_module() +class ConvModule(nn.Module): + """A conv block that bundles conv/norm/activation layers. + + This block simplifies the usage of convolution layers, which are commonly + used with a norm layer (e.g., BatchNorm) and activation layer (e.g., ReLU). + It is based upon three build methods: `build_conv_layer()`, + `build_norm_layer()` and `build_activation_layer()`. + + Besides, we add some additional features in this module. + 1. Automatically set `bias` of the conv layer. + 2. Spectral norm is supported. + 3. More padding modes are supported. Before PyTorch 1.5, nn.Conv2d only + supports zero and circular padding, and we add "reflect" padding mode. + + Args: + in_channels (int): Number of channels in the input feature map. + Same as that in ``nn._ConvNd``. + out_channels (int): Number of channels produced by the convolution. + Same as that in ``nn._ConvNd``. + kernel_size (int | tuple[int]): Size of the convolving kernel. + Same as that in ``nn._ConvNd``. + stride (int | tuple[int]): Stride of the convolution. + Same as that in ``nn._ConvNd``. + padding (int | tuple[int]): Zero-padding added to both sides of + the input. Same as that in ``nn._ConvNd``. + dilation (int | tuple[int]): Spacing between kernel elements. + Same as that in ``nn._ConvNd``. + groups (int): Number of blocked connections from input channels to + output channels. Same as that in ``nn._ConvNd``. + bias (bool | str): If specified as `auto`, it will be decided by the + norm_cfg. Bias will be set as True if `norm_cfg` is None, otherwise + False. Default: "auto". + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + inplace (bool): Whether to use inplace mode for activation. + Default: True. + with_spectral_norm (bool): Whether use spectral norm in conv module. + Default: False. + padding_mode (str): If the `padding_mode` has not been supported by + current `Conv2d` in PyTorch, we will use our own padding layer + instead. Currently, we support ['zeros', 'circular'] with official + implementation and ['reflect'] with our own implementation. + Default: 'zeros'. + order (tuple[str]): The order of conv/norm/activation layers. It is a + sequence of "conv", "norm" and "act". Common examples are + ("conv", "norm", "act") and ("act", "conv", "norm"). + Default: ('conv', 'norm', 'act'). + efficient_conv_bn_eval (bool): Whether use efficient conv when the + consecutive bn is in eval mode (either training or testing), as + proposed in https://arxiv.org/abs/2305.11624 . Default: `False`. + """ + + _abbr_ = 'conv_block' + + def __init__(self, + in_channels: int, + out_channels: int, + kernel_size: Union[int, Tuple[int, int]], + stride: Union[int, Tuple[int, int]] = 1, + padding: Union[int, Tuple[int, int]] = 0, + dilation: Union[int, Tuple[int, int]] = 1, + groups: int = 1, + bias: Union[bool, str] = 'auto', + conv_cfg: Optional[Dict] = None, + norm_cfg: Optional[Dict] = None, + act_cfg: Optional[Dict] = dict(type='ReLU'), + inplace: bool = True, + with_spectral_norm: bool = False, + padding_mode: str = 'zeros', + order: tuple = ('conv', 'norm', 'act'), + efficient_conv_bn_eval: bool = False): + super().__init__() + assert conv_cfg is None or isinstance(conv_cfg, dict) + assert norm_cfg is None or isinstance(norm_cfg, dict) + assert act_cfg is None or isinstance(act_cfg, dict) + official_padding_mode = ['zeros', 'circular'] + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.inplace = inplace + self.with_spectral_norm = with_spectral_norm + self.with_explicit_padding = padding_mode not in official_padding_mode + self.order = order + assert isinstance(self.order, tuple) and len(self.order) == 3 + assert set(order) == {'conv', 'norm', 'act'} + + self.with_norm = norm_cfg is not None + self.with_activation = act_cfg is not None + # if the conv layer is before a norm layer, bias is unnecessary. + if bias == 'auto': + bias = not self.with_norm + self.with_bias = bias + + if self.with_explicit_padding: + pad_cfg = dict(type=padding_mode) + self.padding_layer = build_padding_layer(pad_cfg, padding) + + # reset padding to 0 for conv module + conv_padding = 0 if self.with_explicit_padding else padding + # build convolution layer + self.conv = build_conv_layer( + conv_cfg, + in_channels, + out_channels, + kernel_size, + stride=stride, + padding=conv_padding, + dilation=dilation, + groups=groups, + bias=bias) + # export the attributes of self.conv to a higher level for convenience + self.in_channels = self.conv.in_channels + self.out_channels = self.conv.out_channels + self.kernel_size = self.conv.kernel_size + self.stride = self.conv.stride + self.padding = padding + self.dilation = self.conv.dilation + self.transposed = self.conv.transposed + self.output_padding = self.conv.output_padding + self.groups = self.conv.groups + + if self.with_spectral_norm: + self.conv = nn.utils.spectral_norm(self.conv) + + # build normalization layers + if self.with_norm: + # norm layer is after conv layer + if order.index('norm') > order.index('conv'): + norm_channels = out_channels + else: + norm_channels = in_channels + self.norm_name, norm = build_norm_layer( + norm_cfg, norm_channels) # type: ignore + self.add_module(self.norm_name, norm) + if self.with_bias: + if isinstance(norm, (_BatchNorm, _InstanceNorm)): + warnings.warn( + 'Unnecessary conv bias before batch/instance norm') + else: + self.norm_name = None # type: ignore + + self.turn_on_efficient_conv_bn_eval(efficient_conv_bn_eval) + + # build activation layer + if self.with_activation: + act_cfg_ = act_cfg.copy() # type: ignore + # nn.Tanh has no 'inplace' argument + if act_cfg_['type'] not in [ + 'Tanh', 'PReLU', 'Sigmoid', 'HSigmoid', 'Swish', 'GELU' + ]: + act_cfg_.setdefault('inplace', inplace) + self.activate = build_activation_layer(act_cfg_) + + # Use msra init by default + self.init_weights() + + @property + def norm(self): + if self.norm_name: + return getattr(self, self.norm_name) + else: + return None + + def init_weights(self): + # 1. It is mainly for customized conv layers with their own + # initialization manners by calling their own ``init_weights()``, + # and we do not want ConvModule to override the initialization. + # 2. For customized conv layers without their own initialization + # manners (that is, they don't have their own ``init_weights()``) + # and PyTorch's conv layers, they will be initialized by + # this method with default ``kaiming_init``. + # Note: For PyTorch's conv layers, they will be overwritten by our + # initialization implementation using default ``kaiming_init``. + if not hasattr(self.conv, 'init_weights'): + if self.with_activation and self.act_cfg['type'] == 'LeakyReLU': + nonlinearity = 'leaky_relu' + a = self.act_cfg.get('negative_slope', 0.01) + else: + nonlinearity = 'relu' + a = 0 + kaiming_init(self.conv, a=a, nonlinearity=nonlinearity) + if self.with_norm: + constant_init(self.norm, 1, bias=0) + + def forward(self, + x: torch.Tensor, + activate: bool = True, + norm: bool = True) -> torch.Tensor: + layer_index = 0 + while layer_index < len(self.order): + layer = self.order[layer_index] + if layer == 'conv': + if self.with_explicit_padding: + x = self.padding_layer(x) + # if the next operation is norm and we have a norm layer in + # eval mode and we have enabled `efficient_conv_bn_eval` for + # the conv operator, then activate the optimized forward and + # skip the next norm operator since it has been fused + if layer_index + 1 < len(self.order) and \ + self.order[layer_index + 1] == 'norm' and norm and \ + self.with_norm and not self.norm.training and \ + self.efficient_conv_bn_eval_forward is not None: + self.conv.forward = partial( + self.efficient_conv_bn_eval_forward, self.norm, + self.conv) + layer_index += 1 + x = self.conv(x) + del self.conv.forward + else: + x = self.conv(x) + elif layer == 'norm' and norm and self.with_norm: + x = self.norm(x) + elif layer == 'act' and activate and self.with_activation: + x = self.activate(x) + layer_index += 1 + return x + + def turn_on_efficient_conv_bn_eval(self, efficient_conv_bn_eval=True): + # efficient_conv_bn_eval works for conv + bn + # with `track_running_stats` option + if efficient_conv_bn_eval and self.norm \ + and isinstance(self.norm, _BatchNorm) \ + and self.norm.track_running_stats: + self.efficient_conv_bn_eval_forward = efficient_conv_bn_eval_forward # noqa: E501 + else: + self.efficient_conv_bn_eval_forward = None # type: ignore + + @staticmethod + def create_from_conv_bn(conv: torch.nn.modules.conv._ConvNd, + bn: torch.nn.modules.batchnorm._BatchNorm, + efficient_conv_bn_eval=True) -> 'ConvModule': + """Create a ConvModule from a conv and a bn module.""" + self = ConvModule.__new__(ConvModule) + super(ConvModule, self).__init__() + + self.conv_cfg = None + self.norm_cfg = None + self.act_cfg = None + self.inplace = False + self.with_spectral_norm = False + self.with_explicit_padding = False + self.order = ('conv', 'norm', 'act') + + self.with_norm = True + self.with_activation = False + self.with_bias = conv.bias is not None + + # build convolution layer + self.conv = conv + # export the attributes of self.conv to a higher level for convenience + self.in_channels = self.conv.in_channels + self.out_channels = self.conv.out_channels + self.kernel_size = self.conv.kernel_size + self.stride = self.conv.stride + self.padding = self.conv.padding + self.dilation = self.conv.dilation + self.transposed = self.conv.transposed + self.output_padding = self.conv.output_padding + self.groups = self.conv.groups + + # build normalization layers + self.norm_name, norm = 'bn', bn + self.add_module(self.norm_name, norm) + + self.turn_on_efficient_conv_bn_eval(efficient_conv_bn_eval) + + return self diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv_ws.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv_ws.py new file mode 100644 index 0000000000000000000000000000000000000000..261f5c1aa9aa9b80891e6330e6d576c3a8ce3e5d --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/conv_ws.py @@ -0,0 +1,153 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from collections import OrderedDict +from typing import Dict, List, Optional, Tuple, Union + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.registry import MODELS + + +def conv_ws_2d(input: torch.Tensor, + weight: torch.Tensor, + bias: Optional[torch.Tensor] = None, + stride: Union[int, Tuple[int, int]] = 1, + padding: Union[int, Tuple[int, int]] = 0, + dilation: Union[int, Tuple[int, int]] = 1, + groups: int = 1, + eps: float = 1e-5) -> torch.Tensor: + c_in = weight.size(0) + weight_flat = weight.view(c_in, -1) + mean = weight_flat.mean(dim=1, keepdim=True).view(c_in, 1, 1, 1) + std = weight_flat.std(dim=1, keepdim=True).view(c_in, 1, 1, 1) + weight = (weight - mean) / (std + eps) + return F.conv2d(input, weight, bias, stride, padding, dilation, groups) + + +@MODELS.register_module('ConvWS') +class ConvWS2d(nn.Conv2d): + + def __init__(self, + in_channels: int, + out_channels: int, + kernel_size: Union[int, Tuple[int, int]], + stride: Union[int, Tuple[int, int]] = 1, + padding: Union[int, Tuple[int, int]] = 0, + dilation: Union[int, Tuple[int, int]] = 1, + groups: int = 1, + bias: bool = True, + eps: float = 1e-5): + super().__init__( + in_channels, + out_channels, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=groups, + bias=bias) + self.eps = eps + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return conv_ws_2d(x, self.weight, self.bias, self.stride, self.padding, + self.dilation, self.groups, self.eps) + + +@MODELS.register_module(name='ConvAWS') +class ConvAWS2d(nn.Conv2d): + """AWS (Adaptive Weight Standardization) + + This is a variant of Weight Standardization + (https://arxiv.org/pdf/1903.10520.pdf) + It is used in DetectoRS to avoid NaN + (https://arxiv.org/pdf/2006.02334.pdf) + + Args: + in_channels (int): Number of channels in the input image + out_channels (int): Number of channels produced by the convolution + kernel_size (int or tuple): Size of the conv kernel + stride (int or tuple, optional): Stride of the convolution. Default: 1 + padding (int or tuple, optional): Zero-padding added to both sides of + the input. Default: 0 + dilation (int or tuple, optional): Spacing between kernel elements. + Default: 1 + groups (int, optional): Number of blocked connections from input + channels to output channels. Default: 1 + bias (bool, optional): If set True, adds a learnable bias to the + output. Default: True + """ + + def __init__(self, + in_channels: int, + out_channels: int, + kernel_size: Union[int, Tuple[int, int]], + stride: Union[int, Tuple[int, int]] = 1, + padding: Union[int, Tuple[int, int]] = 0, + dilation: Union[int, Tuple[int, int]] = 1, + groups: int = 1, + bias: bool = True): + super().__init__( + in_channels, + out_channels, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=groups, + bias=bias) + self.register_buffer('weight_gamma', + torch.ones(self.out_channels, 1, 1, 1)) + self.register_buffer('weight_beta', + torch.zeros(self.out_channels, 1, 1, 1)) + + def _get_weight(self, weight: torch.Tensor) -> torch.Tensor: + weight_flat = weight.view(weight.size(0), -1) + mean = weight_flat.mean(dim=1).view(-1, 1, 1, 1) + std = torch.sqrt(weight_flat.var(dim=1) + 1e-5).view(-1, 1, 1, 1) + weight = (weight - mean) / std + weight = self.weight_gamma * weight + self.weight_beta + return weight + + def forward(self, x: torch.Tensor) -> torch.Tensor: + weight = self._get_weight(self.weight) + return F.conv2d(x, weight, self.bias, self.stride, self.padding, + self.dilation, self.groups) + + def _load_from_state_dict(self, state_dict: OrderedDict, prefix: str, + local_metadata: Dict, strict: bool, + missing_keys: List[str], + unexpected_keys: List[str], + error_msgs: List[str]) -> None: + """Override default load function. + + AWS overrides the function _load_from_state_dict to recover + weight_gamma and weight_beta if they are missing. If weight_gamma and + weight_beta are found in the checkpoint, this function will return + after super()._load_from_state_dict. Otherwise, it will compute the + mean and std of the pretrained weights and store them in weight_beta + and weight_gamma. + """ + + self.weight_gamma.data.fill_(-1) + local_missing_keys: List = [] + super()._load_from_state_dict(state_dict, prefix, local_metadata, + strict, local_missing_keys, + unexpected_keys, error_msgs) + if self.weight_gamma.data.mean() > 0: + for k in local_missing_keys: + missing_keys.append(k) + return + weight = self.weight.data + weight_flat = weight.view(weight.size(0), -1) + mean = weight_flat.mean(dim=1).view(-1, 1, 1, 1) + std = torch.sqrt(weight_flat.var(dim=1) + 1e-5).view(-1, 1, 1, 1) + self.weight_beta.data.copy_(mean) + self.weight_gamma.data.copy_(std) + missing_gamma_beta = [ + k for k in local_missing_keys + if k.endswith('weight_gamma') or k.endswith('weight_beta') + ] + for k in missing_gamma_beta: + local_missing_keys.remove(k) + for k in local_missing_keys: + missing_keys.append(k) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/depthwise_separable_conv_module.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/depthwise_separable_conv_module.py new file mode 100644 index 0000000000000000000000000000000000000000..cf1fe4cad3812007573211fa2bede28b23822122 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/depthwise_separable_conv_module.py @@ -0,0 +1,99 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Dict, Optional, Tuple, Union + +import torch +import torch.nn as nn + +from .conv_module import ConvModule + + +class DepthwiseSeparableConvModule(nn.Module): + """Depthwise separable convolution module. + + See https://arxiv.org/pdf/1704.04861.pdf for details. + + This module can replace a ConvModule with the conv block replaced by two + conv block: depthwise conv block and pointwise conv block. The depthwise + conv block contains depthwise-conv/norm/activation layers. The pointwise + conv block contains pointwise-conv/norm/activation layers. It should be + noted that there will be norm/activation layer in the depthwise conv block + if `norm_cfg` and `act_cfg` are specified. + + Args: + in_channels (int): Number of channels in the input feature map. + Same as that in ``nn._ConvNd``. + out_channels (int): Number of channels produced by the convolution. + Same as that in ``nn._ConvNd``. + kernel_size (int | tuple[int]): Size of the convolving kernel. + Same as that in ``nn._ConvNd``. + stride (int | tuple[int]): Stride of the convolution. + Same as that in ``nn._ConvNd``. Default: 1. + padding (int | tuple[int]): Zero-padding added to both sides of + the input. Same as that in ``nn._ConvNd``. Default: 0. + dilation (int | tuple[int]): Spacing between kernel elements. + Same as that in ``nn._ConvNd``. Default: 1. + norm_cfg (dict): Default norm config for both depthwise ConvModule and + pointwise ConvModule. Default: None. + act_cfg (dict): Default activation config for both depthwise ConvModule + and pointwise ConvModule. Default: dict(type='ReLU'). + dw_norm_cfg (dict): Norm config of depthwise ConvModule. If it is + 'default', it will be the same as `norm_cfg`. Default: 'default'. + dw_act_cfg (dict): Activation config of depthwise ConvModule. If it is + 'default', it will be the same as `act_cfg`. Default: 'default'. + pw_norm_cfg (dict): Norm config of pointwise ConvModule. If it is + 'default', it will be the same as `norm_cfg`. Default: 'default'. + pw_act_cfg (dict): Activation config of pointwise ConvModule. If it is + 'default', it will be the same as `act_cfg`. Default: 'default'. + kwargs (optional): Other shared arguments for depthwise and pointwise + ConvModule. See ConvModule for ref. + """ + + def __init__(self, + in_channels: int, + out_channels: int, + kernel_size: Union[int, Tuple[int, int]], + stride: Union[int, Tuple[int, int]] = 1, + padding: Union[int, Tuple[int, int]] = 0, + dilation: Union[int, Tuple[int, int]] = 1, + norm_cfg: Optional[Dict] = None, + act_cfg: Dict = dict(type='ReLU'), + dw_norm_cfg: Union[Dict, str] = 'default', + dw_act_cfg: Union[Dict, str] = 'default', + pw_norm_cfg: Union[Dict, str] = 'default', + pw_act_cfg: Union[Dict, str] = 'default', + **kwargs): + super().__init__() + assert 'groups' not in kwargs, 'groups should not be specified' + + # if norm/activation config of depthwise/pointwise ConvModule is not + # specified, use default config. + dw_norm_cfg = dw_norm_cfg if dw_norm_cfg != 'default' else norm_cfg # type: ignore # noqa E501 + dw_act_cfg = dw_act_cfg if dw_act_cfg != 'default' else act_cfg + pw_norm_cfg = pw_norm_cfg if pw_norm_cfg != 'default' else norm_cfg # type: ignore # noqa E501 + pw_act_cfg = pw_act_cfg if pw_act_cfg != 'default' else act_cfg + + # depthwise convolution + self.depthwise_conv = ConvModule( + in_channels, + in_channels, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=in_channels, + norm_cfg=dw_norm_cfg, # type: ignore + act_cfg=dw_act_cfg, # type: ignore + **kwargs) + + self.pointwise_conv = ConvModule( + in_channels, + out_channels, + 1, + norm_cfg=pw_norm_cfg, # type: ignore + act_cfg=pw_act_cfg, # type: ignore + **kwargs) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = self.depthwise_conv(x) + x = self.pointwise_conv(x) + return x diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/drop.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/drop.py new file mode 100644 index 0000000000000000000000000000000000000000..fe82a2560515858341836de3fa563ed4db3a3e14 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/drop.py @@ -0,0 +1,67 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Any, Dict, Optional + +import torch +import torch.nn as nn +from mmengine.registry import MODELS + + +def drop_path(x: torch.Tensor, + drop_prob: float = 0., + training: bool = False) -> torch.Tensor: + """Drop paths (Stochastic Depth) per sample (when applied in main path of + residual blocks). + + We follow the implementation + https://github.com/rwightman/pytorch-image-models/blob/a2727c1bf78ba0d7b5727f5f95e37fb7f8866b1f/timm/models/layers/drop.py # noqa: E501 + """ + if drop_prob == 0. or not training: + return x + keep_prob = 1 - drop_prob + # handle tensors with different dimensions, not just 4D tensors. + shape = (x.shape[0], ) + (1, ) * (x.ndim - 1) + random_tensor = keep_prob + torch.rand( + shape, dtype=x.dtype, device=x.device) + output = x.div(keep_prob) * random_tensor.floor() + return output + + +@MODELS.register_module() +class DropPath(nn.Module): + """Drop paths (Stochastic Depth) per sample (when applied in main path of + residual blocks). + + We follow the implementation + https://github.com/rwightman/pytorch-image-models/blob/a2727c1bf78ba0d7b5727f5f95e37fb7f8866b1f/timm/models/layers/drop.py # noqa: E501 + + Args: + drop_prob (float): Probability of the path to be zeroed. Default: 0.1 + """ + + def __init__(self, drop_prob: float = 0.1): + super().__init__() + self.drop_prob = drop_prob + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return drop_path(x, self.drop_prob, self.training) + + +@MODELS.register_module() +class Dropout(nn.Dropout): + """A wrapper for ``torch.nn.Dropout``, We rename the ``p`` of + ``torch.nn.Dropout`` to ``drop_prob`` so as to be consistent with + ``DropPath`` + + Args: + drop_prob (float): Probability of the elements to be + zeroed. Default: 0.5. + inplace (bool): Do the operation inplace or not. Default: False. + """ + + def __init__(self, drop_prob: float = 0.5, inplace: bool = False): + super().__init__(p=drop_prob, inplace=inplace) + + +def build_dropout(cfg: Dict, default_args: Optional[Dict] = None) -> Any: + """Builder for drop out layers.""" + return MODELS.build(cfg, default_args=default_args) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/generalized_attention.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/generalized_attention.py new file mode 100644 index 0000000000000000000000000000000000000000..ab20467f63876be8655bb7a54568eaa7dc74ba72 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/generalized_attention.py @@ -0,0 +1,411 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.model import kaiming_init +from mmengine.registry import MODELS + + +@MODELS.register_module() +class GeneralizedAttention(nn.Module): + """GeneralizedAttention module. + + See 'An Empirical Study of Spatial Attention Mechanisms in Deep Networks' + (https://arxiv.org/abs/1904.05873) for details. + + Args: + in_channels (int): Channels of the input feature map. + spatial_range (int): The spatial range. -1 indicates no spatial range + constraint. Default: -1. + num_heads (int): The head number of empirical_attention module. + Default: 9. + position_embedding_dim (int): The position embedding dimension. + Default: -1. + position_magnitude (int): A multiplier acting on coord difference. + Default: 1. + kv_stride (int): The feature stride acting on key/value feature map. + Default: 2. + q_stride (int): The feature stride acting on query feature map. + Default: 1. + attention_type (str): A binary indicator string for indicating which + items in generalized empirical_attention module are used. + Default: '1111'. + + - '1000' indicates 'query and key content' (appr - appr) item, + - '0100' indicates 'query content and relative position' + (appr - position) item, + - '0010' indicates 'key content only' (bias - appr) item, + - '0001' indicates 'relative position only' (bias - position) item. + """ + + _abbr_ = 'gen_attention_block' + + def __init__(self, + in_channels: int, + spatial_range: int = -1, + num_heads: int = 9, + position_embedding_dim: int = -1, + position_magnitude: int = 1, + kv_stride: int = 2, + q_stride: int = 1, + attention_type: str = '1111'): + + super().__init__() + + # hard range means local range for non-local operation + self.position_embedding_dim = ( + position_embedding_dim + if position_embedding_dim > 0 else in_channels) + + self.position_magnitude = position_magnitude + self.num_heads = num_heads + self.in_channels = in_channels + self.spatial_range = spatial_range + self.kv_stride = kv_stride + self.q_stride = q_stride + self.attention_type = [bool(int(_)) for _ in attention_type] + self.qk_embed_dim = in_channels // num_heads + out_c = self.qk_embed_dim * num_heads + + if self.attention_type[0] or self.attention_type[1]: + self.query_conv = nn.Conv2d( + in_channels=in_channels, + out_channels=out_c, + kernel_size=1, + bias=False) + self.query_conv.kaiming_init = True + + if self.attention_type[0] or self.attention_type[2]: + self.key_conv = nn.Conv2d( + in_channels=in_channels, + out_channels=out_c, + kernel_size=1, + bias=False) + self.key_conv.kaiming_init = True + + self.v_dim = in_channels // num_heads + self.value_conv = nn.Conv2d( + in_channels=in_channels, + out_channels=self.v_dim * num_heads, + kernel_size=1, + bias=False) + self.value_conv.kaiming_init = True + + if self.attention_type[1] or self.attention_type[3]: + self.appr_geom_fc_x = nn.Linear( + self.position_embedding_dim // 2, out_c, bias=False) + self.appr_geom_fc_x.kaiming_init = True + + self.appr_geom_fc_y = nn.Linear( + self.position_embedding_dim // 2, out_c, bias=False) + self.appr_geom_fc_y.kaiming_init = True + + if self.attention_type[2]: + stdv = 1.0 / math.sqrt(self.qk_embed_dim * 2) + appr_bias_value = -2 * stdv * torch.rand(out_c) + stdv + self.appr_bias = nn.Parameter(appr_bias_value) + + if self.attention_type[3]: + stdv = 1.0 / math.sqrt(self.qk_embed_dim * 2) + geom_bias_value = -2 * stdv * torch.rand(out_c) + stdv + self.geom_bias = nn.Parameter(geom_bias_value) + + self.proj_conv = nn.Conv2d( + in_channels=self.v_dim * num_heads, + out_channels=in_channels, + kernel_size=1, + bias=True) + self.proj_conv.kaiming_init = True + self.gamma = nn.Parameter(torch.zeros(1)) + + if self.spatial_range >= 0: + # only works when non local is after 3*3 conv + if in_channels == 256: + max_len = 84 + elif in_channels == 512: + max_len = 42 + + max_len_kv = int((max_len - 1.0) / self.kv_stride + 1) + local_constraint_map = np.ones( + (max_len, max_len, max_len_kv, max_len_kv), dtype=int) + for iy in range(max_len): + for ix in range(max_len): + local_constraint_map[ + iy, ix, + max((iy - self.spatial_range) // + self.kv_stride, 0):min((iy + self.spatial_range + + 1) // self.kv_stride + + 1, max_len), + max((ix - self.spatial_range) // + self.kv_stride, 0):min((ix + self.spatial_range + + 1) // self.kv_stride + + 1, max_len)] = 0 + + self.local_constraint_map = nn.Parameter( + torch.from_numpy(local_constraint_map).byte(), + requires_grad=False) + + if self.q_stride > 1: + self.q_downsample = nn.AvgPool2d( + kernel_size=1, stride=self.q_stride) + else: + self.q_downsample = None + + if self.kv_stride > 1: + self.kv_downsample = nn.AvgPool2d( + kernel_size=1, stride=self.kv_stride) + else: + self.kv_downsample = None + + self.init_weights() + + def get_position_embedding(self, + h, + w, + h_kv, + w_kv, + q_stride, + kv_stride, + device, + dtype, + feat_dim, + wave_length=1000): + # the default type of Tensor is float32, leading to type mismatch + # in fp16 mode. Cast it to support fp16 mode. + h_idxs = torch.linspace(0, h - 1, h).to(device=device, dtype=dtype) + h_idxs = h_idxs.view((h, 1)) * q_stride + + w_idxs = torch.linspace(0, w - 1, w).to(device=device, dtype=dtype) + w_idxs = w_idxs.view((w, 1)) * q_stride + + h_kv_idxs = torch.linspace(0, h_kv - 1, h_kv).to( + device=device, dtype=dtype) + h_kv_idxs = h_kv_idxs.view((h_kv, 1)) * kv_stride + + w_kv_idxs = torch.linspace(0, w_kv - 1, w_kv).to( + device=device, dtype=dtype) + w_kv_idxs = w_kv_idxs.view((w_kv, 1)) * kv_stride + + # (h, h_kv, 1) + h_diff = h_idxs.unsqueeze(1) - h_kv_idxs.unsqueeze(0) + h_diff *= self.position_magnitude + + # (w, w_kv, 1) + w_diff = w_idxs.unsqueeze(1) - w_kv_idxs.unsqueeze(0) + w_diff *= self.position_magnitude + + feat_range = torch.arange(0, feat_dim / 4).to( + device=device, dtype=dtype) + + dim_mat = torch.Tensor([wave_length]).to(device=device, dtype=dtype) + dim_mat = dim_mat**((4. / feat_dim) * feat_range) + dim_mat = dim_mat.view((1, 1, -1)) + + embedding_x = torch.cat( + ((w_diff / dim_mat).sin(), (w_diff / dim_mat).cos()), dim=2) + + embedding_y = torch.cat( + ((h_diff / dim_mat).sin(), (h_diff / dim_mat).cos()), dim=2) + + return embedding_x, embedding_y + + def forward(self, x_input: torch.Tensor) -> torch.Tensor: + num_heads = self.num_heads + + # use empirical_attention + if self.q_downsample is not None: + x_q = self.q_downsample(x_input) + else: + x_q = x_input + n, _, h, w = x_q.shape + + if self.kv_downsample is not None: + x_kv = self.kv_downsample(x_input) + else: + x_kv = x_input + _, _, h_kv, w_kv = x_kv.shape + + if self.attention_type[0] or self.attention_type[1]: + proj_query = self.query_conv(x_q).view( + (n, num_heads, self.qk_embed_dim, h * w)) + proj_query = proj_query.permute(0, 1, 3, 2) + + if self.attention_type[0] or self.attention_type[2]: + proj_key = self.key_conv(x_kv).view( + (n, num_heads, self.qk_embed_dim, h_kv * w_kv)) + + if self.attention_type[1] or self.attention_type[3]: + position_embed_x, position_embed_y = self.get_position_embedding( + h, w, h_kv, w_kv, self.q_stride, self.kv_stride, + x_input.device, x_input.dtype, self.position_embedding_dim) + # (n, num_heads, w, w_kv, dim) + position_feat_x = self.appr_geom_fc_x(position_embed_x).\ + view(1, w, w_kv, num_heads, self.qk_embed_dim).\ + permute(0, 3, 1, 2, 4).\ + repeat(n, 1, 1, 1, 1) + + # (n, num_heads, h, h_kv, dim) + position_feat_y = self.appr_geom_fc_y(position_embed_y).\ + view(1, h, h_kv, num_heads, self.qk_embed_dim).\ + permute(0, 3, 1, 2, 4).\ + repeat(n, 1, 1, 1, 1) + + position_feat_x /= math.sqrt(2) + position_feat_y /= math.sqrt(2) + + # accelerate for saliency only + if (np.sum(self.attention_type) == 1) and self.attention_type[2]: + appr_bias = self.appr_bias.\ + view(1, num_heads, 1, self.qk_embed_dim).\ + repeat(n, 1, 1, 1) + + energy = torch.matmul(appr_bias, proj_key).\ + view(n, num_heads, 1, h_kv * w_kv) + + h = 1 + w = 1 + else: + # (n, num_heads, h*w, h_kv*w_kv), query before key, 540mb for + if not self.attention_type[0]: + energy = torch.zeros( + n, + num_heads, + h, + w, + h_kv, + w_kv, + dtype=x_input.dtype, + device=x_input.device) + + # attention_type[0]: appr - appr + # attention_type[1]: appr - position + # attention_type[2]: bias - appr + # attention_type[3]: bias - position + if self.attention_type[0] or self.attention_type[2]: + if self.attention_type[0] and self.attention_type[2]: + appr_bias = self.appr_bias.\ + view(1, num_heads, 1, self.qk_embed_dim) + energy = torch.matmul(proj_query + appr_bias, proj_key).\ + view(n, num_heads, h, w, h_kv, w_kv) + + elif self.attention_type[0]: + energy = torch.matmul(proj_query, proj_key).\ + view(n, num_heads, h, w, h_kv, w_kv) + + elif self.attention_type[2]: + appr_bias = self.appr_bias.\ + view(1, num_heads, 1, self.qk_embed_dim).\ + repeat(n, 1, 1, 1) + + energy += torch.matmul(appr_bias, proj_key).\ + view(n, num_heads, 1, 1, h_kv, w_kv) + + if self.attention_type[1] or self.attention_type[3]: + if self.attention_type[1] and self.attention_type[3]: + geom_bias = self.geom_bias.\ + view(1, num_heads, 1, self.qk_embed_dim) + + proj_query_reshape = (proj_query + geom_bias).\ + view(n, num_heads, h, w, self.qk_embed_dim) + + energy_x = torch.matmul( + proj_query_reshape.permute(0, 1, 3, 2, 4), + position_feat_x.permute(0, 1, 2, 4, 3)) + energy_x = energy_x.\ + permute(0, 1, 3, 2, 4).unsqueeze(4) + + energy_y = torch.matmul( + proj_query_reshape, + position_feat_y.permute(0, 1, 2, 4, 3)) + energy_y = energy_y.unsqueeze(5) + + energy += energy_x + energy_y + + elif self.attention_type[1]: + proj_query_reshape = proj_query.\ + view(n, num_heads, h, w, self.qk_embed_dim) + proj_query_reshape = proj_query_reshape.\ + permute(0, 1, 3, 2, 4) + position_feat_x_reshape = position_feat_x.\ + permute(0, 1, 2, 4, 3) + position_feat_y_reshape = position_feat_y.\ + permute(0, 1, 2, 4, 3) + + energy_x = torch.matmul(proj_query_reshape, + position_feat_x_reshape) + energy_x = energy_x.permute(0, 1, 3, 2, 4).unsqueeze(4) + + energy_y = torch.matmul(proj_query_reshape, + position_feat_y_reshape) + energy_y = energy_y.unsqueeze(5) + + energy += energy_x + energy_y + + elif self.attention_type[3]: + geom_bias = self.geom_bias.\ + view(1, num_heads, self.qk_embed_dim, 1).\ + repeat(n, 1, 1, 1) + + position_feat_x_reshape = position_feat_x.\ + view(n, num_heads, w * w_kv, self.qk_embed_dim) + + position_feat_y_reshape = position_feat_y.\ + view(n, num_heads, h * h_kv, self.qk_embed_dim) + + energy_x = torch.matmul(position_feat_x_reshape, geom_bias) + energy_x = energy_x.view(n, num_heads, 1, w, 1, w_kv) + + energy_y = torch.matmul(position_feat_y_reshape, geom_bias) + energy_y = energy_y.view(n, num_heads, h, 1, h_kv, 1) + + energy += energy_x + energy_y + + energy = energy.view(n, num_heads, h * w, h_kv * w_kv) + + if self.spatial_range >= 0: + cur_local_constraint_map = \ + self.local_constraint_map[:h, :w, :h_kv, :w_kv].\ + contiguous().\ + view(1, 1, h*w, h_kv*w_kv) + + energy = energy.masked_fill_(cur_local_constraint_map, + float('-inf')) + + attention = F.softmax(energy, 3) + + proj_value = self.value_conv(x_kv) + proj_value_reshape = proj_value.\ + view((n, num_heads, self.v_dim, h_kv * w_kv)).\ + permute(0, 1, 3, 2) + + out = torch.matmul(attention, proj_value_reshape).\ + permute(0, 1, 3, 2).\ + contiguous().\ + view(n, self.v_dim * self.num_heads, h, w) + + out = self.proj_conv(out) + + # output is downsampled, upsample back to input size + if self.q_downsample is not None: + out = F.interpolate( + out, + size=x_input.shape[2:], + mode='bilinear', + align_corners=False) + + out = self.gamma * out + x_input + return out + + def init_weights(self): + for m in self.modules(): + if hasattr(m, 'kaiming_init') and m.kaiming_init: + kaiming_init( + m, + mode='fan_in', + nonlinearity='leaky_relu', + bias=0, + distribution='uniform', + a=1) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/hsigmoid.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/hsigmoid.py new file mode 100644 index 0000000000000000000000000000000000000000..423e0aad9ae154cf651d289327bc19da940cf449 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/hsigmoid.py @@ -0,0 +1,50 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +from mmengine.registry import MODELS + + +@MODELS.register_module() +class HSigmoid(nn.Module): + """Hard Sigmoid Module. Apply the hard sigmoid function: + Hsigmoid(x) = min(max((x + bias) / divisor, min_value), max_value) + Default: Hsigmoid(x) = min(max((x + 3) / 6, 0), 1) + + Note: + In MMCV v1.4.4, we modified the default value of args to align with + PyTorch official. + + Args: + bias (float): Bias of the input feature map. Default: 3.0. + divisor (float): Divisor of the input feature map. Default: 6.0. + min_value (float): Lower bound value. Default: 0.0. + max_value (float): Upper bound value. Default: 1.0. + + Returns: + Tensor: The output tensor. + """ + + def __init__(self, + bias: float = 3.0, + divisor: float = 6.0, + min_value: float = 0.0, + max_value: float = 1.0): + super().__init__() + warnings.warn( + 'In MMCV v1.4.4, we modified the default value of args to align ' + 'with PyTorch official. Previous Implementation: ' + 'Hsigmoid(x) = min(max((x + 1) / 2, 0), 1). ' + 'Current Implementation: ' + 'Hsigmoid(x) = min(max((x + 3) / 6, 0), 1).') + self.bias = bias + self.divisor = divisor + assert self.divisor != 0 + self.min_value = min_value + self.max_value = max_value + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = (x + self.bias) / self.divisor + + return x.clamp_(self.min_value, self.max_value) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/hswish.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/hswish.py new file mode 100644 index 0000000000000000000000000000000000000000..6b6dd006d424bd39a3f99ceefda816408309d71c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/hswish.py @@ -0,0 +1,39 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmengine.registry import MODELS +from mmengine.utils import digit_version +from mmengine.utils.dl_utils import TORCH_VERSION + + +class HSwish(nn.Module): + """Hard Swish Module. + + This module applies the hard swish function: + + .. math:: + Hswish(x) = x * ReLU6(x + 3) / 6 + + Args: + inplace (bool): can optionally do the operation in-place. + Default: False. + + Returns: + Tensor: The output tensor. + """ + + def __init__(self, inplace: bool = False): + super().__init__() + self.act = nn.ReLU6(inplace) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return x * self.act(x + 3) / 6 + + +if (TORCH_VERSION == 'parrots' + or digit_version(TORCH_VERSION) < digit_version('1.7')): + # Hardswish is not supported when PyTorch version < 1.6. + # And Hardswish in PyTorch 1.6 does not support inplace. + MODELS.register_module(module=HSwish) +else: + MODELS.register_module(module=nn.Hardswish, name='HSwish') diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/non_local.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/non_local.py new file mode 100644 index 0000000000000000000000000000000000000000..8dd4465cd62fcb07ec1bc3410ebd272f427ec6b1 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/non_local.py @@ -0,0 +1,308 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta +from typing import Dict, Optional + +import torch +import torch.nn as nn +from mmengine.model import constant_init, normal_init +from mmengine.registry import MODELS + +from .conv_module import ConvModule + + +class _NonLocalNd(nn.Module, metaclass=ABCMeta): + """Basic Non-local module. + + This module is proposed in + "Non-local Neural Networks" + Paper reference: https://arxiv.org/abs/1711.07971 + Code reference: https://github.com/AlexHex7/Non-local_pytorch + + Args: + in_channels (int): Channels of the input feature map. + reduction (int): Channel reduction ratio. Default: 2. + use_scale (bool): Whether to scale pairwise_weight by + `1/sqrt(inter_channels)` when the mode is `embedded_gaussian`. + Default: True. + conv_cfg (None | dict): The config dict for convolution layers. + If not specified, it will use `nn.Conv2d` for convolution layers. + Default: None. + norm_cfg (None | dict): The config dict for normalization layers. + Default: None. (This parameter is only applicable to conv_out.) + mode (str): Options are `gaussian`, `concatenation`, + `embedded_gaussian` and `dot_product`. Default: embedded_gaussian. + """ + + def __init__(self, + in_channels: int, + reduction: int = 2, + use_scale: bool = True, + conv_cfg: Optional[Dict] = None, + norm_cfg: Optional[Dict] = None, + mode: str = 'embedded_gaussian', + **kwargs): + super().__init__() + self.in_channels = in_channels + self.reduction = reduction + self.use_scale = use_scale + self.inter_channels = max(in_channels // reduction, 1) + self.mode = mode + + if mode not in [ + 'gaussian', 'embedded_gaussian', 'dot_product', 'concatenation' + ]: + raise ValueError("Mode should be in 'gaussian', 'concatenation', " + f"'embedded_gaussian' or 'dot_product', but got " + f'{mode} instead.') + + # g, theta, phi are defaulted as `nn.ConvNd`. + # Here we use ConvModule for potential usage. + self.g = ConvModule( + self.in_channels, + self.inter_channels, + kernel_size=1, + conv_cfg=conv_cfg, + act_cfg=None) # type: ignore + self.conv_out = ConvModule( + self.inter_channels, + self.in_channels, + kernel_size=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + if self.mode != 'gaussian': + self.theta = ConvModule( + self.in_channels, + self.inter_channels, + kernel_size=1, + conv_cfg=conv_cfg, + act_cfg=None) + self.phi = ConvModule( + self.in_channels, + self.inter_channels, + kernel_size=1, + conv_cfg=conv_cfg, + act_cfg=None) + + if self.mode == 'concatenation': + self.concat_project = ConvModule( + self.inter_channels * 2, + 1, + kernel_size=1, + stride=1, + padding=0, + bias=False, + act_cfg=dict(type='ReLU')) + + self.init_weights(**kwargs) + + def init_weights(self, std: float = 0.01, zeros_init: bool = True) -> None: + if self.mode != 'gaussian': + for m in [self.g, self.theta, self.phi]: + normal_init(m.conv, std=std) + else: + normal_init(self.g.conv, std=std) + if zeros_init: + if self.conv_out.norm_cfg is None: + constant_init(self.conv_out.conv, 0) + else: + constant_init(self.conv_out.norm, 0) + else: + if self.conv_out.norm_cfg is None: + normal_init(self.conv_out.conv, std=std) + else: + normal_init(self.conv_out.norm, std=std) + + def gaussian(self, theta_x: torch.Tensor, + phi_x: torch.Tensor) -> torch.Tensor: + # NonLocal1d pairwise_weight: [N, H, H] + # NonLocal2d pairwise_weight: [N, HxW, HxW] + # NonLocal3d pairwise_weight: [N, TxHxW, TxHxW] + pairwise_weight = torch.matmul(theta_x, phi_x) + pairwise_weight = pairwise_weight.softmax(dim=-1) + return pairwise_weight + + def embedded_gaussian(self, theta_x: torch.Tensor, + phi_x: torch.Tensor) -> torch.Tensor: + # NonLocal1d pairwise_weight: [N, H, H] + # NonLocal2d pairwise_weight: [N, HxW, HxW] + # NonLocal3d pairwise_weight: [N, TxHxW, TxHxW] + 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 = pairwise_weight.softmax(dim=-1) + return pairwise_weight + + def dot_product(self, theta_x: torch.Tensor, + phi_x: torch.Tensor) -> torch.Tensor: + # NonLocal1d pairwise_weight: [N, H, H] + # NonLocal2d pairwise_weight: [N, HxW, HxW] + # NonLocal3d pairwise_weight: [N, TxHxW, TxHxW] + pairwise_weight = torch.matmul(theta_x, phi_x) + pairwise_weight /= pairwise_weight.shape[-1] + return pairwise_weight + + def concatenation(self, theta_x: torch.Tensor, + phi_x: torch.Tensor) -> torch.Tensor: + # NonLocal1d pairwise_weight: [N, H, H] + # NonLocal2d pairwise_weight: [N, HxW, HxW] + # NonLocal3d pairwise_weight: [N, TxHxW, TxHxW] + h = theta_x.size(2) + w = phi_x.size(3) + theta_x = theta_x.repeat(1, 1, 1, w) + phi_x = phi_x.repeat(1, 1, h, 1) + + concat_feature = torch.cat([theta_x, phi_x], dim=1) + pairwise_weight = self.concat_project(concat_feature) + n, _, h, w = pairwise_weight.size() + pairwise_weight = pairwise_weight.view(n, h, w) + pairwise_weight /= pairwise_weight.shape[-1] + + return pairwise_weight + + def forward(self, x: torch.Tensor) -> torch.Tensor: + # Assume `reduction = 1`, then `inter_channels = C` + # or `inter_channels = C` when `mode="gaussian"` + + # NonLocal1d x: [N, C, H] + # NonLocal2d x: [N, C, H, W] + # NonLocal3d x: [N, C, T, H, W] + n = x.size(0) + + # NonLocal1d g_x: [N, H, C] + # NonLocal2d g_x: [N, HxW, C] + # NonLocal3d g_x: [N, TxHxW, C] + g_x = self.g(x).view(n, self.inter_channels, -1) + g_x = g_x.permute(0, 2, 1) + + # NonLocal1d theta_x: [N, H, C], phi_x: [N, C, H] + # NonLocal2d theta_x: [N, HxW, C], phi_x: [N, C, HxW] + # NonLocal3d theta_x: [N, TxHxW, C], phi_x: [N, C, TxHxW] + 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) + + pairwise_func = getattr(self, self.mode) + # NonLocal1d pairwise_weight: [N, H, H] + # NonLocal2d pairwise_weight: [N, HxW, HxW] + # NonLocal3d pairwise_weight: [N, TxHxW, TxHxW] + pairwise_weight = pairwise_func(theta_x, phi_x) + + # NonLocal1d y: [N, H, C] + # NonLocal2d y: [N, HxW, C] + # NonLocal3d y: [N, TxHxW, C] + y = torch.matmul(pairwise_weight, g_x) + # NonLocal1d y: [N, C, H] + # NonLocal2d y: [N, C, H, W] + # NonLocal3d y: [N, C, T, H, W] + y = y.permute(0, 2, 1).contiguous().reshape(n, self.inter_channels, + *x.size()[2:]) + + output = x + self.conv_out(y) + + return output + + +class NonLocal1d(_NonLocalNd): + """1D Non-local module. + + Args: + in_channels (int): Same as `NonLocalND`. + sub_sample (bool): Whether to apply max pooling after pairwise + function (Note that the `sub_sample` is applied on spatial only). + Default: False. + conv_cfg (None | dict): Same as `NonLocalND`. + Default: dict(type='Conv1d'). + """ + + def __init__(self, + in_channels: int, + sub_sample: bool = False, + conv_cfg: Dict = dict(type='Conv1d'), + **kwargs): + super().__init__(in_channels, conv_cfg=conv_cfg, **kwargs) + + self.sub_sample = sub_sample + + if sub_sample: + max_pool_layer = nn.MaxPool1d(kernel_size=2) + self.g = nn.Sequential(self.g, max_pool_layer) + if self.mode != 'gaussian': + self.phi = nn.Sequential(self.phi, max_pool_layer) + else: + self.phi = max_pool_layer + + +@MODELS.register_module() +class NonLocal2d(_NonLocalNd): + """2D Non-local module. + + Args: + in_channels (int): Same as `NonLocalND`. + sub_sample (bool): Whether to apply max pooling after pairwise + function (Note that the `sub_sample` is applied on spatial only). + Default: False. + conv_cfg (None | dict): Same as `NonLocalND`. + Default: dict(type='Conv2d'). + """ + + _abbr_ = 'nonlocal_block' + + def __init__(self, + in_channels: int, + sub_sample: bool = False, + conv_cfg: Dict = dict(type='Conv2d'), + **kwargs): + super().__init__(in_channels, conv_cfg=conv_cfg, **kwargs) + + self.sub_sample = sub_sample + + if sub_sample: + max_pool_layer = nn.MaxPool2d(kernel_size=(2, 2)) + self.g = nn.Sequential(self.g, max_pool_layer) + if self.mode != 'gaussian': + self.phi = nn.Sequential(self.phi, max_pool_layer) + else: + self.phi = max_pool_layer + + +class NonLocal3d(_NonLocalNd): + """3D Non-local module. + + Args: + in_channels (int): Same as `NonLocalND`. + sub_sample (bool): Whether to apply max pooling after pairwise + function (Note that the `sub_sample` is applied on spatial only). + Default: False. + conv_cfg (None | dict): Same as `NonLocalND`. + Default: dict(type='Conv3d'). + """ + + def __init__(self, + in_channels: int, + sub_sample: bool = False, + conv_cfg: Dict = dict(type='Conv3d'), + **kwargs): + super().__init__(in_channels, conv_cfg=conv_cfg, **kwargs) + self.sub_sample = sub_sample + + if sub_sample: + max_pool_layer = nn.MaxPool3d(kernel_size=(1, 2, 2)) + self.g = nn.Sequential(self.g, max_pool_layer) + if self.mode != 'gaussian': + self.phi = nn.Sequential(self.phi, max_pool_layer) + else: + self.phi = max_pool_layer diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/norm.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/norm.py new file mode 100644 index 0000000000000000000000000000000000000000..5aabab21a0096c185a929b11861c057cbea4b84d --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/norm.py @@ -0,0 +1,156 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import inspect +from typing import Dict, Tuple, Union + +import torch.nn as nn +from mmengine.registry import MODELS +from mmengine.utils import is_tuple_of +from mmengine.utils.dl_utils.parrots_wrapper import (SyncBatchNorm, _BatchNorm, + _InstanceNorm) + +MODELS.register_module('BN', module=nn.BatchNorm2d) +MODELS.register_module('BN1d', module=nn.BatchNorm1d) +MODELS.register_module('BN2d', module=nn.BatchNorm2d) +MODELS.register_module('BN3d', module=nn.BatchNorm3d) +MODELS.register_module('SyncBN', module=SyncBatchNorm) +MODELS.register_module('GN', module=nn.GroupNorm) +MODELS.register_module('LN', module=nn.LayerNorm) +MODELS.register_module('IN', module=nn.InstanceNorm2d) +MODELS.register_module('IN1d', module=nn.InstanceNorm1d) +MODELS.register_module('IN2d', module=nn.InstanceNorm2d) +MODELS.register_module('IN3d', module=nn.InstanceNorm3d) + + +def infer_abbr(class_type): + """Infer abbreviation from the class name. + + When we build a norm layer with `build_norm_layer()`, we want to preserve + the norm type in variable names, e.g, self.bn1, self.gn. This method will + infer the abbreviation to map class types to abbreviations. + + Rule 1: If the class has the property "_abbr_", return the property. + Rule 2: If the parent class is _BatchNorm, GroupNorm, LayerNorm or + InstanceNorm, the abbreviation of this layer will be "bn", "gn", "ln" and + "in" respectively. + Rule 3: If the class name contains "batch", "group", "layer" or "instance", + the abbreviation of this layer will be "bn", "gn", "ln" and "in" + respectively. + Rule 4: Otherwise, the abbreviation falls back to "norm". + + Args: + class_type (type): The norm layer type. + + Returns: + str: The inferred abbreviation. + """ + if not inspect.isclass(class_type): + raise TypeError( + f'class_type must be a type, but got {type(class_type)}') + if hasattr(class_type, '_abbr_'): + return class_type._abbr_ + if issubclass(class_type, _InstanceNorm): # IN is a subclass of BN + return 'in' + elif issubclass(class_type, _BatchNorm): + return 'bn' + elif issubclass(class_type, nn.GroupNorm): + return 'gn' + elif issubclass(class_type, nn.LayerNorm): + return 'ln' + else: + class_name = class_type.__name__.lower() + if 'batch' in class_name: + return 'bn' + elif 'group' in class_name: + return 'gn' + elif 'layer' in class_name: + return 'ln' + elif 'instance' in class_name: + return 'in' + else: + return 'norm_layer' + + +def build_norm_layer(cfg: Dict, + num_features: int, + postfix: Union[int, str] = '') -> Tuple[str, nn.Module]: + """Build normalization layer. + + Args: + cfg (dict): The norm layer config, which should contain: + + - type (str): Layer type. + - layer args: Args needed to instantiate a norm layer. + - requires_grad (bool, optional): Whether stop gradient updates. + num_features (int): Number of input channels. + postfix (int | str): The postfix to be appended into norm abbreviation + to create named layer. + + Returns: + tuple[str, nn.Module]: The first element is the layer name consisting + of abbreviation and postfix, e.g., bn1, gn. The second element is the + created norm layer. + """ + if not isinstance(cfg, dict): + raise TypeError('cfg must be a dict') + if 'type' not in cfg: + raise KeyError('the cfg dict must contain the key "type"') + cfg_ = cfg.copy() + + layer_type = cfg_.pop('type') + + if inspect.isclass(layer_type): + norm_layer = layer_type + else: + # Switch registry to the target scope. If `norm_layer` cannot be found + # in the registry, fallback to search `norm_layer` in the + # mmengine.MODELS. + with MODELS.switch_scope_and_registry(None) as registry: + norm_layer = registry.get(layer_type) + if norm_layer is None: + raise KeyError(f'Cannot find {norm_layer} in registry under ' + f'scope name {registry.scope}') + abbr = infer_abbr(norm_layer) + + assert isinstance(postfix, (int, str)) + name = abbr + str(postfix) + + requires_grad = cfg_.pop('requires_grad', True) + cfg_.setdefault('eps', 1e-5) + if norm_layer is not nn.GroupNorm: + layer = norm_layer(num_features, **cfg_) + if layer_type == 'SyncBN' and hasattr(layer, '_specify_ddp_gpu_num'): + layer._specify_ddp_gpu_num(1) + else: + assert 'num_groups' in cfg_ + layer = norm_layer(num_channels=num_features, **cfg_) + + for param in layer.parameters(): + param.requires_grad = requires_grad + + return name, layer + + +def is_norm(layer: nn.Module, + exclude: Union[type, tuple, None] = None) -> bool: + """Check if a layer is a normalization layer. + + Args: + layer (nn.Module): The layer to be checked. + exclude (type | tuple[type]): Types to be excluded. + + Returns: + bool: Whether the layer is a norm layer. + """ + if exclude is not None: + if not isinstance(exclude, tuple): + exclude = (exclude, ) + if not is_tuple_of(exclude, type): + raise TypeError( + f'"exclude" must be either None or type or a tuple of types, ' + f'but got {type(exclude)}: {exclude}') + + if exclude and isinstance(layer, exclude): + return False + + all_norm_bases = (_BatchNorm, _InstanceNorm, nn.GroupNorm, nn.LayerNorm) + return isinstance(layer, all_norm_bases) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/padding.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/padding.py new file mode 100644 index 0000000000000000000000000000000000000000..3b29996b94a246d63a3661c345219eb1955a03d5 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/padding.py @@ -0,0 +1,43 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import inspect +from typing import Dict + +import torch.nn as nn +from mmengine.registry import MODELS + +MODELS.register_module('zero', module=nn.ZeroPad2d) +MODELS.register_module('reflect', module=nn.ReflectionPad2d) +MODELS.register_module('replicate', module=nn.ReplicationPad2d) + + +def build_padding_layer(cfg: Dict, *args, **kwargs) -> nn.Module: + """Build padding layer. + + Args: + cfg (dict): The padding layer config, which should contain: + - type (str): Layer type. + - layer args: Args needed to instantiate a padding layer. + + Returns: + nn.Module: Created padding layer. + """ + if not isinstance(cfg, dict): + raise TypeError('cfg must be a dict') + if 'type' not in cfg: + raise KeyError('the cfg dict must contain the key "type"') + + cfg_ = cfg.copy() + padding_type = cfg_.pop('type') + if inspect.isclass(padding_type): + return padding_type(*args, **kwargs, **cfg_) + # Switch registry to the target scope. If `padding_layer` cannot be found + # in the registry, fallback to search `padding_layer` in the + # mmengine.MODELS. + with MODELS.switch_scope_and_registry(None) as registry: + padding_layer = registry.get(padding_type) + if padding_layer is None: + raise KeyError(f'Cannot find {padding_layer} in registry under scope ' + f'name {registry.scope}') + layer = padding_layer(*args, **kwargs, **cfg_) + + return layer diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/plugin.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/plugin.py new file mode 100644 index 0000000000000000000000000000000000000000..3195ed13cf764febf5827224edf1abf9dc951efe --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/plugin.py @@ -0,0 +1,101 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import inspect +import platform +from typing import Dict, Tuple, Union + +import torch.nn as nn +from mmengine.registry import MODELS + +if platform.system() == 'Windows': + import regex as re # type: ignore +else: + import re # type: ignore + + +def infer_abbr(class_type: type) -> str: + """Infer abbreviation from the class name. + + This method will infer the abbreviation to map class types to + abbreviations. + + Rule 1: If the class has the property "abbr", return the property. + Rule 2: Otherwise, the abbreviation falls back to snake case of class + name, e.g. the abbreviation of ``FancyBlock`` will be ``fancy_block``. + + Args: + class_type (type): The norm layer type. + + Returns: + str: The inferred abbreviation. + """ + + def camel2snack(word): + """Convert camel case word into snack case. + + Modified from `inflection lib + `_. + + Example:: + + >>> camel2snack("FancyBlock") + 'fancy_block' + """ + + word = re.sub(r'([A-Z]+)([A-Z][a-z])', r'\1_\2', word) + word = re.sub(r'([a-z\d])([A-Z])', r'\1_\2', word) + word = word.replace('-', '_') + return word.lower() + + if not inspect.isclass(class_type): + raise TypeError( + f'class_type must be a type, but got {type(class_type)}') + if hasattr(class_type, '_abbr_'): + return class_type._abbr_ # type: ignore + else: + return camel2snack(class_type.__name__) + + +def build_plugin_layer(cfg: Dict, + postfix: Union[int, str] = '', + **kwargs) -> Tuple[str, nn.Module]: + """Build plugin layer. + + Args: + cfg (dict): cfg should contain: + + - type (str): identify plugin layer type. + - layer args: args needed to instantiate a plugin layer. + postfix (int, str): appended into norm abbreviation to + create named layer. Default: ''. + + Returns: + tuple[str, nn.Module]: The first one is the concatenation of + abbreviation and postfix. The second is the created plugin layer. + """ + if not isinstance(cfg, dict): + raise TypeError('cfg must be a dict') + if 'type' not in cfg: + raise KeyError('the cfg dict must contain the key "type"') + cfg_ = cfg.copy() + + layer_type = cfg_.pop('type') + if inspect.isclass(layer_type): + plugin_layer = layer_type + else: + # Switch registry to the target scope. If `plugin_layer` cannot be + # found in the registry, fallback to search `plugin_layer` in the + # mmengine.MODELS. + with MODELS.switch_scope_and_registry(None) as registry: + plugin_layer = registry.get(layer_type) + if plugin_layer is None: + raise KeyError( + f'Cannot find {plugin_layer} in registry under scope ' + f'name {registry.scope}') + abbr = infer_abbr(plugin_layer) + + assert isinstance(postfix, (int, str)) + name = abbr + str(postfix) + + layer = plugin_layer(**kwargs, **cfg_) + + return name, layer diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/scale.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/scale.py new file mode 100644 index 0000000000000000000000000000000000000000..a47379898f75117e5ca2176d9a5f225f563d7b1e --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/scale.py @@ -0,0 +1,57 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn + + +class Scale(nn.Module): + """A learnable scale parameter. + + This layer scales the input by a learnable factor. It multiplies a + learnable scale parameter of shape (1,) with input of any shape. + + Args: + scale (float): Initial value of scale factor. Default: 1.0 + """ + + def __init__(self, scale: float = 1.0): + super().__init__() + self.scale = nn.Parameter(torch.tensor(scale, dtype=torch.float)) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return x * self.scale + + +class LayerScale(nn.Module): + """LayerScale layer. + + Args: + dim (int): Dimension of input features. + inplace (bool): Whether performs operation in-place. + Default: `False`. + data_format (str): The input data format, could be 'channels_last' + or 'channels_first', representing (B, C, H, W) and + (B, N, C) format data respectively. Default: 'channels_last'. + scale (float): Initial value of scale factor. Default: 1.0 + """ + + def __init__(self, + dim: int, + inplace: bool = False, + data_format: str = 'channels_last', + scale: float = 1e-5): + super().__init__() + assert data_format in ('channels_last', 'channels_first'), \ + "'data_format' could only be channels_last or channels_first." + self.inplace = inplace + self.data_format = data_format + self.weight = nn.Parameter(torch.ones(dim) * scale) + + def forward(self, x) -> torch.Tensor: + if self.data_format == 'channels_first': + shape = tuple((1, -1, *(1 for _ in range(x.dim() - 2)))) + else: + shape = tuple((*(1 for _ in range(x.dim() - 1)), -1)) + if self.inplace: + return x.mul_(self.weight.view(*shape)) + else: + return x * self.weight.view(*shape) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/swish.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/swish.py new file mode 100644 index 0000000000000000000000000000000000000000..75ad75b9d73f11375ed63491d9e29efd6f43f143 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/swish.py @@ -0,0 +1,24 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmengine.registry import MODELS + + +@MODELS.register_module() +class Swish(nn.Module): + """Swish Module. + + This module applies the swish function: + + .. math:: + Swish(x) = x * Sigmoid(x) + + Returns: + Tensor: The output tensor. + """ + + def __init__(self): + super().__init__() + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return x * torch.sigmoid(x) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/transformer.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/transformer.py new file mode 100644 index 0000000000000000000000000000000000000000..f83b9a6977bf821985cb4c2f78de84fcf103fffb --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/transformer.py @@ -0,0 +1,951 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import math +import warnings +from typing import Sequence + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.config import ConfigDict +from mmengine.model import BaseModule, ModuleList, Sequential +from mmengine.registry import MODELS +from mmengine.utils import deprecated_api_warning, to_2tuple + +from mmcv.cnn import (Linear, build_activation_layer, build_conv_layer, + build_norm_layer) +from .drop import build_dropout +from .scale import LayerScale + +# Avoid BC-breaking of importing MultiScaleDeformableAttention from this file +try: + from mmcv.ops.multi_scale_deform_attn import \ + MultiScaleDeformableAttention # noqa F401 + warnings.warn( + ImportWarning( + '``MultiScaleDeformableAttention`` has been moved to ' + '``mmcv.ops.multi_scale_deform_attn``, please change original path ' # noqa E501 + '``from mmcv.cnn.bricks.transformer import MultiScaleDeformableAttention`` ' # noqa E501 + 'to ``from mmcv.ops.multi_scale_deform_attn import MultiScaleDeformableAttention`` ' # noqa E501 + )) + +except ImportError: + warnings.warn('Fail to import ``MultiScaleDeformableAttention`` from ' + '``mmcv.ops.multi_scale_deform_attn``, ' + 'You should install ``mmcv`` rather than ``mmcv-lite`` ' + 'if you need this module. ') + + +def build_positional_encoding(cfg, default_args=None): + """Builder for Position Encoding.""" + return MODELS.build(cfg, default_args=default_args) + + +def build_attention(cfg, default_args=None): + """Builder for attention.""" + return MODELS.build(cfg, default_args=default_args) + + +def build_feedforward_network(cfg, default_args=None): + """Builder for feed-forward network (FFN).""" + return MODELS.build(cfg, default_args=default_args) + + +def build_transformer_layer(cfg, default_args=None): + """Builder for transformer layer.""" + return MODELS.build(cfg, default_args=default_args) + + +def build_transformer_layer_sequence(cfg, default_args=None): + """Builder for transformer encoder and transformer decoder.""" + return MODELS.build(cfg, default_args=default_args) + + +class AdaptivePadding(nn.Module): + """Applies padding adaptively to the input. + + This module can make input get fully covered by filter + you specified. It support two modes "same" and "corner". The + "same" mode is same with "SAME" padding mode in TensorFlow, pad + zero around input. The "corner" mode would pad zero + to bottom right. + + Args: + kernel_size (int | tuple): Size of the kernel. Default: 1. + stride (int | tuple): Stride of the filter. Default: 1. + dilation (int | tuple): Spacing between kernel elements. + Default: 1. + padding (str): Support "same" and "corner", "corner" mode + would pad zero to bottom right, and "same" mode would + pad zero around input. Default: "corner". + + Example: + >>> kernel_size = 16 + >>> stride = 16 + >>> dilation = 1 + >>> input = torch.rand(1, 1, 15, 17) + >>> adap_pad = AdaptivePadding( + >>> kernel_size=kernel_size, + >>> stride=stride, + >>> dilation=dilation, + >>> padding="corner") + >>> out = adap_pad(input) + >>> assert (out.shape[2], out.shape[3]) == (16, 32) + >>> input = torch.rand(1, 1, 16, 17) + >>> out = adap_pad(input) + >>> assert (out.shape[2], out.shape[3]) == (16, 32) + """ + + def __init__(self, kernel_size=1, stride=1, dilation=1, padding='corner'): + super().__init__() + assert padding in ('same', 'corner') + + kernel_size = to_2tuple(kernel_size) + stride = to_2tuple(stride) + dilation = to_2tuple(dilation) + + self.padding = padding + self.kernel_size = kernel_size + self.stride = stride + self.dilation = dilation + + def get_pad_shape(self, input_shape): + """Calculate the padding size of input. + + Args: + input_shape (:obj:`torch.Size`): arrange as (H, W). + + Returns: + Tuple[int]: The padding size along the + original H and W directions + """ + input_h, input_w = input_shape + kernel_h, kernel_w = self.kernel_size + stride_h, stride_w = self.stride + output_h = math.ceil(input_h / stride_h) + output_w = math.ceil(input_w / stride_w) + pad_h = max((output_h - 1) * stride_h + + (kernel_h - 1) * self.dilation[0] + 1 - input_h, 0) + pad_w = max((output_w - 1) * stride_w + + (kernel_w - 1) * self.dilation[1] + 1 - input_w, 0) + return pad_h, pad_w + + def forward(self, x): + """Add padding to `x` + + Args: + x (Tensor): Input tensor has shape (B, C, H, W). + + Returns: + Tensor: The tensor with adaptive padding + """ + pad_h, pad_w = self.get_pad_shape(x.size()[-2:]) + if pad_h > 0 or pad_w > 0: + if self.padding == 'corner': + x = F.pad(x, [0, pad_w, 0, pad_h]) + elif self.padding == 'same': + x = F.pad(x, [ + pad_w // 2, pad_w - pad_w // 2, pad_h // 2, + pad_h - pad_h // 2 + ]) + return x + + +class PatchEmbed(BaseModule): + """Image to Patch Embedding. + + We use a conv layer to implement PatchEmbed. + + Args: + in_channels (int): The num of input channels. Default: 3 + embed_dims (int): The dimensions of embedding. Default: 768 + conv_type (str): The type of convolution + to generate patch embedding. Default: "Conv2d". + kernel_size (int): The kernel_size of embedding conv. Default: 16. + stride (int): The slide stride of embedding conv. + Default: 16. + padding (int | tuple | string): The padding length of + embedding conv. When it is a string, it means the mode + of adaptive padding, support "same" and "corner" now. + Default: "corner". + dilation (int): The dilation rate of embedding conv. Default: 1. + bias (bool): Bias of embed conv. Default: True. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: None. + input_size (int | tuple | None): The size of input, which will be + used to calculate the out size. Only works when `dynamic_size` + is False. Default: None. + init_cfg (`mmcv.ConfigDict`, optional): The Config for initialization. + Default: None. + """ + + def __init__(self, + in_channels=3, + embed_dims=768, + conv_type='Conv2d', + kernel_size=16, + stride=16, + padding='corner', + dilation=1, + bias=True, + norm_cfg=None, + input_size=None, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + self.embed_dims = embed_dims + if stride is None: + stride = kernel_size + + kernel_size = to_2tuple(kernel_size) + stride = to_2tuple(stride) + dilation = to_2tuple(dilation) + + if isinstance(padding, str): + self.adaptive_padding = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + # disable the padding of conv + padding = 0 + else: + self.adaptive_padding = None + padding = to_2tuple(padding) + + self.projection = build_conv_layer( + dict(type=conv_type), + in_channels=in_channels, + out_channels=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + if norm_cfg is not None: + self.norm = build_norm_layer(norm_cfg, embed_dims)[1] + else: + self.norm = None + + if input_size: + input_size = to_2tuple(input_size) + # `init_out_size` would be used outside to + # calculate the num_patches + # e.g. when `use_abs_pos_embed` outside + self.init_input_size = input_size + if self.adaptive_padding: + pad_h, pad_w = self.adaptive_padding.get_pad_shape(input_size) + input_h, input_w = input_size + input_h = input_h + pad_h + input_w = input_w + pad_w + input_size = (input_h, input_w) + + # https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html + h_out = (input_size[0] + 2 * padding[0] - dilation[0] * + (kernel_size[0] - 1) - 1) // stride[0] + 1 + w_out = (input_size[1] + 2 * padding[1] - dilation[1] * + (kernel_size[1] - 1) - 1) // stride[1] + 1 + self.init_out_size = (h_out, w_out) + else: + self.init_input_size = None + self.init_out_size = None + + def forward(self, x): + """ + Args: + x (Tensor): Has shape (B, C, H, W). In most case, C is 3. + + Returns: + tuple: Contains merged results and its spatial shape. + + - x (Tensor): Has shape (B, out_h * out_w, embed_dims) + - out_size (tuple[int]): Spatial shape of x, arrange as + (out_h, out_w). + """ + + if self.adaptive_padding: + x = self.adaptive_padding(x) + + x = self.projection(x) + out_size = (x.shape[2], x.shape[3]) + x = x.flatten(2).transpose(1, 2) + if self.norm is not None: + x = self.norm(x) + return x, out_size + + +class PatchMerging(BaseModule): + """Merge patch feature map. + + This layer groups feature map by kernel_size, and applies norm and linear + layers to the grouped feature map ((used in Swin Transformer)). + Our implementation uses `nn.Unfold` to + merge patches, which is about 25% faster than the original + implementation. However, we need to modify pretrained + models for compatibility. + + Args: + in_channels (int): The num of input channels. + to gets fully covered by filter and stride you specified. + out_channels (int): The num of output channels. + kernel_size (int | tuple, optional): the kernel size in the unfold + layer. Defaults to 2. + stride (int | tuple, optional): the stride of the sliding blocks in the + unfold layer. Default: None. (Would be set as `kernel_size`) + padding (int | tuple | string ): The padding length of + embedding conv. When it is a string, it means the mode + of adaptive padding, support "same" and "corner" now. + Default: "corner". + dilation (int | tuple, optional): dilation parameter in the unfold + layer. Default: 1. + bias (bool, optional): Whether to add bias in linear layer or not. + Defaults: False. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: dict(type='LN'). + init_cfg (dict, optional): The extra config for initialization. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size=2, + stride=None, + padding='corner', + dilation=1, + bias=False, + norm_cfg=dict(type='LN'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.in_channels = in_channels + self.out_channels = out_channels + if stride: + stride = stride + else: + stride = kernel_size + + kernel_size = to_2tuple(kernel_size) + stride = to_2tuple(stride) + dilation = to_2tuple(dilation) + + if isinstance(padding, str): + self.adaptive_padding = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + # disable the padding of unfold + padding = 0 + else: + self.adaptive_padding = None + + padding = to_2tuple(padding) + self.sampler = nn.Unfold( + kernel_size=kernel_size, + dilation=dilation, + padding=padding, + stride=stride) + + sample_dim = kernel_size[0] * kernel_size[1] * in_channels + + if norm_cfg is not None: + self.norm = build_norm_layer(norm_cfg, sample_dim)[1] + else: + self.norm = None + + self.reduction = nn.Linear(sample_dim, out_channels, bias=bias) + + def forward(self, x, input_size): + """ + Args: + x (Tensor): Has shape (B, H*W, C_in). + input_size (tuple[int]): The spatial shape of x, arrange as (H, W). + Default: None. + + Returns: + tuple: Contains merged results and its spatial shape. + + - x (Tensor): Has shape (B, Merged_H * Merged_W, C_out) + - out_size (tuple[int]): Spatial shape of x, arrange as + (Merged_H, Merged_W). + """ + B, L, C = x.shape + assert isinstance(input_size, Sequence), f'Expect ' \ + f'input_size is ' \ + f'`Sequence` ' \ + f'but get {input_size}' + + H, W = input_size + assert L == H * W, 'input feature has wrong size' + + x = x.view(B, H, W, C).permute([0, 3, 1, 2]) # B, C, H, W + + if self.adaptive_padding: + x = self.adaptive_padding(x) + H, W = x.shape[-2:] + + # Use nn.Unfold to merge patch. About 25% faster than original method, + # but need to modify pretrained model for compatibility + # if kernel_size=2 and stride=2, x should has shape (B, 4*C, H/2*W/2) + x = self.sampler(x) + + out_h = (H + 2 * self.sampler.padding[0] - self.sampler.dilation[0] * + (self.sampler.kernel_size[0] - 1) - + 1) // self.sampler.stride[0] + 1 + out_w = (W + 2 * self.sampler.padding[1] - self.sampler.dilation[1] * + (self.sampler.kernel_size[1] - 1) - + 1) // self.sampler.stride[1] + 1 + + output_size = (out_h, out_w) + x = x.transpose(1, 2) # B, H/2*W/2, 4*C + x = self.norm(x) if self.norm else x + x = self.reduction(x) + return x, output_size + + +@MODELS.register_module() +class MultiheadAttention(BaseModule): + """A wrapper for ``torch.nn.MultiheadAttention``. + + This module implements MultiheadAttention with identity connection, + and positional encoding is also passed as input. + + Args: + embed_dims (int): The embedding dimension. + num_heads (int): Parallel attention heads. + attn_drop (float): A Dropout layer on attn_output_weights. + Default: 0.0. + proj_drop (float): A Dropout layer after `nn.MultiheadAttention`. + Default: 0.0. + dropout_layer (obj:`ConfigDict`): The dropout_layer used + when adding the shortcut. + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Default: None. + batch_first (bool): When it is True, Key, Query and Value are shape of + (batch, n, embed_dim), otherwise (n, batch, embed_dim). + Default to False. + """ + + def __init__(self, + embed_dims, + num_heads, + attn_drop=0., + proj_drop=0., + dropout_layer=dict(type='Dropout', drop_prob=0.), + init_cfg=None, + batch_first=False, + **kwargs): + super().__init__(init_cfg) + if 'dropout' in kwargs: + warnings.warn( + 'The arguments `dropout` in MultiheadAttention ' + 'has been deprecated, now you can separately ' + 'set `attn_drop`(float), proj_drop(float), ' + 'and `dropout_layer`(dict) ', DeprecationWarning) + attn_drop = kwargs['dropout'] + dropout_layer['drop_prob'] = kwargs.pop('dropout') + + self.embed_dims = embed_dims + self.num_heads = num_heads + self.batch_first = batch_first + + self.attn = nn.MultiheadAttention(embed_dims, num_heads, attn_drop, + **kwargs) + + self.proj_drop = nn.Dropout(proj_drop) + self.dropout_layer = build_dropout( + dropout_layer) if dropout_layer else nn.Identity() + + @deprecated_api_warning({'residual': 'identity'}, + cls_name='MultiheadAttention') + def forward(self, + query, + key=None, + value=None, + identity=None, + query_pos=None, + key_pos=None, + attn_mask=None, + key_padding_mask=None, + **kwargs): + """Forward function for `MultiheadAttention`. + + **kwargs allow passing a more general data flow when combining + with other operations in `transformerlayer`. + + Args: + query (Tensor): The input query with shape [num_queries, bs, + embed_dims] if self.batch_first is False, else + [bs, num_queries embed_dims]. + key (Tensor): The key tensor with shape [num_keys, bs, + embed_dims] if self.batch_first is False, else + [bs, num_keys, embed_dims] . + If None, the ``query`` will be used. Defaults to None. + value (Tensor): The value tensor with same shape as `key`. + Same in `nn.MultiheadAttention.forward`. Defaults to None. + If None, the `key` will be used. + identity (Tensor): This tensor, with the same shape as x, + will be used for the identity link. + If None, `x` will be used. Defaults to None. + query_pos (Tensor): The positional encoding for query, with + the same shape as `x`. If not None, it will + be added to `x` before forward function. Defaults to None. + key_pos (Tensor): The positional encoding for `key`, with the + same shape as `key`. Defaults to None. If not None, it will + be added to `key` before forward function. If None, and + `query_pos` has the same shape as `key`, then `query_pos` + will be used for `key_pos`. Defaults to None. + attn_mask (Tensor): ByteTensor mask with shape [num_queries, + num_keys]. Same in `nn.MultiheadAttention.forward`. + Defaults to None. + key_padding_mask (Tensor): ByteTensor with shape [bs, num_keys]. + Defaults to None. + + Returns: + Tensor: forwarded results with shape + [num_queries, bs, embed_dims] + if self.batch_first is False, else + [bs, num_queries embed_dims]. + """ + + if key is None: + key = query + if value is None: + value = key + if identity is None: + identity = query + if key_pos is None: + if query_pos is not None: + # use query_pos if key_pos is not available + if query_pos.shape == key.shape: + key_pos = query_pos + else: + warnings.warn(f'position encoding of key is' + f'missing in {self.__class__.__name__}.') + if query_pos is not None: + query = query + query_pos + if key_pos is not None: + key = key + key_pos + + # Because the dataflow('key', 'query', 'value') of + # ``torch.nn.MultiheadAttention`` is (num_query, batch, + # embed_dims), We should adjust the shape of dataflow from + # batch_first (batch, num_query, embed_dims) to num_query_first + # (num_query ,batch, embed_dims), and recover ``attn_output`` + # from num_query_first to batch_first. + if self.batch_first: + query = query.transpose(0, 1) + key = key.transpose(0, 1) + value = value.transpose(0, 1) + + out = self.attn( + query=query, + key=key, + value=value, + attn_mask=attn_mask, + key_padding_mask=key_padding_mask)[0] + + if self.batch_first: + out = out.transpose(0, 1) + + return identity + self.dropout_layer(self.proj_drop(out)) + + +@MODELS.register_module() +class FFN(BaseModule): + """Implements feed-forward networks (FFNs) with identity connection. + + Args: + embed_dims (int): The feature dimension. Same as + `MultiheadAttention`. Defaults: 256. + feedforward_channels (int): The hidden dimension of FFNs. + Defaults: 1024. + num_fcs (int, optional): The number of fully-connected layers in + FFNs. Default: 2. + act_cfg (dict, optional): The activation config for FFNs. + Default: dict(type='ReLU') + ffn_drop (float, optional): Probability of an element to be + zeroed in FFN. Default 0.0. + add_identity (bool, optional): Whether to add the + identity connection. Default: `True`. + dropout_layer (obj:`ConfigDict`): The dropout_layer used + when adding the shortcut. + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Default: None. + layer_scale_init_value (float): Initial value of scale factor in + LayerScale. Default: 1.0 + """ + + @deprecated_api_warning( + { + 'dropout': 'ffn_drop', + 'add_residual': 'add_identity' + }, + cls_name='FFN') + def __init__(self, + embed_dims=256, + feedforward_channels=1024, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0., + dropout_layer=None, + add_identity=True, + init_cfg=None, + layer_scale_init_value=0.): + super().__init__(init_cfg) + assert num_fcs >= 2, 'num_fcs should be no less ' \ + f'than 2. got {num_fcs}.' + self.embed_dims = embed_dims + self.feedforward_channels = feedforward_channels + self.num_fcs = num_fcs + + layers = [] + in_channels = embed_dims + for _ in range(num_fcs - 1): + layers.append( + Sequential( + Linear(in_channels, feedforward_channels), + build_activation_layer(act_cfg), nn.Dropout(ffn_drop))) + in_channels = feedforward_channels + layers.append(Linear(feedforward_channels, embed_dims)) + layers.append(nn.Dropout(ffn_drop)) + self.layers = Sequential(*layers) + self.dropout_layer = build_dropout( + dropout_layer) if dropout_layer else torch.nn.Identity() + self.add_identity = add_identity + + if layer_scale_init_value > 0: + self.gamma2 = LayerScale(embed_dims, scale=layer_scale_init_value) + else: + self.gamma2 = nn.Identity() + + @deprecated_api_warning({'residual': 'identity'}, cls_name='FFN') + def forward(self, x, identity=None): + """Forward function for `FFN`. + + The function would add x to the output tensor if residue is None. + """ + out = self.layers(x) + out = self.gamma2(out) + if not self.add_identity: + return self.dropout_layer(out) + if identity is None: + identity = x + return identity + self.dropout_layer(out) + + +@MODELS.register_module() +class BaseTransformerLayer(BaseModule): + """Base `TransformerLayer` for vision transformer. + + It can be built from `mmcv.ConfigDict` and support more flexible + customization, for example, using any number of `FFN or LN ` and + use different kinds of `attention` by specifying a list of `ConfigDict` + named `attn_cfgs`. It is worth mentioning that it supports `prenorm` + when you specifying `norm` as the first element of `operation_order`. + More details about the `prenorm`: `On Layer Normalization in the + Transformer Architecture `_ . + + Args: + attn_cfgs (list[`mmcv.ConfigDict`] | obj:`mmcv.ConfigDict` | None )): + Configs for `self_attention` or `cross_attention` modules, + The order of the configs in the list should be consistent with + corresponding attentions in operation_order. + If it is a dict, all of the attention modules in operation_order + will be built with this config. Default: None. + ffn_cfgs (list[`mmcv.ConfigDict`] | obj:`mmcv.ConfigDict` | None )): + Configs for FFN, The order of the configs in the list should be + consistent with corresponding ffn in operation_order. + If it is a dict, all of the attention modules in operation_order + will be built with this config. + operation_order (tuple[str]): The execution order of operation + in transformer. Such as ('self_attn', 'norm', 'ffn', 'norm'). + Support `prenorm` when you specifying first element as `norm`. + Default:None. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Default: None. + batch_first (bool): Key, Query and Value are shape + of (batch, n, embed_dim) + or (n, batch, embed_dim). Default to False. + """ + + def __init__(self, + attn_cfgs=None, + ffn_cfgs=dict( + type='FFN', + embed_dims=256, + feedforward_channels=1024, + num_fcs=2, + ffn_drop=0., + act_cfg=dict(type='ReLU', inplace=True), + ), + operation_order=None, + norm_cfg=dict(type='LN'), + init_cfg=None, + batch_first=False, + **kwargs): + + deprecated_args = dict( + feedforward_channels='feedforward_channels', + ffn_dropout='ffn_drop', + ffn_num_fcs='num_fcs') + for ori_name, new_name in deprecated_args.items(): + if ori_name in kwargs: + warnings.warn( + f'The arguments `{ori_name}` in BaseTransformerLayer ' + f'has been deprecated, now you should set `{new_name}` ' + f'and other FFN related arguments ' + f'to a dict named `ffn_cfgs`. ', DeprecationWarning) + ffn_cfgs[new_name] = kwargs[ori_name] + + super().__init__(init_cfg) + + self.batch_first = batch_first + + assert set(operation_order) & { + 'self_attn', 'norm', 'ffn', 'cross_attn'} == \ + set(operation_order), f'The operation_order of' \ + f' {self.__class__.__name__} should ' \ + f'contains all four operation type ' \ + f"{['self_attn', 'norm', 'ffn', 'cross_attn']}" + + num_attn = operation_order.count('self_attn') + operation_order.count( + 'cross_attn') + if isinstance(attn_cfgs, dict): + attn_cfgs = [copy.deepcopy(attn_cfgs) for _ in range(num_attn)] + else: + assert num_attn == len(attn_cfgs), f'The length ' \ + f'of attn_cfg {num_attn} is ' \ + f'not consistent with the number of attention' \ + f'in operation_order {operation_order}.' + + self.num_attn = num_attn + self.operation_order = operation_order + self.norm_cfg = norm_cfg + self.pre_norm = operation_order[0] == 'norm' + self.attentions = ModuleList() + + index = 0 + for operation_name in operation_order: + if operation_name in ['self_attn', 'cross_attn']: + if 'batch_first' in attn_cfgs[index]: + assert self.batch_first == attn_cfgs[index]['batch_first'] + else: + attn_cfgs[index]['batch_first'] = self.batch_first + attention = build_attention(attn_cfgs[index]) + # Some custom attentions used as `self_attn` + # or `cross_attn` can have different behavior. + attention.operation_name = operation_name + self.attentions.append(attention) + index += 1 + + self.embed_dims = self.attentions[0].embed_dims + + self.ffns = ModuleList() + num_ffns = operation_order.count('ffn') + if isinstance(ffn_cfgs, dict): + ffn_cfgs = ConfigDict(ffn_cfgs) + if isinstance(ffn_cfgs, dict): + ffn_cfgs = [copy.deepcopy(ffn_cfgs) for _ in range(num_ffns)] + assert len(ffn_cfgs) == num_ffns + for ffn_index in range(num_ffns): + if 'embed_dims' not in ffn_cfgs[ffn_index]: + ffn_cfgs[ffn_index]['embed_dims'] = self.embed_dims + else: + assert ffn_cfgs[ffn_index]['embed_dims'] == self.embed_dims + self.ffns.append( + build_feedforward_network(ffn_cfgs[ffn_index], + dict(type='FFN'))) + + self.norms = ModuleList() + num_norms = operation_order.count('norm') + for _ in range(num_norms): + self.norms.append(build_norm_layer(norm_cfg, self.embed_dims)[1]) + + def forward(self, + query, + key=None, + value=None, + query_pos=None, + key_pos=None, + attn_masks=None, + query_key_padding_mask=None, + key_padding_mask=None, + **kwargs): + """Forward function for `TransformerDecoderLayer`. + + **kwargs contains some specific arguments of attentions. + + Args: + query (Tensor): The input query with shape + [num_queries, bs, embed_dims] if + self.batch_first is False, else + [bs, num_queries embed_dims]. + key (Tensor): The key tensor with shape [num_keys, bs, + embed_dims] if self.batch_first is False, else + [bs, num_keys, embed_dims] . + value (Tensor): The value tensor with same shape as `key`. + query_pos (Tensor): The positional encoding for `query`. + Default: None. + key_pos (Tensor): The positional encoding for `key`. + Default: None. + attn_masks (List[Tensor] | None): 2D Tensor used in + calculation of corresponding attention. The length of + it should equal to the number of `attention` in + `operation_order`. Default: None. + query_key_padding_mask (Tensor): ByteTensor for `query`, with + shape [bs, num_queries]. Only used in `self_attn` layer. + Defaults to None. + key_padding_mask (Tensor): ByteTensor for `query`, with + shape [bs, num_keys]. Default: None. + + Returns: + Tensor: forwarded results with shape [num_queries, bs, embed_dims]. + """ + + norm_index = 0 + attn_index = 0 + ffn_index = 0 + identity = query + if attn_masks is None: + attn_masks = [None for _ in range(self.num_attn)] + elif isinstance(attn_masks, torch.Tensor): + attn_masks = [ + copy.deepcopy(attn_masks) for _ in range(self.num_attn) + ] + warnings.warn(f'Use same attn_mask in all attentions in ' + f'{self.__class__.__name__} ') + else: + assert len(attn_masks) == self.num_attn, f'The length of ' \ + f'attn_masks {len(attn_masks)} must be equal ' \ + f'to the number of attention in ' \ + f'operation_order {self.num_attn}' + + for layer in self.operation_order: + if layer == 'self_attn': + temp_key = temp_value = query + query = self.attentions[attn_index]( + query, + temp_key, + temp_value, + identity if self.pre_norm else None, + query_pos=query_pos, + key_pos=query_pos, + attn_mask=attn_masks[attn_index], + key_padding_mask=query_key_padding_mask, + **kwargs) + attn_index += 1 + identity = query + + elif layer == 'norm': + query = self.norms[norm_index](query) + norm_index += 1 + + elif layer == 'cross_attn': + query = self.attentions[attn_index]( + query, + key, + value, + identity if self.pre_norm else None, + query_pos=query_pos, + key_pos=key_pos, + attn_mask=attn_masks[attn_index], + key_padding_mask=key_padding_mask, + **kwargs) + attn_index += 1 + identity = query + + elif layer == 'ffn': + query = self.ffns[ffn_index]( + query, identity if self.pre_norm else None) + ffn_index += 1 + + return query + + +@MODELS.register_module() +class TransformerLayerSequence(BaseModule): + """Base class for TransformerEncoder and TransformerDecoder in vision + transformer. + + As base-class of Encoder and Decoder in vision transformer. + Support customization such as specifying different kind + of `transformer_layer` in `transformer_coder`. + + Args: + transformerlayer (list[obj:`mmcv.ConfigDict`] | + obj:`mmcv.ConfigDict`): Config of transformerlayer + in TransformerCoder. If it is obj:`mmcv.ConfigDict`, + it would be repeated `num_layer` times to a + list[`mmcv.ConfigDict`]. Default: None. + num_layers (int): The number of `TransformerLayer`. Default: None. + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Default: None. + """ + + def __init__(self, transformerlayers=None, num_layers=None, init_cfg=None): + super().__init__(init_cfg) + if isinstance(transformerlayers, dict): + transformerlayers = [ + copy.deepcopy(transformerlayers) for _ in range(num_layers) + ] + else: + assert isinstance(transformerlayers, list) and \ + len(transformerlayers) == num_layers + self.num_layers = num_layers + self.layers = ModuleList() + for i in range(num_layers): + self.layers.append(build_transformer_layer(transformerlayers[i])) + self.embed_dims = self.layers[0].embed_dims + self.pre_norm = self.layers[0].pre_norm + + def forward(self, + query, + key, + value, + query_pos=None, + key_pos=None, + attn_masks=None, + query_key_padding_mask=None, + key_padding_mask=None, + **kwargs): + """Forward function for `TransformerCoder`. + + Args: + query (Tensor): Input query with shape + `(num_queries, bs, embed_dims)`. + key (Tensor): The key tensor with shape + `(num_keys, bs, embed_dims)`. + value (Tensor): The value tensor with shape + `(num_keys, bs, embed_dims)`. + query_pos (Tensor): The positional encoding for `query`. + Default: None. + key_pos (Tensor): The positional encoding for `key`. + Default: None. + attn_masks (List[Tensor], optional): Each element is 2D Tensor + which is used in calculation of corresponding attention in + operation_order. Default: None. + query_key_padding_mask (Tensor): ByteTensor for `query`, with + shape [bs, num_queries]. Only used in self-attention + Default: None. + key_padding_mask (Tensor): ByteTensor for `query`, with + shape [bs, num_keys]. Default: None. + + Returns: + Tensor: results with shape [num_queries, bs, embed_dims]. + """ + for layer in self.layers: + query = layer( + query, + key, + value, + query_pos=query_pos, + key_pos=key_pos, + attn_masks=attn_masks, + query_key_padding_mask=query_key_padding_mask, + key_padding_mask=key_padding_mask, + **kwargs) + return query diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/upsample.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/upsample.py new file mode 100644 index 0000000000000000000000000000000000000000..78fb5bf371712d13a72edf5d57151dca8fce6953 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/upsample.py @@ -0,0 +1,94 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import inspect +from typing import Dict + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.model import xavier_init +from mmengine.registry import MODELS + +MODELS.register_module('nearest', module=nn.Upsample) +MODELS.register_module('bilinear', module=nn.Upsample) + + +@MODELS.register_module(name='pixel_shuffle') +class PixelShufflePack(nn.Module): + """Pixel Shuffle upsample layer. + + This module packs `F.pixel_shuffle()` and a nn.Conv2d module together to + achieve a simple upsampling with pixel shuffle. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + scale_factor (int): Upsample ratio. + upsample_kernel (int): Kernel size of the conv layer to expand the + channels. + """ + + def __init__(self, in_channels: int, out_channels: int, scale_factor: int, + upsample_kernel: int): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.scale_factor = scale_factor + self.upsample_kernel = upsample_kernel + self.upsample_conv = nn.Conv2d( + self.in_channels, + self.out_channels * scale_factor * scale_factor, + self.upsample_kernel, + padding=(self.upsample_kernel - 1) // 2) + self.init_weights() + + def init_weights(self): + xavier_init(self.upsample_conv, distribution='uniform') + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = self.upsample_conv(x) + x = F.pixel_shuffle(x, self.scale_factor) + return x + + +def build_upsample_layer(cfg: Dict, *args, **kwargs) -> nn.Module: + """Build upsample layer. + + Args: + cfg (dict): The upsample layer config, which should contain: + + - type (str): Layer type. + - scale_factor (int): Upsample ratio, which is not applicable to + deconv. + - layer args: Args needed to instantiate a upsample layer. + args (argument list): Arguments passed to the ``__init__`` + method of the corresponding conv layer. + kwargs (keyword arguments): Keyword arguments passed to the + ``__init__`` method of the corresponding conv layer. + + Returns: + nn.Module: Created upsample layer. + """ + if not isinstance(cfg, dict): + raise TypeError(f'cfg must be a dict, but got {type(cfg)}') + if 'type' not in cfg: + raise KeyError( + f'the cfg dict must contain the key "type", but got {cfg}') + cfg_ = cfg.copy() + + layer_type = cfg_.pop('type') + + if inspect.isclass(layer_type): + upsample = layer_type + # Switch registry to the target scope. If `upsample` cannot be found + # in the registry, fallback to search `upsample` in the + # mmengine.MODELS. + else: + with MODELS.switch_scope_and_registry(None) as registry: + upsample = registry.get(layer_type) + if upsample is None: + raise KeyError(f'Cannot find {upsample} in registry under scope ' + f'name {registry.scope}') + if upsample is nn.Upsample: + cfg_['mode'] = layer_type + layer = upsample(*args, **kwargs, **cfg_) + return layer diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/wrappers.py b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/wrappers.py new file mode 100644 index 0000000000000000000000000000000000000000..fc98c35584430a85910ef7a776e83d1ab9cd036a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/bricks/wrappers.py @@ -0,0 +1,177 @@ +# Copyright (c) OpenMMLab. All rights reserved. +r"""Modified from https://github.com/facebookresearch/detectron2/blob/master/detectron2/layers/wrappers.py # noqa: E501 + +Wrap some nn modules to support empty tensor input. Currently, these wrappers +are mainly used in mask heads like fcn_mask_head and maskiou_heads since mask +heads are trained on only positive RoIs. +""" +import math + +import torch +import torch.nn as nn +from mmengine.registry import MODELS +from torch.nn.modules.utils import _pair, _triple + +if torch.__version__ == 'parrots': + TORCH_VERSION = torch.__version__ +else: + # torch.__version__ could be 1.3.1+cu92, we only need the first two + # for comparison + TORCH_VERSION = tuple(int(x) for x in torch.__version__.split('.')[:2]) + + +def obsolete_torch_version(torch_version, version_threshold) -> bool: + return torch_version == 'parrots' or torch_version <= version_threshold + + +class NewEmptyTensorOp(torch.autograd.Function): + + @staticmethod + def forward(ctx, x: torch.Tensor, new_shape: tuple) -> torch.Tensor: + ctx.shape = x.shape + return x.new_empty(new_shape) + + @staticmethod + def backward(ctx, grad: torch.Tensor) -> tuple: + shape = ctx.shape + return NewEmptyTensorOp.apply(grad, shape), None + + +@MODELS.register_module('Conv', force=True) +class Conv2d(nn.Conv2d): + + def forward(self, x: torch.Tensor) -> torch.Tensor: + if obsolete_torch_version(TORCH_VERSION, (1, 4)) and x.numel() == 0: + out_shape = [x.shape[0], self.out_channels] + for i, k, p, s, d in zip(x.shape[-2:], self.kernel_size, + self.padding, self.stride, self.dilation): + o = (i + 2 * p - (d * (k - 1) + 1)) // s + 1 + out_shape.append(o) + empty = NewEmptyTensorOp.apply(x, out_shape) + if self.training: + # produce dummy gradient to avoid DDP warning. + dummy = sum(x.view(-1)[0] for x in self.parameters()) * 0.0 + return empty + dummy + else: + return empty + + return super().forward(x) + + +@MODELS.register_module('Conv3d', force=True) +class Conv3d(nn.Conv3d): + + def forward(self, x: torch.Tensor) -> torch.Tensor: + if obsolete_torch_version(TORCH_VERSION, (1, 4)) and x.numel() == 0: + out_shape = [x.shape[0], self.out_channels] + for i, k, p, s, d in zip(x.shape[-3:], self.kernel_size, + self.padding, self.stride, self.dilation): + o = (i + 2 * p - (d * (k - 1) + 1)) // s + 1 + out_shape.append(o) + empty = NewEmptyTensorOp.apply(x, out_shape) + if self.training: + # produce dummy gradient to avoid DDP warning. + dummy = sum(x.view(-1)[0] for x in self.parameters()) * 0.0 + return empty + dummy + else: + return empty + + return super().forward(x) + + +@MODELS.register_module() +@MODELS.register_module('deconv') +class ConvTranspose2d(nn.ConvTranspose2d): + + def forward(self, x: torch.Tensor) -> torch.Tensor: + if obsolete_torch_version(TORCH_VERSION, (1, 4)) and x.numel() == 0: + out_shape = [x.shape[0], self.out_channels] + for i, k, p, s, d, op in zip(x.shape[-2:], self.kernel_size, + self.padding, self.stride, + self.dilation, self.output_padding): + out_shape.append((i - 1) * s - 2 * p + (d * (k - 1) + 1) + op) + empty = NewEmptyTensorOp.apply(x, out_shape) + if self.training: + # produce dummy gradient to avoid DDP warning. + dummy = sum(x.view(-1)[0] for x in self.parameters()) * 0.0 + return empty + dummy + else: + return empty + + return super().forward(x) + + +@MODELS.register_module() +@MODELS.register_module('deconv3d') +class ConvTranspose3d(nn.ConvTranspose3d): + + def forward(self, x: torch.Tensor) -> torch.Tensor: + if obsolete_torch_version(TORCH_VERSION, (1, 4)) and x.numel() == 0: + out_shape = [x.shape[0], self.out_channels] + for i, k, p, s, d, op in zip(x.shape[-3:], self.kernel_size, + self.padding, self.stride, + self.dilation, self.output_padding): + out_shape.append((i - 1) * s - 2 * p + (d * (k - 1) + 1) + op) + empty = NewEmptyTensorOp.apply(x, out_shape) + if self.training: + # produce dummy gradient to avoid DDP warning. + dummy = sum(x.view(-1)[0] for x in self.parameters()) * 0.0 + return empty + dummy + else: + return empty + + return super().forward(x) + + +class MaxPool2d(nn.MaxPool2d): + + def forward(self, x: torch.Tensor) -> torch.Tensor: + # PyTorch 1.9 does not support empty tensor inference yet + if obsolete_torch_version(TORCH_VERSION, (1, 9)) and x.numel() == 0: + out_shape = list(x.shape[:2]) + for i, k, p, s, d in zip(x.shape[-2:], _pair(self.kernel_size), + _pair(self.padding), _pair(self.stride), + _pair(self.dilation)): + o = (i + 2 * p - (d * (k - 1) + 1)) / s + 1 + o = math.ceil(o) if self.ceil_mode else math.floor(o) + out_shape.append(o) + empty = NewEmptyTensorOp.apply(x, out_shape) + return empty + + return super().forward(x) + + +class MaxPool3d(nn.MaxPool3d): + + def forward(self, x: torch.Tensor) -> torch.Tensor: + # PyTorch 1.9 does not support empty tensor inference yet + if obsolete_torch_version(TORCH_VERSION, (1, 9)) and x.numel() == 0: + out_shape = list(x.shape[:2]) + for i, k, p, s, d in zip(x.shape[-3:], _triple(self.kernel_size), + _triple(self.padding), + _triple(self.stride), + _triple(self.dilation)): + o = (i + 2 * p - (d * (k - 1) + 1)) / s + 1 + o = math.ceil(o) if self.ceil_mode else math.floor(o) + out_shape.append(o) + empty = NewEmptyTensorOp.apply(x, out_shape) + return empty + + return super().forward(x) + + +class Linear(torch.nn.Linear): + + def forward(self, x: torch.Tensor) -> torch.Tensor: + # empty tensor forward of Linear layer is supported in Pytorch 1.6 + if obsolete_torch_version(TORCH_VERSION, (1, 5)) and x.numel() == 0: + out_shape = [x.shape[0], self.out_features] + empty = NewEmptyTensorOp.apply(x, out_shape) + if self.training: + # produce dummy gradient to avoid DDP warning. + dummy = sum(x.view(-1)[0] for x in self.parameters()) * 0.0 + return empty + dummy + else: + return empty + + return super().forward(x) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/resnet.py b/FoodSeg103/demo/mmcv/mmcv/cnn/resnet.py new file mode 100644 index 0000000000000000000000000000000000000000..8fc6abf6ac60b982a8c7998e0545bc55f9ceee78 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/resnet.py @@ -0,0 +1,321 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +from typing import Optional, Sequence, Tuple, Union + +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmengine.model import constant_init, kaiming_init +from mmengine.runner import load_checkpoint +from torch import Tensor + + +def conv3x3(in_planes: int, + out_planes: int, + stride: int = 1, + dilation: int = 1): + """3x3 convolution with padding.""" + return nn.Conv2d( + in_planes, + out_planes, + kernel_size=3, + stride=stride, + padding=dilation, + dilation=dilation, + bias=False) + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, + inplanes: int, + planes: int, + stride: int = 1, + dilation: int = 1, + downsample: Optional[nn.Module] = None, + style: str = 'pytorch', + with_cp: bool = False): + super().__init__() + assert style in ['pytorch', 'caffe'] + self.conv1 = conv3x3(inplanes, planes, stride, dilation) + self.bn1 = nn.BatchNorm2d(planes) + self.relu = nn.ReLU(inplace=True) + self.conv2 = conv3x3(planes, planes) + self.bn2 = nn.BatchNorm2d(planes) + self.downsample = downsample + self.stride = stride + self.dilation = dilation + assert not with_cp + + def forward(self, x: Tensor) -> Tensor: + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, + inplanes: int, + planes: int, + stride: int = 1, + dilation: int = 1, + downsample: Optional[nn.Module] = None, + style: str = 'pytorch', + with_cp: bool = False): + """Bottleneck block. + + 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. + """ + super().__init__() + assert style in ['pytorch', 'caffe'] + if style == 'pytorch': + conv1_stride = 1 + conv2_stride = stride + else: + conv1_stride = stride + conv2_stride = 1 + self.conv1 = nn.Conv2d( + inplanes, planes, kernel_size=1, stride=conv1_stride, bias=False) + self.conv2 = nn.Conv2d( + planes, + planes, + kernel_size=3, + stride=conv2_stride, + padding=dilation, + dilation=dilation, + bias=False) + + self.bn1 = nn.BatchNorm2d(planes) + self.bn2 = nn.BatchNorm2d(planes) + self.conv3 = nn.Conv2d( + planes, planes * self.expansion, kernel_size=1, bias=False) + self.bn3 = nn.BatchNorm2d(planes * self.expansion) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + self.dilation = dilation + self.with_cp = with_cp + + def forward(self, x: Tensor) -> Tensor: + + def _inner_forward(x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + + 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 + + +def make_res_layer(block: nn.Module, + inplanes: int, + planes: int, + blocks: int, + stride: int = 1, + dilation: int = 1, + style: str = 'pytorch', + with_cp: bool = False) -> nn.Module: + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.Conv2d( + inplanes, + planes * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + nn.BatchNorm2d(planes * block.expansion), + ) + + layers = [] + layers.append( + block( + inplanes, + planes, + stride, + dilation, + downsample, + style=style, + with_cp=with_cp)) + inplanes = planes * block.expansion + for _ in range(1, blocks): + layers.append( + block(inplanes, planes, 1, dilation, style=style, with_cp=with_cp)) + + return nn.Sequential(*layers) + + +class ResNet(nn.Module): + """ResNet backbone. + + Args: + depth (int): Depth of resnet, from {18, 34, 50, 101, 152}. + 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. + frozen_stages (int): Stages to be frozen (all param fixed). -1 means + not freezing any parameters. + bn_eval (bool): Whether to set BN layers as eval mode, namely, freeze + running stats (mean and var). + bn_frozen (bool): Whether to freeze weight and bias of BN layers. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + """ + + 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: int, + num_stages: int = 4, + strides: Sequence[int] = (1, 2, 2, 2), + dilations: Sequence[int] = (1, 1, 1, 1), + out_indices: Sequence[int] = (0, 1, 2, 3), + style: str = 'pytorch', + frozen_stages: int = -1, + bn_eval: bool = True, + bn_frozen: bool = False, + with_cp: bool = False): + super().__init__() + if depth not in self.arch_settings: + raise KeyError(f'invalid depth {depth} for resnet') + assert num_stages >= 1 and num_stages <= 4 + block, stage_blocks = self.arch_settings[depth] + stage_blocks = stage_blocks[:num_stages] # type: ignore + assert len(strides) == len(dilations) == num_stages + assert max(out_indices) < num_stages + + self.out_indices = out_indices + self.style = style + self.frozen_stages = frozen_stages + self.bn_eval = bn_eval + self.bn_frozen = bn_frozen + self.with_cp = with_cp + + self.inplanes: int = 64 + self.conv1 = nn.Conv2d( + 3, 64, kernel_size=7, stride=2, padding=3, bias=False) + self.bn1 = nn.BatchNorm2d(64) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + self.res_layers = [] + for i, num_blocks in enumerate(stage_blocks): + stride = strides[i] + dilation = dilations[i] + planes = 64 * 2**i + res_layer = make_res_layer( + block, + self.inplanes, + planes, + num_blocks, + stride=stride, + dilation=dilation, + style=self.style, + with_cp=with_cp) + self.inplanes = planes * block.expansion # type: ignore + layer_name = f'layer{i + 1}' + self.add_module(layer_name, res_layer) + self.res_layers.append(layer_name) + + self.feat_dim = block.expansion * 64 * 2**( # type: ignore + len(stage_blocks) - 1) + + def init_weights(self, pretrained: Optional[str] = None) -> 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: Tensor) -> Union[Tensor, Tuple[Tensor]]: + x = self.conv1(x) + x = self.bn1(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) + if len(outs) == 1: + return outs[0] + else: + return tuple(outs) + + def train(self, mode: bool = True) -> None: + super().train(mode) + if self.bn_eval: + for m in self.modules(): + if isinstance(m, nn.BatchNorm2d): + m.eval() + if self.bn_frozen: + for params in m.parameters(): + params.requires_grad = False + if mode and self.frozen_stages >= 0: + for param in self.conv1.parameters(): + param.requires_grad = False + for param in self.bn1.parameters(): + param.requires_grad = False + self.bn1.eval() + self.bn1.weight.requires_grad = False + self.bn1.bias.requires_grad = False + for i in range(1, self.frozen_stages + 1): + mod = getattr(self, f'layer{i}') + mod.eval() + for param in mod.parameters(): + param.requires_grad = False diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/__init__.py b/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..04d45725dc40a15c086f21fc5ce73373318c578e --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .operator import BaseConvRFSearchOp, Conv2dRFSearchOp +from .search import RFSearchHook + +__all__ = ['BaseConvRFSearchOp', 'Conv2dRFSearchOp', 'RFSearchHook'] diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/operator.py b/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/operator.py new file mode 100644 index 0000000000000000000000000000000000000000..2fa45abb0a282954cd5e06503596141c9a314de4 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/operator.py @@ -0,0 +1,169 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import numpy as np +import torch +import torch.nn as nn +from mmengine.logging import print_log +from mmengine.model import BaseModule +from torch import Tensor + +from .utils import expand_rates, get_single_padding + + +class BaseConvRFSearchOp(BaseModule): + """Based class of ConvRFSearchOp. + + Args: + op_layer (nn.Module): pytorch module, e,g, Conv2d + global_config (dict): config dict. + """ + + def __init__(self, op_layer: nn.Module, global_config: dict): + super().__init__() + self.op_layer = op_layer + self.global_config = global_config + + def normlize(self, weights: nn.Parameter) -> nn.Parameter: + """Normalize weights. + + Args: + weights (nn.Parameter): Weights to be normalized. + + Returns: + nn.Parameters: Normalized weights. + """ + abs_weights = torch.abs(weights) + normalized_weights = abs_weights / torch.sum(abs_weights) + return normalized_weights + + +class Conv2dRFSearchOp(BaseConvRFSearchOp): + """Enable Conv2d with receptive field searching ability. + + Args: + op_layer (nn.Module): pytorch module, e,g, Conv2d + global_config (dict): config dict. Defaults to None. + By default this must include: + + - "init_alphas": The value for initializing weights of each branch. + - "num_branches": The controller of the size of + search space (the number of branches). + - "exp_rate": The controller of the sparsity of search space. + - "mmin": The minimum dilation rate. + - "mmax": The maximum dilation rate. + + Extra keys may exist, but are used by RFSearchHook, e.g., "step", + "max_step", "search_interval", and "skip_layer". + verbose (bool): Determines whether to print rf-next + related logging messages. + Defaults to True. + """ + + def __init__(self, + op_layer: nn.Module, + global_config: dict, + verbose: bool = True): + super().__init__(op_layer, global_config) + assert global_config is not None, 'global_config is None' + self.num_branches = global_config['num_branches'] + assert self.num_branches in [2, 3] + self.verbose = verbose + init_dilation = op_layer.dilation + self.dilation_rates = expand_rates(init_dilation, global_config) + if self.op_layer.kernel_size[ + 0] == 1 or self.op_layer.kernel_size[0] % 2 == 0: + self.dilation_rates = [(op_layer.dilation[0], r[1]) + for r in self.dilation_rates] + if self.op_layer.kernel_size[ + 1] == 1 or self.op_layer.kernel_size[1] % 2 == 0: + self.dilation_rates = [(r[0], op_layer.dilation[1]) + for r in self.dilation_rates] + + self.branch_weights = nn.Parameter(torch.Tensor(self.num_branches)) + if self.verbose: + print_log(f'Expand as {self.dilation_rates}', 'current') + nn.init.constant_(self.branch_weights, global_config['init_alphas']) + + def forward(self, input: Tensor) -> Tensor: + norm_w = self.normlize(self.branch_weights[:len(self.dilation_rates)]) + if len(self.dilation_rates) == 1: + outputs = [ + nn.functional.conv2d( + input, + weight=self.op_layer.weight, + bias=self.op_layer.bias, + stride=self.op_layer.stride, + padding=self.get_padding(self.dilation_rates[0]), + dilation=self.dilation_rates[0], + groups=self.op_layer.groups, + ) + ] + else: + outputs = [ + nn.functional.conv2d( + input, + weight=self.op_layer.weight, + bias=self.op_layer.bias, + stride=self.op_layer.stride, + padding=self.get_padding(r), + dilation=r, + groups=self.op_layer.groups, + ) * norm_w[i] for i, r in enumerate(self.dilation_rates) + ] + output = outputs[0] + for i in range(1, len(self.dilation_rates)): + output += outputs[i] + return output + + def estimate_rates(self) -> None: + """Estimate new dilation rate based on trained branch_weights.""" + norm_w = self.normlize(self.branch_weights[:len(self.dilation_rates)]) + if self.verbose: + print_log( + 'Estimate dilation {} with weight {}.'.format( + self.dilation_rates, + norm_w.detach().cpu().numpy().tolist()), 'current') + + sum0, sum1, w_sum = 0, 0, 0 + for i in range(len(self.dilation_rates)): + sum0 += norm_w[i].item() * self.dilation_rates[i][0] + sum1 += norm_w[i].item() * self.dilation_rates[i][1] + w_sum += norm_w[i].item() + estimated = [ + np.clip( + int(round(sum0 / w_sum)), self.global_config['mmin'], + self.global_config['mmax']).item(), + np.clip( + int(round(sum1 / w_sum)), self.global_config['mmin'], + self.global_config['mmax']).item() + ] + self.op_layer.dilation = tuple(estimated) + self.op_layer.padding = self.get_padding(self.op_layer.dilation) + self.dilation_rates = [tuple(estimated)] + if self.verbose: + print_log(f'Estimate as {tuple(estimated)}', 'current') + + def expand_rates(self) -> None: + """Expand dilation rate.""" + dilation = self.op_layer.dilation + dilation_rates = expand_rates(dilation, self.global_config) + if self.op_layer.kernel_size[ + 0] == 1 or self.op_layer.kernel_size[0] % 2 == 0: + dilation_rates = [(dilation[0], r[1]) for r in dilation_rates] + if self.op_layer.kernel_size[ + 1] == 1 or self.op_layer.kernel_size[1] % 2 == 0: + dilation_rates = [(r[0], dilation[1]) for r in dilation_rates] + + self.dilation_rates = copy.deepcopy(dilation_rates) + if self.verbose: + print_log(f'Expand as {self.dilation_rates}', 'current') + nn.init.constant_(self.branch_weights, + self.global_config['init_alphas']) + + def get_padding(self, dilation) -> tuple: + padding = (get_single_padding(self.op_layer.kernel_size[0], + self.op_layer.stride[0], dilation[0]), + get_single_padding(self.op_layer.kernel_size[1], + self.op_layer.stride[1], dilation[1])) + return padding diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/search.py b/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/search.py new file mode 100644 index 0000000000000000000000000000000000000000..f4add4b23afd1585fd434931e27dc92187ba1f6f --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/search.py @@ -0,0 +1,239 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +from typing import Dict, Optional + +import mmengine +import torch # noqa +import torch.nn as nn +from mmengine.hooks import Hook +from mmengine.logging import print_log +from mmengine.registry import HOOKS + +from .operator import BaseConvRFSearchOp, Conv2dRFSearchOp # noqa +from .utils import get_single_padding, write_to_json + + +@HOOKS.register_module() +class RFSearchHook(Hook): + """Rcecptive field search via dilation rates. + + Please refer to `RF-Next: Efficient Receptive Field + Search for Convolutional Neural Networks + `_ for more details. + + + Args: + mode (str, optional): It can be set to the following types: + 'search', 'fixed_single_branch', or 'fixed_multi_branch'. + Defaults to 'search'. + config (Dict, optional): config dict of search. + By default this config contains "search", + and config["search"] must include: + + - "step": recording the current searching step. + - "max_step": The maximum number of searching steps + to update the structures. + - "search_interval": The interval (epoch/iteration) + between two updates. + - "exp_rate": The controller of the sparsity of search space. + - "init_alphas": The value for initializing weights of each branch. + - "mmin": The minimum dilation rate. + - "mmax": The maximum dilation rate. + - "num_branches": The controller of the size of + search space (the number of branches). + - "skip_layer": The modules in skip_layer will be ignored + during the receptive field search. + rfstructure_file (str, optional): Path to load searched receptive + fields of the model. Defaults to None. + by_epoch (bool, optional): Determine to perform step by epoch or + by iteration. If set to True, it will step by epoch. Otherwise, by + iteration. Defaults to True. + verbose (bool): Determines whether to print rf-next related logging + messages. Defaults to True. + """ + + def __init__(self, + mode: str = 'search', + config: Dict = {}, + rfstructure_file: Optional[str] = None, + by_epoch: bool = True, + verbose: bool = True): + assert mode in ['search', 'fixed_single_branch', 'fixed_multi_branch'] + assert config is not None + self.config = config + self.config['structure'] = {} + self.verbose = verbose + if rfstructure_file is not None: + rfstructure = mmengine.load(rfstructure_file)['structure'] + self.config['structure'] = rfstructure + self.mode = mode + self.num_branches = self.config['search']['num_branches'] + self.by_epoch = by_epoch + + def init_model(self, model: nn.Module): + """init model with search ability. + + Args: + model (nn.Module): pytorch model + + Raises: + NotImplementedError: only support three modes: + search/fixed_single_branch/fixed_multi_branch + """ + if self.verbose: + print_log('RFSearch init begin.', 'current') + if self.mode == 'search': + if self.config['structure']: + self.set_model(model, search_op='Conv2d') + self.wrap_model(model, search_op='Conv2d') + elif self.mode == 'fixed_single_branch': + self.set_model(model, search_op='Conv2d') + elif self.mode == 'fixed_multi_branch': + self.set_model(model, search_op='Conv2d') + self.wrap_model(model, search_op='Conv2d') + else: + raise NotImplementedError + if self.verbose: + print_log('RFSearch init end.', 'current') + + def after_train_epoch(self, runner): + """Performs a dilation searching step after one training epoch.""" + if self.by_epoch and self.mode == 'search': + self.step(runner.model, runner.work_dir) + + def after_train_iter(self, runner, batch_idx, data_batch, outputs): + """Performs a dilation searching step after one training iteration.""" + if not self.by_epoch and self.mode == 'search': + self.step(runner.model, runner.work_dir) + + def step(self, model: nn.Module, work_dir: str) -> None: + """Performs a dilation searching step. + + Args: + model (nn.Module): pytorch model + work_dir (str): Directory to save the searching results. + """ + self.config['search']['step'] += 1 + if (self.config['search']['step'] + ) % self.config['search']['search_interval'] == 0 and (self.config[ + 'search']['step']) < self.config['search']['max_step']: + self.estimate_and_expand(model) + for name, module in model.named_modules(): + if isinstance(module, BaseConvRFSearchOp): + self.config['structure'][name] = module.op_layer.dilation + + write_to_json( + self.config, + os.path.join( + work_dir, + 'local_search_config_step%d.json' % + self.config['search']['step'], + ), + ) + + def estimate_and_expand(self, model: nn.Module) -> None: + """estimate and search for RFConvOp. + + Args: + model (nn.Module): pytorch model + """ + for module in model.modules(): + if isinstance(module, BaseConvRFSearchOp): + module.estimate_rates() + module.expand_rates() + + def wrap_model(self, + model: nn.Module, + search_op: str = 'Conv2d', + prefix: str = '') -> None: + """wrap model to support searchable conv op. + + Args: + model (nn.Module): pytorch model + search_op (str): The module that uses RF search. + Defaults to 'Conv2d'. + init_rates (int, optional): Set to other initial dilation rates. + Defaults to None. + prefix (str): Prefix for function recursion. Defaults to ''. + """ + op = 'torch.nn.' + search_op + for name, module in model.named_children(): + if prefix == '': + fullname = 'module.' + name + else: + fullname = prefix + '.' + name + if self.config['search']['skip_layer'] is not None: + if any(layer in fullname + for layer in self.config['search']['skip_layer']): + continue + if isinstance(module, eval(op)): + if 1 < module.kernel_size[0] and \ + 0 != module.kernel_size[0] % 2 or \ + 1 < module.kernel_size[1] and \ + 0 != module.kernel_size[1] % 2: + moduleWrap = eval(search_op + 'RFSearchOp')( + module, self.config['search'], self.verbose) + moduleWrap = moduleWrap.to(module.weight.device) + if self.verbose: + print_log( + 'Wrap model %s to %s.' % + (str(module), str(moduleWrap)), 'current') + setattr(model, name, moduleWrap) + elif not isinstance(module, BaseConvRFSearchOp): + self.wrap_model(module, search_op, fullname) + + def set_model(self, + model: nn.Module, + search_op: str = 'Conv2d', + init_rates: Optional[int] = None, + prefix: str = '') -> None: + """set model based on config. + + Args: + model (nn.Module): pytorch model + config (Dict): config file + search_op (str): The module that uses RF search. + Defaults to 'Conv2d'. + init_rates (int, optional): Set to other initial dilation rates. + Defaults to None. + prefix (str): Prefix for function recursion. Defaults to ''. + """ + op = 'torch.nn.' + search_op + for name, module in model.named_children(): + if prefix == '': + fullname = 'module.' + name + else: + fullname = prefix + '.' + name + if self.config['search']['skip_layer'] is not None: + if any(layer in fullname + for layer in self.config['search']['skip_layer']): + continue + if isinstance(module, eval(op)): + if 1 < module.kernel_size[0] and \ + 0 != module.kernel_size[0] % 2 or \ + 1 < module.kernel_size[1] and \ + 0 != module.kernel_size[1] % 2: + if isinstance(self.config['structure'][fullname], int): + self.config['structure'][fullname] = [ + self.config['structure'][fullname], + self.config['structure'][fullname] + ] + module.dilation = ( + self.config['structure'][fullname][0], + self.config['structure'][fullname][1], + ) + module.padding = ( + get_single_padding( + module.kernel_size[0], module.stride[0], + self.config['structure'][fullname][0]), + get_single_padding( + module.kernel_size[1], module.stride[1], + self.config['structure'][fullname][1])) + setattr(model, name, module) + if self.verbose: + print_log( + 'Set module %s dilation as: [%d %d]' % + (fullname, module.dilation[0], module.dilation[1]), + 'current') + elif not isinstance(module, BaseConvRFSearchOp): + self.set_model(module, search_op, init_rates, fullname) diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/utils.py b/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..4c8168e343d6bded761390f1be9a38b58727badf --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/rfsearch/utils.py @@ -0,0 +1,68 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine +import numpy as np + + +def write_to_json(config: dict, filename: str): + """save config to json file. + + Args: + config (dict): Config to be saved. + filename (str): Path to save config. + """ + + with open(filename, 'w', encoding='utf-8') as f: + mmengine.dump(config, f, file_format='json') + + +def expand_rates(dilation: tuple, config: dict) -> list: + """expand dilation rate according to config. + + Args: + dilation (int): _description_ + config (dict): config dict + + Returns: + list: list of expanded dilation rates + """ + exp_rate = config['exp_rate'] + + large_rates = [] + small_rates = [] + for _ in range(config['num_branches'] // 2): + large_rates.append( + tuple([ + np.clip( + int(round((1 + exp_rate) * dilation[0])), config['mmin'], + config['mmax']).item(), + np.clip( + int(round((1 + exp_rate) * dilation[1])), config['mmin'], + config['mmax']).item() + ])) + small_rates.append( + tuple([ + np.clip( + int(round((1 - exp_rate) * dilation[0])), config['mmin'], + config['mmax']).item(), + np.clip( + int(round((1 - exp_rate) * dilation[1])), config['mmin'], + config['mmax']).item() + ])) + + small_rates.reverse() + + if config['num_branches'] % 2 == 0: + rate_list = small_rates + large_rates + else: + rate_list = small_rates + [dilation] + large_rates + + unique_rate_list = list(set(rate_list)) + unique_rate_list.sort(key=rate_list.index) + return unique_rate_list + + +def get_single_padding(kernel_size: int, + stride: int = 1, + dilation: int = 1) -> int: + padding = ((stride - 1) + dilation * (kernel_size - 1)) // 2 + return padding diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/utils/__init__.py b/FoodSeg103/demo/mmcv/mmcv/cnn/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..cdec9399f6544a90de6ac4238a60b05b8888c907 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/utils/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .flops_counter import get_model_complexity_info +from .fuse_conv_bn import fuse_conv_bn + +__all__ = ['get_model_complexity_info', 'fuse_conv_bn'] diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/utils/flops_counter.py b/FoodSeg103/demo/mmcv/mmcv/cnn/utils/flops_counter.py new file mode 100644 index 0000000000000000000000000000000000000000..b09edbcdff063c5a8276bafdd8d69b440539108e --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/utils/flops_counter.py @@ -0,0 +1,604 @@ +# Modified from flops-counter.pytorch by Vladislav Sovrasov +# original repo: https://github.com/sovrasov/flops-counter.pytorch + +# MIT License + +# Copyright (c) 2018 Vladislav Sovrasov + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import sys +import warnings +from functools import partial +from typing import Any, Callable, Dict, Optional, TextIO, Tuple + +import numpy as np +import torch +import torch.nn as nn + +from mmcv.cnn.bricks import (Conv2d, Conv3d, ConvTranspose2d, Linear, + MaxPool2d, MaxPool3d) + + +def get_model_complexity_info(model: nn.Module, + input_shape: tuple, + print_per_layer_stat: bool = True, + as_strings: bool = True, + input_constructor: Optional[Callable] = None, + flush: bool = False, + ost: TextIO = sys.stdout) -> tuple: + """Get complexity information of a model. + + This method can calculate FLOPs and parameter counts of a model with + corresponding input shape. It can also print complexity information for + each layer in a model. + + Supported layers are listed as below: + - Convolutions: ``nn.Conv1d``, ``nn.Conv2d``, ``nn.Conv3d``. + - Activations: ``nn.ReLU``, ``nn.PReLU``, ``nn.ELU``, + ``nn.LeakyReLU``, ``nn.ReLU6``. + - Poolings: ``nn.MaxPool1d``, ``nn.MaxPool2d``, ``nn.MaxPool3d``, + ``nn.AvgPool1d``, ``nn.AvgPool2d``, ``nn.AvgPool3d``, + ``nn.AdaptiveMaxPool1d``, ``nn.AdaptiveMaxPool2d``, + ``nn.AdaptiveMaxPool3d``, ``nn.AdaptiveAvgPool1d``, + ``nn.AdaptiveAvgPool2d``, ``nn.AdaptiveAvgPool3d``. + - BatchNorms: ``nn.BatchNorm1d``, ``nn.BatchNorm2d``, + ``nn.BatchNorm3d``, ``nn.GroupNorm``, ``nn.InstanceNorm1d``, + ``InstanceNorm2d``, ``InstanceNorm3d``, ``nn.LayerNorm``. + - Linear: ``nn.Linear``. + - Deconvolution: ``nn.ConvTranspose2d``. + - Upsample: ``nn.Upsample``. + + Args: + model (nn.Module): The model for complexity calculation. + input_shape (tuple): Input shape used for calculation. + print_per_layer_stat (bool): Whether to print complexity information + for each layer in a model. Default: True. + as_strings (bool): Output FLOPs and params counts in a string form. + Default: True. + input_constructor (None | callable): If specified, it takes a callable + method that generates input. otherwise, it will generate a random + tensor with input shape to calculate FLOPs. Default: None. + flush (bool): same as that in :func:`print`. Default: False. + ost (stream): same as ``file`` param in :func:`print`. + Default: sys.stdout. + + Returns: + tuple[float | str]: If ``as_strings`` is set to True, it will return + FLOPs and parameter counts in a string format. otherwise, it will + return those in a float number format. + """ + assert type(input_shape) is tuple + assert len(input_shape) >= 1 + assert isinstance(model, nn.Module) + flops_model = add_flops_counting_methods(model) + flops_model.eval() + flops_model.start_flops_count() + if input_constructor: + input = input_constructor(input_shape) + _ = flops_model(**input) + else: + try: + batch = torch.ones(()).new_empty( + (1, *input_shape), + dtype=next(flops_model.parameters()).dtype, + device=next(flops_model.parameters()).device) + except StopIteration: + # Avoid StopIteration for models which have no parameters, + # like `nn.Relu()`, `nn.AvgPool2d`, etc. + batch = torch.ones(()).new_empty((1, *input_shape)) + + _ = flops_model(batch) + + flops_count, params_count = flops_model.compute_average_flops_cost() + if print_per_layer_stat: + print_model_with_flops( + flops_model, flops_count, params_count, ost=ost, flush=flush) + flops_model.stop_flops_count() + + if as_strings: + return flops_to_string(flops_count), params_to_string(params_count) + + return flops_count, params_count + + +def flops_to_string(flops: float, + units: Optional[str] = 'GFLOPs', + precision: int = 2) -> str: + """Convert FLOPs number into a string. + + Note that Here we take a multiply-add counts as one FLOP. + + Args: + flops (float): FLOPs number to be converted. + units (str | None): Converted FLOPs units. Options are None, 'GFLOPs', + 'MFLOPs', 'KFLOPs', 'FLOPs'. If set to None, it will automatically + choose the most suitable unit for FLOPs. Default: 'GFLOPs'. + precision (int): Digit number after the decimal point. Default: 2. + + Returns: + str: The converted FLOPs number with units. + + Examples: + >>> flops_to_string(1e9) + '1.0 GFLOPs' + >>> flops_to_string(2e5, 'MFLOPs') + '0.2 MFLOPs' + >>> flops_to_string(3e-9, None) + '3e-09 FLOPs' + """ + if units is None: + if flops // 10**9 > 0: + return str(round(flops / 10.**9, precision)) + ' GFLOPs' + elif flops // 10**6 > 0: + return str(round(flops / 10.**6, precision)) + ' MFLOPs' + elif flops // 10**3 > 0: + return str(round(flops / 10.**3, precision)) + ' KFLOPs' + else: + return str(flops) + ' FLOPs' + else: + if units == 'GFLOPs': + return str(round(flops / 10.**9, precision)) + ' ' + units + elif units == 'MFLOPs': + return str(round(flops / 10.**6, precision)) + ' ' + units + elif units == 'KFLOPs': + return str(round(flops / 10.**3, precision)) + ' ' + units + else: + return str(flops) + ' FLOPs' + + +def params_to_string(num_params: float, + units: Optional[str] = None, + precision: int = 2) -> str: + """Convert parameter number into a string. + + Args: + num_params (float): Parameter number to be converted. + units (str | None): Converted FLOPs units. Options are None, 'M', + 'K' and ''. If set to None, it will automatically choose the most + suitable unit for Parameter number. Default: None. + precision (int): Digit number after the decimal point. Default: 2. + + Returns: + str: The converted parameter number with units. + + Examples: + >>> params_to_string(1e9) + '1000.0 M' + >>> params_to_string(2e5) + '200.0 k' + >>> params_to_string(3e-9) + '3e-09' + """ + if units is None: + if num_params // 10**6 > 0: + return str(round(num_params / 10**6, precision)) + ' M' + elif num_params // 10**3: + return str(round(num_params / 10**3, precision)) + ' k' + else: + return str(num_params) + else: + if units == 'M': + return str(round(num_params / 10.**6, precision)) + ' ' + units + elif units == 'K': + return str(round(num_params / 10.**3, precision)) + ' ' + units + else: + return str(num_params) + + +def print_model_with_flops(model: nn.Module, + total_flops: float, + total_params: float, + units: Optional[str] = 'GFLOPs', + precision: int = 3, + ost: TextIO = sys.stdout, + flush: bool = False) -> None: + """Print a model with FLOPs for each layer. + + Args: + model (nn.Module): The model to be printed. + total_flops (float): Total FLOPs of the model. + total_params (float): Total parameter counts of the model. + units (str | None): Converted FLOPs units. Default: 'GFLOPs'. + precision (int): Digit number after the decimal point. Default: 3. + ost (stream): same as `file` param in :func:`print`. + Default: sys.stdout. + flush (bool): same as that in :func:`print`. Default: False. + + Example: + >>> class ExampleModel(nn.Module): + + >>> def __init__(self): + >>> super().__init__() + >>> self.conv1 = nn.Conv2d(3, 8, 3) + >>> self.conv2 = nn.Conv2d(8, 256, 3) + >>> self.conv3 = nn.Conv2d(256, 8, 3) + >>> self.avg_pool = nn.AdaptiveAvgPool2d((1, 1)) + >>> self.flatten = nn.Flatten() + >>> self.fc = nn.Linear(8, 1) + + >>> def forward(self, x): + >>> x = self.conv1(x) + >>> x = self.conv2(x) + >>> x = self.conv3(x) + >>> x = self.avg_pool(x) + >>> x = self.flatten(x) + >>> x = self.fc(x) + >>> return x + + >>> model = ExampleModel() + >>> x = (3, 16, 16) + to print the complexity information state for each layer, you can use + >>> get_model_complexity_info(model, x) + or directly use + >>> print_model_with_flops(model, 4579784.0, 37361) + ExampleModel( + 0.037 M, 100.000% Params, 0.005 GFLOPs, 100.000% FLOPs, + (conv1): Conv2d(0.0 M, 0.600% Params, 0.0 GFLOPs, 0.959% FLOPs, 3, 8, kernel_size=(3, 3), stride=(1, 1)) # noqa: E501 + (conv2): Conv2d(0.019 M, 50.020% Params, 0.003 GFLOPs, 58.760% FLOPs, 8, 256, kernel_size=(3, 3), stride=(1, 1)) + (conv3): Conv2d(0.018 M, 49.356% Params, 0.002 GFLOPs, 40.264% FLOPs, 256, 8, kernel_size=(3, 3), stride=(1, 1)) + (avg_pool): AdaptiveAvgPool2d(0.0 M, 0.000% Params, 0.0 GFLOPs, 0.017% FLOPs, output_size=(1, 1)) + (flatten): Flatten(0.0 M, 0.000% Params, 0.0 GFLOPs, 0.000% FLOPs, ) + (fc): Linear(0.0 M, 0.024% Params, 0.0 GFLOPs, 0.000% FLOPs, in_features=8, out_features=1, bias=True) + ) + """ + + def accumulate_params(self): + if is_supported_instance(self): + return self.__params__ + else: + sum = 0 + for m in self.children(): + sum += m.accumulate_params() + return sum + + def accumulate_flops(self): + if is_supported_instance(self): + return self.__flops__ / model.__batch_counter__ + else: + sum = 0 + for m in self.children(): + sum += m.accumulate_flops() + return sum + + def flops_repr(self): + accumulated_num_params = self.accumulate_params() + accumulated_flops_cost = self.accumulate_flops() + return ', '.join([ + params_to_string( + accumulated_num_params, units='M', precision=precision), + f'{accumulated_num_params / total_params:.3%} Params', + flops_to_string( + accumulated_flops_cost, units=units, precision=precision), + f'{accumulated_flops_cost / total_flops:.3%} FLOPs', + self.original_extra_repr() + ]) + + def add_extra_repr(m): + m.accumulate_flops = accumulate_flops.__get__(m) + m.accumulate_params = accumulate_params.__get__(m) + flops_extra_repr = flops_repr.__get__(m) + if m.extra_repr != flops_extra_repr: + m.original_extra_repr = m.extra_repr + m.extra_repr = flops_extra_repr + assert m.extra_repr != m.original_extra_repr + + def del_extra_repr(m): + if hasattr(m, 'original_extra_repr'): + m.extra_repr = m.original_extra_repr + del m.original_extra_repr + if hasattr(m, 'accumulate_flops'): + del m.accumulate_flops + + model.apply(add_extra_repr) + print(model, file=ost, flush=flush) + model.apply(del_extra_repr) + + +def get_model_parameters_number(model: nn.Module) -> float: + """Calculate parameter number of a model. + + Args: + model (nn.module): The model for parameter number calculation. + + Returns: + float: Parameter number of the model. + """ + num_params = sum(p.numel() for p in model.parameters() if p.requires_grad) + return num_params + + +def add_flops_counting_methods(net_main_module: nn.Module) -> nn.Module: + # adding additional methods to the existing module object, + # this is done this way so that each function has access to self object + net_main_module.start_flops_count = start_flops_count.__get__( # type: ignore # noqa E501 + net_main_module) + net_main_module.stop_flops_count = stop_flops_count.__get__( # type: ignore # noqa E501 + net_main_module) + net_main_module.reset_flops_count = reset_flops_count.__get__( # type: ignore # noqa E501 + net_main_module) + net_main_module.compute_average_flops_cost = compute_average_flops_cost.__get__( # type: ignore # noqa E501 + net_main_module) + + net_main_module.reset_flops_count() + + return net_main_module + + +def compute_average_flops_cost(self) -> Tuple[float, float]: + """Compute average FLOPs cost. + + A method to compute average FLOPs cost, which will be available after + `add_flops_counting_methods()` is called on a desired net object. + + Returns: + float: Current mean flops consumption per image. + """ + batches_count = self.__batch_counter__ + flops_sum = 0 + for module in self.modules(): + if is_supported_instance(module): + flops_sum += module.__flops__ + params_sum = get_model_parameters_number(self) + return flops_sum / batches_count, params_sum + + +def start_flops_count(self) -> None: + """Activate the computation of mean flops consumption per image. + + A method to activate the computation of mean flops consumption per image. + which will be available after ``add_flops_counting_methods()`` is called on + a desired net object. It should be called before running the network. + """ + add_batch_counter_hook_function(self) + + def add_flops_counter_hook_function(module: nn.Module) -> None: + if is_supported_instance(module): + if hasattr(module, '__flops_handle__'): + return + + else: + handle = module.register_forward_hook( + get_modules_mapping()[type(module)]) + + module.__flops_handle__ = handle + + self.apply(partial(add_flops_counter_hook_function)) + + +def stop_flops_count(self) -> None: + """Stop computing the mean flops consumption per image. + + A method to stop computing the mean flops consumption per image, which will + be available after ``add_flops_counting_methods()`` is called on a desired + net object. It can be called to pause the computation whenever. + """ + remove_batch_counter_hook_function(self) + self.apply(remove_flops_counter_hook_function) + + +def reset_flops_count(self) -> None: + """Reset statistics computed so far. + + A method to Reset computed statistics, which will be available after + `add_flops_counting_methods()` is called on a desired net object. + """ + add_batch_counter_variables_or_reset(self) + self.apply(add_flops_counter_variable_or_reset) + + +# ---- Internal functions +def empty_flops_counter_hook(module: nn.Module, input: tuple, + output: Any) -> None: + module.__flops__ += 0 + + +def upsample_flops_counter_hook(module: nn.Module, input: tuple, + output: torch.Tensor) -> None: + output_size = output[0] + batch_size = output_size.shape[0] + output_elements_count = batch_size + for val in output_size.shape[1:]: + output_elements_count *= val + module.__flops__ += int(output_elements_count) + + +def relu_flops_counter_hook(module: nn.Module, input: tuple, + output: torch.Tensor) -> None: + active_elements_count = output.numel() + module.__flops__ += int(active_elements_count) + + +def linear_flops_counter_hook(module: nn.Module, input: tuple, + output: torch.Tensor) -> None: + output_last_dim = output.shape[ + -1] # pytorch checks dimensions, so here we don't care much + module.__flops__ += int(np.prod(input[0].shape) * output_last_dim) + + +def pool_flops_counter_hook(module: nn.Module, input: tuple, + output: torch.Tensor) -> None: + module.__flops__ += int(np.prod(input[0].shape)) + + +def norm_flops_counter_hook(module: nn.Module, input: tuple, + output: torch.Tensor) -> None: + batch_flops = np.prod(input[0].shape) + if (getattr(module, 'affine', False) + or getattr(module, 'elementwise_affine', False)): + batch_flops *= 2 + module.__flops__ += int(batch_flops) + + +def deconv_flops_counter_hook(conv_module: nn.Module, input: tuple, + output: torch.Tensor) -> None: + # Can have multiple inputs, getting the first one + batch_size = input[0].shape[0] + input_height, input_width = input[0].shape[2:] + + kernel_height, kernel_width = conv_module.kernel_size + in_channels = conv_module.in_channels + out_channels = conv_module.out_channels + groups = conv_module.groups + + filters_per_channel = out_channels // groups + conv_per_position_flops = ( + kernel_height * kernel_width * in_channels * filters_per_channel) + + active_elements_count = batch_size * input_height * input_width + overall_conv_flops = conv_per_position_flops * active_elements_count + bias_flops = 0 + if conv_module.bias is not None: + output_height, output_width = output.shape[2:] + bias_flops = out_channels * batch_size * output_height * output_width + overall_flops = overall_conv_flops + bias_flops + + conv_module.__flops__ += int(overall_flops) + + +def conv_flops_counter_hook(conv_module: nn.Module, input: tuple, + output: torch.Tensor) -> None: + # Can have multiple inputs, getting the first one + batch_size = input[0].shape[0] + output_dims = list(output.shape[2:]) + + kernel_dims = list(conv_module.kernel_size) + in_channels = conv_module.in_channels + out_channels = conv_module.out_channels + groups = conv_module.groups + + filters_per_channel = out_channels // groups + conv_per_position_flops = int( + np.prod(kernel_dims)) * in_channels * filters_per_channel + + active_elements_count = batch_size * int(np.prod(output_dims)) + + overall_conv_flops = conv_per_position_flops * active_elements_count + + bias_flops = 0 + + if conv_module.bias is not None: + + bias_flops = out_channels * active_elements_count + + overall_flops = overall_conv_flops + bias_flops + + conv_module.__flops__ += int(overall_flops) + + +def batch_counter_hook(module: nn.Module, input: tuple, output: Any) -> None: + batch_size = 1 + if len(input) > 0: + # Can have multiple inputs, getting the first one + batch_size = len(input[0]) + else: + warnings.warn('No positional inputs found for a module, ' + 'assuming batch size is 1.') + module.__batch_counter__ += batch_size + + +def add_batch_counter_variables_or_reset(module: nn.Module) -> None: + + module.__batch_counter__ = 0 + + +def add_batch_counter_hook_function(module: nn.Module) -> None: + if hasattr(module, '__batch_counter_handle__'): + return + + handle = module.register_forward_hook(batch_counter_hook) + module.__batch_counter_handle__ = handle + + +def remove_batch_counter_hook_function(module: nn.Module) -> None: + if hasattr(module, '__batch_counter_handle__'): + module.__batch_counter_handle__.remove() + del module.__batch_counter_handle__ + + +def add_flops_counter_variable_or_reset(module: nn.Module) -> None: + if is_supported_instance(module): + if hasattr(module, '__flops__') or hasattr(module, '__params__'): + warnings.warn('variables __flops__ or __params__ are already ' + 'defined for the module' + type(module).__name__ + + ' ptflops can affect your code!') + module.__flops__ = 0 + module.__params__ = get_model_parameters_number(module) + + +def is_supported_instance(module: nn.Module) -> bool: + if type(module) in get_modules_mapping(): + return True + return False + + +def remove_flops_counter_hook_function(module: nn.Module) -> None: + if is_supported_instance(module): + if hasattr(module, '__flops_handle__'): + module.__flops_handle__.remove() + del module.__flops_handle__ + + +def get_modules_mapping() -> Dict: + return { + # convolutions + nn.Conv1d: conv_flops_counter_hook, + nn.Conv2d: conv_flops_counter_hook, + Conv2d: conv_flops_counter_hook, + nn.Conv3d: conv_flops_counter_hook, + Conv3d: conv_flops_counter_hook, + # activations + nn.ReLU: relu_flops_counter_hook, + nn.PReLU: relu_flops_counter_hook, + nn.ELU: relu_flops_counter_hook, + nn.LeakyReLU: relu_flops_counter_hook, + nn.ReLU6: relu_flops_counter_hook, + # poolings + nn.MaxPool1d: pool_flops_counter_hook, + nn.AvgPool1d: pool_flops_counter_hook, + nn.AvgPool2d: pool_flops_counter_hook, + nn.MaxPool2d: pool_flops_counter_hook, + MaxPool2d: pool_flops_counter_hook, + nn.MaxPool3d: pool_flops_counter_hook, + MaxPool3d: pool_flops_counter_hook, + nn.AvgPool3d: pool_flops_counter_hook, + nn.AdaptiveMaxPool1d: pool_flops_counter_hook, + nn.AdaptiveAvgPool1d: pool_flops_counter_hook, + nn.AdaptiveMaxPool2d: pool_flops_counter_hook, + nn.AdaptiveAvgPool2d: pool_flops_counter_hook, + nn.AdaptiveMaxPool3d: pool_flops_counter_hook, + nn.AdaptiveAvgPool3d: pool_flops_counter_hook, + # normalizations + nn.BatchNorm1d: norm_flops_counter_hook, + nn.BatchNorm2d: norm_flops_counter_hook, + nn.BatchNorm3d: norm_flops_counter_hook, + nn.GroupNorm: norm_flops_counter_hook, + nn.InstanceNorm1d: norm_flops_counter_hook, + nn.InstanceNorm2d: norm_flops_counter_hook, + nn.InstanceNorm3d: norm_flops_counter_hook, + nn.LayerNorm: norm_flops_counter_hook, + # FC + nn.Linear: linear_flops_counter_hook, + Linear: linear_flops_counter_hook, + # Upscale + nn.Upsample: upsample_flops_counter_hook, + # Deconvolution + nn.ConvTranspose2d: deconv_flops_counter_hook, + ConvTranspose2d: deconv_flops_counter_hook, + } diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/utils/fuse_conv_bn.py b/FoodSeg103/demo/mmcv/mmcv/cnn/utils/fuse_conv_bn.py new file mode 100644 index 0000000000000000000000000000000000000000..6ccaab3bf1eb3ce615bad910d6dc45a467bb1fe4 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/utils/fuse_conv_bn.py @@ -0,0 +1,59 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn + + +def _fuse_conv_bn(conv: nn.Module, bn: nn.Module) -> nn.Module: + """Fuse conv and bn into one module. + + Args: + conv (nn.Module): Conv to be fused. + bn (nn.Module): BN to be fused. + + Returns: + nn.Module: Fused module. + """ + conv_w = conv.weight + conv_b = conv.bias if conv.bias is not None else torch.zeros_like( + bn.running_mean) + + factor = bn.weight / torch.sqrt(bn.running_var + bn.eps) + conv.weight = nn.Parameter(conv_w * + factor.reshape([conv.out_channels, 1, 1, 1])) + conv.bias = nn.Parameter((conv_b - bn.running_mean) * factor + bn.bias) + return conv + + +def fuse_conv_bn(module: nn.Module) -> nn.Module: + """Recursively fuse conv and bn in a module. + + During inference, the functionary of batch norm layers is turned off + but only the mean and var alone channels are used, which exposes the + chance to fuse it with the preceding conv layers to save computations and + simplify network structures. + + Args: + module (nn.Module): Module to be fused. + + Returns: + nn.Module: Fused module. + """ + last_conv = None + last_conv_name = None + + for name, child in module.named_children(): + if isinstance(child, + (nn.modules.batchnorm._BatchNorm, nn.SyncBatchNorm)): + if last_conv is None: # only fuse BN that is after Conv + continue + fused_conv = _fuse_conv_bn(last_conv, child) + module._modules[last_conv_name] = fused_conv + # To reduce changes, set BN as Identity instead of deleting it. + module._modules[name] = nn.Identity() + last_conv = None + elif isinstance(child, nn.Conv2d): + last_conv = child + last_conv_name = name + else: + fuse_conv_bn(child) + return module diff --git a/FoodSeg103/demo/mmcv/mmcv/cnn/vgg.py b/FoodSeg103/demo/mmcv/mmcv/cnn/vgg.py new file mode 100644 index 0000000000000000000000000000000000000000..a7f3116062c3943bb85fd7540b23a31918622a24 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/cnn/vgg.py @@ -0,0 +1,176 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +from typing import List, Optional, Sequence, Tuple, Union + +import torch.nn as nn +from mmengine.model import constant_init, kaiming_init, normal_init +from mmengine.runner import load_checkpoint +from torch import Tensor + + +def conv3x3(in_planes: int, out_planes: int, dilation: int = 1) -> nn.Module: + """3x3 convolution with padding.""" + return nn.Conv2d( + in_planes, + out_planes, + kernel_size=3, + padding=dilation, + dilation=dilation) + + +def make_vgg_layer(inplanes: int, + planes: int, + num_blocks: int, + dilation: int = 1, + with_bn: bool = False, + ceil_mode: bool = False) -> List[nn.Module]: + layers = [] + for _ in range(num_blocks): + layers.append(conv3x3(inplanes, planes, dilation)) + if with_bn: + layers.append(nn.BatchNorm2d(planes)) + layers.append(nn.ReLU(inplace=True)) + inplanes = planes + layers.append(nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=ceil_mode)) + + return layers + + +class VGG(nn.Module): + """VGG backbone. + + Args: + depth (int): Depth of vgg, from {11, 13, 16, 19}. + with_bn (bool): Use BatchNorm or not. + num_classes (int): number of classes for classification. + num_stages (int): VGG stages, normally 5. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + frozen_stages (int): Stages to be frozen (all param fixed). -1 means + not freezing any parameters. + bn_eval (bool): Whether to set BN layers as eval mode, namely, freeze + running stats (mean and var). + bn_frozen (bool): Whether to freeze weight and bias of BN layers. + """ + + arch_settings = { + 11: (1, 1, 2, 2, 2), + 13: (2, 2, 2, 2, 2), + 16: (2, 2, 3, 3, 3), + 19: (2, 2, 4, 4, 4) + } + + def __init__(self, + depth: int, + with_bn: bool = False, + num_classes: int = -1, + num_stages: int = 5, + dilations: Sequence[int] = (1, 1, 1, 1, 1), + out_indices: Sequence[int] = (0, 1, 2, 3, 4), + frozen_stages: int = -1, + bn_eval: bool = True, + bn_frozen: bool = False, + ceil_mode: bool = False, + with_last_pool: bool = True): + super().__init__() + if depth not in self.arch_settings: + raise KeyError(f'invalid depth {depth} for vgg') + assert num_stages >= 1 and num_stages <= 5 + stage_blocks = self.arch_settings[depth] + self.stage_blocks = stage_blocks[:num_stages] + assert len(dilations) == num_stages + assert max(out_indices) <= num_stages + + self.num_classes = num_classes + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.bn_eval = bn_eval + self.bn_frozen = bn_frozen + + self.inplanes = 3 + start_idx = 0 + vgg_layers = [] + self.range_sub_modules = [] + for i, num_blocks in enumerate(self.stage_blocks): + num_modules = num_blocks * (2 + with_bn) + 1 + end_idx = start_idx + num_modules + dilation = dilations[i] + planes = 64 * 2**i if i < 4 else 512 + vgg_layer = make_vgg_layer( + self.inplanes, + planes, + num_blocks, + dilation=dilation, + with_bn=with_bn, + ceil_mode=ceil_mode) + vgg_layers.extend(vgg_layer) + self.inplanes = planes + self.range_sub_modules.append([start_idx, end_idx]) + start_idx = end_idx + if not with_last_pool: + vgg_layers.pop(-1) + self.range_sub_modules[-1][1] -= 1 + self.module_name = 'features' + self.add_module(self.module_name, nn.Sequential(*vgg_layers)) + + if self.num_classes > 0: + self.classifier = nn.Sequential( + nn.Linear(512 * 7 * 7, 4096), + nn.ReLU(True), + nn.Dropout(), + nn.Linear(4096, 4096), + nn.ReLU(True), + nn.Dropout(), + nn.Linear(4096, num_classes), + ) + + def init_weights(self, pretrained: Optional[str] = None) -> 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) + elif isinstance(m, nn.Linear): + normal_init(m, std=0.01) + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x: Tensor) -> Union[Tensor, Tuple[Tensor, ...]]: + outs = [] + vgg_layers = getattr(self, self.module_name) + for i in range(len(self.stage_blocks)): + for j in range(*self.range_sub_modules[i]): + vgg_layer = vgg_layers[j] + x = vgg_layer(x) + if i in self.out_indices: + outs.append(x) + if self.num_classes > 0: + x = x.view(x.size(0), -1) + x = self.classifier(x) + outs.append(x) + if len(outs) == 1: + return outs[0] + else: + return tuple(outs) + + def train(self, mode: bool = True) -> None: + super().train(mode) + if self.bn_eval: + for m in self.modules(): + if isinstance(m, nn.BatchNorm2d): + m.eval() + if self.bn_frozen: + for params in m.parameters(): + params.requires_grad = False + vgg_layers = getattr(self, self.module_name) + if mode and self.frozen_stages >= 0: + for i in range(self.frozen_stages): + for j in range(*self.range_sub_modules[i]): + mod = vgg_layers[j] + mod.eval() + for param in mod.parameters(): + param.requires_grad = False diff --git a/FoodSeg103/demo/mmcv/mmcv/image/__init__.py b/FoodSeg103/demo/mmcv/mmcv/image/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..92ecec4046a6f5ee25b4ea07215ed7c7c810dcfa --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/image/__init__.py @@ -0,0 +1,29 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .colorspace import (bgr2gray, bgr2hls, bgr2hsv, bgr2rgb, bgr2ycbcr, + gray2bgr, gray2rgb, hls2bgr, hsv2bgr, imconvert, + rgb2bgr, rgb2gray, rgb2ycbcr, ycbcr2bgr, ycbcr2rgb) +from .geometric import (cutout, imcrop, imflip, imflip_, impad, + impad_to_multiple, imrescale, imresize, imresize_like, + imresize_to_multiple, imrotate, imshear, imtranslate, + rescale_size) +from .io import imfrombytes, imread, imwrite, supported_backends, use_backend +from .misc import tensor2imgs +from .photometric import (adjust_brightness, adjust_color, adjust_contrast, + adjust_hue, adjust_lighting, adjust_sharpness, + auto_contrast, clahe, imdenormalize, imequalize, + iminvert, imnormalize, imnormalize_, lut_transform, + posterize, solarize) + +__all__ = [ + 'bgr2gray', 'bgr2hls', 'bgr2hsv', 'bgr2rgb', 'gray2bgr', 'gray2rgb', + 'hls2bgr', 'hsv2bgr', 'imconvert', 'rgb2bgr', 'rgb2gray', 'imrescale', + 'imresize', 'imresize_like', 'imresize_to_multiple', 'rescale_size', + 'imcrop', 'imflip', 'imflip_', 'impad', 'impad_to_multiple', 'imrotate', + 'imfrombytes', 'imread', 'imwrite', 'supported_backends', 'use_backend', + 'imdenormalize', 'imnormalize', 'imnormalize_', 'iminvert', 'posterize', + 'solarize', 'rgb2ycbcr', 'bgr2ycbcr', 'ycbcr2rgb', 'ycbcr2bgr', + 'tensor2imgs', 'imshear', 'imtranslate', 'adjust_color', 'imequalize', + 'adjust_brightness', 'adjust_contrast', 'lut_transform', 'clahe', + 'adjust_sharpness', 'auto_contrast', 'cutout', 'adjust_lighting', + 'adjust_hue' +] diff --git a/FoodSeg103/demo/mmcv/mmcv/image/colorspace.py b/FoodSeg103/demo/mmcv/mmcv/image/colorspace.py new file mode 100644 index 0000000000000000000000000000000000000000..08f9952408c8e0bb38b17c10e2089e900ed418c2 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/image/colorspace.py @@ -0,0 +1,309 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Callable, Union + +import cv2 +import numpy as np + + +def imconvert(img: np.ndarray, src: str, dst: str) -> np.ndarray: + """Convert an image from the src colorspace to dst colorspace. + + Args: + img (ndarray): The input image. + src (str): The source colorspace, e.g., 'rgb', 'hsv'. + dst (str): The destination colorspace, e.g., 'rgb', 'hsv'. + + Returns: + ndarray: The converted image. + """ + code = getattr(cv2, f'COLOR_{src.upper()}2{dst.upper()}') + out_img = cv2.cvtColor(img, code) + return out_img + + +def bgr2gray(img: np.ndarray, keepdim: bool = False) -> np.ndarray: + """Convert a BGR image to grayscale image. + + Args: + img (ndarray): The input image. + keepdim (bool): If False (by default), then return the grayscale image + with 2 dims, otherwise 3 dims. + + Returns: + ndarray: The converted grayscale image. + """ + out_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + if keepdim: + out_img = out_img[..., None] + return out_img + + +def rgb2gray(img: np.ndarray, keepdim: bool = False) -> np.ndarray: + """Convert a RGB image to grayscale image. + + Args: + img (ndarray): The input image. + keepdim (bool): If False (by default), then return the grayscale image + with 2 dims, otherwise 3 dims. + + Returns: + ndarray: The converted grayscale image. + """ + out_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) + if keepdim: + out_img = out_img[..., None] + return out_img + + +def gray2bgr(img: np.ndarray) -> np.ndarray: + """Convert a grayscale image to BGR image. + + Args: + img (ndarray): The input image. + + Returns: + ndarray: The converted BGR image. + """ + img = img[..., None] if img.ndim == 2 else img + out_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) + return out_img + + +def gray2rgb(img: np.ndarray) -> np.ndarray: + """Convert a grayscale image to RGB image. + + Args: + img (ndarray): The input image. + + Returns: + ndarray: The converted RGB image. + """ + img = img[..., None] if img.ndim == 2 else img + out_img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) + return out_img + + +def _convert_input_type_range(img: np.ndarray) -> np.ndarray: + """Convert the type and range of the input image. + + It converts the input image to np.float32 type and range of [0, 1]. + It is mainly used for pre-processing the input image in colorspace + conversion functions such as rgb2ycbcr and ycbcr2rgb. + + Args: + img (ndarray): The input image. It accepts: + 1. np.uint8 type with range [0, 255]; + 2. np.float32 type with range [0, 1]. + + Returns: + (ndarray): The converted image with type of np.float32 and range of + [0, 1]. + """ + img_type = img.dtype + img = img.astype(np.float32) + if img_type == np.float32: + pass + elif img_type == np.uint8: + img /= 255. + else: + raise TypeError('The img type should be np.float32 or np.uint8, ' + f'but got {img_type}') + return img + + +def _convert_output_type_range( + img: np.ndarray, dst_type: Union[np.uint8, np.float32]) -> np.ndarray: + """Convert the type and range of the image according to dst_type. + + It converts the image to desired type and range. If `dst_type` is np.uint8, + images will be converted to np.uint8 type with range [0, 255]. If + `dst_type` is np.float32, it converts the image to np.float32 type with + range [0, 1]. + It is mainly used for post-processing images in colorspace conversion + functions such as rgb2ycbcr and ycbcr2rgb. + + Args: + img (ndarray): The image to be converted with np.float32 type and + range [0, 255]. + dst_type (np.uint8 | np.float32): If dst_type is np.uint8, it + converts the image to np.uint8 type with range [0, 255]. If + dst_type is np.float32, it converts the image to np.float32 type + with range [0, 1]. + + Returns: + (ndarray): The converted image with desired type and range. + """ + if dst_type not in (np.uint8, np.float32): + raise TypeError('The dst_type should be np.float32 or np.uint8, ' + f'but got {dst_type}') + if dst_type == np.uint8: + img = img.round() + else: + img /= 255. + return img.astype(dst_type) + + +def rgb2ycbcr(img: np.ndarray, y_only: bool = False) -> np.ndarray: + """Convert a RGB image to YCbCr image. + + This function produces the same results as Matlab's `rgb2ycbcr` function. + It implements the ITU-R BT.601 conversion for standard-definition + television. See more details in + https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.601_conversion. + + It differs from a similar function in cv2.cvtColor: `RGB <-> YCrCb`. + In OpenCV, it implements a JPEG conversion. See more details in + https://en.wikipedia.org/wiki/YCbCr#JPEG_conversion. + + Args: + img (ndarray): The input image. It accepts: + 1. np.uint8 type with range [0, 255]; + 2. np.float32 type with range [0, 1]. + y_only (bool): Whether to only return Y channel. Default: False. + + Returns: + ndarray: The converted YCbCr image. The output image has the same type + and range as input image. + """ + img_type = img.dtype + img = _convert_input_type_range(img) + if y_only: + out_img = np.dot(img, [65.481, 128.553, 24.966]) + 16.0 + else: + out_img = np.matmul( + img, [[65.481, -37.797, 112.0], [128.553, -74.203, -93.786], + [24.966, 112.0, -18.214]]) + [16, 128, 128] + out_img = _convert_output_type_range(out_img, img_type) + return out_img + + +def bgr2ycbcr(img: np.ndarray, y_only: bool = False) -> np.ndarray: + """Convert a BGR image to YCbCr image. + + The bgr version of rgb2ycbcr. + It implements the ITU-R BT.601 conversion for standard-definition + television. See more details in + https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.601_conversion. + + It differs from a similar function in cv2.cvtColor: `BGR <-> YCrCb`. + In OpenCV, it implements a JPEG conversion. See more details in + https://en.wikipedia.org/wiki/YCbCr#JPEG_conversion. + + Args: + img (ndarray): The input image. It accepts: + 1. np.uint8 type with range [0, 255]; + 2. np.float32 type with range [0, 1]. + y_only (bool): Whether to only return Y channel. Default: False. + + Returns: + ndarray: The converted YCbCr image. The output image has the same type + and range as input image. + """ + img_type = img.dtype + img = _convert_input_type_range(img) + if y_only: + out_img = np.dot(img, [24.966, 128.553, 65.481]) + 16.0 + else: + out_img = np.matmul( + img, [[24.966, 112.0, -18.214], [128.553, -74.203, -93.786], + [65.481, -37.797, 112.0]]) + [16, 128, 128] + out_img = _convert_output_type_range(out_img, img_type) + return out_img + + +def ycbcr2rgb(img: np.ndarray) -> np.ndarray: + """Convert a YCbCr image to RGB image. + + This function produces the same results as Matlab's ycbcr2rgb function. + It implements the ITU-R BT.601 conversion for standard-definition + television. See more details in + https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.601_conversion. + + It differs from a similar function in cv2.cvtColor: `YCrCb <-> RGB`. + In OpenCV, it implements a JPEG conversion. See more details in + https://en.wikipedia.org/wiki/YCbCr#JPEG_conversion. + + Args: + img (ndarray): The input image. It accepts: + 1. np.uint8 type with range [0, 255]; + 2. np.float32 type with range [0, 1]. + + Returns: + ndarray: The converted RGB image. The output image has the same type + and range as input image. + """ + img_type = img.dtype + img = _convert_input_type_range(img) * 255 + out_img = np.matmul(img, [[0.00456621, 0.00456621, 0.00456621], + [0, -0.00153632, 0.00791071], + [0.00625893, -0.00318811, 0]]) * 255.0 + [ + -222.921, 135.576, -276.836 + ] + out_img = _convert_output_type_range(out_img, img_type) + return out_img + + +def ycbcr2bgr(img: np.ndarray) -> np.ndarray: + """Convert a YCbCr image to BGR image. + + The bgr version of ycbcr2rgb. + It implements the ITU-R BT.601 conversion for standard-definition + television. See more details in + https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.601_conversion. + + It differs from a similar function in cv2.cvtColor: `YCrCb <-> BGR`. + In OpenCV, it implements a JPEG conversion. See more details in + https://en.wikipedia.org/wiki/YCbCr#JPEG_conversion. + + Args: + img (ndarray): The input image. It accepts: + 1. np.uint8 type with range [0, 255]; + 2. np.float32 type with range [0, 1]. + + Returns: + ndarray: The converted BGR image. The output image has the same type + and range as input image. + """ + img_type = img.dtype + img = _convert_input_type_range(img) * 255 + out_img = np.matmul(img, [[0.00456621, 0.00456621, 0.00456621], + [0.00791071, -0.00153632, 0], + [0, -0.00318811, 0.00625893]]) * 255.0 + [ + -276.836, 135.576, -222.921 + ] + out_img = _convert_output_type_range(out_img, img_type) + return out_img + + +def convert_color_factory(src: str, dst: str) -> Callable: + + code = getattr(cv2, f'COLOR_{src.upper()}2{dst.upper()}') + + def convert_color(img: np.ndarray) -> np.ndarray: + out_img = cv2.cvtColor(img, code) + return out_img + + convert_color.__doc__ = f"""Convert a {src.upper()} image to {dst.upper()} + image. + + Args: + img (ndarray or str): The input image. + + Returns: + ndarray: The converted {dst.upper()} image. + """ + + return convert_color + + +bgr2rgb = convert_color_factory('bgr', 'rgb') + +rgb2bgr = convert_color_factory('rgb', 'bgr') + +bgr2hsv = convert_color_factory('bgr', 'hsv') + +hsv2bgr = convert_color_factory('hsv', 'bgr') + +bgr2hls = convert_color_factory('bgr', 'hls') + +hls2bgr = convert_color_factory('hls', 'bgr') diff --git a/FoodSeg103/demo/mmcv/mmcv/image/geometric.py b/FoodSeg103/demo/mmcv/mmcv/image/geometric.py new file mode 100644 index 0000000000000000000000000000000000000000..d62ebff35caf99858c9d73566fc1db0eb3831b2c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/image/geometric.py @@ -0,0 +1,788 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numbers +from typing import List, Optional, Tuple, Union, no_type_check + +import cv2 +import numpy as np +from mmengine.utils import to_2tuple + +from .io import imread_backend + +try: + from PIL import Image +except ImportError: + Image = None + + +def _scale_size( + size: Tuple[int, int], + scale: Union[float, int, Tuple[float, float], Tuple[int, int]], +) -> Tuple[int, int]: + """Rescale a size by a ratio. + + Args: + size (tuple[int]): (w, h). + scale (float | int | tuple(float) | tuple(int)): Scaling factor. + + Returns: + tuple[int]: scaled size. + """ + if isinstance(scale, (float, int)): + scale = (scale, scale) + w, h = size + return int(w * float(scale[0]) + 0.5), int(h * float(scale[1]) + 0.5) + + +cv2_interp_codes = { + 'nearest': cv2.INTER_NEAREST, + 'bilinear': cv2.INTER_LINEAR, + 'bicubic': cv2.INTER_CUBIC, + 'area': cv2.INTER_AREA, + 'lanczos': cv2.INTER_LANCZOS4 +} + +cv2_border_modes = { + 'constant': cv2.BORDER_CONSTANT, + 'replicate': cv2.BORDER_REPLICATE, + 'reflect': cv2.BORDER_REFLECT, + 'wrap': cv2.BORDER_WRAP, + 'reflect_101': cv2.BORDER_REFLECT_101, + 'transparent': cv2.BORDER_TRANSPARENT, + 'isolated': cv2.BORDER_ISOLATED +} + +# Pillow >=v9.1.0 use a slightly different naming scheme for filters. +# Set pillow_interp_codes according to the naming scheme used. +if Image is not None: + if hasattr(Image, 'Resampling'): + pillow_interp_codes = { + 'nearest': Image.Resampling.NEAREST, + 'bilinear': Image.Resampling.BILINEAR, + 'bicubic': Image.Resampling.BICUBIC, + 'box': Image.Resampling.BOX, + 'lanczos': Image.Resampling.LANCZOS, + 'hamming': Image.Resampling.HAMMING + } + else: + pillow_interp_codes = { + 'nearest': Image.NEAREST, + 'bilinear': Image.BILINEAR, + 'bicubic': Image.BICUBIC, + 'box': Image.BOX, + 'lanczos': Image.LANCZOS, + 'hamming': Image.HAMMING + } + + +def imresize( + img: np.ndarray, + size: Tuple[int, int], + return_scale: bool = False, + interpolation: str = 'bilinear', + out: Optional[np.ndarray] = None, + backend: Optional[str] = None +) -> Union[Tuple[np.ndarray, float, float], np.ndarray]: + """Resize image to a given size. + + Args: + img (ndarray): The input image. + size (tuple[int]): Target size (w, h). + return_scale (bool): Whether to return `w_scale` and `h_scale`. + interpolation (str): Interpolation method, accepted values are + "nearest", "bilinear", "bicubic", "area", "lanczos" for 'cv2' + backend, "nearest", "bilinear" for 'pillow' backend. + out (ndarray): The output destination. + backend (str | None): The image resize backend type. Options are `cv2`, + `pillow`, `None`. If backend is None, the global imread_backend + specified by ``mmcv.use_backend()`` will be used. Default: None. + + Returns: + tuple | ndarray: (`resized_img`, `w_scale`, `h_scale`) or + `resized_img`. + """ + h, w = img.shape[:2] + if backend is None: + backend = imread_backend + if backend not in ['cv2', 'pillow']: + raise ValueError(f'backend: {backend} is not supported for resize.' + f"Supported backends are 'cv2', 'pillow'") + + if backend == 'pillow': + assert img.dtype == np.uint8, 'Pillow backend only support uint8 type' + pil_image = Image.fromarray(img) + pil_image = pil_image.resize(size, pillow_interp_codes[interpolation]) + resized_img = np.array(pil_image) + else: + resized_img = cv2.resize( + img, size, dst=out, interpolation=cv2_interp_codes[interpolation]) + if not return_scale: + return resized_img + else: + w_scale = size[0] / w + h_scale = size[1] / h + return resized_img, w_scale, h_scale + + +@no_type_check +def imresize_to_multiple( + img: np.ndarray, + divisor: Union[int, Tuple[int, int]], + size: Union[int, Tuple[int, int], None] = None, + scale_factor: Union[float, int, Tuple[float, float], Tuple[int, int], + None] = None, + keep_ratio: bool = False, + return_scale: bool = False, + interpolation: str = 'bilinear', + out: Optional[np.ndarray] = None, + backend: Optional[str] = None +) -> Union[Tuple[np.ndarray, float, float], np.ndarray]: + """Resize image according to a given size or scale factor and then rounds + up the the resized or rescaled image size to the nearest value that can be + divided by the divisor. + + Args: + img (ndarray): The input image. + divisor (int | tuple): Resized image size will be a multiple of + divisor. If divisor is a tuple, divisor should be + (w_divisor, h_divisor). + size (None | int | tuple[int]): Target size (w, h). Default: None. + scale_factor (None | float | int | tuple[float] | tuple[int]): + Multiplier for spatial size. Should match input size if it is a + tuple and the 2D style is (w_scale_factor, h_scale_factor). + Default: None. + keep_ratio (bool): Whether to keep the aspect ratio when resizing the + image. Default: False. + return_scale (bool): Whether to return `w_scale` and `h_scale`. + interpolation (str): Interpolation method, accepted values are + "nearest", "bilinear", "bicubic", "area", "lanczos" for 'cv2' + backend, "nearest", "bilinear" for 'pillow' backend. + out (ndarray): The output destination. + backend (str | None): The image resize backend type. Options are `cv2`, + `pillow`, `None`. If backend is None, the global imread_backend + specified by ``mmcv.use_backend()`` will be used. Default: None. + + Returns: + tuple | ndarray: (`resized_img`, `w_scale`, `h_scale`) or + `resized_img`. + """ + h, w = img.shape[:2] + if size is not None and scale_factor is not None: + raise ValueError('only one of size or scale_factor should be defined') + elif size is None and scale_factor is None: + raise ValueError('one of size or scale_factor should be defined') + elif size is not None: + size = to_2tuple(size) + if keep_ratio: + size = rescale_size((w, h), size, return_scale=False) + else: + size = _scale_size((w, h), scale_factor) + + divisor = to_2tuple(divisor) + size = tuple(int(np.ceil(s / d)) * d for s, d in zip(size, divisor)) + resized_img, w_scale, h_scale = imresize( + img, + size, + return_scale=True, + interpolation=interpolation, + out=out, + backend=backend) + if return_scale: + return resized_img, w_scale, h_scale + else: + return resized_img + + +def imresize_like( + img: np.ndarray, + dst_img: np.ndarray, + return_scale: bool = False, + interpolation: str = 'bilinear', + backend: Optional[str] = None +) -> Union[Tuple[np.ndarray, float, float], np.ndarray]: + """Resize image to the same size of a given image. + + Args: + img (ndarray): The input image. + dst_img (ndarray): The target image. + return_scale (bool): Whether to return `w_scale` and `h_scale`. + interpolation (str): Same as :func:`resize`. + backend (str | None): Same as :func:`resize`. + + Returns: + tuple or ndarray: (`resized_img`, `w_scale`, `h_scale`) or + `resized_img`. + """ + h, w = dst_img.shape[:2] + return imresize(img, (w, h), return_scale, interpolation, backend=backend) + + +def rescale_size(old_size: tuple, + scale: Union[float, int, Tuple[int, int]], + return_scale: bool = False) -> tuple: + """Calculate the new size to be rescaled to. + + Args: + old_size (tuple[int]): The old size (w, h) of image. + scale (float | int | tuple[int]): The scaling factor or maximum size. + If it is a float number or an integer, then the image will be + rescaled by this factor, else if it is a tuple of 2 integers, then + the image will be rescaled as large as possible within the scale. + return_scale (bool): Whether to return the scaling factor besides the + rescaled image size. + + Returns: + tuple[int]: The new rescaled image size. + """ + w, h = old_size + if isinstance(scale, (float, int)): + if scale <= 0: + raise ValueError(f'Invalid scale {scale}, must be positive.') + scale_factor = scale + elif isinstance(scale, tuple): + max_long_edge = max(scale) + max_short_edge = min(scale) + scale_factor = min(max_long_edge / max(h, w), + max_short_edge / min(h, w)) + else: + raise TypeError( + f'Scale must be a number or tuple of int, but got {type(scale)}') + + new_size = _scale_size((w, h), scale_factor) + + if return_scale: + return new_size, scale_factor + else: + return new_size + + +def imrescale( + img: np.ndarray, + scale: Union[float, int, Tuple[int, int]], + return_scale: bool = False, + interpolation: str = 'bilinear', + backend: Optional[str] = None +) -> Union[np.ndarray, Tuple[np.ndarray, float]]: + """Resize image while keeping the aspect ratio. + + Args: + img (ndarray): The input image. + scale (float | int | tuple[int]): The scaling factor or maximum size. + If it is a float number or an integer, then the image will be + rescaled by this factor, else if it is a tuple of 2 integers, then + the image will be rescaled as large as possible within the scale. + return_scale (bool): Whether to return the scaling factor besides the + rescaled image. + interpolation (str): Same as :func:`resize`. + backend (str | None): Same as :func:`resize`. + + Returns: + ndarray: The rescaled image. + """ + h, w = img.shape[:2] + new_size, scale_factor = rescale_size((w, h), scale, return_scale=True) + rescaled_img = imresize( + img, new_size, interpolation=interpolation, backend=backend) + if return_scale: + return rescaled_img, scale_factor + else: + return rescaled_img + + +def imflip(img: np.ndarray, direction: str = 'horizontal') -> np.ndarray: + """Flip an image horizontally or vertically. + + Args: + img (ndarray): Image to be flipped. + direction (str): The flip direction, either "horizontal" or + "vertical" or "diagonal". + + Returns: + ndarray: The flipped image. + """ + assert direction in ['horizontal', 'vertical', 'diagonal'] + if direction == 'horizontal': + return np.flip(img, axis=1) + elif direction == 'vertical': + return np.flip(img, axis=0) + else: + return np.flip(img, axis=(0, 1)) + + +def imflip_(img: np.ndarray, direction: str = 'horizontal') -> np.ndarray: + """Inplace flip an image horizontally or vertically. + + Args: + img (ndarray): Image to be flipped. + direction (str): The flip direction, either "horizontal" or + "vertical" or "diagonal". + + Returns: + ndarray: The flipped image (inplace). + """ + assert direction in ['horizontal', 'vertical', 'diagonal'] + if direction == 'horizontal': + return cv2.flip(img, 1, img) + elif direction == 'vertical': + return cv2.flip(img, 0, img) + else: + return cv2.flip(img, -1, img) + + +def imrotate(img: np.ndarray, + angle: float, + center: Optional[Tuple[float, float]] = None, + scale: float = 1.0, + border_value: int = 0, + interpolation: str = 'bilinear', + auto_bound: bool = False, + border_mode: str = 'constant') -> np.ndarray: + """Rotate an image. + + Args: + img (np.ndarray): Image to be rotated. + angle (float): Rotation angle in degrees, positive values mean + clockwise rotation. + 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. + scale (float): Isotropic scale factor. + border_value (int): Border value used in case of a constant border. + Defaults to 0. + interpolation (str): Same as :func:`resize`. + auto_bound (bool): Whether to adjust the image size to cover the whole + rotated image. + border_mode (str): Pixel extrapolation method. Defaults to 'constant'. + + Returns: + np.ndarray: The rotated image. + """ + if center is not None and auto_bound: + raise ValueError('`auto_bound` conflicts with `center`') + h, w = img.shape[:2] + if center is None: + center = ((w - 1) * 0.5, (h - 1) * 0.5) + assert isinstance(center, tuple) + + matrix = cv2.getRotationMatrix2D(center, -angle, scale) + if auto_bound: + cos = np.abs(matrix[0, 0]) + sin = np.abs(matrix[0, 1]) + new_w = h * sin + w * cos + new_h = h * cos + w * sin + matrix[0, 2] += (new_w - w) * 0.5 + matrix[1, 2] += (new_h - h) * 0.5 + w = int(np.round(new_w)) + h = int(np.round(new_h)) + rotated = cv2.warpAffine( + img, + matrix, (w, h), + flags=cv2_interp_codes[interpolation], + borderMode=cv2_border_modes[border_mode], + borderValue=border_value) + return rotated + + +def bbox_clip(bboxes: np.ndarray, img_shape: Tuple[int, int]) -> np.ndarray: + """Clip bboxes to fit the image shape. + + Args: + bboxes (ndarray): Shape (..., 4*k) + img_shape (tuple[int]): (height, width) of the image. + + Returns: + ndarray: Clipped bboxes. + """ + assert bboxes.shape[-1] % 4 == 0 + cmin = np.empty(bboxes.shape[-1], dtype=bboxes.dtype) + cmin[0::2] = img_shape[1] - 1 + cmin[1::2] = img_shape[0] - 1 + clipped_bboxes = np.maximum(np.minimum(bboxes, cmin), 0) + return clipped_bboxes + + +def bbox_scaling(bboxes: np.ndarray, + scale: float, + clip_shape: Optional[Tuple[int, int]] = None) -> np.ndarray: + """Scaling bboxes w.r.t the box center. + + Args: + bboxes (ndarray): Shape(..., 4). + scale (float): Scaling factor. + clip_shape (tuple[int], optional): If specified, bboxes that exceed the + boundary will be clipped according to the given shape (h, w). + + Returns: + ndarray: Scaled bboxes. + """ + if float(scale) == 1.0: + scaled_bboxes = bboxes.copy() + else: + w = bboxes[..., 2] - bboxes[..., 0] + 1 + h = bboxes[..., 3] - bboxes[..., 1] + 1 + dw = (w * (scale - 1)) * 0.5 + dh = (h * (scale - 1)) * 0.5 + scaled_bboxes = bboxes + np.stack((-dw, -dh, dw, dh), axis=-1) + if clip_shape is not None: + return bbox_clip(scaled_bboxes, clip_shape) + else: + return scaled_bboxes + + +def imcrop( + img: np.ndarray, + bboxes: np.ndarray, + scale: float = 1.0, + pad_fill: Union[float, list, None] = None +) -> Union[np.ndarray, List[np.ndarray]]: + """Crop image patches. + + 3 steps: scale the bboxes -> clip bboxes -> crop and pad. + + Args: + img (ndarray): Image to be cropped. + bboxes (ndarray): Shape (k, 4) or (4, ), location of cropped bboxes. + scale (float, optional): Scale ratio of bboxes, the default value + 1.0 means no scaling. + pad_fill (Number | list[Number]): Value to be filled for padding. + Default: None, which means no padding. + + Returns: + list[ndarray] | ndarray: The cropped image patches. + """ + chn = 1 if img.ndim == 2 else img.shape[2] + if pad_fill is not None: + if isinstance(pad_fill, (int, float)): + pad_fill = [pad_fill for _ in range(chn)] + assert len(pad_fill) == chn + + _bboxes = bboxes[None, ...] if bboxes.ndim == 1 else bboxes + scaled_bboxes = bbox_scaling(_bboxes, scale).astype(np.int32) + clipped_bbox = bbox_clip(scaled_bboxes, img.shape) + + patches = [] + for i in range(clipped_bbox.shape[0]): + x1, y1, x2, y2 = tuple(clipped_bbox[i, :]) + if pad_fill is None: + patch = img[y1:y2 + 1, x1:x2 + 1, ...] + else: + _x1, _y1, _x2, _y2 = tuple(scaled_bboxes[i, :]) + patch_h = _y2 - _y1 + 1 + patch_w = _x2 - _x1 + 1 + if chn == 1: + patch_shape = (patch_h, patch_w) + else: + patch_shape = (patch_h, patch_w, chn) # type: ignore + patch = np.array( + pad_fill, dtype=img.dtype) * np.ones( + patch_shape, dtype=img.dtype) + x_start = 0 if _x1 >= 0 else -_x1 + y_start = 0 if _y1 >= 0 else -_y1 + w = x2 - x1 + 1 + h = y2 - y1 + 1 + patch[y_start:y_start + h, x_start:x_start + w, + ...] = img[y1:y1 + h, x1:x1 + w, ...] + patches.append(patch) + + if bboxes.ndim == 1: + return patches[0] + else: + return patches + + +def impad(img: np.ndarray, + *, + shape: Optional[Tuple[int, int]] = None, + padding: Union[int, tuple, None] = None, + pad_val: Union[float, List] = 0, + padding_mode: str = 'constant') -> np.ndarray: + """Pad the given image to a certain shape or pad on all sides with + specified padding mode and padding value. + + Args: + img (ndarray): Image to be padded. + shape (tuple[int]): Expected padding shape (h, w). Default: None. + padding (int or tuple[int]): Padding on each border. If a single int is + provided this is used to pad all borders. If tuple of length 2 is + provided this is the padding on left/right and top/bottom + respectively. If a tuple of length 4 is provided this is the + padding for the left, top, right and bottom borders respectively. + Default: None. Note that `shape` and `padding` can not be both + set. + pad_val (Number | Sequence[Number]): Values to be filled in padding + areas when padding_mode is 'constant'. Default: 0. + padding_mode (str): Type of padding. Should be: constant, edge, + reflect or symmetric. Default: constant. + + - constant: pads with a constant value, this value is specified + with pad_val. + - edge: pads with the last value at the edge of the image. + - reflect: pads with reflection of image without repeating the last + value on the edge. For example, padding [1, 2, 3, 4] with 2 + elements on both sides in reflect mode will result in + [3, 2, 1, 2, 3, 4, 3, 2]. + - symmetric: pads with reflection of image repeating the last value + on the edge. For example, padding [1, 2, 3, 4] with 2 elements on + both sides in symmetric mode will result in + [2, 1, 1, 2, 3, 4, 4, 3] + + Returns: + ndarray: The padded image. + """ + + assert (shape is not None) ^ (padding is not None) + if shape is not None: + width = max(shape[1] - img.shape[1], 0) + height = max(shape[0] - img.shape[0], 0) + padding = (0, 0, width, height) + + # check pad_val + if isinstance(pad_val, tuple): + assert len(pad_val) == img.shape[-1] + elif not isinstance(pad_val, numbers.Number): + raise TypeError('pad_val must be a int or a tuple. ' + f'But received {type(pad_val)}') + + # check padding + if isinstance(padding, tuple) and len(padding) in [2, 4]: + if len(padding) == 2: + padding = (padding[0], padding[1], padding[0], padding[1]) + elif isinstance(padding, numbers.Number): + padding = (padding, padding, padding, padding) + else: + raise ValueError('Padding must be a int or a 2, or 4 element tuple.' + f'But received {padding}') + + # check padding mode + assert padding_mode in ['constant', 'edge', 'reflect', 'symmetric'] + + border_type = { + 'constant': cv2.BORDER_CONSTANT, + 'edge': cv2.BORDER_REPLICATE, + 'reflect': cv2.BORDER_REFLECT_101, + 'symmetric': cv2.BORDER_REFLECT + } + img = cv2.copyMakeBorder( + img, + padding[1], + padding[3], + padding[0], + padding[2], + border_type[padding_mode], + value=pad_val) + + return img + + +def impad_to_multiple(img: np.ndarray, + divisor: int, + pad_val: Union[float, List] = 0) -> np.ndarray: + """Pad an image to ensure each edge to be multiple to some number. + + Args: + img (ndarray): Image to be padded. + divisor (int): Padded image edges will be multiple to divisor. + pad_val (Number | Sequence[Number]): Same as :func:`impad`. + + Returns: + ndarray: The padded image. + """ + pad_h = int(np.ceil(img.shape[0] / divisor)) * divisor + pad_w = int(np.ceil(img.shape[1] / divisor)) * divisor + return impad(img, shape=(pad_h, pad_w), pad_val=pad_val) + + +def cutout(img: np.ndarray, + shape: Union[int, Tuple[int, int]], + pad_val: Union[int, float, tuple] = 0) -> np.ndarray: + """Randomly cut out a rectangle from the original img. + + Args: + img (ndarray): Image to be cutout. + shape (int | tuple[int]): Expected cutout shape (h, w). If given as a + int, the value will be used for both h and w. + pad_val (int | float | tuple[int | float]): Values to be filled in the + cut area. Defaults to 0. + + Returns: + ndarray: The cutout image. + """ + + channels = 1 if img.ndim == 2 else img.shape[2] + if isinstance(shape, int): + cut_h, cut_w = shape, shape + else: + assert isinstance(shape, tuple) and len(shape) == 2, \ + f'shape must be a int or a tuple with length 2, but got type ' \ + f'{type(shape)} instead.' + cut_h, cut_w = shape + if isinstance(pad_val, (int, float)): + pad_val = tuple([pad_val] * channels) + elif isinstance(pad_val, tuple): + assert len(pad_val) == channels, \ + 'Expected the num of elements in tuple equals the channels' \ + 'of input image. Found {} vs {}'.format( + len(pad_val), channels) + else: + raise TypeError(f'Invalid type {type(pad_val)} for `pad_val`') + + img_h, img_w = img.shape[:2] + y0 = np.random.uniform(img_h) + x0 = np.random.uniform(img_w) + + y1 = int(max(0, y0 - cut_h / 2.)) + x1 = int(max(0, x0 - cut_w / 2.)) + y2 = min(img_h, y1 + cut_h) + x2 = min(img_w, x1 + cut_w) + + if img.ndim == 2: + patch_shape = (y2 - y1, x2 - x1) + else: + patch_shape = (y2 - y1, x2 - x1, channels) # type: ignore + + img_cutout = img.copy() + patch = np.array( + pad_val, dtype=img.dtype) * np.ones( + patch_shape, dtype=img.dtype) + img_cutout[y1:y2, x1:x2, ...] = patch + + return img_cutout + + +def _get_shear_matrix(magnitude: Union[int, float], + direction: str = 'horizontal') -> np.ndarray: + """Generate the shear matrix for transformation. + + Args: + magnitude (int | float): The magnitude used for shear. + direction (str): The flip direction, either "horizontal" + or "vertical". + + Returns: + ndarray: The shear matrix with dtype float32. + """ + if direction == 'horizontal': + shear_matrix = np.float32([[1, magnitude, 0], [0, 1, 0]]) + elif direction == 'vertical': + shear_matrix = np.float32([[1, 0, 0], [magnitude, 1, 0]]) + return shear_matrix + + +def imshear(img: np.ndarray, + magnitude: Union[int, float], + direction: str = 'horizontal', + border_value: Union[int, Tuple[int, int]] = 0, + interpolation: str = 'bilinear') -> np.ndarray: + """Shear an image. + + Args: + img (ndarray): Image to be sheared with format (h, w) + or (h, w, c). + magnitude (int | float): The magnitude used for shear. + direction (str): The flip direction, either "horizontal" + or "vertical". + border_value (int | tuple[int]): Value used in case of a + constant border. + interpolation (str): Same as :func:`resize`. + + Returns: + ndarray: The sheared image. + """ + assert direction in ['horizontal', + 'vertical'], f'Invalid direction: {direction}' + height, width = img.shape[:2] + if img.ndim == 2: + channels = 1 + elif img.ndim == 3: + channels = img.shape[-1] + if isinstance(border_value, int): + border_value = tuple([border_value] * channels) # type: ignore + elif isinstance(border_value, tuple): + assert len(border_value) == channels, \ + 'Expected the num of elements in tuple equals the channels' \ + 'of input image. Found {} vs {}'.format( + len(border_value), channels) + else: + raise ValueError( + f'Invalid type {type(border_value)} for `border_value`') + shear_matrix = _get_shear_matrix(magnitude, direction) + sheared = cv2.warpAffine( + img, + shear_matrix, + (width, height), + # Note case when the number elements in `border_value` + # greater than 3 (e.g. shearing masks whose channels large + # than 3) will raise TypeError in `cv2.warpAffine`. + # Here simply slice the first 3 values in `border_value`. + borderValue=border_value[:3], # type: ignore + flags=cv2_interp_codes[interpolation]) + return sheared + + +def _get_translate_matrix(offset: Union[int, float], + direction: str = 'horizontal') -> np.ndarray: + """Generate the translate matrix. + + Args: + offset (int | float): The offset used for translate. + direction (str): The translate direction, either + "horizontal" or "vertical". + + Returns: + ndarray: The translate matrix with dtype float32. + """ + if direction == 'horizontal': + translate_matrix = np.float32([[1, 0, offset], [0, 1, 0]]) + elif direction == 'vertical': + translate_matrix = np.float32([[1, 0, 0], [0, 1, offset]]) + return translate_matrix + + +def imtranslate(img: np.ndarray, + offset: Union[int, float], + direction: str = 'horizontal', + border_value: Union[int, tuple] = 0, + interpolation: str = 'bilinear') -> np.ndarray: + """Translate an image. + + Args: + img (ndarray): Image to be translated with format + (h, w) or (h, w, c). + offset (int | float): The offset used for translate. + direction (str): The translate direction, either "horizontal" + or "vertical". + border_value (int | tuple[int]): Value used in case of a + constant border. + interpolation (str): Same as :func:`resize`. + + Returns: + ndarray: The translated image. + """ + assert direction in ['horizontal', + 'vertical'], f'Invalid direction: {direction}' + height, width = img.shape[:2] + if img.ndim == 2: + channels = 1 + elif img.ndim == 3: + channels = img.shape[-1] + if isinstance(border_value, int): + border_value = tuple([border_value] * channels) + elif isinstance(border_value, tuple): + assert len(border_value) == channels, \ + 'Expected the num of elements in tuple equals the channels' \ + 'of input image. Found {} vs {}'.format( + len(border_value), channels) + else: + raise ValueError( + f'Invalid type {type(border_value)} for `border_value`.') + translate_matrix = _get_translate_matrix(offset, direction) + translated = cv2.warpAffine( + img, + translate_matrix, + (width, height), + # Note case when the number elements in `border_value` + # greater than 3 (e.g. translating masks whose channels + # large than 3) will raise TypeError in `cv2.warpAffine`. + # Here simply slice the first 3 values in `border_value`. + borderValue=border_value[:3], + flags=cv2_interp_codes[interpolation]) + return translated diff --git a/FoodSeg103/demo/mmcv/mmcv/image/io.py b/FoodSeg103/demo/mmcv/mmcv/image/io.py new file mode 100644 index 0000000000000000000000000000000000000000..e10d443da6554865afc98cb2441a0cc8eddf0e16 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/image/io.py @@ -0,0 +1,364 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import io +import os.path as osp +import warnings +from pathlib import Path +from typing import Optional, Union + +import cv2 +import mmengine.fileio as fileio +import numpy as np +from cv2 import (IMREAD_COLOR, IMREAD_GRAYSCALE, IMREAD_IGNORE_ORIENTATION, + IMREAD_UNCHANGED) +from mmengine.utils import is_filepath, is_str + +try: + from turbojpeg import TJCS_RGB, TJPF_BGR, TJPF_GRAY, TurboJPEG +except ImportError: + TJCS_RGB = TJPF_GRAY = TJPF_BGR = TurboJPEG = None + +try: + from PIL import Image, ImageOps +except ImportError: + Image = None + +try: + import tifffile +except ImportError: + tifffile = None + +jpeg = None +supported_backends = ['cv2', 'turbojpeg', 'pillow', 'tifffile'] + +imread_flags = { + 'color': IMREAD_COLOR, + 'grayscale': IMREAD_GRAYSCALE, + 'unchanged': IMREAD_UNCHANGED, + 'color_ignore_orientation': IMREAD_IGNORE_ORIENTATION | IMREAD_COLOR, + 'grayscale_ignore_orientation': + IMREAD_IGNORE_ORIENTATION | IMREAD_GRAYSCALE +} + +imread_backend = 'cv2' + + +def use_backend(backend: str) -> None: + """Select a backend for image decoding. + + Args: + backend (str): The image decoding backend type. Options are `cv2`, + `pillow`, `turbojpeg` (see https://github.com/lilohuang/PyTurboJPEG) + and `tifffile`. `turbojpeg` is faster but it only supports `.jpeg` + file format. + """ + assert backend in supported_backends + global imread_backend + imread_backend = backend + if imread_backend == 'turbojpeg': + if TurboJPEG is None: + raise ImportError('`PyTurboJPEG` is not installed') + global jpeg + if jpeg is None: + jpeg = TurboJPEG() + elif imread_backend == 'pillow': + if Image is None: + raise ImportError('`Pillow` is not installed') + elif imread_backend == 'tifffile': + if tifffile is None: + raise ImportError('`tifffile` is not installed') + + +def _jpegflag(flag: str = 'color', channel_order: str = 'bgr'): + channel_order = channel_order.lower() + if channel_order not in ['rgb', 'bgr']: + raise ValueError('channel order must be either "rgb" or "bgr"') + + if flag == 'color': + if channel_order == 'bgr': + return TJPF_BGR + elif channel_order == 'rgb': + return TJCS_RGB + elif flag == 'grayscale': + return TJPF_GRAY + else: + raise ValueError('flag must be "color" or "grayscale"') + + +def _pillow2array(img, + flag: str = 'color', + channel_order: str = 'bgr') -> np.ndarray: + """Convert a pillow image to numpy array. + + Args: + img (:obj:`PIL.Image.Image`): The image loaded using PIL + flag (str): Flags specifying the color type of a loaded image, + candidates are 'color', 'grayscale' and 'unchanged'. + Default to 'color'. + channel_order (str): The channel order of the output image array, + candidates are 'bgr' and 'rgb'. Default to 'bgr'. + + Returns: + np.ndarray: The converted numpy array + """ + channel_order = channel_order.lower() + if channel_order not in ['rgb', 'bgr']: + raise ValueError('channel order must be either "rgb" or "bgr"') + + if flag == 'unchanged': + array = np.array(img) + if array.ndim >= 3 and array.shape[2] >= 3: # color image + array[:, :, :3] = array[:, :, (2, 1, 0)] # RGB to BGR + else: + # Handle exif orientation tag + if flag in ['color', 'grayscale']: + img = ImageOps.exif_transpose(img) + # If the image mode is not 'RGB', convert it to 'RGB' first. + if img.mode != 'RGB': + if img.mode != 'LA': + # Most formats except 'LA' can be directly converted to RGB + img = img.convert('RGB') + else: + # When the mode is 'LA', the default conversion will fill in + # the canvas with black, which sometimes shadows black objects + # in the foreground. + # + # Therefore, a random color (124, 117, 104) is used for canvas + img_rgba = img.convert('RGBA') + img = Image.new('RGB', img_rgba.size, (124, 117, 104)) + img.paste(img_rgba, mask=img_rgba.split()[3]) # 3 is alpha + if flag in ['color', 'color_ignore_orientation']: + array = np.array(img) + if channel_order != 'rgb': + array = array[:, :, ::-1] # RGB to BGR + elif flag in ['grayscale', 'grayscale_ignore_orientation']: + img = img.convert('L') + array = np.array(img) + else: + raise ValueError( + 'flag must be "color", "grayscale", "unchanged", ' + f'"color_ignore_orientation" or "grayscale_ignore_orientation"' + f' but got {flag}') + return array + + +def imread(img_or_path: Union[np.ndarray, str, Path], + flag: str = 'color', + channel_order: str = 'bgr', + backend: Optional[str] = None, + file_client_args: Optional[dict] = None, + *, + backend_args: Optional[dict] = None) -> np.ndarray: + """Read an image. + + Args: + img_or_path (ndarray or str or Path): Either a numpy array or str or + pathlib.Path. If it is a numpy array (loaded image), then + it will be returned as is. + flag (str): Flags specifying the color type of a loaded image, + candidates are `color`, `grayscale`, `unchanged`, + `color_ignore_orientation` and `grayscale_ignore_orientation`. + By default, `cv2` and `pillow` backend would rotate the image + according to its EXIF info unless called with `unchanged` or + `*_ignore_orientation` flags. `turbojpeg` and `tifffile` backend + always ignore image's EXIF info regardless of the flag. + The `turbojpeg` backend only supports `color` and `grayscale`. + channel_order (str): Order of channel, candidates are `bgr` and `rgb`. + backend (str | None): The image decoding backend type. Options are + `cv2`, `pillow`, `turbojpeg`, `tifffile`, `None`. + If backend is None, the global imread_backend specified by + ``mmcv.use_backend()`` will be used. Default: None. + file_client_args (dict, optional): Arguments to instantiate a + FileClient. See :class:`mmengine.fileio.FileClient` for details. + Default: None. It will be deprecated in future. Please use + ``backend_args`` instead. + Deprecated in version 2.0.0rc4. + backend_args (dict, optional): Instantiates the corresponding file + backend. It may contain `backend` key to specify the file + backend. If it contains, the file backend corresponding to this + value will be used and initialized with the remaining values, + otherwise the corresponding file backend will be selected + based on the prefix of the file path. Defaults to None. + New in version 2.0.0rc4. + + Returns: + ndarray: Loaded image array. + + Examples: + >>> import mmcv + >>> img_path = '/path/to/img.jpg' + >>> img = mmcv.imread(img_path) + >>> img = mmcv.imread(img_path, flag='color', channel_order='rgb', + ... backend='cv2') + >>> img = mmcv.imread(img_path, flag='color', channel_order='bgr', + ... backend='pillow') + >>> s3_img_path = 's3://bucket/img.jpg' + >>> # infer the file backend by the prefix s3 + >>> img = mmcv.imread(s3_img_path) + >>> # manually set the file backend petrel + >>> img = mmcv.imread(s3_img_path, backend_args={ + ... 'backend': 'petrel'}) + >>> http_img_path = 'http://path/to/img.jpg' + >>> img = mmcv.imread(http_img_path) + >>> img = mmcv.imread(http_img_path, backend_args={ + ... 'backend': 'http'}) + """ + if file_client_args is not None: + warnings.warn( + '"file_client_args" will be deprecated in future. ' + 'Please use "backend_args" instead', DeprecationWarning) + if backend_args is not None: + raise ValueError( + '"file_client_args" and "backend_args" cannot be set at the ' + 'same time.') + + if isinstance(img_or_path, Path): + img_or_path = str(img_or_path) + + if isinstance(img_or_path, np.ndarray): + return img_or_path + elif is_str(img_or_path): + if file_client_args is not None: + file_client = fileio.FileClient.infer_client( + file_client_args, img_or_path) + img_bytes = file_client.get(img_or_path) + else: + img_bytes = fileio.get(img_or_path, backend_args=backend_args) + return imfrombytes(img_bytes, flag, channel_order, backend) + else: + raise TypeError('"img" must be a numpy array or a str or ' + 'a pathlib.Path object') + + +def imfrombytes(content: bytes, + flag: str = 'color', + channel_order: str = 'bgr', + backend: Optional[str] = None) -> np.ndarray: + """Read an image from bytes. + + Args: + content (bytes): Image bytes got from files or other streams. + flag (str): Same as :func:`imread`. + channel_order (str): The channel order of the output, candidates + are 'bgr' and 'rgb'. Default to 'bgr'. + backend (str | None): The image decoding backend type. Options are + `cv2`, `pillow`, `turbojpeg`, `tifffile`, `None`. If backend is + None, the global imread_backend specified by ``mmcv.use_backend()`` + will be used. Default: None. + + Returns: + ndarray: Loaded image array. + + Examples: + >>> img_path = '/path/to/img.jpg' + >>> with open(img_path, 'rb') as f: + >>> img_buff = f.read() + >>> img = mmcv.imfrombytes(img_buff) + >>> img = mmcv.imfrombytes(img_buff, flag='color', channel_order='rgb') + >>> img = mmcv.imfrombytes(img_buff, backend='pillow') + >>> img = mmcv.imfrombytes(img_buff, backend='cv2') + """ + + if backend is None: + backend = imread_backend + if backend not in supported_backends: + raise ValueError( + f'backend: {backend} is not supported. Supported ' + "backends are 'cv2', 'turbojpeg', 'pillow', 'tifffile'") + if backend == 'turbojpeg': + img = jpeg.decode( # type: ignore + content, _jpegflag(flag, channel_order)) + if img.shape[-1] == 1: + img = img[:, :, 0] + return img + elif backend == 'pillow': + with io.BytesIO(content) as buff: + img = Image.open(buff) + img = _pillow2array(img, flag, channel_order) + return img + elif backend == 'tifffile': + with io.BytesIO(content) as buff: + img = tifffile.imread(buff) + return img + else: + img_np = np.frombuffer(content, np.uint8) + flag = imread_flags[flag] if is_str(flag) else flag + img = cv2.imdecode(img_np, flag) + if flag == IMREAD_COLOR and channel_order == 'rgb': + cv2.cvtColor(img, cv2.COLOR_BGR2RGB, img) + return img + + +def imwrite(img: np.ndarray, + file_path: str, + params: Optional[list] = None, + auto_mkdir: Optional[bool] = None, + file_client_args: Optional[dict] = None, + *, + backend_args: Optional[dict] = None) -> bool: + """Write image to file. + + Warning: + The parameter `auto_mkdir` will be deprecated in the future and every + file clients will make directory automatically. + + Args: + img (ndarray): Image array to be written. + file_path (str): Image file path. + params (None or list): Same as opencv :func:`imwrite` interface. + auto_mkdir (bool): If the parent folder of `file_path` does not exist, + whether to create it automatically. It will be deprecated. + file_client_args (dict, optional): Arguments to instantiate a + FileClient. See :class:`mmengine.fileio.FileClient` for details. + Default: None. It will be deprecated in future. Please use + ``backend_args`` instead. + Deprecated in version 2.0.0rc4. + backend_args (dict, optional): Instantiates the corresponding file + backend. It may contain `backend` key to specify the file + backend. If it contains, the file backend corresponding to this + value will be used and initialized with the remaining values, + otherwise the corresponding file backend will be selected + based on the prefix of the file path. Defaults to None. + New in version 2.0.0rc4. + + Returns: + bool: Successful or not. + + Examples: + >>> # write to hard disk client + >>> ret = mmcv.imwrite(img, '/path/to/img.jpg') + >>> # infer the file backend by the prefix s3 + >>> ret = mmcv.imwrite(img, 's3://bucket/img.jpg') + >>> # manually set the file backend petrel + >>> ret = mmcv.imwrite(img, 's3://bucket/img.jpg', backend_args={ + ... 'backend': 'petrel'}) + """ + if file_client_args is not None: + warnings.warn( + '"file_client_args" will be deprecated in future. ' + 'Please use "backend_args" instead', DeprecationWarning) + if backend_args is not None: + raise ValueError( + '"file_client_args" and "backend_args" cannot be set at the ' + 'same time.') + + assert is_filepath(file_path) + file_path = str(file_path) + if auto_mkdir is not None: + warnings.warn( + 'The parameter `auto_mkdir` will be deprecated in the future and ' + 'every file clients will make directory automatically.') + + img_ext = osp.splitext(file_path)[-1] + # Encode image according to image suffix. + # For example, if image path is '/path/your/img.jpg', the encode + # format is '.jpg'. + flag, img_buff = cv2.imencode(img_ext, img, params) + + if file_client_args is not None: + file_client = fileio.FileClient.infer_client(file_client_args, + file_path) + file_client.put(img_buff.tobytes(), file_path) + else: + fileio.put(img_buff.tobytes(), file_path, backend_args=backend_args) + + return flag diff --git a/FoodSeg103/demo/mmcv/mmcv/image/misc.py b/FoodSeg103/demo/mmcv/mmcv/image/misc.py new file mode 100644 index 0000000000000000000000000000000000000000..e923cad4e5f7d210640ee51291a48d82c3b84c32 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/image/misc.py @@ -0,0 +1,58 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + +import numpy as np + +import mmcv + +try: + import torch +except ImportError: + torch = None + + +def tensor2imgs(tensor, + mean: Optional[tuple] = None, + std: Optional[tuple] = None, + to_rgb: bool = True) -> list: + """Convert tensor to 3-channel images or 1-channel gray images. + + Args: + tensor (torch.Tensor): Tensor that contains multiple images, shape ( + N, C, H, W). :math:`C` can be either 3 or 1. + mean (tuple[float], optional): Mean of images. If None, + (0, 0, 0) will be used for tensor with 3-channel, + while (0, ) for tensor with 1-channel. Defaults to None. + std (tuple[float], optional): Standard deviation of images. If None, + (1, 1, 1) will be used for tensor with 3-channel, + while (1, ) for tensor with 1-channel. Defaults to None. + to_rgb (bool, optional): Whether the tensor was converted to RGB + format in the first place. If so, convert it back to BGR. + For the tensor with 1 channel, it must be False. Defaults to True. + + Returns: + list[np.ndarray]: A list that contains multiple images. + """ + + if torch is None: + raise RuntimeError('pytorch is not installed') + assert torch.is_tensor(tensor) and tensor.ndim == 4 + channels = tensor.size(1) + assert channels in [1, 3] + if mean is None: + mean = (0, ) * channels + if std is None: + std = (1, ) * channels + assert (channels == len(mean) == len(std) == 3) or \ + (channels == len(mean) == len(std) == 1 and not to_rgb) + + num_imgs = tensor.size(0) + mean = np.array(mean, dtype=np.float32) + std = np.array(std, dtype=np.float32) + imgs = [] + for img_id in range(num_imgs): + img = tensor[img_id, ...].cpu().numpy().transpose(1, 2, 0) + img = mmcv.imdenormalize( + img, mean, std, to_bgr=to_rgb).astype(np.uint8) + imgs.append(np.ascontiguousarray(img)) + return imgs diff --git a/FoodSeg103/demo/mmcv/mmcv/image/photometric.py b/FoodSeg103/demo/mmcv/mmcv/image/photometric.py new file mode 100644 index 0000000000000000000000000000000000000000..12cbb90822564bf14cd5176cc3c5532220db40da --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/image/photometric.py @@ -0,0 +1,561 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from typing import Optional + +import cv2 +import numpy as np +from mmengine.utils import is_tuple_of +from PIL import Image, ImageEnhance + +from .colorspace import bgr2gray, gray2bgr +from .io import imread_backend + + +def imnormalize(img, mean, std, to_rgb=True): + """Normalize an image with mean and std. + + Args: + img (ndarray): Image to be normalized. + mean (ndarray): The mean to be used for normalize. + std (ndarray): The std to be used for normalize. + to_rgb (bool): Whether to convert to rgb. + + Returns: + ndarray: The normalized image. + """ + img = img.copy().astype(np.float32) + return imnormalize_(img, mean, std, to_rgb) + + +def imnormalize_(img, mean, std, to_rgb=True): + """Inplace normalize an image with mean and std. + + Args: + img (ndarray): Image to be normalized. + mean (ndarray): The mean to be used for normalize. + std (ndarray): The std to be used for normalize. + to_rgb (bool): Whether to convert to rgb. + + Returns: + ndarray: The normalized image. + """ + # cv2 inplace normalization does not accept uint8 + assert img.dtype != np.uint8 + mean = np.float64(mean.reshape(1, -1)) + stdinv = 1 / np.float64(std.reshape(1, -1)) + if to_rgb: + cv2.cvtColor(img, cv2.COLOR_BGR2RGB, img) # inplace + cv2.subtract(img, mean, img) # inplace + cv2.multiply(img, stdinv, img) # inplace + return img + + +def imdenormalize(img, mean, std, to_bgr=True): + assert img.dtype != np.uint8 + mean = mean.reshape(1, -1).astype(np.float64) + std = std.reshape(1, -1).astype(np.float64) + img = cv2.multiply(img, std) # make a copy + cv2.add(img, mean, img) # inplace + if to_bgr: + cv2.cvtColor(img, cv2.COLOR_RGB2BGR, img) # inplace + return img + + +def iminvert(img): + """Invert (negate) an image. + + Args: + img (ndarray): Image to be inverted. + + Returns: + ndarray: The inverted image. + """ + return np.full_like(img, 255) - img + + +def solarize(img, thr=128): + """Solarize an image (invert all pixel values above a threshold) + + Args: + img (ndarray): Image to be solarized. + thr (int): Threshold for solarizing (0 - 255). + + Returns: + ndarray: The solarized image. + """ + img = np.where(img < thr, img, 255 - img) + return img + + +def posterize(img, bits): + """Posterize an image (reduce the number of bits for each color channel) + + Args: + img (ndarray): Image to be posterized. + bits (int): Number of bits (1 to 8) to use for posterizing. + + Returns: + ndarray: The posterized image. + """ + shift = 8 - bits + img = np.left_shift(np.right_shift(img, shift), shift) + return img + + +def adjust_color(img, alpha=1, beta=None, gamma=0, backend=None): + r"""It blends the source image and its gray image: + + .. math:: + output = img * alpha + gray\_img * beta + gamma + + Args: + img (ndarray): The input source image. + alpha (int | float): Weight for the source image. Default 1. + beta (int | float): Weight for the converted gray image. + If None, it's assigned the value (1 - `alpha`). + gamma (int | float): Scalar added to each sum. + Same as :func:`cv2.addWeighted`. Default 0. + backend (str | None): The image processing backend type. Options are + `cv2`, `pillow`, `None`. If backend is None, the global + ``imread_backend`` specified by ``mmcv.use_backend()`` will be + used. Defaults to None. + + Returns: + ndarray: Colored image which has the same size and dtype as input. + """ + if backend is None: + backend = imread_backend + if backend not in ['cv2', 'pillow']: + raise ValueError(f'backend: {backend} is not supported.' + f"Supported backends are 'cv2', 'pillow'") + + if backend == 'pillow': + assert img.dtype == np.uint8, 'Pillow backend only support uint8 type' + warnings.warn("Only use 'alpha' for pillow backend.") + # Image.fromarray defaultly supports RGB, not BGR. + pil_image = Image.fromarray(img[..., ::-1], mode='RGB') + enhancer = ImageEnhance.Color(pil_image) + pil_image = enhancer.enhance(alpha) + return np.array(pil_image, dtype=img.dtype)[..., ::-1] + else: + gray_img = bgr2gray(img) + gray_img = np.tile(gray_img[..., None], [1, 1, 3]) + if beta is None: + beta = 1 - alpha + colored_img = cv2.addWeighted(img, alpha, gray_img, beta, gamma) + if not colored_img.dtype == np.uint8: + # Note when the dtype of `img` is not the default `np.uint8` + # (e.g. np.float32), the value in `colored_img` got from cv2 + # is not guaranteed to be in range [0, 255], so here clip + # is needed. + colored_img = np.clip(colored_img, 0, 255) + return colored_img.astype(img.dtype) + + +def imequalize(img): + """Equalize the image histogram. + + This function applies a non-linear mapping to the input image, + in order to create a uniform distribution of grayscale values + in the output image. + + Args: + img (ndarray): Image to be equalized. + + Returns: + ndarray: The equalized image. + """ + + def _scale_channel(im, c): + """Scale the data in the corresponding channel.""" + im = im[:, :, c] + # Compute the histogram of the image channel. + histo = np.histogram(im, 256, (0, 255))[0] + # For computing the step, filter out the nonzeros. + nonzero_histo = histo[histo > 0] + step = (np.sum(nonzero_histo) - nonzero_histo[-1]) // 255 + if not step: + lut = np.array(range(256)) + else: + # Compute the cumulative sum, shifted by step // 2 + # and then normalized by step. + lut = (np.cumsum(histo) + (step // 2)) // step + # Shift lut, prepending with 0. + lut = np.concatenate([[0], lut[:-1]], 0) + # handle potential integer overflow + lut[lut > 255] = 255 + # If step is zero, return the original image. + # Otherwise, index from lut. + return np.where(np.equal(step, 0), im, lut[im]) + + # Scales each channel independently and then stacks + # the result. + s1 = _scale_channel(img, 0) + s2 = _scale_channel(img, 1) + s3 = _scale_channel(img, 2) + equalized_img = np.stack([s1, s2, s3], axis=-1) + return equalized_img.astype(img.dtype) + + +def adjust_brightness(img, factor=1., backend=None): + """Adjust image brightness. + + This function controls the brightness of an image. An + enhancement factor of 0.0 gives a black image. + A factor of 1.0 gives the original image. This function + blends the source image and the degenerated black image: + + .. math:: + output = img * factor + degenerated * (1 - factor) + + Args: + img (ndarray): Image to be brightened. + factor (float): A value controls the enhancement. + Factor 1.0 returns the original image, lower + factors mean less color (brightness, contrast, + etc), and higher values more. Default 1. + backend (str | None): The image processing backend type. Options are + `cv2`, `pillow`, `None`. If backend is None, the global + ``imread_backend`` specified by ``mmcv.use_backend()`` will be + used. Defaults to None. + + Returns: + ndarray: The brightened image. + """ + if backend is None: + backend = imread_backend + if backend not in ['cv2', 'pillow']: + raise ValueError(f'backend: {backend} is not supported.' + f"Supported backends are 'cv2', 'pillow'") + + if backend == 'pillow': + assert img.dtype == np.uint8, 'Pillow backend only support uint8 type' + # Image.fromarray defaultly supports RGB, not BGR. + pil_image = Image.fromarray(img[..., ::-1], mode='RGB') + enhancer = ImageEnhance.Brightness(pil_image) + pil_image = enhancer.enhance(factor) + return np.array(pil_image, dtype=img.dtype)[..., ::-1] + else: + degenerated = np.zeros_like(img) + # Note manually convert the dtype to np.float32, to + # achieve as close results as PIL.ImageEnhance.Brightness. + # Set beta=1-factor, and gamma=0 + brightened_img = cv2.addWeighted( + img.astype(np.float32), factor, degenerated.astype(np.float32), + 1 - factor, 0) + brightened_img = np.clip(brightened_img, 0, 255) + return brightened_img.astype(img.dtype) + + +def adjust_contrast(img, factor=1., backend=None): + """Adjust image contrast. + + This function controls the contrast of an image. An + enhancement factor of 0.0 gives a solid grey + image. A factor of 1.0 gives the original image. It + blends the source image and the degenerated mean image: + + .. math:: + output = img * factor + degenerated * (1 - factor) + + Args: + img (ndarray): Image to be contrasted. BGR order. + factor (float): Same as :func:`mmcv.adjust_brightness`. + backend (str | None): The image processing backend type. Options are + `cv2`, `pillow`, `None`. If backend is None, the global + ``imread_backend`` specified by ``mmcv.use_backend()`` will be + used. Defaults to None. + + Returns: + ndarray: The contrasted image. + """ + if backend is None: + backend = imread_backend + if backend not in ['cv2', 'pillow']: + raise ValueError(f'backend: {backend} is not supported.' + f"Supported backends are 'cv2', 'pillow'") + + if backend == 'pillow': + assert img.dtype == np.uint8, 'Pillow backend only support uint8 type' + # Image.fromarray defaultly supports RGB, not BGR. + pil_image = Image.fromarray(img[..., ::-1], mode='RGB') + enhancer = ImageEnhance.Contrast(pil_image) + pil_image = enhancer.enhance(factor) + return np.array(pil_image, dtype=img.dtype)[..., ::-1] + else: + gray_img = bgr2gray(img) + hist = np.histogram(gray_img, 256, (0, 255))[0] + mean = round(np.sum(gray_img) / np.sum(hist)) + degenerated = (np.ones_like(img[..., 0]) * mean).astype(img.dtype) + degenerated = gray2bgr(degenerated) + contrasted_img = cv2.addWeighted( + img.astype(np.float32), factor, degenerated.astype(np.float32), + 1 - factor, 0) + contrasted_img = np.clip(contrasted_img, 0, 255) + return contrasted_img.astype(img.dtype) + + +def auto_contrast(img, cutoff=0): + """Auto adjust image contrast. + + This function maximize (normalize) image contrast by first removing cutoff + percent of the lightest and darkest pixels from the histogram and remapping + the image so that the darkest pixel becomes black (0), and the lightest + becomes white (255). + + Args: + img (ndarray): Image to be contrasted. BGR order. + cutoff (int | float | tuple): The cutoff percent of the lightest and + darkest pixels to be removed. If given as tuple, it shall be + (low, high). Otherwise, the single value will be used for both. + Defaults to 0. + + Returns: + ndarray: The contrasted image. + """ + + def _auto_contrast_channel(im, c, cutoff): + im = im[:, :, c] + # Compute the histogram of the image channel. + histo = np.histogram(im, 256, (0, 255))[0] + # Remove cut-off percent pixels from histo + histo_sum = np.cumsum(histo) + cut_low = histo_sum[-1] * cutoff[0] // 100 + cut_high = histo_sum[-1] - histo_sum[-1] * cutoff[1] // 100 + histo_sum = np.clip(histo_sum, cut_low, cut_high) - cut_low + histo = np.concatenate([[histo_sum[0]], np.diff(histo_sum)], 0) + + # Compute mapping + low, high = np.nonzero(histo)[0][0], np.nonzero(histo)[0][-1] + # If all the values have been cut off, return the origin img + if low >= high: + return im + scale = 255.0 / (high - low) + offset = -low * scale + lut = np.array(range(256)) + lut = lut * scale + offset + lut = np.clip(lut, 0, 255) + return lut[im] + + if isinstance(cutoff, (int, float)): + cutoff = (cutoff, cutoff) + else: + assert isinstance(cutoff, tuple), 'cutoff must be of type int, ' \ + f'float or tuple, but got {type(cutoff)} instead.' + # Auto adjusts contrast for each channel independently and then stacks + # the result. + s1 = _auto_contrast_channel(img, 0, cutoff) + s2 = _auto_contrast_channel(img, 1, cutoff) + s3 = _auto_contrast_channel(img, 2, cutoff) + contrasted_img = np.stack([s1, s2, s3], axis=-1) + return contrasted_img.astype(img.dtype) + + +def adjust_sharpness(img, factor=1., kernel=None): + """Adjust image sharpness. + + This function controls the sharpness of an image. An + enhancement factor of 0.0 gives a blurred image. A + factor of 1.0 gives the original image. And a factor + of 2.0 gives a sharpened image. It blends the source + image and the degenerated mean image: + + .. math:: + output = img * factor + degenerated * (1 - factor) + + Args: + img (ndarray): Image to be sharpened. BGR order. + factor (float): Same as :func:`mmcv.adjust_brightness`. + kernel (np.ndarray, optional): Filter kernel to be applied on the img + to obtain the degenerated img. Defaults to None. + + Note: + No value sanity check is enforced on the kernel set by users. So with + an inappropriate kernel, the ``adjust_sharpness`` may fail to perform + the function its name indicates but end up performing whatever + transform determined by the kernel. + + Returns: + ndarray: The sharpened image. + """ + + if kernel is None: + # adopted from PIL.ImageFilter.SMOOTH + kernel = np.array([[1., 1., 1.], [1., 5., 1.], [1., 1., 1.]]) / 13 + assert isinstance(kernel, np.ndarray), \ + f'kernel must be of type np.ndarray, but got {type(kernel)} instead.' + assert kernel.ndim == 2, \ + f'kernel must have a dimension of 2, but got {kernel.ndim} instead.' + + degenerated = cv2.filter2D(img, -1, kernel) + sharpened_img = cv2.addWeighted( + img.astype(np.float32), factor, degenerated.astype(np.float32), + 1 - factor, 0) + sharpened_img = np.clip(sharpened_img, 0, 255) + return sharpened_img.astype(img.dtype) + + +def adjust_lighting(img, eigval, eigvec, alphastd=0.1, to_rgb=True): + """AlexNet-style PCA jitter. + + This data augmentation is proposed in `ImageNet Classification with Deep + Convolutional Neural Networks + `_. + + Args: + img (ndarray): Image to be adjusted lighting. BGR order. + eigval (ndarray): the eigenvalue of the convariance matrix of pixel + values, respectively. + eigvec (ndarray): the eigenvector of the convariance matrix of pixel + values, respectively. + alphastd (float): The standard deviation for distribution of alpha. + Defaults to 0.1 + to_rgb (bool): Whether to convert img to rgb. + + Returns: + ndarray: The adjusted image. + """ + assert isinstance(eigval, np.ndarray) and isinstance(eigvec, np.ndarray), \ + f'eigval and eigvec should both be of type np.ndarray, got ' \ + f'{type(eigval)} and {type(eigvec)} instead.' + + assert eigval.ndim == 1 and eigvec.ndim == 2 + assert eigvec.shape == (3, eigval.shape[0]) + n_eigval = eigval.shape[0] + assert isinstance(alphastd, float), 'alphastd should be of type float, ' \ + f'got {type(alphastd)} instead.' + + img = img.copy().astype(np.float32) + if to_rgb: + cv2.cvtColor(img, cv2.COLOR_BGR2RGB, img) # inplace + + alpha = np.random.normal(0, alphastd, n_eigval) + alter = eigvec \ + * np.broadcast_to(alpha.reshape(1, n_eigval), (3, n_eigval)) \ + * np.broadcast_to(eigval.reshape(1, n_eigval), (3, n_eigval)) + alter = np.broadcast_to(alter.sum(axis=1).reshape(1, 1, 3), img.shape) + img_adjusted = img + alter + return img_adjusted + + +def lut_transform(img, lut_table): + """Transform array by look-up table. + + The function lut_transform fills the output array with values from the + look-up table. Indices of the entries are taken from the input array. + + Args: + img (ndarray): Image to be transformed. + lut_table (ndarray): look-up table of 256 elements; in case of + multi-channel input array, the table should either have a single + channel (in this case the same table is used for all channels) or + the same number of channels as in the input array. + + Returns: + ndarray: The transformed image. + """ + assert isinstance(img, np.ndarray) + assert 0 <= np.min(img) and np.max(img) <= 255 + assert isinstance(lut_table, np.ndarray) + assert lut_table.shape == (256, ) + + return cv2.LUT(np.array(img, dtype=np.uint8), lut_table) + + +def clahe(img, clip_limit=40.0, tile_grid_size=(8, 8)): + """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: + img (ndarray): Image to be processed. + 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). + + Returns: + ndarray: The processed image. + """ + assert isinstance(img, np.ndarray) + assert img.ndim == 2 + assert isinstance(clip_limit, (float, int)) + assert is_tuple_of(tile_grid_size, int) + assert len(tile_grid_size) == 2 + + clahe = cv2.createCLAHE(clip_limit, tile_grid_size) + return clahe.apply(np.array(img, dtype=np.uint8)) + + +def adjust_hue(img: np.ndarray, + hue_factor: float, + backend: Optional[str] = None) -> np.ndarray: + """Adjust hue of an image. + + The image hue is adjusted by converting the image to HSV and cyclically + shifting the intensities in the hue channel (H). The image is then + converted back to original image mode. + + `hue_factor` is the amount of shift in H channel and must be in the + interval `[-0.5, 0.5]`. + + Modified from + https://github.com/pytorch/vision/blob/main/torchvision/ + transforms/functional.py + + Args: + img (ndarray): Image to be adjusted. + hue_factor (float): How much to shift the hue channel. Should be in + [-0.5, 0.5]. 0.5 and -0.5 give complete reversal of hue channel in + HSV space in positive and negative direction respectively. + 0 means no shift. Therefore, both -0.5 and 0.5 will give an image + with complementary colors while 0 gives the original image. + backend (str | None): The image processing backend type. Options are + `cv2`, `pillow`, `None`. If backend is None, the global + ``imread_backend`` specified by ``mmcv.use_backend()`` will be + used. Defaults to None. + + Returns: + ndarray: Hue adjusted image. + """ + if backend is None: + backend = imread_backend + if backend not in ['cv2', 'pillow']: + raise ValueError(f'backend: {backend} is not supported.' + f"Supported backends are 'cv2', 'pillow'") + + if not (-0.5 <= hue_factor <= 0.5): + raise ValueError(f'hue_factor:{hue_factor} is not in [-0.5, 0.5].') + if not (isinstance(img, np.ndarray) and (img.ndim in {2, 3})): + raise TypeError('img should be ndarray with dim=[2 or 3].') + + if backend == 'pillow': + assert img.dtype == np.uint8, 'Pillow backend only support uint8 type' + # Image.fromarray defaultly supports RGB, not BGR. + pil_image = Image.fromarray(img[..., ::-1], mode='RGB') + input_mode = pil_image.mode + if input_mode in {'L', '1', 'I', 'F'}: + return pil_image + + h, s, v = pil_image.convert('HSV').split() + + np_h = np.array(h, dtype=np.uint8) + # uint8 addition take cares of rotation across boundaries + with np.errstate(over='ignore'): + np_h += np.uint8(hue_factor * 255) + h = Image.fromarray(np_h, 'L') + + pil_image = Image.merge('HSV', (h, s, v)).convert(input_mode) + return np.array(pil_image, dtype=img.dtype)[..., ::-1] + else: + dtype = img.dtype + img = img.astype(np.uint8) + hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL) + h, s, v = cv2.split(hsv_img) + h = h.astype(np.uint8) + # uint8 addition take cares of rotation across boundaries + with np.errstate(over='ignore'): + h += np.uint8(hue_factor * 255) + hsv_img = cv2.merge([h, s, v]) + return cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR_FULL).astype(dtype) diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/__init__.py b/FoodSeg103/demo/mmcv/mmcv/ops/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ffad9b2bfdbf94cf7963a48ca5252959d43fe29c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/__init__.py @@ -0,0 +1,118 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.utils import IS_MLU_AVAILABLE +from .active_rotated_filter import active_rotated_filter +from .assign_score_withk import assign_score_withk +from .ball_query import ball_query +from .bbox import bbox_overlaps +from .bezier_align import BezierAlign, bezier_align +from .bias_act import bias_act +from .border_align import BorderAlign, border_align +from .box_iou_quadri import box_iou_quadri +from .box_iou_rotated import box_iou_rotated +from .carafe import CARAFE, CARAFENaive, CARAFEPack, carafe, carafe_naive +from .cc_attention import CrissCrossAttention +from .chamfer_distance import chamfer_distance +from .contour_expand import contour_expand +from .conv2d_gradfix import conv2d, conv_transpose2d +from .convex_iou import convex_giou, convex_iou +from .corner_pool import CornerPool +from .correlation import Correlation +from .deform_conv import DeformConv2d, DeformConv2dPack, deform_conv2d +from .deform_roi_pool import (DeformRoIPool, DeformRoIPoolPack, + ModulatedDeformRoIPoolPack, deform_roi_pool) +from .deprecated_wrappers import Conv2d_deprecated as Conv2d +from .deprecated_wrappers import ConvTranspose2d_deprecated as ConvTranspose2d +from .deprecated_wrappers import Linear_deprecated as Linear +from .deprecated_wrappers import MaxPool2d_deprecated as MaxPool2d +from .diff_iou_rotated import diff_iou_rotated_2d, diff_iou_rotated_3d +from .filtered_lrelu import filtered_lrelu +from .focal_loss import (SigmoidFocalLoss, SoftmaxFocalLoss, + sigmoid_focal_loss, softmax_focal_loss) +from .furthest_point_sample import (furthest_point_sample, + furthest_point_sample_with_dist) +from .fused_bias_leakyrelu import FusedBiasLeakyReLU, fused_bias_leakyrelu +from .gather_points import gather_points +from .group_points import GroupAll, QueryAndGroup, grouping_operation +from .info import get_compiler_version, get_compiling_cuda_version +from .iou3d import (boxes_iou3d, boxes_iou_bev, boxes_overlap_bev, nms3d, + nms3d_normal, nms_bev, nms_normal_bev) +from .knn import knn +from .masked_conv import MaskedConv2d, masked_conv2d +from .min_area_polygons import min_area_polygons +from .modulated_deform_conv import (ModulatedDeformConv2d, + ModulatedDeformConv2dPack, + modulated_deform_conv2d) +from .multi_scale_deform_attn import MultiScaleDeformableAttention +from .nms import batched_nms, nms, nms_match, nms_quadri, nms_rotated, soft_nms +from .pixel_group import pixel_group +from .point_sample import (SimpleRoIAlign, point_sample, + rel_roi_point_to_rel_img_point) +from .points_in_boxes import (points_in_boxes_all, points_in_boxes_cpu, + points_in_boxes_part) +from .points_in_polygons import points_in_polygons +from .points_sampler import PointsSampler +from .prroi_pool import PrRoIPool, prroi_pool +from .psa_mask import PSAMask +from .riroi_align_rotated import RiRoIAlignRotated, riroi_align_rotated +from .roi_align import RoIAlign, roi_align +from .roi_align_rotated import RoIAlignRotated, roi_align_rotated +from .roi_pool import RoIPool, roi_pool +from .roiaware_pool3d import RoIAwarePool3d +from .roipoint_pool3d import RoIPointPool3d +from .rotated_feature_align import rotated_feature_align +from .saconv import SAConv2d +from .scatter_points import DynamicScatter, dynamic_scatter +from .sparse_conv import (SparseConv2d, SparseConv3d, SparseConvTranspose2d, + SparseConvTranspose3d, SparseInverseConv2d, + SparseInverseConv3d, SubMConv2d, SubMConv3d) +from .sparse_modules import SparseModule, SparseSequential +from .sparse_pool import SparseMaxPool2d, SparseMaxPool3d +from .sparse_structure import SparseConvTensor, scatter_nd +from .sync_bn import SyncBatchNorm +from .three_interpolate import three_interpolate +from .three_nn import three_nn +from .tin_shift import TINShift, tin_shift +from .upfirdn2d import filter2d, upfirdn2d, upsample2d +from .voxelize import Voxelization, voxelization + +__all__ = [ + 'bbox_overlaps', 'CARAFE', 'CARAFENaive', 'CARAFEPack', 'carafe', + 'carafe_naive', 'CornerPool', 'DeformConv2d', 'DeformConv2dPack', + 'deform_conv2d', 'DeformRoIPool', 'DeformRoIPoolPack', + 'ModulatedDeformRoIPoolPack', 'deform_roi_pool', 'SigmoidFocalLoss', + 'SoftmaxFocalLoss', 'sigmoid_focal_loss', 'softmax_focal_loss', + 'get_compiler_version', 'get_compiling_cuda_version', 'MaskedConv2d', + 'masked_conv2d', 'ModulatedDeformConv2d', 'ModulatedDeformConv2dPack', + 'modulated_deform_conv2d', 'batched_nms', 'nms', 'soft_nms', 'nms_match', + 'RoIAlign', 'roi_align', 'RoIPool', 'roi_pool', 'SyncBatchNorm', 'Conv2d', + 'ConvTranspose2d', 'Linear', 'MaxPool2d', 'CrissCrossAttention', 'PSAMask', + 'point_sample', 'rel_roi_point_to_rel_img_point', 'SimpleRoIAlign', + 'SAConv2d', 'TINShift', 'tin_shift', 'assign_score_withk', + 'box_iou_rotated', 'box_iou_quadri', 'RoIPointPool3d', 'nms_rotated', + 'knn', 'ball_query', 'upfirdn2d', 'FusedBiasLeakyReLU', + 'fused_bias_leakyrelu', 'rotated_feature_align', 'RiRoIAlignRotated', + 'riroi_align_rotated', 'RoIAlignRotated', 'roi_align_rotated', + 'pixel_group', 'QueryAndGroup', 'GroupAll', 'grouping_operation', + 'contour_expand', 'three_nn', 'three_interpolate', + 'MultiScaleDeformableAttention', 'BorderAlign', 'border_align', + 'gather_points', 'furthest_point_sample', 'nms_quadri', + 'furthest_point_sample_with_dist', 'PointsSampler', 'Correlation', + 'boxes_iou3d', 'boxes_iou_bev', 'boxes_overlap_bev', 'nms_bev', + 'nms_normal_bev', 'nms3d', 'nms3d_normal', 'Voxelization', 'voxelization', + 'dynamic_scatter', 'DynamicScatter', 'RoIAwarePool3d', 'SparseConv2d', + 'SparseConv3d', 'SparseConvTranspose2d', 'SparseConvTranspose3d', + 'SparseInverseConv2d', 'SparseInverseConv3d', 'SubMConv2d', 'SubMConv3d', + 'SparseModule', 'SparseSequential', 'SparseMaxPool2d', 'SparseMaxPool3d', + 'SparseConvTensor', 'scatter_nd', 'points_in_boxes_part', + 'points_in_boxes_cpu', 'points_in_boxes_all', 'points_in_polygons', + 'min_area_polygons', 'active_rotated_filter', 'convex_iou', 'convex_giou', + 'diff_iou_rotated_2d', 'diff_iou_rotated_3d', 'chamfer_distance', + 'PrRoIPool', 'prroi_pool', 'bias_act', 'filtered_lrelu', 'conv2d', + 'conv_transpose2d', 'filter2d', 'upsample2d', 'BezierAlign', 'bezier_align' +] + +if IS_MLU_AVAILABLE: + from .deform_conv import DeformConv2dPack_MLU # noqa:F401 + from .modulated_deform_conv import \ + ModulatedDeformConv2dPack_MLU # noqa:F401 + __all__.extend(['ModulatedDeformConv2dPack_MLU', 'DeformConv2dPack_MLU']) diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/active_rotated_filter.py b/FoodSeg103/demo/mmcv/mmcv/ops/active_rotated_filter.py new file mode 100644 index 0000000000000000000000000000000000000000..b8ba43dd41cca14e0d74b4ba7dd8316da2ba4abe --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/active_rotated_filter.py @@ -0,0 +1,64 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Tuple + +import torch +from torch.autograd import Function +from torch.autograd.function import once_differentiable + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext( + '_ext', + ['active_rotated_filter_forward', 'active_rotated_filter_backward']) + + +class ActiveRotatedFilterFunction(Function): + """Encoding the orientation information and generating orientation- + sensitive features. + + The details are described in the paper `Align Deep Features for Oriented + Object Detection _`. + """ + + @staticmethod + def forward(ctx, input: torch.Tensor, + indices: torch.Tensor) -> torch.Tensor: + """ + Args: + input (torch.Tensor): Input features with shape + [num_output_planes, num_input_planes, num_orientations, H, W]. + indices (torch.Tensor): Indices with shape + [num_orientations, H, W, num_rotations]. + + Returns: + torch.Tensor: Refined features with shape [num_output_planes * + num_rotations, num_input_planes * num_orientations, H, W]. + """ + ctx.save_for_backward(input, indices) + op, ip, o, h, w = input.size() + o, h, w, r = indices.size() + output = input.new_zeros((op * r, ip * o, h, w)) + ext_module.active_rotated_filter_forward(input, indices, output) + + return output + + @staticmethod + @once_differentiable + def backward(ctx, grad_out: torch.Tensor) -> Tuple[torch.Tensor, None]: + """ + Args: + grad_output (torch.Tensor): The gradient of output features + with shape [num_output_planes * num_rotations, + num_input_planes * num_orientations, H, W]. + + Returns: + torch.Tensor: The gradient of input features with shape + [num_output_planes, num_input_planes, num_orientations, H, W]. + """ + input, indices = ctx.saved_tensors + grad_in = torch.zeros_like(input) + ext_module.active_rotated_filter_backward(grad_out, indices, grad_in) + return grad_in, None + + +active_rotated_filter = ActiveRotatedFilterFunction.apply diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/assign_score_withk.py b/FoodSeg103/demo/mmcv/mmcv/ops/assign_score_withk.py new file mode 100644 index 0000000000000000000000000000000000000000..deca0892bddc52b51e9d2543a9e893f0bd67ebdb --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/assign_score_withk.py @@ -0,0 +1,131 @@ +from typing import Tuple + +import torch +from torch.autograd import Function + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext( + '_ext', ['assign_score_withk_forward', 'assign_score_withk_backward']) + + +class AssignScoreWithK(Function): + r"""Perform weighted sum to generate output features according to scores. + Modified from `PAConv `_. + + This is a memory-efficient CUDA implementation of assign_scores operation, + which first transform all point features with weight bank, then assemble + neighbor features with ``knn_idx`` and perform weighted sum of ``scores``. + + See the `paper `_ appendix Sec. D for + more detailed descriptions. + + Note: + This implementation assumes using ``neighbor`` kernel input, which is + (point_features - center_features, point_features). + See https://github.com/CVMI-Lab/PAConv/blob/main/scene_seg/model/ + pointnet2/paconv.py#L128 for more details. + """ + + @staticmethod + def forward(ctx, + scores: torch.Tensor, + point_features: torch.Tensor, + center_features: torch.Tensor, + knn_idx: torch.Tensor, + aggregate: str = 'sum') -> torch.Tensor: + """ + Args: + scores (torch.Tensor): (B, npoint, K, M), predicted scores to + aggregate weight matrices in the weight bank. + ``npoint`` is the number of sampled centers. + ``K`` is the number of queried neighbors. + ``M`` is the number of weight matrices in the weight bank. + point_features (torch.Tensor): (B, N, M, out_dim) + Pre-computed point features to be aggregated. + center_features (torch.Tensor): (B, N, M, out_dim) + Pre-computed center features to be aggregated. + knn_idx (torch.Tensor): (B, npoint, K), index of sampled kNN. + We assume the first idx in each row is the idx of the center. + aggregate (str, optional): Aggregation method. + Can be 'sum', 'avg' or 'max'. Defaults: 'sum'. + + Returns: + torch.Tensor: (B, out_dim, npoint, K), the aggregated features. + """ + agg = {'sum': 0, 'avg': 1, 'max': 2} + + B, N, M, out_dim = point_features.size() + _, npoint, K, _ = scores.size() + + output = point_features.new_zeros((B, out_dim, npoint, K)) + ext_module.assign_score_withk_forward( + point_features.contiguous(), + center_features.contiguous(), + scores.contiguous(), + knn_idx.contiguous(), + output, + B=B, + N0=N, + N1=npoint, + M=M, + K=K, + O=out_dim, + aggregate=agg[aggregate]) + + ctx.save_for_backward(output, point_features, center_features, scores, + knn_idx) + ctx.agg = agg[aggregate] + + return output + + @staticmethod + def backward( + ctx, grad_out: torch.Tensor + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, None, None]: + """ + Args: + grad_out (torch.Tensor): (B, out_dim, npoint, K) + + Returns: + tuple[torch.Tensor]: A tuple contains five elements. The first one + is the gradient of ``scores`` whose shape is (B, npoint, K, M). The + second is the gradient of ``point_features`` whose shape is + (B, N, M, out_dim). The third is the gradient of + ``center_features`` with the shape of (B, N, M, out_dim). The last + two are ``None``. + """ + _, point_features, center_features, scores, knn_idx = ctx.saved_tensors + + agg = ctx.agg + + B, N, M, out_dim = point_features.size() + _, npoint, K, _ = scores.size() + + grad_point_features = point_features.new_zeros(point_features.shape) + grad_center_features = center_features.new_zeros(center_features.shape) + grad_scores = scores.new_zeros(scores.shape) + + ext_module.assign_score_withk_backward( + grad_out.contiguous(), + point_features.contiguous(), + center_features.contiguous(), + scores.contiguous(), + knn_idx.contiguous(), + grad_point_features, + grad_center_features, + grad_scores, + B=B, + N0=N, + N1=npoint, + M=M, + K=K, + O=out_dim, + aggregate=agg) + + return grad_scores, grad_point_features, \ + grad_center_features, None, None + + +assign_score_withk = AssignScoreWithK.apply diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/ball_query.py b/FoodSeg103/demo/mmcv/mmcv/ops/ball_query.py new file mode 100644 index 0000000000000000000000000000000000000000..a89b36b52b1cce8ab90274418a4d1346796d971c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/ball_query.py @@ -0,0 +1,87 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional, Tuple + +import torch +from torch.autograd import Function + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext( + '_ext', ['ball_query_forward', 'stack_ball_query_forward']) + + +class BallQuery(Function): + """Find nearby points in spherical space.""" + + @staticmethod + def forward( + ctx, + min_radius: float, + max_radius: float, + sample_num: int, + xyz: torch.Tensor, + center_xyz: torch.Tensor, + xyz_batch_cnt: Optional[torch.Tensor] = None, + center_xyz_batch_cnt: Optional[torch.Tensor] = None + ) -> torch.Tensor: + """ + Args: + min_radius (float): minimum radius of the balls. + max_radius (float): maximum radius of the balls. + sample_num (int): maximum number of features in the balls. + xyz (torch.Tensor): (B, N, 3) xyz coordinates of the features, + or staked input (N1 + N2 ..., 3). + center_xyz (torch.Tensor): (B, npoint, 3) centers of the ball + query, or staked input (M1 + M2 ..., 3). + xyz_batch_cnt: (batch_size): Stacked input xyz coordinates nums in + each batch, just like (N1, N2, ...). Defaults to None. + New in version 1.7.0. + center_xyz_batch_cnt: (batch_size): Stacked centers coordinates + nums in each batch, just line (M1, M2, ...). Defaults to None. + New in version 1.7.0. + + Returns: + torch.Tensor: (B, npoint, nsample) tensor with the indices of the + features that form the query balls. + """ + assert center_xyz.is_contiguous() + assert xyz.is_contiguous() + assert min_radius < max_radius + if xyz_batch_cnt is not None and center_xyz_batch_cnt is not None: + assert xyz_batch_cnt.dtype == torch.int + assert center_xyz_batch_cnt.dtype == torch.int + idx = center_xyz.new_zeros((center_xyz.shape[0], sample_num), + dtype=torch.int32) + ext_module.stack_ball_query_forward( + center_xyz, + center_xyz_batch_cnt, + xyz, + xyz_batch_cnt, + idx, + max_radius=max_radius, + nsample=sample_num, + ) + else: + B, N, _ = xyz.size() + npoint = center_xyz.size(1) + idx = xyz.new_zeros(B, npoint, sample_num, dtype=torch.int32) + ext_module.ball_query_forward( + center_xyz, + xyz, + idx, + b=B, + n=N, + m=npoint, + min_radius=min_radius, + max_radius=max_radius, + nsample=sample_num) + if torch.__version__ != 'parrots': + ctx.mark_non_differentiable(idx) + return idx + + @staticmethod + def backward(ctx, a=None) -> Tuple[None, None, None, None]: + return None, None, None, None + + +ball_query = BallQuery.apply diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/bbox.py b/FoodSeg103/demo/mmcv/mmcv/ops/bbox.py new file mode 100644 index 0000000000000000000000000000000000000000..4583ba7d5a867a86f4a798c524b2c48e9c8f1ae0 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/bbox.py @@ -0,0 +1,126 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext('_ext', ['bbox_overlaps']) + + +def _bbox_overlaps_cpu(bboxes1: torch.Tensor, + bboxes2: torch.Tensor, + mode: str = 'iou', + aligned: bool = False, + offset: int = 0) -> torch.Tensor: + assert mode in ['iou', 'iof'] + + if aligned: + lt = torch.max(bboxes1[:, :2], bboxes2[:, :2]) # [rows, 2] + rb = torch.min(bboxes1[:, 2:], bboxes2[:, 2:]) # [rows, 2] + + wh = (rb - lt + offset).clamp(min=0) # [rows, 2] + overlap = wh[:, 0] * wh[:, 1] + area1 = (bboxes1[:, 2] - bboxes1[:, 0] + offset) * ( + bboxes1[:, 3] - bboxes1[:, 1] + offset) + + if mode == 'iou': + area2 = (bboxes2[:, 2] - bboxes2[:, 0] + offset) * ( + bboxes2[:, 3] - bboxes2[:, 1] + offset) + ious = overlap / (area1 + area2 - overlap) + else: + ious = overlap / area1 + else: + lt = torch.max(bboxes1[:, None, :2], bboxes2[:, :2]) # [rows, cols, 2] + rb = torch.min(bboxes1[:, None, 2:], bboxes2[:, 2:]) # [rows, cols, 2] + + wh = (rb - lt + offset).clamp(min=0) # [rows, cols, 2] + overlap = wh[:, :, 0] * wh[:, :, 1] + area1 = (bboxes1[:, 2] - bboxes1[:, 0] + offset) * ( + bboxes1[:, 3] - bboxes1[:, 1] + offset) + + if mode == 'iou': + area2 = (bboxes2[:, 2] - bboxes2[:, 0] + offset) * ( + bboxes2[:, 3] - bboxes2[:, 1] + offset) + ious = overlap / (area1[:, None] + area2 - overlap) + else: + ious = overlap / (area1[:, None]) + + return ious + + +def bbox_overlaps(bboxes1: torch.Tensor, + bboxes2: torch.Tensor, + mode: str = 'iou', + aligned: bool = False, + offset: int = 0) -> torch.Tensor: + """Calculate overlap between two set of bboxes. + + If ``aligned`` is ``False``, then calculate the ious between each bbox + of bboxes1 and bboxes2, otherwise the ious between each aligned pair of + bboxes1 and bboxes2. + + Args: + bboxes1 (torch.Tensor): shape (m, 4) in format or + empty. + bboxes2 (torch.Tensor): shape (n, 4) in format or + empty. If aligned is ``True``, then m and n must be equal. + mode (str): "iou" (intersection over union) or iof (intersection over + foreground). + + Returns: + torch.Tensor: Return the ious betweens boxes. If ``aligned`` is + ``False``, the shape of ious is (m, n) else (m, 1). + + Example: + >>> bboxes1 = torch.FloatTensor([ + >>> [0, 0, 10, 10], + >>> [10, 10, 20, 20], + >>> [32, 32, 38, 42], + >>> ]) + >>> bboxes2 = torch.FloatTensor([ + >>> [0, 0, 10, 20], + >>> [0, 10, 10, 19], + >>> [10, 10, 20, 20], + >>> ]) + >>> bbox_overlaps(bboxes1, bboxes2) + tensor([[0.5000, 0.0000, 0.0000], + [0.0000, 0.0000, 1.0000], + [0.0000, 0.0000, 0.0000]]) + + Example: + >>> empty = torch.FloatTensor([]) + >>> nonempty = torch.FloatTensor([ + >>> [0, 0, 10, 9], + >>> ]) + >>> assert tuple(bbox_overlaps(empty, nonempty).shape) == (0, 1) + >>> assert tuple(bbox_overlaps(nonempty, empty).shape) == (1, 0) + >>> assert tuple(bbox_overlaps(empty, empty).shape) == (0, 0) + """ + + mode_dict = {'iou': 0, 'iof': 1} + assert mode in mode_dict.keys() + mode_flag = mode_dict[mode] + # Either the boxes are empty or the length of boxes' last dimension is 4 + assert (bboxes1.size(-1) == 4 or bboxes1.size(0) == 0) + assert (bboxes2.size(-1) == 4 or bboxes2.size(0) == 0) + assert offset == 1 or offset == 0 + + rows = bboxes1.size(0) + cols = bboxes2.size(0) + + if aligned: + assert rows == cols + ious = bboxes1.new_zeros(rows) + else: + ious = bboxes1.new_zeros((rows, cols)) + + if rows * cols == 0: + return ious + + if bboxes1.device.type == 'cpu' and torch.__version__ == 'parrots': + return _bbox_overlaps_cpu( + bboxes1, bboxes2, mode=mode, aligned=aligned, offset=offset) + + ext_module.bbox_overlaps( + bboxes1, bboxes2, ious, mode=mode_flag, aligned=aligned, offset=offset) + + return ious diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/bezier_align.py b/FoodSeg103/demo/mmcv/mmcv/ops/bezier_align.py new file mode 100644 index 0000000000000000000000000000000000000000..6db7f5c8d8567b4c6ad5df2eb77f6cf60a4f0bb6 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/bezier_align.py @@ -0,0 +1,137 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Tuple, Union + +import torch +import torch.nn as nn +from torch.autograd import Function +from torch.autograd.function import once_differentiable +from torch.nn.modules.utils import _pair + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext( + '_ext', ['bezier_align_forward', 'bezier_align_backward']) + + +class BezierAlignFunction(Function): + + @staticmethod + def forward(ctx, + input: torch.Tensor, + beziers: torch.Tensor, + output_size: Union[int, Tuple[int, int]], + spatial_scale: Union[int, float] = 1.0, + sampling_ratio: int = 0, + aligned: bool = True) -> torch.Tensor: + ctx.output_size = _pair(output_size) + ctx.spatial_scale = spatial_scale + ctx.input_shape = input.size() + ctx.sampling_ratio = sampling_ratio + ctx.aligned = aligned + + assert beziers.size(1) == 17 + output_shape = (beziers.size(0), input.size(1), ctx.output_size[0], + ctx.output_size[1]) + output = input.new_zeros(output_shape) + ext_module.bezier_align_forward( + input, + beziers, + output, + aligned_height=ctx.output_size[0], + aligned_width=ctx.output_size[1], + spatial_scale=ctx.spatial_scale, + sampling_ratio=ctx.sampling_ratio, + aligned=ctx.aligned) + + ctx.save_for_backward(beziers) + return output + + @staticmethod + @once_differentiable + def backward(ctx, grad_output: torch.Tensor): + beziers = ctx.saved_tensors[0] + grad_input = grad_output.new_zeros(ctx.input_shape) + grad_output = grad_output.contiguous() + ext_module.bezier_align_backward( + grad_output, + beziers, + grad_input, + aligned_height=ctx.output_size[0], + aligned_width=ctx.output_size[1], + spatial_scale=ctx.spatial_scale, + sampling_ratio=ctx.sampling_ratio, + aligned=ctx.aligned) + return grad_input, None, None, None, None, None + + +bezier_align = BezierAlignFunction.apply + + +class BezierAlign(nn.Module): + """Bezier align pooling layer. + + Args: + output_size (tuple): h, w + spatial_scale (float): scale the input boxes by this number + sampling_ratio (int): number of inputs samples to take for each + output sample. 0 to take samples densely for current models. + aligned (bool): if False, use the legacy implementation in + MMDetection. If True, align the results more perfectly. + + Note: + The implementation of BezierAlign is modified from + https://github.com/aim-uofa/AdelaiDet + + The meaning of aligned=True: + + Given a continuous coordinate c, its two neighboring pixel + indices (in our pixel model) are computed by floor(c - 0.5) and + ceil(c - 0.5). For example, c=1.3 has pixel neighbors with discrete + indices [0] and [1] (which are sampled from the underlying signal + at continuous coordinates 0.5 and 1.5). But the original roi_align + (aligned=False) does not subtract the 0.5 when computing + neighboring pixel indices and therefore it uses pixels with a + slightly incorrect alignment (relative to our pixel model) when + performing bilinear interpolation. + + With `aligned=True`, + we first appropriately scale the ROI and then shift it by -0.5 + prior to calling roi_align. This produces the correct neighbors; + + The difference does not make a difference to the model's + performance if ROIAlign is used together with conv layers. + """ + + def __init__( + self, + output_size: Tuple, + spatial_scale: Union[int, float], + sampling_ratio: int, + aligned: bool = True, + ) -> None: + super().__init__() + + self.output_size = _pair(output_size) + self.spatial_scale = float(spatial_scale) + self.sampling_ratio = int(sampling_ratio) + self.aligned = aligned + + def forward(self, input: torch.Tensor, + beziers: torch.Tensor) -> torch.Tensor: + """BezierAlign forward. + + Args: + inputs (Tensor): input features. + beziers (Tensor): beziers for align. + """ + return bezier_align(input, beziers, self.output_size, + self.spatial_scale, self.sampling_ratio, + self.aligned) + + def __repr__(self): + s = self.__class__.__name__ + s += f'(output_size={self.output_size}, ' + s += f'spatial_scale={self.spatial_scale})' + s += f'sampling_ratio={self.sampling_ratio})' + s += f'aligned={self.aligned})' + return s diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/bias_act.py b/FoodSeg103/demo/mmcv/mmcv/ops/bias_act.py new file mode 100644 index 0000000000000000000000000000000000000000..3dfa55743e0a0a6e8ad408c5937d9097cce6ea7d --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/bias_act.py @@ -0,0 +1,375 @@ +# Modified from +# https://github.com/NVlabs/stylegan3/blob/main/torch_utils/ops/bias_act.py + +# Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# NVIDIA CORPORATION and its licensors retain all intellectual property +# and proprietary rights in and to this software, related documentation +# and any modifications thereto. Any use, reproduction, disclosure or +# distribution of this software and related documentation without an express +# license agreement from NVIDIA CORPORATION is strictly prohibited. + +# source: https://github.com/open-mmlab/mmediting/blob/dev-1.x/mmedit/models/editors/stylegan3/stylegan3_ops/ops/bias_act.py # noqa +"""Custom PyTorch ops for efficient bias and activation.""" + +from typing import Any, Dict, Optional, Union + +import numpy as np +import torch + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext('_ext', ['bias_act']) + + +class EasyDict(dict): + """Convenience class that behaves like a dict but allows access with the + attribute syntax.""" + + def __getattr__(self, name: str) -> Any: + try: + return self[name] + except KeyError: + raise AttributeError(name) + + def __setattr__(self, name: str, value: Any) -> None: + self[name] = value + + def __delattr__(self, name: str) -> None: + del self[name] + + +activation_funcs = { + 'linear': + EasyDict( + func=lambda x, **_: x, + def_alpha=0, + def_gain=1, + cuda_idx=1, + ref='', + has_2nd_grad=False), + 'relu': + EasyDict( + func=lambda x, **_: torch.nn.functional.relu(x), + def_alpha=0, + def_gain=np.sqrt(2), + cuda_idx=2, + ref='y', + has_2nd_grad=False), + 'lrelu': + EasyDict( + func=lambda x, alpha, **_: torch.nn.functional.leaky_relu(x, alpha), + def_alpha=0.2, + def_gain=np.sqrt(2), + cuda_idx=3, + ref='y', + has_2nd_grad=False), + 'tanh': + EasyDict( + func=lambda x, **_: torch.tanh(x), + def_alpha=0, + def_gain=1, + cuda_idx=4, + ref='y', + has_2nd_grad=True), + 'sigmoid': + EasyDict( + func=lambda x, **_: torch.sigmoid(x), + def_alpha=0, + def_gain=1, + cuda_idx=5, + ref='y', + has_2nd_grad=True), + 'elu': + EasyDict( + func=lambda x, **_: torch.nn.functional.elu(x), + def_alpha=0, + def_gain=1, + cuda_idx=6, + ref='y', + has_2nd_grad=True), + 'selu': + EasyDict( + func=lambda x, **_: torch.nn.functional.selu(x), + def_alpha=0, + def_gain=1, + cuda_idx=7, + ref='y', + has_2nd_grad=True), + 'softplus': + EasyDict( + func=lambda x, **_: torch.nn.functional.softplus(x), + def_alpha=0, + def_gain=1, + cuda_idx=8, + ref='y', + has_2nd_grad=True), + 'swish': + EasyDict( + func=lambda x, **_: torch.sigmoid(x) * x, + def_alpha=0, + def_gain=np.sqrt(2), + cuda_idx=9, + ref='x', + has_2nd_grad=True), +} + +_null_tensor = torch.empty([0]) + + +def bias_act(input: torch.Tensor, + bias: Optional[torch.Tensor] = None, + dim: int = 1, + act: str = 'linear', + alpha: Optional[Union[float, int]] = None, + gain: Optional[float] = None, + clamp: Optional[float] = None, + use_custom_op: bool = True): + r"""Fused bias and activation function. + + Adds `bias` to activation tensor `input`, and evaluates activation + function `act`, and scales the result by `gain`. Each of the steps is + optional. + + In most cases, the fused op is considerably more efficient than performing + the same calculation using standard PyTorch ops. It supports first and + second order gradients, but not third order gradients. + + Args: + input (torch.Tensor): Input activation tensor. Can be of any shape. + bias (torch.Tensor): Bias vector, or `None` to disable. + Must be a 1D tensor of the same type as `input`. The shape must + be known, and it must match the dimension of `input` corresponding + to `dim`. Defaults to None. + dim (int): The dimension in `input` corresponding to the elements of + `bias`. The value of `dim` is ignored if `b` is not specified. + Defaults to 1. + act (str): Name of the activation function to evaluate, or `"linear"` + to disable. Can be e.g. "relu", "lrelu", "tanh", "sigmoid", + "swish", etc. See `activation_funcs` for a full list. `None` is not + allowed. Defaults to `linear`. + alpha (float or int): Shape parameter for the activation + function, or `None` to use the default. Defaults to None. + gain (float): Scaling factor for the output tensor, or `None` + to use default. See `activation_funcs` for the default scaling of + each activation function. If unsure, consider specifying 1. + Defaults to None. + clamp (float): Clamp the output values to `[-clamp, +clamp]`, + or `None` to disable the clamping (default). Defaults to None. + use_custom_op (bool): Whether to use customized op. + Defaults to True. + + Returns: + torch.Tensor: Tensor of the same shape and datatype as `input`. + """ + assert isinstance(input, torch.Tensor) + if use_custom_op and input.is_cuda: + return _bias_act_cuda( + dim=dim, act=act, alpha=alpha, gain=gain, + clamp=clamp).apply(input, bias) + return _bias_act_ref( + input=input, + bias=bias, + dim=dim, + act=act, + alpha=alpha, + gain=gain, + clamp=clamp) + + +def _bias_act_ref(input: torch.Tensor, + bias: Optional[torch.Tensor] = None, + dim: int = 1, + act: str = 'linear', + alpha: Optional[Union[float, int]] = None, + gain: Optional[float] = None, + clamp: Optional[float] = None): + """Slow reference implementation of `bias_act()` using standard PyTorch + ops. + + Adds `bias` to activation tensor `input`, and evaluates activation + function `act`, and scales the result by `gain`. Each of the steps is + optional. + + In most cases, the fused op is considerably more efficient than performing + the same calculation using standard PyTorch ops. It supports first and + second order gradients, but not third order gradients. + + Args: + input (torch.Tensor): Input activation tensor. Can be of any shape. + bias (torch.Tensor): Bias vector, or `None` to disable. + Must be a 1D tensor of the same type as `input`. The shape must + be known, and it must match the dimension of `input` corresponding + to `dim`. Defaults to None. + dim (int): The dimension in `input` corresponding to the elements of + `bias`. The value of `dim` is ignored if `b` is not specified. + Defaults to 1. + act (str): Name of the activation function to evaluate, or `"linear"` + to disable. Can be e.g. "relu", "lrelu", "tanh", "sigmoid", + "swish", etc. See `activation_funcs` for a full list. `None` is not + allowed. Defaults to `linear`. + alpha (float or int): Shape parameter for the activation + function, or `None` to use the default. Defaults to None. + gain (float): Scaling factor for the output tensor, or `None` + to use default. See `activation_funcs` for the default scaling of + each activation function. If unsure, consider specifying 1. + Defaults to None. + clamp (float): Clamp the output values to + `[-clamp, +clamp]`, or `None` to disable the clamping (default). + Defaults to None. + + Returns: + torch.Tensor: Tensor of the same shape and datatype as `input`. + """ + assert isinstance(input, torch.Tensor) + assert clamp is None or clamp >= 0 + spec = activation_funcs[act] + alpha = float(alpha if alpha is not None else spec.def_alpha) + gain = float(gain if gain is not None else spec.def_gain) + clamp = float(clamp if clamp is not None else -1) + + # Add bias. + if bias is not None: + assert isinstance(bias, torch.Tensor) and bias.ndim == 1 + assert 0 <= dim < input.ndim + assert bias.shape[0] == input.shape[dim] + input = input + bias.reshape( + [-1 if i == dim else 1 for i in range(input.ndim)]) + + # Evaluate activation function. + alpha = float(alpha) + output = spec.func(input, alpha=alpha) + + # Scale by gain. + gain = float(gain) + if gain != 1: + output = output * gain + + # Clamp. + if clamp >= 0: + # pylint: disable=invalid-unary-operand-type + output = output.clamp(-clamp, clamp) + return output + + +_bias_act_cuda_cache: Dict = dict() + + +def _bias_act_cuda(dim: int = 1, + act: str = 'linear', + alpha: Optional[Union[float, int]] = None, + gain: Optional[float] = None, + clamp: Optional[float] = None): + """"Fast CUDA implementation of `bias_act()` using custom ops. + + Args: + dim (int): The dimension in `x` corresponding to the elements of `b`. + The value of `dim` is ignored if `b` is not specified. + Defaults to 1. + act (str): Name of the activation function to evaluate, or `"linear"` + to disable. Can be e.g. "relu", "lrelu", "tanh", "sigmoid", + "swish", etc. See `activation_funcs` for a full list. `None` is not + allowed. Defaults to `linear`. + alpha (float | int): Shape parameter for the activation + function, or `None` to use the default. Defaults to None. + gain (float): Scaling factor for the output tensor, or `None` + to use default. See `activation_funcs` for the default scaling of + each activation function. If unsure, consider specifying 1. + Defaults to None. + clamp (float): Clamp the output values to `[-clamp, +clamp]`, + or `None` to disable the clamping (default). Defaults to None. + + Returns: + torch.Tensor: Tensor of the same shape and datatype as `x`. + """ + # Parse arguments. + assert clamp is None or clamp >= 0 + spec = activation_funcs[act] + alpha = float(alpha if alpha is not None else spec.def_alpha) + gain = float(gain if gain is not None else spec.def_gain) + clamp = float(clamp if clamp is not None else -1) + + # Lookup from cache. + key = (dim, act, alpha, gain, clamp) + if key in _bias_act_cuda_cache: + return _bias_act_cuda_cache[key] + + # Forward op. + class BiasActCuda(torch.autograd.Function): + + @staticmethod + def forward(ctx, x, b): # pylint: disable=arguments-differ + ctx.memory_format = torch.channels_last if x.ndim > 2 and x.stride( + 1) == 1 else torch.contiguous_format + x = x.contiguous(memory_format=ctx.memory_format) + b = b.contiguous() if b is not None else _null_tensor.to(x.device) + y = x + if act != 'linear' or gain != 1 or clamp >= 0 or ( + b is not _null_tensor.to(x.device)): + y = ext_module.bias_act(x, b, _null_tensor.to(x.device), + _null_tensor.to(x.device), + _null_tensor.to(x.device), 0, dim, + spec.cuda_idx, alpha, gain, clamp) + ctx.save_for_backward( + x if 'x' in spec.ref or spec.has_2nd_grad else _null_tensor.to( + x.device), b if 'x' in spec.ref or spec.has_2nd_grad else + _null_tensor.to(x.device), + y if 'y' in spec.ref else _null_tensor.to(x.device)) + return y + + @staticmethod + def backward(ctx, dy): # pylint: disable=arguments-differ + dy = dy.contiguous(memory_format=ctx.memory_format) + x, b, y = ctx.saved_tensors + dx = None + db = None + + if ctx.needs_input_grad[0] or ctx.needs_input_grad[1]: + dx = dy + if act != 'linear' or gain != 1 or clamp >= 0: + dx = BiasActCudaGrad.apply(dy, x, b, y) + + if ctx.needs_input_grad[1]: + db = dx.sum([i for i in range(dx.ndim) if i != dim]) + + return dx, db + + # Backward op. + class BiasActCudaGrad(torch.autograd.Function): + + @staticmethod + def forward(ctx, dy, x, b, y): # pylint: disable=arguments-differ + ctx.memory_format = torch.channels_last if dy.ndim > 2 and ( + dy.stride(1) == 1) else torch.contiguous_format + dx = ext_module.bias_act(dy, b, x, y, _null_tensor.to(x.device), 1, + dim, spec.cuda_idx, alpha, gain, clamp) + ctx.save_for_backward( + dy if spec.has_2nd_grad else _null_tensor.to(x.device), x, b, + y) + return dx + + @staticmethod + def backward(ctx, d_dx): # pylint: disable=arguments-differ + d_dx = d_dx.contiguous(memory_format=ctx.memory_format) + dy, x, b, y = ctx.saved_tensors + d_dy = None + d_x = None + d_b = None + d_y = None + + if ctx.needs_input_grad[0]: + d_dy = BiasActCudaGrad.apply(d_dx, x, b, y) + + if spec.has_2nd_grad and (ctx.needs_input_grad[1] + or ctx.needs_input_grad[2]): + d_x = ext_module.bias_act(d_dx, b, x, y, dy, 2, dim, + spec.cuda_idx, alpha, gain, clamp) + + if spec.has_2nd_grad and ctx.needs_input_grad[2]: + d_b = d_x.sum([i for i in range(d_x.ndim) if i != dim]) + + return d_dy, d_x, d_b, d_y + + # Add to cache. + _bias_act_cuda_cache[key] = BiasActCuda + return BiasActCuda diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/border_align.py b/FoodSeg103/demo/mmcv/mmcv/ops/border_align.py new file mode 100644 index 0000000000000000000000000000000000000000..c09501b962cfce10b1da87e6b651d61911eb8406 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/border_align.py @@ -0,0 +1,114 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# modified from +# https://github.com/Megvii-BaseDetection/cvpods/blob/master/cvpods/layers/border_align.py + +from typing import Tuple + +import torch +import torch.nn as nn +from torch.autograd import Function +from torch.autograd.function import once_differentiable + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext( + '_ext', ['border_align_forward', 'border_align_backward']) + + +class BorderAlignFunction(Function): + + @staticmethod + def symbolic(g, input, boxes, pool_size): + return g.op( + 'mmcv::MMCVBorderAlign', input, boxes, pool_size_i=pool_size) + + @staticmethod + def forward(ctx, input: torch.Tensor, boxes: torch.Tensor, + pool_size: int) -> torch.Tensor: + ctx.pool_size = pool_size + ctx.input_shape = input.size() + + assert boxes.ndim == 3, 'boxes must be with shape [B, H*W, 4]' + assert boxes.size(2) == 4, \ + 'the last dimension of boxes must be (x1, y1, x2, y2)' + assert input.size(1) % 4 == 0, \ + 'the channel for input feature must be divisible by factor 4' + + # [B, C//4, H*W, 4] + output_shape = (input.size(0), input.size(1) // 4, boxes.size(1), 4) + output = input.new_zeros(output_shape) + # `argmax_idx` only used for backward + argmax_idx = input.new_zeros(output_shape).to(torch.int) + + ext_module.border_align_forward( + input, boxes, output, argmax_idx, pool_size=ctx.pool_size) + + ctx.save_for_backward(boxes, argmax_idx) + return output + + @staticmethod + @once_differentiable + def backward(ctx, + grad_output: torch.Tensor) -> Tuple[torch.Tensor, None, None]: + boxes, argmax_idx = ctx.saved_tensors + grad_input = grad_output.new_zeros(ctx.input_shape) + # complex head architecture may cause grad_output uncontiguous + grad_output = grad_output.contiguous() + ext_module.border_align_backward( + grad_output, + boxes, + argmax_idx, + grad_input, + pool_size=ctx.pool_size) + return grad_input, None, None + + +border_align = BorderAlignFunction.apply + + +class BorderAlign(nn.Module): + r"""Border align pooling layer. + + Applies border_align over the input feature based on predicted bboxes. + The details were described in the paper + `BorderDet: Border Feature for Dense Object Detection + `_. + + For each border line (e.g. top, left, bottom or right) of each box, + border_align does the following: + + 1. uniformly samples ``pool_size`` +1 positions on this line, involving + the start and end points. + 2. the corresponding features on these points are computed by bilinear + interpolation. + 3. max pooling over all the ``pool_size`` +1 positions are used for + computing pooled feature. + + Args: + pool_size (int): number of positions sampled over the boxes' borders + (e.g. top, bottom, left, right). + """ + + def __init__(self, pool_size: int): + super().__init__() + self.pool_size = pool_size + + def forward(self, input: torch.Tensor, + boxes: torch.Tensor) -> torch.Tensor: + """ + Args: + input: Features with shape [N,4C,H,W]. Channels ranged in [0,C), + [C,2C), [2C,3C), [3C,4C) represent the top, left, bottom, + right features respectively. + boxes: Boxes with shape [N,H*W,4]. Coordinate format (x1,y1,x2,y2). + + Returns: + torch.Tensor: Pooled features with shape [N,C,H*W,4]. The order is + (top,left,bottom,right) for the last dimension. + """ + return border_align(input, boxes, self.pool_size) + + def __repr__(self): + s = self.__class__.__name__ + s += f'(pool_size={self.pool_size})' + return s diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/box_iou_quadri.py b/FoodSeg103/demo/mmcv/mmcv/ops/box_iou_quadri.py new file mode 100644 index 0000000000000000000000000000000000000000..89747fdf1f03e0491351f876385ba3c1369ebaf7 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/box_iou_quadri.py @@ -0,0 +1,49 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext('_ext', ['box_iou_quadri']) + + +def box_iou_quadri(bboxes1: torch.Tensor, + bboxes2: torch.Tensor, + mode: str = 'iou', + aligned: bool = False) -> torch.Tensor: + """Return intersection-over-union (Jaccard index) of boxes. + + Both sets of boxes are expected to be in + (x1, y1, ..., x4, y4) format. + + If ``aligned`` is ``False``, then calculate the ious between each bbox + of bboxes1 and bboxes2, otherwise the ious between each aligned pair of + bboxes1 and bboxes2. + + Args: + bboxes1 (torch.Tensor): quadrilateral bboxes 1. It has shape (N, 8), + indicating (x1, y1, ..., x4, y4) for each row. + bboxes2 (torch.Tensor): quadrilateral bboxes 2. It has shape (M, 8), + indicating (x1, y1, ..., x4, y4) for each row. + mode (str): "iou" (intersection over union) or iof (intersection over + foreground). + + Returns: + torch.Tensor: Return the ious betweens boxes. If ``aligned`` is + ``False``, the shape of ious is (N, M) else (N,). + """ + assert mode in ['iou', 'iof'] + mode_dict = {'iou': 0, 'iof': 1} + mode_flag = mode_dict[mode] + rows = bboxes1.size(0) + cols = bboxes2.size(0) + if aligned: + ious = bboxes1.new_zeros(rows) + else: + ious = bboxes1.new_zeros(rows * cols) + bboxes1 = bboxes1.contiguous() + bboxes2 = bboxes2.contiguous() + ext_module.box_iou_quadri( + bboxes1, bboxes2, ious, mode_flag=mode_flag, aligned=aligned) + if not aligned: + ious = ious.view(rows, cols) + return ious diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/box_iou_rotated.py b/FoodSeg103/demo/mmcv/mmcv/ops/box_iou_rotated.py new file mode 100644 index 0000000000000000000000000000000000000000..a811531d4283f37cab80ae06af35d8d223d4b949 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/box_iou_rotated.py @@ -0,0 +1,156 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext('_ext', ['box_iou_rotated']) + + +def box_iou_rotated(bboxes1: torch.Tensor, + bboxes2: torch.Tensor, + mode: str = 'iou', + aligned: bool = False, + clockwise: bool = True) -> torch.Tensor: + """Return intersection-over-union (Jaccard index) of boxes. + + Both sets of boxes are expected to be in + (x_center, y_center, width, height, angle) format. + + If ``aligned`` is ``False``, then calculate the ious between each bbox + of bboxes1 and bboxes2, otherwise the ious between each aligned pair of + bboxes1 and bboxes2. + + .. note:: + The operator assumes: + + 1) The positive direction along x axis is left -> right. + + 2) The positive direction along y axis is top -> down. + + 3) The w border is in parallel with x axis when angle = 0. + + However, there are 2 opposite definitions of the positive angular + direction, clockwise (CW) and counter-clockwise (CCW). MMCV supports + both definitions and uses CW by default. + + Please set ``clockwise=False`` if you are using the CCW definition. + + The coordinate system when ``clockwise`` is ``True`` (default) + + .. code-block:: none + + 0-------------------> x (0 rad) + | A-------------B + | | | + | | box h + | | angle=0 | + | D------w------C + v + y (pi/2 rad) + + In such coordination system the rotation matrix is + + .. math:: + \\begin{pmatrix} + \\cos\\alpha & -\\sin\\alpha \\\\ + \\sin\\alpha & \\cos\\alpha + \\end{pmatrix} + + The coordinates of the corner point A can be calculated as: + + .. math:: + P_A= + \\begin{pmatrix} x_A \\\\ y_A\\end{pmatrix} + = + \\begin{pmatrix} x_{center} \\\\ y_{center}\\end{pmatrix} + + \\begin{pmatrix}\\cos\\alpha & -\\sin\\alpha \\\\ + \\sin\\alpha & \\cos\\alpha\\end{pmatrix} + \\begin{pmatrix} -0.5w \\\\ -0.5h\\end{pmatrix} \\\\ + = + \\begin{pmatrix} x_{center}-0.5w\\cos\\alpha+0.5h\\sin\\alpha + \\\\ + y_{center}-0.5w\\sin\\alpha-0.5h\\cos\\alpha\\end{pmatrix} + + + The coordinate system when ``clockwise`` is ``False`` + + .. code-block:: none + + 0-------------------> x (0 rad) + | A-------------B + | | | + | | box h + | | angle=0 | + | D------w------C + v + y (-pi/2 rad) + + In such coordination system the rotation matrix is + + .. math:: + \\begin{pmatrix} + \\cos\\alpha & \\sin\\alpha \\\\ + -\\sin\\alpha & \\cos\\alpha + \\end{pmatrix} + + The coordinates of the corner point A can be calculated as: + + .. math:: + P_A= + \\begin{pmatrix} x_A \\\\ y_A\\end{pmatrix} + = + \\begin{pmatrix} x_{center} \\\\ y_{center}\\end{pmatrix} + + \\begin{pmatrix}\\cos\\alpha & \\sin\\alpha \\\\ + -\\sin\\alpha & \\cos\\alpha\\end{pmatrix} + \\begin{pmatrix} -0.5w \\\\ -0.5h\\end{pmatrix} \\\\ + = + \\begin{pmatrix} x_{center}-0.5w\\cos\\alpha-0.5h\\sin\\alpha + \\\\ + y_{center}+0.5w\\sin\\alpha-0.5h\\cos\\alpha\\end{pmatrix} + + Args: + boxes1 (torch.Tensor): rotated bboxes 1. It has shape (N, 5), + indicating (x, y, w, h, theta) for each row. Note that theta is in + radian. + boxes2 (torch.Tensor): rotated bboxes 2. It has shape (M, 5), + indicating (x, y, w, h, theta) for each row. Note that theta is in + radian. + mode (str): "iou" (intersection over union) or iof (intersection over + foreground). + clockwise (bool): flag indicating whether the positive angular + orientation is clockwise. default True. + `New in version 1.4.3.` + + Returns: + torch.Tensor: Return the ious betweens boxes. If ``aligned`` is + ``False``, the shape of ious is (N, M) else (N,). + """ + assert mode in ['iou', 'iof'] + mode_dict = {'iou': 0, 'iof': 1} + mode_flag = mode_dict[mode] + rows = bboxes1.size(0) + cols = bboxes2.size(0) + if aligned: + ious = bboxes1.new_zeros(rows) + else: + if bboxes1.device.type == 'mlu': + ious = bboxes1.new_zeros([rows, cols]) + else: + ious = bboxes1.new_zeros(rows * cols) + if not clockwise: + flip_mat = bboxes1.new_ones(bboxes1.shape[-1]) + flip_mat[-1] = -1 + bboxes1 = bboxes1 * flip_mat + bboxes2 = bboxes2 * flip_mat + if bboxes1.device.type == 'npu': + scale_mat = bboxes1.new_ones(bboxes1.shape[-1]) + scale_mat[-1] = 1.0 / 0.01745329252 + bboxes1 = bboxes1 * scale_mat + bboxes2 = bboxes2 * scale_mat + bboxes1 = bboxes1.contiguous() + bboxes2 = bboxes2.contiguous() + ext_module.box_iou_rotated( + bboxes1, bboxes2, ious, mode_flag=mode_flag, aligned=aligned) + if not aligned: + ious = ious.view(rows, cols) + return ious diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/carafe.py b/FoodSeg103/demo/mmcv/mmcv/ops/carafe.py new file mode 100644 index 0000000000000000000000000000000000000000..f7e79c275e2bea62ce7e08fb6e6e4629c7565600 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/carafe.py @@ -0,0 +1,300 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.model import normal_init, xavier_init +from mmengine.registry import MODELS +from torch import Tensor +from torch.autograd import Function +from torch.nn.modules.module import Module + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext('_ext', [ + 'carafe_naive_forward', 'carafe_naive_backward', 'carafe_forward', + 'carafe_backward' +]) + + +class CARAFENaiveFunction(Function): + + @staticmethod + def symbolic(g, features: Tensor, masks: Tensor, kernel_size: int, + group_size: int, scale_factor: int) -> Tensor: + return g.op( + 'mmcv::MMCVCARAFENaive', + features, + masks, + kernel_size_i=kernel_size, + group_size_i=group_size, + scale_factor_f=scale_factor) + + @staticmethod + def forward(ctx, features: Tensor, masks: Tensor, kernel_size: int, + group_size: int, scale_factor: int) -> Tensor: + assert scale_factor >= 1 + assert masks.size(1) == kernel_size * kernel_size * group_size + assert masks.size(-1) == features.size(-1) * scale_factor + assert masks.size(-2) == features.size(-2) * scale_factor + assert features.size(1) % group_size == 0 + assert (kernel_size - 1) % 2 == 0 and kernel_size >= 1 + ctx.kernel_size = kernel_size + ctx.group_size = group_size + ctx.scale_factor = scale_factor + ctx.feature_size = features.size() + ctx.mask_size = masks.size() + + n, c, h, w = features.size() + output = features.new_zeros((n, c, h * scale_factor, w * scale_factor)) + ext_module.carafe_naive_forward( + features, + masks, + output, + kernel_size=kernel_size, + group_size=group_size, + scale_factor=scale_factor) + + if features.requires_grad or masks.requires_grad or \ + torch.__version__ == 'parrots': + ctx.save_for_backward(features, masks) + return output + + @staticmethod + def backward( + ctx, + grad_output: Tensor) -> Tuple[Tensor, Tensor, None, None, None]: + assert grad_output.is_cuda + + features, masks = ctx.saved_tensors + kernel_size = ctx.kernel_size + group_size = ctx.group_size + scale_factor = ctx.scale_factor + + grad_input = torch.zeros_like(features) + grad_masks = torch.zeros_like(masks) + ext_module.carafe_naive_backward( + grad_output.contiguous(), + features, + masks, + grad_input, + grad_masks, + kernel_size=kernel_size, + group_size=group_size, + scale_factor=scale_factor) + + return grad_input, grad_masks, None, None, None + + +carafe_naive = CARAFENaiveFunction.apply + + +class CARAFENaive(Module): + + def __init__(self, kernel_size: int, group_size: int, scale_factor: int): + super().__init__() + + assert isinstance(kernel_size, int) and isinstance( + group_size, int) and isinstance(scale_factor, int) + self.kernel_size = kernel_size + self.group_size = group_size + self.scale_factor = scale_factor + + def forward(self, features: Tensor, masks: Tensor) -> Tensor: + return carafe_naive(features, masks, self.kernel_size, self.group_size, + self.scale_factor) + + +class CARAFEFunction(Function): + + @staticmethod + def symbolic(g, features: Tensor, masks: Tensor, kernel_size: int, + group_size: int, scale_factor: int) -> Tensor: + return g.op( + 'mmcv::MMCVCARAFE', + features, + masks, + kernel_size_i=kernel_size, + group_size_i=group_size, + scale_factor_f=scale_factor) + + @staticmethod + def forward(ctx, features: Tensor, masks: Tensor, kernel_size: int, + group_size: int, scale_factor: int) -> Tensor: + assert scale_factor >= 1 + assert masks.size(1) == kernel_size * kernel_size * group_size + assert masks.size(-1) == features.size(-1) * scale_factor + assert masks.size(-2) == features.size(-2) * scale_factor + assert features.size(1) % group_size == 0 + assert (kernel_size - 1) % 2 == 0 and kernel_size >= 1 + ctx.kernel_size = kernel_size + ctx.group_size = group_size + ctx.scale_factor = scale_factor + ctx.feature_size = features.size() + ctx.mask_size = masks.size() + + n, c, h, w = features.size() + output = features.new_zeros((n, c, h * scale_factor, w * scale_factor)) + routput = features.new_zeros(output.size(), requires_grad=False) + rfeatures = features.new_zeros(features.size(), requires_grad=False) + rmasks = masks.new_zeros(masks.size(), requires_grad=False) + ext_module.carafe_forward( + features, + masks, + rfeatures, + routput, + rmasks, + output, + kernel_size=kernel_size, + group_size=group_size, + scale_factor=scale_factor) + + if features.requires_grad or masks.requires_grad or \ + torch.__version__ == 'parrots': + ctx.save_for_backward(features, masks, rfeatures) + return output + + @staticmethod + def backward( + ctx, + grad_output: Tensor) -> Tuple[Tensor, Tensor, None, None, None]: + features, masks, rfeatures = ctx.saved_tensors + kernel_size = ctx.kernel_size + group_size = ctx.group_size + scale_factor = ctx.scale_factor + + rgrad_output = torch.zeros_like(grad_output, requires_grad=False) + rgrad_input_hs = torch.zeros_like(grad_output, requires_grad=False) + rgrad_input = torch.zeros_like(features, requires_grad=False) + rgrad_masks = torch.zeros_like(masks, requires_grad=False) + grad_input = torch.zeros_like(features, requires_grad=False) + grad_masks = torch.zeros_like(masks, requires_grad=False) + ext_module.carafe_backward( + grad_output.contiguous(), + rfeatures, + masks, + rgrad_output, + rgrad_input_hs, + rgrad_input, + rgrad_masks, + grad_input, + grad_masks, + kernel_size=kernel_size, + group_size=group_size, + scale_factor=scale_factor) + return grad_input, grad_masks, None, None, None + + +carafe = CARAFEFunction.apply + + +class CARAFE(Module): + """ CARAFE: Content-Aware ReAssembly of FEatures + + Please refer to `CARAFE: Content-Aware ReAssembly of FEatures + `_ for more details. + + Args: + kernel_size (int): reassemble kernel size + group_size (int): reassemble group size + scale_factor (int): upsample ratio + + Returns: + upsampled feature map + """ + + def __init__(self, kernel_size: int, group_size: int, scale_factor: int): + super().__init__() + + assert isinstance(kernel_size, int) and isinstance( + group_size, int) and isinstance(scale_factor, int) + self.kernel_size = kernel_size + self.group_size = group_size + self.scale_factor = scale_factor + + def forward(self, features: Tensor, masks: Tensor) -> Tensor: + return carafe(features, masks, self.kernel_size, self.group_size, + self.scale_factor) + + +@MODELS.register_module(name='carafe') +class CARAFEPack(nn.Module): + """A unified package of CARAFE upsampler that contains: 1) channel + compressor 2) content encoder 3) CARAFE op. + + Official implementation of ICCV 2019 paper + `CARAFE: Content-Aware ReAssembly of FEatures + `_. + + Args: + channels (int): input feature channels + scale_factor (int): upsample ratio + up_kernel (int): kernel size of CARAFE op + up_group (int): group size of CARAFE op + encoder_kernel (int): kernel size of content encoder + encoder_dilation (int): dilation of content encoder + compressed_channels (int): output channels of channels compressor + + Returns: + upsampled feature map + """ + + def __init__(self, + channels: int, + scale_factor: int, + up_kernel: int = 5, + up_group: int = 1, + encoder_kernel: int = 3, + encoder_dilation: int = 1, + compressed_channels: int = 64): + super().__init__() + self.channels = channels + self.scale_factor = scale_factor + self.up_kernel = up_kernel + self.up_group = up_group + self.encoder_kernel = encoder_kernel + self.encoder_dilation = encoder_dilation + self.compressed_channels = compressed_channels + self.channel_compressor = nn.Conv2d(channels, self.compressed_channels, + 1) + self.content_encoder = nn.Conv2d( + self.compressed_channels, + self.up_kernel * self.up_kernel * self.up_group * + self.scale_factor * self.scale_factor, + self.encoder_kernel, + padding=int((self.encoder_kernel - 1) * self.encoder_dilation / 2), + dilation=self.encoder_dilation, + groups=1) + self.init_weights() + + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + xavier_init(m, distribution='uniform') + normal_init(self.content_encoder, std=0.001) + + def kernel_normalizer(self, mask: Tensor) -> Tensor: + mask = F.pixel_shuffle(mask, self.scale_factor) + n, mask_c, h, w = mask.size() + # use float division explicitly, + # to void inconsistency while exporting to onnx + mask_channel = int(mask_c / float(self.up_kernel**2)) + mask = mask.view(n, mask_channel, -1, h, w) + + mask = F.softmax(mask, dim=2, dtype=mask.dtype) + mask = mask.view(n, mask_c, h, w).contiguous() + + return mask + + def feature_reassemble(self, x: Tensor, mask: Tensor) -> Tensor: + x = carafe(x, mask, self.up_kernel, self.up_group, self.scale_factor) + return x + + def forward(self, x: Tensor) -> Tensor: + compressed_x = self.channel_compressor(x) + mask = self.content_encoder(compressed_x) + mask = self.kernel_normalizer(mask) + + x = self.feature_reassemble(x, mask) + return x diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/cc_attention.py b/FoodSeg103/demo/mmcv/mmcv/ops/cc_attention.py new file mode 100644 index 0000000000000000000000000000000000000000..efde7b703c8c50ecf5aa604e756422f0be488759 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/cc_attention.py @@ -0,0 +1,85 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.registry import MODELS + +from mmcv.cnn import Scale + + +def NEG_INF_DIAG(n: int, device: torch.device) -> torch.Tensor: + """Returns a diagonal matrix of size [n, n]. + + The diagonal are all "-inf". This is for avoiding calculating the + overlapped element in the Criss-Cross twice. + """ + return torch.diag(torch.tensor(float('-inf')).to(device).repeat(n), 0) + + +@MODELS.register_module() +class CrissCrossAttention(nn.Module): + """Criss-Cross Attention Module. + + .. note:: + Before v1.3.13, we use a CUDA op. Since v1.3.13, we switch + to a pure PyTorch and equivalent implementation. For more + details, please refer to https://github.com/open-mmlab/mmcv/pull/1201. + + Speed comparison for one forward pass + + - Input size: [2,512,97,97] + - Device: 1 NVIDIA GeForce RTX 2080 Ti + + +-----------------------+---------------+------------+---------------+ + | |PyTorch version|CUDA version|Relative speed | + +=======================+===============+============+===============+ + |with torch.no_grad() |0.00554402 s |0.0299619 s |5.4x | + +-----------------------+---------------+------------+---------------+ + |no with torch.no_grad()|0.00562803 s |0.0301349 s |5.4x | + +-----------------------+---------------+------------+---------------+ + + Args: + in_channels (int): Channels of the input feature map. + """ + + def __init__(self, in_channels: int) -> None: + super().__init__() + self.query_conv = nn.Conv2d(in_channels, in_channels // 8, 1) + self.key_conv = nn.Conv2d(in_channels, in_channels // 8, 1) + self.value_conv = nn.Conv2d(in_channels, in_channels, 1) + self.gamma = Scale(0.) + self.in_channels = in_channels + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """forward function of Criss-Cross Attention. + + Args: + x (torch.Tensor): Input feature with the shape of + (batch_size, in_channels, height, width). + + Returns: + torch.Tensor: Output of the layer, with the shape of + (batch_size, in_channels, height, width) + """ + B, C, H, W = x.size() + query = self.query_conv(x) + key = self.key_conv(x) + value = self.value_conv(x) + energy_H = torch.einsum('bchw,bciw->bwhi', query, key) + NEG_INF_DIAG( + H, query.device) + energy_H = energy_H.transpose(1, 2) + energy_W = torch.einsum('bchw,bchj->bhwj', query, key) + attn = F.softmax( + torch.cat([energy_H, energy_W], dim=-1), dim=-1) # [B,H,W,(H+W)] + out = torch.einsum('bciw,bhwi->bchw', value, attn[..., :H]) + out += torch.einsum('bchj,bhwj->bchw', value, attn[..., H:]) + + out = self.gamma(out) + x + out = out.contiguous() + + return out + + def __repr__(self) -> str: + s = self.__class__.__name__ + s += f'(in_channels={self.in_channels})' + return s diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/chamfer_distance.py b/FoodSeg103/demo/mmcv/mmcv/ops/chamfer_distance.py new file mode 100644 index 0000000000000000000000000000000000000000..1f908a5bbc2655de6233cd6ddfa140ee783079ba --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/chamfer_distance.py @@ -0,0 +1,93 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Sequence, Tuple + +import torch +from torch import Tensor +from torch.autograd import Function +from torch.autograd.function import once_differentiable + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext( + '_ext', ['chamfer_distance_forward', 'chamfer_distance_backward']) + + +class ChamferDistanceFunction(Function): + """This is an implementation of the 2D Chamfer Distance. + + It has been used in the paper `Oriented RepPoints for Aerial Object + Detection (CVPR 2022) _`. + """ + + @staticmethod + def forward(ctx, xyz1: Tensor, xyz2: Tensor) -> Sequence[Tensor]: + """ + Args: + xyz1 (Tensor): Point set with shape (B, N, 2). + xyz2 (Tensor): Point set with shape (B, N, 2). + + Returns: + Sequence[Tensor]: + + - dist1 (Tensor): Chamfer distance (xyz1 to xyz2) with + shape (B, N). + - dist2 (Tensor): Chamfer distance (xyz2 to xyz1) with + shape (B, N). + - idx1 (Tensor): Index of chamfer distance (xyz1 to xyz2) + with shape (B, N), which be used in compute gradient. + - idx2 (Tensor): Index of chamfer distance (xyz2 to xyz2) + with shape (B, N), which be used in compute gradient. + """ + batch_size, n, _ = xyz1.size() + _, m, _ = xyz2.size() + device = xyz1.device + xyz1 = xyz1.contiguous() + xyz2 = xyz2.contiguous() + + dist1 = torch.zeros(batch_size, n).to(device) + dist2 = torch.zeros(batch_size, m).to(device) + idx1 = torch.zeros(batch_size, n).type(torch.IntTensor).to(device) + idx2 = torch.zeros(batch_size, m).type(torch.IntTensor).to(device) + + ext_module.chamfer_distance_forward(xyz1, xyz2, dist1, dist2, idx1, + idx2) + ctx.save_for_backward(xyz1, xyz2, idx1, idx2) + return dist1, dist2, idx1, idx2 + + @staticmethod + @once_differentiable + def backward(ctx, + grad_dist1: Tensor, + grad_dist2: Tensor, + grad_idx1=None, + grad_idx2=None) -> Tuple[Tensor, Tensor]: + """ + + Args: + grad_dist1 (Tensor): Gradient of chamfer distance + (xyz1 to xyz2) with shape (B, N). + grad_dist2 (Tensor): Gradient of chamfer distance + (xyz2 to xyz1) with shape (B, N). + + Returns: + Tuple[Tensor, Tensor]: + + - grad_xyz1 (Tensor): Gradient of the point set with shape \ + (B, N, 2). + - grad_xyz2 (Tensor):Gradient of the point set with shape \ + (B, N, 2). + """ + xyz1, xyz2, idx1, idx2 = ctx.saved_tensors + device = grad_dist1.device + grad_dist1 = grad_dist1.contiguous() + grad_dist2 = grad_dist2.contiguous() + grad_xyz1 = torch.zeros(xyz1.size()).to(device) + grad_xyz2 = torch.zeros(xyz2.size()).to(device) + + ext_module.chamfer_distance_backward(xyz1, xyz2, idx1, idx2, + grad_dist1, grad_dist2, grad_xyz1, + grad_xyz2) + return grad_xyz1, grad_xyz2 + + +chamfer_distance = ChamferDistanceFunction.apply diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/contour_expand.py b/FoodSeg103/demo/mmcv/mmcv/ops/contour_expand.py new file mode 100644 index 0000000000000000000000000000000000000000..7184609ad9b64d421c17fdfe4a1a0dbeb62d64c8 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/contour_expand.py @@ -0,0 +1,52 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Union + +import numpy as np +import torch + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext('_ext', ['contour_expand']) + + +def contour_expand(kernel_mask: Union[np.array, torch.Tensor], + internal_kernel_label: Union[np.array, torch.Tensor], + min_kernel_area: int, kernel_num: int) -> list: + """Expand kernel contours so that foreground pixels are assigned into + instances. + + Args: + kernel_mask (np.array or torch.Tensor): The instance kernel mask with + size hxw. + internal_kernel_label (np.array or torch.Tensor): The instance internal + kernel label with size hxw. + min_kernel_area (int): The minimum kernel area. + kernel_num (int): The instance kernel number. + + Returns: + list: The instance index map with size hxw. + """ + assert isinstance(kernel_mask, (torch.Tensor, np.ndarray)) + assert isinstance(internal_kernel_label, (torch.Tensor, np.ndarray)) + assert isinstance(min_kernel_area, int) + assert isinstance(kernel_num, int) + + if isinstance(kernel_mask, np.ndarray): + kernel_mask = torch.from_numpy(kernel_mask) + if isinstance(internal_kernel_label, np.ndarray): + internal_kernel_label = torch.from_numpy(internal_kernel_label) + + if torch.__version__ == 'parrots': + if kernel_mask.shape[0] == 0 or internal_kernel_label.shape[0] == 0: + label = [] + else: + label = ext_module.contour_expand( + kernel_mask, + internal_kernel_label, + min_kernel_area=min_kernel_area, + kernel_num=kernel_num) + label = label.tolist() # type: ignore + else: + label = ext_module.contour_expand(kernel_mask, internal_kernel_label, + min_kernel_area, kernel_num) + return label diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/conv2d_gradfix.py b/FoodSeg103/demo/mmcv/mmcv/ops/conv2d_gradfix.py new file mode 100644 index 0000000000000000000000000000000000000000..b93a76a844457dd78d625dd95e042864943f11c3 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/conv2d_gradfix.py @@ -0,0 +1,338 @@ +# Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# NVIDIA CORPORATION and its licensors retain all intellectual property +# and proprietary rights in and to this software, related documentation +# and any modifications thereto. Any use, reproduction, disclosure or +# distribution of this software and related documentation without an express +# license agreement from NVIDIA CORPORATION is strictly prohibited. + +# source: https://github.com/NVlabs/stylegan3/blob/main/torch_utils/ops/conv2d_gradfix.py # noqa +"""Custom replacement for `torch.nn.functional.conv2d` that supports +arbitrarily high order gradients with zero performance penalty.""" + +import contextlib +import warnings +from typing import Dict, Optional, Tuple, Union + +import torch +from mmengine.utils import digit_version +from mmengine.utils.dl_utils.parrots_wrapper import is_rocm_pytorch + +enabled = True +weight_gradients_disabled = False + + +@contextlib.contextmanager +def no_weight_gradients(disable=True): + global weight_gradients_disabled + old = weight_gradients_disabled + if disable: + weight_gradients_disabled = True + yield + weight_gradients_disabled = old + + +def conv2d(input: torch.Tensor, + weight: torch.Tensor, + bias: Optional[torch.Tensor] = None, + stride: Union[int, Tuple[int, ...]] = 1, + padding: Union[int, Tuple[int, ...]] = 0, + dilation: Union[int, Tuple[int, ...]] = 1, + groups: int = 1): + flag = True + if digit_version(torch.__version__) >= digit_version('1.10.0'): + warnings.warn('Since ' + 'aten:cudnn_convolution_backward_weight is ' + f'not supported in torch=={torch.__version__},' + ' rolling back to `torch.nn.functional.conv2d`') + flag = False + if _should_use_custom_op(input) and flag: + return _conv2d_gradfix( + transpose=False, + weight_shape=weight.shape, + stride=stride, + padding=padding, + output_padding=0, + dilation=dilation, + groups=groups).apply(input, weight, bias) + return torch.nn.functional.conv2d( + input=input, + weight=weight, + bias=bias, + stride=stride, + padding=padding, + dilation=dilation, + groups=groups) + + +def conv_transpose2d(input: torch.Tensor, + weight: torch.Tensor, + bias: Optional[torch.Tensor] = None, + stride: Union[int, Tuple[int, ...]] = 1, + padding: Union[int, Tuple[int, ...]] = 0, + output_padding: Union[int, Tuple[int, ...]] = 0, + groups: int = 1, + dilation: Union[int, Tuple[int, ...]] = 1): + if _should_use_custom_op(input): + return _conv2d_gradfix( + transpose=True, + weight_shape=weight.shape, + stride=stride, + padding=padding, + output_padding=output_padding, + groups=groups, + dilation=dilation).apply(input, weight, bias) + return torch.nn.functional.conv_transpose2d( + input=input, + weight=weight, + bias=bias, + stride=stride, + padding=padding, + output_padding=output_padding, + groups=groups, + dilation=dilation) + + +def _should_use_custom_op(input): + assert isinstance(input, torch.Tensor) + if (not enabled) or (not torch.backends.cudnn.enabled): + return False + if input.device.type != 'cuda': + return False + return True + + +def _to_tuple(x, ndim): + xs = tuple(x) if isinstance(x, (tuple, list)) else (x, ) * ndim + assert len(xs) == ndim + assert all(isinstance(x, int) for x in xs) + return xs + + +_conv2d_gradfix_cache: Dict = dict() +_null_tensor = torch.empty([0]) + + +def _conv2d_gradfix( + transpose: bool, + weight_shape: Tuple[int, ...], + stride: Union[int, Tuple[int, ...]], + padding: Union[int, Tuple[int, ...]], + output_padding: Union[int, Tuple[int, ...]], + dilation: Union[int, Tuple[int, ...]], + groups: int, +): + # Parse arguments. + ndim = 2 + weight_shape = tuple(weight_shape) + stride = _to_tuple(stride, ndim) + padding = _to_tuple(padding, ndim) + output_padding = _to_tuple(output_padding, ndim) + dilation = _to_tuple(dilation, ndim) + + # Lookup from cache. + key = (transpose, weight_shape, stride, padding, output_padding, dilation, + groups) + if key in _conv2d_gradfix_cache: + return _conv2d_gradfix_cache[key] + + # Validate arguments. + + assert groups >= 1 + assert len(weight_shape) == ndim + 2 + assert all(stride[i] >= 1 for i in range(ndim)) # type: ignore + assert all(padding[i] >= 0 for i in range(ndim)) # type: ignore + assert all(dilation[i] >= 0 for i in range(ndim)) # type: ignore + if not transpose: + assert all(output_padding[i] == 0 for i in range(ndim)) # type: ignore + else: # transpose + for i in range(ndim): + assert 0 <= output_padding[i] < max( # type: ignore + stride[i], # type: ignore + dilation[i]) # type: ignore + + # Helpers. + common_kwargs = dict( + stride=stride, padding=padding, dilation=dilation, groups=groups) + + def calc_output_padding(input_shape, output_shape): + if transpose: + return [0, 0] + return [ + input_shape[i + 2] - (output_shape[i + 2] - 1) * stride[i] - + (1 - 2 * padding[i]) - dilation[i] * (weight_shape[i + 2] - 1) + for i in range(ndim) + ] + + # Forward & backward. + class Conv2d(torch.autograd.Function): + + @staticmethod + def forward(ctx, input, weight, bias): + assert weight.shape == weight_shape + ctx.save_for_backward( + input if weight.requires_grad else _null_tensor, + weight if input.requires_grad else _null_tensor, + ) + ctx.input_shape = input.shape + + # Simple 1x1 convolution => cuBLAS (only on Volta, not on Ampere). + if weight_shape[2:] == stride == dilation == ( + 1, 1) and padding == ( + 0, 0) and torch.cuda.get_device_capability( + input.device) < (8, 0): + a = weight.reshape(groups, weight_shape[0] // groups, + weight_shape[1]) + b = input.reshape(input.shape[0], groups, + input.shape[1] // groups, -1) + c = (a.transpose(1, 2) if transpose else a) @ b.permute( + 1, 2, 0, 3).flatten(2) + c = c.reshape(-1, input.shape[0], + *input.shape[2:]).transpose(0, 1) + c = c if bias is None else c + bias.unsqueeze(0).unsqueeze( + 2).unsqueeze(3) + return c.contiguous( + memory_format=(torch.channels_last if input.stride(1) == + 1 else torch.contiguous_format)) + + # General case => cuDNN. + if transpose: + return torch.nn.functional.conv_transpose2d( + input=input, + weight=weight, + bias=bias, + output_padding=output_padding, + **common_kwargs) + return torch.nn.functional.conv2d( + input=input, weight=weight, bias=bias, **common_kwargs) + + @staticmethod + def backward(ctx, grad_output): + input, weight = ctx.saved_tensors + input_shape = ctx.input_shape + grad_input = None + grad_weight = None + grad_bias = None + + if ctx.needs_input_grad[0]: + p = calc_output_padding( + input_shape=input_shape, output_shape=grad_output.shape) + op = _conv2d_gradfix( + transpose=(not transpose), + weight_shape=weight_shape, + output_padding=p, + **common_kwargs) + grad_input = op.apply(grad_output, weight, None) + assert grad_input.shape == input_shape + + if ctx.needs_input_grad[1] and not weight_gradients_disabled: + grad_weight = Conv2dGradWeight.apply(grad_output, input) + assert grad_weight.shape == weight_shape + + if ctx.needs_input_grad[2]: + grad_bias = grad_output.sum([0, 2, 3]) + + return grad_input, grad_weight, grad_bias + + # Gradient with respect to the weights. + class Conv2dGradWeight(torch.autograd.Function): + + @staticmethod + def forward(ctx, grad_output, input): + ctx.save_for_backward( + grad_output if input.requires_grad else _null_tensor, + input if grad_output.requires_grad else _null_tensor, + ) + ctx.grad_output_shape = grad_output.shape + ctx.input_shape = input.shape + + # Simple 1x1 convolution => cuBLAS (on both Volta and Ampere). + if weight_shape[2:] == stride == dilation == ( + 1, 1) and padding == (0, 0): + a = grad_output.reshape(grad_output.shape[0], groups, + grad_output.shape[1] // groups, + -1).permute(1, 2, 0, 3).flatten(2) + b = input.reshape(input.shape[0], groups, + input.shape[1] // groups, + -1).permute(1, 2, 0, 3).flatten(2) + c = (b @ a.transpose(1, 2) if transpose else + a @ b.transpose(1, 2)).reshape(weight_shape) + return c.contiguous( + memory_format=(torch.channels_last if input.stride(1) == + 1 else torch.contiguous_format)) + + # PyTorch consolidated convolution backward API in PR: + # https://github.com/pytorch/pytorch/commit/3dc3651e0ee3623f669c3a2c096408dbc476d122 # noqa: E501 + # Enhance the code referring to the discussion: + # https://github.com/pytorch/pytorch/issues/74437 + if digit_version(torch.__version__) >= digit_version('1.11.0'): + empty_weight = torch.tensor( + 0.0, dtype=input.dtype, + device=input.device).expand(weight_shape) + output_padding = calc_output_padding(input.shape, + grad_output.shape) + return torch.ops.aten.convolution_backward( + grad_output, + input, + empty_weight, + None, + stride=stride, + dilation=dilation, + transposed=transpose, + padding=padding, + groups=groups, + output_padding=output_padding, + output_mask=[0, 1, 0])[1] + else: + if is_rocm_pytorch(): + name = 'aten::miopen_convolution_transpose_backward_weight' + if not transpose: + name = 'aten::miopen_convolution_backward_weight' + flags = [ + torch.backends.cudnn.benchmark, + torch.backends.cudnn.deterministic + ] + else: + # General case => cuDNN. + name = ('aten::cudnn_convolution_transpose_backward_weight' + if transpose else + 'aten::cudnn_convolution_backward_weight') + flags = [ + torch.backends.cudnn.benchmark, + torch.backends.cudnn.deterministic, + torch.backends.cudnn.allow_tf32 + ] + return torch._C._jit_get_operation(name)(weight_shape, + grad_output, input, + padding, stride, + dilation, groups, + *flags) + + @staticmethod + def backward(ctx, grad2_grad_weight): + grad_output, input = ctx.saved_tensors + grad_output_shape = ctx.grad_output_shape + input_shape = ctx.input_shape + grad2_grad_output = None + grad2_input = None + + if ctx.needs_input_grad[0]: + grad2_grad_output = Conv2d.apply(input, grad2_grad_weight, + None) + assert grad2_grad_output.shape == grad_output_shape + + if ctx.needs_input_grad[1]: + p = calc_output_padding( + input_shape=input_shape, output_shape=grad_output_shape) + op = _conv2d_gradfix( + transpose=(not transpose), + weight_shape=weight_shape, + output_padding=p, + **common_kwargs) + grad2_input = op.apply(grad_output, grad2_grad_weight, None) + assert grad2_input.shape == input_shape + + return grad2_grad_output, grad2_input + + _conv2d_gradfix_cache[key] = Conv2d + return Conv2d diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/convex_iou.py b/FoodSeg103/demo/mmcv/mmcv/ops/convex_iou.py new file mode 100644 index 0000000000000000000000000000000000000000..50050363ac5b08cfa8f86dd186ab7087fac6f48a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/convex_iou.py @@ -0,0 +1,52 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Tuple + +import torch + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext('_ext', ['convex_iou', 'convex_giou']) + + +def convex_giou(pointsets: torch.Tensor, + polygons: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: + """Return generalized intersection-over-union (Jaccard index) between point + sets and polygons. + + Args: + pointsets (torch.Tensor): It has shape (N, 18), + indicating (x1, y1, x2, y2, ..., x9, y9) for each row. + polygons (torch.Tensor): It has shape (N, 8), + indicating (x1, y1, x2, y2, x3, y3, x4, y4) for each row. + + Returns: + tuple[torch.Tensor, torch.Tensor]: The first element is the gious + between point sets and polygons with the shape (N,). The second + element is the gradient of point sets with the shape (N, 18). + """ + output = pointsets.new_zeros((pointsets.size(0), 19)) + ext_module.convex_giou(pointsets, polygons, output) + convex_giou = output[:, -1] + points_grad = output[:, 0:-1] + return convex_giou, points_grad + + +def convex_iou(pointsets: torch.Tensor, + polygons: torch.Tensor) -> torch.Tensor: + """Return intersection-over-union (Jaccard index) between point sets and + polygons. + + Args: + pointsets (torch.Tensor): It has shape (N, 18), + indicating (x1, y1, x2, y2, ..., x9, y9) for each row. + polygons (torch.Tensor): It has shape (K, 8), + indicating (x1, y1, x2, y2, x3, y3, x4, y4) for each row. + + Returns: + torch.Tensor: Return the ious between point sets and polygons with the + shape (N, K). + """ + N, K = pointsets.size(0), polygons.size(0) + ious = pointsets.new_zeros((N, K)) + ext_module.convex_iou(pointsets, polygons, ious) + return ious diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/corner_pool.py b/FoodSeg103/demo/mmcv/mmcv/ops/corner_pool.py new file mode 100644 index 0000000000000000000000000000000000000000..2f4ebca06304329439fec33965792e84b7513c5c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/corner_pool.py @@ -0,0 +1,85 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmengine.utils import digit_version +from torch import Tensor, nn + +_mode_dict = {'top': 0, 'bottom': 1, 'left': 2, 'right': 3} + + +def _corner_pool(x: Tensor, dim: int, flip: bool) -> Tensor: + size = x.size(dim) + output = x.clone() + + ind = 1 + while ind < size: + if flip: + cur_start = 0 + cur_len = size - ind + next_start = ind + next_len = size - ind + else: + cur_start = ind + cur_len = size - ind + next_start = 0 + next_len = size - ind + + # max_temp should be cloned for backward computation + max_temp = output.narrow(dim, cur_start, cur_len).clone() + cur_temp = output.narrow(dim, cur_start, cur_len) + next_temp = output.narrow(dim, next_start, next_len) + + cur_temp[...] = torch.where(max_temp > next_temp, max_temp, next_temp) + + ind = ind << 1 + + return output + + +class CornerPool(nn.Module): + """Corner Pooling. + + Corner Pooling is a new type of pooling layer that helps a + convolutional network better localize corners of bounding boxes. + + Please refer to `CornerNet: Detecting Objects as Paired Keypoints + `_ for more details. + + Code is modified from https://github.com/princeton-vl/CornerNet-Lite. + + Args: + mode (str): Pooling orientation for the pooling layer + + - 'bottom': Bottom Pooling + - 'left': Left Pooling + - 'right': Right Pooling + - 'top': Top Pooling + + Returns: + Feature map after pooling. + """ + + cummax_dim_flip = { + 'bottom': (2, False), + 'left': (3, True), + 'right': (3, False), + 'top': (2, True), + } + + def __init__(self, mode: str): + super().__init__() + assert mode in self.cummax_dim_flip + self.mode = mode + + def forward(self, x: Tensor) -> Tensor: + if (torch.__version__ != 'parrots' and + digit_version(torch.__version__) >= digit_version('1.5.0')): + dim, flip = self.cummax_dim_flip[self.mode] + if flip: + x = x.flip(dim) + pool_tensor, _ = torch.cummax(x, dim=dim) + if flip: + pool_tensor = pool_tensor.flip(dim) + return pool_tensor + else: + dim, flip = self.cummax_dim_flip[self.mode] + return _corner_pool(x, dim, flip) diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/correlation.py b/FoodSeg103/demo/mmcv/mmcv/ops/correlation.py new file mode 100644 index 0000000000000000000000000000000000000000..319b7646782637e9ebaac4ef07b82d1f460031b5 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/correlation.py @@ -0,0 +1,200 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Tuple + +import torch +from torch import Tensor, nn +from torch.autograd import Function +from torch.autograd.function import once_differentiable +from torch.nn.modules.utils import _pair + +from ..utils import ext_loader + +ext_module = ext_loader.load_ext( + '_ext', ['correlation_forward', 'correlation_backward']) + + +class CorrelationFunction(Function): + + @staticmethod + def forward(ctx, + input1: Tensor, + input2: Tensor, + kernel_size: int = 1, + max_displacement: int = 1, + stride: int = 1, + padding: int = 1, + dilation: int = 1, + dilation_patch: int = 1) -> Tensor: + + ctx.save_for_backward(input1, input2) + + kH, kW = ctx.kernel_size = _pair(kernel_size) + patch_size = max_displacement * 2 + 1 + ctx.patch_size = patch_size + dH, dW = ctx.stride = _pair(stride) + padH, padW = ctx.padding = _pair(padding) + dilationH, dilationW = ctx.dilation = _pair(dilation) + dilation_patchH, dilation_patchW = ctx.dilation_patch = _pair( + dilation_patch) + + output_size = CorrelationFunction._output_size(ctx, input1) + + output = input1.new_zeros(output_size) + + ext_module.correlation_forward( + input1, + input2, + output, + kH=kH, + kW=kW, + patchH=patch_size, + patchW=patch_size, + padH=padH, + padW=padW, + dilationH=dilationH, + dilationW=dilationW, + dilation_patchH=dilation_patchH, + dilation_patchW=dilation_patchW, + dH=dH, + dW=dW) + + return output + + @staticmethod + @once_differentiable + def backward( + ctx, grad_output: Tensor + ) -> Tuple[Tensor, Tensor, None, None, None, None, None, None]: + input1, input2 = ctx.saved_tensors + + kH, kW = ctx.kernel_size + patch_size = ctx.patch_size + padH, padW = ctx.padding + dilationH, dilationW = ctx.dilation + dilation_patchH, dilation_patchW = ctx.dilation_patch + dH, dW = ctx.stride + grad_input1 = torch.zeros_like(input1) + grad_input2 = torch.zeros_like(input2) + + ext_module.correlation_backward( + grad_output, + input1, + input2, + grad_input1, + grad_input2, + kH=kH, + kW=kW, + patchH=patch_size, + patchW=patch_size, + padH=padH, + padW=padW, + dilationH=dilationH, + dilationW=dilationW, + dilation_patchH=dilation_patchH, + dilation_patchW=dilation_patchW, + dH=dH, + dW=dW) + return grad_input1, grad_input2, None, None, None, None, None, None + + @staticmethod + def _output_size(ctx, input1): + iH, iW = input1.size(2), input1.size(3) + batch_size = input1.size(0) + kH, kW = ctx.kernel_size + patch_size = ctx.patch_size + dH, dW = ctx.stride + padH, padW = ctx.padding + dilationH, dilationW = ctx.dilation + dilatedKH = (kH - 1) * dilationH + 1 + dilatedKW = (kW - 1) * dilationW + 1 + + oH = int((iH + 2 * padH - dilatedKH) / dH + 1) + oW = int((iW + 2 * padW - dilatedKW) / dW + 1) + + output_size = (batch_size, patch_size, patch_size, oH, oW) + return output_size + + +class Correlation(nn.Module): + r"""Correlation operator + + This correlation operator works for optical flow correlation computation. + + There are two batched tensors with shape :math:`(N, C, H, W)`, + and the correlation output's shape is :math:`(N, max\_displacement \times + 2 + 1, max\_displacement * 2 + 1, H_{out}, W_{out})` + + where + + .. math:: + H_{out} = \left\lfloor\frac{H_{in} + 2 \times padding - + dilation \times (kernel\_size - 1) - 1} + {stride} + 1\right\rfloor + + .. math:: + W_{out} = \left\lfloor\frac{W_{in} + 2 \times padding - dilation + \times (kernel\_size - 1) - 1} + {stride} + 1\right\rfloor + + the correlation item :math:`(N_i, dy, dx)` is formed by taking the sliding + window convolution between input1 and shifted input2, + + .. math:: + Corr(N_i, dx, dy) = + \sum_{c=0}^{C-1} + input1(N_i, c) \star + \mathcal{S}(input2(N_i, c), dy, dx) + + where :math:`\star` is the valid 2d sliding window convolution operator, + and :math:`\mathcal{S}` means shifting the input features (auto-complete + zero marginal), and :math:`dx, dy` are shifting distance, :math:`dx, dy \in + [-max\_displacement \times dilation\_patch, max\_displacement \times + dilation\_patch]`. + + Args: + kernel_size (int): The size of sliding window i.e. local neighborhood + representing the center points and involved in correlation + computation. Defaults to 1. + max_displacement (int): The radius for computing correlation volume, + but the actual working space can be dilated by dilation_patch. + Defaults to 1. + stride (int): The stride of the sliding blocks in the input spatial + dimensions. Defaults to 1. + padding (int): Zero padding added to all four sides of the input1. + Defaults to 0. + dilation (int): The spacing of local neighborhood that will involved + in correlation. Defaults to 1. + dilation_patch (int): The spacing between position need to compute + correlation. Defaults to 1. + """ + + def __init__(self, + kernel_size: int = 1, + max_displacement: int = 1, + stride: int = 1, + padding: int = 0, + dilation: int = 1, + dilation_patch: int = 1) -> None: + super().__init__() + self.kernel_size = kernel_size + self.max_displacement = max_displacement + self.stride = stride + self.padding = padding + self.dilation = dilation + self.dilation_patch = dilation_patch + + def forward(self, input1: Tensor, input2: Tensor) -> Tensor: + return CorrelationFunction.apply(input1, input2, self.kernel_size, + self.max_displacement, self.stride, + self.padding, self.dilation, + self.dilation_patch) + + def __repr__(self) -> str: + s = self.__class__.__name__ + s += f'(kernel_size={self.kernel_size}, ' + s += f'max_displacement={self.max_displacement}, ' + s += f'stride={self.stride}, ' + s += f'padding={self.padding}, ' + s += f'dilation={self.dilation}, ' + s += f'dilation_patch={self.dilation_patch})' + return s diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/README.md b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8fcc6eb1a3260148aa7448470967684f8c9f0365 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/README.md @@ -0,0 +1,162 @@ +# Code Structure of CUDA operators + +This folder contains all non-python code for MMCV custom ops. Please follow the same architecture if you want to add new ops. + +## Directories Tree + +```folder +. +├── common +│ ├── box_iou_rotated_utils.hpp +│ ├── parrots_cpp_helper.hpp +│ ├── parrots_cuda_helper.hpp +│ ├── pytorch_cpp_helper.hpp +│ ├── pytorch_cuda_helper.hpp +│ ├── pytorch_device_registry.hpp +│   ├── cuda +│   │ ├── common_cuda_helper.hpp +│   │ ├── parrots_cudawarpfunction.cuh +│   │ ├── ... +│   │ └── ops_cuda_kernel.cuh +|   ├── mps +│   │ ├── MPSLibrary.h +│   │ ├── ... +│   │ └── MPSUtils.h +|   ├── mlu +│   │ └── ... +|   └── utils +│   │ └── ... +├── parrots +│   ├── ... +│   ├── ops.cpp +│   ├── ops_parrots.cpp +│   └── ops_pytorch.h +└── pytorch +    ├── info.cpp +    ├── pybind.cpp +    ├── ... +    ├── ops.cpp +    ├── cuda +    │   ├── ... +    │   └── ops_cuda.cu +    ├── cpu +    │   ├── ... +    │   └── ops.cpp +    ├── mps +    │   ├── ... +    |   └── op_mps.mm +    └── mlu +       ├── ... +       └── op_mlu.cpp +``` + +## Components + +- `common`: This directory contains all tools and shared codes. + - `cuda`: The cuda kernels which can be shared by all backends. **HIP** kernel is also here since they have similar syntax. + - `mps`: The tools used to support MPS ops. **NOTE** that MPS support is **experimental**. + - `mlu`: The MLU kernels used to support [Cambricon](https://www.cambricon.com/) device. + - `utils`: The kernels and utils of spconv. +- `parrots`: **Parrots** is a deep learning frame for model training and inference. Parrots custom ops are placed in this directory. +- `pytorch`: **PyTorch** custom ops are supported by binding C++ to Python with **pybind11**. The ops implementation and binding codes are placed in this directory. + - `cuda`: This directory contains cuda kernel launchers, which feed memory pointers of tensor to the cuda kernel in `common/cuda`. The launchers provide c++ interface of cuda implementation of corresponding custom ops. + - `cpu`: This directory contain cpu implementations of corresponding custom ops. + - `mlu`: This directory contain launchers of each MLU kernels. + - `mps`: MPS ops implementation and launchers. + +## How to add new PyTorch ops? + +1. (Optional) Add shared kernel in `common` to support special hardware platform. + + ```c++ + // src/common/cuda/new_ops_cuda_kernel.cuh + + template + __global__ void new_ops_forward_cuda_kernel(const T* input, T* output, ...) { + // forward here + } + + ``` + + Add cuda kernel launcher in `pytorch/cuda`. + + ```c++ + // src/pytorch/cuda + #include + + void NewOpsForwardCUDAKernelLauncher(Tensor input, Tensor output, ...){ + // initialize + at::cuda::CUDAGuard device_guard(input.device()); + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + ... + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + input.scalar_type(), "new_ops_forward_cuda_kernel", ([&] { + new_ops_forward_cuda_kernel + <<>>( + input.data_ptr(), output.data_ptr(),...); + })); + AT_CUDA_CHECK(cudaGetLastError()); + } + ``` + +2. Register implementation for different devices. + + ```c++ + // src/pytorch/cuda/cudabind.cpp + ... + + Tensor new_ops_forward_cuda(Tensor input, Tensor output, ...){ + // implement cuda forward here + // use `NewOpsForwardCUDAKernelLauncher` here + } + // declare interface here. + Tensor new_ops_forward_impl(Tensor input, Tensor output, ...); + // register the implementation for given device (CUDA here). + REGISTER_DEVICE_IMPL(new_ops_forward_impl, CUDA, new_ops_forward_cuda); + ``` + +3. Add ops implementation in `pytorch` directory. Select different implementations according to device type. + + ```c++ + // src/pytorch/new_ops.cpp + Tensor new_ops_forward_impl(Tensor input, Tensor output, ...){ + // dispatch the implementation according to the device type of input. + DISPATCH_DEVICE_IMPL(new_ops_forward_impl, input, output, ...); + } + ... + + Tensor new_ops_forward(Tensor input, Tensor output, ...){ + return new_ops_forward_impl(input, output, ...); + } + ``` + +4. Binding the implementation in `pytorch/pybind.cpp` + + ```c++ + // src/pytorch/pybind.cpp + + ... + + Tensor new_ops_forward(Tensor input, Tensor output, ...); + + ... + + // bind with pybind11 + m.def("new_ops_forward", &new_ops_forward, "new_ops_forward", + py::arg("input"), py::arg("output"), ...); + + ... + + ``` + +5. Build MMCV again. Enjoy new ops in python + + ```python + from ..utils import ext_loader + ext_module = ext_loader.load_ext('_ext', ['new_ops_forward']) + + ... + + ext_module.new_ops_forward(input, output, ...) + + ``` diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/box_iou_rotated_utils.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/box_iou_rotated_utils.hpp new file mode 100644 index 0000000000000000000000000000000000000000..a8453eaa8d3638394df8a0b169d8df01dfc27a11 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/box_iou_rotated_utils.hpp @@ -0,0 +1,426 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +// modified from +// https://github.com/facebookresearch/detectron2/blob/master/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_utils.h +#pragma once +#include +#include + +#ifdef __CUDACC__ +// Designates functions callable from the host (CPU) and the device (GPU) +#define HOST_DEVICE __host__ __device__ +#define HOST_DEVICE_INLINE HOST_DEVICE __forceinline__ +#else +#include +#define HOST_DEVICE +#define HOST_DEVICE_INLINE HOST_DEVICE inline +#endif + +namespace { + +template +struct RotatedBox { + T x_ctr, y_ctr, w, h, a; +}; + +template +struct Point { + T x, y; + HOST_DEVICE_INLINE Point(const T& px = 0, const T& py = 0) : x(px), y(py) {} + HOST_DEVICE_INLINE Point operator+(const Point& p) const { + return Point(x + p.x, y + p.y); + } + HOST_DEVICE_INLINE Point& operator+=(const Point& p) { + x += p.x; + y += p.y; + return *this; + } + HOST_DEVICE_INLINE Point operator-(const Point& p) const { + return Point(x - p.x, y - p.y); + } + HOST_DEVICE_INLINE Point operator*(const T coeff) const { + return Point(x * coeff, y * coeff); + } +}; + +template +HOST_DEVICE_INLINE T dot_2d(const Point& A, const Point& B) { + return A.x * B.x + A.y * B.y; +} + +template +HOST_DEVICE_INLINE T cross_2d(const Point& A, const Point& B) { + return A.x * B.y - B.x * A.y; +} + +template +HOST_DEVICE_INLINE void get_rotated_vertices(const RotatedBox& box, + Point (&pts)[4]) { + // M_PI / 180. == 0.01745329251 + // double theta = box.a * 0.01745329251; + // MODIFIED + double theta = box.a; + T cosTheta2 = (T)cos(theta) * 0.5f; + T sinTheta2 = (T)sin(theta) * 0.5f; + + // y: top --> down; x: left --> right + pts[0].x = box.x_ctr - sinTheta2 * box.h - cosTheta2 * box.w; + pts[0].y = box.y_ctr + cosTheta2 * box.h - sinTheta2 * box.w; + pts[1].x = box.x_ctr + sinTheta2 * box.h - cosTheta2 * box.w; + pts[1].y = box.y_ctr - cosTheta2 * box.h - sinTheta2 * box.w; + pts[2].x = 2 * box.x_ctr - pts[0].x; + pts[2].y = 2 * box.y_ctr - pts[0].y; + pts[3].x = 2 * box.x_ctr - pts[1].x; + pts[3].y = 2 * box.y_ctr - pts[1].y; +} + +template +HOST_DEVICE_INLINE int get_intersection_points(const Point (&pts1)[4], + const Point (&pts2)[4], + Point (&intersections)[24]) { + // Line vector + // A line from p1 to p2 is: p1 + (p2-p1)*t, t=[0,1] + Point vec1[4], vec2[4]; + for (int i = 0; i < 4; i++) { + vec1[i] = pts1[(i + 1) % 4] - pts1[i]; + vec2[i] = pts2[(i + 1) % 4] - pts2[i]; + } + + // Line test - test all line combos for intersection + int num = 0; // number of intersections + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + // Solve for 2x2 Ax=b + T det = cross_2d(vec2[j], vec1[i]); + + // This takes care of parallel lines + if (fabs(det) <= 1e-14) { + continue; + } + + auto vec12 = pts2[j] - pts1[i]; + + T t1 = cross_2d(vec2[j], vec12) / det; + T t2 = cross_2d(vec1[i], vec12) / det; + + if (t1 >= 0.0f && t1 <= 1.0f && t2 >= 0.0f && t2 <= 1.0f) { + intersections[num++] = pts1[i] + vec1[i] * t1; + } + } + } + + // Check for vertices of rect1 inside rect2 + { + const auto& AB = vec2[0]; + const auto& DA = vec2[3]; + auto ABdotAB = dot_2d(AB, AB); + auto ADdotAD = dot_2d(DA, DA); + for (int i = 0; i < 4; i++) { + // assume ABCD is the rectangle, and P is the point to be judged + // P is inside ABCD iff. P's projection on AB lies within AB + // and P's projection on AD lies within AD + + auto AP = pts1[i] - pts2[0]; + + auto APdotAB = dot_2d(AP, AB); + auto APdotAD = -dot_2d(AP, DA); + + if ((APdotAB >= 0) && (APdotAD >= 0) && (APdotAB <= ABdotAB) && + (APdotAD <= ADdotAD)) { + intersections[num++] = pts1[i]; + } + } + } + + // Reverse the check - check for vertices of rect2 inside rect1 + { + const auto& AB = vec1[0]; + const auto& DA = vec1[3]; + auto ABdotAB = dot_2d(AB, AB); + auto ADdotAD = dot_2d(DA, DA); + for (int i = 0; i < 4; i++) { + auto AP = pts2[i] - pts1[0]; + + auto APdotAB = dot_2d(AP, AB); + auto APdotAD = -dot_2d(AP, DA); + + if ((APdotAB >= 0) && (APdotAD >= 0) && (APdotAB <= ABdotAB) && + (APdotAD <= ADdotAD)) { + intersections[num++] = pts2[i]; + } + } + } + + return num; +} + +template +HOST_DEVICE_INLINE int convex_hull_graham(const Point (&p)[24], + const int& num_in, Point (&q)[24], + bool shift_to_zero = false) { + assert(num_in >= 2); + + // Step 1: + // Find point with minimum y + // if more than 1 points have the same minimum y, + // pick the one with the minimum x. + int t = 0; + for (int i = 1; i < num_in; i++) { + if (p[i].y < p[t].y || (p[i].y == p[t].y && p[i].x < p[t].x)) { + t = i; + } + } + auto& start = p[t]; // starting point + + // Step 2: + // Subtract starting point from every points (for sorting in the next step) + for (int i = 0; i < num_in; i++) { + q[i] = p[i] - start; + } + + // Swap the starting point to position 0 + auto tmp = q[0]; + q[0] = q[t]; + q[t] = tmp; + + // Step 3: + // Sort point 1 ~ num_in according to their relative cross-product values + // (essentially sorting according to angles) + // If the angles are the same, sort according to their distance to origin + T dist[24]; + for (int i = 0; i < num_in; i++) { + dist[i] = dot_2d(q[i], q[i]); + } + +#ifdef __CUDACC__ + // CUDA version + // In the future, we can potentially use thrust + // for sorting here to improve speed (though not guaranteed) + for (int i = 1; i < num_in - 1; i++) { + for (int j = i + 1; j < num_in; j++) { + T crossProduct = cross_2d(q[i], q[j]); + if ((crossProduct < -1e-6) || + (fabs(crossProduct) < 1e-6 && dist[i] > dist[j])) { + auto q_tmp = q[i]; + q[i] = q[j]; + q[j] = q_tmp; + auto dist_tmp = dist[i]; + dist[i] = dist[j]; + dist[j] = dist_tmp; + } + } + } +#else + // CPU version + std::sort(q + 1, q + num_in, + [](const Point& A, const Point& B) -> bool { + T temp = cross_2d(A, B); + if (fabs(temp) < 1e-6) { + return dot_2d(A, A) < dot_2d(B, B); + } else { + return temp > 0; + } + }); + // compute distance to origin after sort, since the points are now different. + for (int i = 0; i < num_in; i++) { + dist[i] = dot_2d(q[i], q[i]); + } +#endif + + // Step 4: + // Make sure there are at least 2 points (that don't overlap with each other) + // in the stack + int k; // index of the non-overlapped second point + for (k = 1; k < num_in; k++) { + if (dist[k] > 1e-8) { + break; + } + } + if (k == num_in) { + // We reach the end, which means the convex hull is just one point + q[0] = p[t]; + return 1; + } + q[1] = q[k]; + int m = 2; // 2 points in the stack + // Step 5: + // Finally we can start the scanning process. + // When a non-convex relationship between the 3 points is found + // (either concave shape or duplicated points), + // we pop the previous point from the stack + // until the 3-point relationship is convex again, or + // until the stack only contains two points + for (int i = k + 1; i < num_in; i++) { + while (m > 1 && cross_2d(q[i] - q[m - 2], q[m - 1] - q[m - 2]) >= 0) { + m--; + } + q[m++] = q[i]; + } + + // Step 6 (Optional): + // In general sense we need the original coordinates, so we + // need to shift the points back (reverting Step 2) + // But if we're only interested in getting the area/perimeter of the shape + // We can simply return. + if (!shift_to_zero) { + for (int i = 0; i < m; i++) { + q[i] += start; + } + } + + return m; +} + +template +HOST_DEVICE_INLINE T quadri_box_area(const Point (&q)[4]) { + T area = 0; +#pragma unroll + for (int i = 1; i < 3; i++) { + area += fabs(cross_2d(q[i] - q[0], q[i + 1] - q[0])); + } + + return area / 2.0; +} + +template +HOST_DEVICE_INLINE T polygon_area(const Point (&q)[24], const int& m) { + if (m <= 2) { + return 0; + } + + T area = 0; + for (int i = 1; i < m - 1; i++) { + area += fabs(cross_2d(q[i] - q[0], q[i + 1] - q[0])); + } + + return area / 2.0; +} + +template +HOST_DEVICE_INLINE T rotated_boxes_intersection(const RotatedBox& box1, + const RotatedBox& box2) { + // There are up to 4 x 4 + 4 + 4 = 24 intersections (including dups) returned + // from rotated_rect_intersection_pts + Point intersectPts[24], orderedPts[24]; + + Point pts1[4]; + Point pts2[4]; + get_rotated_vertices(box1, pts1); + get_rotated_vertices(box2, pts2); + + int num = get_intersection_points(pts1, pts2, intersectPts); + + if (num <= 2) { + return 0.0; + } + + // Convex Hull to order the intersection points in clockwise order and find + // the contour area. + int num_convex = convex_hull_graham(intersectPts, num, orderedPts, true); + return polygon_area(orderedPts, num_convex); +} + +template +HOST_DEVICE_INLINE T quadri_boxes_intersection(const Point (&pts1)[4], + const Point (&pts2)[4]) { + // There are up to 4 x 4 + 4 + 4 = 24 intersections (including dups) returned + // from rotated_rect_intersection_pts + Point intersectPts[24], orderedPts[24]; + + int num = get_intersection_points(pts1, pts2, intersectPts); + + if (num <= 2) { + return 0.0; + } + + // Convex Hull to order the intersection points in clockwise order and find + // the contour area. + int num_convex = convex_hull_graham(intersectPts, num, orderedPts, true); + return polygon_area(orderedPts, num_convex); +} + +} // namespace + +template +HOST_DEVICE_INLINE T single_box_iou_rotated(T const* const box1_raw, + T const* const box2_raw, + const int mode_flag) { + // shift center to the middle point to achieve higher precision in result + RotatedBox box1, box2; + auto center_shift_x = (box1_raw[0] + box2_raw[0]) / 2.0; + auto center_shift_y = (box1_raw[1] + box2_raw[1]) / 2.0; + box1.x_ctr = box1_raw[0] - center_shift_x; + box1.y_ctr = box1_raw[1] - center_shift_y; + box1.w = box1_raw[2]; + box1.h = box1_raw[3]; + box1.a = box1_raw[4]; + box2.x_ctr = box2_raw[0] - center_shift_x; + box2.y_ctr = box2_raw[1] - center_shift_y; + box2.w = box2_raw[2]; + box2.h = box2_raw[3]; + box2.a = box2_raw[4]; + + const T area1 = box1.w * box1.h; + const T area2 = box2.w * box2.h; + if (area1 < 1e-14 || area2 < 1e-14) { + return 0.f; + } + + const T intersection = rotated_boxes_intersection(box1, box2); + T baseS = 1.0; + if (mode_flag == 0) { + baseS = (area1 + area2 - intersection); + } else if (mode_flag == 1) { + baseS = area1; + } + const T iou = intersection / baseS; + return iou; +} + +template +HOST_DEVICE_INLINE T single_box_iou_quadri(T const* const pts1_raw, + T const* const pts2_raw, + const int mode_flag) { + // shift center to the middle point to achieve higher precision in result + Point pts1[4], pts2[4]; + + auto center_shift_x = + (pts1_raw[0] + pts2_raw[0] + pts1_raw[2] + pts2_raw[2] + pts1_raw[4] + + pts2_raw[4] + pts1_raw[6] + pts2_raw[6]) / + 8.0; + auto center_shift_y = + (pts1_raw[1] + pts2_raw[1] + pts1_raw[3] + pts2_raw[3] + pts1_raw[5] + + pts2_raw[5] + pts1_raw[7] + pts2_raw[7]) / + 8.0; + pts1[0].x = pts1_raw[0] - center_shift_x; + pts1[0].y = pts1_raw[1] - center_shift_y; + pts1[1].x = pts1_raw[2] - center_shift_x; + pts1[1].y = pts1_raw[3] - center_shift_y; + pts1[2].x = pts1_raw[4] - center_shift_x; + pts1[2].y = pts1_raw[5] - center_shift_y; + pts1[3].x = pts1_raw[6] - center_shift_x; + pts1[3].y = pts1_raw[7] - center_shift_y; + pts2[0].x = pts2_raw[0] - center_shift_x; + pts2[0].y = pts2_raw[1] - center_shift_y; + pts2[1].x = pts2_raw[2] - center_shift_x; + pts2[1].y = pts2_raw[3] - center_shift_y; + pts2[2].x = pts2_raw[4] - center_shift_x; + pts2[2].y = pts2_raw[5] - center_shift_y; + pts2[3].x = pts2_raw[6] - center_shift_x; + pts2[3].y = pts2_raw[7] - center_shift_y; + + const T area1 = quadri_box_area(pts1); + const T area2 = quadri_box_area(pts2); + if (area1 < 1e-14 || area2 < 1e-14) { + return 0.f; + } + + const T intersection = quadri_boxes_intersection(pts1, pts2); + T baseS = 1.0; + if (mode_flag == 0) { + baseS = (area1 + area2 - intersection); + } else if (mode_flag == 1) { + baseS = area1; + } + const T iou = intersection / baseS; + return iou; +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/active_rotated_filter_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/active_rotated_filter_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..36e41107ebd52d3cf5e9a71cffe6eddeed4f0765 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/active_rotated_filter_cuda_kernel.cuh @@ -0,0 +1,59 @@ +// Copyright (c) OpenMMLab. All rights reserved. +// Modified from +// https://github.com/csuhan/s2anet/blob/master/mmdet/ops/orn/src/cuda/ActiveRotatingFilter_cuda.cu +#ifndef ACTIVE_ROTATED_FILTER_CUDA_KERNEL_CUH +#define ACTIVE_ROTATED_FILTER_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void active_rotated_filter_forward_cuda_kernel( + const int nthreads, const scalar_t* weight_data, const int* indices_data, + const int num_input_planes, const int num_output_planes, + const int num_orientations, const int num_rotations, const int nEntry, + scalar_t* output_data) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int l = index % nEntry; + int j = (index / nEntry) % num_input_planes; + int i = index / nEntry / num_input_planes; + int k; + scalar_t val = *(weight_data + index); + for (k = 0; k < num_rotations; k++) { + int idx = (int)(*(indices_data + l * num_rotations + k)) - 1; + scalar_t* target = output_data + + i * (num_rotations * num_input_planes * nEntry) + + k * (num_input_planes * nEntry) + j * (nEntry) + idx; + *target = val; + } + } +} + +template +__global__ void active_rotated_filter_backward_cuda_kernel( + const int nthreads, const scalar_t* gradWeight_data, + const int* indices_data, const int num_input_planes, + const int num_output_planes, const int num_orientations, + const int num_rotations, const int nEntry, scalar_t* weight_data) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int l = index % nEntry; + int j = (index / nEntry) % num_input_planes; + int i = index / nEntry / num_input_planes; + int k; + scalar_t* val = weight_data + index; + *val = 0; + scalar_t tmp = 0; + for (k = 0; k < num_rotations; k++) { + int idx = (int)(*(indices_data + l * num_rotations + k)) - 1; + scalar_t target = + *(gradWeight_data + i * (num_rotations * num_input_planes * nEntry) + + k * (num_input_planes * nEntry) + j * (nEntry) + idx); + tmp = tmp + target; + } + *val = tmp; + } +} +#endif // ACTIVE_ROTATED_FILTER_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/assign_score_withk_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/assign_score_withk_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..9f9250844b9ceeca0df0377640c3d28e3f61cecc --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/assign_score_withk_cuda_kernel.cuh @@ -0,0 +1,116 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef ASSIGN_SCORE_WITHK_CUDA_KERNEL_CUH +#define ASSIGN_SCORE_WITHK_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +// input: points(B,N0,M,O), centers(B,N0,M,O), scores(B,N1,K,M), knn_idx(B,N1,K) +// output: fout(B,O,N) +// algo: fout(b,i,k,j) = s(b,i,k,m)*p(b,c(i),k,m,j) = s(b,i,k,m)*p(b,i(k),m,j) +// i(k) = idx(b,i,k) +// sum: fout(b,i,j) = fout(b,i,j) + s(b,i,k,m)*p(b,i,k,m,j) +// avg: fout(b,i,j) = sum(fout(b,i,k,j)) / k +// max: fout(b,i,j) = max(fout(b,i,k,j), sum(s(b,i,k,m)*p(b,i,k,m,j))) + +template +__global__ void assign_score_withk_forward_cuda_kernel( + const int B, const int N0, const int N1, const int M, const int K, + const int O, const int aggregate, const T* points, const T* centers, + const T* scores, const int64_t* knn_idx, T* output) { + // ----- parallel loop for B, N1, K and O --------- + CUDA_1D_KERNEL_LOOP(i, B * O * N1 * K) { + // ------- loop for M ---------- + const int b = (int)(i / (O * N1 * K)); + const int o = (int)(i % (O * N1 * K) / (N1 * K)); + const int n = (int)(i % (N1 * K) / K); + const int k = (int)(i % K); + const int cn = (int)knn_idx[b * K * N1 + n * K + + 0]; // The first neighbor is the center point + const int kn = (int)knn_idx[b * K * N1 + n * K + k]; + if (kn >= N0 || + kn < 0) { // if index overflows, it is out of the neighborhood range + return; + } + assert(b < B); + assert(kn < N0); + assert(cn < N0); + assert(o < O); + assert(n < N1); + const int out_idx = b * N1 * O * K + o * N1 * K + n * K + k; + T val = output[out_idx]; + for (int m = 0; m < M; m++) { + val += points[b * N0 * M * O + kn * M * O + m * O + o] * + scores[b * N1 * K * M + n * K * M + k * M + m] - + centers[b * N0 * M * O + cn * M * O + m * O + o] * + scores[b * N1 * K * M + n * K * M + k * M + m]; + } + output[out_idx] = val; + } +} + +template +__global__ void assign_score_withk_points_backward_cuda_kernel( + const int B, const int N0, const int N, const int M, const int K, + const int O, const int aggregate, const T* grad_out, const T* scores, + const int64_t* knn_idx, T* grad_points, T* grad_centers) { + // ----- parallel loop for B, M, O --------- + CUDA_1D_KERNEL_LOOP(i, B * M * O) { + int b = (int)(i / (M * O)); + int m = (int)(i % (M * O) / O); + int o = (int)(i % O); + + // ----- loop for N,K --------- + for (int n = 0; n < N; n++) { + for (int k = 0; k < K; k++) { + int kn = knn_idx[b * N * K + n * K + k]; + int cn = knn_idx[b * N * K + n * K + 0]; + if (kn >= N0 || kn < 0) { // if index overflows, it is out of the + // neighborhood range + continue; + } + atomicAdd(grad_points + b * N0 * M * O + kn * M * O + m * O + o, + scores[b * N * K * M + n * K * M + k * M + m] * + grad_out[b * O * N * K + o * N * K + n * K + k]); + atomicAdd(grad_centers + b * N0 * M * O + cn * M * O + m * O + o, + -scores[b * N * K * M + n * K * M + k * M + m] * + grad_out[b * O * N * K + o * N * K + n * K + k]); + } + } + } +} + +template +__global__ void assign_score_withk_scores_backward_cuda_kernel( + const int B, const int N0, const int N, const int M, const int K, + const int O, const int aggregate, const T* grad_out, const T* points, + const T* centers, const int64_t* knn_idx, T* grad_scores) { + // ----- parallel loop for B, N, K, M --------- + CUDA_1D_KERNEL_LOOP(i, B * N * K * M) { + const int b = (int)(i / (N * M * K)); + const int n = (int)(i % (N * M * K) / M / K); + const int k = (int)(i % (M * K) / M); + const int m = (int)(i % M); + const int cn = knn_idx[b * N * K + n * K + 0]; + const int kn = knn_idx[b * N * K + n * K + k]; + if (kn >= N0 || + kn < 0) { // if index overflows, it is out of the neighborhood range + return; + } + + // -------------- loop for O ------------------------ + const int out_idx = b * N * K * M + n * K * M + k * M + m; + T val = grad_scores[out_idx]; + for (int o = 0; o < O; o++) { + val += (points[b * N0 * M * O + kn * M * O + m * O + o] - + centers[b * N0 * M * O + cn * M * O + m * O + o]) * + grad_out[b * O * N * K + o * N * K + n * K + k]; + } + grad_scores[out_idx] = val; + } +} + +#endif // ASSIGN_SCORE_WITHK_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/ball_query_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/ball_query_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..632b5c4940b33a9d8d839fa3f3b92e7b6a2bd29e --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/ball_query_cuda_kernel.cuh @@ -0,0 +1,58 @@ +// Copyright (c) OpenMMLab. All rights reserved +// Modified from +// https://github.com/sshaoshuai/Pointnet2.PyTorch/tree/master/pointnet2/src/ball_query_gpu.cu +#ifndef BALL_QUERY_CUDA_KERNEL_CUH +#define BALL_QUERY_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void ball_query_forward_cuda_kernel(int b, int n, int m, + float min_radius, + float max_radius, int nsample, + const T* new_xyz, const T* xyz, + int* idx) { + // new_xyz: (B, M, 3) + // xyz: (B, N, 3) + // output: + // idx: (B, M, nsample) + int bs_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, m) { + if (bs_idx >= b) return; + + new_xyz += bs_idx * m * 3 + pt_idx * 3; + xyz += bs_idx * n * 3; + idx += bs_idx * m * nsample + pt_idx * nsample; + + float max_radius2 = max_radius * max_radius; + float min_radius2 = min_radius * min_radius; + T new_x = new_xyz[0]; + T new_y = new_xyz[1]; + T new_z = new_xyz[2]; + + int cnt = 0; + for (int k = 0; k < n; ++k) { + T x = xyz[k * 3 + 0]; + T y = xyz[k * 3 + 1]; + T z = xyz[k * 3 + 2]; + T d2 = (new_x - x) * (new_x - x) + (new_y - y) * (new_y - y) + + (new_z - z) * (new_z - z); + if (d2 == 0 || (d2 >= min_radius2 && d2 < max_radius2)) { + if (cnt == 0) { + for (int l = 0; l < nsample; ++l) { + idx[l] = k; + } + } + idx[cnt] = k; + ++cnt; + if (cnt >= nsample) break; + } + } + } +} + +#endif // BALL_QUERY_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/bbox_overlaps_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/bbox_overlaps_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..15bd91eca629895d3a99dde3fe6614036ca31dc9 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/bbox_overlaps_cuda_kernel.cuh @@ -0,0 +1,147 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef BBOX_OVERLAPS_CUDA_KERNEL_CUH +#define BBOX_OVERLAPS_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__device__ __forceinline__ void load_bbox(const T* bbox, const int base, T& x1, + T& y1, T& x2, T& y2) { + x1 = bbox[base]; + y1 = bbox[base + 1]; + x2 = bbox[base + 2]; + y2 = bbox[base + 3]; +} + +template <> +__device__ __forceinline__ void load_bbox(const float* bbox, + const int base, float& x1, + float& y1, float& x2, + float& y2) { + const float4 bbox_offset = reinterpret_cast(bbox + base)[0]; + x1 = bbox_offset.x; + y1 = bbox_offset.y; + x2 = bbox_offset.z; + y2 = bbox_offset.w; +} + +template +__global__ void bbox_overlaps_cuda_kernel(const T* bbox1, const T* bbox2, + T* ious, const int num_bbox1, + const int num_bbox2, const int mode, + const bool aligned, + const int offset) { + if (aligned) { + CUDA_1D_KERNEL_LOOP(index, num_bbox1) { + const int b1 = index; + const int b2 = index; + + const int base1 = b1 << 2; // b1 * 4 + T b1_x1, b1_y1, b1_x2, b1_y2; + load_bbox(bbox1, base1, b1_x1, b1_y1, b1_x2, b1_y2); + const T b1_area = (b1_x2 - b1_x1 + offset) * (b1_y2 - b1_y1 + offset); + + const int base2 = b2 << 2; // b2 * 4 + T b2_x1, b2_y1, b2_x2, b2_y2; + load_bbox(bbox2, base2, b2_x1, b2_y1, b2_x2, b2_y2); + const T b2_area = (b2_x2 - b2_x1 + offset) * (b2_y2 - b2_y1 + offset); + + const T left = fmaxf(b1_x1, b2_x1), right = fminf(b1_x2, b2_x2); + const T top = fmaxf(b1_y1, b2_y1), bottom = fminf(b1_y2, b2_y2); + const T width = fmaxf(right - left + offset, 0.f); + const T height = fmaxf(bottom - top + offset, 0.f); + const T interS = width * height; + + const T baseS = + fmaxf(mode == 0 ? b1_area + b2_area - interS : b1_area, T(offset)); + ious[index] = interS / baseS; + } + } else { + CUDA_1D_KERNEL_LOOP(index, num_bbox1 * num_bbox2) { + const int b1 = index / num_bbox2; + const int b2 = index % num_bbox2; + + const int base1 = b1 << 2; // b1 * 4 + T b1_x1, b1_y1, b1_x2, b1_y2; + load_bbox(bbox1, base1, b1_x1, b1_y1, b1_x2, b1_y2); + const T b1_area = (b1_x2 - b1_x1 + offset) * (b1_y2 - b1_y1 + offset); + + const int base2 = b2 << 2; // b2 * 4 + T b2_x1, b2_y1, b2_x2, b2_y2; + load_bbox(bbox2, base2, b2_x1, b2_y1, b2_x2, b2_y2); + const T b2_area = (b2_x2 - b2_x1 + offset) * (b2_y2 - b2_y1 + offset); + + const T left = fmaxf(b1_x1, b2_x1), right = fminf(b1_x2, b2_x2); + const T top = fmaxf(b1_y1, b2_y1), bottom = fminf(b1_y2, b2_y2); + const T width = fmaxf(right - left + offset, 0.f); + const T height = fmaxf(bottom - top + offset, 0.f); + const T interS = width * height; + + const T baseS = + fmaxf(mode == 0 ? b1_area + b2_area - interS : b1_area, T(offset)); + ious[index] = interS / baseS; + } + } +} + +#if __CUDA_ARCH__ >= 530 +__device__ __forceinline__ __half __half_area(const __half x1, const __half y1, + const __half x2, const __half y2, + const __half offset) { + const __half half_w = __hadd(__hsub(x2, x1), offset); + const __half half_h = __hadd(__hsub(y2, y1), offset); + return __hmul(half_w, half_h); +} + +__device__ __forceinline__ __half __half_max(const __half a, const __half b) { + return __hge(a, b) ? a : b; +} + +__device__ __forceinline__ __half __half_min(const __half a, const __half b) { + return __hle(a, b) ? a : b; +} + +// fp16 won't provide much increase when aligned==true. It is useful when +// aligned==false, which would give you ~40% bonus. +__device__ void bbox_overlaps_cuda_kernel_half( + const __half* bbox1, const __half* bbox2, __half* ious, const int num_bbox1, + const int num_bbox2, const int mode, const bool aligned, const int offset) { + const int num_output = aligned ? num_bbox1 : num_bbox1 * num_bbox2; + const __half h_offset = __int2half_rn(offset); + CUDA_1D_KERNEL_LOOP(index, num_output) { + const int b1 = aligned ? index : index / num_bbox2; + const int b2 = aligned ? index : index % num_bbox2; + + const int base1 = b1 << 2; + __half b1_x1, b1_y1, b1_x2, b1_y2; + load_bbox<__half>(bbox1, base1, b1_x1, b1_y1, b1_x2, b1_y2); + const __half b1_area = __half_area(b1_x1, b1_y1, b1_x2, b1_y2, h_offset); + + const int base2 = b2 << 2; + __half b2_x1, b2_y1, b2_x2, b2_y2; + load_bbox<__half>(bbox2, base2, b2_x1, b2_y1, b2_x2, b2_y2); + const __half b2_area = __half_area(b2_x1, b2_y1, b2_x2, b2_y2, h_offset); + + const __half left = __half_max(b1_x1, b2_x1), + right = __half_min(b1_x2, b2_x2); + const __half top = __half_max(b1_y1, b2_y1), + bottom = __half_min(b1_y2, b2_y2); + const __half width = + __half_max(__hadd(__hsub(right, left), h_offset), __float2half(0.f)); + const __half height = + __half_max(__hadd(__hsub(bottom, top), h_offset), __float2half(0.f)); + const __half interS = __hmul(width, height); + + const __half baseS = __half_max( + mode == 0 ? __hsub(__hadd(b1_area, b2_area), interS) : b1_area, + h_offset); + ious[index] = __hdiv(interS, baseS); + } +} +#endif // __CUDA_ARCH__ >= 530 + +#endif // BBOX_OVERLAPS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/bezier_align_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/bezier_align_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..537610416e16aae8979d0843972e090d127b0d43 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/bezier_align_cuda_kernel.cuh @@ -0,0 +1,230 @@ +// Copyright (c) OpenMMLab. All rights reserved +// Modified from +// https://github.com/aim-uofa/AdelaiDet/blob/master/adet/layers/csrc/BezierAlign/BezierAlign_cuda.cu +#ifndef BEZIER_ALIGN_CUDA_KERNEL_CUH +#define BEZIER_ALIGN_CUDA_KERNEL_CUH + +#include +#ifdef MMCV_WITH_TRT +#include "common_cuda_helper.hpp" +#else // MMCV_WITH_TRT +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else // MMCV_USE_PARROTS +#include "pytorch_cuda_helper.hpp" +#endif // MMCV_USE_PARROTS +#endif // MMCV_WITH_TRT + +template +__device__ T bezier_curve(const T p0, const T p1, const T p2, const T p3, + const T u) { + return ((1. - u) * (1. - u) * (1. - u) * p0 + + 3. * u * (1. - u) * (1. - u) * p1 + 3. * u * u * (1. - u) * p2 + + u * u * u * p3); +} + +template +__global__ void bezier_align_forward_cuda_kernel( + const int nthreads, + const T *bottom_data, // inputs + const T *bottom_rois, // bottom rois contains the bezier curve + T *top_data, // outputs + const int pooled_height, const int pooled_width, const T spatial_scale, + const int sampling_ratio, bool aligned, const int channels, + const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + // beziers have size Nx(1+8*2) = Nx17 + const T *offset_bottom_rois = bottom_rois + n * 17; + int roi_batch_ind = offset_bottom_rois[0]; + + // Do not use rounding; this implementation detail is critical + T offset = aligned ? (T)0.5 : (T)0.0; + + // TODO: avoid this by using parallel annotation, for good + T p0_x = offset_bottom_rois[1] * spatial_scale; + T p0_y = offset_bottom_rois[2] * spatial_scale; + T p1_x = offset_bottom_rois[3] * spatial_scale; + T p1_y = offset_bottom_rois[4] * spatial_scale; + T p2_x = offset_bottom_rois[5] * spatial_scale; + T p2_y = offset_bottom_rois[6] * spatial_scale; + T p3_x = offset_bottom_rois[7] * spatial_scale; + T p3_y = offset_bottom_rois[8] * spatial_scale; + T p4_x = offset_bottom_rois[15] * spatial_scale; + T p4_y = offset_bottom_rois[16] * spatial_scale; + T p5_x = offset_bottom_rois[13] * spatial_scale; + T p5_y = offset_bottom_rois[14] * spatial_scale; + T p6_x = offset_bottom_rois[11] * spatial_scale; + T p6_y = offset_bottom_rois[12] * spatial_scale; + T p7_x = offset_bottom_rois[9] * spatial_scale; + T p7_y = offset_bottom_rois[10] * spatial_scale; + + // compute the coords + const T u = pw / static_cast(pooled_width); + const T v = ph / static_cast(pooled_height); + const T x0 = bezier_curve(p0_x, p1_x, p2_x, p3_x, u); + const T y0 = bezier_curve(p0_y, p1_y, p2_y, p3_y, u); + const T x1 = bezier_curve(p4_x, p5_x, p6_x, p7_x, u); + const T y1 = bezier_curve(p4_y, p5_y, p6_y, p7_y, u); + const T x_center = x1 * v + x0 * (1. - v) - offset; + const T y_center = y1 * v + y0 * (1. - v) - offset; + + T roi_width = max(abs(p0_x - p3_x), abs(p4_x - p7_x)); + T roi_height = max(abs(p0_y - p3_y), abs(p4_y - p7_y)); + if (!aligned) { // for backward-compatibility only + roi_width = max(roi_width, (T)1.); + roi_height = max(roi_height, (T)1.); + } + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + const T *offset_bottom_data = + bottom_data + (roi_batch_ind * channels + c) * height * width; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // We do average (integral) pooling inside a bin + // When the grid is empty, output zeros == 0/1, instead of NaN. + const T count = max(roi_bin_grid_h * roi_bin_grid_w, 1); // e.g. = 4 + + T output_val = 0.; + for (int iy = 0; iy < roi_bin_grid_h; iy++) // e.g., iy = 0, 1 + { + const T y = y_center - (T)0.5 * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = x_center - (T)0.5 * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + T val = bilinear_interpolate(offset_bottom_data, height, width, y, x, + index); + output_val += val; + } + } + output_val /= count; + + top_data[index] = output_val; + } +} + +template +__global__ void bezier_align_backward_cuda_kernel( + const int nthreads, const T *top_diff, const T *bottom_rois, T *bottom_diff, + const int pooled_height, const int pooled_width, const T spatial_scale, + const int sampling_ratio, bool aligned, const int channels, + const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + // beziers have size Nx(1+8*2) = Nx17 + const T *offset_bottom_rois = bottom_rois + n * 17; + int roi_batch_ind = offset_bottom_rois[0]; + + // Do not use rounding; this implementation detail is critical + T offset = aligned ? (T)0.5 : (T)0.0; + T p0_x = offset_bottom_rois[1] * spatial_scale; + T p0_y = offset_bottom_rois[2] * spatial_scale; + T p1_x = offset_bottom_rois[3] * spatial_scale; + T p1_y = offset_bottom_rois[4] * spatial_scale; + T p2_x = offset_bottom_rois[5] * spatial_scale; + T p2_y = offset_bottom_rois[6] * spatial_scale; + T p3_x = offset_bottom_rois[7] * spatial_scale; + T p3_y = offset_bottom_rois[8] * spatial_scale; + T p4_x = offset_bottom_rois[15] * spatial_scale; + T p4_y = offset_bottom_rois[16] * spatial_scale; + T p5_x = offset_bottom_rois[13] * spatial_scale; + T p5_y = offset_bottom_rois[14] * spatial_scale; + T p6_x = offset_bottom_rois[11] * spatial_scale; + T p6_y = offset_bottom_rois[12] * spatial_scale; + T p7_x = offset_bottom_rois[9] * spatial_scale; + T p7_y = offset_bottom_rois[10] * spatial_scale; + + // compute the coords + const T u = pw / static_cast(pooled_width); + const T v = ph / static_cast(pooled_height); + const T x0 = bezier_curve(p0_x, p1_x, p2_x, p3_x, u); + const T y0 = bezier_curve(p0_y, p1_y, p2_y, p3_y, u); + const T x1 = bezier_curve(p4_x, p5_x, p6_x, p7_x, u); + const T y1 = bezier_curve(p4_y, p5_y, p6_y, p7_y, u); + const T x_center = x1 * v + x0 * (1. - v) - offset; + const T y_center = y1 * v + y0 * (1. - v) - offset; + + T roi_width = max(abs(p0_x - p3_x), abs(p4_x - p7_x)); + T roi_height = max(abs(p0_y - p3_y), abs(p4_y - p7_y)); + if (!aligned) { // for backward-compatibility only + roi_width = max(roi_width, (T)1.); + roi_height = max(roi_height, (T)1.); + } + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + T *offset_bottom_diff = + bottom_diff + (roi_batch_ind * channels + c) * height * width; + + int top_offset = (n * channels + c) * pooled_height * pooled_width; + const T *offset_top_diff = top_diff + top_offset; + const T top_diff_this_bin = offset_top_diff[ph * pooled_width + pw]; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // We do average (integral) pooling inside a bin + const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 + + for (int iy = 0; iy < roi_bin_grid_h; iy++) // e.g., iy = 0, 1 + { + const T y = y_center - (T)0.5 * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = x_center - (T)0.5 * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + T w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + + bilinear_interpolate_gradient(height, width, y, x, w1, w2, w3, w4, + x_low, x_high, y_low, y_high, index); + + T g1 = top_diff_this_bin * w1 / count; + T g2 = top_diff_this_bin * w2 / count; + T g3 = top_diff_this_bin * w3 / count; + T g4 = top_diff_this_bin * w4 / count; + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + atomicAdd(offset_bottom_diff + y_low * width + x_low, + static_cast(g1)); + atomicAdd(offset_bottom_diff + y_low * width + x_high, + static_cast(g2)); + atomicAdd(offset_bottom_diff + y_high * width + x_low, + static_cast(g3)); + atomicAdd(offset_bottom_diff + y_high * width + x_high, + static_cast(g4)); + } // if + } // ix + } // iy + } // CUDA_1D_KERNEL_LOOP +} // BezierAlignBackward + +#endif // BEZIER_ALIGN_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/border_align_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/border_align_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..1d2a2197b45ef5c82412c4b75d7819a7e27674f6 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/border_align_cuda_kernel.cuh @@ -0,0 +1,200 @@ +// Copyright (c) OpenMMLab. All rights reserved +// modified from +// https://github.com/Megvii-BaseDetection/cvpods/blob/master/cvpods/layers/csrc/border_align/border_align_kernel.cu. +// the main difference: (1) use `argmax_idx` for fast computing of gradient +// during the backward. (2) `wh` is directly computed by `boxes`, rather than +// passing it as argument to forward or backward functions. + +#ifndef BORDER_ALIGN_CUDA_KERNEL_CUH +#define BORDER_ALIGN_CUDA_KERNEL_CUH + +#include +#ifdef MMCV_WITH_TRT +#include "common_cuda_helper.hpp" +#else // MMCV_WITH_TRT +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else // MMCV_USE_PARROTS +#include "pytorch_cuda_helper.hpp" +#endif // MMCV_USE_PARROTS +#endif // MMCV_WITH_TRT + +enum BorderMode { Top = 0, Left = 1, Bottom = 2, Right = 3 }; + +/*** Forward ***/ +template +__global__ void border_align_forward_cuda_kernel( + const int nthreads, const T* input, const T* boxes, T* output, + int* argmax_idx, const int channels, const int box_size, const int height, + const int width, const int pool_size) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (batch_idx, c_idx, box_idx) is an element paralleled for computing + // output, and `extreme_idx` is in range [0,3] + int batch_idx, c_idx, box_idx, extreme_idx, maxidx, *offset_argmax_idx; + const T *offset_box, *offset_input, *offset_box_x; + T *offset_output, box_width, box_height, stride, x_stride, y_stride, x, y, + val, maxval; + + extreme_idx = threadIdx.y; + // shape (N, C, box_size, 4) for output + batch_idx = index / channels / box_size; + // shape (N, box_size, 4) for boxes + box_idx = index % box_size + batch_idx * box_size; + c_idx = (index / box_size) % channels; + + offset_box = boxes + box_idx * 4; + box_width = *(offset_box + 2) - *offset_box; + box_height = *(offset_box + 3) - *(offset_box + 1); + offset_output = output + index * 4 + extreme_idx; + offset_argmax_idx = argmax_idx + index * 4 + extreme_idx; + // shape (N, 4C, h, w) for input. + // [0,C) for top feature, [C,2C) for left feature, + // [2C,3C) for bottom feature, [3C,4C) for right feature + offset_input = + input + (batch_idx * channels * 4 + extreme_idx * channels + c_idx) * + height * width; + + // extreme_idx in [0,1] -> offset_box_x indexed at x1 + // extreme_idx in [2,3] -> offset_box_x indexed at x2 + offset_box_x = offset_box + extreme_idx / 2 * 2; + + // (x1,y1) or (x2,y2) for (x,y) + x = *offset_box_x; + y = *(offset_box_x + 1); + + switch (extreme_idx) { + // top + case BorderMode::Top: + stride = box_width / pool_size; + x_stride = stride; + y_stride = 0; + break; + // left + case BorderMode::Left: + stride = box_height / pool_size; + x_stride = 0; + y_stride = stride; + break; + // bottom + case BorderMode::Bottom: + stride = box_width / pool_size; + x_stride = -stride; + y_stride = 0; + break; + // right + case BorderMode::Right: + stride = box_height / pool_size; + x_stride = 0; + y_stride = -stride; + break; + } + + // initialize maxval and maxidx with the start position (e.g. (x1,y1) or + // (x2,y2)) + maxval = bilinear_interpolate(offset_input, height, width, y, x, index); + maxidx = 0; + + // do max_pool along the border + for (int i = 1; i <= pool_size; i++) { + x += x_stride; + y += y_stride; + val = bilinear_interpolate(offset_input, height, width, y, x, index); + if (val > maxval) { + maxval = val; + maxidx = i; + } + } + + // update output and argmax_idx + *offset_output = maxval; + *offset_argmax_idx = maxidx; + } +} + +/*** Backward ***/ +template +__global__ void border_align_backward_cuda_kernel( + const int nthreads, const T* grad_output, const T* boxes, + const int* argmax_idx, T* grad_input, const int channels, + const int box_size, const int height, const int width, + const int pool_size) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (batch_idx, c_idx, box_idx) is an element paralleled for computing + // output, and `extreme_idx` is in range [0,3] + int batch_idx, c_idx, box_idx, extreme_idx; + const int* offset_argmax_idx; + const T *offset_grad_output, *offset_box, *offset_box_x; + T *offset_grad_input, box_width, box_height, stride, x_stride, y_stride, x, + y; + + extreme_idx = threadIdx.y; + batch_idx = index / channels / box_size; + box_idx = index % box_size + batch_idx * box_size; + c_idx = (index / box_size) % channels; + + offset_box = boxes + box_idx * 4; + box_width = *(offset_box + 2) - *offset_box; + box_height = *(offset_box + 3) - *(offset_box + 1); + offset_grad_output = grad_output + index * 4 + extreme_idx; + offset_argmax_idx = argmax_idx + index * 4 + extreme_idx; + // [0,C) for top feature grad, [C,2C) for left feature grad, + // [2C,3C) for bottom feature grad, [3C,4C) for right feature grad + offset_grad_input = grad_input + (batch_idx * channels * 4 + + extreme_idx * channels + c_idx) * + height * width; + + // extreme_idx in [0,1] -> offset_box_x indexed at x1 + // extreme_idx in [2,3] -> offset_box_x indexed at x2 + offset_box_x = offset_box + extreme_idx / 2 * 2; + + switch (extreme_idx) { + // top + case BorderMode::Top: + stride = box_width / pool_size; + x_stride = stride; + y_stride = 0; + break; + // left + case BorderMode::Left: + stride = box_height / pool_size; + x_stride = 0; + y_stride = stride; + break; + // bottom + case BorderMode::Bottom: + stride = box_width / pool_size; + x_stride = -stride; + y_stride = 0; + break; + // right + case BorderMode::Right: + stride = box_height / pool_size; + x_stride = 0; + y_stride = -stride; + break; + } + + // get position (x,y) which has maximum value during forward + x = *offset_box_x; + y = *(offset_box_x + 1); + x += x_stride * (T)(*offset_argmax_idx); + y += y_stride * (T)(*offset_argmax_idx); + + T w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + bilinear_interpolate_gradient(height, width, y, x, w1, w2, w3, w4, x_low, + x_high, y_low, y_high, index); + + // update grad_output + atomicAdd(offset_grad_input + y_low * width + x_low, + *offset_grad_output * w1); + atomicAdd(offset_grad_input + y_low * width + x_high, + *offset_grad_output * w2); + atomicAdd(offset_grad_input + y_high * width + x_low, + *offset_grad_output * w3); + atomicAdd(offset_grad_input + y_high * width + x_high, + *offset_grad_output * w4); + } +} + +#endif // BORDER_ALIGN_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/box_iou_quadri_cuda.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/box_iou_quadri_cuda.cuh new file mode 100644 index 0000000000000000000000000000000000000000..cf8ad5e1a324de3a11c8fc8af28a8d559a661ed6 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/box_iou_quadri_cuda.cuh @@ -0,0 +1,91 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#ifndef BOX_IOU_QUADRI_CUDA_CUH +#define BOX_IOU_QUADRI_CUDA_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif +#include "box_iou_rotated_utils.hpp" + +// 2D block with 32 * 16 = 512 threads per block +const int BLOCK_DIM_X = 32; +const int BLOCK_DIM_Y = 16; + +inline int divideUP(const int x, const int y) { return (((x) + (y)-1) / (y)); } + +template +__global__ void box_iou_quadri_cuda_kernel( + const int n_boxes1, const int n_boxes2, const T* dev_boxes1, + const T* dev_boxes2, T* dev_ious, const int mode_flag, const bool aligned) { + if (aligned) { + CUDA_1D_KERNEL_LOOP(index, n_boxes1) { + int b1 = index; + int b2 = index; + + int base1 = b1 * 8; + + float block_boxes1[8]; + float block_boxes2[8]; + + block_boxes1[0] = dev_boxes1[base1 + 0]; + block_boxes1[1] = dev_boxes1[base1 + 1]; + block_boxes1[2] = dev_boxes1[base1 + 2]; + block_boxes1[3] = dev_boxes1[base1 + 3]; + block_boxes1[4] = dev_boxes1[base1 + 4]; + block_boxes1[5] = dev_boxes1[base1 + 5]; + block_boxes1[6] = dev_boxes1[base1 + 6]; + block_boxes1[7] = dev_boxes1[base1 + 7]; + + int base2 = b2 * 8; + + block_boxes2[0] = dev_boxes2[base2 + 0]; + block_boxes2[1] = dev_boxes2[base2 + 1]; + block_boxes2[2] = dev_boxes2[base2 + 2]; + block_boxes2[3] = dev_boxes2[base2 + 3]; + block_boxes2[4] = dev_boxes2[base2 + 4]; + block_boxes2[5] = dev_boxes2[base2 + 5]; + block_boxes2[6] = dev_boxes2[base2 + 6]; + block_boxes2[7] = dev_boxes2[base2 + 7]; + + dev_ious[index] = + single_box_iou_quadri(block_boxes1, block_boxes2, mode_flag); + } + } else { + CUDA_1D_KERNEL_LOOP(index, n_boxes1 * n_boxes2) { + int b1 = index / n_boxes2; + int b2 = index % n_boxes2; + + int base1 = b1 * 8; + + float block_boxes1[8]; + float block_boxes2[8]; + + block_boxes1[0] = dev_boxes1[base1 + 0]; + block_boxes1[1] = dev_boxes1[base1 + 1]; + block_boxes1[2] = dev_boxes1[base1 + 2]; + block_boxes1[3] = dev_boxes1[base1 + 3]; + block_boxes1[4] = dev_boxes1[base1 + 4]; + block_boxes1[5] = dev_boxes1[base1 + 5]; + block_boxes1[6] = dev_boxes1[base1 + 6]; + block_boxes1[7] = dev_boxes1[base1 + 7]; + + int base2 = b2 * 8; + + block_boxes2[0] = dev_boxes2[base2 + 0]; + block_boxes2[1] = dev_boxes2[base2 + 1]; + block_boxes2[2] = dev_boxes2[base2 + 2]; + block_boxes2[3] = dev_boxes2[base2 + 3]; + block_boxes2[4] = dev_boxes2[base2 + 4]; + block_boxes2[5] = dev_boxes2[base2 + 5]; + block_boxes2[6] = dev_boxes2[base2 + 6]; + block_boxes2[7] = dev_boxes2[base2 + 7]; + + dev_ious[index] = + single_box_iou_quadri(block_boxes1, block_boxes2, mode_flag); + } + } +} + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/box_iou_rotated_cuda.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/box_iou_rotated_cuda.cuh new file mode 100644 index 0000000000000000000000000000000000000000..abd47cd85437804310886de057b5a839a49481b2 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/box_iou_rotated_cuda.cuh @@ -0,0 +1,81 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +// modified from +// https://github.com/facebookresearch/detectron2/blob/master/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cuda.cu +#ifndef BOX_IOU_ROTATED_CUDA_CUH +#define BOX_IOU_ROTATED_CUDA_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif +#include "box_iou_rotated_utils.hpp" + +// 2D block with 32 * 16 = 512 threads per block +const int BLOCK_DIM_X = 32; +const int BLOCK_DIM_Y = 16; + +inline int divideUP(const int x, const int y) { return (((x) + (y)-1) / (y)); } + +template +__global__ void box_iou_rotated_cuda_kernel( + const int n_boxes1, const int n_boxes2, const T* dev_boxes1, + const T* dev_boxes2, T* dev_ious, const int mode_flag, const bool aligned) { + if (aligned) { + CUDA_1D_KERNEL_LOOP(index, n_boxes1) { + int b1 = index; + int b2 = index; + + int base1 = b1 * 5; + + float block_boxes1[5]; + float block_boxes2[5]; + + block_boxes1[0] = dev_boxes1[base1 + 0]; + block_boxes1[1] = dev_boxes1[base1 + 1]; + block_boxes1[2] = dev_boxes1[base1 + 2]; + block_boxes1[3] = dev_boxes1[base1 + 3]; + block_boxes1[4] = dev_boxes1[base1 + 4]; + + int base2 = b2 * 5; + + block_boxes2[0] = dev_boxes2[base2 + 0]; + block_boxes2[1] = dev_boxes2[base2 + 1]; + block_boxes2[2] = dev_boxes2[base2 + 2]; + block_boxes2[3] = dev_boxes2[base2 + 3]; + block_boxes2[4] = dev_boxes2[base2 + 4]; + + dev_ious[index] = + single_box_iou_rotated(block_boxes1, block_boxes2, mode_flag); + } + } else { + CUDA_1D_KERNEL_LOOP(index, n_boxes1 * n_boxes2) { + int b1 = index / n_boxes2; + int b2 = index % n_boxes2; + + int base1 = b1 * 5; + + float block_boxes1[5]; + float block_boxes2[5]; + + block_boxes1[0] = dev_boxes1[base1 + 0]; + block_boxes1[1] = dev_boxes1[base1 + 1]; + block_boxes1[2] = dev_boxes1[base1 + 2]; + block_boxes1[3] = dev_boxes1[base1 + 3]; + block_boxes1[4] = dev_boxes1[base1 + 4]; + + int base2 = b2 * 5; + + block_boxes2[0] = dev_boxes2[base2 + 0]; + block_boxes2[1] = dev_boxes2[base2 + 1]; + block_boxes2[2] = dev_boxes2[base2 + 2]; + block_boxes2[3] = dev_boxes2[base2 + 3]; + block_boxes2[4] = dev_boxes2[base2 + 4]; + + dev_ious[index] = + single_box_iou_rotated(block_boxes1, block_boxes2, mode_flag); + } + } +} + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/carafe_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/carafe_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..20fd617ff7b7a318c5b02c8ab0aec2e5bb03483b --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/carafe_cuda_kernel.cuh @@ -0,0 +1,332 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef CARAFE_CUDA_KERNEL_CUH +#define CARAFE_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +#ifdef MMCV_WITH_HIP +#define WARP_SIZE 64 +#else +#define WARP_SIZE 32 +#endif +#define THREADS_PER_PIXEL 32 +#define MAX_SHARED_MEMORY 49152 +#define MAX_SHARED_SCALAR_T 6144 // 49152 / 8 = 6144 +#define MAXIMIZE_KERNEL_SIZE true +#define kTileDim 32 +#define kBlockRows 8 +#define FULL_MASK 0xffffffff + +inline int divideUP(const int x, const int y) { return (((x) + (y)-1) / (y)); } + +__device__ inline int Loc2Index(const int n, const int c, const int h, + const int w, const int channel_num, + const int height, const int width) { + int index = w + (h + (c + n * channel_num) * height) * width; + return index; +} +#ifndef MMCV_WITH_HIP +/* TODO: move this to a common place */ +template +__device__ inline scalar_t min(scalar_t a, scalar_t b) { + return a < b ? a : b; +} + +template +__device__ inline scalar_t max(scalar_t a, scalar_t b) { + return a > b ? a : b; +} +#endif +template +__device__ __forceinline__ scalar_t warpReduceSum(scalar_t val) { + for (int offset = WARP_SIZE / 2; offset > 0; offset /= 2) +#ifdef MMCV_WITH_HIP + val += __shfl_down(val, offset); +#else + val += __shfl_down_sync(FULL_MASK, val, offset); +#endif + return val; +} + +template <> +__device__ __forceinline__ phalf warpReduceSum(phalf val) { + for (int offset = WARP_SIZE / 2; offset > 0; offset /= 2) +#ifdef MMCV_WITH_HIP + __PHALF(val) += __shfl_down(val, offset); +#else + __PHALF(val) += + __shfl_down_sync(FULL_MASK, __PHALF(val).operator __half(), offset); +#endif + return val; +} + +// Splits the original matrix into submatrices with size 32 * 32. +// Each block transposes one submatrix by loading it into shared memory. +// Reference https://devblogs.nvidia.com/efficient-matrix-transpose-cuda-cc/ +template +__global__ void BatchTranspose2DCUDAKernel(const int N, const int H, + const int W, const int dh, + const int dw, + const scalar_t *__restrict__ X, + scalar_t *__restrict__ Y) { + __shared__ scalar_t tile[kTileDim][kTileDim + 1]; + const int n = blockIdx.x / (dh * dw); + const int k = blockIdx.x % (dh * dw); + const int r = k / dw; + const int c = k % dw; + const int offset = n * H * W; + int x = c * kTileDim + threadIdx.x; + int y = r * kTileDim + threadIdx.y; + if (x < W) { + for (int i = 0; threadIdx.y + i < kTileDim && y + i < H; i += kBlockRows) { + tile[threadIdx.y + i][threadIdx.x] = X[offset + (y + i) * W + x]; + } + } + __syncthreads(); + x = r * kTileDim + threadIdx.x; + y = c * kTileDim + threadIdx.y; + if (x < H) { + for (int i = 0; threadIdx.y + i < kTileDim && y + i < W; i += kBlockRows) { + Y[offset + (y + i) * H + x] = tile[threadIdx.x][threadIdx.y + i]; + } + } +} +template +__global__ void CARAFEForward( + const int num_kernels, const scalar_t *__restrict__ bottom_data, + const scalar_t *__restrict__ bottom_masks, const int kernel_size, + const int group_size, const int scale_factor, const int channels, + const int down_height, const int down_width, const int height, + const int width, const int mask_channels, scalar_t *__restrict__ top_data) { +#if MAXIMIZE_KERNEL_SIZE + __shared__ float shared_mask[MAX_SHARED_SCALAR_T * 2]; +#else + __shared__ scalar_t shared_mask[MAX_SHARED_SCALAR_T]; +#endif + + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index > num_kernels - 1) { + return; + } + const int pixel_id = threadIdx.x / THREADS_PER_PIXEL; + const int split_id = threadIdx.x % THREADS_PER_PIXEL; + index = index / THREADS_PER_PIXEL; + const int pw = index % width; + const int ph = (index / width) % height; + const int n = index / width / height; + + const int down_pw = pw / scale_factor; + const int down_ph = ph / scale_factor; + + const int start_w = down_pw - (kernel_size - 1) / 2; + const int end_w = down_pw + (kernel_size - 1) / 2 + 1; + const int start_h = down_ph - (kernel_size - 1) / 2; + const int end_h = down_ph + (kernel_size - 1) / 2 + 1; + for (int c = split_id; c < mask_channels; c += THREADS_PER_PIXEL) { + int mask_index = Loc2Index(n, ph, pw, c, height, width, mask_channels); + shared_mask[c * WARP_SIZE + pixel_id] = bottom_masks[mask_index]; + } + __syncthreads(); + + const int channels_per_group = ceilf(channels / (float)group_size); +#pragma unroll + for (int c = split_id; c < channels; c += THREADS_PER_PIXEL) { + int mask_group = c / channels_per_group; + scalar_t output_val = 0; +#pragma unroll + for (int iy = start_h; iy < end_h; iy++) { +#pragma unroll + for (int ix = start_w; ix < end_w; ix++) { + if (iy < 0 || iy > down_height - 1 || ix < 0 || ix > down_width - 1) { + continue; + } + int mask_iy = iy - down_ph + (kernel_size - 1) / 2; + int mask_ix = ix - down_pw + (kernel_size - 1) / 2; + int mask_c = + (mask_group * kernel_size + mask_iy) * kernel_size + mask_ix; + int feat_index = + Loc2Index(n, iy, ix, c, down_height, down_width, channels); + + output_val += bottom_data[feat_index] * + shared_mask[mask_c * WARP_SIZE + pixel_id]; + } + } + + int top_index = Loc2Index(n, ph, pw, c, height, width, channels); + top_data[top_index] = output_val; + } +} + +template +__global__ void CARAFEBackward_Feature( + const int num_kernels, const scalar_t *__restrict__ top_diff, + const scalar_t *__restrict__ bottom_masks, const int kernel_size, + const int group_size, const int scale_factor, const int channels, + const int down_height, const int down_width, const int height, + const int width, const int mask_channels, + scalar_t *__restrict__ bottom_diff) { +#if MAXIMIZE_KERNEL_SIZE + __shared__ float shared_mask[MAX_SHARED_SCALAR_T * 2]; +#else + __shared__ scalar_t shared_mask[MAX_SHARED_SCALAR_T]; +#endif + + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index > num_kernels - 1) { + return; + } + + const int pixel_id = threadIdx.x / THREADS_PER_PIXEL; + const int split_id = threadIdx.x % THREADS_PER_PIXEL; + // (n, c, ph, pw) is an element in the bottom_data + index = index / THREADS_PER_PIXEL; + const int pw = index % width; + const int ph = (index / width) % height; + const int n = index / width / height; + + const int start_w = pw - (kernel_size - 1) * scale_factor / 2; + const int end_w = pw + (kernel_size - 1) * scale_factor / 2 + 1; + const int start_h = ph - (kernel_size - 1) * scale_factor / 2; + const int end_h = ph + (kernel_size - 1) * scale_factor / 2 + 1; + for (int c = split_id; c < mask_channels; c += THREADS_PER_PIXEL) { + const int mask_w = (c % kernel_size) * scale_factor; + const int mask_h = (c / kernel_size % kernel_size) * scale_factor; + const int mask_x = start_w + mask_w; + const int mask_y = start_h + mask_h; + if (mask_y < 0 || mask_y > height - 1 || mask_x < 0 || mask_x > width - 1) { + shared_mask[c * WARP_SIZE + pixel_id] = 0; + continue; + } + const int mask_group = c / (kernel_size * kernel_size); + const int mask_c = (2 * mask_group + 1) * kernel_size * kernel_size - c - 1; + int mask_index = + Loc2Index(n, mask_c, mask_y, mask_x, mask_channels, height, width); + shared_mask[c * WARP_SIZE + pixel_id] = bottom_masks[mask_index]; + } + __syncthreads(); + const int channels_per_group = ceilf(channels / (float)group_size); +#pragma unroll + for (int c = split_id; c < channels; c += THREADS_PER_PIXEL) { + int mask_group = c / channels_per_group; + int top_index = Loc2Index(n, ph, pw, c, height, width, channels); + scalar_t output_val = 0; +#pragma unroll + for (int iy = start_h; iy < end_h; iy += scale_factor) { +#pragma unroll + for (int ix = start_w; ix < end_w; ix += scale_factor) { + if (iy < 0 || iy > height - 1 || ix < 0 || ix > width - 1) { + continue; + } + int mask_iy = + (iy - ph + (kernel_size - 1) * scale_factor / 2) / scale_factor; + int mask_ix = + (ix - pw + (kernel_size - 1) * scale_factor / 2) / scale_factor; + int mask_c = + (mask_group * kernel_size + mask_iy) * kernel_size + mask_ix; + int feat_index = Loc2Index(n, iy, ix, c, height, width, channels); + output_val += + shared_mask[mask_c * WARP_SIZE + pixel_id] * top_diff[feat_index]; + } + } + bottom_diff[top_index] = output_val; + } +} + +template +__global__ void FeatureSum(const int num_kernels, + const scalar_t *__restrict__ input_data, + const int scale_factor, const int channels, + const int height, const int width, + scalar_t *__restrict__ output_data) { + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index > num_kernels - 1) { + return; + } + const int split_id = threadIdx.x % THREADS_PER_PIXEL; + index = index / THREADS_PER_PIXEL; + const int pw = index % width; + const int ph = (index / width) % height; + const int n = index / width / height; + for (int c = split_id; c < channels; c += THREADS_PER_PIXEL) { + scalar_t output_val = 0; + for (int iy = ph * scale_factor; iy < (ph + 1) * scale_factor; iy++) { + for (int ix = pw * scale_factor; ix < (pw + 1) * scale_factor; ix++) { + int input_id = Loc2Index(n, iy, ix, c, height * scale_factor, + width * scale_factor, channels); + output_val += input_data[input_id]; + } + } + const int output_id = Loc2Index(n, ph, pw, c, height, width, channels); + output_data[output_id] = output_val; + } +} + +template +__global__ void CARAFEBackward_Mask(const int num_kernels, + const scalar_t *__restrict__ top_diff, + const scalar_t *__restrict__ bottom_data, + const int kernel_size, const int group_size, + const int scale_factor, const int channels, + const int down_height, const int down_width, + const int height, const int width, + const int mask_channels, + scalar_t *__restrict__ mask_diff) { + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index > num_kernels - 1) { + return; + } + + const int lane_id = index % WARP_SIZE; + index = index / WARP_SIZE; + const int mask_c = index % mask_channels; + // (n, c, ph, pw) is an element in the bottom_data + index = index / mask_channels; + const int pw = index % width; + const int ph = (index / width) % height; + const int n = index / width / height; + + const int down_pw = pw / scale_factor; + const int down_ph = ph / scale_factor; + + const int mask_group = mask_c / (kernel_size * kernel_size); + const int mask_loc = mask_c % (kernel_size * kernel_size); + + const int offset_x = mask_loc % kernel_size - (kernel_size - 1) / 2; + const int offset_y = + mask_loc / kernel_size % kernel_size - (kernel_size - 1) / 2; + + const int down_x = down_pw + offset_x; + const int down_y = down_ph + offset_y; + + scalar_t output_val = 0; + + if (down_y >= 0 && down_y <= down_height - 1 && down_x >= 0 && + down_x <= down_width - 1) { + const int channels_per_mask = ceilf(channels / (float)group_size); + const int start = channels_per_mask * mask_group; + const int end = min(channels_per_mask * (mask_group + 1), channels); + for (int c = start + lane_id; c < end; c += WARP_SIZE) { + int bottom_id = + Loc2Index(n, down_y, down_x, c, down_height, down_width, channels); + int top_id = Loc2Index(n, ph, pw, c, height, width, channels); + output_val += top_diff[top_id] * bottom_data[bottom_id]; + } + } +#ifdef MMCV_WITH_HIP + __syncthreads(); +#else + __syncwarp(); +#endif + output_val = warpReduceSum(output_val); + if (lane_id == 0) { + const int mask_id = + Loc2Index(n, ph, pw, mask_c, height, width, mask_channels); + mask_diff[mask_id] = output_val; + } +} + +#endif // CARAFE_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/carafe_naive_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/carafe_naive_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..48230c632f223b736aa72a9d5fd682c97b3aa93a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/carafe_naive_cuda_kernel.cuh @@ -0,0 +1,111 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef CARAFE_NAIVE_CUDA_KERNEL_CUH +#define CARAFE_NAIVE_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +__device__ inline int Loc2Index(const int n, const int c, const int h, + const int w, const int channel_num, + const int height, const int width) { + int index = w + (h + (c + n * channel_num) * height) * width; + return index; +} + +template +__global__ void carafe_naive_forward_cuda_kernel( + const int nthreads, const scalar_t *bottom_data, + const scalar_t *bottom_masks, scalar_t *top_data, const int kernel_size, + const int group_size, const int scale_factor, const int channels, + const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the bottom_data + int pw = index % width; + int ph = (index / width) % height; + int c = (index / width / height) % channels; + int n = index / width / height / channels; + + int mask_channels = kernel_size * kernel_size * group_size; + int mask_group = c / (channels / group_size); + + int down_pw = pw / scale_factor; + int down_ph = ph / scale_factor; + int down_width = width / scale_factor; + int down_height = height / scale_factor; + int start_w = down_pw - (kernel_size - 1) / 2; + int end_w = down_pw + (kernel_size - 1) / 2 + 1; + int start_h = down_ph - (kernel_size - 1) / 2; + int end_h = down_ph + (kernel_size - 1) / 2 + 1; + + scalar_t output_val = 0; + for (int iy = start_h; iy < end_h; iy++) { + for (int ix = start_w; ix < end_w; ix++) { + if (iy < 0 || iy > down_height - 1 || ix < 0 || ix > down_width - 1) { + continue; + } + int mask_iy = iy - down_ph + (kernel_size - 1) / 2; + int mask_ix = ix - down_pw + (kernel_size - 1) / 2; + int mask_c = + (mask_group * kernel_size + mask_iy) * kernel_size + mask_ix; + int feat_index = + Loc2Index(n, c, iy, ix, channels, down_height, down_width); + int mask_index = + Loc2Index(n, mask_c, ph, pw, mask_channels, height, width); + output_val += bottom_data[feat_index] * bottom_masks[mask_index]; + } + } + top_data[index] = output_val; + } +} + +template +__global__ void carafe_naive_backward_cuda_kernel( + const int nthreads, const scalar_t *top_diff, const scalar_t *bottom_data, + const scalar_t *bottom_masks, scalar_t *bottom_diff, scalar_t *mask_diff, + const int kernel_size, const int group_size, const int scale_factor, + const int channels, const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the bottom_data + int pw = index % width; + int ph = (index / width) % height; + int c = (index / width / height) % channels; + int n = index / width / height / channels; + + int mask_channels = kernel_size * kernel_size * group_size; + int mask_group = c / (channels / group_size); + + int down_pw = pw / scale_factor; + int down_ph = ph / scale_factor; + int down_width = width / scale_factor; + int down_height = height / scale_factor; + int start_w = down_pw - (kernel_size - 1) / 2; + int end_w = down_pw + (kernel_size - 1) / 2 + 1; + int start_h = down_ph - (kernel_size - 1) / 2; + int end_h = down_ph + (kernel_size - 1) / 2 + 1; + + for (int iy = start_h; iy < end_h; iy++) { + for (int ix = start_w; ix < end_w; ix++) { + if (iy < 0 || iy > down_height - 1 || ix < 0 || ix > down_width - 1) { + continue; + } + int mask_iy = iy - down_ph + (kernel_size - 1) / 2; + int mask_ix = ix - down_pw + (kernel_size - 1) / 2; + int mask_c = + (mask_group * kernel_size + mask_iy) * kernel_size + mask_ix; + int feat_index = + Loc2Index(n, c, iy, ix, channels, down_height, down_width); + int mask_index = + Loc2Index(n, mask_c, ph, pw, mask_channels, height, width); + atomicAdd(bottom_diff + feat_index, + bottom_masks[mask_index] * top_diff[index]); + atomicAdd(mask_diff + mask_index, + bottom_data[feat_index] * top_diff[index]); + } + } + } +} + +#endif // CARAFE_NAIVE_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/chamfer_distance_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/chamfer_distance_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..89feea4a546a5093967f26393ca6be3b9fe6ae05 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/chamfer_distance_cuda_kernel.cuh @@ -0,0 +1,101 @@ +// Copyright (c) OpenMMLab. All rights reserved. +// Modified from +// https://github.com/chrdiller/pyTorchChamferDistance/blob/master/chamfer_distance/chamfer_distance.cu +#ifndef CHAMFER_DISTANCE_CUDA_KERNEL_CUH +#define CHAMFER_DISTANCE_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +#define MAX_SHARED_SCALAR_T 6144 // 49152 / 8 = 6144 + +template +__global__ void chamfer_distance_forward_cuda_kernel(int b, int n, + const scalar_t* xyz, int m, + const scalar_t* xyz2, + scalar_t* result, + int* result_i) { + __shared__ scalar_t buf[MAX_SHARED_SCALAR_T]; + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int k2 = 0; k2 < m; k2 += THREADS_PER_BLOCK) { + int end_k = min(m, k2 + THREADS_PER_BLOCK) - k2; + for (int j = threadIdx.x; j < end_k * 2; j += blockDim.x) { + buf[j] = xyz2[(i * m + k2) * 2 + j]; + } + __syncthreads(); + for (int j = threadIdx.x; j < n; j += blockDim.x * gridDim.y) { + scalar_t x1 = xyz[(i * n + j) * 2 + 0]; + scalar_t y1 = xyz[(i * n + j) * 2 + 1]; + int best_i = 0; + scalar_t best = 1e10; + int end_ka = end_k & (~2); + if (end_ka == THREADS_PER_BLOCK) { + for (int k = 0; k < THREADS_PER_BLOCK; k += 4) { +#pragma unroll + for (int j = 0; j < 4; ++j) { + scalar_t x2 = buf[(k + j) * 2] - x1; + scalar_t y2 = buf[(k + j) * 2 + 1] - y1; + scalar_t d = x2 * x2 + y2 * y2; + if (d < best) { + best = d; + best_i = k + k2 + j; + } + } + } + } else { + for (int k = 0; k < end_ka; k += 4) { +#pragma unroll + for (int j = 0; j < 4; ++j) { + scalar_t x2 = buf[(k + j) * 2] - x1; + scalar_t y2 = buf[(k + j) * 2 + 1] - y1; + scalar_t d = x2 * x2 + y2 * y2; + if (d < best) { + best = d; + best_i = k + k2 + j; + } + } + } + } + for (int k = end_ka; k < end_k; k++) { + scalar_t x2 = buf[k * 2 + 0] - x1; + scalar_t y2 = buf[k * 2 + 1] - y1; + scalar_t d = x2 * x2 + y2 * y2; + if (k == 0 || d < best) { + best = d; + best_i = k + k2; + } + } + if (k2 == 0 || result[(i * n + j)] > best) { + result[(i * n + j)] = best; + result_i[(i * n + j)] = best_i; + } + } + __syncthreads(); + } + } +} + +template +__global__ void chamfer_distance_backward_cuda_kernel( + int b, int n, const scalar_t* xyz1, int m, const scalar_t* xyz2, + const scalar_t* grad_dist1, const int* idx1, scalar_t* grad_xyz1, + scalar_t* grad_xyz2) { + for (int i = blockIdx.x; i < b; i += gridDim.x) { + for (int j = threadIdx.x; j < n; j += blockDim.x * gridDim.y) { + scalar_t x1 = xyz1[(i * n + j) * 2 + 0]; + scalar_t y1 = xyz1[(i * n + j) * 2 + 1]; + int j2 = idx1[i * n + j]; + scalar_t x2 = xyz2[(i * m + j2) * 2 + 0]; + scalar_t y2 = xyz2[(i * m + j2) * 2 + 1]; + scalar_t g = grad_dist1[i * n + j] * 2; + atomicAdd(&(grad_xyz1[(i * n + j) * 2 + 0]), g * (x1 - x2)); + atomicAdd(&(grad_xyz1[(i * n + j) * 2 + 1]), g * (y1 - y2)); + atomicAdd(&(grad_xyz2[(i * m + j2) * 2 + 0]), -(g * (x1 - x2))); + atomicAdd(&(grad_xyz2[(i * m + j2) * 2 + 1]), -(g * (y1 - y2))); + } + } +} +#endif // CHAMFER_DISTANCE_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/common_cuda_helper.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/common_cuda_helper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..b12aa9a26a2cc162fd89f68ccc97e17749090a41 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/common_cuda_helper.hpp @@ -0,0 +1,120 @@ +#ifndef COMMON_CUDA_HELPER +#define COMMON_CUDA_HELPER + +#include + +#define CUDA_1D_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < (n); \ + i += blockDim.x * gridDim.x) + +#define CUDA_2D_KERNEL_LOOP(i, n, j, m) \ + for (size_t i = blockIdx.x * blockDim.x + threadIdx.x; i < (n); \ + i += blockDim.x * gridDim.x) \ + for (size_t j = blockIdx.y * blockDim.y + threadIdx.y; j < (m); \ + j += blockDim.y * gridDim.y) + +#define CUDA_2D_KERNEL_BLOCK_LOOP(i, n, j, m) \ + for (size_t i = blockIdx.x; i < (n); i += gridDim.x) \ + for (size_t j = blockIdx.y; j < (m); j += gridDim.y) + +#define THREADS_PER_BLOCK 512 + +inline int GET_BLOCKS(const int N, const int num_threads = THREADS_PER_BLOCK) { + int optimal_block_num = (N + num_threads - 1) / num_threads; + int max_block_num = 4096; + return min(optimal_block_num, max_block_num); +} + +template +__device__ T bilinear_interpolate(const T* input, const int height, + const int width, T y, T x, + const int index /* index for debug only*/) { + // deal with cases that inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) return 0; + + if (y <= 0) y = 0; + if (x <= 0) x = 0; + + int y_low = (int)y; + int x_low = (int)x; + int y_high; + int x_high; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + // do bilinear interpolation + T v1 = input[y_low * width + x_low]; + T v2 = input[y_low * width + x_high]; + T v3 = input[y_high * width + x_low]; + T v4 = input[y_high * width + x_high]; + T w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + + return val; +} + +template +__device__ void bilinear_interpolate_gradient( + const int height, const int width, T y, T x, T& w1, T& w2, T& w3, T& w4, + int& x_low, int& x_high, int& y_low, int& y_high, + const int index /* index for debug only*/) { + // deal with cases that inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) { + // empty + w1 = w2 = w3 = w4 = 0.; + x_low = x_high = y_low = y_high = -1; + return; + } + + if (y <= 0) y = 0; + if (x <= 0) x = 0; + + y_low = (int)y; + x_low = (int)x; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + + // reference in forward + // T v1 = input[y_low * width + x_low]; + // T v2 = input[y_low * width + x_high]; + // T v3 = input[y_high * width + x_low]; + // T v4 = input[y_high * width + x_high]; + // T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + + w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + return; +} +#endif // COMMON_CUDA_HELPER diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/convex_iou_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/convex_iou_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..2af96f7963ec347486ced942a5ef7cc4f187db8b --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/convex_iou_cuda_kernel.cuh @@ -0,0 +1,831 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef CONVEX_IOU_CUDA_KERNEL_CUH +#define CONVEX_IOU_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +#define MAXN 100 +#define NMAX 512 +__device__ const double EPS = 1E-8; + +__device__ inline int sig(double d) { return (d > EPS) - (d < -EPS); } + +struct Point { + double x, y; + __device__ Point() {} + __device__ Point(double x, double y) : x(x), y(y) {} +}; + +__device__ inline bool point_same(Point& a, Point& b) { + return sig(a.x - b.x) == 0 && sig(a.y - b.y) == 0; +} + +__device__ inline void swap1(Point* a, Point* b) { + Point temp; + temp.x = a->x; + temp.y = a->y; + + a->x = b->x; + a->y = b->y; + + b->x = temp.x; + b->y = temp.y; +} + +__device__ inline void reverse1(Point* a, const int n) { + for (int i = 0; i < (n - 1) / 2.0; i++) { + Point* j = &(a[i]); + Point* k = &(a[n - 1 - i]); + swap1(j, k); + } +} + +__device__ inline double cross(Point o, Point a, Point b) { + return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y); +} + +__device__ inline double dis(Point a, Point b) { + return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); +} +__device__ inline double area(Point* ps, int n) { + ps[n] = ps[0]; + double res = 0; + for (int i = 0; i < n; i++) { + res += ps[i].x * ps[i + 1].y - ps[i].y * ps[i + 1].x; + } + return res / 2.0; +} +__device__ inline double polygon_area_grad(Point* ps, int n, + int* polygon_to_pred_index, + int n_pred, double* grad_C) { + ps[n] = ps[0]; + double partion_grad[4 * 30 + 2]; + double res = 0; + for (int i = 0; i < n; i++) { + res += ps[i].x * ps[i + 1].y - ps[i].y * ps[i + 1].x; + partion_grad[i * 4 + 2] = ps[i + 1].y; + partion_grad[i * 4 + 3] = -ps[i + 1].x; + if (i != n - 1) { + partion_grad[i * 4 + 4] = -ps[i].y; + partion_grad[i * 4 + 5] = ps[i].x; + } else { + partion_grad[0] = -ps[i].y; + partion_grad[1] = ps[i].x; + } + } + for (int i = 0; i < n; i++) { + for (int j = 0; j < n_pred; j++) { + if (i == polygon_to_pred_index[j]) { + grad_C[2 * polygon_to_pred_index[j + n_pred]] = + (partion_grad[i * 4] + partion_grad[i * 4 + 2]) / 2; + break; + } + } + for (int j = 0; j < n_pred; j++) { + if (i == polygon_to_pred_index[j]) { + grad_C[2 * polygon_to_pred_index[j + n_pred] + 1] = + (partion_grad[i * 4 + 1] + partion_grad[i * 4 + 1 + 2]) / 2; + break; + } + } + } + + return res / 2.0; +} + +__device__ inline int lineCross(Point a, Point b, Point c, Point d, Point& p, + double* cut_grad, int m, int n, int i) { + double s1, s2; + double s2_s1_2; + double ds1_dxc, ds1_dyc, ds2_dxd, ds2_dyd; + double dxp_dxc, dxp_dyc, dxp_dxd, dxp_dyd, dyp_dxc, dyp_dyc, dyp_dxd, dyp_dyd; + s1 = cross(a, b, c); + s2 = cross(a, b, d); + + ds1_dxc = -(b.y - a.y); + ds1_dyc = b.x - a.x; + ds2_dxd = ds1_dxc; + ds2_dyd = ds1_dyc; + s2_s1_2 = (s2 - s1) * (s2 - s1); + + if (sig(s1) == 0 && sig(s2) == 0) return 2; + if (sig(s2 - s1) == 0) return 0; + + dxp_dxc = + ((s2 - d.x * ds1_dxc) * (s2 - s1) - (c.x * s2 - d.x * s1) * (-ds1_dxc)) / + (s2_s1_2); + dxp_dyc = + ((0 - d.x * ds1_dyc) * (s2 - s1) - (c.x * s2 - d.x * s1) * (-ds1_dyc)) / + (s2_s1_2); + dxp_dxd = + ((c.x * ds2_dxd - s1) * (s2 - s1) - (c.x * s2 - d.x * s1) * (ds2_dxd)) / + (s2_s1_2); + dxp_dyd = + ((c.x * ds2_dyd - 0) * (s2 - s1) - (c.x * s2 - d.x * s1) * (ds2_dyd)) / + (s2_s1_2); + + dyp_dxc = + ((0 - d.y * ds1_dxc) * (s2 - s1) - (c.y * s2 - d.y * s1) * (-ds1_dxc)) / + (s2_s1_2); + dyp_dyc = + ((s2 - d.y * ds1_dyc) * (s2 - s1) - (c.y * s2 - d.y * s1) * (-ds1_dyc)) / + (s2_s1_2); + dyp_dxd = + ((c.y * ds2_dxd - 0) * (s2 - s1) - (c.y * s2 - d.y * s1) * (ds2_dxd)) / + (s2_s1_2); + dyp_dyd = + ((c.y * ds2_dyd - s1) * (s2 - s1) - (c.y * s2 - d.y * s1) * (ds2_dyd)) / + (s2_s1_2); + + p.x = (c.x * s2 - d.x * s1) / (s2 - s1); + p.y = (c.y * s2 - d.y * s1) / (s2 - s1); + if (i == n - 1) { + cut_grad[4 * n * m + 4 * i] = dxp_dxc; // + dyp_dxc; + cut_grad[4 * n * m + 4 * i + 1] = dyp_dxc; + cut_grad[4 * n * m + 4 * i + 2] = dxp_dyc; // + dyp_dyc; + cut_grad[4 * n * m + 4 * i + 3] = dyp_dyc; + cut_grad[4 * n * m + 0] = dxp_dxd; // + dyp_dxd; + cut_grad[4 * n * m + 1] = dyp_dxd; + cut_grad[4 * n * m + 2] = dxp_dyd; // + dyp_dyd; + cut_grad[4 * n * m + 3] = dyp_dyd; + } else { + cut_grad[4 * n * m + 4 * i] = dxp_dxc; // + dyp_dxc; + cut_grad[4 * n * m + 4 * i + 1] = dyp_dxc; + cut_grad[4 * n * m + 4 * i + 2] = dxp_dyc; // + dyp_dyc; + cut_grad[4 * n * m + 4 * i + 3] = dyp_dyc; + cut_grad[4 * n * m + 4 * (i + 1)] = dxp_dxd; // + dyp_dxd; + cut_grad[4 * n * m + 4 * (i + 1) + 1] = dyp_dxd; + cut_grad[4 * n * m + 4 * (i + 1) + 2] = dxp_dyd; // + dyp_dyd; + cut_grad[4 * n * m + 4 * (i + 1) + 3] = dyp_dyd; + } + + return 1; +} +__device__ inline void polygon_cut(Point* p, int& n, Point a, Point b, + double* cut_grad) { + Point pp[MAXN]; + double ccur_grad[MAXN] = {}; + int m = 0; + p[n] = p[0]; + int k = n; + for (int i = 0; i < n; i++) { + if (sig(cross(a, b, p[i])) > 0) { + pp[m] = p[i]; + ccur_grad[4 * n * m + 4 * i] = 1.0; + ccur_grad[4 * n * m + 4 * i + 3] = 1.0; + m++; + } + if (sig(cross(a, b, p[i])) != sig(cross(a, b, p[i + 1]))) { + lineCross(a, b, p[i], p[i + 1], pp[m], ccur_grad, m, n, i); + m++; + } + } + + n = 0; + for (int i = 0; i < m; i++) { + if (!i || !(point_same(pp[i], pp[i - 1]))) { + p[n] = pp[i]; + for (int j = 0; j < 4 * k; j++) { + cut_grad[4 * k * n + j] = ccur_grad[4 * k * i + j]; + } + n++; + } + } + + while (n > 1 && point_same(p[n - 1], p[0])) n--; +} + +__device__ inline double intersectArea(Point a, Point b, Point c, Point d, + double* grad_AB, int order, + int convex_n) { + Point o(0, 0); + int res_flag = 0; + int s1 = sig(cross(o, a, b)); + int s2 = sig(cross(o, c, d)); + if (s1 == 0 || s2 == 0) return 0.0; + if (s1 == -1) { + Point* i = &a; + Point* j = &b; + swap1(i, j); + res_flag = 1; + } + if (s2 == -1) { + Point* i = &c; + Point* j = &d; + swap1(i, j); + } + Point p[10] = {o, a, b}; + int n = 3, n0 = 3, n1, n2, n3; + double cut_grad1[MAXN] = {}; + double cut_grad2[MAXN] = {}; + double cut_grad3[MAXN] = {}; + double p1_p_grad[10][10] = {}; + double p2_p1_grad[10][10] = {}; + double p3_p2_grad[10][10] = {}; + + double p3_p1_grad[10][10] = {}; + double p3_p_grad[10][10] = {}; + + // 1 + polygon_cut(p, n, o, c, cut_grad1); + n1 = n; + for (int i = 0; i < n; i++) { + for (int j = 0; j < 4 * n0; j++) { + if (!(j % 2)) { + p1_p_grad[2 * i][j / 2] = cut_grad1[4 * n0 * i + j]; + } else { + p1_p_grad[2 * i + 1][j / 2] = cut_grad1[4 * n0 * i + j]; + } + } + } + + // 2 + polygon_cut(p, n, c, d, cut_grad2); + n2 = n; + for (int i = 0; i < n; i++) { + for (int j = 0; j < 4 * n1; j++) { + if (!(j % 2)) { + p2_p1_grad[2 * i][j / 2] = cut_grad2[4 * n1 * i + j]; + } else { + p2_p1_grad[2 * i + 1][j / 2] = cut_grad2[4 * n1 * i + j]; + } + } + } + // 3 + polygon_cut(p, n, d, o, cut_grad3); + n3 = n; + for (int i = 0; i < n; i++) { + for (int j = 0; j < 4 * n2; j++) { + if (!(j % 2)) { + p3_p2_grad[2 * i][j / 2] = cut_grad3[4 * n2 * i + j]; + } else { + p3_p2_grad[2 * i + 1][j / 2] = cut_grad3[4 * n2 * i + j]; + } + } + } + + // mul + // p3_p2(n3 * n2) * p2_p1(n2 * n1) = p3_p1 (n3 * n1) + for (int i = 0; i < 2 * n3; i++) { + for (int j = 0; j < 2 * n1; j++) { + double sum = 0.0; + for (int m = 0; m < 2 * n2; m++) { + sum = sum + p3_p2_grad[i][m] * p2_p1_grad[m][j]; + } + p3_p1_grad[i][j] = sum; + } + } + + // p3_p1 (n3 * n1) * p1_p (n1 * n0) = p3_p (n3 * n0) + for (int i = 0; i < 2 * n3; i++) { + for (int j = 0; j < 2 * n0; j++) { + double sum = 0.0; + for (int m = 0; m < 2 * n1; m++) { + sum = sum + p3_p1_grad[i][m] * p1_p_grad[m][j]; + } + p3_p_grad[i][j] = sum; + } + } + + // calculate S_grad + int polygon_index_box_index[20]; + double grad_polygon[20]; + double S_grad[6]; + + for (int i = 0; i < n3; i++) { + polygon_index_box_index[i] = i; + polygon_index_box_index[i + n3] = i; + } + + double res = + polygon_area_grad(p, n3, polygon_index_box_index, n3, grad_polygon); + + if (s1 * s2 == -1) { + for (int j = 0; j < 2 * 3; j++) { + double sum = 0.0; + for (int m = 0; m < 2 * n3; m++) { + sum = sum - grad_polygon[m] * p3_p_grad[m][j]; + } + S_grad[j] = sum; + } + + if (order != convex_n - 1) { + if (res_flag) { + grad_AB[2 * order] += S_grad[4]; + grad_AB[2 * order + 1] += S_grad[5]; + grad_AB[2 * order + 2] += S_grad[2]; + grad_AB[2 * order + 3] += S_grad[3]; + + } else { + grad_AB[2 * order] += S_grad[2]; + grad_AB[2 * order + 1] += S_grad[3]; + grad_AB[2 * order + 2] += S_grad[4]; + grad_AB[2 * order + 3] += S_grad[5]; + } + } else { + if (res_flag) { + grad_AB[2 * order] += S_grad[4]; + grad_AB[2 * order + 1] += S_grad[5]; + grad_AB[0] += S_grad[2]; + grad_AB[1] += S_grad[3]; + + } else { + grad_AB[2 * order] += S_grad[2]; + grad_AB[2 * order + 1] += S_grad[3]; + grad_AB[0] += S_grad[4]; + grad_AB[1] += S_grad[5]; + } + } + res = -res; + } else { + for (int j = 0; j < 2 * 3; j++) { + double sum = 0.0; + for (int m = 0; m < 2 * n3; m++) { + sum = sum + grad_polygon[m] * p3_p_grad[m][j]; + } + S_grad[j] = sum; + } + + if (order != convex_n - 1) { + if (res_flag) { + grad_AB[2 * order] += S_grad[4]; + grad_AB[2 * order + 1] += S_grad[5]; + grad_AB[2 * order + 2] += S_grad[2]; + grad_AB[2 * order + 3] += S_grad[3]; + } else { + grad_AB[2 * order] += S_grad[2]; + grad_AB[2 * order + 1] += S_grad[3]; + grad_AB[2 * order + 2] += S_grad[4]; + grad_AB[2 * order + 3] += S_grad[5]; + } + } else { + if (res_flag) { + grad_AB[2 * order] += S_grad[4]; + grad_AB[2 * order + 1] += S_grad[5]; + grad_AB[0] += S_grad[2]; + grad_AB[1] += S_grad[3]; + } else { + grad_AB[2 * order] += S_grad[2]; + grad_AB[2 * order + 1] += S_grad[3]; + grad_AB[0] += S_grad[4]; + grad_AB[1] += S_grad[5]; + } + } + } + return res; +} + +__device__ inline double intersectAreaO(Point* ps1, int n1, Point* ps2, int n2, + double* grad_AB) { + if (area(ps1, n1) < 0) reverse1(ps1, n1); + if (area(ps2, n2) < 0) reverse1(ps2, n2); + ps1[n1] = ps1[0]; + ps2[n2] = ps2[0]; + double res = 0; + for (int i = 0; i < n1; i++) { + for (int j = 0; j < n2; j++) { + res += + intersectArea(ps1[i], ps1[i + 1], ps2[j], ps2[j + 1], grad_AB, i, n1); + } + } + return res; +} + +__device__ inline void Jarvis(Point* in_poly, int& n_poly) { + Point p_max, p_k; + int max_index, k_index; + int Stack[NMAX] = {}, top1, top2; + double sign; + Point right_point[10], left_point[10]; + + for (int i = 0; i < n_poly; i++) { + if (in_poly[i].y < in_poly[0].y || + in_poly[i].y == in_poly[0].y && in_poly[i].x < in_poly[0].x) { + Point* j = &(in_poly[0]); + Point* k = &(in_poly[i]); + swap1(j, k); + } + if (i == 0) { + p_max = in_poly[0]; + max_index = 0; + } + if (in_poly[i].y > p_max.y || + in_poly[i].y == p_max.y && in_poly[i].x > p_max.x) { + p_max = in_poly[i]; + max_index = i; + } + } + + if (max_index == 0) { + max_index = 1; + p_max = in_poly[max_index]; + } + + k_index = 0, Stack[0] = 0, top1 = 0; + while (k_index != max_index) { + p_k = p_max; + k_index = max_index; + for (int i = 1; i < n_poly; i++) { + sign = cross(in_poly[Stack[top1]], in_poly[i], p_k); + if ((sign > 0) || ((sign == 0) && (dis(in_poly[Stack[top1]], in_poly[i]) > + dis(in_poly[Stack[top1]], p_k)))) { + p_k = in_poly[i]; + k_index = i; + } + } + top1++; + Stack[top1] = k_index; + } + for (int i = 0; i <= top1; i++) right_point[i] = in_poly[Stack[i]]; + + k_index = 0, Stack[0] = 0, top2 = 0; + + while (k_index != max_index) { + p_k = p_max; + k_index = max_index; + for (int i = 1; i < n_poly; i++) { + sign = cross(in_poly[Stack[top2]], in_poly[i], p_k); + if ((sign < 0) || (sign == 0) && (dis(in_poly[Stack[top2]], in_poly[i]) > + dis(in_poly[Stack[top2]], p_k))) { + p_k = in_poly[i]; + k_index = i; + } + } + top2++; + Stack[top2] = k_index; + } + for (int i = top2 - 1; i >= 0; i--) left_point[i] = in_poly[Stack[i]]; + + for (int i = 0; i < top1 + top2; i++) { + if (i <= top1) { + in_poly[i] = right_point[i]; + } else { + in_poly[i] = left_point[top2 - (i - top1)]; + } + } + n_poly = top1 + top2; +} + +__device__ inline double intersectAreaPoly(Point* ps1, int n1, Point* ps2, + int n2, double* grad_C) { + Point polygon[MAXN]; + int n = n1 + n2, n_poly = 0; + for (int i = 0; i < n1; i++) { + for (int j = 0; j < n - n1; j++) { + if (point_same(ps1[i], ps2[j])) { + for (int k = j; k < n - n1 - 1; k++) { + ps2[k] = ps2[k + 1]; + } + n2--; + break; + } + } + } + n_poly = n1 + n2; + for (int i = 0; i < n_poly; i++) { + if (i < n1) { + polygon[i] = ps1[i]; + } else { + polygon[i] = ps2[i - n1]; + } + } + + Jarvis(polygon, n_poly); + + int polygon_to_pred_index[18] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1}; + int n_pred = 0; + for (int i = 0; i < n_poly; i++) { + for (int j = 0; j < n1; j++) { + if (polygon[i].x == ps1[j].x && polygon[i].y == ps1[j].y) { + polygon_to_pred_index[n_pred] = i; + polygon_to_pred_index[n_pred + n1] = j; + n_pred += 1; + break; + } + } + } + if (n_pred == 0) { + double polygon_area = fabs(area(polygon, n_poly)); + for (int i = 0; i < 18; i++) { + grad_C[i] = 0.0; + } + return polygon_area; + } else { + double polygon_area = + polygon_area_grad(polygon, n_poly, polygon_to_pred_index, n1, grad_C); + if (polygon_area < 0) { + for (int i = 0; i < 18; i++) { + grad_C[i] = -grad_C[i]; + } + } + return fabs(polygon_area); + } +} + +// convex_find and get the polygon_index_box_index +__device__ inline void Jarvis_and_index(Point* in_poly, int& n_poly, + int* points_to_convex_ind) { + int n_input = n_poly; + Point input_poly[20]; + for (int i = 0; i < n_input; i++) { + input_poly[i].x = in_poly[i].x; + input_poly[i].y = in_poly[i].y; + } + Point p_max, p_k; + int max_index, k_index; + int Stack[20], top1, top2; + double sign; + Point right_point[10], left_point[10]; + + for (int i = 0; i < n_poly; i++) { + if (in_poly[i].y < in_poly[0].y || + in_poly[i].y == in_poly[0].y && in_poly[i].x < in_poly[0].x) { + Point* j = &(in_poly[0]); + Point* k = &(in_poly[i]); + swap1(j, k); + } + if (i == 0) { + p_max = in_poly[0]; + max_index = 0; + } + if (in_poly[i].y > p_max.y || + in_poly[i].y == p_max.y && in_poly[i].x > p_max.x) { + p_max = in_poly[i]; + max_index = i; + } + } + if (max_index == 0) { + max_index = 1; + p_max = in_poly[max_index]; + } + + k_index = 0, Stack[0] = 0, top1 = 0; + while (k_index != max_index) { + p_k = p_max; + k_index = max_index; + for (int i = 1; i < n_poly; i++) { + sign = cross(in_poly[Stack[top1]], in_poly[i], p_k); + if ((sign > 0) || ((sign == 0) && (dis(in_poly[Stack[top1]], in_poly[i]) > + dis(in_poly[Stack[top1]], p_k)))) { + p_k = in_poly[i]; + k_index = i; + } + } + top1++; + Stack[top1] = k_index; + } + for (int i = 0; i <= top1; i++) { + right_point[i] = in_poly[Stack[i]]; + } + + k_index = 0, Stack[0] = 0, top2 = 0; + + while (k_index != max_index) { + p_k = p_max; + k_index = max_index; + for (int i = 1; i < n_poly; i++) { + sign = cross(in_poly[Stack[top2]], in_poly[i], p_k); + if ((sign < 0) || (sign == 0) && (dis(in_poly[Stack[top2]], in_poly[i]) > + dis(in_poly[Stack[top2]], p_k))) { + p_k = in_poly[i]; + k_index = i; + } + } + top2++; + Stack[top2] = k_index; + } + + for (int i = top2 - 1; i >= 0; i--) { + left_point[i] = in_poly[Stack[i]]; + } + + for (int i = 0; i < top1 + top2; i++) { + if (i <= top1) { + in_poly[i] = right_point[i]; + } else { + in_poly[i] = left_point[top2 - (i - top1)]; + } + } + n_poly = top1 + top2; + for (int i = 0; i < n_poly; i++) { + for (int j = 0; j < n_input; j++) { + if (point_same(in_poly[i], input_poly[j])) { + points_to_convex_ind[i] = j; + break; + } + } + } +} + +template +__device__ inline float devrIoU(T const* const p, T const* const q, + T* point_grad, const int idx) { + Point ps1[MAXN], ps2[MAXN]; + + Point convex[MAXN]; + for (int i = 0; i < 9; i++) { + convex[i].x = (double)p[i * 2]; + convex[i].y = (double)p[i * 2 + 1]; + } + int n_convex = 9; + int points_to_convex_ind[9] = {-1, -1, -1, -1, -1, -1, -1, -1, -1}; + Jarvis_and_index(convex, n_convex, points_to_convex_ind); + + int n1 = n_convex; + int n2 = 4; + + for (int i = 0; i < n1; i++) { + ps1[i].x = (double)convex[i].x; + ps1[i].y = (double)convex[i].y; + } + + for (int i = 0; i < n2; i++) { + ps2[i].x = (double)q[i * 2]; + ps2[i].y = (double)q[i * 2 + 1]; + } + + int polygon_index_box_index[18]; + for (int i = 0; i < n1; i++) { + polygon_index_box_index[i] = i; + polygon_index_box_index[i + n1] = i; + } + + double grad_A[18] = {}; + double grad_AB[18] = {}; + double grad_C[18] = {}; + + double inter_area = intersectAreaO(ps1, n1, ps2, n2, grad_AB); + double S_pred = + polygon_area_grad(ps1, n1, polygon_index_box_index, n1, grad_A); + if (S_pred < 0) { + for (int i = 0; i < n_convex * 2; i++) { + grad_A[i] = -grad_A[i]; + } + } + double union_area = fabs(S_pred) + fabs(area(ps2, n2)) - inter_area; + + double iou = inter_area / union_area; + double polygon_area = intersectAreaPoly(ps1, n1, ps2, n2, grad_C); + + // printf("%d:live\n", idx); + double rot_giou = iou - (polygon_area - union_area) / polygon_area; + + float grad_point_temp[18] = {}; + + for (int i = 0; i < n_convex; i++) { + int grad_point = points_to_convex_ind[i]; + grad_point_temp[2 * grad_point] = + (float)((union_area + inter_area) / (union_area * union_area) * + grad_AB[2 * i] - + iou / union_area * grad_A[2 * i] - + 1 / polygon_area * (grad_AB[2 * i] - grad_A[2 * i]) - + (union_area) / polygon_area / polygon_area * grad_C[2 * i]); + grad_point_temp[2 * grad_point + 1] = + (float)((union_area + inter_area) / (union_area * union_area) * + grad_AB[2 * i + 1] - + iou / union_area * grad_A[2 * i + 1] - + 1 / polygon_area * (grad_AB[2 * i + 1] - grad_A[2 * i + 1]) - + (union_area) / polygon_area / polygon_area * grad_C[2 * i + 1]); + } + + for (int i = 0; i < 9; i++) { + point_grad[2 * i] = grad_point_temp[2 * i]; + point_grad[2 * i + 1] = grad_point_temp[2 * i + 1]; + } + return (float)rot_giou; +} + +template +__global__ void convex_giou_cuda_kernel(const int ex_n_boxes, + const int gt_n_boxes, const T* ex_boxes, + const T* gt_boxes, T* point_grad) { + CUDA_1D_KERNEL_LOOP(index, ex_n_boxes) { + const T* cur_box = ex_boxes + index * 18; + const T* cur_gt_box = gt_boxes + index * 8; + T* cur_grad = point_grad + index * 19; + T giou = devrIoU(cur_box, cur_gt_box, cur_grad, threadIdx.x); + cur_grad[18] = giou; + } +} + +__device__ inline int lineCross(Point a, Point b, Point c, Point d, Point& p) { + double s1, s2; + s1 = cross(a, b, c); + s2 = cross(a, b, d); + if (sig(s1) == 0 && sig(s2) == 0) return 2; + if (sig(s2 - s1) == 0) return 0; + p.x = (c.x * s2 - d.x * s1) / (s2 - s1); + p.y = (c.y * s2 - d.y * s1) / (s2 - s1); + return 1; +} + +__device__ inline void polygon_cut(Point* p, int& n, Point a, Point b) { + Point pp[MAXN]; + int m = 0; + p[n] = p[0]; + for (int i = 0; i < n; i++) { + if (sig(cross(a, b, p[i])) > 0) { + pp[m] = p[i]; + m++; + } + if (sig(cross(a, b, p[i])) != sig(cross(a, b, p[i + 1]))) { + lineCross(a, b, p[i], p[i + 1], pp[m]); + m++; + } + } + n = 0; + for (int i = 0; i < m; i++) { + if (!i || !(point_same(pp[i], pp[i - 1]))) { + p[n] = pp[i]; + n++; + } + } + + while (n > 1 && point_same(p[n - 1], p[0])) n--; +} + +__device__ inline double intersectArea(Point a, Point b, Point c, Point d) { + Point o(0, 0); + int s1 = sig(cross(o, a, b)); + int s2 = sig(cross(o, c, d)); + if (s1 == 0 || s2 == 0) return 0.0; + if (s1 == -1) { + Point* i = &a; + Point* j = &b; + swap1(i, j); + } + if (s2 == -1) { + Point* i = &c; + Point* j = &d; + swap1(i, j); + } + Point p[10] = {o, a, b}; + int n = 3; + + polygon_cut(p, n, o, c); + polygon_cut(p, n, c, d); + polygon_cut(p, n, d, o); + double res = area(p, n); + if (s1 * s2 == -1) res = -res; + return res; +} +__device__ inline double intersectAreaO(Point* ps1, int n1, Point* ps2, + int n2) { + if (area(ps1, n1) < 0) reverse1(ps1, n1); + if (area(ps2, n2) < 0) reverse1(ps2, n2); + ps1[n1] = ps1[0]; + ps2[n2] = ps2[0]; + double res = 0; + for (int i = 0; i < n1; i++) { + for (int j = 0; j < n2; j++) { + res += intersectArea(ps1[i], ps1[i + 1], ps2[j], ps2[j + 1]); + } + } + return res; +} + +template +__device__ inline float devrIoU(T const* const p, T const* const q) { + Point ps1[MAXN], ps2[MAXN]; + Point convex[MAXN]; + for (int i = 0; i < 9; i++) { + convex[i].x = (double)p[i * 2]; + convex[i].y = (double)p[i * 2 + 1]; + } + int n_convex = 9; + int points_to_convex_ind[9] = {-1, -1, -1, -1, -1, -1, -1, -1, -1}; + Jarvis_and_index(convex, n_convex, points_to_convex_ind); + int n1 = n_convex; + for (int i = 0; i < n1; i++) { + ps1[i].x = (double)convex[i].x; + ps1[i].y = (double)convex[i].y; + } + int n2 = 4; + for (int i = 0; i < n2; i++) { + ps2[i].x = (double)q[i * 2]; + ps2[i].y = (double)q[i * 2 + 1]; + } + double inter_area = intersectAreaO(ps1, n1, ps2, n2); + double S_pred = area(ps1, n1); + double union_area = fabs(S_pred) + fabs(area(ps2, n2)) - inter_area; + double iou = inter_area / union_area; + return (float)iou; +} + +template +__global__ void convex_iou_cuda_kernel(const int ex_n_boxes, + const int gt_n_boxes, const T* ex_boxes, + const T* gt_boxes, T* iou) { + CUDA_1D_KERNEL_LOOP(index, ex_n_boxes) { + const T* cur_box = ex_boxes + index * 18; + for (int i = 0; i < gt_n_boxes; i++) { + iou[index * gt_n_boxes + i] = devrIoU(cur_box, gt_boxes + i * 8); + } + } +} +#endif // CONVEX_IOU_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/correlation_cuda.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/correlation_cuda.cuh new file mode 100644 index 0000000000000000000000000000000000000000..f910561ec309cd50fd6d4da131ab36cdf3ca963a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/correlation_cuda.cuh @@ -0,0 +1,231 @@ +// Copyright (c) OpenMMLab. All rights reserved. +// Modified from +// https://github.com/ClementPinard/Pytorch-Correlation-extension/blob/master/Correlation_Module/correlation_cuda_kernel.cu +// Original licence: Under MIT License + +#ifndef CORRELATION_CUDA +#define CORRELATION_CUDA + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +#include +#include +// Using is recommended in the official documentation in +// https://pytorch.org/tutorials/advanced/cpp_extension.html#writing-the-c-op. +// However, we use for compatibility with CUDA 9.0 +// Read https://github.com/pytorch/extension-cpp/issues/35 for more details. +#include + +#include +#include + +using namespace torch; + +#define TensorAcc4R PackedTensorAccessor32 +#define TensorAcc5R PackedTensorAccessor32 +#define WITHIN_BOUNDS(x, y, H, W) (x >= 0 && x < H && y >= 0 && y < W) + +#define WARP_SIZE 32 +#define FULL_MASK 0xffffffff + +template +__global__ void correlation_forward_cuda_kernel( + const TensorAcc4R rInput1, const TensorAcc4R rInput2, TensorAcc5R output, + int kH, int kW, int patchH, int patchW, int padH, int padW, int dilationH, + int dilationW, int dilation_patchH, int dilation_patchW, int dH, int dW, + int oH, int oW) { + const int iH = rInput1.size(1); + const int iW = rInput1.size(2); + const int C = rInput1.size(3); + + const int n = blockIdx.x; + const int h = blockIdx.y * blockDim.y + threadIdx.y; + const int w = blockIdx.z * blockDim.z + threadIdx.z; + + if (h >= oH || w >= oW) return; + + const int thread = threadIdx.x; + + const int start_i = -padH + h * dH; + const int start_j = -padW + w * dW; + + const int patchRadH = dilation_patchH * (patchH - 1) / 2; + const int patchRadW = dilation_patchW * (patchW - 1) / 2; + + for (int ph = 0; ph < patchH; ++ph) { + int ph_dilated = ph * dilation_patchH - patchRadH; + for (int pw = 0; pw < patchW; ++pw) { + int pw_dilated = pw * dilation_patchW - patchRadW; + scalar_t prod_sum = 0.0f; + for (int i = 0; i < kH; ++i) { + int i1 = start_i + i * dilationH; + int i2 = i1 + ph_dilated; + if (WITHIN_BOUNDS(i1, i2, iH, iH)) { + for (int j = 0; j < kW; ++j) { + int j1 = start_j + j * dilationW; + int j2 = j1 + pw_dilated; + if (WITHIN_BOUNDS(j1, j2, iW, iW)) { + for (int c = thread; c < C; c += WARP_SIZE) { + scalar_t v1 = rInput1[n][i1][j1][c]; + scalar_t v2 = rInput2[n][i2][j2][c]; + prod_sum += v1 * v2; + } + } + } + } + } + // accumulate + for (int offset = 16; offset > 0; offset /= 2) +#ifdef MMCV_WITH_HIP + prod_sum += __shfl_down(float(prod_sum), offset); +#else + prod_sum += __shfl_down_sync(FULL_MASK, float(prod_sum), offset); +#endif + if (thread == 0) { + output[n][ph][pw][h][w] = prod_sum; + } + } + } +} + +template +__global__ void correlation_backward_cuda_kernel_input1( + const TensorAcc5R grad_output, const TensorAcc4R input2, + TensorAcc4R grad_input1, const int kH, const int kW, const int patchH, + const int patchW, const int padH, const int padW, const int dilationH, + const int dilationW, const int dilation_patchH, const int dilation_patchW, + const int dH, const int dW) { + const int iH = input2.size(1); + const int iW = input2.size(2); + const int C = input2.size(3); + + const int H = grad_output.size(3); + const int W = grad_output.size(4); + + const int patchRadH = (patchH - 1) / 2; + const int patchRadW = (patchW - 1) / 2; + + const int n = blockIdx.x; + const int h = blockIdx.y; + const int w = blockIdx.z; + + const int h_2 = h + padH; + const int w_2 = w + padW; + const int min_h = h_2 - kH * dilationH; + const int min_w = w_2 - kW * dilationW; + + extern __shared__ __align__(sizeof(4)) unsigned char grad_cache_char[]; + scalar_t *grad_cache = reinterpret_cast(grad_cache_char); + for (int i = threadIdx.x; i < patchH * patchW; i += blockDim.x) { + const int ph = i / patchW; + const int pw = i % patchW; + int i1 = h + dilation_patchH * (ph - patchRadH); + int j1 = w + dilation_patchW * (pw - patchRadW); + + if (WITHIN_BOUNDS(i1, j1, iH, iW)) { + scalar_t grad_val = 0.0f; + for (int h_3 = h_2; h_3 > min_h; h_3 -= dilationH) { + int i2 = (h_3) / dH; + if (i2 * dH != h_3) continue; + for (int w_3 = w_2; w_3 > min_w; w_3 -= dilationW) { + int j2 = (w_3) / dW; + if (j2 * dW != w_3) continue; + if (WITHIN_BOUNDS(i2, j2, H, W)) { + grad_val += grad_output[n][ph][pw][i2][j2]; + } + } + } + grad_cache[i] = grad_val; + } + } + __syncthreads(); + + for (int c = threadIdx.x; c < C; c += blockDim.x) { + scalar_t grad_input_val = 0.0f; + for (int ph = 0; ph < patchH; ++ph) { + int i1 = h + dilation_patchH * (ph - patchRadH); + for (int pw = 0; pw < patchW; ++pw) { + int j1 = w + dilation_patchW * (pw - patchRadW); + if (WITHIN_BOUNDS(i1, j1, iH, iW)) { + grad_input_val += input2[n][i1][j1][c] * grad_cache[ph * patchW + pw]; + } + } + } + grad_input1[n][c][h][w] = grad_input_val; + } +} + +template +__global__ void correlation_backward_cuda_kernel_input2( + const TensorAcc5R grad_output, const TensorAcc4R input1, + TensorAcc4R grad_input2, int kH, int kW, int patchH, int patchW, int padH, + int padW, int dilationH, int dilationW, int dilation_patchH, + int dilation_patchW, int dH, int dW) { + const int iH = input1.size(1); + const int iW = input1.size(2); + const int C = input1.size(3); + + const int patchRadH = (patchH - 1) / 2; + const int patchRadW = (patchW - 1) / 2; + + const int H = grad_output.size(3); + const int W = grad_output.size(4); + + const int dilatedKH = kH * dilationH; + const int dilatedKW = kW * dilationW; + + const int n = blockIdx.x; + const int h = blockIdx.y; + const int w = blockIdx.z; + + extern __shared__ __align__(sizeof(4)) unsigned char grad_cache_char[]; + scalar_t *grad_cache = reinterpret_cast(grad_cache_char); + for (int i = threadIdx.x; i < patchH * patchW; i += blockDim.x) { + const int ph = i / patchW; + const int pw = i % patchW; + int i1 = h - dilation_patchH * (ph - patchRadH); + int j1 = w - dilation_patchW * (pw - patchRadW); + + if (WITHIN_BOUNDS(i1, j1, iH, iW)) { + scalar_t grad_val = 0.0f; + + const int h_2 = i1 + padH; + const int w_2 = j1 + padW; + const int min_h = h_2 - dilatedKH; + const int min_w = w_2 - dilatedKW; + + for (int h_3 = h_2; h_3 > min_h; h_3 -= dilationH) { + int i2 = (h_3) / dH; + if (i2 * dH != h_3) continue; + for (int w_3 = w_2; w_3 > min_w; w_3 -= dilationW) { + int j2 = (w_3) / dW; + if (j2 * dW != w_3) continue; + if (WITHIN_BOUNDS(i2, j2, H, W)) { + grad_val += grad_output[n][ph][pw][i2][j2]; + } + } + } + grad_cache[i] = grad_val; + } + } + __syncthreads(); + + for (int c = threadIdx.x; c < C; c += blockDim.x) { + scalar_t grad_input_val = 0.0f; + for (int ph = 0; ph < patchH; ++ph) { + int i1 = h - dilation_patchH * (ph - patchRadH); + for (int pw = 0; pw < patchW; ++pw) { + int j1 = w - dilation_patchW * (pw - patchRadW); + if (WITHIN_BOUNDS(i1, j1, iH, iW)) { + grad_input_val += input1[n][i1][j1][c] * grad_cache[ph * patchW + pw]; + } + } + } + grad_input2[n][c][h][w] = grad_input_val; + } +} +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/deform_conv_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/deform_conv_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..6b4d1bbd85bad1b87ee5d6b8a3cd3b29e3cbc411 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/deform_conv_cuda_kernel.cuh @@ -0,0 +1,367 @@ +/*! + ******************* BEGIN Caffe Copyright Notice and Disclaimer + ***************** + * + * COPYRIGHT + * + * All contributions by the University of California: + * Copyright (c) 2014-2017 The Regents of the University of California (Regents) + * All rights reserved. + * + * All other contributions: + * Copyright (c) 2014-2017, the respective contributors + * All rights reserved. + * + * Caffe uses a shared copyright model: each contributor holds copyright over + * their contributions to Caffe. The project versioning records all such + * contribution and copyright details. If a contributor wants to further mark + * their specific copyright on a particular contribution, they should indicate + * their copyright solely in the commit message of the change when it is + * committed. + * + * LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + *AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + *IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + *DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + *SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + *CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + *OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + *OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * CONTRIBUTION AGREEMENT + * + * By contributing to the BVLC/caffe repository through pull-request, comment, + * or otherwise, the contributor releases their content to the + * license and copyright terms herein. + * + ***************** END Caffe Copyright Notice and Disclaimer + ********************* + * + * Copyright (c) 2018 Microsoft + * Licensed under The MIT License [see LICENSE for details] + * \file modulated_deformable_im2col.cuh + * \brief Function definitions of converting an image to + * column matrix based on kernel, padding, dilation, and offset. + * These functions are mainly used in deformable convolution operators. + * \ref: https://arxiv.org/abs/1703.06211 + * \author Yuwen Xiong, Haozhi Qi, Jifeng Dai, Xizhou Zhu, Han Hu, Dazhi Cheng + */ + +// modified from +// https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/blob/mmdetection/mmdet/ops/dcn/src/deform_conv_cuda_kernel.cu + +#ifndef DEFORM_CONV_CUDA_KERNEL_CUH +#define DEFORM_CONV_CUDA_KERNEL_CUH + +#include +#ifdef MMCV_WITH_TRT +#include "common_cuda_helper.hpp" +#else // MMCV_WITH_TRT +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else // MMCV_USE_PARROTS +#include "pytorch_cuda_helper.hpp" +#endif // MMCV_USE_PARROTS +#endif // MMCV_WITH_TRT + +template +__device__ T deformable_im2col_bilinear(const T *input, const int data_width, + const int height, const int width, T h, + T w) { + if (h <= -1 || height <= h || w <= -1 || width <= w) { + return 0; + } + + int h_low = floorf(h); + int w_low = floorf(w); + int h_high = h_low + 1; + int w_high = w_low + 1; + + T lh = h - h_low; + T lw = w - w_low; + T hh = 1 - lh, hw = 1 - lw; + + T v1 = 0; + if (h_low >= 0 && w_low >= 0) v1 = input[h_low * data_width + w_low]; + T v2 = 0; + if (h_low >= 0 && w_high <= width - 1) + v2 = input[h_low * data_width + w_high]; + T v3 = 0; + if (h_high <= height - 1 && w_low >= 0) + v3 = input[h_high * data_width + w_low]; + T v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) + v4 = input[h_high * data_width + w_high]; + + T w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + + T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + return val; +} + +template +__device__ T get_gradient_weight(T argmax_h, T argmax_w, const int h, + const int w, const int height, + const int width) { + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || + argmax_w >= width) { + // empty + return 0; + } + + int argmax_h_low = floorf(argmax_h); + int argmax_w_low = floorf(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + T weight = 0; + if (h == argmax_h_low && w == argmax_w_low) + weight = (h + 1 - argmax_h) * (w + 1 - argmax_w); + if (h == argmax_h_low && w == argmax_w_high) + weight = (h + 1 - argmax_h) * (argmax_w + 1 - w); + if (h == argmax_h_high && w == argmax_w_low) + weight = (argmax_h + 1 - h) * (w + 1 - argmax_w); + if (h == argmax_h_high && w == argmax_w_high) + weight = (argmax_h + 1 - h) * (argmax_w + 1 - w); + return weight; +} + +template +__device__ T get_coordinate_weight(T argmax_h, T argmax_w, const int height, + const int width, const T *im_data, + const int data_width, const int bp_dir) { + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || + argmax_w >= width) { + // empty + return 0; + } + + int argmax_h_low = floorf(argmax_h); + int argmax_w_low = floorf(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + T weight = 0; + + if (bp_dir == 0) { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_w_low + 1 - argmax_w) * + im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += -1 * (argmax_w - argmax_w_low) * + im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += (argmax_w_low + 1 - argmax_w) * + im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_w - argmax_w_low) * + im_data[argmax_h_high * data_width + argmax_w_high]; + } else if (bp_dir == 1) { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_h_low + 1 - argmax_h) * + im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += (argmax_h_low + 1 - argmax_h) * + im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += -1 * (argmax_h - argmax_h_low) * + im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_h - argmax_h_low) * + im_data[argmax_h_high * data_width + argmax_w_high]; + } + + return weight; +} + +template +__global__ void deformable_im2col_gpu_kernel( + const int n, const T *data_im, const T *data_offset, const int height, + const int width, const int kernel_h, const int kernel_w, const int pad_h, + const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, const int batch_size, + const int num_channels, const int deformable_group, const int height_col, + const int width_col, T *data_col) { + CUDA_1D_KERNEL_LOOP(index, n) { + // index index of output matrix + const int w_col = index % width_col; + const int h_col = (index / width_col) % height_col; + const int b_col = (index / width_col / height_col) % batch_size; + const int c_im = (index / width_col / height_col) / batch_size; + const int c_col = c_im * kernel_h * kernel_w; + + // compute deformable group index + const int deformable_group_index = c_im / channel_per_deformable_group; + + const int h_in = h_col * stride_h - pad_h; + const int w_in = w_col * stride_w - pad_w; + T *data_col_ptr = + data_col + + ((c_col * batch_size + b_col) * height_col + h_col) * width_col + w_col; + const T *data_im_ptr = + data_im + (b_col * num_channels + c_im) * height * width; + const T *data_offset_ptr = + data_offset + (b_col * deformable_group + deformable_group_index) * 2 * + kernel_h * kernel_w * height_col * width_col; + + for (int i = 0; i < kernel_h; ++i) { + for (int j = 0; j < kernel_w; ++j) { + const int data_offset_h_ptr = + ((2 * (i * kernel_w + j)) * height_col + h_col) * width_col + w_col; + const int data_offset_w_ptr = + ((2 * (i * kernel_w + j) + 1) * height_col + h_col) * width_col + + w_col; + const T offset_h = data_offset_ptr[data_offset_h_ptr]; + const T offset_w = data_offset_ptr[data_offset_w_ptr]; + T val = static_cast(0); + const T h_im = h_in + i * dilation_h + offset_h; + const T w_im = w_in + j * dilation_w + offset_w; + if (h_im > -1 && w_im > -1 && h_im < height && w_im < width) + val = deformable_im2col_bilinear(data_im_ptr, width, height, width, + h_im, w_im); + *data_col_ptr = val; + data_col_ptr += batch_size * height_col * width_col; + } + } + } +} + +template +__global__ void deformable_col2im_gpu_kernel( + const int n, const T *data_col, const T *data_offset, const int channels, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, const int batch_size, + const int deformable_group, const int height_col, const int width_col, + T *grad_im) { + CUDA_1D_KERNEL_LOOP(index, n) { + const int j = (index / width_col / height_col / batch_size) % kernel_w; + const int i = + (index / width_col / height_col / batch_size / kernel_w) % kernel_h; + const int c = + index / width_col / height_col / batch_size / kernel_w / kernel_h; + // compute the start and end of the output + + const int deformable_group_index = c / channel_per_deformable_group; + + int w_out = index % width_col; + int h_out = (index / width_col) % height_col; + int b = (index / width_col / height_col) % batch_size; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + + const T *data_offset_ptr = + data_offset + (b * deformable_group + deformable_group_index) * 2 * + kernel_h * kernel_w * height_col * width_col; + const int data_offset_h_ptr = + ((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out; + const int data_offset_w_ptr = + ((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out; + const T offset_h = data_offset_ptr[data_offset_h_ptr]; + const T offset_w = data_offset_ptr[data_offset_w_ptr]; + const T cur_inv_h_data = h_in + i * dilation_h + offset_h; + const T cur_inv_w_data = w_in + j * dilation_w + offset_w; + + const T cur_top_grad = data_col[index]; + const int cur_h = (int)cur_inv_h_data; + const int cur_w = (int)cur_inv_w_data; + for (int dy = -2; dy <= 2; dy++) { + for (int dx = -2; dx <= 2; dx++) { + if (cur_h + dy >= 0 && cur_h + dy < height && cur_w + dx >= 0 && + cur_w + dx < width && abs(cur_inv_h_data - (cur_h + dy)) < 1 && + abs(cur_inv_w_data - (cur_w + dx)) < 1) { + int cur_bottom_grad_pos = + ((b * channels + c) * height + cur_h + dy) * width + cur_w + dx; + T weight = get_gradient_weight(cur_inv_h_data, cur_inv_w_data, + cur_h + dy, cur_w + dx, height, width); + atomicAdd(grad_im + cur_bottom_grad_pos, weight * cur_top_grad); + } + } + } + } +} + +template +__global__ void deformable_col2im_coord_gpu_kernel( + const int n, const T *data_col, const T *data_im, const T *data_offset, + const int channels, const int height, const int width, const int kernel_h, + const int kernel_w, const int pad_h, const int pad_w, const int stride_h, + const int stride_w, const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, const int batch_size, + const int offset_channels, const int deformable_group, const int height_col, + const int width_col, T *grad_offset) { + CUDA_1D_KERNEL_LOOP(index, n) { + T val = 0; + int w = index % width_col; + int h = (index / width_col) % height_col; + int c = (index / width_col / height_col) % offset_channels; + int b = (index / width_col / height_col) / offset_channels; + // compute the start and end of the output + + const int deformable_group_index = c / (2 * kernel_h * kernel_w); + const int col_step = kernel_h * kernel_w; + int cnt = 0; + const T *data_col_ptr = data_col + deformable_group_index * + channel_per_deformable_group * + batch_size * width_col * height_col; + const T *data_im_ptr = + data_im + (b * deformable_group + deformable_group_index) * + channel_per_deformable_group / kernel_h / kernel_w * + height * width; + const T *data_offset_ptr = + data_offset + (b * deformable_group + deformable_group_index) * 2 * + kernel_h * kernel_w * height_col * width_col; + + const int offset_c = c - deformable_group_index * 2 * kernel_h * kernel_w; + + for (int col_c = (offset_c / 2); col_c < channel_per_deformable_group; + col_c += col_step) { + const int col_pos = + (((col_c * batch_size + b) * height_col) + h) * width_col + w; + const int bp_dir = offset_c % 2; + + int j = (col_pos / width_col / height_col / batch_size) % kernel_w; + int i = + (col_pos / width_col / height_col / batch_size / kernel_w) % kernel_h; + int w_out = col_pos % width_col; + int h_out = (col_pos / width_col) % height_col; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + const int data_offset_h_ptr = + (((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out); + const int data_offset_w_ptr = + (((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + + w_out); + const T offset_h = data_offset_ptr[data_offset_h_ptr]; + const T offset_w = data_offset_ptr[data_offset_w_ptr]; + T inv_h = h_in + i * dilation_h + offset_h; + T inv_w = w_in + j * dilation_w + offset_w; + if (inv_h <= -1 || inv_w <= -1 || inv_h >= height || inv_w >= width) + inv_h = inv_w = -2; + const T weight = get_coordinate_weight(inv_h, inv_w, height, width, + data_im_ptr + cnt * height * width, + width, bp_dir); + val += weight * data_col_ptr[col_pos]; + cnt += 1; + } + + grad_offset[index] = val; + } +} + +#endif // DEFORM_CONV_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/deform_roi_pool_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/deform_roi_pool_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..86c4bc66dd2fb289340a4fb1714edb5db1e798c4 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/deform_roi_pool_cuda_kernel.cuh @@ -0,0 +1,186 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef DEFORM_ROI_POOL_CUDA_KERNEL_CUH +#define DEFORM_ROI_POOL_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void deform_roi_pool_forward_cuda_kernel( + const int nthreads, const T* input, const T* rois, const T* offset, + T* output, const int pooled_height, const int pooled_width, + const T spatial_scale, const int sampling_ratio, const T gamma, + const int channels, const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* offset_rois = rois + n * 5; + int roi_batch_ind = offset_rois[0]; + + // Do not using rounding; this implementation detail is critical + T roi_start_w = offset_rois[1] * spatial_scale - 0.5; + T roi_start_h = offset_rois[2] * spatial_scale - 0.5; + T roi_end_w = offset_rois[3] * spatial_scale - 0.5; + T roi_end_h = offset_rois[4] * spatial_scale - 0.5; + + T roi_width = roi_end_w - roi_start_w; + T roi_height = roi_end_h - roi_start_h; + + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + const T* offset_input = + input + (roi_batch_ind * channels + c) * height * width; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = + (sampling_ratio > 0) + ? sampling_ratio + : static_cast(ceilf(roi_height / pooled_height)); + int roi_bin_grid_w = + (sampling_ratio > 0) + ? sampling_ratio + : static_cast(ceilf(roi_width / pooled_width)); + + // Compute roi offset + if (offset != NULL) { + const T* offset_cur_w = offset + n * pooled_width * pooled_height * 2 + + ph * pooled_width + pw; + T offset_roi_w = gamma * roi_width * offset_cur_w[0]; + T offset_roi_h = + gamma * roi_height * offset_cur_w[pooled_width * pooled_height]; + roi_start_w += offset_roi_w; + roi_start_h += offset_roi_h; + } + + // We do average pooling inside a bin + const T count = max(roi_bin_grid_h * roi_bin_grid_w, 1); + T output_val = 0.; + for (int iy = 0; iy < roi_bin_grid_h; iy++) { + const T y = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + T val = bilinear_interpolate(offset_input, height, width, y, x, index); + output_val += val; + } + } + output[index] = output_val / count; + } +} + +template +__global__ void deform_roi_pool_backward_cuda_kernel( + const int nthreads, const T* grad_output, const T* input, const T* rois, + const T* offset, T* grad_input, T* grad_offset, const int pooled_height, + const int pooled_width, const T spatial_scale, const int sampling_ratio, + const T gamma, const int channels, const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* offset_rois = rois + n * 5; + int roi_batch_ind = offset_rois[0]; + const T* offset_input = + input + ((roi_batch_ind * channels + c) * height * width); + T* offset_grad_input = + grad_input + ((roi_batch_ind * channels + c) * height * width); + + // Do not using rounding; this implementation detail is critical + T roi_start_w = offset_rois[1] * spatial_scale - 0.5; + T roi_start_h = offset_rois[2] * spatial_scale - 0.5; + T roi_end_w = offset_rois[3] * spatial_scale - 0.5; + T roi_end_h = offset_rois[4] * spatial_scale - 0.5; + + T roi_width = roi_end_w - roi_start_w; + T roi_height = roi_end_h - roi_start_h; + + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = + (sampling_ratio > 0) + ? sampling_ratio + : static_cast(ceilf(roi_height / pooled_height)); + int roi_bin_grid_w = + (sampling_ratio > 0) + ? sampling_ratio + : static_cast(ceilf(roi_width / pooled_width)); + + // Compute roi offset + if (offset != NULL) { + const T* offset_cur_w = offset + n * pooled_width * pooled_height * 2 + + ph * pooled_width + pw; + T offset_roi_w = gamma * roi_width * offset_cur_w[0]; + T offset_roi_h = + gamma * roi_height * offset_cur_w[pooled_width * pooled_height]; + roi_start_w += offset_roi_w; + roi_start_h += offset_roi_h; + } + + // We do average (integral) pooling inside a bin + const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 + const T grad_output_this_bin = grad_output[index] / count; + + for (int iy = 0; iy < roi_bin_grid_h; iy++) { + const T y = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + T w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + bilinear_interpolate_gradient(height, width, y, x, w1, w2, w3, w4, + x_low, x_high, y_low, y_high, index); + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + atomicAdd(offset_grad_input + y_low * width + x_low, + grad_output_this_bin * w1); + atomicAdd(offset_grad_input + y_low * width + x_high, + grad_output_this_bin * w2); + atomicAdd(offset_grad_input + y_high * width + x_low, + grad_output_this_bin * w3); + atomicAdd(offset_grad_input + y_high * width + x_high, + grad_output_this_bin * w4); + if (offset != NULL) { + T input_00 = offset_input[y_low * width + x_low]; + T input_10 = offset_input[y_low * width + x_high]; + T input_01 = offset_input[y_high * width + x_low]; + T input_11 = offset_input[y_high * width + x_high]; + T ogx = gamma * roi_width * grad_output_this_bin * + (input_11 * (y - y_low) + input_10 * (y_high - y) + + input_01 * (y_low - y) + input_00 * (y - y_high)); + T ogy = gamma * roi_height * grad_output_this_bin * + (input_11 * (x - x_low) + input_01 * (x_high - x) + + input_10 * (x_low - x) + input_00 * (x - x_high)); + atomicAdd(grad_offset + n * pooled_width * pooled_height * 2 + + ph * pooled_width + pw, + ogx); + atomicAdd(grad_offset + n * pooled_width * pooled_height * 2 + + pooled_width * pooled_height + ph * pooled_width + pw, + ogy); + } + } + } + } + } +} + +#endif // DEFORM_ROI_POOL_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/diff_iou_rotated_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/diff_iou_rotated_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..053977a3011692b22a5dce6050fcfec4797f092c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/diff_iou_rotated_cuda_kernel.cuh @@ -0,0 +1,137 @@ +// Copyright (c) OpenMMLab. All rights reserved +// Adapted from +// https://github.com/lilanxiao/Rotated_IoU/cuda_op/sort_vert_kernel.cu # noqa +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +#define MAX_NUM_VERT_IDX 9 +#define INTERSECTION_OFFSET 8 +#define EPSILON 1e-8 + +inline int opt_n_thread(int work_size) { + const int pow_2 = std::log(static_cast(work_size)) / std::log(2.0); + return max(min(1 << pow_2, THREADS_PER_BLOCK), 1); +} + +/* +compare normalized vertices (vertices around (0,0)) +if vertex1 < vertex2 return true. +order: minimum at x-aixs, become larger in anti-clockwise direction +*/ +__device__ bool compare_vertices(float x1, float y1, float x2, float y2) { + if (fabs(x1 - x2) < EPSILON && fabs(y2 - y1) < EPSILON) + return false; // if equal, return false + + if (y1 > 0 && y2 < 0) return true; + if (y1 < 0 && y2 > 0) return false; + + float n1 = x1 * x1 + y1 * y1 + EPSILON; + float n2 = x2 * x2 + y2 * y2 + EPSILON; + float diff = fabs(x1) * x1 / n1 - fabs(x2) * x2 / n2; + + if (y1 > 0 && y2 > 0) { + if (diff > EPSILON) + return true; + else + return false; + } + if (y1 < 0 && y2 < 0) { + if (diff < EPSILON) + return true; + else + return false; + } + return false; +} + +__global__ void diff_iou_rotated_sort_vertices_forward_cuda_kernel( + int b, int n, int m, const float *__restrict__ vertices, + const bool *__restrict__ mask, const int *__restrict__ num_valid, + int *__restrict__ idx) { + int batch_idx = blockIdx.x; + vertices += batch_idx * n * m * 2; + mask += batch_idx * n * m; + num_valid += batch_idx * n; + idx += batch_idx * n * MAX_NUM_VERT_IDX; + + int index = threadIdx.x; // index of polygon + int stride = blockDim.x; + for (int i = index; i < n; i += stride) { + int pad; // index of arbitrary invalid intersection point (not box corner!) + for (int j = INTERSECTION_OFFSET; j < m; ++j) { + if (!mask[i * m + j]) { + pad = j; + break; + } + } + if (num_valid[i] < 3) { + // not enough vertices, take an invalid intersection point + // (zero padding) + for (int j = 0; j < MAX_NUM_VERT_IDX; ++j) { + idx[i * MAX_NUM_VERT_IDX + j] = pad; + } + } else { + // sort the valid vertices + // note the number of valid vertices is known + // note: check that num_valid[i] < MAX_NUM_VERT_IDX + for (int j = 0; j < num_valid[i]; ++j) { + // initialize with a "big" value + float x_min = 1; + float y_min = -EPSILON; + int i_take = 0; + int i2; + float x2, y2; + if (j != 0) { + i2 = idx[i * MAX_NUM_VERT_IDX + j - 1]; + x2 = vertices[i * m * 2 + i2 * 2 + 0]; + y2 = vertices[i * m * 2 + i2 * 2 + 1]; + } + for (int k = 0; k < m; ++k) { + float x = vertices[i * m * 2 + k * 2 + 0]; + float y = vertices[i * m * 2 + k * 2 + 1]; + if (mask[i * m + k] && compare_vertices(x, y, x_min, y_min)) { + if ((j == 0) || (j != 0 && compare_vertices(x2, y2, x, y))) { + x_min = x; + y_min = y; + i_take = k; + } + } + } + idx[i * MAX_NUM_VERT_IDX + j] = i_take; + } + // duplicate the first idx + idx[i * MAX_NUM_VERT_IDX + num_valid[i]] = idx[i * MAX_NUM_VERT_IDX + 0]; + + // pad zeros + for (int j = num_valid[i] + 1; j < MAX_NUM_VERT_IDX; ++j) { + idx[i * MAX_NUM_VERT_IDX + j] = pad; + } + + // for corner case: the two boxes are exactly the same. + // in this case, idx would have duplicate elements, which makes the + // shoelace formula broken because of the definition, the duplicate + // elements only appear in the first 8 positions (they are "corners in + // box", not "intersection of edges") + if (num_valid[i] == 8) { + int counter = 0; + for (int j = 0; j < 4; ++j) { + int check = idx[i * MAX_NUM_VERT_IDX + j]; + for (int k = 4; k < INTERSECTION_OFFSET; ++k) { + if (idx[i * MAX_NUM_VERT_IDX + k] == check) counter++; + } + } + if (counter == 4) { + idx[i * MAX_NUM_VERT_IDX + 4] = idx[i * MAX_NUM_VERT_IDX + 0]; + for (int j = 5; j < MAX_NUM_VERT_IDX; ++j) { + idx[i * MAX_NUM_VERT_IDX + j] = pad; + } + } + } + + // TODO: still might need to cover some other corner cases :( + } + } +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/furthest_point_sample_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/furthest_point_sample_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..d3801a02c1c8f44874fb84fa884cc23bee25c331 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/furthest_point_sample_cuda_kernel.cuh @@ -0,0 +1,152 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef FURTHEST_POINT_SAMPLE_CUDA_KERNEL_CUH +#define FURTHEST_POINT_SAMPLE_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +__device__ void __update(float *__restrict__ dists, int *__restrict__ dists_i, + int idx1, int idx2) { + const float v1 = dists[idx1], v2 = dists[idx2]; + const int i1 = dists_i[idx1], i2 = dists_i[idx2]; + dists[idx1] = max(v1, v2); + dists_i[idx1] = v2 > v1 ? i2 : i1; +} + +template +__global__ void furthest_point_sampling_forward_cuda_kernel( + int b, int n, int m, const float *__restrict__ dataset, + float *__restrict__ temp, int *__restrict__ idxs) { + // dataset: (B, N, 3) + // tmp: (B, N) + // output: + // idx: (B, M) + + if (m <= 0) return; + __shared__ float dists[block_size]; + __shared__ int dists_i[block_size]; + + int batch_index = blockIdx.x; + dataset += batch_index * n * 3; + temp += batch_index * n; + idxs += batch_index * m; + + int tid = threadIdx.x; + const int stride = block_size; + + int old = 0; + if (threadIdx.x == 0) idxs[0] = old; + + __syncthreads(); + for (int j = 1; j < m; j++) { + int besti = 0; + float best = -1; + float x1 = dataset[old * 3 + 0]; + float y1 = dataset[old * 3 + 1]; + float z1 = dataset[old * 3 + 2]; + for (int k = tid; k < n; k += stride) { + float x2, y2, z2; + x2 = dataset[k * 3 + 0]; + y2 = dataset[k * 3 + 1]; + z2 = dataset[k * 3 + 2]; + // float mag = (x2 * x2) + (y2 * y2) + (z2 * z2); + // if (mag <= 1e-3) + // continue; + + float d = + (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1); + float d2 = min(d, temp[k]); + temp[k] = d2; + besti = d2 > best ? k : besti; + best = d2 > best ? d2 : best; + } + dists[tid] = best; + dists_i[tid] = besti; + __syncthreads(); + +#pragma unroll + for (int block_size_thres = 1024; block_size_thres >= 2; + block_size_thres >>= 1) { + const int tid_thres = block_size_thres / 2; + if (block_size >= block_size_thres && tid < tid_thres) { + __update(dists, dists_i, tid, tid + tid_thres); + } + __syncthreads(); + } + + old = dists_i[0]; + if (tid == 0) idxs[j] = old; + } +} + +// Modified from +// https://github.com/qiqihaer/3DSSD-pytorch/blob/master/lib/pointnet2/src/sampling_gpu.cu +template +__global__ void furthest_point_sampling_with_dist_forward_cuda_kernel( + int b, int n, int m, const float *__restrict__ dataset, + float *__restrict__ temp, int *__restrict__ idxs) { + // dataset: (B, N, N) + // tmp: (B, N) + // output: + // idx: (B, M) + + if (m <= 0) return; + __shared__ float dists[block_size]; + __shared__ int dists_i[block_size]; + + int batch_index = blockIdx.x; + dataset += batch_index * n * n; + temp += batch_index * n; + idxs += batch_index * m; + + int tid = threadIdx.x; + const int stride = block_size; + + int old = 0; + if (threadIdx.x == 0) idxs[0] = old; + + __syncthreads(); + for (int j = 1; j < m; j++) { + int besti = 0; + float best = -1; + // float x1 = dataset[old * 3 + 0]; + // float y1 = dataset[old * 3 + 1]; + // float z1 = dataset[old * 3 + 2]; + for (int k = tid; k < n; k += stride) { + // float x2, y2, z2; + // x2 = dataset[k * 3 + 0]; + // y2 = dataset[k * 3 + 1]; + // z2 = dataset[k * 3 + 2]; + + // float d = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * + // (z2 - z1); + float d = dataset[old * n + k]; + + float d2 = min(d, temp[k]); + temp[k] = d2; + besti = d2 > best ? k : besti; + best = d2 > best ? d2 : best; + } + dists[tid] = best; + dists_i[tid] = besti; + __syncthreads(); + +#pragma unroll + for (int block_size_thres = 1024; block_size_thres >= 2; + block_size_thres >>= 1) { + const int tid_thres = block_size_thres / 2; + if (block_size >= block_size_thres && tid < tid_thres) { + __update(dists, dists_i, tid, tid + tid_thres); + } + __syncthreads(); + } + + old = dists_i[0]; + if (tid == 0) idxs[j] = old; + } +} + +#endif // FURTHEST_POINT_SAMPLE_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/gather_points_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/gather_points_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..6d932434cba245833e661b8c7e140601940bc35b --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/gather_points_cuda_kernel.cuh @@ -0,0 +1,58 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef GATHER_POINTS_CUDA_KERNEL_CUH +#define GATHER_POINTS_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +#define TOTAL_THREADS 1024 + +template +__global__ void gather_points_forward_cuda_kernel(int b, int c, int n, int m, + const T *points, + const int *__restrict__ idx, + T *out) { + // points: (B, C, N) + // idx: (B, M) + // output: + // out: (B, C, M) + + int bs_idx = blockIdx.z; + int c_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, m) { + if (bs_idx >= b || c_idx >= c) return; + + out += bs_idx * c * m + c_idx * m + pt_idx; + idx += bs_idx * m + pt_idx; + points += bs_idx * c * n + c_idx * n; + out[0] = points[idx[0]]; + } +} + +template +__global__ void gather_points_backward_cuda_kernel(int b, int c, int n, int m, + const T *grad_out, + const int *__restrict__ idx, + T *grad_points) { + // grad_out: (B, C, M) + // idx: (B, M) + // output: + // grad_points: (B, C, N) + + int bs_idx = blockIdx.z; + int c_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, m) { + if (bs_idx >= b || c_idx >= c) return; + + grad_out += bs_idx * c * m + c_idx * m + pt_idx; + idx += bs_idx * m + pt_idx; + grad_points += bs_idx * c * n + c_idx * n; + + atomicAdd(grad_points + idx[0], grad_out[0]); + } +} + +#endif // GATHER_POINTS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/group_points_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/group_points_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..dfad66fc16d8759f614d7f36fa961673976b1d95 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/group_points_cuda_kernel.cuh @@ -0,0 +1,65 @@ +// Copyright (c) OpenMMLab. All rights reserved. +// Modified from +// https://github.com/sshaoshuai/Pointnet2.PyTorch/tree/master/pointnet2/src/group_points_gpu.cu +#ifndef GROUP_POINTS_CUDA_KERNEL_CUH +#define GROUP_POINTS_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void group_points_forward_cuda_kernel(int b, int c, int n, + int npoints, int nsample, + const T *points, + const int *__restrict__ idx, + T *out) { + // points: (B, C, N) + // idx: (B, npoints, nsample) + // output: + // out: (B, C, npoints, nsample) + int bs_idx = blockIdx.z; + int c_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(index, npoints * nsample) { + if (bs_idx >= b || c_idx >= c) return; + + int pt_idx = index / nsample; + int sample_idx = index % nsample; + + idx += bs_idx * npoints * nsample + pt_idx * nsample + sample_idx; + int in_idx = bs_idx * c * n + c_idx * n + idx[0]; + int out_idx = bs_idx * c * npoints * nsample + c_idx * npoints * nsample + + pt_idx * nsample + sample_idx; + + out[out_idx] = points[in_idx]; + } +} + +template +__global__ void group_points_backward_cuda_kernel(int b, int c, int n, + int npoints, int nsample, + const T *grad_out, + const int *__restrict__ idx, + T *grad_points) { + // grad_out: (B, C, npoints, nsample) + // idx: (B, npoints, nsample) + // output: + // grad_points: (B, C, N) + int bs_idx = blockIdx.z; + int c_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(index, npoints * nsample) { + int pt_idx = index / nsample; + if (bs_idx >= b || c_idx >= c) return; + + int sample_idx = index % nsample; + grad_out += bs_idx * c * npoints * nsample + c_idx * npoints * nsample + + pt_idx * nsample + sample_idx; + idx += bs_idx * npoints * nsample + pt_idx * nsample + sample_idx; + + atomicAdd(grad_points + bs_idx * c * n + c_idx * n + idx[0], grad_out[0]); + } +} + +#endif // GROUP_POINTS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/iou3d_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/iou3d_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..9ebdcad15eee05a9f412ef34eb12d3553874a4dc --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/iou3d_cuda_kernel.cuh @@ -0,0 +1,367 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef IOU3D_CUDA_KERNEL_CUH +#define IOU3D_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +const int THREADS_PER_BLOCK_IOU3D = 16; +const int THREADS_PER_BLOCK_NMS = sizeof(unsigned long long) * 8; +__device__ const float EPS = 1e-8; + +struct Point { + float x, y; + __device__ Point() {} + __device__ Point(double _x, double _y) { x = _x, y = _y; } + + __device__ void set(float _x, float _y) { + x = _x; + y = _y; + } + + __device__ Point operator+(const Point &b) const { + return Point(x + b.x, y + b.y); + } + + __device__ Point operator-(const Point &b) const { + return Point(x - b.x, y - b.y); + } +}; + +__device__ inline float cross(const Point &a, const Point &b) { + return a.x * b.y - a.y * b.x; +} + +__device__ inline float cross(const Point &p1, const Point &p2, + const Point &p0) { + return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y); +} + +__device__ int check_rect_cross(const Point &p1, const Point &p2, + const Point &q1, const Point &q2) { + int ret = min(p1.x, p2.x) <= max(q1.x, q2.x) && + min(q1.x, q2.x) <= max(p1.x, p2.x) && + min(p1.y, p2.y) <= max(q1.y, q2.y) && + min(q1.y, q2.y) <= max(p1.y, p2.y); + return ret; +} + +__device__ inline int check_in_box2d(const float *box, const Point &p) { + // params: box (7) [x, y, z, dx, dy, dz, heading] + const float MARGIN = 1e-2; + + float center_x = box[0], center_y = box[1]; + // rotate the point in the opposite direction of box + float angle_cos = cos(-box[6]), angle_sin = sin(-box[6]); + float rot_x = (p.x - center_x) * angle_cos + (p.y - center_y) * (-angle_sin); + float rot_y = (p.x - center_x) * angle_sin + (p.y - center_y) * angle_cos; + + return (fabs(rot_x) < box[3] / 2 + MARGIN && + fabs(rot_y) < box[4] / 2 + MARGIN); +} + +__device__ inline int intersection(const Point &p1, const Point &p0, + const Point &q1, const Point &q0, + Point &ans_point) { + // fast exclusion + if (check_rect_cross(p0, p1, q0, q1) == 0) return 0; + + // check cross standing + float s1 = cross(q0, p1, p0); + float s2 = cross(p1, q1, p0); + float s3 = cross(p0, q1, q0); + float s4 = cross(q1, p1, q0); + + if (!(s1 * s2 > 0 && s3 * s4 > 0)) return 0; + + // calculate intersection of two lines + float s5 = cross(q1, p1, p0); + if (fabs(s5 - s1) > EPS) { + ans_point.x = (s5 * q0.x - s1 * q1.x) / (s5 - s1); + ans_point.y = (s5 * q0.y - s1 * q1.y) / (s5 - s1); + + } else { + float a0 = p0.y - p1.y, b0 = p1.x - p0.x, c0 = p0.x * p1.y - p1.x * p0.y; + float a1 = q0.y - q1.y, b1 = q1.x - q0.x, c1 = q0.x * q1.y - q1.x * q0.y; + float D = a0 * b1 - a1 * b0; + + ans_point.x = (b0 * c1 - b1 * c0) / D; + ans_point.y = (a1 * c0 - a0 * c1) / D; + } + + return 1; +} + +__device__ inline void rotate_around_center(const Point ¢er, + const float angle_cos, + const float angle_sin, Point &p) { + float new_x = + (p.x - center.x) * angle_cos - (p.y - center.y) * angle_sin + center.x; + float new_y = + (p.x - center.x) * angle_sin + (p.y - center.y) * angle_cos + center.y; + p.set(new_x, new_y); +} + +__device__ inline int point_cmp(const Point &a, const Point &b, + const Point ¢er) { + return atan2(a.y - center.y, a.x - center.x) > + atan2(b.y - center.y, b.x - center.x); +} + +__device__ inline float box_overlap(const float *box_a, const float *box_b) { + // params box_a: [x, y, z, dx, dy, dz, heading] + // params box_b: [x, y, z, dx, dy, dz, heading] + + float a_angle = box_a[6], b_angle = box_b[6]; + float a_dx_half = box_a[3] / 2, b_dx_half = box_b[3] / 2, + a_dy_half = box_a[4] / 2, b_dy_half = box_b[4] / 2; + float a_x1 = box_a[0] - a_dx_half, a_y1 = box_a[1] - a_dy_half; + float a_x2 = box_a[0] + a_dx_half, a_y2 = box_a[1] + a_dy_half; + float b_x1 = box_b[0] - b_dx_half, b_y1 = box_b[1] - b_dy_half; + float b_x2 = box_b[0] + b_dx_half, b_y2 = box_b[1] + b_dy_half; + + Point center_a(box_a[0], box_a[1]); + Point center_b(box_b[0], box_b[1]); + + Point box_a_corners[5]; + box_a_corners[0].set(a_x1, a_y1); + box_a_corners[1].set(a_x2, a_y1); + box_a_corners[2].set(a_x2, a_y2); + box_a_corners[3].set(a_x1, a_y2); + + Point box_b_corners[5]; + box_b_corners[0].set(b_x1, b_y1); + box_b_corners[1].set(b_x2, b_y1); + box_b_corners[2].set(b_x2, b_y2); + box_b_corners[3].set(b_x1, b_y2); + + // get oriented corners + float a_angle_cos = cos(a_angle), a_angle_sin = sin(a_angle); + float b_angle_cos = cos(b_angle), b_angle_sin = sin(b_angle); + + for (int k = 0; k < 4; k++) { + rotate_around_center(center_a, a_angle_cos, a_angle_sin, box_a_corners[k]); + rotate_around_center(center_b, b_angle_cos, b_angle_sin, box_b_corners[k]); + } + + box_a_corners[4] = box_a_corners[0]; + box_b_corners[4] = box_b_corners[0]; + + // get intersection of lines + Point cross_points[16]; + Point poly_center; + int cnt = 0, flag = 0; + + poly_center.set(0, 0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + flag = intersection(box_a_corners[i + 1], box_a_corners[i], + box_b_corners[j + 1], box_b_corners[j], + cross_points[cnt]); + if (flag) { + poly_center = poly_center + cross_points[cnt]; + cnt++; + } + } + } + + // check corners + for (int k = 0; k < 4; k++) { + if (check_in_box2d(box_a, box_b_corners[k])) { + poly_center = poly_center + box_b_corners[k]; + cross_points[cnt] = box_b_corners[k]; + cnt++; + } + if (check_in_box2d(box_b, box_a_corners[k])) { + poly_center = poly_center + box_a_corners[k]; + cross_points[cnt] = box_a_corners[k]; + cnt++; + } + } + + poly_center.x /= cnt; + poly_center.y /= cnt; + + // sort the points of polygon + Point temp; + for (int j = 0; j < cnt - 1; j++) { + for (int i = 0; i < cnt - j - 1; i++) { + if (point_cmp(cross_points[i], cross_points[i + 1], poly_center)) { + temp = cross_points[i]; + cross_points[i] = cross_points[i + 1]; + cross_points[i + 1] = temp; + } + } + } + + // get the overlap areas + float area = 0; + for (int k = 0; k < cnt - 1; k++) { + area += cross(cross_points[k] - cross_points[0], + cross_points[k + 1] - cross_points[0]); + } + + return fabs(area) / 2.0; +} + +__device__ inline float iou_bev(const float *box_a, const float *box_b) { + // params box_a: [x, y, z, dx, dy, dz, heading] + // params box_b: [x, y, z, dx, dy, dz, heading] + float sa = box_a[3] * box_a[4]; + float sb = box_b[3] * box_b[4]; + float s_overlap = box_overlap(box_a, box_b); + return s_overlap / fmaxf(sa + sb - s_overlap, EPS); +} + +__global__ void iou3d_boxes_overlap_bev_forward_cuda_kernel( + const int num_a, const float *boxes_a, const int num_b, + const float *boxes_b, float *ans_overlap) { + // params boxes_a: (N, 7) [x, y, z, dx, dy, dz, heading] + // params boxes_b: (M, 7) [x, y, z, dx, dy, dz, heading] + CUDA_2D_KERNEL_LOOP(b_idx, num_b, a_idx, num_a) { + if (a_idx >= num_a || b_idx >= num_b) { + return; + } + + const float *cur_box_a = boxes_a + a_idx * 7; + const float *cur_box_b = boxes_b + b_idx * 7; + float cur_overlap = box_overlap(cur_box_a, cur_box_b); + ans_overlap[a_idx * num_b + b_idx] = cur_overlap; + } +} + +__global__ void iou3d_nms3d_forward_cuda_kernel(const int boxes_num, + const float nms_overlap_thresh, + const float *boxes, + unsigned long long *mask) { + // params: boxes (N, 7) [x, y, z, dx, dy, dz, heading] + // params: mask (N, N/THREADS_PER_BLOCK_NMS) + const int blocks = + (boxes_num + THREADS_PER_BLOCK_NMS - 1) / THREADS_PER_BLOCK_NMS; + CUDA_2D_KERNEL_BLOCK_LOOP(col_start, blocks, row_start, blocks) { + // if (row_start > col_start) return; + + const int row_size = fminf(boxes_num - row_start * THREADS_PER_BLOCK_NMS, + THREADS_PER_BLOCK_NMS); + const int col_size = fminf(boxes_num - col_start * THREADS_PER_BLOCK_NMS, + THREADS_PER_BLOCK_NMS); + + __shared__ float block_boxes[THREADS_PER_BLOCK_NMS * 7]; + + if (threadIdx.x < col_size) { + block_boxes[threadIdx.x * 7 + 0] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 0]; + block_boxes[threadIdx.x * 7 + 1] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 1]; + block_boxes[threadIdx.x * 7 + 2] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 2]; + block_boxes[threadIdx.x * 7 + 3] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 3]; + block_boxes[threadIdx.x * 7 + 4] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 4]; + block_boxes[threadIdx.x * 7 + 5] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 5]; + block_boxes[threadIdx.x * 7 + 6] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 6]; + } + __syncthreads(); + + if (threadIdx.x < row_size) { + const int cur_box_idx = THREADS_PER_BLOCK_NMS * row_start + threadIdx.x; + const float *cur_box = boxes + cur_box_idx * 7; + + int i = 0; + unsigned long long t = 0; + int start = 0; + if (row_start == col_start) { + start = threadIdx.x + 1; + } + for (i = start; i < col_size; i++) { + if (iou_bev(cur_box, block_boxes + i * 7) > nms_overlap_thresh) { + t |= 1ULL << i; + } + } + const int col_blocks = + (boxes_num + THREADS_PER_BLOCK_NMS - 1) / THREADS_PER_BLOCK_NMS; + mask[cur_box_idx * col_blocks + col_start] = t; + } + } +} + +__device__ inline float iou_normal(float const *const a, float const *const b) { + // params: a: [x, y, z, dx, dy, dz, heading] + // params: b: [x, y, z, dx, dy, dz, heading] + + float left = fmaxf(a[0] - a[3] / 2, b[0] - b[3] / 2), + right = fminf(a[0] + a[3] / 2, b[0] + b[3] / 2); + float top = fmaxf(a[1] - a[4] / 2, b[1] - b[4] / 2), + bottom = fminf(a[1] + a[4] / 2, b[1] + b[4] / 2); + float width = fmaxf(right - left, 0.f), height = fmaxf(bottom - top, 0.f); + float interS = width * height; + float Sa = a[3] * a[4]; + float Sb = b[3] * b[4]; + return interS / fmaxf(Sa + Sb - interS, EPS); +} + +__global__ void iou3d_nms3d_normal_forward_cuda_kernel( + const int boxes_num, const float nms_overlap_thresh, const float *boxes, + unsigned long long *mask) { + // params: boxes (N, 7) [x, y, z, dx, dy, dz, heading] + // params: mask (N, N/THREADS_PER_BLOCK_NMS) + + const int blocks = + (boxes_num + THREADS_PER_BLOCK_NMS - 1) / THREADS_PER_BLOCK_NMS; + CUDA_2D_KERNEL_BLOCK_LOOP(col_start, blocks, row_start, blocks) { + // if (row_start > col_start) return; + + const int row_size = fminf(boxes_num - row_start * THREADS_PER_BLOCK_NMS, + THREADS_PER_BLOCK_NMS); + const int col_size = fminf(boxes_num - col_start * THREADS_PER_BLOCK_NMS, + THREADS_PER_BLOCK_NMS); + + __shared__ float block_boxes[THREADS_PER_BLOCK_NMS * 7]; + + if (threadIdx.x < col_size) { + block_boxes[threadIdx.x * 7 + 0] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 0]; + block_boxes[threadIdx.x * 7 + 1] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 1]; + block_boxes[threadIdx.x * 7 + 2] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 2]; + block_boxes[threadIdx.x * 7 + 3] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 3]; + block_boxes[threadIdx.x * 7 + 4] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 4]; + block_boxes[threadIdx.x * 7 + 5] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 5]; + block_boxes[threadIdx.x * 7 + 6] = + boxes[(THREADS_PER_BLOCK_NMS * col_start + threadIdx.x) * 7 + 6]; + } + __syncthreads(); + + if (threadIdx.x < row_size) { + const int cur_box_idx = THREADS_PER_BLOCK_NMS * row_start + threadIdx.x; + const float *cur_box = boxes + cur_box_idx * 7; + + int i = 0; + unsigned long long t = 0; + int start = 0; + if (row_start == col_start) { + start = threadIdx.x + 1; + } + for (i = start; i < col_size; i++) { + if (iou_normal(cur_box, block_boxes + i * 7) > nms_overlap_thresh) { + t |= 1ULL << i; + } + } + const int col_blocks = + (boxes_num + THREADS_PER_BLOCK_NMS - 1) / THREADS_PER_BLOCK_NMS; + mask[cur_box_idx * col_blocks + col_start] = t; + } + } +} + +#endif // IOU3D_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/knn_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/knn_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..3cf52bb90eb27d02b28c52069c760c8a38f83f08 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/knn_cuda_kernel.cuh @@ -0,0 +1,92 @@ +// Copyright (c) OpenMMLab. All rights reserved +// Modified from +// https://github.com/CVMI-Lab/PAConv/tree/main/scene_seg/lib/pointops/src/knnquery_heap +#ifndef KNN_CUDA_KERNEL_CUH +#define KNN_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +inline __device__ void swap_float(float *x, float *y) { + float tmp = *x; + *x = *y; + *y = tmp; +} + +inline __device__ void swap_int(int *x, int *y) { + int tmp = *x; + *x = *y; + *y = tmp; +} + +__device__ void reheap(float *dist, int *idx, int k) { + int root = 0; + int child = root * 2 + 1; + while (child < k) { + if (child + 1 < k && dist[child + 1] > dist[child]) child++; + if (dist[root] > dist[child]) return; + swap_float(&dist[root], &dist[child]); + swap_int(&idx[root], &idx[child]); + root = child; + child = root * 2 + 1; + } +} + +__device__ void heap_sort(float *dist, int *idx, int k) { + int i; + for (i = k - 1; i > 0; i--) { + swap_float(&dist[0], &dist[i]); + swap_int(&idx[0], &idx[i]); + reheap(dist, idx, i); + } +} + +// input: xyz (b, n, 3) new_xyz (b, m, 3) +// output: idx (b, m, nsample) dist2 (b, m, nsample) +template +__global__ void knn_forward_cuda_kernel(int b, int n, int m, int nsample, + const T *xyz, const T *new_xyz, + int *__restrict__ idx, T *dist2) { + int bs_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, m) { + if (bs_idx >= b) return; + + new_xyz += bs_idx * m * 3 + pt_idx * 3; + xyz += bs_idx * n * 3; + idx += bs_idx * m * nsample + pt_idx * nsample; + dist2 += bs_idx * m * nsample + pt_idx * nsample; + + T new_x = new_xyz[0]; + T new_y = new_xyz[1]; + T new_z = new_xyz[2]; + + float best_dist[100]; + int best_idx[100]; + for (int i = 0; i < nsample; i++) { + best_dist[i] = 1e10; + best_idx[i] = 0; + } + for (int i = 0; i < n; i++) { + T x = xyz[i * 3 + 0]; + T y = xyz[i * 3 + 1]; + T z = xyz[i * 3 + 2]; + T d2 = (new_x - x) * (new_x - x) + (new_y - y) * (new_y - y) + + (new_z - z) * (new_z - z); + if (d2 < best_dist[0]) { + best_dist[0] = d2; + best_idx[0] = i; + reheap(best_dist, best_idx, nsample); + } + } + heap_sort(best_dist, best_idx, nsample); + for (int i = 0; i < nsample; i++) { + idx[i] = best_idx[i]; + dist2[i] = best_dist[i]; + } + } +} + +#endif // KNN_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/masked_conv2d_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/masked_conv2d_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..1a0bd040e823eaaa79f96e525f961a8b8fbeafb5 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/masked_conv2d_cuda_kernel.cuh @@ -0,0 +1,62 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef MASKED_CONV2D_CUDA_KERNEL_CUH +#define MASKED_CONV2D_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void MaskedIm2colForward(const int n, const scalar_t *data_im, + const int height, const int width, + const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int64_t *mask_h_idx, + const int64_t *mask_w_idx, + const int mask_cnt, scalar_t *data_col) { + // mask_cnt * channels + CUDA_1D_KERNEL_LOOP(index, n) { + const int m_index = index % mask_cnt; + const int h_col = mask_h_idx[m_index]; + const int w_col = mask_w_idx[m_index]; + const int c_im = index / mask_cnt; + const int c_col = c_im * kernel_h * kernel_w; + const int h_offset = h_col - pad_h; + const int w_offset = w_col - pad_w; + scalar_t *data_col_ptr = data_col + c_col * mask_cnt + m_index; + for (int i = 0; i < kernel_h; ++i) { + int h_im = h_offset + i; + for (int j = 0; j < kernel_w; ++j) { + int w_im = w_offset + j; + if (h_im >= 0 && w_im >= 0 && h_im < height && w_im < width) { + *data_col_ptr = + (scalar_t)data_im[(c_im * height + h_im) * width + w_im]; + } else { + *data_col_ptr = 0.0; + } + data_col_ptr += mask_cnt; + } + } + } +} + +template +__global__ void MaskedCol2imForward(const int n, const scalar_t *data_col, + const int height, const int width, + const int channels, + const int64_t *mask_h_idx, + const int64_t *mask_w_idx, + const int mask_cnt, scalar_t *data_im) { + CUDA_1D_KERNEL_LOOP(index, n) { + const int m_index = index % mask_cnt; + const int h_im = mask_h_idx[m_index]; + const int w_im = mask_w_idx[m_index]; + const int c_im = index / mask_cnt; + // compute the start and end of the output + data_im[(c_im * height + h_im) * width + w_im] = data_col[index]; + } +} + +#endif // MASKED_CONV2D_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/min_area_polygons_cuda.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/min_area_polygons_cuda.cuh new file mode 100644 index 0000000000000000000000000000000000000000..df56e743669c3426f6abb113e4209d0cc60f2baf --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/min_area_polygons_cuda.cuh @@ -0,0 +1,300 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef MIN_AREA_POLYGONS_CUDA_KERNEL_CUH +#define MIN_AREA_POLYGONS_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +#define MAXN 20 +__device__ const float PI = 3.1415926; + +struct Point { + float x, y; + __device__ Point() {} + __device__ Point(float x, float y) : x(x), y(y) {} +}; + +__device__ inline void swap1(Point *a, Point *b) { + Point temp; + temp.x = a->x; + temp.y = a->y; + + a->x = b->x; + a->y = b->y; + + b->x = temp.x; + b->y = temp.y; +} +__device__ inline float cross(Point o, Point a, Point b) { + return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y); +} + +__device__ inline float dis(Point a, Point b) { + return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); +} +__device__ inline void minBoundingRect(Point *ps, int n_points, float *minbox) { + float convex_points[2][MAXN]; + for (int j = 0; j < n_points; j++) { + convex_points[0][j] = ps[j].x; + } + for (int j = 0; j < n_points; j++) { + convex_points[1][j] = ps[j].y; + } + + Point edges[MAXN]; + float edges_angles[MAXN]; + float unique_angles[MAXN]; + int n_edges = n_points - 1; + int n_unique = 0; + int unique_flag = 0; + + for (int i = 0; i < n_edges; i++) { + edges[i].x = ps[i + 1].x - ps[i].x; + edges[i].y = ps[i + 1].y - ps[i].y; + } + for (int i = 0; i < n_edges; i++) { + edges_angles[i] = atan2((double)edges[i].y, (double)edges[i].x); + if (edges_angles[i] >= 0) { + edges_angles[i] = fmod((double)edges_angles[i], (double)PI / 2); + } else { + edges_angles[i] = + edges_angles[i] - (int)(edges_angles[i] / (PI / 2) - 1) * (PI / 2); + } + } + unique_angles[0] = edges_angles[0]; + n_unique += 1; + for (int i = 1; i < n_edges; i++) { + for (int j = 0; j < n_unique; j++) { + if (edges_angles[i] == unique_angles[j]) { + unique_flag += 1; + } + } + if (unique_flag == 0) { + unique_angles[n_unique] = edges_angles[i]; + n_unique += 1; + unique_flag = 0; + } else { + unique_flag = 0; + } + } + + float minarea = 1e12; + for (int i = 0; i < n_unique; i++) { + float R[2][2]; + float rot_points[2][MAXN]; + R[0][0] = cos(unique_angles[i]); + R[0][1] = sin(unique_angles[i]); + R[1][0] = -sin(unique_angles[i]); + R[1][1] = cos(unique_angles[i]); + // R x Points + for (int m = 0; m < 2; m++) { + for (int n = 0; n < n_points; n++) { + float sum = 0.0; + for (int k = 0; k < 2; k++) { + sum = sum + R[m][k] * convex_points[k][n]; + } + rot_points[m][n] = sum; + } + } + + // xmin; + float xmin, ymin, xmax, ymax; + xmin = 1e12; + for (int j = 0; j < n_points; j++) { + if (isinf(rot_points[0][j]) || isnan(rot_points[0][j])) { + continue; + } else { + if (rot_points[0][j] < xmin) { + xmin = rot_points[0][j]; + } + } + } + // ymin + ymin = 1e12; + for (int j = 0; j < n_points; j++) { + if (isinf(rot_points[1][j]) || isnan(rot_points[1][j])) { + continue; + } else { + if (rot_points[1][j] < ymin) { + ymin = rot_points[1][j]; + } + } + } + // xmax + xmax = -1e12; + for (int j = 0; j < n_points; j++) { + if (isinf(rot_points[0][j]) || isnan(rot_points[0][j])) { + continue; + } else { + if (rot_points[0][j] > xmax) { + xmax = rot_points[0][j]; + } + } + } + // ymax + ymax = -1e12; + for (int j = 0; j < n_points; j++) { + if (isinf(rot_points[1][j]) || isnan(rot_points[1][j])) { + continue; + } else { + if (rot_points[1][j] > ymax) { + ymax = rot_points[1][j]; + } + } + } + float area = (xmax - xmin) * (ymax - ymin); + if (area < minarea) { + minarea = area; + minbox[0] = unique_angles[i]; + minbox[1] = xmin; + minbox[2] = ymin; + minbox[3] = xmax; + minbox[4] = ymax; + } + } +} + +// convex_find +__device__ inline void Jarvis(Point *in_poly, int &n_poly) { + int n_input = n_poly; + Point input_poly[20]; + for (int i = 0; i < n_input; i++) { + input_poly[i].x = in_poly[i].x; + input_poly[i].y = in_poly[i].y; + } + Point p_max, p_k; + int max_index, k_index; + int Stack[20], top1, top2; + // float sign; + double sign; + Point right_point[10], left_point[10]; + + for (int i = 0; i < n_poly; i++) { + if (in_poly[i].y < in_poly[0].y || + in_poly[i].y == in_poly[0].y && in_poly[i].x < in_poly[0].x) { + Point *j = &(in_poly[0]); + Point *k = &(in_poly[i]); + swap1(j, k); + } + if (i == 0) { + p_max = in_poly[0]; + max_index = 0; + } + if (in_poly[i].y > p_max.y || + in_poly[i].y == p_max.y && in_poly[i].x > p_max.x) { + p_max = in_poly[i]; + max_index = i; + } + } + if (max_index == 0) { + max_index = 1; + p_max = in_poly[max_index]; + } + + k_index = 0, Stack[0] = 0, top1 = 0; + while (k_index != max_index) { + p_k = p_max; + k_index = max_index; + for (int i = 1; i < n_poly; i++) { + sign = cross(in_poly[Stack[top1]], in_poly[i], p_k); + if ((sign > 0) || ((sign == 0) && (dis(in_poly[Stack[top1]], in_poly[i]) > + dis(in_poly[Stack[top1]], p_k)))) { + p_k = in_poly[i]; + k_index = i; + } + } + top1++; + Stack[top1] = k_index; + } + + for (int i = 0; i <= top1; i++) { + right_point[i] = in_poly[Stack[i]]; + } + + k_index = 0, Stack[0] = 0, top2 = 0; + + while (k_index != max_index) { + p_k = p_max; + k_index = max_index; + for (int i = 1; i < n_poly; i++) { + sign = cross(in_poly[Stack[top2]], in_poly[i], p_k); + if ((sign < 0) || (sign == 0) && (dis(in_poly[Stack[top2]], in_poly[i]) > + dis(in_poly[Stack[top2]], p_k))) { + p_k = in_poly[i]; + k_index = i; + } + } + top2++; + Stack[top2] = k_index; + } + + for (int i = top2 - 1; i >= 0; i--) { + left_point[i] = in_poly[Stack[i]]; + } + + for (int i = 0; i < top1 + top2; i++) { + if (i <= top1) { + in_poly[i] = right_point[i]; + } else { + in_poly[i] = left_point[top2 - (i - top1)]; + } + } + n_poly = top1 + top2; +} + +template +__device__ inline void Findminbox(T const *const p, T *minpoints) { + Point ps1[MAXN]; + Point convex[MAXN]; + for (int i = 0; i < 9; i++) { + convex[i].x = p[i * 2]; + convex[i].y = p[i * 2 + 1]; + } + int n_convex = 9; + Jarvis(convex, n_convex); + int n1 = n_convex; + for (int i = 0; i < n1; i++) { + ps1[i].x = convex[i].x; + ps1[i].y = convex[i].y; + } + ps1[n1].x = convex[0].x; + ps1[n1].y = convex[0].y; + + float minbbox[5] = {0}; + minBoundingRect(ps1, n1 + 1, minbbox); + float angle = minbbox[0]; + float xmin = minbbox[1]; + float ymin = minbbox[2]; + float xmax = minbbox[3]; + float ymax = minbbox[4]; + float R[2][2]; + + R[0][0] = cos(angle); + R[0][1] = sin(angle); + R[1][0] = -sin(angle); + R[1][1] = cos(angle); + + minpoints[0] = xmax * R[0][0] + ymin * R[1][0]; + minpoints[1] = xmax * R[0][1] + ymin * R[1][1]; + minpoints[2] = xmin * R[0][0] + ymin * R[1][0]; + minpoints[3] = xmin * R[0][1] + ymin * R[1][1]; + minpoints[4] = xmin * R[0][0] + ymax * R[1][0]; + minpoints[5] = xmin * R[0][1] + ymax * R[1][1]; + minpoints[6] = xmax * R[0][0] + ymax * R[1][0]; + minpoints[7] = xmax * R[0][1] + ymax * R[1][1]; +} + +template +__global__ void min_area_polygons_cuda_kernel(const int ex_n_boxes, + const T *ex_boxes, T *minbox) { + CUDA_1D_KERNEL_LOOP(index, ex_n_boxes) { + const T *cur_box = ex_boxes + index * 18; + T *cur_min_box = minbox + index * 8; + Findminbox(cur_box, cur_min_box); + } +} + +#endif // MIN_AREA_POLYGONS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/modulated_deform_conv_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/modulated_deform_conv_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..ca0e91a25246569bb7de04649ab4f5afe233670c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/modulated_deform_conv_cuda_kernel.cuh @@ -0,0 +1,399 @@ +/*! + ******************* BEGIN Caffe Copyright Notice and Disclaimer + ***************** + * + * COPYRIGHT + * + * All contributions by the University of California: + * Copyright (c) 2014-2017 The Regents of the University of California (Regents) + * All rights reserved. + * + * All other contributions: + * Copyright (c) 2014-2017, the respective contributors + * All rights reserved. + * + * Caffe uses a shared copyright model: each contributor holds copyright over + * their contributions to Caffe. The project versioning records all such + * contribution and copyright details. If a contributor wants to further mark + * their specific copyright on a particular contribution, they should indicate + * their copyright solely in the commit message of the change when it is + * committed. + * + * LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + *AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + *IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + *DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + *SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + *CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + *OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + *OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * CONTRIBUTION AGREEMENT + * + * By contributing to the BVLC/caffe repository through pull-request, comment, + * or otherwise, the contributor releases their content to the + * license and copyright terms herein. + * + ***************** END Caffe Copyright Notice and Disclaimer + ********************* + * + * Copyright (c) 2018 Microsoft + * Licensed under The MIT License [see LICENSE for details] + * \file modulated_deformable_im2col.cuh + * \brief Function definitions of converting an image to + * column matrix based on kernel, padding, dilation, and offset. + * These functions are mainly used in deformable convolution operators. + * \ref: https://arxiv.org/abs/1703.06211 + * \author Yuwen Xiong, Haozhi Qi, Jifeng Dai, Xizhou Zhu, Han Hu, Dazhi Cheng + */ + +// modified from +// https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/blob/mmdetection/mmdet/ops/dcn/src/deform_conv_cuda_kernel.cu + +#ifndef MODULATED_DEFORM_CONV_CUDA_KERNEL_CUH +#define MODULATED_DEFORM_CONV_CUDA_KERNEL_CUH + +#include +#ifdef MMCV_WITH_TRT +#include "common_cuda_helper.hpp" +#else // MMCV_WITH_TRT +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else // MMCV_USE_PARROTS +#include "pytorch_cuda_helper.hpp" +#endif // MMCV_USE_PARROTS +#endif // MMCV_WITH_TRT + +template +__device__ T dmcn_im2col_bilinear(const T *input, const int data_width, + const int height, const int width, T h, T w) { + int h_low = floorf(h); + int w_low = floorf(w); + int h_high = h_low + 1; + int w_high = w_low + 1; + + T lh = h - h_low; + T lw = w - w_low; + T hh = 1 - lh, hw = 1 - lw; + + T v1 = 0; + if (h_low >= 0 && w_low >= 0) v1 = input[h_low * data_width + w_low]; + T v2 = 0; + if (h_low >= 0 && w_high <= width - 1) + v2 = input[h_low * data_width + w_high]; + T v3 = 0; + if (h_high <= height - 1 && w_low >= 0) + v3 = input[h_high * data_width + w_low]; + T v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) + v4 = input[h_high * data_width + w_high]; + + T w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + + T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + return val; +} + +template +__device__ T dmcn_get_gradient_weight(T argmax_h, T argmax_w, const int h, + const int w, const int height, + const int width) { + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || + argmax_w >= width) { + // empty + return 0; + } + + int argmax_h_low = floorf(argmax_h); + int argmax_w_low = floorf(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + T weight = 0; + if (h == argmax_h_low && w == argmax_w_low) + weight = (h + 1 - argmax_h) * (w + 1 - argmax_w); + if (h == argmax_h_low && w == argmax_w_high) + weight = (h + 1 - argmax_h) * (argmax_w + 1 - w); + if (h == argmax_h_high && w == argmax_w_low) + weight = (argmax_h + 1 - h) * (w + 1 - argmax_w); + if (h == argmax_h_high && w == argmax_w_high) + weight = (argmax_h + 1 - h) * (argmax_w + 1 - w); + return weight; +} + +template +__device__ T dmcn_get_coordinate_weight(T argmax_h, T argmax_w, + const int height, const int width, + const T *im_data, const int data_width, + const int bp_dir) { + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || + argmax_w >= width) { + // empty + return 0; + } + + int argmax_h_low = floorf(argmax_h); + int argmax_w_low = floorf(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + T weight = 0; + + if (bp_dir == 0) { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_w_low + 1 - argmax_w) * + im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += -1 * (argmax_w - argmax_w_low) * + im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += (argmax_w_low + 1 - argmax_w) * + im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_w - argmax_w_low) * + im_data[argmax_h_high * data_width + argmax_w_high]; + } else if (bp_dir == 1) { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_h_low + 1 - argmax_h) * + im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += (argmax_h_low + 1 - argmax_h) * + im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += -1 * (argmax_h - argmax_h_low) * + im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_h - argmax_h_low) * + im_data[argmax_h_high * data_width + argmax_w_high]; + } + + return weight; +} + +template +__global__ void modulated_deformable_im2col_gpu_kernel( + const int n, const T *data_im, const T *data_offset, const T *data_mask, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, const int batch_size, + const int num_channels, const int deformable_group, const int height_col, + const int width_col, T *data_col) { + CUDA_1D_KERNEL_LOOP(index, n) { + // index index of output matrix + const int w_col = index % width_col; + const int h_col = (index / width_col) % height_col; + const int b_col = (index / width_col / height_col) % batch_size; + const int c_im = (index / width_col / height_col) / batch_size; + const int c_col = c_im * kernel_h * kernel_w; + + // compute deformable group index + const int deformable_group_index = c_im / channel_per_deformable_group; + + const int h_in = h_col * stride_h - pad_h; + const int w_in = w_col * stride_w - pad_w; + + T *data_col_ptr = + data_col + + ((c_col * batch_size + b_col) * height_col + h_col) * width_col + w_col; + const T *data_im_ptr = + data_im + (b_col * num_channels + c_im) * height * width; + const T *data_offset_ptr = + data_offset + (b_col * deformable_group + deformable_group_index) * 2 * + kernel_h * kernel_w * height_col * width_col; + + const T *data_mask_ptr = + data_mask + (b_col * deformable_group + deformable_group_index) * + kernel_h * kernel_w * height_col * width_col; + + for (int i = 0; i < kernel_h; ++i) { + for (int j = 0; j < kernel_w; ++j) { + const int data_offset_h_ptr = + ((2 * (i * kernel_w + j)) * height_col + h_col) * width_col + w_col; + const int data_offset_w_ptr = + ((2 * (i * kernel_w + j) + 1) * height_col + h_col) * width_col + + w_col; + const int data_mask_hw_ptr = + ((i * kernel_w + j) * height_col + h_col) * width_col + w_col; + const T offset_h = data_offset_ptr[data_offset_h_ptr]; + const T offset_w = data_offset_ptr[data_offset_w_ptr]; + const T mask = data_mask_ptr[data_mask_hw_ptr]; + T val = static_cast(0); + const T h_im = h_in + i * dilation_h + offset_h; + const T w_im = w_in + j * dilation_w + offset_w; + if (h_im > -1 && w_im > -1 && h_im < height && w_im < width) + val = dmcn_im2col_bilinear(data_im_ptr, width, height, width, h_im, + w_im); + *data_col_ptr = val * mask; + data_col_ptr += batch_size * height_col * width_col; + } + } + } +} + +template +__global__ void modulated_deformable_col2im_gpu_kernel( + const int n, const T *data_col, const T *data_offset, const T *data_mask, + const int channels, const int height, const int width, const int kernel_h, + const int kernel_w, const int pad_h, const int pad_w, const int stride_h, + const int stride_w, const int dilation_h, const int dilation_w, + const int channel_per_deformable_group, const int batch_size, + const int deformable_group, const int height_col, const int width_col, + T *grad_im) { + CUDA_1D_KERNEL_LOOP(index, n) { + const int j = (index / width_col / height_col / batch_size) % kernel_w; + const int i = + (index / width_col / height_col / batch_size / kernel_w) % kernel_h; + const int c = + index / width_col / height_col / batch_size / kernel_w / kernel_h; + // compute the start and end of the output + + const int deformable_group_index = c / channel_per_deformable_group; + + int w_out = index % width_col; + int h_out = (index / width_col) % height_col; + int b = (index / width_col / height_col) % batch_size; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + + const T *data_offset_ptr = + data_offset + (b * deformable_group + deformable_group_index) * 2 * + kernel_h * kernel_w * height_col * width_col; + const T *data_mask_ptr = + data_mask + (b * deformable_group + deformable_group_index) * kernel_h * + kernel_w * height_col * width_col; + const int data_offset_h_ptr = + ((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out; + const int data_offset_w_ptr = + ((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out; + const int data_mask_hw_ptr = + ((i * kernel_w + j) * height_col + h_out) * width_col + w_out; + const T offset_h = data_offset_ptr[data_offset_h_ptr]; + const T offset_w = data_offset_ptr[data_offset_w_ptr]; + const T mask = data_mask_ptr[data_mask_hw_ptr]; + const T cur_inv_h_data = h_in + i * dilation_h + offset_h; + const T cur_inv_w_data = w_in + j * dilation_w + offset_w; + + const T cur_top_grad = data_col[index] * mask; + const int cur_h = (int)cur_inv_h_data; + const int cur_w = (int)cur_inv_w_data; + for (int dy = -2; dy <= 2; dy++) { + for (int dx = -2; dx <= 2; dx++) { + if (cur_h + dy >= 0 && cur_h + dy < height && cur_w + dx >= 0 && + cur_w + dx < width && abs(cur_inv_h_data - (cur_h + dy)) < 1 && + abs(cur_inv_w_data - (cur_w + dx)) < 1) { + int cur_bottom_grad_pos = + ((b * channels + c) * height + cur_h + dy) * width + cur_w + dx; + T weight = + dmcn_get_gradient_weight(cur_inv_h_data, cur_inv_w_data, + cur_h + dy, cur_w + dx, height, width); + atomicAdd(grad_im + cur_bottom_grad_pos, weight * cur_top_grad); + } + } + } + } +} + +template +__global__ void modulated_deformable_col2im_coord_gpu_kernel( + const int n, const T *data_col, const T *data_im, const T *data_offset, + const T *data_mask, const int channels, const int height, const int width, + const int kernel_h, const int kernel_w, const int pad_h, const int pad_w, + const int stride_h, const int stride_w, const int dilation_h, + const int dilation_w, const int channel_per_deformable_group, + const int batch_size, const int offset_channels, const int deformable_group, + const int height_col, const int width_col, T *grad_offset, T *grad_mask) { + CUDA_1D_KERNEL_LOOP(index, n) { + T val = 0, mval = 0; + int w = index % width_col; + int h = (index / width_col) % height_col; + int c = (index / width_col / height_col) % offset_channels; + int b = (index / width_col / height_col) / offset_channels; + // compute the start and end of the output + + const int deformable_group_index = c / (2 * kernel_h * kernel_w); + const int col_step = kernel_h * kernel_w; + int cnt = 0; + const T *data_col_ptr = data_col + deformable_group_index * + channel_per_deformable_group * + batch_size * width_col * height_col; + const T *data_im_ptr = + data_im + (b * deformable_group + deformable_group_index) * + channel_per_deformable_group / kernel_h / kernel_w * + height * width; + const T *data_offset_ptr = + data_offset + (b * deformable_group + deformable_group_index) * 2 * + kernel_h * kernel_w * height_col * width_col; + const T *data_mask_ptr = + data_mask + (b * deformable_group + deformable_group_index) * kernel_h * + kernel_w * height_col * width_col; + + const int offset_c = c - deformable_group_index * 2 * kernel_h * kernel_w; + + for (int col_c = (offset_c / 2); col_c < channel_per_deformable_group; + col_c += col_step) { + const int col_pos = + (((col_c * batch_size + b) * height_col) + h) * width_col + w; + const int bp_dir = offset_c % 2; + + int j = (col_pos / width_col / height_col / batch_size) % kernel_w; + int i = + (col_pos / width_col / height_col / batch_size / kernel_w) % kernel_h; + int w_out = col_pos % width_col; + int h_out = (col_pos / width_col) % height_col; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + const int data_offset_h_ptr = + (((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out); + const int data_offset_w_ptr = + (((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + + w_out); + const int data_mask_hw_ptr = + (((i * kernel_w + j) * height_col + h_out) * width_col + w_out); + const T offset_h = data_offset_ptr[data_offset_h_ptr]; + const T offset_w = data_offset_ptr[data_offset_w_ptr]; + const T mask = data_mask_ptr[data_mask_hw_ptr]; + T inv_h = h_in + i * dilation_h + offset_h; + T inv_w = w_in + j * dilation_w + offset_w; + if (inv_h <= -1 || inv_w <= -1 || inv_h >= height || inv_w >= width) + inv_h = inv_w = -2; + else + mval += data_col_ptr[col_pos] * + dmcn_im2col_bilinear(data_im_ptr + cnt * height * width, width, + height, width, inv_h, inv_w); + const T weight = dmcn_get_coordinate_weight( + inv_h, inv_w, height, width, data_im_ptr + cnt * height * width, + width, bp_dir); + val += weight * data_col_ptr[col_pos] * mask; + cnt += 1; + } + // KERNEL_ASSIGN(grad_offset[index], offset_req, val); + grad_offset[index] = val; + if (offset_c % 2 == 0) + // KERNEL_ASSIGN(grad_mask[(((b * deformable_group + + // deformable_group_index) * kernel_h * kernel_w + offset_c / 2) * + // height_col + h) * width_col + w], mask_req, mval); + grad_mask[(((b * deformable_group + deformable_group_index) * kernel_h * + kernel_w + + offset_c / 2) * + height_col + + h) * + width_col + + w] = mval; + } +} + +#endif // MODULATED_DEFORM_CONV_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/ms_deform_attn_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/ms_deform_attn_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..12225ffdb3b1691ad9edabcd1663109f67ef1a6f --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/ms_deform_attn_cuda_kernel.cuh @@ -0,0 +1,801 @@ +/*! +************************************************************************************************** +* Deformable DETR +* Copyright (c) 2020 SenseTime. All Rights Reserved. +* Licensed under the Apache License, Version 2.0 [see LICENSE for details] +************************************************************************************************** +* Modified from +*https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 +************************************************************************************************** +*/ +#ifndef DEFORM_ATTN_CUDA_KERNEL +#define DEFORM_ATTN_CUDA_KERNEL + +#include "common_cuda_helper.hpp" +#include "pytorch_cuda_helper.hpp" + +template +__device__ scalar_t ms_deform_attn_im2col_bilinear( + const scalar_t *&bottom_data, const int &height, const int &width, + const int &nheads, const int &channels, const scalar_t &h, + const scalar_t &w, const int &m, const int &c) { + const int h_low = floorf(h); + const int w_low = floorf(w); + const int h_high = h_low + 1; + const int w_high = w_low + 1; + + const scalar_t lh = h - h_low; + const scalar_t lw = w - w_low; + const scalar_t hh = 1 - lh, hw = 1 - lw; + + const int w_stride = nheads * channels; + const int h_stride = width * w_stride; + const int h_low_ptr_offset = h_low * h_stride; + const int h_high_ptr_offset = h_low_ptr_offset + h_stride; + const int w_low_ptr_offset = w_low * w_stride; + const int w_high_ptr_offset = w_low_ptr_offset + w_stride; + const int base_ptr = m * channels + c; + + scalar_t v1 = 0; + if (h_low >= 0 && w_low >= 0) { + const int ptr1 = h_low_ptr_offset + w_low_ptr_offset + base_ptr; + v1 = bottom_data[ptr1]; + } + scalar_t v2 = 0; + if (h_low >= 0 && w_high <= width - 1) { + const int ptr2 = h_low_ptr_offset + w_high_ptr_offset + base_ptr; + v2 = bottom_data[ptr2]; + } + scalar_t v3 = 0; + if (h_high <= height - 1 && w_low >= 0) { + const int ptr3 = h_high_ptr_offset + w_low_ptr_offset + base_ptr; + v3 = bottom_data[ptr3]; + } + scalar_t v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) { + const int ptr4 = h_high_ptr_offset + w_high_ptr_offset + base_ptr; + v4 = bottom_data[ptr4]; + } + + const scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + + const scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + return val; +} + +template +__device__ void ms_deform_attn_col2im_bilinear( + const scalar_t *&bottom_data, const int &height, const int &width, + const int &nheads, const int &channels, const scalar_t &h, + const scalar_t &w, const int &m, const int &c, const scalar_t &top_grad, + const scalar_t &attn_weight, scalar_t *&grad_value, + scalar_t *grad_sampling_loc, scalar_t *grad_attn_weight) { + const int h_low = floorf(h); + const int w_low = floorf(w); + const int h_high = h_low + 1; + const int w_high = w_low + 1; + + const scalar_t lh = h - h_low; + const scalar_t lw = w - w_low; + const scalar_t hh = 1 - lh, hw = 1 - lw; + + const int w_stride = nheads * channels; + const int h_stride = width * w_stride; + const int h_low_ptr_offset = h_low * h_stride; + const int h_high_ptr_offset = h_low_ptr_offset + h_stride; + const int w_low_ptr_offset = w_low * w_stride; + const int w_high_ptr_offset = w_low_ptr_offset + w_stride; + const int base_ptr = m * channels + c; + + const scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + const scalar_t top_grad_value = top_grad * attn_weight; + scalar_t grad_h_weight = 0, grad_w_weight = 0; + + scalar_t v1 = 0; + if (h_low >= 0 && w_low >= 0) { + const int ptr1 = h_low_ptr_offset + w_low_ptr_offset + base_ptr; + v1 = bottom_data[ptr1]; + grad_h_weight -= hw * v1; + grad_w_weight -= hh * v1; + atomicAdd(grad_value + ptr1, w1 * top_grad_value); + } + scalar_t v2 = 0; + if (h_low >= 0 && w_high <= width - 1) { + const int ptr2 = h_low_ptr_offset + w_high_ptr_offset + base_ptr; + v2 = bottom_data[ptr2]; + grad_h_weight -= lw * v2; + grad_w_weight += hh * v2; + atomicAdd(grad_value + ptr2, w2 * top_grad_value); + } + scalar_t v3 = 0; + if (h_high <= height - 1 && w_low >= 0) { + const int ptr3 = h_high_ptr_offset + w_low_ptr_offset + base_ptr; + v3 = bottom_data[ptr3]; + grad_h_weight += hw * v3; + grad_w_weight -= lh * v3; + atomicAdd(grad_value + ptr3, w3 * top_grad_value); + } + scalar_t v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) { + const int ptr4 = h_high_ptr_offset + w_high_ptr_offset + base_ptr; + v4 = bottom_data[ptr4]; + grad_h_weight += lw * v4; + grad_w_weight += lh * v4; + atomicAdd(grad_value + ptr4, w4 * top_grad_value); + } + + const scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + *grad_attn_weight = top_grad * val; + *grad_sampling_loc = width * grad_w_weight * top_grad_value; + *(grad_sampling_loc + 1) = height * grad_h_weight * top_grad_value; +} + +template +__device__ void ms_deform_attn_col2im_bilinear_gm( + const scalar_t *&bottom_data, const int &height, const int &width, + const int &nheads, const int &channels, const scalar_t &h, + const scalar_t &w, const int &m, const int &c, const scalar_t &top_grad, + const scalar_t &attn_weight, scalar_t *&grad_value, + scalar_t *grad_sampling_loc, scalar_t *grad_attn_weight) { + const int h_low = floorf(h); + const int w_low = floorf(w); + const int h_high = h_low + 1; + const int w_high = w_low + 1; + + const scalar_t lh = h - h_low; + const scalar_t lw = w - w_low; + const scalar_t hh = 1 - lh, hw = 1 - lw; + + const int w_stride = nheads * channels; + const int h_stride = width * w_stride; + const int h_low_ptr_offset = h_low * h_stride; + const int h_high_ptr_offset = h_low_ptr_offset + h_stride; + const int w_low_ptr_offset = w_low * w_stride; + const int w_high_ptr_offset = w_low_ptr_offset + w_stride; + const int base_ptr = m * channels + c; + + const scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + const scalar_t top_grad_value = top_grad * attn_weight; + scalar_t grad_h_weight = 0, grad_w_weight = 0; + + scalar_t v1 = 0; + if (h_low >= 0 && w_low >= 0) { + const int ptr1 = h_low_ptr_offset + w_low_ptr_offset + base_ptr; + v1 = bottom_data[ptr1]; + grad_h_weight -= hw * v1; + grad_w_weight -= hh * v1; + atomicAdd(grad_value + ptr1, w1 * top_grad_value); + } + scalar_t v2 = 0; + if (h_low >= 0 && w_high <= width - 1) { + const int ptr2 = h_low_ptr_offset + w_high_ptr_offset + base_ptr; + v2 = bottom_data[ptr2]; + grad_h_weight -= lw * v2; + grad_w_weight += hh * v2; + atomicAdd(grad_value + ptr2, w2 * top_grad_value); + } + scalar_t v3 = 0; + if (h_high <= height - 1 && w_low >= 0) { + const int ptr3 = h_high_ptr_offset + w_low_ptr_offset + base_ptr; + v3 = bottom_data[ptr3]; + grad_h_weight += hw * v3; + grad_w_weight -= lh * v3; + atomicAdd(grad_value + ptr3, w3 * top_grad_value); + } + scalar_t v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) { + const int ptr4 = h_high_ptr_offset + w_high_ptr_offset + base_ptr; + v4 = bottom_data[ptr4]; + grad_h_weight += lw * v4; + grad_w_weight += lh * v4; + atomicAdd(grad_value + ptr4, w4 * top_grad_value); + } + + const scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + atomicAdd(grad_attn_weight, top_grad * val); + atomicAdd(grad_sampling_loc, width * grad_w_weight * top_grad_value); + atomicAdd(grad_sampling_loc + 1, height * grad_h_weight * top_grad_value); +} + +template +__global__ void ms_deformable_im2col_gpu_kernel( + const int n, const scalar_t *data_value, const int64_t *data_spatial_shapes, + const int64_t *data_level_start_index, const scalar_t *data_sampling_loc, + const scalar_t *data_attn_weight, const int batch_size, + const int spatial_size, const int num_heads, const int channels, + const int num_levels, const int num_query, const int num_point, + scalar_t *data_col) { + CUDA_1D_KERNEL_LOOP(index, n) { + int _temp = index; + const int c_col = _temp % channels; + _temp /= channels; + const int sampling_index = _temp; + const int m_col = _temp % num_heads; + _temp /= num_heads; + _temp /= num_query; + const int b_col = _temp; + + scalar_t *data_col_ptr = data_col + index; + int data_weight_ptr = sampling_index * num_levels * num_point; + int data_loc_w_ptr = data_weight_ptr << 1; + const int qid_stride = num_heads * channels; + const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; + scalar_t col = 0; + + for (int l_col = 0; l_col < num_levels; ++l_col) { + const int level_start_id = data_level_start_index[l_col]; + const int spatial_h_ptr = l_col << 1; + const int spatial_h = data_spatial_shapes[spatial_h_ptr]; + const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; + const scalar_t *data_value_ptr = + data_value + + (data_value_ptr_init_offset + level_start_id * qid_stride); + for (int p_col = 0; p_col < num_point; ++p_col) { + const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; + const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; + const scalar_t weight = data_attn_weight[data_weight_ptr]; + + const scalar_t h_im = loc_h * spatial_h - 0.5; + const scalar_t w_im = loc_w * spatial_w - 0.5; + + if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) { + col += ms_deform_attn_im2col_bilinear(data_value_ptr, spatial_h, + spatial_w, num_heads, channels, + h_im, w_im, m_col, c_col) * + weight; + } + + data_weight_ptr += 1; + data_loc_w_ptr += 2; + } + } + *data_col_ptr = col; + } +} + +template +__global__ void ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v1( + const int n, const scalar_t *grad_col, const scalar_t *data_value, + const int64_t *data_spatial_shapes, const int64_t *data_level_start_index, + const scalar_t *data_sampling_loc, const scalar_t *data_attn_weight, + const int batch_size, const int spatial_size, const int num_heads, + const int channels, const int num_levels, const int num_query, + const int num_point, scalar_t *grad_value, scalar_t *grad_sampling_loc, + scalar_t *grad_attn_weight) { + __shared__ scalar_t cache_grad_sampling_loc[blockSize * 2]; + __shared__ scalar_t cache_grad_attn_weight[blockSize]; + unsigned int tid = threadIdx.x; + const int qid_stride = num_heads * channels; + CUDA_1D_KERNEL_LOOP(index, n) { + int _temp = index; + const int c_col = _temp % channels; + _temp /= channels; + const int sampling_index = _temp; + const int m_col = _temp % num_heads; + _temp /= num_heads; + _temp /= num_query; + const int b_col = _temp; + + const scalar_t top_grad = grad_col[index]; + + int data_weight_ptr = sampling_index * num_levels * num_point; + int data_loc_w_ptr = data_weight_ptr << 1; + const int grad_sampling_ptr = data_weight_ptr; + scalar_t *grad_sampling_loc_out = + grad_sampling_loc + (grad_sampling_ptr << 1); + scalar_t *grad_attn_weight_out = grad_attn_weight + grad_sampling_ptr; + const int grad_weight_stride = 1; + const int grad_loc_stride = 2; + const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; + + for (int l_col = 0; l_col < num_levels; ++l_col) { + const int level_start_id = data_level_start_index[l_col]; + const int spatial_h_ptr = l_col << 1; + const int spatial_h = data_spatial_shapes[spatial_h_ptr]; + const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; + const int value_ptr_offset = + data_value_ptr_init_offset + level_start_id * qid_stride; + const scalar_t *data_value_ptr = data_value + value_ptr_offset; + scalar_t *grad_value_ptr = grad_value + value_ptr_offset; + + for (int p_col = 0; p_col < num_point; ++p_col) { + const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; + const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; + const scalar_t weight = data_attn_weight[data_weight_ptr]; + + const scalar_t h_im = loc_h * spatial_h - 0.5; + const scalar_t w_im = loc_w * spatial_w - 0.5; + *(cache_grad_sampling_loc + (threadIdx.x << 1)) = 0; + *(cache_grad_sampling_loc + ((threadIdx.x << 1) + 1)) = 0; + *(cache_grad_attn_weight + threadIdx.x) = 0; + if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) { + ms_deform_attn_col2im_bilinear( + data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, + w_im, m_col, c_col, top_grad, weight, grad_value_ptr, + cache_grad_sampling_loc + (threadIdx.x << 1), + cache_grad_attn_weight + threadIdx.x); + } + + __syncthreads(); + if (tid == 0) { + scalar_t _grad_w = cache_grad_sampling_loc[0], + _grad_h = cache_grad_sampling_loc[1], + _grad_a = cache_grad_attn_weight[0]; + int sid = 2; + for (unsigned int _tid = 1; _tid < blockSize; ++_tid) { + _grad_w += cache_grad_sampling_loc[sid]; + _grad_h += cache_grad_sampling_loc[sid + 1]; + _grad_a += cache_grad_attn_weight[_tid]; + sid += 2; + } + + *grad_sampling_loc_out = _grad_w; + *(grad_sampling_loc_out + 1) = _grad_h; + *grad_attn_weight_out = _grad_a; + } + __syncthreads(); + + data_weight_ptr += 1; + data_loc_w_ptr += 2; + grad_attn_weight_out += grad_weight_stride; + grad_sampling_loc_out += grad_loc_stride; + } + } + } +} + +template +__global__ void ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v2( + const int n, const scalar_t *grad_col, const scalar_t *data_value, + const int64_t *data_spatial_shapes, const int64_t *data_level_start_index, + const scalar_t *data_sampling_loc, const scalar_t *data_attn_weight, + const int batch_size, const int spatial_size, const int num_heads, + const int channels, const int num_levels, const int num_query, + const int num_point, scalar_t *grad_value, scalar_t *grad_sampling_loc, + scalar_t *grad_attn_weight) { + __shared__ scalar_t cache_grad_sampling_loc[blockSize * 2]; + __shared__ scalar_t cache_grad_attn_weight[blockSize]; + unsigned int tid = threadIdx.x; + CUDA_1D_KERNEL_LOOP(index, n) { + int _temp = index; + const int c_col = _temp % channels; + _temp /= channels; + const int sampling_index = _temp; + const int m_col = _temp % num_heads; + _temp /= num_heads; + _temp /= num_query; + const int b_col = _temp; + + const scalar_t top_grad = grad_col[index]; + + int data_weight_ptr = sampling_index * num_levels * num_point; + int data_loc_w_ptr = data_weight_ptr << 1; + const int grad_sampling_ptr = data_weight_ptr; + scalar_t *grad_sampling_loc_out = + grad_sampling_loc + (grad_sampling_ptr << 1); + scalar_t *grad_attn_weight_out = grad_attn_weight + grad_sampling_ptr; + const int grad_weight_stride = 1; + const int grad_loc_stride = 2; + const int qid_stride = num_heads * channels; + const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; + + for (int l_col = 0; l_col < num_levels; ++l_col) { + const int level_start_id = data_level_start_index[l_col]; + const int spatial_h_ptr = l_col << 1; + const int spatial_h = data_spatial_shapes[spatial_h_ptr]; + const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; + const int value_ptr_offset = + data_value_ptr_init_offset + level_start_id * qid_stride; + const scalar_t *data_value_ptr = data_value + value_ptr_offset; + scalar_t *grad_value_ptr = grad_value + value_ptr_offset; + + for (int p_col = 0; p_col < num_point; ++p_col) { + const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; + const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; + const scalar_t weight = data_attn_weight[data_weight_ptr]; + + const scalar_t h_im = loc_h * spatial_h - 0.5; + const scalar_t w_im = loc_w * spatial_w - 0.5; + *(cache_grad_sampling_loc + (threadIdx.x << 1)) = 0; + *(cache_grad_sampling_loc + ((threadIdx.x << 1) + 1)) = 0; + *(cache_grad_attn_weight + threadIdx.x) = 0; + if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) { + ms_deform_attn_col2im_bilinear( + data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, + w_im, m_col, c_col, top_grad, weight, grad_value_ptr, + cache_grad_sampling_loc + (threadIdx.x << 1), + cache_grad_attn_weight + threadIdx.x); + } + + __syncthreads(); + + for (unsigned int s = blockSize / 2; s > 0; s >>= 1) { + if (tid < s) { + const unsigned int xid1 = tid << 1; + const unsigned int xid2 = (tid + s) << 1; + cache_grad_attn_weight[tid] += cache_grad_attn_weight[tid + s]; + cache_grad_sampling_loc[xid1] += cache_grad_sampling_loc[xid2]; + cache_grad_sampling_loc[xid1 + 1] += + cache_grad_sampling_loc[xid2 + 1]; + } + __syncthreads(); + } + + if (tid == 0) { + *grad_sampling_loc_out = cache_grad_sampling_loc[0]; + *(grad_sampling_loc_out + 1) = cache_grad_sampling_loc[1]; + *grad_attn_weight_out = cache_grad_attn_weight[0]; + } + __syncthreads(); + + data_weight_ptr += 1; + data_loc_w_ptr += 2; + grad_attn_weight_out += grad_weight_stride; + grad_sampling_loc_out += grad_loc_stride; + } + } + } +} + +template +__global__ void ms_deformable_col2im_gpu_kernel_shm_reduce_v1( + const int n, const scalar_t *grad_col, const scalar_t *data_value, + const int64_t *data_spatial_shapes, const int64_t *data_level_start_index, + const scalar_t *data_sampling_loc, const scalar_t *data_attn_weight, + const int batch_size, const int spatial_size, const int num_heads, + const int channels, const int num_levels, const int num_query, + const int num_point, scalar_t *grad_value, scalar_t *grad_sampling_loc, + scalar_t *grad_attn_weight) { + extern __shared__ int _s[]; + scalar_t *cache_grad_sampling_loc = reinterpret_cast(_s); + scalar_t *cache_grad_attn_weight = cache_grad_sampling_loc + 2 * blockDim.x; + unsigned int tid = threadIdx.x; + CUDA_1D_KERNEL_LOOP(index, n) { + int _temp = index; + const int c_col = _temp % channels; + _temp /= channels; + const int sampling_index = _temp; + const int m_col = _temp % num_heads; + _temp /= num_heads; + _temp /= num_query; + const int b_col = _temp; + + const scalar_t top_grad = grad_col[index]; + + int data_weight_ptr = sampling_index * num_levels * num_point; + int data_loc_w_ptr = data_weight_ptr << 1; + const int grad_sampling_ptr = data_weight_ptr; + scalar_t *grad_sampling_loc_out = + grad_sampling_loc + (grad_sampling_ptr << 1); + scalar_t *grad_attn_weight_out = grad_attn_weight + grad_sampling_ptr; + const int grad_weight_stride = 1; + const int grad_loc_stride = 2; + const int qid_stride = num_heads * channels; + const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; + + for (int l_col = 0; l_col < num_levels; ++l_col) { + const int level_start_id = data_level_start_index[l_col]; + const int spatial_h_ptr = l_col << 1; + const int spatial_h = data_spatial_shapes[spatial_h_ptr]; + const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; + const int value_ptr_offset = + data_value_ptr_init_offset + level_start_id * qid_stride; + const scalar_t *data_value_ptr = data_value + value_ptr_offset; + scalar_t *grad_value_ptr = grad_value + value_ptr_offset; + + for (int p_col = 0; p_col < num_point; ++p_col) { + const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; + const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; + const scalar_t weight = data_attn_weight[data_weight_ptr]; + + const scalar_t h_im = loc_h * spatial_h - 0.5; + const scalar_t w_im = loc_w * spatial_w - 0.5; + *(cache_grad_sampling_loc + (threadIdx.x << 1)) = 0; + *(cache_grad_sampling_loc + ((threadIdx.x << 1) + 1)) = 0; + *(cache_grad_attn_weight + threadIdx.x) = 0; + if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) { + ms_deform_attn_col2im_bilinear( + data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, + w_im, m_col, c_col, top_grad, weight, grad_value_ptr, + cache_grad_sampling_loc + (threadIdx.x << 1), + cache_grad_attn_weight + threadIdx.x); + } + + __syncthreads(); + if (tid == 0) { + scalar_t _grad_w = cache_grad_sampling_loc[0], + _grad_h = cache_grad_sampling_loc[1], + _grad_a = cache_grad_attn_weight[0]; + int sid = 2; + for (unsigned int _tid = 1; _tid < blockDim.x; ++_tid) { + _grad_w += cache_grad_sampling_loc[sid]; + _grad_h += cache_grad_sampling_loc[sid + 1]; + _grad_a += cache_grad_attn_weight[_tid]; + sid += 2; + } + + *grad_sampling_loc_out = _grad_w; + *(grad_sampling_loc_out + 1) = _grad_h; + *grad_attn_weight_out = _grad_a; + } + __syncthreads(); + + data_weight_ptr += 1; + data_loc_w_ptr += 2; + grad_attn_weight_out += grad_weight_stride; + grad_sampling_loc_out += grad_loc_stride; + } + } + } +} + +template +__global__ void ms_deformable_col2im_gpu_kernel_shm_reduce_v2( + const int n, const scalar_t *grad_col, const scalar_t *data_value, + const int64_t *data_spatial_shapes, const int64_t *data_level_start_index, + const scalar_t *data_sampling_loc, const scalar_t *data_attn_weight, + const int batch_size, const int spatial_size, const int num_heads, + const int channels, const int num_levels, const int num_query, + const int num_point, scalar_t *grad_value, scalar_t *grad_sampling_loc, + scalar_t *grad_attn_weight) { + extern __shared__ int _s[]; + scalar_t *cache_grad_sampling_loc = reinterpret_cast(_s); + scalar_t *cache_grad_attn_weight = cache_grad_sampling_loc + 2 * blockDim.x; + unsigned int tid = threadIdx.x; + CUDA_1D_KERNEL_LOOP(index, n) { + int _temp = index; + const int c_col = _temp % channels; + _temp /= channels; + const int sampling_index = _temp; + const int m_col = _temp % num_heads; + _temp /= num_heads; + _temp /= num_query; + const int b_col = _temp; + + const scalar_t top_grad = grad_col[index]; + + int data_weight_ptr = sampling_index * num_levels * num_point; + int data_loc_w_ptr = data_weight_ptr << 1; + const int grad_sampling_ptr = data_weight_ptr; + scalar_t *grad_sampling_loc_out = + grad_sampling_loc + (grad_sampling_ptr << 1); + scalar_t *grad_attn_weight_out = grad_attn_weight + grad_sampling_ptr; + const int grad_weight_stride = 1; + const int grad_loc_stride = 2; + const int qid_stride = num_heads * channels; + const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; + + for (int l_col = 0; l_col < num_levels; ++l_col) { + const int level_start_id = data_level_start_index[l_col]; + const int spatial_h_ptr = l_col << 1; + const int spatial_h = data_spatial_shapes[spatial_h_ptr]; + const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; + const int value_ptr_offset = + data_value_ptr_init_offset + level_start_id * qid_stride; + const scalar_t *data_value_ptr = data_value + value_ptr_offset; + scalar_t *grad_value_ptr = grad_value + value_ptr_offset; + + for (int p_col = 0; p_col < num_point; ++p_col) { + const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; + const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; + const scalar_t weight = data_attn_weight[data_weight_ptr]; + + const scalar_t h_im = loc_h * spatial_h - 0.5; + const scalar_t w_im = loc_w * spatial_w - 0.5; + *(cache_grad_sampling_loc + (threadIdx.x << 1)) = 0; + *(cache_grad_sampling_loc + ((threadIdx.x << 1) + 1)) = 0; + *(cache_grad_attn_weight + threadIdx.x) = 0; + if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) { + ms_deform_attn_col2im_bilinear( + data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, + w_im, m_col, c_col, top_grad, weight, grad_value_ptr, + cache_grad_sampling_loc + (threadIdx.x << 1), + cache_grad_attn_weight + threadIdx.x); + } + + __syncthreads(); + + for (unsigned int s = blockDim.x / 2, spre = blockDim.x; s > 0; + s >>= 1, spre >>= 1) { + if (tid < s) { + const unsigned int xid1 = tid << 1; + const unsigned int xid2 = (tid + s) << 1; + cache_grad_attn_weight[tid] += cache_grad_attn_weight[tid + s]; + cache_grad_sampling_loc[xid1] += cache_grad_sampling_loc[xid2]; + cache_grad_sampling_loc[xid1 + 1] += + cache_grad_sampling_loc[xid2 + 1]; + if (tid + (s << 1) < spre) { + cache_grad_attn_weight[tid] += + cache_grad_attn_weight[tid + (s << 1)]; + cache_grad_sampling_loc[xid1] += + cache_grad_sampling_loc[xid2 + (s << 1)]; + cache_grad_sampling_loc[xid1 + 1] += + cache_grad_sampling_loc[xid2 + 1 + (s << 1)]; + } + } + __syncthreads(); + } + + if (tid == 0) { + *grad_sampling_loc_out = cache_grad_sampling_loc[0]; + *(grad_sampling_loc_out + 1) = cache_grad_sampling_loc[1]; + *grad_attn_weight_out = cache_grad_attn_weight[0]; + } + __syncthreads(); + + data_weight_ptr += 1; + data_loc_w_ptr += 2; + grad_attn_weight_out += grad_weight_stride; + grad_sampling_loc_out += grad_loc_stride; + } + } + } +} + +template +__global__ void ms_deformable_col2im_gpu_kernel_shm_reduce_v2_multi_blocks( + const int n, const scalar_t *grad_col, const scalar_t *data_value, + const int64_t *data_spatial_shapes, const int64_t *data_level_start_index, + const scalar_t *data_sampling_loc, const scalar_t *data_attn_weight, + const int batch_size, const int spatial_size, const int num_heads, + const int channels, const int num_levels, const int num_query, + const int num_point, scalar_t *grad_value, scalar_t *grad_sampling_loc, + scalar_t *grad_attn_weight) { + extern __shared__ int _s[]; + scalar_t *cache_grad_sampling_loc = reinterpret_cast(_s); + scalar_t *cache_grad_attn_weight = cache_grad_sampling_loc + 2 * blockDim.x; + unsigned int tid = threadIdx.x; + CUDA_1D_KERNEL_LOOP(index, n) { + int _temp = index; + const int c_col = _temp % channels; + _temp /= channels; + const int sampling_index = _temp; + const int m_col = _temp % num_heads; + _temp /= num_heads; + _temp /= num_query; + const int b_col = _temp; + + const scalar_t top_grad = grad_col[index]; + + int data_weight_ptr = sampling_index * num_levels * num_point; + int data_loc_w_ptr = data_weight_ptr << 1; + const int grad_sampling_ptr = data_weight_ptr; + scalar_t *grad_sampling_loc_out = + grad_sampling_loc + (grad_sampling_ptr << 1); + scalar_t *grad_attn_weight_out = grad_attn_weight + grad_sampling_ptr; + const int grad_weight_stride = 1; + const int grad_loc_stride = 2; + const int qid_stride = num_heads * channels; + const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; + + for (int l_col = 0; l_col < num_levels; ++l_col) { + const int level_start_id = data_level_start_index[l_col]; + const int spatial_h_ptr = l_col << 1; + const int spatial_h = data_spatial_shapes[spatial_h_ptr]; + const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; + const int value_ptr_offset = + data_value_ptr_init_offset + level_start_id * qid_stride; + const scalar_t *data_value_ptr = data_value + value_ptr_offset; + scalar_t *grad_value_ptr = grad_value + value_ptr_offset; + + for (int p_col = 0; p_col < num_point; ++p_col) { + const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; + const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; + const scalar_t weight = data_attn_weight[data_weight_ptr]; + + const scalar_t h_im = loc_h * spatial_h - 0.5; + const scalar_t w_im = loc_w * spatial_w - 0.5; + *(cache_grad_sampling_loc + (threadIdx.x << 1)) = 0; + *(cache_grad_sampling_loc + ((threadIdx.x << 1) + 1)) = 0; + *(cache_grad_attn_weight + threadIdx.x) = 0; + if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) { + ms_deform_attn_col2im_bilinear( + data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, + w_im, m_col, c_col, top_grad, weight, grad_value_ptr, + cache_grad_sampling_loc + (threadIdx.x << 1), + cache_grad_attn_weight + threadIdx.x); + } + + __syncthreads(); + + for (unsigned int s = blockDim.x / 2, spre = blockDim.x; s > 0; + s >>= 1, spre >>= 1) { + if (tid < s) { + const unsigned int xid1 = tid << 1; + const unsigned int xid2 = (tid + s) << 1; + cache_grad_attn_weight[tid] += cache_grad_attn_weight[tid + s]; + cache_grad_sampling_loc[xid1] += cache_grad_sampling_loc[xid2]; + cache_grad_sampling_loc[xid1 + 1] += + cache_grad_sampling_loc[xid2 + 1]; + if (tid + (s << 1) < spre) { + cache_grad_attn_weight[tid] += + cache_grad_attn_weight[tid + (s << 1)]; + cache_grad_sampling_loc[xid1] += + cache_grad_sampling_loc[xid2 + (s << 1)]; + cache_grad_sampling_loc[xid1 + 1] += + cache_grad_sampling_loc[xid2 + 1 + (s << 1)]; + } + } + __syncthreads(); + } + + if (tid == 0) { + atomicAdd(grad_sampling_loc_out, cache_grad_sampling_loc[0]); + atomicAdd(grad_sampling_loc_out + 1, cache_grad_sampling_loc[1]); + atomicAdd(grad_attn_weight_out, cache_grad_attn_weight[0]); + } + __syncthreads(); + + data_weight_ptr += 1; + data_loc_w_ptr += 2; + grad_attn_weight_out += grad_weight_stride; + grad_sampling_loc_out += grad_loc_stride; + } + } + } +} + +template +__global__ void ms_deformable_col2im_gpu_kernel_gm( + const int n, const scalar_t *grad_col, const scalar_t *data_value, + const int64_t *data_spatial_shapes, const int64_t *data_level_start_index, + const scalar_t *data_sampling_loc, const scalar_t *data_attn_weight, + const int batch_size, const int spatial_size, const int num_heads, + const int channels, const int num_levels, const int num_query, + const int num_point, scalar_t *grad_value, scalar_t *grad_sampling_loc, + scalar_t *grad_attn_weight) { + CUDA_1D_KERNEL_LOOP(index, n) { + int _temp = index; + const int c_col = _temp % channels; + _temp /= channels; + const int sampling_index = _temp; + const int m_col = _temp % num_heads; + _temp /= num_heads; + _temp /= num_query; + const int b_col = _temp; + + const scalar_t top_grad = grad_col[index]; + + int data_weight_ptr = sampling_index * num_levels * num_point; + int data_loc_w_ptr = data_weight_ptr << 1; + const int grad_sampling_ptr = data_weight_ptr; + scalar_t *grad_sampling_loc_out = + grad_sampling_loc + (grad_sampling_ptr << 1); + scalar_t *grad_attn_weight_out = grad_attn_weight + grad_sampling_ptr; + const int grad_weight_stride = 1; + const int grad_loc_stride = 2; + const int qid_stride = num_heads * channels; + const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; + + for (int l_col = 0; l_col < num_levels; ++l_col) { + const int level_start_id = data_level_start_index[l_col]; + const int spatial_h_ptr = l_col << 1; + const int spatial_h = data_spatial_shapes[spatial_h_ptr]; + const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; + const int value_ptr_offset = + data_value_ptr_init_offset + level_start_id * qid_stride; + const scalar_t *data_value_ptr = data_value + value_ptr_offset; + scalar_t *grad_value_ptr = grad_value + value_ptr_offset; + + for (int p_col = 0; p_col < num_point; ++p_col) { + const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; + const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; + const scalar_t weight = data_attn_weight[data_weight_ptr]; + + const scalar_t h_im = loc_h * spatial_h - 0.5; + const scalar_t w_im = loc_w * spatial_w - 0.5; + if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) { + ms_deform_attn_col2im_bilinear_gm( + data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, + w_im, m_col, c_col, top_grad, weight, grad_value_ptr, + grad_sampling_loc_out, grad_attn_weight_out); + } + data_weight_ptr += 1; + data_loc_w_ptr += 2; + grad_attn_weight_out += grad_weight_stride; + grad_sampling_loc_out += grad_loc_stride; + } + } + } +} +#endif // DEFORM_ATTN_CUDA_KERNEL diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/nms_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/nms_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..281d9f0b409f54260a81a79ad96ab09fde9580ce --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/nms_cuda_kernel.cuh @@ -0,0 +1,117 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef NMS_CUDA_KERNEL_CUH +#define NMS_CUDA_KERNEL_CUH + +#include +#ifdef MMCV_WITH_TRT +#include "common_cuda_helper.hpp" +#else // MMCV_WITH_TRT +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else // MMCV_USE_PARROTS +#include "pytorch_cuda_helper.hpp" +#endif // MMCV_USE_PARROTS +#endif // MMCV_WITH_TRT + +int const threadsPerBlock = sizeof(unsigned long long int) * 8; + +__device__ inline bool devIoU(float const *const a, float const *const b, + const int offset, const float threshold) { + float left = fmaxf(a[0], b[0]), right = fminf(a[2], b[2]); + float top = fmaxf(a[1], b[1]), bottom = fminf(a[3], b[3]); + float width = fmaxf(right - left + offset, 0.f), + height = fmaxf(bottom - top + offset, 0.f); + float interS = width * height; + float Sa = (a[2] - a[0] + offset) * (a[3] - a[1] + offset); + float Sb = (b[2] - b[0] + offset) * (b[3] - b[1] + offset); + return interS > threshold * (Sa + Sb - interS); +} + +__global__ static void nms_cuda(const int n_boxes, const float iou_threshold, + const int offset, const float *dev_boxes, + unsigned long long *dev_mask) { + int blocks = (n_boxes + threadsPerBlock - 1) / threadsPerBlock; + CUDA_2D_KERNEL_BLOCK_LOOP(col_start, blocks, row_start, blocks) { + const int tid = threadIdx.x; + + if (row_start > col_start) return; + + const int row_size = + fminf(n_boxes - row_start * threadsPerBlock, threadsPerBlock); + const int col_size = + fminf(n_boxes - col_start * threadsPerBlock, threadsPerBlock); + + __shared__ float block_boxes[threadsPerBlock * 4]; + if (tid < col_size) { + block_boxes[tid * 4 + 0] = + dev_boxes[(threadsPerBlock * col_start + tid) * 4 + 0]; + block_boxes[tid * 4 + 1] = + dev_boxes[(threadsPerBlock * col_start + tid) * 4 + 1]; + block_boxes[tid * 4 + 2] = + dev_boxes[(threadsPerBlock * col_start + tid) * 4 + 2]; + block_boxes[tid * 4 + 3] = + dev_boxes[(threadsPerBlock * col_start + tid) * 4 + 3]; + } + __syncthreads(); + + if (tid < row_size) { + const int cur_box_idx = threadsPerBlock * row_start + tid; + const float *cur_box = dev_boxes + cur_box_idx * 4; + int i = 0; + unsigned long long int t = 0; + int start = 0; + if (row_start == col_start) { + start = tid + 1; + } + for (i = start; i < col_size; i++) { + if (devIoU(cur_box, block_boxes + i * 4, offset, iou_threshold)) { + t |= 1ULL << i; + } + } + dev_mask[cur_box_idx * gridDim.y + col_start] = t; + } + } +} + +__global__ static void gather_keep_from_mask(bool *keep, + const unsigned long long *dev_mask, + const int n_boxes) { + const int col_blocks = (n_boxes + threadsPerBlock - 1) / threadsPerBlock; + const int tid = threadIdx.x; + + // mark the bboxes which have been removed. + extern __shared__ unsigned long long removed[]; + + // initialize removed. + for (int i = tid; i < col_blocks; i += blockDim.x) { + removed[i] = 0; + } + __syncthreads(); + + for (int nblock = 0; nblock < col_blocks; ++nblock) { + auto removed_val = removed[nblock]; + __syncthreads(); + const int i_offset = nblock * threadsPerBlock; +#pragma unroll + for (int inblock = 0; inblock < threadsPerBlock; ++inblock) { + const int i = i_offset + inblock; + if (i >= n_boxes) break; + // select a candidate, check if it should kept. + if (!(removed_val & (1ULL << inblock))) { + if (tid == 0) { + // mark the output. + keep[i] = true; + } + auto p = dev_mask + i * col_blocks; + // remove all bboxes which overlap the candidate. + for (int j = tid; j < col_blocks; j += blockDim.x) { + if (j >= nblock) removed[j] |= p[j]; + } + __syncthreads(); + removed_val = removed[nblock]; + } + } + } +} + +#endif // NMS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/nms_quadri_cuda.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/nms_quadri_cuda.cuh new file mode 100644 index 0000000000000000000000000000000000000000..bba3b8258f6b8798b9d1a651bfda29c48bb5376a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/nms_quadri_cuda.cuh @@ -0,0 +1,141 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#ifndef NMS_QUADRI_CUDA_CUH +#define NMS_QUADRI_CUDA_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif +#include "box_iou_rotated_utils.hpp" + +__host__ __device__ inline int divideUP(const int x, const int y) { + return (((x) + (y)-1) / (y)); +} + +namespace { +int const threadsPerBlock = sizeof(unsigned long long) * 8; +} + +template +__global__ void nms_quadri_cuda_kernel(const int n_boxes, + const float iou_threshold, + const T* dev_boxes, + unsigned long long* dev_mask, + const int multi_label) { + if (multi_label == 1) { + const int row_start = blockIdx.y; + const int col_start = blockIdx.x; + + // if (row_start > col_start) return; + + const int row_size = + min(n_boxes - row_start * threadsPerBlock, threadsPerBlock); + const int col_size = + min(n_boxes - col_start * threadsPerBlock, threadsPerBlock); + + // Compared to nms_cuda_kernel, where each box is represented with 4 values + // (x1, y1, x2, y2), each rotated box is represented with 8 values + // (x1, y1, ..., x4, y4) here. + __shared__ T block_boxes[threadsPerBlock * 8]; + if (threadIdx.x < col_size) { + block_boxes[threadIdx.x * 8 + 0] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 9 + 0]; + block_boxes[threadIdx.x * 8 + 1] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 9 + 1]; + block_boxes[threadIdx.x * 8 + 2] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 9 + 2]; + block_boxes[threadIdx.x * 8 + 3] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 9 + 3]; + block_boxes[threadIdx.x * 8 + 4] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 9 + 4]; + block_boxes[threadIdx.x * 8 + 5] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 9 + 5]; + block_boxes[threadIdx.x * 8 + 6] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 9 + 6]; + block_boxes[threadIdx.x * 8 + 7] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 9 + 7]; + } + __syncthreads(); + + if (threadIdx.x < row_size) { + const int cur_box_idx = threadsPerBlock * row_start + threadIdx.x; + const T* cur_box = dev_boxes + cur_box_idx * 9; + int i = 0; + unsigned long long t = 0; + int start = 0; + if (row_start == col_start) { + start = threadIdx.x + 1; + } + for (i = start; i < col_size; i++) { + // Instead of devIoU used by original horizontal nms, here + // we use the single_box_iou_quadri function from + // box_iou_rotated_utils.h + if (single_box_iou_quadri(cur_box, block_boxes + i * 8, 0) > + iou_threshold) { + t |= 1ULL << i; + } + } + const int col_blocks = divideUP(n_boxes, threadsPerBlock); + dev_mask[cur_box_idx * col_blocks + col_start] = t; + } + } else { + const int row_start = blockIdx.y; + const int col_start = blockIdx.x; + + // if (row_start > col_start) return; + + const int row_size = + min(n_boxes - row_start * threadsPerBlock, threadsPerBlock); + const int col_size = + min(n_boxes - col_start * threadsPerBlock, threadsPerBlock); + + // Compared to nms_cuda_kernel, where each box is represented with 4 values + // (x1, y1, x2, y2), each rotated box is represented with 8 values + // (x1, y1, , ..., x4, y4) here. + __shared__ T block_boxes[threadsPerBlock * 8]; + if (threadIdx.x < col_size) { + block_boxes[threadIdx.x * 8 + 0] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 8 + 0]; + block_boxes[threadIdx.x * 8 + 1] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 8 + 1]; + block_boxes[threadIdx.x * 8 + 2] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 8 + 2]; + block_boxes[threadIdx.x * 8 + 3] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 8 + 3]; + block_boxes[threadIdx.x * 8 + 4] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 8 + 4]; + block_boxes[threadIdx.x * 8 + 5] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 8 + 5]; + block_boxes[threadIdx.x * 8 + 6] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 8 + 6]; + block_boxes[threadIdx.x * 8 + 7] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 8 + 7]; + } + __syncthreads(); + + if (threadIdx.x < row_size) { + const int cur_box_idx = threadsPerBlock * row_start + threadIdx.x; + const T* cur_box = dev_boxes + cur_box_idx * 8; + int i = 0; + unsigned long long t = 0; + int start = 0; + if (row_start == col_start) { + start = threadIdx.x + 1; + } + for (i = start; i < col_size; i++) { + // Instead of devIoU used by original horizontal nms, here + // we use the single_box_iou_quadri function from + // box_iou_rotated_utils.h + if (single_box_iou_quadri(cur_box, block_boxes + i * 8, 0) > + iou_threshold) { + t |= 1ULL << i; + } + } + const int col_blocks = divideUP(n_boxes, threadsPerBlock); + dev_mask[cur_box_idx * col_blocks + col_start] = t; + } + } +} + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/nms_rotated_cuda.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/nms_rotated_cuda.cuh new file mode 100644 index 0000000000000000000000000000000000000000..747327afb83900177dd4721f1b0ba99153f658d7 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/nms_rotated_cuda.cuh @@ -0,0 +1,133 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +// modified from +// https://github.com/facebookresearch/detectron2/blob/master/detectron2/layers/csrc/nms_rotated/nms_rotated_cuda.cu +#ifndef NMS_ROTATED_CUDA_CUH +#define NMS_ROTATED_CUDA_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif +#include "box_iou_rotated_utils.hpp" + +__host__ __device__ inline int divideUP(const int x, const int y) { + return (((x) + (y)-1) / (y)); +} + +namespace { +int const threadsPerBlock = sizeof(unsigned long long) * 8; +} + +template +__global__ void nms_rotated_cuda_kernel(const int n_boxes, + const float iou_threshold, + const T* dev_boxes, + unsigned long long* dev_mask, + const int multi_label) { + // nms_rotated_cuda_kernel is modified from torchvision's nms_cuda_kernel + + if (multi_label == 1) { + const int row_start = blockIdx.y; + const int col_start = blockIdx.x; + + // if (row_start > col_start) return; + + const int row_size = + min(n_boxes - row_start * threadsPerBlock, threadsPerBlock); + const int col_size = + min(n_boxes - col_start * threadsPerBlock, threadsPerBlock); + + // Compared to nms_cuda_kernel, where each box is represented with 4 values + // (x1, y1, x2, y2), each rotated box is represented with 5 values + // (x_center, y_center, width, height, angle_degrees) here. + __shared__ T block_boxes[threadsPerBlock * 5]; + if (threadIdx.x < col_size) { + block_boxes[threadIdx.x * 5 + 0] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 6 + 0]; + block_boxes[threadIdx.x * 5 + 1] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 6 + 1]; + block_boxes[threadIdx.x * 5 + 2] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 6 + 2]; + block_boxes[threadIdx.x * 5 + 3] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 6 + 3]; + block_boxes[threadIdx.x * 5 + 4] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 6 + 4]; + } + __syncthreads(); + + if (threadIdx.x < row_size) { + const int cur_box_idx = threadsPerBlock * row_start + threadIdx.x; + const T* cur_box = dev_boxes + cur_box_idx * 6; + int i = 0; + unsigned long long t = 0; + int start = 0; + if (row_start == col_start) { + start = threadIdx.x + 1; + } + for (i = start; i < col_size; i++) { + // Instead of devIoU used by original horizontal nms, here + // we use the single_box_iou_rotated function from + // box_iou_rotated_utils.h + if (single_box_iou_rotated(cur_box, block_boxes + i * 5, 0) > + iou_threshold) { + t |= 1ULL << i; + } + } + const int col_blocks = divideUP(n_boxes, threadsPerBlock); + dev_mask[cur_box_idx * col_blocks + col_start] = t; + } + } else { + const int row_start = blockIdx.y; + const int col_start = blockIdx.x; + + // if (row_start > col_start) return; + + const int row_size = + min(n_boxes - row_start * threadsPerBlock, threadsPerBlock); + const int col_size = + min(n_boxes - col_start * threadsPerBlock, threadsPerBlock); + + // Compared to nms_cuda_kernel, where each box is represented with 4 values + // (x1, y1, x2, y2), each rotated box is represented with 5 values + // (x_center, y_center, width, height, angle_degrees) here. + __shared__ T block_boxes[threadsPerBlock * 5]; + if (threadIdx.x < col_size) { + block_boxes[threadIdx.x * 5 + 0] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 0]; + block_boxes[threadIdx.x * 5 + 1] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 1]; + block_boxes[threadIdx.x * 5 + 2] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 2]; + block_boxes[threadIdx.x * 5 + 3] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 3]; + block_boxes[threadIdx.x * 5 + 4] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 4]; + } + __syncthreads(); + + if (threadIdx.x < row_size) { + const int cur_box_idx = threadsPerBlock * row_start + threadIdx.x; + const T* cur_box = dev_boxes + cur_box_idx * 5; + int i = 0; + unsigned long long t = 0; + int start = 0; + if (row_start == col_start) { + start = threadIdx.x + 1; + } + for (i = start; i < col_size; i++) { + // Instead of devIoU used by original horizontal nms, here + // we use the single_box_iou_rotated function from + // box_iou_rotated_utils.h + if (single_box_iou_rotated(cur_box, block_boxes + i * 5, 0) > + iou_threshold) { + t |= 1ULL << i; + } + } + const int col_blocks = divideUP(n_boxes, threadsPerBlock); + dev_mask[cur_box_idx * col_blocks + col_start] = t; + } + } +} + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/parrots_cudawarpfunction.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/parrots_cudawarpfunction.cuh new file mode 100644 index 0000000000000000000000000000000000000000..7918a57452bbde9dc7c249b0c3dd2774aa1961bf --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/parrots_cudawarpfunction.cuh @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2019, SenseTime. + */ + +#ifndef INCLUDE_PARROTS_DARRAY_CUDAWARPFUNCTION_CUH_ +#define INCLUDE_PARROTS_DARRAY_CUDAWARPFUNCTION_CUH_ + +#ifndef __CUDACC__ +#error cudawarpfunction.cuh should only be included by .cu files +#endif +#include + +#include + +#ifdef PARROTS_USE_HALF +#include +#endif +#ifdef __CUDA_ARCH__ +#define CUDA_INTRINSIC_FUNC(Expr) Expr +#else +#define CUDA_INTRINSIC_FUNC(Expr) +#endif + +#if !defined(__CUDA_ARCH__) || __CUDA_ARCH__ >= 300 + +#ifdef PARROTS_USE_HALF + +#if CUDA_VERSION < 9000 + +__device__ inline float16 __shfl(float16 var, int srcLane, int width) { + CUDA_INTRINSIC_FUNC(return __shfl(var.y, srcLane, width);); +} + +__device__ inline float16 __shfl_up(float16 var, unsigned delta, int width) { + CUDA_INTRINSIC_FUNC(return __shfl_up(var.y, delta, width);); +} + +__device__ inline float16 __shfl_down(float16 var, unsigned delta, int width) { + CUDA_INTRINSIC_FUNC(return __shfl_down(var.y, delta, width);); +} + +__device__ inline float16 __shfl_xor(float16 var, int laneMask, int width) { + CUDA_INTRINSIC_FUNC(return __shfl_xor(var.y, laneMask, width);); +} + +#else // CUDA_VERSION >= 9000 + +__device__ inline float16 __shfl_sync(unsigned mask, float16 var, int srcLane, + int width = warpSize) { + CUDA_INTRINSIC_FUNC(float16 r; r.y = __shfl_sync(mask, var.y, srcLane, width); + return r;); +} + +__device__ inline float16 __shfl_up_sync(unsigned mask, float16 var, + unsigned delta, int width = warpSize) { + CUDA_INTRINSIC_FUNC( + float16 r; r.y = __shfl_up_sync(mask, var.y, delta, width); return r;); +} + +__device__ inline float16 __shfl_down_sync(unsigned mask, float16 var, + unsigned delta, + int width = warpSize) { + CUDA_INTRINSIC_FUNC( + float16 r; r.y = __shfl_down_sync(mask, var.y, delta, width); return r;); +} + +__device__ inline float16 __shfl_xor_sync(unsigned mask, float16 var, + int laneMask, int width) { + CUDA_INTRINSIC_FUNC(float16 r; + r.y = __shfl_xor_sync(mask, var.y, laneMask, width); + return r;); +} + +#endif // CUDA_VERSION < 9000 + +#endif // PARROTS_USE_HALF + +// warp shuffle interface with a dummy mask +#if CUDA_VERSION < 9000 + +template +__device__ inline T __shfl_sync(unsigned mask, T var, int srcLane, + int width = warpSize) { + CUDA_INTRINSIC_FUNC(return __shfl(var, srcLane, width);); +} + +template +__device__ inline T __shfl_up_sync(unsigned mask, T var, unsigned delta, + int width = warpSize) { + CUDA_INTRINSIC_FUNC(return __shfl_up(var, delta, width);); +} + +template +__device__ inline T __shfl_down_sync(unsigned mask, T var, unsigned delta, + int width = warpSize) { + CUDA_INTRINSIC_FUNC(return __shfl_down(var, delta, width);); +} + +template +__device__ inline T __shfl_xor_sync(unsigned mask, T var, int laneMask, + int width = warpSize) { + CUDA_INTRINSIC_FUNC(return __shfl_xor(var, laneMask, width);); +} + +#endif // CUDA_VERSION < 9000 + +#endif // !defined(__CUDA_ARCH__) || __CUDA_ARCH__ >= 300 + +#endif // INCLUDE_PARROTS_DARRAY_CUDAWARPFUNCTION_CUH_ diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/points_in_boxes_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/points_in_boxes_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..342362079a5ce3dde6d19532b3014872f4373330 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/points_in_boxes_cuda_kernel.cuh @@ -0,0 +1,95 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef POINT_IN_BOXES_CUDA_KERNEL_CUH +#define POINT_IN_BOXES_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__device__ inline void lidar_to_local_coords(T shift_x, T shift_y, T rz, + T &local_x, T &local_y) { + T cosa = cos(-rz), sina = sin(-rz); + local_x = shift_x * cosa + shift_y * (-sina); + local_y = shift_x * sina + shift_y * cosa; +} + +template +__device__ inline int check_pt_in_box3d(const T *pt, const T *box3d, T &local_x, + T &local_y) { + // param pt: (x, y, z) + // param box3d: (cx, cy, cz, x_size, y_size, z_size, rz) in LiDAR coordinate, + // cz in the bottom center + T x = pt[0], y = pt[1], z = pt[2]; + T cx = box3d[0], cy = box3d[1], cz = box3d[2]; + T x_size = box3d[3], y_size = box3d[4], z_size = box3d[5], rz = box3d[6]; + cz += z_size / + 2.0; // shift to the center since cz in box3d is the bottom center + + if (fabsf(z - cz) > z_size / 2.0) return 0; + lidar_to_local_coords(x - cx, y - cy, rz, local_x, local_y); + float in_flag = (local_x > -x_size / 2.0) & (local_x < x_size / 2.0) & + (local_y > -y_size / 2.0) & (local_y < y_size / 2.0); + return in_flag; +} + +template +__global__ void points_in_boxes_part_forward_cuda_kernel( + int batch_size, int boxes_num, int pts_num, const T *boxes, const T *pts, + int *box_idx_of_points) { + // params boxes: (B, N, 7) [x, y, z, x_size, y_size, z_size, rz] in LiDAR + // coordinate, z is the bottom center, each box DO NOT overlaps params pts: + // (B, npoints, 3) [x, y, z] in LiDAR coordinate params boxes_idx_of_points: + // (B, npoints), default -1 + + int bs_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, pts_num) { + if (bs_idx >= batch_size) return; + + boxes += bs_idx * boxes_num * 7; + pts += bs_idx * pts_num * 3 + pt_idx * 3; + box_idx_of_points += bs_idx * pts_num + pt_idx; + + T local_x = 0, local_y = 0; + int cur_in_flag = 0; + for (int k = 0; k < boxes_num; k++) { + cur_in_flag = check_pt_in_box3d(pts, boxes + k * 7, local_x, local_y); + if (cur_in_flag) { + box_idx_of_points[0] = k; + break; + } + } + } +} + +template +__global__ void points_in_boxes_all_forward_cuda_kernel( + int batch_size, int boxes_num, int pts_num, const T *boxes, const T *pts, + int *box_idx_of_points) { + // params boxes: (B, N, 7) [x, y, z, x_size, y_size, z_size, rz] in LiDAR + // coordinate, z is the bottom center, each box DO NOT overlaps params pts: + // (B, npoints, 3) [x, y, z] in LiDAR coordinate params boxes_idx_of_points: + // (B, npoints), default -1 + + int bs_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, pts_num) { + if (bs_idx >= batch_size) return; + + boxes += bs_idx * boxes_num * 7; + pts += bs_idx * pts_num * 3 + pt_idx * 3; + box_idx_of_points += bs_idx * pts_num * boxes_num + pt_idx * boxes_num; + + T local_x = 0, local_y = 0; + for (int k = 0; k < boxes_num; k++) { + const int cur_in_flag = + check_pt_in_box3d(pts, boxes + k * 7, local_x, local_y); + if (cur_in_flag) { + box_idx_of_points[k] = 1; + } + } + } +} + +#endif // POINT_IN_BOXES_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/points_in_polygons_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/points_in_polygons_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..a0769d75a29ce8d7eac00931d6f51caa292b2693 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/points_in_polygons_cuda_kernel.cuh @@ -0,0 +1,79 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef POINTS_IN_POLYGONS_CUDA_KERNEL_CUH +#define POINTS_IN_POLYGONS_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +struct point { + float x, y; +}; + +template +__global__ void points_in_polygons_forward_cuda_kernel( + const int nthreads, const scalar_t *vertex1, const scalar_t *vertex2, + const int rows, const int cols, scalar_t *inside_flag) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int row = index / cols; + int col = index % cols; + + const scalar_t *offset_vertex1 = vertex1 + row * 2; + const scalar_t *offset_vertex2 = vertex2 + col * 8; + + point point_[1]; + point polygon[4]; + + point_[0].x = offset_vertex1[0]; + point_[0].y = offset_vertex1[1]; + + polygon[0].x = offset_vertex2[0]; + polygon[0].y = offset_vertex2[1]; + polygon[1].x = offset_vertex2[2]; + polygon[1].y = offset_vertex2[3]; + polygon[2].x = offset_vertex2[4]; + polygon[2].y = offset_vertex2[5]; + polygon[3].x = offset_vertex2[6]; + polygon[3].y = offset_vertex2[7]; + + int nCross = 0; + int i, j; + float sx, sy, tx, ty, px, py, x; + for (i = 0, j = 3; i < 4; j = i, i++) { + sx = polygon[i].x; + sy = polygon[i].y; + tx = polygon[j].x; + ty = polygon[j].y; + + px = point_[0].x; + py = point_[0].y; + + if (py < min(sy, ty)) continue; + if (py > max(sy, ty)) continue; + + if ((sx == px && sy == py) || (tx == px && ty == py)) { + break; + } else { + if ((sy < py && ty >= py) || (sy >= py && ty < py)) { + x = sx + (py - sy) * (tx - sx) / (ty - sy); + if (x == px) { + break; + } + if (x > px) { + nCross++; + } + } + } + } + if (nCross % 2 == 1) { + inside_flag[index] = 1.0; + } else { + inside_flag[index] = 0.0; + } + return; + } +} + +#endif // POINTS_IN_POLYGONS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/prroi_pool_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/prroi_pool_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..e2f5a11b8dd6058f8d2fd288fc943dc235b39c37 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/prroi_pool_cuda_kernel.cuh @@ -0,0 +1,381 @@ +// Copyright (c) OpenMMLab. All rights reserved +// Modified from +// https://github.com/vacancy/PreciseRoIPooling/blob/master/src/prroi_pooling_gpu_impl.cu +// Distributed under terms of the MIT license. +#ifndef PRROI_POOL_CUDA_KERNEL_CUH +#define PRROI_POOL_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__device__ static __forceinline__ T PrRoIPoolingGetData(const T *data, + const int h, + const int w, + const int height, + const int width) { + bool overflow = (h < 0) || (w < 0) || (h >= height) || (w >= width); + T retVal = overflow ? 0.0f : data[h * width + w]; + return retVal; +} + +template +__device__ static __forceinline__ T PrRoIPoolingGetCoeff(T dh, T dw) { + return (1.0f - abs(dh)) * (1.0f - abs(dw)); +} + +template +__device__ static __forceinline__ T PrRoIPoolingSingleCoorIntegral(T s, T t, + T c1, T c2) { + return 0.5 * (t * t - s * s) * (c2 - c1) + (t - s) * c1; +} + +template +__device__ static T PrRoIPoolingInterpolation(const T *data, const T h, + const T w, const int height, + const int width) { + T retVal = 0.0f; + int h1 = floorf(h); + int w1 = floorf(w); + retVal += PrRoIPoolingGetData(data, h1, w1, height, width) * + PrRoIPoolingGetCoeff(h - T(h1), w - T(w1)); + h1 = floorf(h) + 1; + w1 = floorf(w); + retVal += PrRoIPoolingGetData(data, h1, w1, height, width) * + PrRoIPoolingGetCoeff(h - T(h1), w - T(w1)); + h1 = floorf(h); + w1 = floorf(w) + 1; + retVal += PrRoIPoolingGetData(data, h1, w1, height, width) * + PrRoIPoolingGetCoeff(h - T(h1), w - T(w1)); + h1 = floorf(h) + 1; + w1 = floorf(w) + 1; + retVal += PrRoIPoolingGetData(data, h1, w1, height, width) * + PrRoIPoolingGetCoeff(h - T(h1), w - T(w1)); + return retVal; +} + +template +__device__ static T PrRoIPoolingMatCalculation(const T *this_data, + const int s_h, const int s_w, + const int e_h, const int e_w, + const T y0, const T x0, + const T y1, const T x1, + const int h0, const int w0) { + T alpha, beta, lim_alpha, lim_beta, tmp; + T sum_out = 0; + + alpha = x0 - T(s_w); + beta = y0 - T(s_h); + lim_alpha = x1 - T(s_w); + lim_beta = y1 - T(s_h); + tmp = (lim_alpha - 0.5f * lim_alpha * lim_alpha - alpha + + 0.5f * alpha * alpha) * + (lim_beta - 0.5f * lim_beta * lim_beta - beta + 0.5f * beta * beta); + sum_out += PrRoIPoolingGetData(this_data, s_h, s_w, h0, w0) * tmp; + + alpha = T(e_w) - x1; + lim_alpha = T(e_w) - x0; + tmp = (lim_alpha - 0.5f * lim_alpha * lim_alpha - alpha + + 0.5f * alpha * alpha) * + (lim_beta - 0.5f * lim_beta * lim_beta - beta + 0.5f * beta * beta); + sum_out += PrRoIPoolingGetData(this_data, s_h, e_w, h0, w0) * tmp; + + alpha = x0 - T(s_w); + beta = T(e_h) - y1; + lim_alpha = x1 - T(s_w); + lim_beta = T(e_h) - y0; + tmp = (lim_alpha - 0.5f * lim_alpha * lim_alpha - alpha + + 0.5f * alpha * alpha) * + (lim_beta - 0.5f * lim_beta * lim_beta - beta + 0.5f * beta * beta); + sum_out += PrRoIPoolingGetData(this_data, e_h, s_w, h0, w0) * tmp; + + alpha = T(e_w) - x1; + lim_alpha = T(e_w) - x0; + tmp = (lim_alpha - 0.5f * lim_alpha * lim_alpha - alpha + + 0.5f * alpha * alpha) * + (lim_beta - 0.5f * lim_beta * lim_beta - beta + 0.5f * beta * beta); + sum_out += PrRoIPoolingGetData(this_data, e_h, e_w, h0, w0) * tmp; + + return sum_out; +} + +template +__device__ static void PrRoIPoolingDistributeDiff(T *diff, const T top_diff, + const int h, const int w, + const int height, + const int width, + const T coeff) { + bool overflow = (h < 0) || (w < 0) || (h >= height) || (w >= width); + if (!overflow) atomicAdd(diff + h * width + w, top_diff * coeff); +} + +template +__device__ static void PrRoIPoolingMatDistributeDiff( + T *diff, const T top_diff, const int s_h, const int s_w, const int e_h, + const int e_w, const T y0, const T x0, const T y1, const T x1, const int h0, + const int w0) { + T alpha, beta, lim_alpha, lim_beta, tmp; + + alpha = x0 - T(s_w); + beta = y0 - T(s_h); + lim_alpha = x1 - T(s_w); + lim_beta = y1 - T(s_h); + tmp = (lim_alpha - 0.5f * lim_alpha * lim_alpha - alpha + + 0.5f * alpha * alpha) * + (lim_beta - 0.5f * lim_beta * lim_beta - beta + 0.5f * beta * beta); + PrRoIPoolingDistributeDiff(diff, top_diff, s_h, s_w, h0, w0, tmp); + + alpha = T(e_w) - x1; + lim_alpha = T(e_w) - x0; + tmp = (lim_alpha - 0.5f * lim_alpha * lim_alpha - alpha + + 0.5f * alpha * alpha) * + (lim_beta - 0.5f * lim_beta * lim_beta - beta + 0.5f * beta * beta); + PrRoIPoolingDistributeDiff(diff, top_diff, s_h, e_w, h0, w0, tmp); + + alpha = x0 - T(s_w); + beta = T(e_h) - y1; + lim_alpha = x1 - T(s_w); + lim_beta = T(e_h) - y0; + tmp = (lim_alpha - 0.5f * lim_alpha * lim_alpha - alpha + + 0.5f * alpha * alpha) * + (lim_beta - 0.5f * lim_beta * lim_beta - beta + 0.5f * beta * beta); + PrRoIPoolingDistributeDiff(diff, top_diff, e_h, s_w, h0, w0, tmp); + + alpha = T(e_w) - x1; + lim_alpha = T(e_w) - x0; + tmp = (lim_alpha - 0.5f * lim_alpha * lim_alpha - alpha + + 0.5f * alpha * alpha) * + (lim_beta - 0.5f * lim_beta * lim_beta - beta + 0.5f * beta * beta); + PrRoIPoolingDistributeDiff(diff, top_diff, e_h, e_w, h0, w0, tmp); +} + +template +__global__ void prroi_pool_forward_cuda_kernel( + const int nthreads, const T *input, const T *rois, T *output, + const int pooled_height, const int pooled_width, const T spatial_scale, + const int channels, const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T *offset_rois = rois + n * 5; + int roi_batch_ind = offset_rois[0]; + + T roi_x1 = offset_rois[1] * spatial_scale; + T roi_y1 = offset_rois[2] * spatial_scale; + T roi_x2 = offset_rois[3] * spatial_scale; + T roi_y2 = offset_rois[4] * spatial_scale; + + T roi_width = max(roi_x2 - roi_x1, ((T)0.0)); + T roi_height = max(roi_y2 - roi_y1, ((T)0.0)); + T bin_size_h = roi_height / static_cast(pooled_height); + T bin_size_w = roi_width / static_cast(pooled_width); + + const T *this_data = + input + (roi_batch_ind * channels + c) * height * width; + T *this_out = output + index; + + T bin_x1 = roi_x1 + bin_size_w * pw; + T bin_y1 = roi_y1 + bin_size_h * ph; + T bin_x2 = bin_x1 + bin_size_w; + T bin_y2 = bin_y1 + bin_size_h; + + T bin_size = max(T(0.0), bin_size_w * bin_size_h); + if (bin_size == 0) { + *this_out = 0; + continue; + } + + T sum_out = 0; + + int start_x, start_y, end_x, end_y; + + start_x = floorf(bin_x1); + end_x = ceilf(bin_x2); + start_y = floorf(bin_y1); + end_y = ceilf(bin_y2); + + for (int bin_x = start_x; bin_x < end_x; ++bin_x) + for (int bin_y = start_y; bin_y < end_y; ++bin_y) + sum_out += PrRoIPoolingMatCalculation( + this_data, bin_y, bin_x, bin_y + 1, bin_x + 1, + max(bin_y1, T(bin_y)), max(bin_x1, T(bin_x)), + min(bin_y2, T(bin_y) + 1.0f), min(bin_x2, T(bin_x + 1.0f)), height, + width); + *this_out = sum_out / bin_size; + } +} + +template +__global__ void prroi_pool_backward_cuda_kernel( + const int nthreads, const T *grad_output, const T *rois, T *grad_input, + const int pooled_height, const int pooled_width, const T spatial_scale, + const int channels, const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + auto rois_cur = rois + n * 5; + + int roi_batch_ind = rois_cur[0]; + T roi_x1 = rois_cur[1] * spatial_scale; + T roi_y1 = rois_cur[2] * spatial_scale; + T roi_x2 = rois_cur[3] * spatial_scale; + T roi_y2 = rois_cur[4] * spatial_scale; + + T roi_width = max(roi_x2 - roi_x1, (T)0); + T roi_height = max(roi_y2 - roi_y1, (T)0); + T bin_size_h = roi_height / static_cast(pooled_height); + T bin_size_w = roi_width / static_cast(pooled_width); + + const T *this_out_grad = grad_output + index; + T *this_data_grad = + grad_input + (roi_batch_ind * channels + c) * height * width; + + T bin_x1 = roi_x1 + bin_size_w * pw; + T bin_y1 = roi_y1 + bin_size_h * ph; + T bin_x2 = bin_x1 + bin_size_w; + T bin_y2 = bin_y1 + bin_size_h; + + T bin_size = max(T(0.0), bin_size_w * bin_size_h); + + T sum_out = bin_size == T(0) ? T(0) : *this_out_grad / bin_size; + + int start_x, start_y, end_x, end_y; + + start_x = floorf(bin_x1); + end_x = ceilf(bin_x2); + start_y = floorf(bin_y1); + end_y = ceilf(bin_y2); + + for (int bin_x = start_x; bin_x < end_x; ++bin_x) + for (int bin_y = start_y; bin_y < end_y; ++bin_y) + PrRoIPoolingMatDistributeDiff( + this_data_grad, sum_out, bin_y, bin_x, bin_y + 1, bin_x + 1, + max(bin_y1, T(bin_y)), max(bin_x1, T(bin_x)), + min(bin_y2, T(bin_y) + 1.0f), min(bin_x2, T(bin_x + 1.0f)), height, + width); + } +} + +template +__global__ void prroi_pool_coor_backward_cuda_kernel( + const int nthreads, const T *output, const T *grad_output, const T *input, + const T *rois, T *grad_rois, const int pooled_height, + const int pooled_width, const T spatial_scale, const int channels, + const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + auto rois_cur = rois + n * 5; + + int roi_batch_ind = rois_cur[0]; + T roi_x1 = rois_cur[1] * spatial_scale; + T roi_y1 = rois_cur[2] * spatial_scale; + T roi_x2 = rois_cur[3] * spatial_scale; + T roi_y2 = rois_cur[4] * spatial_scale; + + T roi_width = max(roi_x2 - roi_x1, (T)0); + T roi_height = max(roi_y2 - roi_y1, (T)0); + T bin_size_h = roi_height / static_cast(pooled_height); + T bin_size_w = roi_width / static_cast(pooled_width); + + const T output_grad_val = grad_output[index]; + const T *this_input_data = + input + (roi_batch_ind * channels + c) * height * width; + const T output_val = output[index]; + T *this_rois_grad = grad_rois + n * 5; + + T bin_x1 = roi_x1 + bin_size_w * pw; + T bin_y1 = roi_y1 + bin_size_h * ph; + T bin_x2 = bin_x1 + bin_size_w; + T bin_y2 = bin_y1 + bin_size_h; + + T bin_size = max(T(0.0), bin_size_w * bin_size_h); + + T sum_out = bin_size == T(0) ? T(0) : output_grad_val / bin_size; + + // WARNING: to be discussed + if (sum_out == 0) continue; + + int start_x, start_y, end_x, end_y; + + start_x = floorf(bin_x1); + end_x = ceilf(bin_x2); + start_y = floorf(bin_y1); + end_y = ceilf(bin_y2); + + T grad_x1_y = 0, grad_x2_y = 0, grad_x_y1 = 0, grad_x_y2 = 0; + for (int bin_y = start_y; bin_y < end_y; ++bin_y) { + grad_x1_y += PrRoIPoolingSingleCoorIntegral( + max(bin_y1, T(bin_y)) - bin_y, min(bin_y2, T(bin_y + 1)) - bin_y, + PrRoIPoolingInterpolation(this_input_data, float(bin_y), bin_x1, + height, width), + PrRoIPoolingInterpolation(this_input_data, float(bin_y + 1), bin_x1, + height, width)); + + grad_x2_y += PrRoIPoolingSingleCoorIntegral( + max(bin_y1, T(bin_y)) - bin_y, min(bin_y2, T(bin_y + 1)) - bin_y, + PrRoIPoolingInterpolation(this_input_data, float(bin_y), bin_x2, + height, width), + PrRoIPoolingInterpolation(this_input_data, float(bin_y + 1), bin_x2, + height, width)); + } + + for (int bin_x = start_x; bin_x < end_x; ++bin_x) { + grad_x_y1 += PrRoIPoolingSingleCoorIntegral( + max(bin_x1, T(bin_x)) - bin_x, min(bin_x2, T(bin_x + 1)) - bin_x, + PrRoIPoolingInterpolation(this_input_data, bin_y1, float(bin_x), + height, width), + PrRoIPoolingInterpolation(this_input_data, bin_y1, float(bin_x + 1), + height, width)); + + grad_x_y2 += PrRoIPoolingSingleCoorIntegral( + max(bin_x1, T(bin_x)) - bin_x, min(bin_x2, T(bin_x + 1)) - bin_x, + PrRoIPoolingInterpolation(this_input_data, bin_y2, float(bin_x), + height, width), + PrRoIPoolingInterpolation(this_input_data, bin_y2, float(bin_x + 1), + height, width)); + } + + T partial_x1 = -grad_x1_y + (bin_y2 - bin_y1) * output_val; + T partial_y1 = -grad_x_y1 + (bin_x2 - bin_x1) * output_val; + T partial_x2 = grad_x2_y - (bin_y2 - bin_y1) * output_val; + T partial_y2 = grad_x_y2 - (bin_x2 - bin_x1) * output_val; + + partial_x1 = partial_x1 / bin_size * spatial_scale; + partial_x2 = partial_x2 / bin_size * spatial_scale; + partial_y1 = partial_y1 / bin_size * spatial_scale; + partial_y2 = partial_y2 / bin_size * spatial_scale; + + // (index, x1, y1, x2, y2) + this_rois_grad[0] = 0; + atomicAdd(this_rois_grad + 1, + (partial_x1 * (1.0f - T(pw) / pooled_width) + + partial_x2 * (1.0f - T(pw + 1) / pooled_width)) * + output_grad_val); + atomicAdd(this_rois_grad + 2, + (partial_y1 * (1.0f - T(ph) / pooled_height) + + partial_y2 * (1.0f - T(ph + 1) / pooled_height)) * + output_grad_val); + atomicAdd(this_rois_grad + 3, (partial_x2 * T(pw + 1) / pooled_width + + partial_x1 * T(pw) / pooled_width) * + output_grad_val); + atomicAdd(this_rois_grad + 4, (partial_y2 * T(ph + 1) / pooled_height + + partial_y1 * T(ph) / pooled_height) * + output_grad_val); + } +} + +#endif // ROI_POOL_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/psamask_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/psamask_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..5d946686bdd5fdfbf8a27f6d040e15861202f471 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/psamask_cuda_kernel.cuh @@ -0,0 +1,141 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef PSAMASK_CUDA_KERNEL_CUH +#define PSAMASK_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +// CUDA: grid stride looping +#ifndef CUDA_KERNEL_LOOP +#define CUDA_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < (n); \ + i += blockDim.x * gridDim.x) +#endif + +template +__global__ void psamask_collect_forward_cuda( + const int nthreads, const int h_feature, const int w_feature, + const int h_mask, const int w_mask, const int half_h_mask, + const int half_w_mask, const T* mask_data, T* buffer_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int w = index % w_feature; + const int h = (index / w_feature) % h_feature; + const int n = index / w_feature / h_feature; + // effective mask region : [hstart, hend) x [wstart, wend) with mask-indexed + const int hstart = max(0, half_h_mask - h); + const int hend = min(h_mask, h_feature + half_h_mask - h); + const int wstart = max(0, half_w_mask - w); + const int wend = min(w_mask, w_feature + half_w_mask - w); + // (hidx, widx ) with mask-indexed + // (hidx + h - half_h_mask, widx + w - half_w_mask) with feature-indexed + for (int hidx = hstart; hidx < hend; hidx++) { + for (int widx = wstart; widx < wend; widx++) { + buffer_data[(n * h_feature * w_feature + + (hidx + h - half_h_mask) * w_feature + + (widx + w - half_w_mask)) * + h_feature * w_feature + + h * w_feature + w] = mask_data + [((n * h_mask * w_mask + hidx * w_mask + widx) * h_feature + h) * + w_feature + + w]; + } + } + } +} + +template +__global__ void psamask_distribute_forward_cuda( + const int nthreads, const int h_feature, const int w_feature, + const int h_mask, const int w_mask, const int half_h_mask, + const int half_w_mask, const T* mask_data, T* buffer_data) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int w = index % w_feature; + const int h = (index / w_feature) % h_feature; + const int n = index / w_feature / h_feature; + // effective mask region : [hstart, hend) x [wstart, wend) with mask-indexed + const int hstart = max(0, half_h_mask - h); + const int hend = min(h_mask, h_feature + half_h_mask - h); + const int wstart = max(0, half_w_mask - w); + const int wend = min(w_mask, w_feature + half_w_mask - w); + // (hidx, widx ) with mask-indexed + // (hidx + h - half_h_mask, widx + w - half_w_mask) with feature-indexed + for (int hidx = hstart; hidx < hend; hidx++) { + for (int widx = wstart; widx < wend; widx++) { + buffer_data[(n * h_feature * w_feature + h * w_feature + w) * + h_feature * w_feature + + (hidx + h - half_h_mask) * w_feature + + (widx + w - half_w_mask)] = mask_data + [((n * h_mask * w_mask + hidx * w_mask + widx) * h_feature + h) * + w_feature + + w]; + } + } + } +} + +template +__global__ void psamask_collect_backward_cuda( + const int nthreads, const int h_feature, const int w_feature, + const int h_mask, const int w_mask, const int half_h_mask, + const int half_w_mask, const T* buffer_diff, T* mask_diff) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int w = index % w_feature; + const int h = (index / w_feature) % h_feature; + const int n = index / w_feature / h_feature; + // effective mask region : [hstart, hend) x [wstart, wend) with mask-indexed + const int hstart = max(0, half_h_mask - h); + const int hend = min(h_mask, h_feature + half_h_mask - h); + const int wstart = max(0, half_w_mask - w); + const int wend = min(w_mask, w_feature + half_w_mask - w); + // (hidx, widx ) with mask-indexed + // (hidx + h - half_h_mask, widx + w - half_w_mask) with feature-indexed + for (int hidx = hstart; hidx < hend; hidx++) { + for (int widx = wstart; widx < wend; widx++) { + mask_diff[((n * h_mask * w_mask + hidx * w_mask + widx) * h_feature + + h) * + w_feature + + w] = buffer_diff[(n * h_feature * w_feature + + (hidx + h - half_h_mask) * w_feature + + (widx + w - half_w_mask)) * + h_feature * w_feature + + h * w_feature + w]; + } + } + } +} + +template +__global__ void psamask_distribute_backward_cuda( + const int nthreads, const int h_feature, const int w_feature, + const int h_mask, const int w_mask, const int half_h_mask, + const int half_w_mask, const T* buffer_diff, T* mask_diff) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int w = index % w_feature; + const int h = (index / w_feature) % h_feature; + const int n = index / w_feature / h_feature; + // effective mask region : [hstart, hend) x [wstart, wend) with mask-indexed + const int hstart = max(0, half_h_mask - h); + const int hend = min(h_mask, h_feature + half_h_mask - h); + const int wstart = max(0, half_w_mask - w); + const int wend = min(w_mask, w_feature + half_w_mask - w); + // (hidx, widx ) with mask-indexed + // (hidx + h - half_h_mask, widx + w - half_w_mask) with feature-indexed + for (int hidx = hstart; hidx < hend; hidx++) { + for (int widx = wstart; widx < wend; widx++) { + mask_diff[((n * h_mask * w_mask + hidx * w_mask + widx) * h_feature + + h) * + w_feature + + w] = + buffer_diff[(n * h_feature * w_feature + h * w_feature + w) * + h_feature * w_feature + + (hidx + h - half_h_mask) * w_feature + + (widx + w - half_w_mask)]; + } + } + } +} + +#endif // PSAMASK_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/riroi_align_rotated_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/riroi_align_rotated_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..4383d9e82cce97362f53cf799b8dfa30c7b4cd02 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/riroi_align_rotated_cuda_kernel.cuh @@ -0,0 +1,242 @@ +// Modified from +// https://github.com/csuhan/ReDet/blob/master/mmdet/ops/riroi_align/src/riroi_align_kernel.cu +#ifndef RIROI_ALIGN_ROTATED_CUDA_KERNEL_CUH +#define RIROI_ALIGN_ROTATED_CUDA_KERNEL_CUH + +#include +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else // MMCV_USE_PARROTS +#include "pytorch_cuda_helper.hpp" +#endif // MMCV_USE_PARROTS + +/*** Forward ***/ +template +__global__ void riroi_align_rotated_forward_cuda_kernel( + const int nthreads, const scalar_t *bottom_data, + const scalar_t *bottom_rois, const scalar_t spatial_scale, + const int num_samples, const bool clockwise, const int channels, + const int height, const int width, const int pooled_height, + const int pooled_width, const int num_orientations, scalar_t *top_data) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int o = (index / pooled_width / pooled_height) % num_orientations; + int c = + (index / pooled_width / pooled_height / num_orientations) % channels; + int n = index / pooled_width / pooled_height / num_orientations / channels; + + const scalar_t *offset_bottom_rois = bottom_rois + n * 6; + int roi_batch_ind = offset_bottom_rois[0]; + + // Do not using rounding; this implementation detail is critical + scalar_t roi_center_w = offset_bottom_rois[1] * spatial_scale; + scalar_t roi_center_h = offset_bottom_rois[2] * spatial_scale; + scalar_t roi_width = offset_bottom_rois[3] * spatial_scale; + scalar_t roi_height = offset_bottom_rois[4] * spatial_scale; + // scalar_t theta = offset_bottom_rois[5] * M_PI / 180.0; + scalar_t theta = offset_bottom_rois[5]; + // Force malformed ROIs to be 1x1 + roi_width = max(roi_width, (scalar_t)1.); + roi_height = max(roi_height, (scalar_t)1.); + scalar_t bin_size_h = static_cast(roi_height) / + static_cast(pooled_height); + scalar_t bin_size_w = + static_cast(roi_width) / static_cast(pooled_width); + + // find aligned index + scalar_t ind_float = theta * num_orientations / (2 * M_PI); + int ind = floorf(ind_float); + scalar_t l_var = ind_float - (scalar_t)ind; + scalar_t r_var = 1.0 - l_var; + // correct start channel + ind = (ind + num_orientations) % num_orientations; + // rotated channel + int ind_rot = (o - ind + num_orientations) % num_orientations; + int ind_rot_plus = (ind_rot + 1 + num_orientations) % num_orientations; + const scalar_t *offset_bottom_data = + bottom_data + (roi_batch_ind * channels * num_orientations + + c * num_orientations + ind_rot) * + height * width; + + const scalar_t *offset_bottom_data_plus = + bottom_data + (roi_batch_ind * channels * num_orientations + + c * num_orientations + ind_rot_plus) * + height * width; + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (num_samples > 0) + ? num_samples + : ceilf(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (num_samples > 0) ? num_samples : ceilf(roi_width / pooled_width); + + // roi_start_h and roi_start_w are computed wrt the center of RoI (x, y). + // Appropriate translation needs to be applied after. + if (clockwise) { + theta = -theta; // If clockwise, the angle needs to be reversed. + } + scalar_t roi_start_h = -roi_height / 2.0; + scalar_t roi_start_w = -roi_width / 2.0; + scalar_t cosscalar_theta = cos(theta); + scalar_t sinscalar_theta = sin(theta); + + // We do average (integral) pooling inside a bin + const scalar_t count = max(roi_bin_grid_h * roi_bin_grid_w, 1); // e.g. = 4 + + scalar_t output_val = 0.; + for (int iy = 0; iy < roi_bin_grid_h; iy++) { // e.g., iy = 0, 1 + const scalar_t yy = + roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const scalar_t xx = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + // Rotate by theta (counterclockwise) around the center and translate + scalar_t y = yy * cosscalar_theta - xx * sinscalar_theta + roi_center_h; + scalar_t x = yy * sinscalar_theta + xx * cosscalar_theta + roi_center_w; + + scalar_t val = bilinear_interpolate( + offset_bottom_data, height, width, y, x, index); + scalar_t val_plus = bilinear_interpolate( + offset_bottom_data_plus, height, width, y, x, index); + output_val += r_var * val + l_var * val_plus; + } + } + output_val /= count; + + top_data[index] = output_val; + } +} + +/*** Backward ***/ +template +__global__ void riroi_align_rotated_backward_cuda_kernel( + const int nthreads, const scalar_t *top_diff, const scalar_t *bottom_rois, + const scalar_t spatial_scale, const int num_samples, const bool clockwise, + const int channels, const int height, const int width, + const int pooled_height, const int pooled_width, const int num_orientations, + scalar_t *bottom_diff) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int o = (index / pooled_width / pooled_height) % num_orientations; + int c = + (index / pooled_width / pooled_height / num_orientations) % channels; + int n = index / pooled_width / pooled_height / num_orientations / channels; + + const scalar_t *offset_bottom_rois = bottom_rois + n * 6; + int roi_batch_ind = offset_bottom_rois[0]; + + // Do not round + scalar_t roi_center_w = offset_bottom_rois[1] * spatial_scale; + scalar_t roi_center_h = offset_bottom_rois[2] * spatial_scale; + scalar_t roi_width = offset_bottom_rois[3] * spatial_scale; + scalar_t roi_height = offset_bottom_rois[4] * spatial_scale; + // scalar_t theta = offset_bottom_rois[5] * M_PI / 180.0; + scalar_t theta = offset_bottom_rois[5]; + // Force malformed ROIs to be 1x1 + roi_width = max(roi_width, (scalar_t)1.); + roi_height = max(roi_height, (scalar_t)1.); + + scalar_t bin_size_h = static_cast(roi_height) / + static_cast(pooled_height); + scalar_t bin_size_w = + static_cast(roi_width) / static_cast(pooled_width); + + // find aligned index + scalar_t ind_float = theta * num_orientations / (2 * M_PI); + int ind = floorf(ind_float); + scalar_t l_var = ind_float - (scalar_t)ind; + scalar_t r_var = 1.0 - l_var; + // correct start channel + ind = (ind + num_orientations) % num_orientations; + // rotated channel + int ind_rot = (o - ind + num_orientations) % num_orientations; + int ind_rot_plus = (ind_rot + 1 + num_orientations) % num_orientations; + scalar_t *offset_bottom_diff = + bottom_diff + (roi_batch_ind * channels * num_orientations + + c * num_orientations + ind_rot) * + height * width; + scalar_t *offset_bottom_diff_plus = + bottom_diff + (roi_batch_ind * channels * num_orientations + + c * num_orientations + ind_rot_plus) * + height * width; + int top_offset = + (n * channels * num_orientations + c * num_orientations + o) * + pooled_height * pooled_width; + const scalar_t *offset_top_diff = top_diff + top_offset; + const scalar_t top_diff_this_bin = offset_top_diff[ph * pooled_width + pw]; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (num_samples > 0) + ? num_samples + : ceilf(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (num_samples > 0) ? num_samples : ceilf(roi_width / pooled_width); + + // roi_start_h and roi_start_w are computed wrt the center of RoI (x, y). + // Appropriate translation needs to be applied after. + if (clockwise) { + theta = -theta; // If clockwise, the angle needs to be reversed. + } + scalar_t roi_start_h = -roi_height / 2.0; + scalar_t roi_start_w = -roi_width / 2.0; + scalar_t cosTheta = cos(theta); + scalar_t sinTheta = sin(theta); + + // We do average (integral) pooling inside a bin + const scalar_t count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 + + for (int iy = 0; iy < roi_bin_grid_h; iy++) { // e.g., iy = 0, 1 + const scalar_t yy = + roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const scalar_t xx = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + // Rotate by theta around the center and translate + scalar_t y = yy * cosTheta - xx * sinTheta + roi_center_h; + scalar_t x = yy * sinTheta + xx * cosTheta + roi_center_w; + + scalar_t w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + + bilinear_interpolate_gradient(height, width, y, x, w1, w2, w3, + w4, x_low, x_high, y_low, + y_high, index); + + scalar_t g1 = top_diff_this_bin * w1 / count; + scalar_t g2 = top_diff_this_bin * w2 / count; + scalar_t g3 = top_diff_this_bin * w3 / count; + scalar_t g4 = top_diff_this_bin * w4 / count; + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + atomicAdd(offset_bottom_diff + y_low * width + x_low, g1 * r_var); + atomicAdd(offset_bottom_diff + y_low * width + x_high, g2 * r_var); + atomicAdd(offset_bottom_diff + y_high * width + x_low, g3 * r_var); + atomicAdd(offset_bottom_diff + y_high * width + x_high, g4 * r_var); + + atomicAdd(offset_bottom_diff_plus + y_low * width + x_low, + g1 * l_var); + atomicAdd(offset_bottom_diff_plus + y_low * width + x_high, + g2 * l_var); + atomicAdd(offset_bottom_diff_plus + y_high * width + x_low, + g3 * l_var); + atomicAdd(offset_bottom_diff_plus + y_high * width + x_high, + g4 * l_var); + + } // if + } // ix + } // iy + } // CUDA_1D_KERNEL_LOOP +} // RiRoIAlignBackward + +#endif // RIROI_ALIGN_ROTATED_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roi_align_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roi_align_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..4541462afd6bd77ee794badd7d84bdd6c91b2c43 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roi_align_cuda_kernel.cuh @@ -0,0 +1,212 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef ROI_ALIGN_CUDA_KERNEL_CUH +#define ROI_ALIGN_CUDA_KERNEL_CUH + +#include +#ifdef MMCV_WITH_TRT +#include "common_cuda_helper.hpp" +#else // MMCV_WITH_TRT +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else // MMCV_USE_PARROTS +#include "pytorch_cuda_helper.hpp" +#endif // MMCV_USE_PARROTS +#endif // MMCV_WITH_TRT + +/*** Forward ***/ +template +__global__ void roi_align_forward_cuda_kernel( + const int nthreads, const T* input, const T* rois, T* output, T* argmax_y, + T* argmax_x, const int pooled_height, const int pooled_width, + const T spatial_scale, const int sampling_ratio, + const int pool_mode, // 0 - max pool, 1 - avg pool + const bool aligned, const int channels, const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* offset_rois = rois + n * 5; + int roi_batch_ind = offset_rois[0]; + + // Do not using rounding; this implementation detail is critical + T offset = aligned ? (T)0.5 : (T)0.0; + T roi_start_w = offset_rois[1] * spatial_scale - offset; + T roi_start_h = offset_rois[2] * spatial_scale - offset; + T roi_end_w = offset_rois[3] * spatial_scale - offset; + T roi_end_h = offset_rois[4] * spatial_scale - offset; + + T roi_width = roi_end_w - roi_start_w; + T roi_height = roi_end_h - roi_start_h; + if (!aligned) { // for backward-compatibility only + roi_width = max(roi_width, (T)1.); + roi_height = max(roi_height, (T)1.); + } + + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + const T* offset_input = + input + (roi_batch_ind * channels + c) * height * width; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = + (sampling_ratio > 0) + ? sampling_ratio + : static_cast(ceilf(roi_height / pooled_height)); + int roi_bin_grid_w = + (sampling_ratio > 0) + ? sampling_ratio + : static_cast(ceilf(roi_width / pooled_width)); + + if (pool_mode == 0) { + // We do max pooling inside a bin + T maxval = -FLT_MAX; + T maxidx_y = -1.f, maxidx_x = -1.f; + for (int iy = 0; iy < roi_bin_grid_h; iy++) { + const T y = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + T val = + bilinear_interpolate(offset_input, height, width, y, x, index); + if (val > maxval) { + maxval = val; + maxidx_y = y; + maxidx_x = x; + } + } + } + output[index] = maxval; + argmax_y[index] = maxidx_y; + argmax_x[index] = maxidx_x; + } else if (pool_mode == 1) { + // We do average pooling inside a bin + const T count = max(roi_bin_grid_h * roi_bin_grid_w, 1); + T output_val = 0.; + for (int iy = 0; iy < roi_bin_grid_h; iy++) { + const T y = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + T val = + bilinear_interpolate(offset_input, height, width, y, x, index); + output_val += val; + } + } + output[index] = output_val / count; + } + } +} + +/*** Backward ***/ +template +__global__ void roi_align_backward_cuda_kernel( + const int nthreads, const T* grad_output, const T* rois, const T* argmax_y, + const T* argmax_x, T* grad_input, const int pooled_height, + const int pooled_width, const T spatial_scale, const int sampling_ratio, + const int pool_mode, // 0 - max pool, 1 - avg pool + const bool aligned, const int channels, const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T grad_output_this_bin = grad_output[index]; + + const T* offset_rois = rois + n * 5; + int roi_batch_ind = offset_rois[0]; + T* offset_grad_input = + grad_input + ((roi_batch_ind * channels + c) * height * width); + + if (pool_mode == 0) { + T y = argmax_y[index], x = argmax_x[index]; + if (y != -1.f) { + T w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + bilinear_interpolate_gradient(height, width, y, x, w1, w2, w3, w4, + x_low, x_high, y_low, y_high, index); + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + atomicAdd(offset_grad_input + y_low * width + x_low, + grad_output_this_bin * w1); + atomicAdd(offset_grad_input + y_low * width + x_high, + grad_output_this_bin * w2); + atomicAdd(offset_grad_input + y_high * width + x_low, + grad_output_this_bin * w3); + atomicAdd(offset_grad_input + y_high * width + x_high, + grad_output_this_bin * w4); + } + } + } else if (pool_mode == 1) { + // Do not using rounding; this implementation detail is critical + T offset = aligned ? (T)0.5 : (T)0.0; + T roi_start_w = offset_rois[1] * spatial_scale - offset; + T roi_start_h = offset_rois[2] * spatial_scale - offset; + T roi_end_w = offset_rois[3] * spatial_scale - offset; + T roi_end_h = offset_rois[4] * spatial_scale - offset; + + T roi_width = roi_end_w - roi_start_w; + T roi_height = roi_end_h - roi_start_h; + if (!aligned) { // for backward-compatibility only + roi_width = max(roi_width, (T)1.); + roi_height = max(roi_height, (T)1.); + } + + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = + (sampling_ratio > 0) + ? sampling_ratio + : static_cast(ceilf(roi_height / pooled_height)); + int roi_bin_grid_w = + (sampling_ratio > 0) + ? sampling_ratio + : static_cast(ceilf(roi_width / pooled_width)); + + // We do average (integral) pooling inside a bin + const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 + + for (int iy = 0; iy < roi_bin_grid_h; iy++) { + const T y = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + T w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + bilinear_interpolate_gradient(height, width, y, x, w1, w2, w3, w4, + x_low, x_high, y_low, y_high, index); + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + atomicAdd(offset_grad_input + y_low * width + x_low, + grad_output_this_bin * w1 / count); + atomicAdd(offset_grad_input + y_low * width + x_high, + grad_output_this_bin * w2 / count); + atomicAdd(offset_grad_input + y_high * width + x_low, + grad_output_this_bin * w3 / count); + atomicAdd(offset_grad_input + y_high * width + x_high, + grad_output_this_bin * w4 / count); + } + } + } + } + } +} + +#endif // ROI_ALIGN_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roi_align_rotated_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roi_align_rotated_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..8274dc50c709630c4ee456efd543aa1265049b41 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roi_align_rotated_cuda_kernel.cuh @@ -0,0 +1,202 @@ +// Modified from +// https://github.com/facebookresearch/detectron2/tree/master/detectron2/layers/csrc/ROIAlignRotated +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#ifndef ROI_ALIGN_ROTATED_CUDA_KERNEL_CUH +#define ROI_ALIGN_ROTATED_CUDA_KERNEL_CUH + +#include +#ifdef MMCV_WITH_TRT +#include "common_cuda_helper.hpp" +#else // MMCV_WITH_TRT +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else // MMCV_USE_PARROTS +#include "pytorch_cuda_helper.hpp" +#endif // MMCV_USE_PARROTS +#endif // MMCV_WITH_TRT + +/*** Forward ***/ +template +__global__ void roi_align_rotated_forward_cuda_kernel( + const int nthreads, const scalar_t *bottom_data, + const scalar_t *bottom_rois, const scalar_t spatial_scale, + const int sampling_ratio, const bool aligned, const bool clockwise, + const int channels, const int height, const int width, + const int pooled_height, const int pooled_width, scalar_t *top_data) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const scalar_t *offset_bottom_rois = bottom_rois + n * 6; + int roi_batch_ind = offset_bottom_rois[0]; + + // Do not using rounding; this implementation detail is critical + scalar_t offset = aligned ? (scalar_t)0.5 : (scalar_t)0.0; + scalar_t roi_center_w = offset_bottom_rois[1] * spatial_scale - offset; + scalar_t roi_center_h = offset_bottom_rois[2] * spatial_scale - offset; + scalar_t roi_width = offset_bottom_rois[3] * spatial_scale; + scalar_t roi_height = offset_bottom_rois[4] * spatial_scale; + // scalar_t theta = offset_bottom_rois[5] * M_PI / 180.0; + scalar_t theta = offset_bottom_rois[5]; + if (clockwise) { + theta = -theta; // If clockwise, the angle needs to be reversed. + } + if (!aligned) { // for backward-compatibility only + // Force malformed ROIs to be 1x1 + roi_width = max(roi_width, (scalar_t)1.); + roi_height = max(roi_height, (scalar_t)1.); + } + scalar_t bin_size_h = static_cast(roi_height) / + static_cast(pooled_height); + scalar_t bin_size_w = + static_cast(roi_width) / static_cast(pooled_width); + + const scalar_t *offset_bottom_data = + bottom_data + (roi_batch_ind * channels + c) * height * width; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceilf(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceilf(roi_width / pooled_width); + + // roi_start_h and roi_start_w are computed wrt the center of RoI (x, y). + // Appropriate translation needs to be applied after. + scalar_t roi_start_h = -roi_height / 2.0; + scalar_t roi_start_w = -roi_width / 2.0; + scalar_t cosscalar_theta = cos(theta); + scalar_t sinscalar_theta = sin(theta); + + // We do average (integral) pooling inside a bin + const scalar_t count = max(roi_bin_grid_h * roi_bin_grid_w, 1); // e.g. = 4 + + scalar_t output_val = 0.; + for (int iy = 0; iy < roi_bin_grid_h; iy++) { // e.g., iy = 0, 1 + const scalar_t yy = + roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const scalar_t xx = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + // Rotate by theta (counterclockwise) around the center and translate + scalar_t y = yy * cosscalar_theta - xx * sinscalar_theta + roi_center_h; + scalar_t x = yy * sinscalar_theta + xx * cosscalar_theta + roi_center_w; + + scalar_t val = bilinear_interpolate( + offset_bottom_data, height, width, y, x, index); + output_val += val; + } + } + output_val /= count; + + top_data[index] = output_val; + } +} + +/*** Backward ***/ +template +__global__ void roi_align_rotated_backward_cuda_kernel( + const int nthreads, const scalar_t *top_diff, const scalar_t *bottom_rois, + const scalar_t spatial_scale, const int sampling_ratio, const bool aligned, + const bool clockwise, const int channels, const int height, const int width, + const int pooled_height, const int pooled_width, scalar_t *bottom_diff) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const scalar_t *offset_bottom_rois = bottom_rois + n * 6; + int roi_batch_ind = offset_bottom_rois[0]; + + // Do not round + scalar_t offset = aligned ? (scalar_t)0.5 : (scalar_t)0.0; + scalar_t roi_center_w = offset_bottom_rois[1] * spatial_scale - offset; + scalar_t roi_center_h = offset_bottom_rois[2] * spatial_scale - offset; + scalar_t roi_width = offset_bottom_rois[3] * spatial_scale; + scalar_t roi_height = offset_bottom_rois[4] * spatial_scale; + // scalar_t theta = offset_bottom_rois[5] * M_PI / 180.0; + scalar_t theta = offset_bottom_rois[5]; + if (clockwise) { + theta = -theta; // If clockwise, the angle needs to be reversed. + } + if (!aligned) { // for backward-compatibility only + // Force malformed ROIs to be 1x1 + roi_width = max(roi_width, (scalar_t)1.); + roi_height = max(roi_height, (scalar_t)1.); + } + scalar_t bin_size_h = static_cast(roi_height) / + static_cast(pooled_height); + scalar_t bin_size_w = + static_cast(roi_width) / static_cast(pooled_width); + + scalar_t *offset_bottom_diff = + bottom_diff + (roi_batch_ind * channels + c) * height * width; + + int top_offset = (n * channels + c) * pooled_height * pooled_width; + const scalar_t *offset_top_diff = top_diff + top_offset; + const scalar_t top_diff_this_bin = offset_top_diff[ph * pooled_width + pw]; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceilf(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceilf(roi_width / pooled_width); + + // roi_start_h and roi_start_w are computed wrt the center of RoI (x, y). + // Appropriate translation needs to be applied after. + scalar_t roi_start_h = -roi_height / 2.0; + scalar_t roi_start_w = -roi_width / 2.0; + scalar_t cosTheta = cos(theta); + scalar_t sinTheta = sin(theta); + + // We do average (integral) pooling inside a bin + const scalar_t count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 + + for (int iy = 0; iy < roi_bin_grid_h; iy++) { // e.g., iy = 0, 1 + const scalar_t yy = + roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const scalar_t xx = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + // Rotate by theta around the center and translate + scalar_t y = yy * cosTheta - xx * sinTheta + roi_center_h; + scalar_t x = yy * sinTheta + xx * cosTheta + roi_center_w; + + scalar_t w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + + bilinear_interpolate_gradient(height, width, y, x, w1, w2, w3, + w4, x_low, x_high, y_low, + y_high, index); + + scalar_t g1 = top_diff_this_bin * w1 / count; + scalar_t g2 = top_diff_this_bin * w2 / count; + scalar_t g3 = top_diff_this_bin * w3 / count; + scalar_t g4 = top_diff_this_bin * w4 / count; + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + atomicAdd(offset_bottom_diff + y_low * width + x_low, g1); + atomicAdd(offset_bottom_diff + y_low * width + x_high, g2); + atomicAdd(offset_bottom_diff + y_high * width + x_low, g3); + atomicAdd(offset_bottom_diff + y_high * width + x_high, g4); + } // if + } // ix + } // iy + } // CUDA_1D_KERNEL_LOOP +} // RoIAlignBackward + +#endif // ROI_ALIGN_ROTATED_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roi_pool_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roi_pool_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..3d7eae66b99b7812b92d9fc8bad237cbcbd59436 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roi_pool_cuda_kernel.cuh @@ -0,0 +1,93 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef ROI_POOL_CUDA_KERNEL_CUH +#define ROI_POOL_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void roi_pool_forward_cuda_kernel( + const int nthreads, const T* input, const T* rois, T* output, int* argmax, + const int pooled_height, const int pooled_width, const T spatial_scale, + const int channels, const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* offset_rois = rois + n * 5; + int roi_batch_ind = offset_rois[0]; + // calculate the roi region on feature maps + T roi_x1 = offset_rois[1] * spatial_scale; + T roi_y1 = offset_rois[2] * spatial_scale; + T roi_x2 = (offset_rois[3] + 1) * spatial_scale; + T roi_y2 = (offset_rois[4] + 1) * spatial_scale; + + // force malformed rois to be 1x1 + T roi_w = roi_x2 - roi_x1; + T roi_h = roi_y2 - roi_y1; + if (roi_w <= 0 || roi_h <= 0) continue; + + T bin_size_w = roi_w / static_cast(pooled_width); + T bin_size_h = roi_h / static_cast(pooled_height); + + // the corresponding bin region + int bin_x1 = floorf(static_cast(pw) * bin_size_w + roi_x1); + int bin_y1 = floorf(static_cast(ph) * bin_size_h + roi_y1); + int bin_x2 = ceilf(static_cast(pw + 1) * bin_size_w + roi_x1); + int bin_y2 = ceilf(static_cast(ph + 1) * bin_size_h + roi_y1); + + // add roi offsets and clip to input boundaries + bin_x1 = min(max(bin_x1, 0), width); + bin_y1 = min(max(bin_y1, 0), height); + bin_x2 = min(max(bin_x2, 0), width); + bin_y2 = min(max(bin_y2, 0), height); + bool is_empty = (bin_y2 <= bin_y1) || (bin_x2 <= bin_x1); + + const T* offset_input = + input + (roi_batch_ind * channels + c) * height * width; + // Define an empty pooling region to be zero + // If nothing is pooled, argmax = -1 causes nothing to be backprop'd + T max_val = is_empty ? 0 : -FLT_MAX; + int max_idx = -1; + for (int h = bin_y1; h < bin_y2; ++h) { + for (int w = bin_x1; w < bin_x2; ++w) { + int offset = h * width + w; + if (offset_input[offset] > max_val) { + max_val = offset_input[offset]; + max_idx = offset; + } + } + } + output[index] = max_val; + if (argmax != NULL) argmax[index] = max_idx; + } +} + +template +__global__ void roi_pool_backward_cuda_kernel( + const int nthreads, const T* grad_output, const T* rois, const int* argmax, + T* grad_input, const int pooled_height, const int pooled_width, + const int channels, const int height, const int width) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c) is an element in the pooled output + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + int roi_batch_ind = rois[n * 5]; + T* grad_input_offset = + grad_input + ((roi_batch_ind * channels + c) * height * width); + int argmax_index = argmax[index]; + + if (argmax_index != -1) { + atomicAdd(grad_input_offset + argmax_index, grad_output[index]); + } + } +} + +#endif // ROI_POOL_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roiaware_pool3d_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roiaware_pool3d_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..fc0aacf1435f8715fae92de535bf01bac07ac39a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roiaware_pool3d_cuda_kernel.cuh @@ -0,0 +1,260 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef ROIAWARE_POOL3D_CUDA_KERNEL_CUH +#define ROIAWARE_POOL3D_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__device__ inline void lidar_to_local_coords(T shift_x, T shift_y, T rz, + T &local_x, T &local_y) { + T cosa = cos(-rz), sina = sin(-rz); + local_x = shift_x * cosa + shift_y * (-sina); + local_y = shift_x * sina + shift_y * cosa; +} + +template +__device__ inline int check_pt_in_box3d(const T *pt, const T *box3d, T &local_x, + T &local_y) { + // param pt: (x, y, z) + // param box3d: (cx, cy, cz, x_size, y_size, z_size, rz) in LiDAR coordinate, + // cz in the bottom center + T x = pt[0], y = pt[1], z = pt[2]; + T cx = box3d[0], cy = box3d[1], cz = box3d[2]; + T x_size = box3d[3], y_size = box3d[4], z_size = box3d[5], rz = box3d[6]; + cz += z_size / + 2.0; // shift to the center since cz in box3d is the bottom center + + if (fabsf(z - cz) > z_size / 2.0) return 0; + lidar_to_local_coords(x - cx, y - cy, rz, local_x, local_y); + float in_flag = (local_x > -x_size / 2.0) & (local_x < x_size / 2.0) & + (local_y > -y_size / 2.0) & (local_y < y_size / 2.0); + return in_flag; +} + +template +__global__ void generate_pts_mask_for_box3d(int boxes_num, int pts_num, + int out_x, int out_y, int out_z, + const T *rois, const T *pts, + int *pts_mask) { + // params rois: (N, 7) [x, y, z, x_size, y_size, z_size, rz] in LiDAR + // coordinate params pts: (npoints, 3) [x, y, z] params pts_mask: (N, + // npoints): -1 means point does not in this box, otherwise: encode (x_idxs, + // y_idxs, z_idxs) by binary bit + int box_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, pts_num) { + if (box_idx >= boxes_num) return; + + pts += pt_idx * 3; + rois += box_idx * 7; + pts_mask += box_idx * pts_num + pt_idx; + + T local_x = 0, local_y = 0; + int cur_in_flag = check_pt_in_box3d(pts, rois, local_x, local_y); + + pts_mask[0] = -1; + if (cur_in_flag > 0) { + T local_z = pts[2] - rois[2]; + T x_size = rois[3], y_size = rois[4], z_size = rois[5]; + + T x_res = x_size / out_x; + T y_res = y_size / out_y; + T z_res = z_size / out_z; + + unsigned int x_idx = int((local_x + x_size / 2) / x_res); + unsigned int y_idx = int((local_y + y_size / 2) / y_res); + unsigned int z_idx = int(local_z / z_res); + + x_idx = min(max(x_idx, 0), out_x - 1); + y_idx = min(max(y_idx, 0), out_y - 1); + z_idx = min(max(z_idx, 0), out_z - 1); + + unsigned int idx_encoding = (x_idx << 16) + (y_idx << 8) + z_idx; + + pts_mask[0] = idx_encoding; + } + } +} + +template +__global__ void collect_inside_pts_for_box3d(int boxes_num, int pts_num, + int max_pts_each_voxel, int out_x, + int out_y, int out_z, + const int *pts_mask, + T *pts_idx_of_voxels) { + // params pts_mask: (N, npoints) 0 or 1 + // params pts_idx_of_voxels: (N, out_x, out_y, out_z, max_pts_each_voxel) + CUDA_1D_KERNEL_LOOP(box_idx, boxes_num) { + int max_num_pts = max_pts_each_voxel - 1; // index 0 is the counter + pts_idx_of_voxels += box_idx * out_x * out_y * out_z * max_pts_each_voxel; + + for (int k = 0; k < pts_num; k++) { + if (pts_mask[box_idx * pts_num + k] != -1) { + unsigned int idx_encoding = pts_mask[box_idx * pts_num + k]; + unsigned int x_idx = (idx_encoding >> 16) & 0xFF; + unsigned int y_idx = (idx_encoding >> 8) & 0xFF; + unsigned int z_idx = idx_encoding & 0xFF; + unsigned int base_offset = x_idx * out_y * out_z * max_pts_each_voxel + + y_idx * out_z * max_pts_each_voxel + + z_idx * max_pts_each_voxel; + unsigned int cnt = pts_idx_of_voxels[base_offset]; + if (cnt < max_num_pts) { + pts_idx_of_voxels[base_offset + cnt + 1] = k; + pts_idx_of_voxels[base_offset]++; + } + } + } + } +} + +template +__global__ void roiaware_maxpool3d(int boxes_num, int pts_num, int channels, + int max_pts_each_voxel, int out_x, int out_y, + int out_z, const T *pts_feature, + const int *pts_idx_of_voxels, + T *pooled_features, int *argmax) { + // params pts_feature: (npoints, C) + // params pts_idx_of_voxels: (N, out_x, out_y, out_z, max_pts_each_voxel), + // index 0 is the counter params pooled_features: (N, out_x, out_y, out_z, C) + // params argmax: (N, out_x, out_y, out_z, C) + + int box_idx = blockIdx.z; + int channel_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(voxel_idx_flat, out_x * out_y * out_z) { + int x_idx = voxel_idx_flat / (out_y * out_z); + int y_idx = (voxel_idx_flat - x_idx * (out_y * out_z)) / out_z; + int z_idx = voxel_idx_flat % out_z; + if (box_idx >= boxes_num || channel_idx >= channels) return; + + int offset_base = x_idx * out_y * out_z + y_idx * out_z + z_idx; + pts_idx_of_voxels += box_idx * out_x * out_y * out_z * max_pts_each_voxel + + offset_base * max_pts_each_voxel; + pooled_features += box_idx * out_x * out_y * out_z * channels + + offset_base * channels + channel_idx; + argmax += box_idx * out_x * out_y * out_z * channels + + offset_base * channels + channel_idx; + + int argmax_idx = -1; + float max_val = -1e50; + + int total_pts = pts_idx_of_voxels[0]; + + for (int k = 1; k <= total_pts; k++) { + if (pts_feature[pts_idx_of_voxels[k] * channels + channel_idx] > + max_val) { + max_val = pts_feature[pts_idx_of_voxels[k] * channels + channel_idx]; + argmax_idx = pts_idx_of_voxels[k]; + } + } + + if (argmax_idx != -1) { + pooled_features[0] = max_val; + } + argmax[0] = argmax_idx; + } +} + +template +__global__ void roiaware_avgpool3d(int boxes_num, int pts_num, int channels, + int max_pts_each_voxel, int out_x, int out_y, + int out_z, const T *pts_feature, + const int *pts_idx_of_voxels, + T *pooled_features) { + // params pts_feature: (npoints, C) + // params pts_idx_of_voxels: (N, out_x, out_y, out_z, max_pts_each_voxel), + // index 0 is the counter params pooled_features: (N, out_x, out_y, out_z, C) + // params argmax: (N, out_x, out_y, out_z, C) + + int box_idx = blockIdx.z; + int channel_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(voxel_idx_flat, out_x * out_y * out_z) { + int x_idx = voxel_idx_flat / (out_y * out_z); + int y_idx = (voxel_idx_flat - x_idx * (out_y * out_z)) / out_z; + int z_idx = voxel_idx_flat % out_z; + if (box_idx >= boxes_num || channel_idx >= channels) return; + + int offset_base = x_idx * out_y * out_z + y_idx * out_z + z_idx; + pts_idx_of_voxels += box_idx * out_x * out_y * out_z * max_pts_each_voxel + + offset_base * max_pts_each_voxel; + pooled_features += box_idx * out_x * out_y * out_z * channels + + offset_base * channels + channel_idx; + + float sum_val = 0; + int total_pts = pts_idx_of_voxels[0]; + + for (int k = 1; k <= total_pts; k++) { + sum_val += pts_feature[pts_idx_of_voxels[k] * channels + channel_idx]; + } + + if (total_pts > 0) { + pooled_features[0] = sum_val / total_pts; + } + } +} + +template +__global__ void roiaware_maxpool3d_backward(int boxes_num, int channels, + int out_x, int out_y, int out_z, + const int *argmax, + const T *grad_out, T *grad_in) { + // params argmax: (N, out_x, out_y, out_z, C) + // params grad_out: (N, out_x, out_y, out_z, C) + // params grad_in: (npoints, C), return value + + int box_idx = blockIdx.z; + int channel_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(voxel_idx_flat, out_x * out_y * out_z) { + int x_idx = voxel_idx_flat / (out_y * out_z); + int y_idx = (voxel_idx_flat - x_idx * (out_y * out_z)) / out_z; + int z_idx = voxel_idx_flat % out_z; + if (box_idx >= boxes_num || channel_idx >= channels) return; + + int offset_base = x_idx * out_y * out_z + y_idx * out_z + z_idx; + argmax += box_idx * out_x * out_y * out_z * channels + + offset_base * channels + channel_idx; + grad_out += box_idx * out_x * out_y * out_z * channels + + offset_base * channels + channel_idx; + + if (argmax[0] == -1) return; + + atomicAdd(grad_in + argmax[0] * channels + channel_idx, grad_out[0] * 1); + } +} + +template +__global__ void roiaware_avgpool3d_backward(int boxes_num, int channels, + int out_x, int out_y, int out_z, + int max_pts_each_voxel, + const int *pts_idx_of_voxels, + const T *grad_out, T *grad_in) { + // params pts_idx_of_voxels: (N, out_x, out_y, out_z, max_pts_each_voxel) + // params grad_out: (N, out_x, out_y, out_z, C) + // params grad_in: (npoints, C), return value + + int box_idx = blockIdx.z; + int channel_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(voxel_idx_flat, out_x * out_y * out_z) { + int x_idx = voxel_idx_flat / (out_y * out_z); + int y_idx = (voxel_idx_flat - x_idx * (out_y * out_z)) / out_z; + int z_idx = voxel_idx_flat % out_z; + if (box_idx >= boxes_num || channel_idx >= channels) return; + + int offset_base = x_idx * out_y * out_z + y_idx * out_z + z_idx; + pts_idx_of_voxels += box_idx * out_x * out_y * out_z * max_pts_each_voxel + + offset_base * max_pts_each_voxel; + grad_out += box_idx * out_x * out_y * out_z * channels + + offset_base * channels + channel_idx; + + int total_pts = pts_idx_of_voxels[0]; + float cur_grad = 1 / fmaxf(float(total_pts), 1.0); + for (int k = 1; k <= total_pts; k++) { + atomicAdd(grad_in + pts_idx_of_voxels[k] * channels + channel_idx, + grad_out[0] * cur_grad); + } + } +} + +#endif // ROIAWARE_POOL3D_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roipoint_pool3d_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roipoint_pool3d_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..545f6ffa09d4a6cae49f1f1e68c191c1fd54de68 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/roipoint_pool3d_cuda_kernel.cuh @@ -0,0 +1,134 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef ROIPOINT_POOL3D_CUDA_KERNEL_CUH +#define ROIPOINT_POOL3D_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__device__ inline void lidar_to_local_coords(T shift_x, T shift_y, T rz, + T &local_x, T &local_y) { + T cosa = cos(-rz), sina = sin(-rz); + local_x = shift_x * cosa + shift_y * (-sina); + local_y = shift_x * sina + shift_y * cosa; +} + +template +__device__ inline int check_pt_in_box3d(const T *pt, const T *box3d, T &local_x, + T &local_y) { + // param pt: (x, y, z) + // param box3d: (cx, cy, cz, dx, dy, dz, rz) in LiDAR coordinate, cz in the + // bottom center + T x = pt[0], y = pt[1], z = pt[2]; + T cx = box3d[0], cy = box3d[1], cz = box3d[2]; + T dx = box3d[3], dy = box3d[4], dz = box3d[5], rz = box3d[6]; + cz += dz / 2.0; // shift to the center since cz in box3d is the bottom center + + if (fabsf(z - cz) > dz / 2.0) return 0; + lidar_to_local_coords(x - cx, y - cy, rz, local_x, local_y); + T in_flag = (local_x > -dx / 2.0) & (local_x < dx / 2.0) & + (local_y > -dy / 2.0) & (local_y < dy / 2.0); + return in_flag; +} + +template +__global__ void assign_pts_to_box3d(int batch_size, int pts_num, int boxes_num, + const T *xyz, const T *boxes3d, + int *pts_assign) { + // params xyz: (B, N, 3) + // params boxes3d: (B, M, 7) + // params pts_assign: (B, N, M): idx of the corresponding box3d, -1 means + // background points + int box_idx = blockIdx.y; + int bs_idx = blockIdx.z; + CUDA_1D_KERNEL_LOOP(pt_idx, pts_num) { + if (box_idx >= boxes_num || bs_idx >= batch_size) return; + + int assign_idx = + bs_idx * pts_num * boxes_num + pt_idx * boxes_num + box_idx; + pts_assign[assign_idx] = 0; + + int box_offset = bs_idx * boxes_num * 7 + box_idx * 7; + int pt_offset = bs_idx * pts_num * 3 + pt_idx * 3; + + T local_x = 0, local_y = 0; + int cur_in_flag = check_pt_in_box3d(xyz + pt_offset, boxes3d + box_offset, + local_x, local_y); + pts_assign[assign_idx] = cur_in_flag; + } +} + +__global__ void get_pooled_idx(int batch_size, int pts_num, int boxes_num, + int sampled_pts_num, const int *pts_assign, + int *pts_idx, int *pooled_empty_flag) { + // params xyz: (B, N, 3) + // params pts_feature: (B, N, C) + // params pts_assign: (B, N) + // params pts_idx: (B, M, 512) + // params pooled_empty_flag: (B, M) + CUDA_1D_KERNEL_LOOP(boxes_idx, boxes_num) { + int bs_idx = blockIdx.y; + + int cnt = 0; + for (int k = 0; k < pts_num; k++) { + if (pts_assign[bs_idx * pts_num * boxes_num + k * boxes_num + + boxes_idx]) { + if (cnt < sampled_pts_num) { + pts_idx[bs_idx * boxes_num * sampled_pts_num + + boxes_idx * sampled_pts_num + cnt] = k; + cnt++; + } else + break; + } + } + + if (cnt == 0) { + pooled_empty_flag[bs_idx * boxes_num + boxes_idx] = 1; + } else if (cnt < sampled_pts_num) { + // duplicate same points for sampling + for (int k = cnt; k < sampled_pts_num; k++) { + int duplicate_idx = k % cnt; + int base_offset = + bs_idx * boxes_num * sampled_pts_num + boxes_idx * sampled_pts_num; + pts_idx[base_offset + k] = pts_idx[base_offset + duplicate_idx]; + } + } + } +} + +template +__global__ void roipoint_pool3d_forward( + int batch_size, int pts_num, int boxes_num, int feature_in_len, + int sampled_pts_num, const T *xyz, const int *pts_idx, const T *pts_feature, + T *pooled_features, int *pooled_empty_flag) { + // params xyz: (B, N, 3) + // params pts_idx: (B, M, 512) + // params pts_feature: (B, N, C) + // params pooled_features: (B, M, 512, 3+C) + // params pooled_empty_flag: (B, M) + int box_idx = blockIdx.y; + int bs_idx = blockIdx.z; + CUDA_1D_KERNEL_LOOP(sample_pt_idx, sampled_pts_num) { + if (box_idx >= boxes_num || bs_idx >= batch_size) return; + if (pooled_empty_flag[bs_idx * boxes_num + box_idx]) return; + + int temp_idx = bs_idx * boxes_num * sampled_pts_num + + box_idx * sampled_pts_num + sample_pt_idx; + int src_pt_idx = pts_idx[temp_idx]; + int dst_feature_offset = temp_idx * (3 + feature_in_len); + + for (int j = 0; j < 3; j++) + pooled_features[dst_feature_offset + j] = + xyz[bs_idx * pts_num * 3 + src_pt_idx * 3 + j]; + + int src_feature_offset = + bs_idx * pts_num * feature_in_len + src_pt_idx * feature_in_len; + memcpy(pooled_features + dst_feature_offset + 3, + pts_feature + src_feature_offset, feature_in_len * sizeof(T)); + } +} + +#endif // ROIPOINT_POOL3D_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/rotated_feature_align_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/rotated_feature_align_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..ffcc658ccb1f5e3059c0428159bc2e80fbeee3d4 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/rotated_feature_align_cuda_kernel.cuh @@ -0,0 +1,129 @@ +// Copyright (c) OpenMMLab. All rights reserved. +// Modified from +// https://github.com/SJTU-Thinklab-Det/r3det-on-mmdetection/blob/master/mmdet/ops/fr/src/feature_refine_kernel.cu +#ifndef ROTATED_FEATURE_ALIGN_CUDA_KERNEL_CUH +#define ROTATED_FEATURE_ALIGN_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void rotated_feature_align_forward_kernel( + const int nthreads, const int points, const scalar_t* bottom_data, + const scalar_t* best_bboxes, const scalar_t spatial_scale, + const int channels, const int height, const int width, scalar_t* top_data) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int w = index % width; + int h = (index / width) % height; + int c = (index / width / height) % channels; + int n = index / width / height / channels; + + const scalar_t* bbox_offset = + best_bboxes + ((n * height + h) * width + w) * 5; + scalar_t roi_y = bbox_offset[0] * spatial_scale; + scalar_t roi_x = bbox_offset[1] * spatial_scale; + + scalar_t px[5] = {roi_x, 0, 0, 0, 0}; + scalar_t py[5] = {roi_y, 0, 0, 0, 0}; + + if (points > 1) { + scalar_t roi_w = bbox_offset[2] * spatial_scale; + scalar_t roi_h = bbox_offset[3] * spatial_scale; + scalar_t roi_a = bbox_offset[4]; + + scalar_t w_2 = roi_w / 2, h_2 = roi_h / 2; + scalar_t cosa = cosf(roi_a), sina = sinf(roi_a); + scalar_t wx = cosa * w_2, wy = sina * w_2; + scalar_t hx = -sina * h_2, hy = cosa * h_2; + + px[1] = roi_x + wx + hx; + py[1] = roi_y + wy + hy; + px[2] = roi_x - wx + hx; + py[2] = roi_y - wy + hy; + px[3] = roi_x - wx - hx; + py[3] = roi_y - wy - hy; + px[4] = roi_x + wx - hx; + py[4] = roi_y + wy - hy; + } + + const scalar_t* offset_bottom_data = + bottom_data + (n * channels + c) * height * width; + + scalar_t output_val = bottom_data[index]; + for (int i = 0; i < points; i++) { + output_val += bilinear_interpolate(offset_bottom_data, height, + width, py[i], px[i], i); + } + top_data[index] = output_val; + } +} + +template +__global__ void rotated_feature_align_backward_kernel( + const int nthreads, const int points, const scalar_t* top_diff, + const scalar_t* best_bboxes, const scalar_t spatial_scale, + const int channels, const int height, const int width, + scalar_t* bottom_diff) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int w = index % width; + int h = (index / width) % height; + int c = (index / width / height) % channels; + int n = index / width / height / channels; + + const scalar_t* bbox_offset = + best_bboxes + ((n * height + h) * width + w) * 5; + scalar_t roi_y = bbox_offset[0] * spatial_scale; + scalar_t roi_x = bbox_offset[1] * spatial_scale; + + scalar_t px[5] = {roi_x, 0, 0, 0, 0}; + scalar_t py[5] = {roi_y, 0, 0, 0, 0}; + + if (points > 1) { + scalar_t roi_w = bbox_offset[2] * spatial_scale; + scalar_t roi_h = bbox_offset[3] * spatial_scale; + scalar_t roi_a = bbox_offset[4]; + + scalar_t w_2 = roi_w / 2, h_2 = roi_h / 2; + scalar_t cosa = cosf(roi_a), sina = sinf(roi_a); + scalar_t wx = cosa * w_2, wy = sina * w_2; + scalar_t hx = -sina * h_2, hy = cosa * h_2; + + px[1] = roi_x + wx + hx; + py[1] = roi_y + wy + hy; + px[2] = roi_x - wx + hx; + py[2] = roi_y - wy + hy; + px[3] = roi_x - wx - hx; + py[3] = roi_y - wy - hy; + px[4] = roi_x + wx - hx; + py[4] = roi_y + wy - hy; + } + + scalar_t* offset_bottom_diff = + bottom_diff + (n * channels + c) * height * width; + scalar_t value_top_diff = top_diff[index]; + + atomicAdd(bottom_diff + index, value_top_diff); + for (int i = 0; i < points; i++) { + scalar_t w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + + bilinear_interpolate_gradient(height, width, py[i], px[i], w1, + w2, w3, w4, x_low, x_high, y_low, + y_high, i); + scalar_t g1 = value_top_diff * w1; + scalar_t g2 = value_top_diff * w2; + scalar_t g3 = value_top_diff * w3; + scalar_t g4 = value_top_diff * w4; + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + atomicAdd(offset_bottom_diff + y_low * width + x_low, g1); + atomicAdd(offset_bottom_diff + y_low * width + x_high, g2); + atomicAdd(offset_bottom_diff + y_high * width + x_low, g3); + atomicAdd(offset_bottom_diff + y_high * width + x_high, g4); + } + } + } +} +#endif // ROTATED_FEATURE_ALIGN_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/scatter_points_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/scatter_points_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..af5b9f67b12060ae5dfa52738dba52c8fe674105 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/scatter_points_cuda_kernel.cuh @@ -0,0 +1,187 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef SCATTER_POINTS_CUDA_KERNEL_CUH +#define SCATTER_POINTS_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +typedef enum { SUM = 0, MEAN = 1, MAX = 2 } reduce_t; +int const maxGridDim = 50000; + +__device__ __forceinline__ static void reduceMax(float *address, float val) { + int *address_as_i = reinterpret_cast(address); + int old = *address_as_i, assumed; + do { + assumed = old; + old = atomicCAS(address_as_i, assumed, + __float_as_int(fmaxf(val, __int_as_float(assumed)))); + } while (assumed != old || __int_as_float(old) < val); +} + +__device__ __forceinline__ static void reduceMax(double *address, double val) { + unsigned long long *address_as_ull = + reinterpret_cast(address); + unsigned long long old = *address_as_ull, assumed; + do { + assumed = old; + old = atomicCAS( + address_as_ull, assumed, + __double_as_longlong(fmax(val, __longlong_as_double(assumed)))); + } while (assumed != old || __longlong_as_double(old) < val); +} + +// get rid of meaningless warnings when compiling host code +#ifdef MMCV_WITH_HIP +__device__ __forceinline__ static void reduceAdd(float *address, float val) { + atomicAdd(address, val); +} +__device__ __forceinline__ static void reduceAdd(double *address, double val) { + atomicAdd(address, val); +} +#else +#ifdef __CUDA_ARCH__ +__device__ __forceinline__ static void reduceAdd(float *address, float val) { +#if (__CUDA_ARCH__ < 200) +#ifdef _MSC_VER +#pragma message( \ + "compute capability lower than 2.x. fall back to use CAS version of atomicAdd for float32") +#else +#warning \ + "compute capability lower than 2.x. fall back to use CAS version of atomicAdd for float32" +#endif + int *address_as_i = reinterpret_cast(address); + int old = *address_as_i, assumed; + do { + assumed = old; + old = atomicCAS(address_as_i, assumed, + __float_as_int(val + __int_as_float(assumed))); + } while (assumed != old); +#else + atomicAdd(address, val); +#endif +} + +__device__ __forceinline__ static void reduceAdd(double *address, double val) { +#if (__CUDA_ARCH__ < 600) +#ifdef _MSC_VER +#pragma message( \ + "compute capability lower than 6.x. fall back to use CAS version of atomicAdd for float64") +#else +#warning \ + "compute capability lower than 6.x. fall back to use CAS version of atomicAdd for float64" +#endif + unsigned long long *address_as_ull = + reinterpret_cast(address); + unsigned long long old = *address_as_ull, assumed; + do { + assumed = old; + old = atomicCAS(address_as_ull, assumed, + __double_as_longlong(val + __longlong_as_double(assumed))); + } while (assumed != old); +#else + atomicAdd(address, val); +#endif +} +#endif // __CUDA_ARCH__ +#endif // MMCV_WITH_HIP + +template +__global__ void feats_reduce_kernel( + const T *feats, const int32_t *coors_map, + T *reduced_feats, // shall be 0 at initialization + const int num_input, const int num_feats, const reduce_t reduce_type) { + CUDA_1D_KERNEL_LOOP(x, num_input) { + int32_t reduce_to = coors_map[x]; + if (reduce_to == -1) continue; + + const T *feats_offset = feats + x * num_feats; + T *reduced_feats_offset = reduced_feats + reduce_to * num_feats; + if (reduce_type == reduce_t::MAX) { + for (int i = 0; i < num_feats; i++) { + reduceMax(&reduced_feats_offset[i], feats_offset[i]); + } + } else { + for (int i = 0; i < num_feats; i++) { + reduceAdd(&reduced_feats_offset[i], feats_offset[i]); + } + } + } +} + +template +__global__ void add_reduce_traceback_grad_kernel( + T *grad_feats, const T *grad_reduced_feats, const int32_t *coors_map, + const int32_t *reduce_count, const int num_input, const int num_feats, + const reduce_t reduce_type) { + CUDA_1D_KERNEL_LOOP(x, num_input) { + int32_t reduce_to = coors_map[x]; + if (reduce_to == -1) { + continue; + } + + const int input_offset = x * num_feats; + T *grad_feats_offset = grad_feats + input_offset; + const int reduced_offset = reduce_to * num_feats; + const T *grad_reduced_feats_offset = grad_reduced_feats + reduced_offset; + + if (reduce_type == reduce_t::SUM) { + for (int i = 0; i < num_feats; i++) { + grad_feats_offset[i] = grad_reduced_feats_offset[i]; + } + } else if (reduce_type == reduce_t::MEAN) { + for (int i = 0; i < num_feats; i++) { + grad_feats_offset[i] = grad_reduced_feats_offset[i] / + static_cast(reduce_count[reduce_to]); + } + } + } +} + +template +__global__ void max_reduce_traceback_scatter_idx_kernel( + const T *feats, const T *reduced_feats, int32_t *reduce_from, + const int32_t *coors_map, const int num_input, const int num_feats) { + CUDA_1D_KERNEL_LOOP(x, num_input) { + int32_t reduce_to = coors_map[x]; + + const int input_offset = x * num_feats; + const T *feats_offset = feats + input_offset; + + if (reduce_to == -1) { + continue; + } + + const int reduced_offset = reduce_to * num_feats; + const T *reduced_feats_offset = reduced_feats + reduced_offset; + int32_t *reduce_from_offset = reduce_from + reduced_offset; + + for (int i = 0; i < num_feats; i++) { + if (feats_offset[i] == reduced_feats_offset[i]) { + atomicMin(&reduce_from_offset[i], static_cast(x)); + } + } + } +} + +template +__global__ void max_reduce_scatter_grad_kernel(T *grad_feats, + const T *grad_reduced_feats, + const int32_t *reduce_from, + const int num_reduced, + const int num_feats) { + CUDA_1D_KERNEL_LOOP(x, num_reduced) { + const int reduced_offset = x * num_feats; + const int32_t *scatter_to_offset = reduce_from + reduced_offset; + const T *grad_reduced_feats_offset = grad_reduced_feats + reduced_offset; + + for (int i = 0; i < num_feats; i++) { + grad_feats[scatter_to_offset[i] * num_feats + i] = + grad_reduced_feats_offset[i]; + } + } +} + +#endif // SCATTER_POINTS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/sigmoid_focal_loss_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/sigmoid_focal_loss_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..1eb5f8fcccbaafdb62972652e3979803c0acd1ca --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/sigmoid_focal_loss_cuda_kernel.cuh @@ -0,0 +1,71 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef SIGMOID_FOCAL_LOSS_CUDA_KERNEL_CUH +#define SIGMOID_FOCAL_LOSS_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void sigmoid_focal_loss_forward_cuda_kernel( + const int nthreads, const T* input, const int64_t* target, const T* weight, + T* output, const T gamma, const T alpha, const int num_classes) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int n = index / num_classes; + int c = index % num_classes; + + int64_t t = target[n]; + T flag_p = (t == c); + T flag_n = (t != c); + + // p = sigmoid(x) = 1. / 1. + expf(-x) + T p = (T)1. / ((T)1. + expf(-input[index])); + + // (1 - p)**gamma * log(p) + T term_p = pow(((T)1. - p), gamma) * log(max(p, (T)FLT_MIN)); + // p**gamma * log(1 - p) + T term_n = pow(p, gamma) * log(max((T)1. - p, (T)FLT_MIN)); + + output[index] = (T)0.; + output[index] += -flag_p * alpha * term_p; + output[index] += -flag_n * ((T)1. - alpha) * term_n; + if (weight != NULL) { + output[index] *= weight[t]; + } + } +} + +template +__global__ void sigmoid_focal_loss_backward_cuda_kernel( + const int nthreads, const T* input, const int64_t* target, const T* weight, + T* grad_input, const T gamma, const T alpha, const int num_classes) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int n = index / num_classes; + int c = index % num_classes; + + int64_t t = target[n]; + T flag_p = (t == c); + T flag_n = (t != c); + + // p = sigmoid(x) = 1. / 1. + expf(-x) + T p = (T)1. / ((T)1. + exp(-input[index])); + + // (1 - p)**gamma * (1 - p - gamma*p*log(p)) + T term_p = pow(((T)1. - p), gamma) * + ((T)1. - p - (gamma * p * log(max(p, (T)FLT_MIN)))); + // p**gamma * (gamma * (1 - p) * log(1 - p) - p) + T term_n = pow(p, gamma) * + (gamma * ((T)1. - p) * log(max((T)1. - p, (T)FLT_MIN)) - p); + + grad_input[index] = (T)0.; + grad_input[index] += -flag_p * alpha * term_p; + grad_input[index] += -flag_n * ((T)1. - alpha) * term_n; + if (weight != NULL) { + grad_input[index] *= weight[t]; + } + } +} + +#endif // SIGMOID_FOCAL_LOSS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/softmax_focal_loss_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/softmax_focal_loss_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..631b2c6175412a9503f6c385ee6597d9527d754f --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/softmax_focal_loss_cuda_kernel.cuh @@ -0,0 +1,72 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef SOFTMAX_FOCAL_LOSS_CUDA_KERNEL_CUH +#define SOFTMAX_FOCAL_LOSS_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void softmax_focal_loss_forward_cuda_kernel( + const int nthreads, const T* softmax, const int64_t* target, + const T* weight, T* output, const T gamma, const T alpha, + const int num_classes) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int64_t label = target[index]; + T pred = softmax[index * num_classes + label]; + + if (label >= 0) { + output[index] = + -alpha * pow((T)1. - pred, gamma) * log(max(pred, (T)FLT_MIN)); + } else { + output[index] = 0; + } + if (weight != NULL) { + output[index] *= weight[label]; + } + } +} + +template +__global__ void softmax_focal_loss_backward_cuda1_kernel( + const int nthreads, const T* softmax, const int64_t* target, + const T* weight, T* buff, const T gamma, const T alpha, + const int num_classes) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int64_t label = target[index]; + T pred = softmax[index * num_classes + label]; + + if (label >= 0) { + buff[index] = alpha * (-pow((T)1. - pred, gamma) + + gamma * pow((T)1. - pred, gamma - 1) * pred * + log(max(pred, (T)FLT_MIN))); + } else { + buff[index] = 0; + } + if (weight != NULL) { + buff[index] *= weight[label]; + } + } +} + +template +__global__ void softmax_focal_loss_backward_cuda2_kernel( + const int nthreads, const T* softmax, const int64_t* target, const T* buff, + T* grad_input, const int num_classes) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int n = index / num_classes; + int c = index % num_classes; + int64_t label = target[n]; + + if (label >= 0) { + T flag = (label == c ? (T)1. : (T)0.); + grad_input[index] = buff[n] * (flag - softmax[index]); + } else { + grad_input[index] = 0; + } + } +} + +#endif // SOFTMAX_FOCAL_LOSS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/spconv/indice.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/spconv/indice.cuh new file mode 100644 index 0000000000000000000000000000000000000000..5ef0009a10f8effeb447e398cff5103b400056de --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/spconv/indice.cuh @@ -0,0 +1,236 @@ +// Copyright 2019 Yan Yan +// +// 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. + +#ifndef INDICE_CU_H_ +#define INDICE_CU_H_ +#include +#include + +#include + +template +__global__ void prepareIndicePairsKernel( + tv::TensorView indicesIn, tv::TensorView indicesOut, + tv::TensorView gridsOut, tv::TensorView indicePairs, + tv::TensorView indiceNum, tv::TensorView indicePairUnique, + const tv::SimpleVector kernelSize, + const tv::SimpleVector stride, + const tv::SimpleVector padding, + const tv::SimpleVector dilation, + const tv::SimpleVector outSpatialShape) { + auto numActIn = indicesIn.dim(0); + Index spatialVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + spatialVolume *= outSpatialShape[i]; + } + Index kernelVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + kernelVolume *= kernelSize[i]; + } + Index numValidPoints = 0; + Index validPoints[KernelMaxVolume * (NDim + 1)]; + Index *pointPtr = nullptr; + auto indicePairsDim2 = indicePairs.dim(2); + Index index; + for (int ix : tv::KernelLoopX(numActIn)) { + numValidPoints = getValidOutPos( + indicesIn.data() + ix * (NDim + 1) + 1, kernelSize.data(), + stride.data(), padding.data(), dilation.data(), outSpatialShape.data(), + validPoints); + for (Index i = 0; i < numValidPoints; ++i) { + pointPtr = validPoints + i * (NDim + 1); + auto offset = pointPtr[NDim]; + auto oldNum = atomicAdd(indiceNum.data() + offset, Index(1)); + indicePairs(offset, 0, oldNum) = ix; + index = tv::rowArrayIdx(pointPtr, outSpatialShape.data()) + + spatialVolume * indicesIn(ix, 0); + indicePairs(offset, 1, oldNum) = index; + indicePairUnique[offset * indicePairsDim2 + oldNum] = index; + } + } +} + +template +__global__ void prepareDeConvIndicePairsKernel( + tv::TensorView indicesIn, tv::TensorView indicesOut, + tv::TensorView gridsOut, tv::TensorView indicePairs, + tv::TensorView indiceNum, tv::TensorView indicePairUnique, + const tv::SimpleVector kernelSize, + const tv::SimpleVector stride, + const tv::SimpleVector padding, + const tv::SimpleVector dilation, + const tv::SimpleVector outSpatialShape) { + auto numActIn = indicesIn.dim(0); + Index spatialVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + spatialVolume *= outSpatialShape[i]; + } + Index kernelVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + kernelVolume *= kernelSize[i]; + } + Index numValidPoints = 0; + Index validPoints[KernelMaxVolume * (NDim + 1)]; + Index *pointPtr = nullptr; + auto indicePairsDim2 = indicePairs.dim(2); + Index index; + for (int ix : tv::KernelLoopX(numActIn)) { + numValidPoints = getValidOutPosTranspose( + indicesIn.data() + ix * (NDim + 1) + 1, kernelSize.data(), + stride.data(), padding.data(), dilation.data(), outSpatialShape.data(), + validPoints); + for (Index i = 0; i < numValidPoints; ++i) { + pointPtr = validPoints + i * (NDim + 1); + auto offset = pointPtr[NDim]; + auto oldNum = atomicAdd(indiceNum.data() + offset, Index(1)); + indicePairs(offset, 0, oldNum) = ix; + index = tv::rowArrayIdx(pointPtr, outSpatialShape.data()) + + spatialVolume * indicesIn(ix, 0); + indicePairs(offset, 1, oldNum) = index; + indicePairUnique[offset * indicePairsDim2 + oldNum] = index; + } + } +} + +template +__global__ void assignGridAndIndiceOutKernel( + tv::TensorView indicesOut, tv::TensorView gridsOut, + int numAct, tv::TensorView indicePairs, + tv::TensorView indicePairUnique, + const tv::SimpleVector outSpatialShape, int batchSize) { + Index index; + auto indicesOutPtr = indicesOut.data(); + for (int ix : tv::KernelLoopX(numAct)) { + index = indicePairUnique[ix]; + gridsOut[index] = ix; + index = tv::rowArrayIdxInv( + index, indicesOutPtr + ix * (NDim + 1) + 1, outSpatialShape.data()); + indicesOut[ix * (NDim + 1)] = index % batchSize; + } +} + +template +__global__ void assignIndicePairsKernel( + tv::TensorView indicesOut, tv::TensorView gridsOut, + int numActIn, tv::TensorView indicePairs, + tv::TensorView indicePairUnique, + const tv::SimpleVector outSpatialShape) { + Index index; + int kernelVolume = indicePairs.dim(0); + for (int ix : tv::KernelLoopX(numActIn)) { + for (int i = 0; i < kernelVolume; ++i) { + index = indicePairs(i, 1, ix); + if (index > -1) { + indicePairs(i, 1, ix) = gridsOut[index]; + } + } + } +} + +template +__global__ void prepareSubMGridKernel( + tv::TensorView indicesIn, tv::TensorView gridsOut, + const tv::SimpleVector outSpatialShape) { + auto numActIn = indicesIn.dim(0); + Index spatialVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + spatialVolume *= outSpatialShape[i]; + } + Index index = 0; + for (int ix : tv::KernelLoopX(numActIn)) { + index = tv::rowArrayIdx(indicesIn.data() + ix * (NDim + 1) + 1, + outSpatialShape.data()) + + spatialVolume * indicesIn(ix, 0); + gridsOut[index] = ix; + } +} + +template +__global__ void getSubMIndicePairsKernel( + tv::TensorView indicesIn, tv::TensorView gridsOut, + tv::TensorView indicePairs, tv::TensorView indiceNum, + const tv::SimpleVector kernelSize, + const tv::SimpleVector stride, + const tv::SimpleVector padding, + const tv::SimpleVector dilation, + const tv::SimpleVector outSpatialShape) { + auto numActIn = indicesIn.dim(0); + Index spatialVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + spatialVolume *= outSpatialShape[i]; + } + Index numValidPoints = 0; + Index validPoints[KernelMaxVolume * (NDim + 1)]; + Index *pointPtr = nullptr; + Index index = 0; + for (int ix : tv::KernelLoopX(numActIn)) { + numValidPoints = getValidOutPos( + indicesIn.data() + ix * (NDim + 1) + 1, kernelSize.data(), + stride.data(), padding.data(), dilation.data(), outSpatialShape.data(), + validPoints); + for (int i = 0; i < numValidPoints; ++i) { + pointPtr = validPoints + i * (NDim + 1); + auto offset = pointPtr[NDim]; + index = tv::rowArrayIdx(pointPtr, outSpatialShape.data()) + + spatialVolume * indicesIn(ix, 0); + if (gridsOut[index] > -1) { + auto oldNum = atomicAdd(indiceNum.data() + offset, Index(1)); + indicePairs(offset, 1, oldNum) = gridsOut[index]; + indicePairs(offset, 0, oldNum) = ix; + } + } + } +} + +template +__global__ void resetGridKernel(const Index *indicePairUnique, + tv::TensorView gridsOut, + int numAct) { + for (int ix : tv::KernelLoopX(numAct)) { + gridsOut[indicePairUnique[ix]] = -1; + } +} + +template +__global__ void resetGridSubMKernel( + const Index *indices, tv::TensorView gridsOut, + const tv::SimpleVector outSpatialShape, int numAct) { + int outSpatialShapeReg[NDim]; + for (int i = 0; i < NDim; ++i) { + outSpatialShapeReg[i] = outSpatialShape[i]; + } + Index spatialVolume = 1; + auto indsPtr = indices; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + spatialVolume *= outSpatialShape[i]; + } + Index index; + for (int ix : tv::KernelLoopX(numAct)) { + indsPtr = indices + ix * (NDim + 1); + index = tv::rowArrayIdx(indsPtr + 1, outSpatialShapeReg); + gridsOut[index + spatialVolume * indsPtr[0]] = -1; + } +} + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/spconv/reordering.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/spconv/reordering.cuh new file mode 100644 index 0000000000000000000000000000000000000000..e3ec68b937b0507e3a119d63a49ad79e8f48eec7 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/spconv/reordering.cuh @@ -0,0 +1,160 @@ +// Copyright 2019 Yan Yan +// +// 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. + +#ifndef REORDERING_CU_H_ +#define REORDERING_CU_H_ +#include + +template +__global__ void gatherGenericKernel(scalar_t *buffer, const scalar_t *features, + const Index *indices, int size, + int numPlanes) { + int ILPStrideX[NumILP]; + Index inds[NumILP]; +#pragma unroll + for (int ilp = 0; ilp < NumILP; ilp++) + ILPStrideX[ilp] = ilp * gridDim.x * blockDim.x; + + for (int ix : tv::KernelLoopX(size)) { +#pragma unroll + for (int ilp = 0; ilp < NumILP; ilp++) { + if (ix + ILPStrideX[ilp] < size) + inds[ilp] = indices[ix + ILPStrideX[ilp]] * numPlanes; + } + for (int iy : tv::KernelLoopY(numPlanes)) { +#pragma unroll + for (int ilp = 0; ilp < NumILP; ++ilp) { + if (ix + ILPStrideX[ilp] < size) + buffer[(ix + ILPStrideX[ilp]) * numPlanes + iy] = + features[inds[ilp] + iy]; + } + } + } +} + +template +__global__ void gatherVecKernel(scalar_t *buffer, const scalar_t *features, + const Index *indices, int size, int numPlanes) { + int ILPStrideX[NumILP]; + Index inds[NumILP]; +#pragma unroll + for (int ilp = 0; ilp < NumILP; ilp++) + ILPStrideX[ilp] = ilp * gridDim.x * blockDim.x; + + for (int ix : tv::KernelLoopX(size)) { +#pragma unroll + for (int ilp = 0; ilp < NumILP; ilp++) { + if (ix + ILPStrideX[ilp] < size) + inds[ilp] = indices[ix + ILPStrideX[ilp]] * numPlanes; + } + for (int iy : tv::KernelLoopY(numPlanes)) { +#pragma unroll + for (int ilp = 0; ilp < NumILP; ++ilp) { + if (ix + ILPStrideX[ilp] < size) + reinterpret_cast( + buffer)[(ix + ILPStrideX[ilp]) * numPlanes + iy] = + reinterpret_cast(features)[inds[ilp] + iy]; + } + } + } +} + +template +__global__ void gatherVecBlockKernel(scalar_t *buffer, const scalar_t *features, + const Index *indices, int size, + int numPlanes) { + int ILPStrideY[NumILP]; +#pragma unroll + for (int ilp = 0; ilp < NumILP; ilp++) + ILPStrideY[ilp] = ilp * gridDim.y * blockDim.y; + features += blockIdx.x * NumTLP; + buffer += blockIdx.x * NumTLP; + + for (int iy : tv::KernelLoopY(size)) { +#pragma unroll + for (int ilp = 0; ilp < NumILP; ++ilp) { + reinterpret_cast( + buffer)[(iy + ILPStrideY[ilp]) * numPlanes + threadIdx.x] = + reinterpret_cast( + features)[indices[iy + ILPStrideY[ilp]] * numPlanes + + threadIdx.x]; + } + } +} + +template +__global__ void scatterAddGenericKernel(scalar_t *outFeatures, + const scalar_t *buffer, + const Index *indices, int size, + int numPlanes) { + int ILPStrideX[NumILP]; + Index inds[NumILP]; +#pragma unroll + for (int ilp = 0; ilp < NumILP; ilp++) + ILPStrideX[ilp] = ilp * gridDim.x * blockDim.x; + for (int ix : tv::KernelLoopX(size)) { +#pragma unroll + for (int ilp = 0; ilp < NumILP; ilp++) { + if (ix + ILPStrideX[ilp] < size) + inds[ilp] = indices[ix + ILPStrideX[ilp]] * numPlanes; + } + for (int iy : tv::KernelLoopY(numPlanes)) { +#pragma unroll + for (int ilp = 0; ilp < NumILP; ++ilp) { + if (ix + ILPStrideX[ilp] < size) { + outFeatures[inds[ilp] + iy] += + buffer[(ix + ILPStrideX[ilp]) * numPlanes + iy]; + } + } + } + } +} + +template +__global__ void scatterAddVecBlockKernel(scalar_t *outFeatures, + const scalar_t *buffer, + const Index *indices, int size, + int numPlanes) { + int ILPStrideY[NumILP]; + constexpr int vecloadFactor = sizeof(VecType) / sizeof(scalar_t); +#pragma unroll + for (int ilp = 0; ilp < NumILP; ilp++) + ILPStrideY[ilp] = ilp * gridDim.y * blockDim.y; + outFeatures += blockIdx.x * NumTLP; + buffer += blockIdx.x * NumTLP; + scalar_t buf[vecloadFactor]; + scalar_t buf2[vecloadFactor]; + Index idx; + for (int iy : tv::KernelLoopY(size)) { +#pragma unroll + for (int ilp = 0; ilp < NumILP; ++ilp) { + idx = indices[iy + ILPStrideY[ilp]] * numPlanes + threadIdx.x; + reinterpret_cast(buf)[0] = + reinterpret_cast(outFeatures)[idx]; + reinterpret_cast(buf2)[0] = reinterpret_cast( + buffer)[(iy + ILPStrideY[ilp]) * numPlanes + threadIdx.x]; +#pragma unroll + for (int i = 0; i < vecloadFactor; i++) { + buf[i] += buf2[i]; + } + reinterpret_cast(outFeatures)[idx] = + reinterpret_cast(buf)[0]; + } + } +} + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/stack_ball_query_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/stack_ball_query_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..06caefa18d47be11b6cb8770ceb8951479add902 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/stack_ball_query_cuda_kernel.cuh @@ -0,0 +1,68 @@ +// Copyright (c) OpenMMLab. All rights reserved +// Modified from +// https://github.com/sshaoshuai/Pointnet2.PyTorch/tree/master/pointnet2/src/ball_query_gpu.cu +#ifndef STACK_BALL_QUERY_CUDA_KERNEL_CUH +#define STACK_BALL_QUERY_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void stack_ball_query_forward_cuda_kernel( + int B, int M, float radius, int nsample, const T *new_xyz, + const int *new_xyz_batch_cnt, const T *xyz, const int *xyz_batch_cnt, + int *idx) { + // :param xyz: (N1 + N2 ..., 3) xyz coordinates of the features + // :param xyz_batch_cnt: (batch_size), [N1, N2, ...] + // :param new_xyz: (M1 + M2 ..., 3) centers of the ball query + // :param new_xyz_batch_cnt: (batch_size), [M1, M2, ...] + // output: + // idx: (M, nsample) + const T *cur_xyz = xyz; + int *cur_idx = idx; + CUDA_1D_KERNEL_LOOP(pt_idx, M) { + int bs_idx = 0; + for (int pt_cnt = 0; bs_idx < B; bs_idx++) { + pt_cnt += new_xyz_batch_cnt[bs_idx]; + if (pt_idx < pt_cnt) break; + } + + int xyz_batch_start_idx = 0; + for (int k = 0; k < bs_idx; k++) xyz_batch_start_idx += xyz_batch_cnt[k]; + + const T *new_xyz_p = new_xyz + pt_idx * 3; + cur_xyz += xyz_batch_start_idx * 3; + cur_idx += pt_idx * nsample; + + float radius2 = radius * radius; + T new_x = new_xyz_p[0]; + T new_y = new_xyz_p[1]; + T new_z = new_xyz_p[2]; + int n = xyz_batch_cnt[bs_idx]; + + int cnt = 0; + for (int k = 0; k < n; ++k) { + T x = cur_xyz[k * 3 + 0]; + T y = cur_xyz[k * 3 + 1]; + T z = cur_xyz[k * 3 + 2]; + T d2 = (new_x - x) * (new_x - x) + (new_y - y) * (new_y - y) + + (new_z - z) * (new_z - z); + if (d2 < radius2) { + if (cnt == 0) { + for (int l = 0; l < nsample; ++l) { + cur_idx[l] = k; + } + } + cur_idx[cnt] = k; + ++cnt; + if (cnt >= nsample) break; + } + } + if (cnt == 0) cur_idx[0] = -1; + } +} + +#endif // STACK_BALL_QUERY_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/stack_group_points_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/stack_group_points_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..4ef3663d05bcd9146e15dd93bb979734538919cb --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/stack_group_points_cuda_kernel.cuh @@ -0,0 +1,97 @@ +// Copyright (c) OpenMMLab. All rights reserved. +// Modified from +// https://github.com/sshaoshuai/Pointnet2.PyTorch/tree/master/pointnet2/src/group_points_gpu.cu +#ifndef STACK_GROUP_POINTS_CUDA_KERNEL_CUH +#define STACK_GROUP_POINTS_CUDA_KERNEL_CUH +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif +#include +template +__global__ void stack_group_points_forward_cuda_kernel( + int b, int c, int m, int nsample, const T *features, + const int *features_batch_cnt, const int *idx, const int *idx_batch_cnt, + T *out) { + // :param features: (N1 + N2 ..., C) tensor of features to group + // :param features_batch_cnt: (batch_size) [N1 + N2 ...] tensor containing the + // indices of features to group with :param idx: (M1 + M2 ..., nsample) tensor + // containing the indices of features to group with :param idx_batch_cnt: + // (batch_size) [M1 + M2 ...] tensor containing the indices of features to + // group with :return: + // output: (M1 + M2, C, nsample) tensor + CUDA_1D_KERNEL_LOOP(index, m * c * nsample) { + const T *cur_features = features; + const int *cur_idx = idx; + int sample_idx = index % nsample; + int c_idx = (index / nsample) % c; + int pt_idx = (index / nsample / c); + + if (pt_idx >= m || c_idx >= c || sample_idx >= nsample) return; + int bs_idx = 0, pt_cnt = idx_batch_cnt[0]; + for (int k = 1; k < b; k++) { + if (pt_idx < pt_cnt) break; + pt_cnt += idx_batch_cnt[k]; + bs_idx = k; + } + + int features_batch_start_idx = 0; + int features_batch_end_idx = features_batch_cnt[0]; + for (int k = 0; k < bs_idx; k++) { + features_batch_start_idx += features_batch_cnt[k]; + features_batch_end_idx = + features_batch_start_idx + features_batch_cnt[k + 1]; + } + cur_features += features_batch_start_idx * c; + + cur_idx += pt_idx * nsample + sample_idx; + int in_idx = cur_idx[0] * c + c_idx; + int out_idx = pt_idx * c * nsample + c_idx * nsample + sample_idx; + if (in_idx < features_batch_end_idx * c) { + out[out_idx] = cur_features[in_idx]; + } + } +} + +template +__global__ void stack_group_points_backward_cuda_kernel( + int b, int c, int m, int n, int nsample, const T *grad_out, const int *idx, + const int *idx_batch_cnt, const int *features_batch_cnt, T *grad_features) { + // :param grad_out: (M1 + M2 ..., C, nsample) tensor of the gradients of the + // output from forward :param idx: (M1 + M2 ..., nsample) tensor containing + // the indices of features to group with :param idx_batch_cnt: (batch_size) + // [M1 + M2 ...] tensor containing the indices of features to group with + // :param features_batch_cnt: (batch_size) [N1 + N2 ...] tensor containing the + // indices of features to group with :return: + // grad_features: (N1 + N2 ..., C) gradient of the features + CUDA_1D_KERNEL_LOOP(index, m * c * nsample) { + const T *cur_grad_out = grad_out; + const int *cur_idx = idx; + T *cur_grad_features = grad_features; + int sample_idx = index % nsample; + int c_idx = (index / nsample) % c; + int pt_idx = (index / nsample / c); + + if (pt_idx >= m || c_idx >= c || sample_idx >= nsample) return; + + int bs_idx = 0, pt_cnt = idx_batch_cnt[0]; + for (int k = 1; k < b; k++) { + if (pt_idx < pt_cnt) break; + pt_cnt += idx_batch_cnt[k]; + bs_idx = k; + } + + int features_batch_start_idx = 0; + for (int k = 0; k < bs_idx; k++) + features_batch_start_idx += features_batch_cnt[k]; + + cur_grad_out += pt_idx * c * nsample + c_idx * nsample + sample_idx; + cur_idx += pt_idx * nsample + sample_idx; + cur_grad_features += (features_batch_start_idx + cur_idx[0]) * c + c_idx; + + atomicAdd(cur_grad_features, cur_grad_out[0]); + } +} + +#endif // GROUP_POINTS_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/sync_bn_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/sync_bn_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..4ec6a466886832d38c72da6e3a3574e72d53cec8 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/sync_bn_cuda_kernel.cuh @@ -0,0 +1,331 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef SYNCBN_CUDA_KERNEL_CUH +#define SYNCBN_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void sync_bn_forward_mean_cuda_kernel(const T *input, float *mean, + int num, int channels, + int spatial) { + __shared__ float buffer[THREADS_PER_BLOCK]; + int tid = threadIdx.x; + int c = blockIdx.x; + buffer[tid] = 0; + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = (i / spatial) * channels * spatial + c * spatial + i % spatial; + buffer[tid] += input[index]; + } + __syncthreads(); + + for (int s = blockDim.x / 2; s > 0; s >>= 1) { + if (tid < s) { + buffer[tid] += buffer[tid + s]; + } + __syncthreads(); + } + int total = num * spatial; + if (tid == 0) { + mean[c] = buffer[0] / total; + } +} + +template <> +__global__ void sync_bn_forward_mean_cuda_kernel(const phalf *input, + float *mean, int num, + int channels, int spatial) { + __shared__ float buffer[THREADS_PER_BLOCK]; + int tid = threadIdx.x; + int c = blockIdx.x; + buffer[tid] = 0; + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = (i / spatial) * channels * spatial + c * spatial + i % spatial; + buffer[tid] += static_cast(input[index]); + } + __syncthreads(); + + for (int s = blockDim.x / 2; s > 0; s >>= 1) { + if (tid < s) { + buffer[tid] += buffer[tid + s]; + } + __syncthreads(); + } + int total = num * spatial; + if (tid == 0) { + mean[c] = buffer[0] / total; + } +} + +template +__global__ void sync_bn_forward_var_cuda_kernel(const T *input, + const float *mean, float *var, + int num, int channels, + int spatial) { + __shared__ float buffer[THREADS_PER_BLOCK]; + int tid = threadIdx.x; + int c = blockIdx.x; + buffer[tid] = 0; + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = (i / spatial) * channels * spatial + c * spatial + i % spatial; + float td = input[index] - mean[c]; + buffer[tid] += td * td; + } + __syncthreads(); + for (int s = blockDim.x / 2; s > 0; s >>= 1) { + if (tid < s) { + buffer[tid] += buffer[tid + s]; + } + __syncthreads(); + } + int total = num * spatial; + if (tid == 0) { + var[c] = buffer[0] / total; + } +} + +template <> +__global__ void sync_bn_forward_var_cuda_kernel(const phalf *input, + const float *mean, float *var, + int num, int channels, + int spatial) { + __shared__ float buffer[THREADS_PER_BLOCK]; + int tid = threadIdx.x; + int c = blockIdx.x; + buffer[tid] = 0; + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = (i / spatial) * channels * spatial + c * spatial + i % spatial; + float td = static_cast(input[index]) - mean[c]; + buffer[tid] += td * td; + } + __syncthreads(); + for (int s = blockDim.x / 2; s > 0; s >>= 1) { + if (tid < s) { + buffer[tid] += buffer[tid + s]; + } + __syncthreads(); + } + int total = num * spatial; + if (tid == 0) { + var[c] = buffer[0] / total; + } +} + +template +__global__ void sync_bn_forward_output_cuda_kernel( + const T *input, const float *mean, const float *var, float *running_mean, + float *running_var, const float *weight, const float *bias, float *norm, + float *std, T *output, int num, int channels, int spatial, float eps, + float momentum, int group_size) { + int tid = threadIdx.x; + int c = blockIdx.x; + float mean_value = mean[c]; + float std_value = sqrt(var[c] + eps); + + if (weight != nullptr) { + float weight_value = weight[c]; + float bias_value = bias[c]; + if (norm != nullptr) { + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = + (i / spatial) * channels * spatial + c * spatial + i % spatial; + norm[index] = (input[index] - mean_value) / std_value; + output[index] = norm[index] * weight_value + bias_value; + } + } else { + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = + (i / spatial) * channels * spatial + c * spatial + i % spatial; + output[index] = + (input[index] - mean_value) / std_value * weight_value + bias_value; + } + } + } else { + if (norm != nullptr) { + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = + (i / spatial) * channels * spatial + c * spatial + i % spatial; + output[index] = norm[index] = (input[index] - mean_value) / std_value; + } + } else { + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = + (i / spatial) * channels * spatial + c * spatial + i % spatial; + output[index] = (input[index] - mean_value) / std_value; + } + } + } + if (tid == 0) { + if (std != nullptr) std[c] = std_value; + if (running_mean != nullptr) { + running_mean[c] = + momentum * mean_value + (1 - momentum) * running_mean[c]; + int count = num * spatial * group_size; + float var_unbias = count > 1 ? var[c] * count / (count - 1) : var[c]; + running_var[c] = momentum * var_unbias + (1 - momentum) * running_var[c]; + } + } +} + +template <> +__global__ void sync_bn_forward_output_cuda_kernel( + const phalf *input, const float *mean, const float *var, + float *running_mean, float *running_var, const float *weight, + const float *bias, float *norm, float *std, phalf *output, int num, + int channels, int spatial, float eps, float momentum, int group_size) { + int tid = threadIdx.x; + int c = blockIdx.x; + float mean_value = mean[c]; + float std_value = sqrt(var[c] + eps); + if (weight != nullptr) { + float weight_value = weight[c]; + float bias_value = bias[c]; + if (norm != nullptr) { + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = + (i / spatial) * channels * spatial + c * spatial + i % spatial; + norm[index] = + (static_cast(input[index]) - mean_value) / std_value; + output[index] = + static_cast(norm[index] * weight_value + bias_value); + } + } else { + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = + (i / spatial) * channels * spatial + c * spatial + i % spatial; + output[index] = + static_cast((static_cast(input[index]) - mean_value) / + std_value * weight_value + + bias_value); + } + } + } else { + if (norm != nullptr) { + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = + (i / spatial) * channels * spatial + c * spatial + i % spatial; + norm[index] = + (static_cast(input[index]) - mean_value) / std_value; + output[index] = static_cast(norm[index]); + } + } else { + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = + (i / spatial) * channels * spatial + c * spatial + i % spatial; + output[index] = static_cast( + (static_cast(input[index]) - mean_value) / std_value); + } + } + } + if (tid == 0) { + if (std != nullptr) std[c] = std_value; + if (running_mean != nullptr) { + running_mean[c] = + momentum * mean_value + (1 - momentum) * running_mean[c]; + int count = num * spatial * group_size; + float var_unbias = count > 1 ? var[c] * count / (count - 1) : var[c]; + running_var[c] = momentum * var_unbias + (1 - momentum) * running_var[c]; + } + } +} + +template +__global__ void sync_bn_backward_param_cuda_kernel(const T *grad_output, + const float *norm, + float *grad_weight, + float *grad_bias, int num, + int channels, int spatial) { + __shared__ float buffer1[THREADS_PER_BLOCK]; + __shared__ float buffer2[THREADS_PER_BLOCK]; + + int tid = threadIdx.x; + int c = blockIdx.x; + buffer1[tid] = buffer2[tid] = 0; + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = (i / spatial) * channels * spatial + c * spatial + i % spatial; + buffer1[tid] += grad_output[index] * norm[index]; + buffer2[tid] += grad_output[index]; + } + __syncthreads(); + + for (int s = blockDim.x / 2; s > 0; s >>= 1) { + if (tid < s) { + buffer1[tid] += buffer1[tid + s]; + buffer2[tid] += buffer2[tid + s]; + } + __syncthreads(); + } + if (tid == 0) { + grad_weight[c] = buffer1[0]; + grad_bias[c] = buffer2[0]; + } +} + +template <> +__global__ void sync_bn_backward_param_cuda_kernel(const phalf *grad_output, + const float *norm, + float *grad_weight, + float *grad_bias, int num, + int channels, int spatial) { + __shared__ float buffer1[THREADS_PER_BLOCK]; + __shared__ float buffer2[THREADS_PER_BLOCK]; + + int tid = threadIdx.x; + int c = blockIdx.x; + buffer1[tid] = buffer2[tid] = 0; + for (int i = tid; i < num * spatial; i += blockDim.x) { + int index = (i / spatial) * channels * spatial + c * spatial + i % spatial; + buffer1[tid] += static_cast(grad_output[index]) * norm[index]; + buffer2[tid] += static_cast(grad_output[index]); + } + __syncthreads(); + + for (int s = blockDim.x / 2; s > 0; s >>= 1) { + if (tid < s) { + buffer1[tid] += buffer1[tid + s]; + buffer2[tid] += buffer2[tid + s]; + } + __syncthreads(); + } + if (tid == 0) { + grad_weight[c] = buffer1[0]; + grad_bias[c] = buffer2[0]; + } +} + +template +__global__ void sync_bn_backward_data_cuda_kernel( + int output_size, const T *grad_output, const float *weight, + const float *grad_weight, const float *grad_bias, const float *norm, + const float *std, T *grad_input, int num, int channels, int spatial) { + int factor = num * spatial; + CUDA_1D_KERNEL_LOOP(index, output_size) { + int c = (index / spatial) % channels; + grad_input[index] = + weight[c] * + (grad_output[index] - + (grad_weight[c] * norm[index] + grad_bias[c]) / factor) / + std[c]; + } +} + +template <> +__global__ void sync_bn_backward_data_cuda_kernel( + int output_size, const phalf *grad_output, const float *weight, + const float *grad_weight, const float *grad_bias, const float *norm, + const float *std, phalf *grad_input, int num, int channels, int spatial) { + int factor = num * spatial; + CUDA_1D_KERNEL_LOOP(index, output_size) { + int c = (index / spatial) % channels; + grad_input[index] = static_cast( + weight[c] * + (static_cast(grad_output[index]) - + (grad_weight[c] * norm[index] + grad_bias[c]) / factor) / + std[c]); + } +} + +#endif // SYNCBN_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/three_interpolate_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/three_interpolate_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..971b496e589d2210131351305cbaf0ed1a027cb1 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/three_interpolate_cuda_kernel.cuh @@ -0,0 +1,61 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef THREE_INTERPOLATE_CUDA_KERNEL_CUH +#define THREE_INTERPOLATE_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void three_interpolate_forward_cuda_kernel( + int b, int c, int m, int n, const T *points, const int *__restrict__ idx, + const T *weight, T *out) { + // points: (B, C, M) + // idx: (B, N, 3) + // weight: (B, N, 3) + // output: + // out: (B, C, N) + + int bs_idx = blockIdx.z; + int c_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, n) { + if (bs_idx >= b || c_idx >= c) return; + + weight += bs_idx * n * 3 + pt_idx * 3; + points += bs_idx * c * m + c_idx * m; + idx += bs_idx * n * 3 + pt_idx * 3; + out += bs_idx * c * n + c_idx * n; + + out[pt_idx] = weight[0] * points[idx[0]] + weight[1] * points[idx[1]] + + weight[2] * points[idx[2]]; + } +} + +template +__global__ void three_interpolate_backward_cuda_kernel( + int b, int c, int n, int m, const T *grad_out, const int *__restrict__ idx, + const T *weight, T *grad_points) { + // grad_out: (B, C, N) + // weight: (B, N, 3) + // output: + // grad_points: (B, C, M) + + int bs_idx = blockIdx.z; + int c_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, n) { + if (bs_idx >= b || c_idx >= c) return; + + grad_out += bs_idx * c * n + c_idx * n + pt_idx; + weight += bs_idx * n * 3 + pt_idx * 3; + grad_points += bs_idx * c * m + c_idx * m; + idx += bs_idx * n * 3 + pt_idx * 3; + + atomicAdd(grad_points + idx[0], grad_out[0] * weight[0]); + atomicAdd(grad_points + idx[1], grad_out[0] * weight[1]); + atomicAdd(grad_points + idx[2], grad_out[0] * weight[2]); + } +} + +#endif // THREE_INTERPOLATE_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/three_nn_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/three_nn_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..15434121b94033afb2fcb9945a83db15b92262d4 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/three_nn_cuda_kernel.cuh @@ -0,0 +1,67 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef THREE_NN_CUDA_KERNEL_CUH +#define THREE_NN_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void three_nn_forward_cuda_kernel(int b, int n, int m, + const T *unknown, const T *known, + T *dist2, int *__restrict__ idx) { + // unknown: (B, N, 3) + // known: (B, M, 3) + // output: + // dist2: (B, N, 3) + // idx: (B, N, 3) + + int bs_idx = blockIdx.y; + CUDA_1D_KERNEL_LOOP(pt_idx, n) { + if (bs_idx >= b) return; + + unknown += bs_idx * n * 3 + pt_idx * 3; + known += bs_idx * m * 3; + dist2 += bs_idx * n * 3 + pt_idx * 3; + idx += bs_idx * n * 3 + pt_idx * 3; + + T ux = unknown[0]; + T uy = unknown[1]; + T uz = unknown[2]; + + double best1 = 1e40, best2 = 1e40, best3 = 1e40; + int besti1 = 0, besti2 = 0, besti3 = 0; + for (int k = 0; k < m; ++k) { + T x = known[k * 3 + 0]; + T y = known[k * 3 + 1]; + T z = known[k * 3 + 2]; + T d = (ux - x) * (ux - x) + (uy - y) * (uy - y) + (uz - z) * (uz - z); + if (d < best1) { + best3 = best2; + besti3 = besti2; + best2 = best1; + besti2 = besti1; + best1 = d; + besti1 = k; + } else if (d < best2) { + best3 = best2; + besti3 = besti2; + best2 = d; + besti2 = k; + } else if (d < best3) { + best3 = d; + besti3 = k; + } + } + dist2[0] = best1; + dist2[1] = best2; + dist2[2] = best3; + idx[0] = besti1; + idx[1] = besti2; + idx[2] = besti3; + } +} + +#endif // THREE_NN_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/tin_shift_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/tin_shift_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..4d1159a515f4de2666c25ba4bd5e4f2cbbca1e10 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/tin_shift_cuda_kernel.cuh @@ -0,0 +1,61 @@ +// Copyright (c) OpenMMLab. All rights reserved +#ifndef TIN_SHIFT_CUDA_KERNEL_CUH +#define TIN_SHIFT_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +template +__global__ void tin_shift_forward_cuda_kernel( + const int nthreads, const T* input, const int* shift, T* output, + const int batch_size, const int channels, const int t_size, + const int hw_size, const int group_size, const int group_channel) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + const int hw_index = index % hw_size; + const int j = (index / hw_size) % channels; + + const int n_index = (index / hw_size / channels) % batch_size; + int group_id = j / group_channel; + int t_shift = shift[n_index * group_size + group_id]; + int offset = n_index * t_size * hw_size * channels + hw_size * j + hw_index; + for (int i = 0; i < t_size; i++) { + int now_t = i + t_shift; + int data_id = i * hw_size * channels + offset; + if (now_t < 0 || now_t >= t_size) { + continue; + } + int out_id = now_t * hw_size * channels + offset; + output[out_id] = input[data_id]; + } + } +} + +template +__global__ void tin_shift_backward_cuda_kernel( + const int nthreads, const T* input, const int* shift, T* output, + const int batch_size, const int channels, const int t_size, + const int hw_size, const int group_size, const int group_channel) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + const int hw_index = index % hw_size; + const int j = (index / hw_size) % channels; + + const int n_index = (index / hw_size / channels) % batch_size; + int group_id = j / group_channel; + int t_shift = shift[n_index * group_size + group_id]; + int offset = n_index * t_size * hw_size * channels + hw_size * j + hw_index; + for (int i = 0; i < t_size; i++) { + int now_t = i + t_shift; + int data_id = i * hw_size * channels + offset; + if (now_t < 0 || now_t >= t_size) { + continue; + } + int out_id = now_t * hw_size * channels + offset; + output[out_id] = input[data_id]; + } + } +} + +#endif // TIN_SHIFT_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/voxelization_cuda_kernel.cuh b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/voxelization_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..021b488d8d716c9e8132173bf04491d42b7b6fa2 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/cuda/voxelization_cuda_kernel.cuh @@ -0,0 +1,216 @@ +// Copyright (c) OpenMMLab. All rights reserved. +#ifndef VOXELIZATION_CUDA_KERNEL_CUH +#define VOXELIZATION_CUDA_KERNEL_CUH + +#ifdef MMCV_USE_PARROTS +#include "parrots_cuda_helper.hpp" +#else +#include "pytorch_cuda_helper.hpp" +#endif + +typedef enum { SUM = 0, MEAN = 1, MAX = 2 } reduce_t; + +template +__global__ void dynamic_voxelize_kernel( + const T* points, T_int* coors, const float voxel_x, const float voxel_y, + const float voxel_z, const float coors_x_min, const float coors_y_min, + const float coors_z_min, const float coors_x_max, const float coors_y_max, + const float coors_z_max, const int grid_x, const int grid_y, + const int grid_z, const int num_points, const int num_features, + const int NDim) { + // const int index = blockIdx.x * threadsPerBlock + threadIdx.x; + CUDA_1D_KERNEL_LOOP(index, num_points) { + // To save some computation + auto points_offset = points + index * num_features; + auto coors_offset = coors + index * NDim; + int c_x = floorf((points_offset[0] - coors_x_min) / voxel_x); + if (c_x < 0 || c_x >= grid_x) { + coors_offset[0] = -1; + continue; + } + + int c_y = floorf((points_offset[1] - coors_y_min) / voxel_y); + if (c_y < 0 || c_y >= grid_y) { + coors_offset[0] = -1; + coors_offset[1] = -1; + continue; + } + + int c_z = floorf((points_offset[2] - coors_z_min) / voxel_z); + if (c_z < 0 || c_z >= grid_z) { + coors_offset[0] = -1; + coors_offset[1] = -1; + coors_offset[2] = -1; + } else { + coors_offset[0] = c_z; + coors_offset[1] = c_y; + coors_offset[2] = c_x; + } + } +} + +template +__global__ void assign_point_to_voxel(const int nthreads, const T* points, + T_int* point_to_voxelidx, + T_int* coor_to_voxelidx, T* voxels, + const int max_points, + const int num_features, + const int num_points, const int NDim) { + CUDA_1D_KERNEL_LOOP(thread_idx, nthreads) { + // const int index = blockIdx.x * threadsPerBlock + threadIdx.x; + int index = thread_idx / num_features; + + int num = point_to_voxelidx[index]; + int voxelidx = coor_to_voxelidx[index]; + if (num > -1 && voxelidx > -1) { + auto voxels_offset = + voxels + voxelidx * max_points * num_features + num * num_features; + + int k = thread_idx % num_features; + voxels_offset[k] = points[thread_idx]; + } + } +} + +template +__global__ void assign_voxel_coors(const int nthreads, T_int* coor, + T_int* point_to_voxelidx, + T_int* coor_to_voxelidx, T_int* voxel_coors, + const int num_points, const int NDim) { + CUDA_1D_KERNEL_LOOP(thread_idx, nthreads) { + // const int index = blockIdx.x * threadsPerBlock + threadIdx.x; + // if (index >= num_points) return; + int index = thread_idx / NDim; + int num = point_to_voxelidx[index]; + int voxelidx = coor_to_voxelidx[index]; + if (num == 0 && voxelidx > -1) { + auto coors_offset = voxel_coors + voxelidx * NDim; + int k = thread_idx % NDim; + coors_offset[k] = coor[thread_idx]; + } + } +} + +template +__global__ void point_to_voxelidx_kernel(const T_int* coor, + T_int* point_to_voxelidx, + T_int* point_to_pointidx, + const int max_points, + const int max_voxels, + const int num_points, const int NDim) { + CUDA_1D_KERNEL_LOOP(index, num_points) { + auto coor_offset = coor + index * NDim; + // skip invalid points + if (coor_offset[0] == -1) continue; + + int num = 0; + int coor_x = coor_offset[0]; + int coor_y = coor_offset[1]; + int coor_z = coor_offset[2]; + // only calculate the coors before this coor[index] + for (int i = 0; i < index; ++i) { + auto prev_coor = coor + i * NDim; + if (prev_coor[0] == -1) continue; + + // Find all previous points that have the same coors + // if find the same coor, record it + if ((prev_coor[0] == coor_x) && (prev_coor[1] == coor_y) && + (prev_coor[2] == coor_z)) { + num++; + if (num == 1) { + // point to the same coor that first show up + point_to_pointidx[index] = i; + } else if (num >= max_points) { + // out of boundary + break; + } + } + } + if (num == 0) { + point_to_pointidx[index] = index; + } + if (num < max_points) { + point_to_voxelidx[index] = num; + } + } +} + +template +__global__ void determin_voxel_num( + // const T_int* coor, + T_int* num_points_per_voxel, T_int* point_to_voxelidx, + T_int* point_to_pointidx, T_int* coor_to_voxelidx, T_int* voxel_num, + const int max_points, const int max_voxels, const int num_points) { + // only calculate the coors before this coor[index] + for (int i = 0; i < num_points; ++i) { + int point_pos_in_voxel = point_to_voxelidx[i]; + // record voxel + if (point_pos_in_voxel == -1) { + // out of max_points or invalid point + continue; + } else if (point_pos_in_voxel == 0) { + // record new voxel + int voxelidx = voxel_num[0]; + if (voxel_num[0] >= max_voxels) continue; + voxel_num[0] += 1; + coor_to_voxelidx[i] = voxelidx; + num_points_per_voxel[voxelidx] = 1; + } else { + int point_idx = point_to_pointidx[i]; + int voxelidx = coor_to_voxelidx[point_idx]; + if (voxelidx != -1) { + coor_to_voxelidx[i] = voxelidx; + num_points_per_voxel[voxelidx] += 1; + } + } + } +} + +__global__ void nondeterministic_get_assign_pos( + const int nthreads, const int32_t* coors_map, int32_t* pts_id, + int32_t* coors_count, int32_t* reduce_count, int32_t* coors_order) { + CUDA_1D_KERNEL_LOOP(thread_idx, nthreads) { + int coors_idx = coors_map[thread_idx]; + if (coors_idx > -1) { + int32_t coors_pts_pos = atomicAdd(&reduce_count[coors_idx], 1); + pts_id[thread_idx] = coors_pts_pos; + if (coors_pts_pos == 0) { + coors_order[coors_idx] = atomicAdd(coors_count, 1); + } + } + } +} + +template +__global__ void nondeterministic_assign_point_voxel( + const int nthreads, const T* points, const int32_t* coors_map, + const int32_t* pts_id, const int32_t* coors_in, const int32_t* reduce_count, + const int32_t* coors_order, T* voxels, int32_t* coors, int32_t* pts_count, + const int max_voxels, const int max_points, const int num_features, + const int NDim) { + CUDA_1D_KERNEL_LOOP(thread_idx, nthreads) { + int coors_idx = coors_map[thread_idx]; + int coors_pts_pos = pts_id[thread_idx]; + if (coors_idx > -1 && coors_pts_pos < max_points) { + int coors_pos = coors_order[coors_idx]; + if (coors_pos < max_voxels) { + auto voxels_offset = + voxels + (coors_pos * max_points + coors_pts_pos) * num_features; + auto points_offset = points + thread_idx * num_features; + for (int k = 0; k < num_features; k++) { + voxels_offset[k] = points_offset[k]; + } + if (coors_pts_pos == 0) { + pts_count[coors_pos] = min(reduce_count[coors_idx], max_points); + auto coors_offset = coors + coors_pos * NDim; + auto coors_in_offset = coors_in + coors_idx * NDim; + for (int k = 0; k < NDim; k++) { + coors_offset[k] = coors_in_offset[k]; + } + } + } + } + } +} + +#endif // VOXELIZATION_CUDA_KERNEL_CUH diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/bbox_overlaps_mlu_kernel.mlu b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/bbox_overlaps_mlu_kernel.mlu new file mode 100644 index 0000000000000000000000000000000000000000..0f273d2508d58aa26fa22f86180c843fc3bca90a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/bbox_overlaps_mlu_kernel.mlu @@ -0,0 +1,322 @@ +/************************************************************************* + * Copyright (C) 2021 Cambricon. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *************************************************************************/ +#include + +#include "common_mlu_helper.hpp" + +#define COORD_NUM 4 + +__nram__ char nmem_buf[MAX_NRAM_SIZE]; + +template +__mlu_func__ void computeDiv(void *nram_dst, void *nram_src0, void *nram_src1, + void *nram_addition, const int32_t deal_num) { + __bang_active_reciphp((T *)nram_dst, (T *)nram_src1, deal_num); + __bang_mul((T *)nram_dst, (T *)nram_src0, (T *)nram_dst, deal_num); +} + +template <> +__mlu_func__ void computeDiv(void *nram_dst, void *nram_src0, + void *nram_src1, void *nram_addition, + const int32_t deal_num) { + __bang_half2float((float *)nram_addition, (half *)nram_src1, deal_num); + __bang_active_reciphp((float *)nram_addition, (float *)nram_addition, + deal_num); + __bang_float2half_rd((half *)nram_src1, (float *)nram_addition, deal_num); + __bang_mul((half *)nram_dst, (half *)nram_src0, (half *)nram_src1, deal_num); +} + +template +__mlu_func__ void bboxOverlapsWorkflow( + T *vec_b1_x1, T *vec_b1_y1, T *vec_b1_x2, T *vec_b1_y2, T *vec_b2_x1, + T *vec_b2_y1, T *vec_b2_x2, T *vec_b2_y2, T *vec_left, T *vec_right, + T *vec_top, T *vec_bottom, const T *bbox1, const T *bbox2, void *ious, + const int32_t offset, const int32_t mode, const int32_t batches_stride, + const int32_t num_bbox1, const int32_t num_bbox2, const bool aligned) { + int32_t task_batch_stride = (num_bbox1 + taskDim - 1) / taskDim; + int32_t batch_start = taskId * task_batch_stride; + int32_t batch_per_task = batch_start + task_batch_stride < num_bbox1 + ? task_batch_stride + : num_bbox1 - batch_start; + batch_per_task = batch_per_task > 0 ? batch_per_task : (0); + + if (aligned) { + int32_t num_loop_cpy = batch_per_task / batches_stride; + int32_t num_rem_cpy_batches = batch_per_task % batches_stride; + num_loop_cpy = num_rem_cpy_batches > 0 ? num_loop_cpy + 1 : num_loop_cpy; + for (int32_t i = 0; i < num_loop_cpy; i++) { + int32_t index = batch_start + i * batches_stride; + int32_t handle_batches = index + batches_stride > num_bbox1 + ? num_rem_cpy_batches + : batches_stride; + int32_t b1 = index; + int32_t b2 = index; + + int32_t base1 = b1 * COORD_NUM; + __memcpy(vec_b1_x1, &bbox1[base1], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + __memcpy(vec_b1_y1, &bbox1[base1 + 1], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + __memcpy(vec_b1_x2, &bbox1[base1 + 2], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + __memcpy(vec_b1_y2, &bbox1[base1 + 3], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + + int32_t base2 = b2 * COORD_NUM; + __memcpy(vec_b2_x1, &bbox2[base2], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + __memcpy(vec_b2_y1, &bbox2[base2 + 1], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + __memcpy(vec_b2_x2, &bbox2[base2 + 2], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + __memcpy(vec_b2_y2, &bbox2[base2 + 3], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + // get the width and height + __bang_maxequal(vec_left, vec_b1_x1, vec_b2_x1, batches_stride); + __bang_minequal(vec_right, vec_b1_x2, vec_b2_x2, batches_stride); + __bang_maxequal(vec_top, vec_b1_y1, vec_b2_y1, batches_stride); + __bang_minequal(vec_bottom, vec_b1_y2, vec_b2_y2, batches_stride); + + // right - left + offset ---> left + __bang_sub(vec_left, vec_right, vec_left, batches_stride); + __bang_add_scalar(vec_left, vec_left, (T)offset, batches_stride); + + // bottom - top + offset ---> right + __bang_sub(vec_right, vec_bottom, vec_top, batches_stride); + __bang_add_scalar(vec_right, vec_right, (T)offset, batches_stride); + + // zero vector ---> bottom + __bang_write_value(vec_bottom, batches_stride, 0.f); + + // width --> vec_left + __bang_maxequal(vec_left, vec_bottom, vec_left, batches_stride); + T *width = vec_left; + // height --> vec_right + __bang_maxequal(vec_right, vec_bottom, vec_right, batches_stride); + T *height = vec_right; + + // get the b1_area + // (b1_x2 - b1_x1 + offset) ---> vec_top + __bang_sub(vec_top, vec_b1_x2, vec_b1_x1, batches_stride); + __bang_add_scalar(vec_top, vec_top, (T)offset, batches_stride); + + // (b1_y2 - b1_y1 + offset) ---> vec_bottom + __bang_sub(vec_bottom, vec_b1_y2, vec_b1_y1, batches_stride); + __bang_add_scalar(vec_bottom, vec_bottom, (T)offset, batches_stride); + + // b1_area = (b1_x2 - b1_x1 + offset) * (b1_y2 - b1_y1 + offset) + // ---> vec_top; + __bang_mul(vec_top, vec_top, vec_bottom, batches_stride); + T *b1_area = vec_top; + + // get the b2_area + // (b2_x2 - b2_x1 + offset) ---> b2_x1 + __bang_sub(vec_b2_x1, vec_b2_x2, vec_b2_x1, batches_stride); + __bang_add_scalar(vec_b2_x1, vec_b2_x1, (T)offset, batches_stride); + + // (b2_y2 - b2_y1 + offset) ---> b2_y1 + __bang_sub(vec_b2_y1, vec_b2_y2, vec_b2_y1, batches_stride); + __bang_add_scalar(vec_b2_y1, vec_b2_y1, (T)offset, batches_stride); + + // b2_area = (b2_x2 - b2_x1 + offset) * (b2_y2 - b2_y1 + offset) + // ---> b2_x1; + __bang_mul(vec_b2_x1, vec_b2_x1, vec_b2_y1, batches_stride); + T *b2_area = vec_b2_x1; + + // inter_s = width * height + __bang_mul(height, width, height, batches_stride); + T *inter_s = height; + + // offset vector ---> vec_b2_y1 + __bang_write_value(vec_b2_y1, batches_stride, T(offset)); + T *vec_offset = vec_b2_y1; + + if (mode == 0) { + __bang_add(b1_area, b1_area, b2_area, batches_stride); + __bang_sub(b1_area, b1_area, inter_s, batches_stride); + __bang_maxequal(b1_area, vec_offset, b1_area, batches_stride); + } else { + __bang_maxequal(b1_area, vec_offset, b1_area, batches_stride); + } + T *base_s = b1_area; + + // ious = inter_s / base_s + computeDiv(width, inter_s, base_s, vec_b2_x2, batches_stride); + __memcpy((T *)ious + index, width, handle_batches * sizeof(T), + NRAM2GDRAM); + } + } else { + int32_t num_loop_cpy = num_bbox2 / batches_stride; + int32_t num_rem_cpy_batches = num_bbox2 % batches_stride; + num_loop_cpy = num_rem_cpy_batches > 0 ? num_loop_cpy + 1 : num_loop_cpy; + for (int32_t i = 0; i < batch_per_task; i++) { + int32_t index1 = batch_start + i; + int32_t b1 = index1; + int32_t base1 = b1 * COORD_NUM; + + // set bbox1 and bbox2 to nram + __bang_write_value(vec_b1_x1, batches_stride, bbox1[base1]); + __bang_write_value(vec_b1_y1, batches_stride, bbox1[base1 + 1]); + __bang_write_value(vec_b1_x2, batches_stride, bbox1[base1 + 2]); + __bang_write_value(vec_b1_y2, batches_stride, bbox1[base1 + 3]); + + for (int32_t j = 0; j < num_loop_cpy; j++) { + int32_t index2 = j * batches_stride; + int32_t handle_batches = index2 + batches_stride > num_bbox2 + ? num_rem_cpy_batches + : batches_stride; + int32_t b2 = index2; + int32_t base2 = b2 * COORD_NUM; + + // copy bbox2 to nram + __memcpy(vec_b2_x1, &bbox2[base2], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + __memcpy(vec_b2_y1, &bbox2[base2 + 1], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + __memcpy(vec_b2_x2, &bbox2[base2 + 2], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + __memcpy(vec_b2_y2, &bbox2[base2 + 3], sizeof(T), GDRAM2NRAM, sizeof(T), + COORD_NUM * sizeof(T), handle_batches - 1); + + // get the width and height + __bang_maxequal(vec_left, vec_b1_x1, vec_b2_x1, batches_stride); + __bang_minequal(vec_right, vec_b1_x2, vec_b2_x2, batches_stride); + __bang_maxequal(vec_top, vec_b1_y1, vec_b2_y1, batches_stride); + __bang_minequal(vec_bottom, vec_b1_y2, vec_b2_y2, batches_stride); + + // right - left + offset ---> left + __bang_sub(vec_left, vec_right, vec_left, batches_stride); + __bang_add_scalar(vec_left, vec_left, (T)offset, batches_stride); + // bottom - top + offset ---> right + __bang_sub(vec_right, vec_bottom, vec_top, batches_stride); + __bang_add_scalar(vec_right, vec_right, (T)offset, batches_stride); + + // zero vector ---> bottom + __bang_write_value(vec_bottom, batches_stride, (T)0); + + // width --> vec_left + __bang_maxequal(vec_left, vec_bottom, vec_left, batches_stride); + T *width = vec_left; + // height --> vec_right + __bang_maxequal(vec_right, vec_bottom, vec_right, batches_stride); + T *height = vec_right; + + // get the b1_area + // (b1_x2 - b1_x1 + offset) ---> vec_top + __bang_sub(vec_top, vec_b1_x2, vec_b1_x1, batches_stride); + __bang_add_scalar(vec_top, vec_top, (T)offset, batches_stride); + // (b1_y2 - b1_y1 + offset) ---> vec_bottom + __bang_sub(vec_bottom, vec_b1_y2, vec_b1_y1, batches_stride); + __bang_add_scalar(vec_bottom, vec_bottom, (T)offset, batches_stride); + // b1_area = (b1_x2 - b1_x1 + offset) * (b1_y2 - b1_y1 + offset) + // ---> vec_top; + __bang_mul(vec_top, vec_top, vec_bottom, batches_stride); + T *b1_area = vec_top; + + // get the b2_area + // (b2_x2 - b2_x1 + offset) ---> b2_x1 + __bang_sub(vec_b2_x1, vec_b2_x2, vec_b2_x1, batches_stride); + __bang_add_scalar(vec_b2_x1, vec_b2_x1, (T)offset, batches_stride); + // (b2_y2 - b2_y1 + offset) ---> b2_y1 + __bang_sub(vec_b2_y1, vec_b2_y2, vec_b2_y1, batches_stride); + __bang_add_scalar(vec_b2_y1, vec_b2_y1, (T)offset, batches_stride); + // b2_area = (b2_x2 - b2_x1 + offset) * (b2_y2 - b2_y1 + offset) + // ---> b2_x1; + __bang_mul(vec_b2_x1, vec_b2_x1, vec_b2_y1, batches_stride); + T *b2_area = vec_b2_x1; + + // inter_s = width * height + __bang_mul(height, width, height, batches_stride); + T *inter_s = height; + + // offset vector ---> vec_b2_y1 + __bang_write_value(vec_b2_y1, batches_stride, T(offset)); + T *vec_offset = vec_b2_y1; + + if (mode == 0) { + __bang_add(b1_area, b1_area, b2_area, batches_stride); + __bang_sub(b1_area, b1_area, inter_s, batches_stride); + __bang_maxequal(b1_area, vec_offset, b1_area, batches_stride); + } else { + __bang_maxequal(b1_area, vec_offset, b1_area, batches_stride); + } + T *base_s = b1_area; + + // ious = inter_s / base_s + computeDiv(width, inter_s, base_s, vec_b2_x2, batches_stride); + int32_t gdram_offset = index1 * num_bbox2 + index2; + __memcpy((T *)ious + gdram_offset, width, handle_batches * sizeof(T), + NRAM2GDRAM); + } + } + } +} + +template +__mlu_global__ void MLUUnion1KernelBBoxOverlaps( + const void *bbox1, const void *bbox2, void *ious, const int32_t num_bbox1, + const int32_t num_bbox2, const int32_t mode, const bool aligned, + const int32_t offset) { + /* + * NRAM partition + * |-------------------------------------------------------------| + * | vec_b1_x1 | vec_b1_y1 | vec_b1_x2 | vec_b1_y2 | + * |-------------------------------------------------------------| + * | vec_b2_x1 | vec_b2_y1 | vec_b2_x2 | vec_b2_y2 | + * |-------------------------------------------------------------| + * | vec_left | vec_right | vec_top | vec_bottom | + * |-------------------------------------------------------------| + * + */ + const int32_t align_bytes = PAD_DOWN(MAX_NRAM_SIZE, NFU_ALIGN_SIZE); + const int32_t split_nram_num = 12; + const int32_t nram_stride = + align_bytes / NFU_ALIGN_SIZE / split_nram_num * NFU_ALIGN_SIZE; + + void *vec_b1_x1 = nmem_buf; + void *vec_b1_y1 = nmem_buf + nram_stride; + void *vec_b1_x2 = nmem_buf + 2 * nram_stride; + void *vec_b1_y2 = nmem_buf + 3 * nram_stride; + + void *vec_b2_x1 = nmem_buf + 4 * nram_stride; + void *vec_b2_y1 = nmem_buf + 5 * nram_stride; + void *vec_b2_x2 = nmem_buf + 6 * nram_stride; + void *vec_b2_y2 = nmem_buf + 7 * nram_stride; + + void *vec_left = nmem_buf + 8 * nram_stride; + void *vec_right = nmem_buf + 9 * nram_stride; + void *vec_top = nmem_buf + 10 * nram_stride; + void *vec_bottom = nmem_buf + 11 * nram_stride; + + const int32_t vec_length = nram_stride / sizeof(T); + bboxOverlapsWorkflow((T *)vec_b1_x1, (T *)vec_b1_y1, (T *)vec_b1_x2, + (T *)vec_b1_y2, (T *)vec_b2_x1, (T *)vec_b2_y1, + (T *)vec_b2_x2, (T *)vec_b2_y2, (T *)vec_left, + (T *)vec_right, (T *)vec_top, (T *)vec_bottom, + (T *)bbox1, (T *)bbox2, (T *)ious, offset, mode, + vec_length, num_bbox1, num_bbox2, aligned); +} + +void KernelBBoxOverlaps(cnrtDim3_t k_dim, cnrtFunctionType_t k_type, + cnrtQueue_t queue, const cnrtDataType_t d_type, + const void *bbox1, const void *bbox2, void *ious, + const int32_t num_bbox1, const int32_t num_bbox2, + const int32_t mode, const bool aligned, + const int32_t offset) { + if (d_type == CNRT_FLOAT16) { + MLUUnion1KernelBBoxOverlaps<<>>( + bbox1, bbox2, ious, num_bbox1, num_bbox2, mode, aligned, offset); + } else { + MLUUnion1KernelBBoxOverlaps<<>>( + bbox1, bbox2, ious, num_bbox1, num_bbox2, mode, aligned, offset); + } +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/common_mlu_helper.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/common_mlu_helper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..852737224183c1852f1394903e1106219d9ad40e --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/common_mlu_helper.hpp @@ -0,0 +1,256 @@ +/************************************************************************* + * Copyright (C) 2021 Cambricon. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *************************************************************************/ +#ifndef COMMON_MLU_HELPER_HPP_ +#define COMMON_MLU_HELPER_HPP_ + +#define NFU_ALIGN_SIZE 128 // Byte +#define REM_FOR_STACK (128 * 1024) // 128KB reserved for cncc + +#ifdef __BANG_ARCH__ +#define MAX_NRAM_SIZE \ + (__MLU_NRAM_SIZE__ * 1024 - REM_FOR_STACK) // 128KB reserved for cncc +#define MAX_SRAM_SIZE \ + (__MLU_SRAM_SIZE__ * 1024 - REM_FOR_STACK) // 128KB reserved for cncc +#else +#define MAX_NRAM_SIZE (384 * 1024) // 384KB, initialization value +#define MAX_SRAM_SIZE (1920 * 1024) // 1920KB, initialization value +#endif + +#ifndef PAD_UP +#define PAD_UP(x, y) (((x) / (y) + (int)((x) % (y) > 0)) * (y)) +#endif + +#ifndef PAD_DOWN +#define PAD_DOWN(x, y) (((x) / (y)) * (y)) +#endif + +#define CEIL_ALIGN(x, y) (((x) + (y)-1) / (y) * (y)) + +template +__mlu_func__ inline scalar_t min(scalar_t a, scalar_t b) { + return a < b ? a : b; +} + +template +__mlu_func__ inline scalar_t max(scalar_t a, scalar_t b) { + return a > b ? a : b; +} + +/*! + * @brief Converts int32 to float32 data type. + * + * @param[out] dst + * Pointer to NRAM that stores int32 type data. + * @param[in,out] dst_addition + * Pointer to NRAM as the workspace of dst, which has the same size as dst. + * It allows empty pointer on MLU300 series. + * @param[in] src + * Pointer to NRAM that stores float32 type data. + * @param[in,out] src_addition + * Pointer to NRAM as the workspace of src, which has a size of 128 Bytes. + * It allows empty pointer on MLU300 series. + * @param[in] src_count + * The count of elements in src. + */ +__mlu_func__ void convertInt2Float(float *dst, float *dst_addition, int *src, + float *src_addition, const int src_count) { +#if __BANG_ARCH__ >= 300 + __bang_int2float((float *)dst, (int32_t *)src, src_count, 0); +#else + // get sign bit + const float move_23bit = 8388608.0; + // 0x80000000 = 1,000000000,0000000000000000000000000000 + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0x80000000); + __bang_cycle_band((char *)dst_addition, (char *)src, (char *)src_addition, + src_count * sizeof(float), NFU_ALIGN_SIZE); + // get 1 or 0 from sign bit + // judg is Odd + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0x00000001); + __bang_cycle_bor((char *)dst_addition, (char *)dst_addition, + (char *)src_addition, src_count * sizeof(float), + NFU_ALIGN_SIZE); + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0x80000001); + __bang_cycle_eq(dst_addition, dst_addition, src_addition, src_count, + NFU_ALIGN_SIZE / sizeof(float)); + // minus xor, positive num invariant + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0xffffffff); + __bang_cycle_mul(dst, dst_addition, src_addition, src_count, + NFU_ALIGN_SIZE / sizeof(float)); + __bang_bxor((char *)dst, (char *)src, (char *)dst, src_count * sizeof(float)); + // convert int32 to float32 + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0x7fffff); + __bang_cycle_band((char *)dst, (char *)dst, (char *)src_addition, + src_count * sizeof(float), NFU_ALIGN_SIZE); + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0x4b000000); + __bang_cycle_bor((char *)dst, (char *)dst, (char *)src_addition, + src_count * sizeof(float), NFU_ALIGN_SIZE); + __bang_sub_scalar(dst, dst, move_23bit, src_count); + // add one + __bang_add(dst, dst, dst_addition, src_count); + // set sign for float32 + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0xffffffff); + __bang_cycle_mul(dst_addition, dst_addition, src_addition, src_count, + NFU_ALIGN_SIZE / sizeof(float)); + + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0x00000001); + __bang_cycle_add(dst_addition, dst_addition, src_addition, src_count, + NFU_ALIGN_SIZE / sizeof(float)); + + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0x80000000); + __bang_cycle_band((char *)dst_addition, (char *)dst_addition, + (char *)src_addition, src_count * 4, 128); + __bang_bor((char *)dst, (char *)dst, (char *)dst_addition, src_count * 4); +#endif // __BANG_ARCH__ >= 300 +} + +/*! + * @brief Converts float32 to int32 data type with to_zero round mode. + * + * @param[out] dst + * Pointer to NRAM that stores float32 type data. + * @param[in,out] dst_addition + * Pointer to NRAM as the workspace of dst, which has the same size as dst. + * It allows empty pointer on MLU300 series. + * @param[in] src + * Pointer to NRAM that stores int32 type data. + * @param[in,out] src_addition + * Pointer to NRAM as the workspace of src, which has a size of 128 Bytes. + * It allows empty pointer on MLU300 series. + * @param[in] src_count + * The count of elements in src. + */ +__mlu_func__ void convertFloat2Int(int *dst, float *dst_addition, float *src, + float *src_addition, const int src_count) { +#if __BANG_ARCH__ >= 300 + __bang_float2int_tz((int32_t *)dst, (float *)src, src_count, 0); +#else + // sign ===> src_addition + // dst=-1.0 : when src[i] is a negative number + // dst=+1.0 : when src[i] is a positive number + const int floatDchar = sizeof(float) / sizeof(char); + __bang_active_sign((float *)dst, src, src_count); + // dst_addition = abs(src) + __bang_mul(dst_addition, src, (float *)dst, src_count); + // if dst_addition < 1.0 , then src_addition + 1, to fix add error. + __bang_write_value((float *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 1.0f); + __bang_cycle_lt(dst_addition, dst_addition, (float *)src_addition, src_count, + NFU_ALIGN_SIZE / sizeof(float)); + __bang_add_tz((float *)dst, (float *)dst, (float *)dst_addition, src_count); + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 0xbf800000); + // set negative flag -1.0 = 0xbf80000 + __bang_cycle_eq( + (float *)dst, (float *)dst, (float *)src_addition, src_count, + NFU_ALIGN_SIZE / sizeof(float)); // to mark all src in [x<-1.0] + __bang_active_abs(dst_addition, src, src_count); + __bang_write_value((float *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + 8388608.0f); + // mask shift move 23 + __bang_cycle_add_tz( + dst_addition, dst_addition, src_addition, src_count, + NFU_ALIGN_SIZE / sizeof(float)); // right shift move 23bit + // two`s complement for negatibe + // dst=1.0 , when src <-1.0 + // dst=0.0 , when src >=-1.0 + __bang_sub(dst_addition, dst_addition, (float *)dst, src_count); + // to fix max value + // 0 1001 0110 111 1111 1111 1111 1111 1111 <=> 0xcb7fffff <=> 16777215.0, + // means max value. + __bang_mul_scalar((float *)dst, (float *)dst, 16777215.0, src_count); + __bang_bxor((char *)dst_addition, (char *)dst_addition, (char *)dst, + src_count * floatDchar); + // get low 23bit + __bang_write_value((unsigned *)src_addition, NFU_ALIGN_SIZE / sizeof(float), + (unsigned)0x007fffff); + // mask low 23bit is 1 + __bang_cycle_band((char *)dst_addition, (char *)dst_addition, + (char *)src_addition, src_count * floatDchar, + NFU_ALIGN_SIZE / sizeof(char)); + // set 9 high bit ===> dst + // -2.0 <=> 0xc0000000 <=> 1100 0000 0000 0000 0000 0000 0000 0000 + // 1.0 <=> 0x3f800000 <=> 0011 1111 1000 0000 0000 0000 0000 0000 + __bang_write_value(src_addition, NFU_ALIGN_SIZE / sizeof(float), 0x3f800000); + __bang_cycle_and((float *)dst, (float *)dst, src_addition, src_count, + NFU_ALIGN_SIZE / sizeof(float)); + // src or dst_addition + __bang_bor((char *)dst_addition, (char *)dst, (char *)dst_addition, + src_count * floatDchar); + __bang_mul_scalar((float *)dst, (float *)dst, -2.0, src_count); + __bang_bor((char *)dst, (char *)dst, (char *)dst_addition, + src_count * floatDchar); +#endif // __BANG_ARCH__ >= 300 +} + +/*! + * @brief Converts float32 to half data type, + * the rounding mode on MLU200 is rd, on MLU300 is rn. + * + * @param[out] dst + * Pointer to NRAM that stores half type data. + * @param[in] src + * Pointer to NRAM that stores float32 type data. + * @param[in] src_count + * The count of elements in src. + */ +__mlu_func__ inline void convertFloat2half(half *dst, float *src, + int src_count) { +#if __BANG_ARCH__ >= 300 + __bang_float2half_rn(dst, src, src_count); +#else + __bang_float2half_rd(dst, src, src_count); +#endif +} + +/*! + * @brief recursiveSumPool. + * @param[in,out] dst + * Pointer to NRAM that stores the input and output data. + * @param[in] low_dim + * Which is the number of low dim. + * @param[in] high_dim + * Which is the number of high dim. + * @param[in] kernel_limit + * Which is the high_dim of sumpool per time. + ******************************************************************************/ +template +__mlu_func__ void recursiveSumPool(T *dst, int low_dim, int high_dim, + int kernel_limit) { + for (; high_dim > 1;) { + int repeat_s = high_dim / kernel_limit; + int remain_s = high_dim % kernel_limit; + + if (remain_s) { + __bang_sumpool((T *)dst, (T *)dst, low_dim, 1, remain_s, 1, remain_s, 1, + 1); + } + if (repeat_s) { + __bang_sumpool((T *)dst + (remain_s > 0 ? low_dim : 0), + (T *)dst + remain_s * low_dim, low_dim, + kernel_limit * repeat_s, 1, kernel_limit, 1, 1, + kernel_limit); + } + high_dim = repeat_s + (bool)remain_s; + } + return; +} + +#endif // COMMON_MLU_HELPER_HPP_ diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/focal_loss_sigmoid_mlu_kernel.mlu b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/focal_loss_sigmoid_mlu_kernel.mlu new file mode 100644 index 0000000000000000000000000000000000000000..7624379b68d6df41aae0253df26b9add61c7a76e --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/focal_loss_sigmoid_mlu_kernel.mlu @@ -0,0 +1,888 @@ +/************************************************************************* + * Copyright (C) 2021 Cambricon. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *************************************************************************/ +#include + +#include "common_mlu_helper.hpp" + +#define PING 0 +#define PONG 1 + +__nram__ char nram_buffer[MAX_NRAM_SIZE]; + +namespace forward { +template +__mlu_func__ void loadInput(char *nram_input, T *dram_input, const int32_t size, + const int32_t dst_stride = 0, + const int32_t src_stride = 0, + const int32_t count = 1) { + if (dst_stride == src_stride) { + __memcpy_async(nram_input, dram_input, size * count, GDRAM2NRAM); + } else { + __memcpy_async(nram_input, dram_input, size, GDRAM2NRAM, dst_stride, + src_stride, count - 1); + } +} + +template +__mlu_func__ void loadWeight(char *nram_input, T *dram_input, const int32_t t, + const int32_t c, const int32_t has_weight, + const int32_t partition_nc) { + if (has_weight && partition_nc && t >= 0 && t < c) { + __memcpy_async(nram_input, (T *)dram_input + t, sizeof(T), GDRAM2NRAM); + } +} + +template +__mlu_func__ void storeOutput(T *dram_output, char *nram_output, + const int32_t size, const int32_t dst_stride = 0, + const int32_t src_stride = 0, + const int32_t count = 1) { + if (dst_stride == src_stride) { + __memcpy_async(dram_output, nram_output, size * count, NRAM2GDRAM); + } else { + __memcpy_async(dram_output, nram_output, size, NRAM2GDRAM, dst_stride, + src_stride, count - 1); + } +} + +template +__mlu_func__ void compute(T *input, const int32_t *target, const T *weight, + const int32_t has_weight, const int32_t partition_nc, + const int32_t deal_num, const int32_t n_seg, + const int32_t c, const int32_t c_seg, + const int32_t c_start_index, const float alpha, + const float gamma, T *compute_a, T *compute_b, + T *output) { + // set params + const int32_t c_num = + has_weight ? PAD_UP(c_seg, NFU_ALIGN_SIZE / sizeof(T)) : c_seg; + const int32_t c_end_index = c_start_index + c_seg; + const int32_t half_epsilon = 0x0400; + const T epsilon_f = + sizeof(T) == sizeof(float) ? FLT_MIN : *((half *)&half_epsilon); + + // 0. alpha_t * p_t^r = alpha * (1 - p) ^ gamma if t == c_i + // = (1 - alpha) * p ^ gamma if t != c_i + __nramset((T *)output, deal_num, (T)(1 - alpha)); + __bang_active_sigmoid((T *)compute_b, (T *)input, deal_num); + for (int32_t i = 0; i < n_seg; ++i) { + const int32_t t = *((uint32_t *)target + i); + if (t >= c_start_index && t < c_end_index) { + const uint32_t index = i * c_num + t - c_start_index; + *((T *)input + index) = -1.0 * (*((T *)input + index)); + *((T *)compute_b + index) = 1.0 - (*((T *)compute_b + index)) + epsilon_f; + *((T *)output + index) = alpha; + } + } + if (sizeof(T) == sizeof(half)) { + __bang_half2float((float *)compute_a, (half *)compute_b, deal_num); + __bang_active_loghp((float *)compute_a, (float *)compute_a, deal_num); + __bang_mul_const((float *)compute_a, (float *)compute_a, (float)gamma, + deal_num); + __bang_active_exphp((float *)compute_a, (float *)compute_a, deal_num); + __bang_float2half_rd((half *)compute_a, (float *)compute_a, deal_num); + } else { + __bang_active_loghp((T *)compute_a, (T *)compute_b, deal_num); + __bang_mul_const((T *)compute_a, (T *)compute_a, (T)gamma, deal_num); + __bang_active_exphp((T *)compute_a, (T *)compute_a, deal_num); + } + __bang_mul((T *)output, (T *)compute_a, (T *)output, deal_num); + + // 1. max = max(0, -x) if t == c_i + // = max(0, x) if t != c_i + __nramset((T *)compute_b, deal_num, (T)0); + __bang_maxequal((T *)compute_b, (T *)compute_b, (T *)input, deal_num); + + // 2. -log(p_t) = ln(e^(-max)+ e^(-max-x) + max if t == c_i + // = ln(e^(-max)+ e^(-max+x) + max if t != c_i + __bang_mul_const((T *)compute_a, (T *)compute_b, (T)-1.0, deal_num); + __bang_add((T *)input, (T *)compute_a, (T *)input, deal_num); + + __bang_active_exphp((T *)compute_a, (T *)compute_a, deal_num); + __bang_active_exphp((T *)input, (T *)input, deal_num); + __bang_add((T *)compute_a, (T *)compute_a, (T *)input, deal_num); + __bang_active_loghp((T *)compute_a, (T *)compute_a, deal_num); + __bang_add((T *)input, (T *)compute_a, (T *)compute_b, deal_num); + + // 3. output = alpha_t * p_t^r * [-log(p_t)] + __bang_mul((T *)output, (T *)output, (T *)input, deal_num); + + // 4. with weight + if (has_weight) { + for (int32_t i = 0; i < n_seg; ++i) { + int32_t t = *((int32_t *)target + i); + if (t >= 0 && t < c) { + t = partition_nc ? 0 : t; + __bang_mul_const((T *)output + i * c_num, (T *)output + i * c_num, + *((T *)weight + t), c_num); + } + } + } +} + +template +__mlu_func__ void startPipeline( + const T *input, const int32_t *target, const T *weight, + char *nram_compute_a, char *nram_compute_b, char *nram_input, + char *nram_target, char *nram_weight, char *nram_output, + const int32_t has_weight, const int32_t partition_nc, + const int32_t pingpong_offset, const int32_t pingpong_weight_offset, + const int32_t c_offset_num, const int32_t n, const int32_t n_seg, + const int32_t c, const int32_t c_seg, const float alpha, const float gamma, + T *output) { + // with offset + input = (T *)((char *)input + c_offset_num * sizeof(T)); + output = (T *)((char *)output + c_offset_num * sizeof(T)); + + const int32_t c_seg_align_num = PAD_UP(c_seg, NFU_ALIGN_SIZE / sizeof(T)); + const int32_t c_num = has_weight ? c_seg_align_num : c_seg; + const int32_t deal_num = PAD_UP(n_seg * c_num, NFU_ALIGN_SIZE / sizeof(T)); + const int32_t load_size = c_seg * sizeof(T); + const int32_t dram_stride = c * sizeof(T); + const int32_t nram_stride = c_num * sizeof(T); + + if (has_weight && !partition_nc) { + loadInput(nram_weight, (T *)weight, load_size, nram_stride, dram_stride, + 1); + __asm__ volatile("sync;\n\t"); + } + const int32_t repeat = n / n_seg; + const int32_t remain = n % n_seg; + + /* + * Pipeline: The pipeline is processed in three stages: Load, Compute, Store. + * The allocated memory space of NRAM is divided into two parts: + * PING and Pong. In a single time slice, PING is used to process + * IO stream and PONG is used for computation. Both of them are + * processed synchronously until finished. + * + * diagram of PINGPONG: + * |------|-----------------------------------------------------------------| + * | | space | + * |------|-----------------------------------------------------------------| + * | time | Ping | Pong | Ping | Pong | Ping | Pong | + * |------|-----------------------------------------------------------------| + * | 0 | L0 | | | | | | + * | 1 | C0 | L1 | | | | | + * | 2 | S0 | C1 | L2 | | | | + * | 3 | | S1 | C2 | L3 | | | + * | 4 | | | S2 | C3 | L4 | | + * | 5 | | | | S3 | C4 | L5 | + * | 6 | | | | | S4 | C5 | + * | 7 | | | | | | S5 | + * |------|-----------------------------------------------------------------| + */ + + // diagram of PINGPONG: L0 + if (repeat > 0) { + loadInput(nram_input, (T *)input, load_size, nram_stride, dram_stride, + n_seg); + loadInput(nram_target, (int32_t *)target, n_seg * sizeof(int32_t)); + loadWeight(nram_weight, (T *)weight, *((int32_t *)target), c, has_weight, + partition_nc); + __asm__ volatile("sync;\n\t"); + } + + // diagram of PINGPONG: C0 and L1 + if (repeat > 1) { + compute((T *)nram_input, (int32_t *)nram_target, (T *)nram_weight, + has_weight, partition_nc, deal_num, n_seg, c, c_seg, c_offset_num, + alpha, gamma, (T *)nram_compute_a, (T *)nram_compute_b, + (T *)nram_output); + loadInput((char *)nram_input + pingpong_offset, (T *)input + c * n_seg, + load_size, nram_stride, dram_stride, n_seg); + loadInput((char *)nram_target + pingpong_offset, + (int32_t *)target + n_seg, n_seg * sizeof(int32_t)); + loadWeight((char *)nram_weight + pingpong_weight_offset, (T *)weight, + *((int32_t *)target + n_seg), c, has_weight, partition_nc); + __asm__ volatile("sync;\n\t"); + } + + for (int32_t i = 0; i < repeat - 2; ++i) { + storeOutput((T *)output + i * c * n_seg, + nram_output + (i % 2) * pingpong_offset, load_size, + dram_stride, nram_stride, n_seg); + loadInput((char *)nram_input + (i % 2) * pingpong_offset, + (T *)(input) + (i + 2) * c * n_seg, load_size, nram_stride, + dram_stride, n_seg); + loadInput((char *)nram_target + (i % 2) * pingpong_offset, + (int32_t *)target + (i + 2) * n_seg, + n_seg * sizeof(int32_t)); + loadWeight((char *)nram_weight + (i % 2) * pingpong_weight_offset, + (T *)weight, *((int32_t *)target + (i + 2) * n_seg), c, + has_weight, partition_nc); + compute((T *)(nram_input + ((i + 1) % 2) * pingpong_offset), + (int32_t *)(nram_target + ((i + 1) % 2) * pingpong_offset), + (T *)(nram_weight + + partition_nc * ((i + 1) % 2) * pingpong_weight_offset), + has_weight, partition_nc, deal_num, n_seg, c, c_seg, c_offset_num, + alpha, gamma, (T *)nram_compute_a, (T *)nram_compute_b, + (T *)(nram_output + ((i + 1) % 2) * pingpong_offset)); + __asm__ volatile("sync;\n\t"); + } + + if (repeat > 1) { + storeOutput((T *)output + (repeat - 2) * c * n_seg, + (char *)nram_output + (repeat % 2) * pingpong_offset, + load_size, dram_stride, nram_stride, n_seg); + } + + if (remain > 0) { + loadInput((char *)nram_input + (repeat % 2) * pingpong_offset, + (T *)input + repeat * c * n_seg, load_size, nram_stride, + dram_stride, remain); + loadInput((char *)nram_target + (repeat % 2) * pingpong_offset, + (int32_t *)target + repeat * n_seg, + remain * sizeof(int32_t)); + loadWeight((char *)nram_weight + (repeat % 2) * pingpong_weight_offset, + (T *)weight, *((int32_t *)target + repeat * n_seg), c, + has_weight, partition_nc); + } + + if (repeat > 0) { + compute((T *)(nram_input + ((repeat - 1) % 2) * pingpong_offset), + (int32_t *)(nram_target + ((repeat - 1) % 2) * pingpong_offset), + (T *)(nram_weight + + partition_nc * ((repeat - 1) % 2) * pingpong_weight_offset), + has_weight, partition_nc, deal_num, n_seg, c, c_seg, c_offset_num, + alpha, gamma, (T *)nram_compute_a, (T *)nram_compute_b, + (T *)(nram_output + ((repeat - 1) % 2) * pingpong_offset)); + } + __asm__ volatile("sync;\n\t"); + + if (repeat > 0) { + storeOutput((T *)output + (repeat - 1) * c * n_seg, + (char *)nram_output + ((repeat - 1) % 2) * pingpong_offset, + load_size, dram_stride, nram_stride, n_seg); + } + + if (remain > 0) { + int32_t rem_num = PAD_UP(remain * c_num, NFU_ALIGN_SIZE / sizeof(T)); + compute((T *)(nram_input + (repeat % 2) * pingpong_offset), + (int32_t *)(nram_target + (repeat % 2) * pingpong_offset), + (T *)(nram_weight + + partition_nc * (repeat % 2) * pingpong_weight_offset), + has_weight, partition_nc, rem_num, remain, c, c_seg, c_offset_num, + alpha, gamma, (T *)nram_compute_a, (T *)nram_compute_b, + (T *)(nram_output + (repeat % 2) * pingpong_offset)); + __asm__ volatile("sync;\n\t"); + + storeOutput((T *)output + repeat * c * n_seg, + (char *)nram_output + (repeat % 2) * pingpong_offset, + load_size, dram_stride, nram_stride, remain); + } + __asm__ volatile("sync;\n\t"); +} + +template +__mlu_func__ void focalLossSigmoidForwardBlock( + const T *input, const int32_t *target, const T *weight, const int32_t n, + const int32_t c, const float alpha, const float gamma, T *output) { + /* + * NRAM partition + * |-----------------------------------------------------------------------| + * | weight | + * |------------------------------- COMPUTE -------------------------------| + * | | | + * | computeA | computeB | + * | | | + * |------------- PING ------------------------------- PONG ---------------| + * | | | + * | input | input | + * | | | + * |-----------------------------------|-----------------------------------| + * | | | + * | output | output | + * | | | + * |-----------------------------------|-----------------------------------| + * | target | target | + * |-----------------------------------|-----------------------------------| + * + * split_pipeline_num is 6: COMPUTE(computeA,computeB), PING(input,output), + * PONG(input,output). + * split_target_num is 2: PING(target), PONG(target). + * weight is not NULL: + * The nram-size of weight is equal to c_align_size when partition input-N. + * The nram-size of weight is equal to NFU_ALIGN_SIZE when partition + * input-NC. + */ + + // calculate threshold of c + const int32_t split_pipeline_num = 6; + const int32_t split_target_num = 2; + const int32_t has_weight = weight != NULL; + const int32_t threshold_c = + PAD_DOWN((MAX_NRAM_SIZE - split_target_num * sizeof(int32_t)) / + (split_pipeline_num + has_weight), + NFU_ALIGN_SIZE) / + sizeof(T); + const int32_t c_align = PAD_UP(c, NFU_ALIGN_SIZE / sizeof(T)); + const int32_t c_align_size = c_align * sizeof(T); + + if (c <= threshold_c) { + // partition inputN + int32_t c_num = c; + int32_t reservered_align_size = + (split_target_num + split_pipeline_num) * NFU_ALIGN_SIZE; + int32_t weight_size = 0; + if (has_weight) { + c_num = c_align; + reservered_align_size = split_target_num * NFU_ALIGN_SIZE; + weight_size = c_align_size; + } + + const int32_t remain_size = + MAX_NRAM_SIZE - weight_size - reservered_align_size; + const int32_t n_seg = + remain_size / (split_pipeline_num * c_num * sizeof(T) + + split_target_num * sizeof(int32_t)); + const int32_t split_pipeline_size = + PAD_UP(c_num * n_seg * sizeof(T), NFU_ALIGN_SIZE); + const int32_t compute_size = 2 * split_pipeline_size; + const int32_t pingpong_offset = (MAX_NRAM_SIZE - weight_size - compute_size) / 2; + + char *nram_weight = (char *)nram_buffer; + char *nram_compute_a = nram_weight + has_weight * c_align_size; + char *nram_compute_b = nram_compute_a + split_pipeline_size; + char *nram_input = nram_compute_b + split_pipeline_size; + char *nram_output = nram_input + split_pipeline_size; + char *nram_target = nram_output + split_pipeline_size; + + startPipeline(input, target, weight, nram_compute_a, nram_compute_b, + nram_input, nram_target, nram_weight, nram_output, + has_weight, 0, pingpong_offset, 0, 0, n, n_seg, c, c, + alpha, gamma, output); + } else { + // partition inputNC + const int32_t weight_size = has_weight * NFU_ALIGN_SIZE; + const int32_t remain_size = MAX_NRAM_SIZE - weight_size; + const int32_t split_pipeline_size = PAD_DOWN( + (remain_size - split_target_num * NFU_ALIGN_SIZE) / split_pipeline_num, + NFU_ALIGN_SIZE); + const int32_t c_seg = split_pipeline_size / sizeof(T); + const int32_t n_seg = 1; + const int32_t compute_size = 2 * split_pipeline_size; + const int32_t pingpong_offset = (MAX_NRAM_SIZE - weight_size - compute_size) / 2; + const int32_t pingpong_weight_offset = weight_size / 2; + + char *nram_weight = (char *)nram_buffer; + char *nram_compute_a = nram_weight + weight_size; + char *nram_compute_b = nram_compute_a + split_pipeline_size; + char *nram_input = nram_compute_b + split_pipeline_size; + char *nram_output = nram_input + split_pipeline_size; + char *nram_target = nram_output + split_pipeline_size; + + const int32_t loop_num = (c + c_seg - 1) / c_seg; + const int32_t partition_nc = 1; + for (int32_t i = 0; i < loop_num; ++i) { + const int32_t c_index = i * c_seg; + const int32_t c_seg_curr = i == (loop_num - 1) ? c - c_index : c_seg; + startPipeline(input, target, weight, nram_compute_a, nram_compute_b, + nram_input, nram_target, nram_weight, nram_output, + has_weight, partition_nc, pingpong_offset, + pingpong_weight_offset, c_index, n, n_seg, c, c_seg_curr, + alpha, gamma, output); + } + } +} + +template +__mlu_global__ void MLUUnion1KernelFocalLossSigmoidForward( + const void *input, const void *target, const void *weight, const int32_t N, + const int32_t C, const float alpha, const float gamma, void *output) { + const int32_t n_seg = N / taskDim + (taskId == taskDim - 1) * (N % taskDim); + const T *input_offset = (T *)input + N / taskDim * taskId * C; + const int32_t *target_offset = (int32_t *)target + N / taskDim * taskId; + T *output_offset = (T *)output + N / taskDim * taskId * C; + + focalLossSigmoidForwardBlock((T *)input_offset, (int32_t *)target_offset, + (T *)weight, n_seg, C, alpha, gamma, + (T *)output_offset); +} +} // namespace forward + +namespace backward { +template +__mlu_func__ void loadInput(char *nram_input, char *nram_target, + const T *gdram_input, const int32_t *gdram_target, + const int32_t deal_n, const int32_t total_c, + const bool pingping_flag, const bool has_weight, + const int32_t nram_offset, + const int32_t gdram_offset) { + if (pingping_flag == PONG) { + nram_input += nram_offset; + nram_target += nram_offset; + } + + __memcpy_async(nram_target, gdram_target + gdram_offset / total_c, + deal_n * sizeof(int32_t), GDRAM2NRAM); + + char *nram_input_load = nram_input; + int32_t compute_align_size = 2 * NFU_ALIGN_SIZE; + if (has_weight) { + if (sizeof(T) == sizeof(half)) { + int32_t compute_align_num = compute_align_size / sizeof(float); + int32_t align_c = PAD_UP(total_c, compute_align_num); + int32_t compute_size = deal_n * align_c * sizeof(float); + nram_input_load += compute_size / 2; + } + int32_t align_c = PAD_UP(total_c, NFU_ALIGN_SIZE / sizeof(T)); + int32_t total_c_size = total_c * sizeof(T); + int32_t align_c_size = align_c * sizeof(T); + __memcpy_async(nram_input_load, gdram_input + gdram_offset, total_c_size, + GDRAM2NRAM, align_c_size, total_c_size, deal_n - 1); + } else { + if (sizeof(T) == sizeof(half)) { + int32_t compute_size = + PAD_UP(deal_n * total_c * sizeof(float), compute_align_size); + nram_input_load += compute_size / 2; + } + int32_t load_size = deal_n * total_c * sizeof(T); + __memcpy_async(nram_input_load, gdram_input + gdram_offset, load_size, + GDRAM2NRAM); + } +} + +template +__mlu_func__ void sigmoid(T *dst_data, const T *src_data, + const int32_t elem_count) { + __bang_mul_const(dst_data, (T *)src_data, T(-1), elem_count); + __bang_active_exphp(dst_data, dst_data, elem_count); + __bang_add_const(dst_data, dst_data, T(1), elem_count); + __bang_active_reciphp(dst_data, dst_data, elem_count); +} + +template +__mlu_func__ void coreCompute(char *nram_input, const T *nram_weight, + const float *nram_flt_min, char *nram_pt, + char *nram_alpha_t, char *nram_temp, + char *nram_target, const float *nram_gamma, + char *nram_output, const float alpha, + const int32_t compute_num, const int32_t deal_n, + const int32_t total_c, const bool pingpong_flag, + const int32_t nram_offset, + const bool has_weight) { + if (pingpong_flag == PONG) { + nram_input += nram_offset; + nram_pt += nram_offset; + nram_alpha_t += nram_offset; + nram_temp += nram_offset; + nram_output += nram_offset; + nram_target += nram_offset; + } + + if (sizeof(T) == sizeof(half)) { + const int32_t compute_size = compute_num * sizeof(float); + char *nram_input_load = nram_input + compute_size / 2; + __bang_half2float((float *)nram_input, (half *)nram_input_load, + compute_num); + } + + // 0. alpha_t = alpha - 1 + __nramset((float *)nram_alpha_t, compute_num, (float)(alpha - 1.0)); + + // 1. pt = 1 - sigmoid(x) + sigmoid((float *)nram_pt, (float *)nram_input, compute_num); + __bang_mul_const((float *)nram_pt, (float *)nram_pt, (float)(-1), + compute_num); + __bang_add_const((float *)nram_pt, (float *)nram_pt, (float)1, compute_num); + + // 2. pt = target[n] == c ? sigmoid(x) : 1 - sigmoid(x) + // alpha_t = target[n] == c ? alpha : alpha - 1 + const int32_t nfu_align_num = NFU_ALIGN_SIZE / sizeof(float); + for (int n = 0; n < deal_n; n++) { + const int32_t target_value = ((int32_t *)nram_target)[n]; + if (target_value >= total_c || target_value < 0) continue; + int32_t c_offset = 0; + if (has_weight) { + int32_t c_align_num = nfu_align_num; + if (sizeof(T) == sizeof(half)) { + c_align_num += nfu_align_num; + } + c_offset = PAD_UP(total_c, c_align_num); + } else { + c_offset = total_c; + } + int32_t idx = n * c_offset + target_value; + *((float *)nram_pt + idx) = 1.0 - *((float *)nram_pt + idx); + *((float *)nram_alpha_t + idx) = alpha; + } + + // 3. temp = -alpha_t * e^(gamma * log(max(1 - pt, FLT_MIN)) + __bang_mul_const((float *)nram_temp, (float *)nram_pt, (float)(-1), + compute_num); + __bang_add_const((float *)nram_temp, (float *)nram_temp, (float)(1), + compute_num); + __bang_cycle_maxequal((float *)nram_temp, (float *)nram_temp, + (float *)nram_flt_min, compute_num, nfu_align_num); + __bang_active_loghp((float *)nram_temp, (float *)nram_temp, compute_num); + __bang_cycle_mul((float *)nram_temp, (float *)nram_temp, (float *)nram_gamma, + compute_num, nfu_align_num); + __bang_active_exphp((float *)nram_temp, (float *)nram_temp, compute_num); + __bang_mul((float *)nram_temp, (float *)nram_temp, (float *)nram_alpha_t, + compute_num); + __bang_mul_const((float *)nram_temp, (float *)nram_temp, (float)(-1), + compute_num); + + // 4. output = 1 - pt - gamma * pt * log(max(pt, FLT_MIN)) + __bang_cycle_maxequal((float *)nram_output, (float *)nram_pt, + (float *)nram_flt_min, compute_num, nfu_align_num); + __bang_active_loghp((float *)nram_output, (float *)nram_output, compute_num); + __bang_mul((float *)nram_output, (float *)nram_output, (float *)nram_pt, + compute_num); + __bang_cycle_mul((float *)nram_output, (float *)nram_output, + (float *)nram_gamma, compute_num, nfu_align_num); + __bang_add((float *)nram_output, (float *)nram_output, (float *)nram_pt, + compute_num); + __bang_mul_const((float *)nram_output, (float *)nram_output, (float)(-1), + compute_num); + __bang_add_const((float *)nram_output, (float *)nram_output, (float)(1), + compute_num); + + // 5. output = output * temp + __bang_mul((float *)nram_output, (float *)nram_output, (float *)nram_temp, + compute_num); + + if (sizeof(T) == sizeof(half)) { + __bang_float2half_rd((half *)nram_output, (float *)nram_output, + compute_num); + } + + if (has_weight) { + // with weight + for (int n = 0; n < deal_n; n++) { + int32_t c_align_num = nfu_align_num; + if (sizeof(T) == sizeof(half)) { + c_align_num += nfu_align_num; + } + int32_t align_c = PAD_UP(total_c, c_align_num); + int32_t target_value = ((int32_t *)nram_target)[n]; + T weight_value = nram_weight[target_value]; + __bang_mul_const((T *)nram_output + n * align_c, + (T *)nram_output + n * align_c, weight_value, align_c); + } + } +} + +template +__mlu_func__ void storeOutput(T *gdram_output, const char *nram_output, + const int32_t deal_n, const int32_t total_c, + const bool pingpong_flag, const bool has_weight, + const int32_t nram_offset, + const int32_t gdram_offset) { + if (pingpong_flag == PONG) { + nram_output += nram_offset; + } + const int32_t store_size = deal_n * total_c * sizeof(T); + if (has_weight) { + int32_t align_c = PAD_UP(total_c, NFU_ALIGN_SIZE / sizeof(T)); + int32_t total_c_size = total_c * sizeof(T); + int32_t align_c_size = align_c * sizeof(T); + __memcpy_async(gdram_output + gdram_offset, nram_output, total_c_size, + NRAM2GDRAM, total_c_size, align_c_size, deal_n - 1); + } else { + __memcpy_async(gdram_output + gdram_offset, nram_output, store_size, + NRAM2GDRAM); + } +} + +template +__mlu_func__ void focalLossSigmoidBackwardBlock( + const T *input, const int32_t *target, const T *weight, const float gamma, + const float alpha, const int32_t total_n, const int32_t deal_n, + const int32_t total_c, T *output) { + // params per time slice + int32_t deal_num = deal_n * total_c; + int32_t deal_size = deal_num * sizeof(float); + int32_t compute_num = 0; + int32_t compute_size = 0; + int32_t compute_align_size = NFU_ALIGN_SIZE; + const int32_t nfu_align_num = NFU_ALIGN_SIZE / sizeof(T); + if (sizeof(T) == sizeof(half)) { + compute_align_size += NFU_ALIGN_SIZE; + } + const int32_t compute_align_num = compute_align_size / sizeof(float); + bool has_weight = false; + if (weight != NULL) { + has_weight = true; + int32_t align_c = PAD_UP(total_c, compute_align_num); + compute_num = deal_n * align_c; + compute_size = compute_num * sizeof(float); + } else { + compute_size = PAD_UP(deal_size, compute_align_size); + compute_num = compute_size / sizeof(float); + } + + // params per core + int32_t total_num = total_n * total_c; + int32_t num_per_core = PAD_DOWN(total_num / taskDim, deal_num); + int32_t loop_per_core = num_per_core / deal_num; + + /* NRAM partition: + * + * |-----------------ping pong--------------------| + * |input | pt | alpha_t | temp | output | target | flt_min | gamma | weight| + * + * split_pipeline_num is 5: input, pt, alpha_t, temp, output. + * nram_reserved_line_num is 2: flt_min, gamma. + */ + const int32_t split_pipeline_num = 5; + const int32_t nram_reserved_line_num = 2; + int32_t target_deal_size = deal_n * sizeof(int32_t); + int32_t target_deal_size_align = PAD_UP(target_deal_size, NFU_ALIGN_SIZE); + // nram PING/PONG offset + int32_t ping_pong_offset = + compute_size * split_pipeline_num + target_deal_size_align; + + // gdram addr + int32_t *base_addr_target = + (int32_t *)target + taskId * loop_per_core * deal_n; + T *base_addr_input = (T *)input + taskId * num_per_core; + T *base_addr_output = output + taskId * num_per_core; + + // nram addr + char *nram_input = (char *)nram_buffer; + char *nram_pt = nram_input + compute_size; + char *nram_alpha_t = nram_pt + compute_size; + char *nram_temp = nram_alpha_t + compute_size; + char *nram_output = nram_temp + compute_size; + char *nram_target = nram_output + compute_size; + float *nram_flt_min = NULL; + float *nram_gamma = NULL; + T *nram_weight = NULL; + + if (!has_weight) { + nram_flt_min = (float *)(nram_buffer + MAX_NRAM_SIZE - + nram_reserved_line_num * NFU_ALIGN_SIZE); + nram_gamma = nram_flt_min + nfu_align_num; + } else { + int32_t weight_space = PAD_UP(total_c * sizeof(T), NFU_ALIGN_SIZE); + nram_flt_min = + (float *)(nram_buffer + MAX_NRAM_SIZE - + nram_reserved_line_num * NFU_ALIGN_SIZE - weight_space); + nram_gamma = nram_flt_min + nfu_align_num; + nram_weight = (T *)(nram_gamma + nfu_align_num); + __memcpy_async(nram_weight, weight, total_c * sizeof(T), GDRAM2NRAM); + } + + // nram set gamma and FLT_MIN + __nramset(nram_gamma, nfu_align_num, gamma); + __nramset(nram_flt_min, nfu_align_num, FLT_MIN); + + /* + * Pipeline: The pipeline is processed in three stages: Load, Compute, Store. + * The allocated memory space of NRAM is divided into two parts: + * PING and Pong. In a single time slice, PING is used to process + * IO stream and PONG is used for computation. Both of them are + * processed synchronously until finished. + * + * diagram of PINGPONG: + * |------|-----------------------------------------------------------------| + * | | space | + * |------|-----------------------------------------------------------------| + * | time | Ping | Pong | Ping | Pong | Ping | Pong | + * |------|-----------------------------------------------------------------| + * | 0 | L0 | | | | | | + * | 1 | C0 | L1 | | | | | + * | 2 | S0 | C1 | L2 | | | | + * | 3 | | S1 | C2 | L3 | | | + * | 4 | | | S2 | C3 | L4 | | + * | 5 | | | | S3 | C4 | L5 | + * | 6 | | | | | S4 | C5 | + * | 7 | | | | | | S5 | + * |------|-----------------------------------------------------------------| + */ + + // diagram of PINGPONG: L0 + if (loop_per_core > 0) { + loadInput(nram_input, nram_target, base_addr_input, base_addr_target, + deal_n, total_c, PING, has_weight, ping_pong_offset, 0); + __asm__ volatile("sync;"); + } + + // diagram of PINGPONG: C0 and L1 + if (loop_per_core > 1) { + coreCompute(nram_input, nram_weight, nram_flt_min, nram_pt, nram_alpha_t, + nram_temp, nram_target, nram_gamma, nram_output, alpha, + compute_num, deal_n, total_c, PING, ping_pong_offset, + has_weight); + loadInput(nram_input, nram_target, base_addr_input, base_addr_target, + deal_n, total_c, PONG, has_weight, ping_pong_offset, deal_num); + __asm__ volatile("sync;"); + } + + for (int i = 0; i < loop_per_core - 2; ++i) { + if (i % 2 == PING) { + storeOutput(base_addr_output, nram_output, deal_n, total_c, PING, + has_weight, ping_pong_offset, i * deal_num); + coreCompute(nram_input, nram_weight, nram_flt_min, nram_pt, nram_alpha_t, + nram_temp, nram_target, nram_gamma, nram_output, alpha, + compute_num, deal_n, total_c, PONG, ping_pong_offset, + has_weight); + loadInput(nram_input, nram_target, base_addr_input, base_addr_target, + deal_n, total_c, PING, has_weight, ping_pong_offset, + (i + 2) * deal_num); + } else { + storeOutput(base_addr_output, nram_output, deal_n, total_c, PONG, + has_weight, ping_pong_offset, i * deal_num); + coreCompute(nram_input, nram_weight, nram_flt_min, nram_pt, nram_alpha_t, + nram_temp, nram_target, nram_gamma, nram_output, alpha, + compute_num, deal_n, total_c, PING, ping_pong_offset, + has_weight); + loadInput(nram_input, nram_target, base_addr_input, base_addr_target, + deal_n, total_c, PONG, has_weight, ping_pong_offset, + (i + 2) * deal_num); + } + __asm__ volatile("sync;"); + } + + if (loop_per_core > 1) { + if ((loop_per_core - 2) % 2 == PING) { + storeOutput(base_addr_output, nram_output, deal_n, total_c, PING, + has_weight, ping_pong_offset, (loop_per_core - 2) * deal_num); + coreCompute(nram_input, nram_weight, nram_flt_min, nram_pt, nram_alpha_t, + nram_temp, nram_target, nram_gamma, nram_output, alpha, + compute_num, deal_n, total_c, PONG, ping_pong_offset, + has_weight); + } else { + storeOutput(base_addr_output, nram_output, deal_n, total_c, PONG, + has_weight, ping_pong_offset, (loop_per_core - 2) * deal_num); + coreCompute(nram_input, nram_weight, nram_flt_min, nram_pt, nram_alpha_t, + nram_temp, nram_target, nram_gamma, nram_output, alpha, + compute_num, deal_n, total_c, PING, ping_pong_offset, + has_weight); + } + __asm__ volatile("sync;"); + } + + if (loop_per_core > 0) { + if (loop_per_core == 1) { + coreCompute(nram_input, nram_weight, nram_flt_min, nram_pt, nram_alpha_t, + nram_temp, nram_target, nram_gamma, nram_output, alpha, + compute_num, deal_n, total_c, PING, ping_pong_offset, + has_weight); + __asm__ volatile("sync;"); + } + if ((loop_per_core - 1) % 2 == PING) { + storeOutput(base_addr_output, nram_output, deal_n, total_c, PING, + has_weight, ping_pong_offset, (loop_per_core - 1) * deal_num); + } else { + storeOutput(base_addr_output, nram_output, deal_n, total_c, PONG, + has_weight, ping_pong_offset, (loop_per_core - 1) * deal_num); + } + } + + // process the remaining data which N remainder per core is less than deal_n + int32_t rem_for_all = total_num - num_per_core * taskDim; + if (rem_for_all == 0) return; + int32_t rem_n_for_all = rem_for_all / total_c; + int32_t rem_n_per_core = (rem_n_for_all + taskDim - 1) / taskDim; + int32_t rem_num_per_core = rem_n_per_core * total_c; + int32_t rem_num_per_core_align = 0; + int32_t rem_core_num = rem_for_all / rem_num_per_core; + + int32_t rem_n_for_last = rem_n_for_all % rem_n_per_core; + int32_t rem_num_for_last = rem_n_for_last * total_c; + int32_t rem_num_for_last_align = 0; + + if (has_weight) { + int32_t align_c = PAD_UP(total_c, compute_align_num); + rem_num_per_core_align = rem_n_per_core * align_c; + rem_num_for_last_align = rem_n_for_last * align_c; + } else { + rem_num_per_core_align = PAD_UP(rem_num_per_core, compute_align_num); + rem_num_for_last_align = PAD_UP(rem_num_for_last, compute_align_num); + } + + int32_t rem_addr_base = num_per_core * taskDim; + int32_t rem_target_addr_base = loop_per_core * deal_n * taskDim; + base_addr_target = (int32_t *)target + rem_target_addr_base; + base_addr_input = (T *)input + rem_addr_base; + base_addr_output = output + rem_addr_base; + + if (taskId < rem_core_num) { + loadInput(nram_input, nram_target, base_addr_input, base_addr_target, + rem_n_per_core, total_c, PING, has_weight, ping_pong_offset, + taskId * rem_num_per_core); + __asm__ volatile("sync;"); + coreCompute(nram_input, nram_weight, nram_flt_min, nram_pt, nram_alpha_t, + nram_temp, nram_target, nram_gamma, nram_output, alpha, + rem_num_per_core_align, rem_n_per_core, total_c, PING, + ping_pong_offset, has_weight); + __asm__ volatile("sync;"); + storeOutput(base_addr_output, nram_output, rem_n_per_core, total_c, PING, + has_weight, ping_pong_offset, taskId * rem_num_per_core); + } else if (taskId == rem_core_num) { + if (rem_num_for_last == 0) return; + loadInput(nram_input, nram_target, base_addr_input, base_addr_target, + rem_n_for_last, total_c, PING, has_weight, ping_pong_offset, + taskId * rem_num_per_core); + __asm__ volatile("sync;"); + coreCompute(nram_input, nram_weight, nram_flt_min, nram_pt, nram_alpha_t, + nram_temp, nram_target, nram_gamma, nram_output, alpha, + rem_num_for_last_align, rem_n_for_last, total_c, PING, + ping_pong_offset, has_weight); + __asm__ volatile("sync;"); + storeOutput(base_addr_output, nram_output, rem_n_for_last, total_c, PING, + has_weight, ping_pong_offset, taskId * rem_num_per_core); + } else { + return; + } +} + +template +__mlu_global__ void MLUUnion1KernelFocalLossSigmoidBackward( + const void *input, const void *target, const void *weight, + const float gamma, const float alpha, const int32_t total_n, + const int32_t deal_n, const int32_t total_c, void *output) { + focalLossSigmoidBackwardBlock((T *)input, (int32_t *)target, (T *)weight, + gamma, alpha, total_n, deal_n, total_c, + (T *)output); +} +} // namespace backward + +void KernelFocalLossSigmoidForward(cnrtDim3_t k_dim, cnrtFunctionType_t k_type, + cnrtQueue_t queue, + const cnrtDataType_t d_type, + const void *input, const void *target, + const void *weight, const int32_t N, + const int32_t C, const float alpha, + const float gamma, void *output) { + if (d_type == CNRT_FLOAT16) { + forward::MLUUnion1KernelFocalLossSigmoidForward< + half><<>>(input, target, weight, N, C, alpha, + gamma, output); + } else { + forward::MLUUnion1KernelFocalLossSigmoidForward< + float><<>>(input, target, weight, N, C, alpha, + gamma, output); + } +} + +void KernelFocalLossSigmoidBackward(cnrtDim3_t k_dim, cnrtFunctionType_t k_type, + cnrtQueue_t queue, + const cnrtDataType_t d_type, + const void *input, const void *target, + const void *weight, const float gamma, + const float alpha, const int32_t dim_n, + const int32_t deal_n, const int32_t dim_c, + void *output) { + if (d_type == CNRT_FLOAT16) { + backward::MLUUnion1KernelFocalLossSigmoidBackward< + half><<>>(input, target, weight, gamma, alpha, + dim_n, deal_n, dim_c, output); + } else { + backward::MLUUnion1KernelFocalLossSigmoidBackward< + float><<>>(input, target, weight, gamma, alpha, + dim_n, deal_n, dim_c, output); + } +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/masked_conv2d_mlu_kernel.mlu b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/masked_conv2d_mlu_kernel.mlu new file mode 100644 index 0000000000000000000000000000000000000000..1356a799ac3ba5d36de9df25a0cdd0a706506e75 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/masked_conv2d_mlu_kernel.mlu @@ -0,0 +1,181 @@ +/************************************************************************* + * Copyright (C) 2022 Cambricon. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *************************************************************************/ +#include "common_mlu_helper.hpp" + +__nram__ char nram_buffer[MAX_NRAM_SIZE]; + +template +__mlu_func__ void MLUUnion1MaskedIm2colForward( + const T *feature, const int height, const int width, const int channels, + const int kernel_h, const int kernel_w, const int pad_h, const int pad_w, + const int32_t *mask_h_idx, const int32_t *mask_w_idx, const int mask_cnt, + T *data_col) { + for (int index = taskId; index < mask_cnt; index += taskDim) { + const int h_col = mask_h_idx[index]; + const int w_col = mask_w_idx[index]; + const int h_offset = h_col - pad_h; + const int w_offset = w_col - pad_w; + int h_start = h_offset; + int h_end = h_offset + kernel_h - 1; + int w_start = w_offset; + int w_end = w_start + kernel_w - 1; + if (h_start >= height || w_start >= width || h_end < 0 || w_end < 0) { + continue; + } else { + int h_start_valid = max(0, h_start); + int h_end_valid = min(height - 1, h_end); + int w_start_valid = max(0, w_start); + int w_end_valid = min(width - 1, w_end); + __memcpy( + data_col + index * kernel_h * kernel_w * channels + + ((h_start_valid - h_start) * kernel_w + + (w_start_valid - w_start)) * + channels, + feature + h_start_valid * width * channels + w_start_valid * channels, + (w_end_valid - w_start_valid + 1) * channels * sizeof(T), GDRAM2GDRAM, + kernel_w * channels * sizeof(T), width * channels * sizeof(T), + h_end_valid - h_start_valid); + } + } +} + +template +__mlu_func__ void MLUUnion1MaskedCol2imForward(const T *col, const int height, + const int width, + const int channels, + const int32_t *mask_h_idx, + const int32_t *mask_w_idx, + const int mask_cnt, T *im) { + const int channels_max_num_nram = MAX_NRAM_SIZE / sizeof(T); + if (channels <= channels_max_num_nram) { + const int deal_num = channels_max_num_nram / channels; + int mask_per_core = mask_cnt / taskDim; + const int mask_remain = mask_cnt % taskDim; + mask_per_core += taskId < mask_remain ? 1 : 0; + int index_start = taskId < mask_remain + ? taskId * mask_per_core + : taskId * mask_per_core + mask_remain; + int loop = mask_per_core / deal_num; + int remain_num = mask_per_core % deal_num; + T *nram_col = (T *)nram_buffer; + for (int index = 0; index < loop; ++index) { + int cur_index = index_start + index * deal_num; + __memcpy(nram_col, col + cur_index * channels, + deal_num * channels * sizeof(T), GDRAM2NRAM); + for (int i = 0; i < deal_num; ++i) { + int mask_index = cur_index + i; + const int h_im = mask_h_idx[mask_index]; + const int w_im = mask_w_idx[mask_index]; + // if(h_im>=height || w_im>=width) continue; + __memcpy(im + (h_im * width + w_im) * channels, nram_col + i * channels, + channels * sizeof(T), NRAM2GDRAM); + } + } + if (remain_num > 0) { + int cur_index = index_start + loop * deal_num; + __memcpy(nram_col, col + cur_index * channels, + remain_num * channels * sizeof(T), GDRAM2NRAM); + for (int i = 0; i < remain_num; ++i) { + int mask_index = cur_index + i; + const int h_im = mask_h_idx[mask_index]; + const int w_im = mask_w_idx[mask_index]; + // if(h_im>=height || w_im>=width) continue; + __memcpy(im + (h_im * width + w_im) * channels, nram_col + i * channels, + channels * sizeof(T), NRAM2GDRAM); + } + } + } else { + for (int index = taskId; index < mask_cnt; index += taskDim) { + const int m_index = index % mask_cnt; + const int h_im = mask_h_idx[m_index]; + const int w_im = mask_w_idx[m_index]; + // if(h_im>=height || w_im>=width) continue; + __memcpy(im + (h_im * width + w_im) * channels, col + index * channels, + channels * sizeof(T), GDRAM2GDRAM); + } + } +} + +__mlu_global__ void MLUKernelMaskedIm2colForward( + const void *feature, const int height, const int width, const int channels, + const int kernel_h, const int kernel_w, const int pad_h, const int pad_w, + const void *mask_h_idx, const void *mask_w_idx, const int mask_cnt, + void *data_col, const cnrtDataType_t data_dtype) { + if (coreId == 0x80) { + return; + } + + switch (data_dtype) { + case CNRT_FLOAT16: { + MLUUnion1MaskedIm2colForward((half *)feature, height, width, channels, + kernel_h, kernel_w, pad_h, pad_w, + (int32_t *)mask_h_idx, (int32_t *)mask_w_idx, + mask_cnt, (half *)data_col); + }; break; + case CNRT_FLOAT32: { + MLUUnion1MaskedIm2colForward((float *)feature, height, width, channels, + kernel_h, kernel_w, pad_h, pad_w, + (int32_t *)mask_h_idx, (int32_t *)mask_w_idx, + mask_cnt, (float *)data_col); + }; break; + default: { + break; + } + } +} + +__mlu_global__ void MLUKernelMaskedCol2imForward( + const void *col, const int height, const int width, const int channels, + const void *mask_h_idx, const void *mask_w_idx, const int mask_cnt, + void *im, const cnrtDataType_t data_dtype) { + if (coreId == 0x80) { + return; + } + switch (data_dtype) { + case CNRT_FLOAT16: { + MLUUnion1MaskedCol2imForward((half *)col, height, width, channels, + (int32_t *)mask_h_idx, (int32_t *)mask_w_idx, + mask_cnt, (half *)im); + }; break; + case CNRT_FLOAT32: { + MLUUnion1MaskedCol2imForward((float *)col, height, width, channels, + (int32_t *)mask_h_idx, (int32_t *)mask_w_idx, + mask_cnt, (float *)im); + }; break; + default: { + break; + } + } +} + +void KernelMaskedIm2colForward( + cnrtDim3_t k_dim, cnrtFunctionType_t k_type, cnrtQueue_t queue, + cnrtDataType_t k_dtype, const void *im_ptr, const int height, + const int width, const int channels, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const void *mask_h_idx_ptr, + const void *mask_w_idx_ptr, const int mask_cnt, void *col_ptr) { + MLUKernelMaskedIm2colForward<<>>( + im_ptr, height, width, channels, kernel_h, kernel_w, pad_h, pad_w, + mask_h_idx_ptr, mask_w_idx_ptr, mask_cnt, col_ptr, k_dtype); +} + +void KernelMaskedCol2imForward(cnrtDim3_t k_dim, cnrtFunctionType_t k_type, + cnrtQueue_t queue, cnrtDataType_t k_dtype, + const void *col_ptr, const int height, + const int width, const int channels, + const void *mask_h_idx_ptr, + const void *mask_w_idx_ptr, const int mask_cnt, + void *im_ptr) { + MLUKernelMaskedCol2imForward<<>>( + col_ptr, height, width, channels, mask_h_idx_ptr, mask_w_idx_ptr, + mask_cnt, im_ptr, k_dtype); +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/roi_pool_mlu_kernel.mlu b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/roi_pool_mlu_kernel.mlu new file mode 100644 index 0000000000000000000000000000000000000000..3a6d2d3ba61c2ba87ae9b1fb301c412fea93195c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/roi_pool_mlu_kernel.mlu @@ -0,0 +1,747 @@ +/************************************************************************* + * Copyright (C) 2022 Cambricon. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *************************************************************************/ +#include "common_mlu_helper.hpp" + +#define ALIGN_SIZE 64 +#define PIPELINE_COMMON_NUM 2 +#define PIPELINE_PINGPONG_NUM 10 + +__nram__ char nram_buffer[MAX_NRAM_SIZE]; + +namespace forward { +template +__mlu_func__ void getRoiBinInfo(T *input_v, T *rois_v, int bin_i, int height, + int width, int channels, int p_height, + int p_width, T spatial_scale, int *bin_x1, + int *bin_y1, int *bin_x2, int *bin_y2, + int *bin_wdim, int *bin_hdim, int *bin_dims, + T **input_base, bool *is_empty) { + int pw = bin_i % p_width; + int ph = (bin_i / p_width) % p_height; + int roi_n = bin_i / p_width / p_height; + + /*roi*/ + const T *roi_info = rois_v + roi_n * 5; // {{batch, x1, y1, x2, y2},,,} + int batch_index = (int)roi_info[0]; + int roi_x1 = round(roi_info[1] * spatial_scale); + int roi_y1 = round(roi_info[2] * spatial_scale); + int roi_x2 = round(roi_info[3] * spatial_scale); + int roi_y2 = round(roi_info[4] * spatial_scale); + int roi_w = roi_x2 - roi_x1 + 1 > 1 ? roi_x2 - roi_x1 + 1 : 1; + int roi_h = roi_y2 - roi_y1 + 1 > 1 ? roi_y2 - roi_y1 + 1 : 1; + + /*bin*/ + T bin_w = (T)roi_w / (T)p_width; + T bin_h = (T)roi_h / (T)p_height; + + *bin_x1 = (int)floor((T)pw * bin_w) + roi_x1; + *bin_x1 = *bin_x1 > 0 ? *bin_x1 : 0; + *bin_x1 = *bin_x1 < width ? *bin_x1 : width; + + *bin_y1 = (int)floor((T)ph * bin_h) + roi_y1; + *bin_y1 = *bin_y1 > 0 ? *bin_y1 : 0; + *bin_y1 = *bin_y1 < height ? *bin_y1 : height; + + *bin_x2 = (int)ceil((T)(pw + 1) * bin_w) + roi_x1; + *bin_x2 = *bin_x2 > 0 ? *bin_x2 : 0; + *bin_x2 = *bin_x2 < width ? *bin_x2 : width; + + *bin_y2 = (int)ceil((T)(ph + 1) * bin_h) + roi_y1; + *bin_y2 = *bin_y2 > 0 ? *bin_y2 : 0; + *bin_y2 = *bin_y2 < height ? *bin_y2 : height; + + *input_base = input_v + batch_index * height * width * channels; + *bin_wdim = *bin_x2 - *bin_x1; + *bin_hdim = *bin_y2 - *bin_y1; + *bin_dims = (*bin_hdim) * (*bin_wdim); + *is_empty = (*bin_y2 <= *bin_y1) || (*bin_x2 <= *bin_x1); +} + +template +__mlu_func__ void MLUUnion1Roipool(T *input_v, T *rois_v, int batch, + int channels, int height, int width, + int p_height, int p_width, int rois_num, + T spatial_scale, T *output_v, int *argmax) { + /* + * NRAM partition + * |---------------------------------------------------| + * | ping | + * |---------------------------------------------------| + * | pong | + * |---------------------------------------------------| + * | out | + * |---------------------------------------------------| + * | argmax | + * |---------------------------------------------------| + * | a | + * |---------------------------------------------------| + * | b | + * |---------------------------------------------------| + */ + uint32_t is_half = sizeof(T) == sizeof(half) ? true : false; + uint32_t t_size = sizeof(T); + uint32_t float_div = NFU_ALIGN_SIZE / sizeof(float); + uint32_t half_div = NFU_ALIGN_SIZE / sizeof(half); + + uint32_t channels_align = PAD_UP(channels, float_div); + uint32_t nram_limit = PAD_DOWN( + (MAX_NRAM_SIZE / sizeof(float) - 4 * channels_align) / 2, half_div); + + // nram PING/PONG, output, argamx, a, b + float *nram_ping = (float *)nram_buffer; + float *nram_pong = (float *)nram_buffer + nram_limit; + float *nram_out = (float *)nram_buffer + 2 * nram_limit; + float *nram_argmax = nram_out + channels_align; + float *nram_a = nram_out + 2 * channels_align; + float *nram_b = nram_out + 3 * channels_align; + + uint32_t c_bins_num = rois_num * p_height * p_width; + uint32_t task_bins = c_bins_num / taskDim; + uint32_t rem_bins = c_bins_num % taskDim; + if (taskId < rem_bins) { + task_bins += 1; + } + int bin_first = + (c_bins_num / taskDim) * taskId + (taskId > rem_bins ? rem_bins : taskId); + int bins_loop = bin_first + task_bins; + + T *input_base = NULL; + T *output_base = output_v + bin_first * channels; + int *argmax_base = NULL != argmax ? argmax + bin_first * channels : NULL; + int bin_x1, bin_y1, bin_x2, bin_y2, bin_wdim, bin_hdim, bin_dims; + int pbin_x1, pbin_y1, pbin_x2, pbin_y2, pbin_wdim, pbin_hdim, pbin_dims; + bool is_empty = false; + bool pong_is_empty = false; + bool is_first_bin = true; + uint32_t src_offset = 0; + uint32_t dst_offset = 0; + uint32_t nram_offset = 0; + uint32_t half_offset = + is_half ? (nram_limit / 2 / half_div * half_div) * 2 : 0; + float *nram_tmp = NULL; + + uint32_t c_slice = 0; + uint32_t c_slice_align = 0; + uint32_t pongc_slice = 0; + uint32_t pongc_slice_align = 0; + for (int bin_i = bin_first; bin_i < bins_loop; bin_i++) { + getRoiBinInfo((T *)input_v, (T *)rois_v, bin_i, height, width, channels, + p_height, p_width, (T)spatial_scale, &bin_x1, &bin_y1, + &bin_x2, &bin_y2, &bin_wdim, &bin_hdim, &bin_dims, + &input_base, &is_empty); + uint32_t c_rem = channels; + c_slice = nram_limit / bin_dims / float_div * float_div; + + if (is_first_bin && !is_empty) { + c_slice = c_slice > c_rem ? c_rem : c_slice; + c_slice_align = PAD_UP(c_slice, float_div); + for (int h = bin_y1; h < bin_y2; h++) { + src_offset = (h * width + bin_x1) * channels; + nram_offset = (h - bin_y1) * bin_wdim * c_slice_align + half_offset; + if (c_slice_align == channels) { + __memcpy((T *)nram_ping + nram_offset, (T *)input_base + src_offset, + bin_wdim * c_slice * t_size, GDRAM2NRAM); + } else { + __memcpy((T *)nram_ping + nram_offset, (T *)input_base + src_offset, + c_slice * t_size, GDRAM2NRAM, c_slice_align * t_size, + channels * t_size, bin_wdim - 1); + } + } + } + uint32_t c_offset = 0; + while (c_rem > 0) { + c_slice = c_slice > c_rem ? c_rem : c_slice; + c_slice_align = PAD_UP(c_slice, float_div); + + /*__memcpy_async*/ + if (c_rem - c_slice > 0 && !is_empty) { + pongc_slice = c_rem - c_slice > c_slice ? c_slice : c_rem - c_slice; + pongc_slice_align = PAD_UP(pongc_slice, float_div); + for (int h = bin_y1; h < bin_y2; h++) { + src_offset = (h * width + bin_x1) * channels + c_offset; + nram_offset = + (h - bin_y1) * bin_wdim * pongc_slice_align + half_offset; + __memcpy_async((T *)nram_pong + nram_offset, + (T *)input_base + src_offset + c_slice, + pongc_slice * t_size, GDRAM2NRAM, + pongc_slice_align * t_size, channels * t_size, + bin_wdim - 1); + } + } else if (bin_i + 1 < bins_loop) { + getRoiBinInfo((T *)input_v, (T *)rois_v, bin_i + 1, height, width, + channels, p_height, p_width, (T)spatial_scale, &pbin_x1, + &pbin_y1, &pbin_x2, &pbin_y2, &pbin_wdim, &pbin_hdim, + &pbin_dims, &input_base, &pong_is_empty); + pongc_slice = PAD_DOWN(nram_limit / pbin_dims, float_div); + pongc_slice = pongc_slice > channels ? channels : pongc_slice; + pongc_slice_align = PAD_UP(pongc_slice, float_div); + if (!pong_is_empty) { + for (int h = pbin_y1; h < pbin_y2; h++) { + src_offset = (h * width + pbin_x1) * channels; + nram_offset = + (h - pbin_y1) * pbin_wdim * pongc_slice_align + half_offset; + if (pongc_slice_align == channels) { + __memcpy_async((T *)nram_pong + nram_offset, + (T *)input_base + src_offset, + pbin_wdim * pongc_slice * t_size, GDRAM2NRAM); + } else { + __memcpy_async((T *)nram_pong + nram_offset, + (T *)input_base + src_offset, pongc_slice * t_size, + GDRAM2NRAM, pongc_slice_align * t_size, + channels * t_size, pbin_wdim - 1); + } + } + } + } + + if (is_empty) { + __bang_write_value((T *)nram_out, c_slice_align, (T)0); + __memcpy((T *)output_base + dst_offset + c_offset, (T *)nram_out, + c_slice * t_size, NRAM2GDRAM); + if (NULL != argmax) { + __bang_write_value((int32_t *)nram_out, c_slice_align, (int32_t)(-1)); + __memcpy((int32_t *)argmax_base + dst_offset + c_offset, + (int32_t *)nram_out, c_slice * sizeof(int32_t), NRAM2GDRAM); + } + } else { + if (is_half) { + uint32_t bin_align64 = PAD_UP(bin_dims * c_slice_align, half_div); + __bang_half2float((float *)nram_ping, (half *)nram_ping + half_offset, + bin_align64); + } + __bang_maxpool((float *)nram_out, (float *)nram_ping, c_slice_align, + bin_hdim, bin_wdim, bin_hdim, bin_wdim, 1, 1); + if (is_half) { + uint32_t c_align64 = PAD_UP(c_slice_align, half_div); + __bang_float2half_rd((half *)nram_out, (float *)nram_out, c_align64); + } + __memcpy((T *)output_base + dst_offset + c_offset, (T *)nram_out, + c_slice * t_size, NRAM2GDRAM); + if (NULL != argmax) { + /*compute max_index*/ + __bang_maxpool_index((uint32_t *)nram_out, (float *)nram_ping, + c_slice_align, bin_hdim, bin_wdim, bin_hdim, + bin_wdim, 1, 1); + convertInt2Float((float *)nram_argmax, (float *)nram_a, + (int32_t *)nram_out, (float *)nram_b, c_slice_align); + + /*compute input_h*/ + for (int i = 0; i < c_slice; i++) { + nram_out[i] = (float)(((uint32_t *)nram_out)[i] / bin_wdim); + } + __bang_add_scalar((float *)nram_a, (float *)nram_out, (float)bin_y1, + c_slice_align); + __bang_mul_scalar((float *)nram_ping, (float *)nram_a, (float)width, + c_slice_align); + + /*compute input_w*/ + __bang_mul_scalar((float *)nram_a, (float *)nram_out, (float)bin_wdim, + c_slice_align); + __bang_sub((float *)nram_a, (float *)nram_argmax, (float *)nram_a, + c_slice_align); + __bang_add_scalar((float *)nram_a, (float *)nram_a, (float)bin_x1, + c_slice_align); + __bang_add((float *)nram_out, (float *)nram_ping, (float *)nram_a, + c_slice_align); + convertFloat2Int((int32_t *)nram_argmax, (float *)nram_a, + (float *)nram_out, (float *)nram_b, c_slice_align); + __memcpy((int32_t *)argmax_base + dst_offset + c_offset, + (int32_t *)nram_argmax, c_slice * sizeof(int32_t), + NRAM2GDRAM); + } + } + nram_tmp = nram_ping; + nram_ping = nram_pong; + nram_pong = nram_tmp; + c_offset += c_slice; + c_rem -= c_slice; + __asm__ volatile("sync;"); + } + dst_offset += channels; + is_first_bin = false; + } +} + +__mlu_global__ void MLUKernelRoiPool(cnrtDataType_t data_type, + const void *input_data, + const void *input_rois, int batch, + int channels, int height, int width, + int pooled_height, int pooled_width, + int rois_num, float spatial_scale, + void *output_data, int *argmax) { + switch (data_type) { + case CNRT_FLOAT16: { + MLUUnion1Roipool((half *)input_data, (half *)input_rois, batch, channels, + height, width, pooled_height, pooled_width, rois_num, + (half)spatial_scale, (half *)output_data, argmax); + }; break; + case CNRT_FLOAT32: { + MLUUnion1Roipool((float *)input_data, (float *)input_rois, batch, + channels, height, width, pooled_height, pooled_width, + rois_num, (float)spatial_scale, (float *)output_data, + argmax); + }; break; + default: { break; } + } +} +} // namespace forward + +namespace backward { +// Convert index of argmax from global grads_image to local bin in RoI. Vector +// operations do not support int type, so conversion from int to float is +// performed here. +__mlu_func__ void convertIndex( + int32_t *nram_argmax, int32_t *nram_argmax_fp, int32_t *nram_argmax_fp_bk1, + int32_t *nram_argmax_fp_bk2, int32_t *nram_argmax_int, + int32_t *nram_argmax_int_h, int32_t *nram_argmax_int_w, + int32_t *nram_argmax_fp_h, int32_t *nram_argmax_fp_w, + float *nram_atomic_add, float *nram_grads_image, int width, int height, + int wstart, int hstart, int w_compute, int h_compute, int align_c, + int channels, int loop_flag, int loop_id, int true_limit) { + convertInt2Float((float *)nram_argmax_fp, (float *)nram_argmax_fp_bk1, + (int *)nram_argmax, (float *)nram_argmax_fp_bk2, align_c); + + // This step uses scalar division, because the above vector division causes + // rounding accuracy problem. + for (int i = 0; i < channels; ++i) { + *((float *)nram_argmax_fp + i) = *((float *)nram_argmax_fp + i) / width; + } + + // Use 'float2int_tz' to perform '*((int32_t*)nram_argmax + i) / width' + // operation. + convertFloat2Int((int *)nram_argmax_int_h, (float *)nram_argmax_fp_bk1, + (float *)nram_argmax_fp, (float *)nram_argmax_fp_bk2, + align_c); + convertInt2Float((float *)nram_argmax_fp, (float *)nram_argmax_fp_bk1, + (int *)nram_argmax_int_h, (float *)nram_argmax_fp_bk2, + align_c); + + // Perform 'temp_result - hstart' operation + __bang_sub_scalar((float *)nram_argmax_fp_h, (float *)nram_argmax_fp, hstart, + align_c); + + // Perform 'temp_result1 - temp_result2 * width' operation + __bang_mul_scalar((float *)nram_argmax_fp_w, (float *)nram_argmax_fp, width, + align_c); + convertInt2Float((float *)nram_argmax_fp, (float *)nram_argmax_fp_bk1, + (int *)nram_argmax, (float *)nram_argmax_fp_bk2, align_c); + __bang_sub((float *)nram_argmax_fp_w, (float *)nram_argmax_fp, + (float *)nram_argmax_fp_w, align_c); + + // Perform 'temp_result - wstart' operation + __bang_sub_scalar((float *)nram_argmax_fp_w, (float *)nram_argmax_fp_w, + wstart, align_c); + + // Perform 'temp_result = h * w_compute + w' operation + __bang_mul_scalar((float *)nram_argmax_fp_h, (float *)nram_argmax_fp_h, + w_compute, align_c); + __bang_add((float *)nram_argmax_fp_h, (float *)nram_argmax_fp_h, + (float *)nram_argmax_fp_w, align_c); + + if (loop_flag == 1) { + __bang_sub_scalar((float *)nram_argmax_fp_h, (float *)nram_argmax_fp_h, + (loop_id * true_limit), align_c); + } + convertFloat2Int((int *)nram_argmax_int, (float *)nram_argmax_fp_bk1, + (float *)nram_argmax_fp_h, (float *)nram_argmax_fp_bk2, + align_c); +} + +template +__mlu_func__ void MLUUnion1Roipool(const T *rois, const T *grads, + const int32_t *argmax, T *grads_image, + int channels, int height, int width, + int pooled_height, int pooled_width, + int rois_num, const T spatial_scale, + int high_precision) { + // Calculate the number of rois processed by each core + int bin_num = rois_num * pooled_height * pooled_width; + int loop = + (bin_num % taskDim) ? (bin_num / taskDim + 1) : (bin_num / taskDim); + int tid = taskId * loop; + if (bin_num % taskDim != 0) { + if (tid >= bin_num) { + return; + } else { + // last part is (bin_num - tid). + loop = bin_num - tid < loop ? bin_num - tid : loop; + } + } + int align_c = PAD_UP(channels, ALIGN_SIZE); + // Common part has 2: grads, argmax; ping-pong each is PIPELINE_PINGPONG_NUM. + int data_size = + PAD_DOWN(((MAX_NRAM_SIZE / sizeof(float) - PIPELINE_COMMON_NUM * align_c - + (PIPELINE_PINGPONG_NUM - 1) * align_c * 2) / + 2), + ALIGN_SIZE); + int hw_limit = data_size / align_c; + float *nram_grads = (float *)nram_buffer; + for (int idx = tid; idx < tid + loop; ++idx) { + // (n, ph, pw) is a C in the pooled output + int pw = idx % pooled_width; + int ph = (idx / pooled_width) % pooled_height; + int n = idx / pooled_width / pooled_height; + + const T *offset_rois = (const T *)(rois + n * 5); + int roi_batch_ind = int(offset_rois[0]); + // Calculate the roi region on feature maps + int roi_start_w = round(offset_rois[1] * spatial_scale); + int roi_start_h = round(offset_rois[2] * spatial_scale); + int roi_end_w = round(offset_rois[3] * spatial_scale); + int roi_end_h = round(offset_rois[4] * spatial_scale); + // Force malformed rois to 1x1 + int roi_width = + roi_end_w - roi_start_w + 1 > 1 ? roi_end_w - roi_start_w + 1 : 1; + int roi_height = + roi_end_h - roi_start_h + 1 > 1 ? roi_end_h - roi_start_h + 1 : 1; + T bin_size_h = (T)roi_height / (T)pooled_height; + T bin_size_w = (T)roi_width / (T)pooled_width; + + // The corresponding bin region + int hstart = int(floor((T)ph * bin_size_h)); + int wstart = int(floor((T)pw * bin_size_w)); + int hend = int(ceil((T)(ph + 1) * bin_size_h)); + int wend = int(ceil((T)(pw + 1) * bin_size_w)); + + // Add roi offsets and clip to input boundaries, min(max(A, B), C); + hstart = hstart + roi_start_h > 0 ? hstart + roi_start_h : 0; + hstart = hstart < height ? hstart : height; + hend = hend + roi_start_h > 0 ? hend + roi_start_h : 0; + hend = hend < height ? hend : height; + wstart = wstart + roi_start_w > 0 ? wstart + roi_start_w : 0; + wstart = wstart < width ? wstart : width; + wend = wend + roi_start_w > 0 ? wend + roi_start_w : 0; + wend = wend < width ? wend : width; + + bool is_empty = (hend <= hstart) || (wend <= wstart); + if (!is_empty) { + int h_compute = hend - hstart; + int w_compute = wend - wstart; + int true_limit = + hw_limit < h_compute * w_compute ? hw_limit : h_compute * w_compute; + int loop_int = (h_compute * w_compute) / true_limit; + int rem = (h_compute * w_compute) % true_limit; + int32_t *nram_argmax = (int32_t *)nram_grads + align_c; + int32_t *nram_argmax_fp = (int32_t *)nram_argmax + align_c; + int32_t *nram_argmax_fp_bk1 = (int32_t *)nram_argmax_fp + align_c; + int32_t *nram_argmax_fp_bk2 = (int32_t *)nram_argmax_fp_bk1 + align_c; + int32_t *nram_argmax_int = (int32_t *)nram_argmax_fp_bk2 + align_c; + int32_t *nram_argmax_int_h = (int32_t *)nram_argmax_int + align_c; + int32_t *nram_argmax_int_w = (int32_t *)nram_argmax_int_h + align_c; + int32_t *nram_argmax_fp_h = (int32_t *)nram_argmax_int_w + align_c; + int32_t *nram_argmax_fp_w = (int32_t *)nram_argmax_fp_h + align_c; + float *nram_atomic_add = (float *)nram_argmax_fp_w + align_c; + float *nram_grads_image = (float *)nram_atomic_add + align_c; + if (true_limit == h_compute * w_compute) { + /* + * NRAM partition + * |---------------------------------------------------| + * | grads | + * |---------------------------------------------------| + * | argmax | + * |---------------------------------------------------| + * | argmax_temp | + * |---------------------------------------------------| + * | atomic_add | + * |---------------------------------------------------| + * | grads_image | + * |---------------------------------------------------| + */ + + // Load the data from GDRAM to NRAM. + __memcpy( + (T *)nram_grads + align_c * high_precision, + (const T *)grads + + (n * pooled_height * pooled_width + ph * pooled_width + pw) * + channels, + channels * sizeof(T), GDRAM2NRAM); + if (high_precision) { + __bang_half2float((float *)nram_grads, + (half *)nram_grads + align_c * high_precision, + align_c); + } + + __memcpy((int32_t *)nram_argmax, (const int32_t *)argmax + + (n * pooled_height * pooled_width + + ph * pooled_width + pw) * + channels, + channels * sizeof(int32_t), GDRAM2NRAM); + + // Perform pooling operation on NRAM. + convertIndex(nram_argmax, nram_argmax_fp, nram_argmax_fp_bk1, + nram_argmax_fp_bk2, nram_argmax_int, nram_argmax_int_h, + nram_argmax_int_w, nram_argmax_fp_h, nram_argmax_fp_w, + nram_atomic_add, nram_grads_image, width, height, wstart, + hstart, w_compute, h_compute, align_c, channels, 0, 0, 0); + __bang_maxpool_bp((float *)nram_grads_image, (float *)nram_grads, + (int32_t *)nram_argmax_int, align_c, h_compute, + w_compute, h_compute, w_compute, h_compute, + w_compute); + if (high_precision) { + __bang_float2half_rd((half *)nram_grads_image, + (float *)nram_grads_image, + h_compute * w_compute * align_c); + } + + // Store the result on NRAM back to GDRAM. + for (int hc = 0; hc < h_compute; ++hc) { + for (int wc = 0; wc < w_compute; ++wc) { + T *dst = (T *)nram_atomic_add; + int grad_image_offset = (roi_batch_ind * height * width + + (hc + hstart) * width + wc + wstart) * + channels; + T *src1 = (T *)grads_image + grad_image_offset; + int nram_grads_image_offset = (hc * w_compute + wc) * align_c; + T *src2 = (T *)nram_grads_image + nram_grads_image_offset; + __bang_atomic_add(dst, src1, src2, channels); + } + } + } else if (true_limit > 0) { + /* + * NRAM partition + * |---------------------------------------------------| + * | grads | + * |---------------------------------------------------| + * | argmax | + * |--------------------ping_pong----------------------| + * | argmax_temp | argmax_temp | + * |------------------------|--------------------------| + * | atomic_add | atomic_add | + * |------------------------|--------------------------| + * | grads_image | grads_image | + * |---------------------------------------------------| + */ + + // Load the data from GDRAM to NRAM. + __memcpy( + (T *)nram_grads + align_c * high_precision, + (const T *)grads + + (n * pooled_height * pooled_width + ph * pooled_width + pw) * + channels, + channels * sizeof(T), GDRAM2NRAM); + if (high_precision) { + __bang_half2float((float *)nram_grads, + (half *)nram_grads + align_c * high_precision, + align_c); + } + __memcpy((int32_t *)nram_argmax, (const int32_t *)argmax + + (n * pooled_height * pooled_width + + ph * pooled_width + pw) * + channels, + channels * sizeof(int32_t), GDRAM2NRAM); + + int ping_pong = 0; + int ping_pong_offset = + (MAX_NRAM_SIZE / sizeof(float) - align_c * PIPELINE_COMMON_NUM) / 2; + for (int loop_id = 0; loop_id <= loop_int; ++loop_id) { + int size = (loop_id == loop_int) ? rem : true_limit; + if (size == 0) { + break; + } + // Perform pooling operation on NRAM. + nram_argmax_fp = + (int32_t *)nram_argmax + align_c + ping_pong * ping_pong_offset; + nram_argmax_fp_bk1 = (int32_t *)nram_argmax_fp + align_c; + nram_argmax_fp_bk2 = (int32_t *)nram_argmax_fp_bk1 + align_c; + nram_argmax_int = (int32_t *)nram_argmax_fp_bk2 + align_c; + nram_argmax_int_h = (int32_t *)nram_argmax_int + align_c; + nram_argmax_int_w = (int32_t *)nram_argmax_int_h + align_c; + nram_argmax_fp_h = (int32_t *)nram_argmax_int_w + align_c; + nram_argmax_fp_w = (int32_t *)nram_argmax_fp_h + align_c; + nram_atomic_add = (float *)nram_argmax_fp_w + align_c; + nram_grads_image = (float *)nram_atomic_add + align_c; + int loop_id_1 = loop_id; + int size_1 = ((loop_id_1) == loop_int) ? rem : true_limit; + if (size_1 == 0) { + break; + } + convertIndex(nram_argmax, nram_argmax_fp, nram_argmax_fp_bk1, + nram_argmax_fp_bk2, nram_argmax_int, nram_argmax_int_h, + nram_argmax_int_w, nram_argmax_fp_h, nram_argmax_fp_w, + nram_atomic_add, nram_grads_image, width, height, wstart, + hstart, w_compute, h_compute, align_c, channels, 1, + loop_id_1, true_limit); + __bang_maxpool_bp((float *)nram_grads_image, (float *)nram_grads, + (int32_t *)nram_argmax_int, align_c, size_1, 1, + size_1, 1, size_1, 1); + if (high_precision) { + __bang_float2half_rd((half *)nram_grads_image, + (float *)nram_grads_image, size_1 * align_c); + } + + // Store the result on NRAM back to GDRAM. + for (int index_size = 0; index_size < size; ++index_size) { + int h = (loop_id * true_limit + index_size) / w_compute; + int w = (loop_id * true_limit + index_size) % w_compute; + T *dst = (T *)nram_atomic_add; + T *grads_image_n = + (T *)grads_image + roi_batch_ind * height * width * channels; + T *src1 = (T *)grads_image_n + + ((h + hstart) * width + (w + wstart)) * channels; + T *src2 = (T *)nram_grads_image + index_size * align_c; + __bang_atomic_add(dst, src1, src2, channels); + } + ping_pong = 1 - ping_pong; + } + } else { + /* + * NRAM partition + * |---------------------------------------------------| + * | grads | + * |---------------------------------------------------| + * | argmax | + * |--------------------ping_pong----------------------| + * | argmax_temp | argmax_temp | + * |------------------------|--------------------------| + * | atomic_add | atomic_add | + * |------------------------|--------------------------| + * | grads_image | grads_image | + * |---------------------------------------------------| + */ + + int c_limit = + PAD_DOWN(MAX_NRAM_SIZE / sizeof(float) / + (PIPELINE_COMMON_NUM + PIPELINE_PINGPONG_NUM * 2), + ALIGN_SIZE); + int loop_int = channels / c_limit; + int rem = channels % c_limit; + int ping_pong = 0; + int ping_pong_offset = + (MAX_NRAM_SIZE / sizeof(float) - c_limit * PIPELINE_COMMON_NUM) / 2; + for (int loop_id = 0; loop_id <= loop_int; ++loop_id) { + int size = (loop_id == loop_int) ? rem : c_limit; + if (size == 0) { + break; + } + nram_argmax_fp = + (int32_t *)nram_argmax + c_limit + ping_pong * ping_pong_offset; + nram_argmax_fp_bk1 = (int32_t *)nram_argmax_fp + c_limit; + nram_argmax_fp_bk2 = (int32_t *)nram_argmax_fp_bk1 + c_limit; + nram_argmax_int = (int32_t *)nram_argmax_fp_bk2 + c_limit; + nram_argmax_int_h = (int32_t *)nram_argmax_int + c_limit; + nram_argmax_int_w = (int32_t *)nram_argmax_int_h + c_limit; + nram_argmax_fp_h = (int32_t *)nram_argmax_int_w + c_limit; + nram_argmax_fp_w = (int32_t *)nram_argmax_fp_h + c_limit; + nram_atomic_add = (float *)nram_argmax_fp_w + c_limit; + nram_grads_image = (float *)nram_atomic_add + c_limit; + + // This pipeline loads the data from GDRAM to NRAM. + __memcpy((T *)nram_grads + c_limit * high_precision, + (const T *)grads + + n * pooled_height * pooled_width * channels + + ph * pooled_width * channels + pw * channels + + loop_id * c_limit, + size * sizeof(T), GDRAM2NRAM); + if (high_precision) { + __bang_half2float((float *)nram_grads, + (half *)nram_grads + c_limit * high_precision, + c_limit); + } + __memcpy((int32_t *)nram_argmax, + (const int32_t *)argmax + + n * pooled_height * pooled_width * channels + + ph * pooled_width * channels + pw * channels + + loop_id * c_limit, + size * sizeof(int32_t), GDRAM2NRAM); + + for (int hc = 0; hc < h_compute; ++hc) { + for (int wc = 0; wc < w_compute; ++wc) { + // This pipeline performs pooling operation on NRAM. + convertIndex( + nram_argmax, nram_argmax_fp, nram_argmax_fp_bk1, + nram_argmax_fp_bk2, nram_argmax_int, nram_argmax_int_h, + nram_argmax_int_w, nram_argmax_fp_h, nram_argmax_fp_w, + nram_atomic_add, nram_grads_image, width, height, wstart + wc, + hstart + hc, h_compute, w_compute, c_limit, size, 0, 0, 0); + __bang_maxpool_bp((float *)nram_grads_image, (float *)nram_grads, + (int32_t *)nram_argmax_int, c_limit, 1, 1, 1, 1, + 1, 1); + if (high_precision) { + __bang_float2half_rd((half *)nram_grads_image, + (float *)nram_grads_image, c_limit); + } + // This pipeline stores the result on NRAM back to GDRAM. + T *dst = (T *)nram_atomic_add; + T *grads_image_n = + (T *)grads_image + roi_batch_ind * height * width * channels; + T *src1 = (T *)grads_image_n + + ((hc + hstart) * width + (wc + wstart)) * channels + + loop_id * c_limit; + T *src2 = (T *)nram_grads_image; + __bang_atomic_add(dst, src1, src2, size); + } + } + ping_pong = 1 - ping_pong; + } + } + } + } +} + +__mlu_global__ void MLUKernelRoiPoolBackward( + const void *grads, const void *rois, const int *argmax, void *grads_image, + int rois_num, int pooled_height, int pooled_width, int channels, int no, + int height, int width, const float spatial_scale, + const cnrtDataType_t k_dtype) { + // make sure that memcore is not used + if (coreId == 0x80) { + return; + } + switch (k_dtype) { + case CNRT_FLOAT16: { + // Using the float type '__bang_max_pool_bp' instruction to increase the + // bit width. + const int high_precision = 1; + MLUUnion1Roipool((const half *)rois, (const half *)grads, + (const int32_t *)argmax, (half *)grads_image, channels, + height, width, pooled_height, pooled_width, rois_num, + (const half)spatial_scale, high_precision); + }; break; + case CNRT_FLOAT32: { + const int high_precision = 0; + MLUUnion1Roipool((const float *)rois, (const float *)grads, + (const int32_t *)argmax, (float *)grads_image, channels, + height, width, pooled_height, pooled_width, rois_num, + (const float)spatial_scale, high_precision); + }; break; + default: { break; } + } +} +} // namespace backward + +void KernelRoiPoolForward(cnrtDim3_t k_dim, cnrtFunctionType_t k_type, + cnrtQueue_t queue, cnrtDataType_t data_type, + const void *input_data, const void *input_rois, + const int batch, const int channels, const int height, + const int width, const int pooled_height, + const int pooled_width, const int rois_num, + const float spatial_scale, void *output_data, + int *argmax) { + forward::MLUKernelRoiPool<<>>( + data_type, input_data, input_rois, batch, channels, height, width, + pooled_height, pooled_width, rois_num, spatial_scale, output_data, + argmax); +} + +void KernelRoiPoolBackward(cnrtDim3_t k_dim, cnrtFunctionType_t k_type, + cnrtQueue_t queue, cnrtDataType_t k_dtype, + const void *grad_output_ptr, const void *rois_ptr, + const int *argmax_ptr, void *grad_input_ptr, + const int box_num, const int pooled_height, + const int pooled_width, const int channels, + const int batch, const int height, const int width, + const float spatial_scale) { + backward::MLUKernelRoiPoolBackward<<>>( + grad_output_ptr, rois_ptr, argmax_ptr, grad_input_ptr, box_num, + pooled_height, pooled_width, channels, batch, height, width, + spatial_scale, k_dtype); +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/roipoint_pool3d_large_boxes_num_mlu_kernel.mlu b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/roipoint_pool3d_large_boxes_num_mlu_kernel.mlu new file mode 100644 index 0000000000000000000000000000000000000000..58a15d876570dbfd897ee709133c55f302025a6a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/roipoint_pool3d_large_boxes_num_mlu_kernel.mlu @@ -0,0 +1,536 @@ +/************************************************************************* + * Copyright (C) 2022 Cambricon. + * + * OR IMPLIED, INCLUDING BUvoid NOKType LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENvoid SHALL THE AUTHORS OR COPYRIGHKType HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORvoid OR OTHERWISE, ARISING FROM, OUKType OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *************************************************************************/ + +#include "common_mlu_helper.hpp" + +/************************************************************************* + * + * NRAM partition: + * | boxes3d | ping points + pong points | aux_a ~ aux_f | + * | 7 * sizeof(T) | 6 * deal_num * sizeof(T) | 6 * deal_num * sizeof(T) | + * + *************************************************************************/ +#define TWELVE_SPLIT 12 + +__nram__ char nram_buffer[MAX_NRAM_SIZE]; + +template +__mlu_func__ void checkPointsInBox3d(const T *boxes3d, + const size_t deal_num, + T *x, + T *y, + T *z, + T *auxiliary_a, + T *auxiliary_b, + T *auxiliary_c, + T *auxiliary_d, + T *auxiliary_e, + T *auxiliary_f, + T *pts_assign) { + // param box3d: (cx, cy, cz, dx, dy, dz, rz) in LiDAR coordinate + T cx = boxes3d[0]; + T cy = boxes3d[1]; + T cz = boxes3d[2]; + T dx = boxes3d[3]; + T dy = boxes3d[4]; + T dz = boxes3d[5]; + T rz = boxes3d[6]; + // shift to the center since cz in box3d is the bottom center + cz += 0.5 * dz; + + T cosa = (T)std::cos(-rz); + T sina = (T)std::sin(-rz); + + // x - cx + __bang_sub_scalar((T *)auxiliary_a, (T *)x, (T)cx, deal_num); + // y - cy + __bang_sub_scalar((T *)auxiliary_b, (T *)y, (T)cy, deal_num); + // z - cz + __bang_sub_scalar((T *)auxiliary_c, (T *)z, (T)cz, deal_num); + // |z - cz| + __bang_active_abs((T *)auxiliary_c, (T *)auxiliary_c, deal_num); + // |z - cz| > dz / 2.0 +#if __BANG_ARCH__ >= 322 + __bang_gt_scalar((T *)auxiliary_c, (T *)auxiliary_c, (T)(0.5 * dz), deal_num); +#else + __bang_write_value((T *)auxiliary_d, deal_num, (T)(0.5 * dz)); + __bang_lt((T *)auxiliary_c, (T *)auxiliary_d, (T *)auxiliary_c, deal_num); +#endif + // !(|z - cz| > dz / 2.0) + __bang_not((T *)auxiliary_c, (T *)auxiliary_c, deal_num); + // (x - cx) * cos(-rz) + __bang_mul_scalar((T *)auxiliary_d, (T *)auxiliary_a, (T)cosa, deal_num); + // (y - cy) * sin(-rz) + __bang_mul_scalar((T *)auxiliary_e, (T *)auxiliary_b, (T)sina, deal_num); + // local_x = (x - cx) * cos(-rz) + (y - cy) * -sin(-rz) + __bang_sub((T *)auxiliary_d, (T *)auxiliary_d, (T *)auxiliary_e, deal_num); + // |local_x| + __bang_active_abs((T *)auxiliary_d, (T *)auxiliary_d, deal_num); + // |local_x| < dx / 2.0 +#if __BANG_ARCH__ >= 322 + __bang_lt_scalar(auxiliary_d, auxiliary_d, (T)(0.5 * dx), deal_num); +#else + __bang_write_value((T *)auxiliary_e, deal_num, (T)(0.5 * dx)); + __bang_gt((T *)auxiliary_d, (T *)auxiliary_e, (T *)auxiliary_d, deal_num); +#endif + // (x - cx) * sin(-rz) + __bang_mul_scalar((T *)auxiliary_e, (T *)auxiliary_a, (T)sina, deal_num); + // (y - cy) * cos(-rz) + __bang_mul_scalar((T *)auxiliary_f, (T *)auxiliary_b, (T)cosa, deal_num); + // local_y = (x - cx) * sin(-rz) + (y - cy) * cos(-rz) + __bang_add((T *)auxiliary_e, (T *)auxiliary_e, (T *)auxiliary_f, deal_num); + // |local_y| + __bang_active_abs((T *)auxiliary_e, (T *)auxiliary_e, deal_num); + // |local_y| < dy / 2.0 +#if __BANG_ARCH__ >= 322 + __bang_lt_scalar(auxiliary_e, auxiliary_e, (T)(0.5 * dy), deal_num); +#else + __bang_write_value((T *)auxiliary_f, deal_num, (T)(0.5 * dy)); + __bang_gt((T *)auxiliary_e, (T *)auxiliary_f, (T *)auxiliary_e, deal_num); +#endif + // pts_assign = |x - cx| < dx / 2.0 && |y - cy| < dy / 2.0 && |z - cz| <= dz / 2.0 + __bang_mul((T *)pts_assign, (T *)auxiliary_c, (T *)auxiliary_d, deal_num); + __bang_mul((T *)pts_assign, (T *)pts_assign, (T *)auxiliary_e, deal_num); +} + +template +__mlu_func__ void computeStoreRoipointPool3d(char *boxes3d, + int *cnt, + char *points_x, + char *points_y, + char *points_z, + const char *point_features, + char *auxiliary_a, + char *auxiliary_b, + char *auxiliary_c, + char *auxiliary_d, + char *auxiliary_e, + char *auxiliary_f, + const int box_idx, + const int pts_num, + const int feature_in_len, + const int sampled_pts_num, + const size_t span_num_deal, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram) { + char *pts_assign = auxiliary_a; + if (*cnt >= sampled_pts_num) { + return; + } + checkPointsInBox3d((T *)boxes3d, span_num_deal, (T *)points_x, (T *)points_y, (T *)points_z, + (T *)auxiliary_a, (T *)auxiliary_b, (T *)auxiliary_c, (T *)auxiliary_d, + (T *)auxiliary_e, (T *)auxiliary_f, (T *)pts_assign); + + // __bang_select returns selected elements vector and the number of selected elements + __bang_select((T *)auxiliary_b, (T *)points_x, (T *)pts_assign, span_num_deal); + uint32_t select_num = *((uint32_t *)auxiliary_b); + + if (select_num == 0) { + return; + } + int sampled_pts_num_rem = sampled_pts_num - *cnt; + int segnum = min((int)select_num, sampled_pts_num_rem) - 1; + + // copy x to pooled_features_gdram + // The result of __bang_select is composed of three parts: + // The first 4-byte is the number of selected element, whose data type is unsigned int. + // The next 124-byte is zero. The rest bytes are the selected elements. + int select_num_size = 128; + __memcpy( + pooled_features_gdram + (box_idx * sampled_pts_num + *cnt) * (3 + feature_in_len) * sizeof(T), + (T *)((int8_t *)auxiliary_b + select_num_size), sizeof(T), NRAM2GDRAM, + (3 + feature_in_len) * sizeof(T), sizeof(T), segnum); + + // copy y to pooled_features_gdram + __bang_collect((T *)auxiliary_d, (T *)points_y, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + *cnt) * (3 + feature_in_len) * sizeof(T) + + 1 * sizeof(T), + (T *)auxiliary_d, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + + // copy z to pooled_features_gdram + __bang_collect((T *)auxiliary_e, (T *)points_z, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + *cnt) * (3 + feature_in_len) * sizeof(T) + + 2 * sizeof(T), + (T *)auxiliary_e, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + + // copy features to pooled_features_gdram + for (int c_idx = 0; c_idx < feature_in_len; c_idx++) { + __memcpy(auxiliary_d, point_features + c_idx * pts_num * sizeof(T), span_num_deal * sizeof(T), + GDRAM2NRAM); + __bang_collect((T *)auxiliary_e, (T *)auxiliary_d, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + *cnt) * (3 + feature_in_len) * sizeof(T) + + (3 + c_idx) * sizeof(T), + auxiliary_e, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + } + + *cnt += select_num; +} + +template +__mlu_func__ void computeStoreLastBlockRoipointPool3d(char *boxes3d, + int *cnt, + char *points_x, + char *points_y, + char *points_z, + const char *point_features, + char *auxiliary_a, + char *auxiliary_b, + char *auxiliary_c, + char *auxiliary_d, + char *auxiliary_e, + char *auxiliary_f, + const int box_idx, + const int pts_num, + const int feature_in_len, + const int sampled_pts_num, + const size_t span_num_deal, + const size_t auxiliary_num_deal, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram) { + char *pts_assign = auxiliary_a; + if (*cnt >= sampled_pts_num) { + // pooled_empty_flag_gdram set 0 + *((int *)auxiliary_a) = 0; + __memcpy(pooled_empty_flag_gdram + box_idx * sizeof(int), auxiliary_a, sizeof(int), NRAM2GDRAM); + return; + } + checkPointsInBox3d((T *)boxes3d, span_num_deal, (T *)points_x, (T *)points_y, (T *)points_z, + (T *)auxiliary_a, (T *)auxiliary_b, (T *)auxiliary_c, (T *)auxiliary_d, + (T *)auxiliary_e, (T *)auxiliary_f, (T *)pts_assign); + + // __bang_select returns selected elements vector and the number of selected elements + __bang_select((T *)auxiliary_b, (T *)points_x, (T *)pts_assign, span_num_deal); + uint32_t select_num = *((uint32_t *)auxiliary_b); + + if (*cnt + select_num == 0) { + // pooled_empty_flag_gdram set 1 + *((int *)auxiliary_a) = 1; + __memcpy(pooled_empty_flag_gdram + box_idx * sizeof(int), auxiliary_a, sizeof(int), NRAM2GDRAM); + + // pooled_features_gdram set 0 + int repeat = (sampled_pts_num * (3 + feature_in_len)) / (auxiliary_num_deal * 6); + int rem = (sampled_pts_num * (3 + feature_in_len)) % (auxiliary_num_deal * 6); + // use auxiliary_a to auxiliary_f + __bang_write_zero((T *)auxiliary_a, PAD_UP(auxiliary_num_deal * 6, NFU_ALIGN_SIZE)); + if (repeat > 0) { + __memcpy(pooled_features_gdram + box_idx * sampled_pts_num * (3 + feature_in_len) * sizeof(T), + auxiliary_a, auxiliary_num_deal * 6 * sizeof(T), NRAM2GDRAM, + auxiliary_num_deal * 6 * sizeof(T), 0, repeat - 1); + } + if (rem > 0) { + __memcpy(pooled_features_gdram + + box_idx * sampled_pts_num * (3 + feature_in_len) * sizeof(T) + + repeat * auxiliary_num_deal * 6 * sizeof(T), + auxiliary_a, rem * sizeof(T), NRAM2GDRAM); + } + return; + } + + if (select_num > 0) { + int sampled_pts_num_rem = sampled_pts_num - *cnt; + int segnum = min((int)select_num, sampled_pts_num_rem) - 1; + + // copy x to pooled_features_gdram + // The result of __bang_select is composed of three parts: + // The first 4-byte is the number of selected element, whose data type is unsigned int. + // The next 124-byte is zero. The rest bytes are the selected elements. + int select_num_size = 128; + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + *cnt) * (3 + feature_in_len) * sizeof(T), + (T *)((int8_t *)auxiliary_b + select_num_size), sizeof(T), NRAM2GDRAM, + (3 + feature_in_len) * sizeof(T), sizeof(T), segnum); + + // copy y to pooled_features_gdram + __bang_collect((T *)auxiliary_d, (T *)points_y, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + *cnt) * (3 + feature_in_len) * sizeof(T) + + 1 * sizeof(T), + (T *)auxiliary_d, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + + // copy z to pooled_features_gdram + __bang_collect((T *)auxiliary_e, (T *)points_z, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + *cnt) * (3 + feature_in_len) * sizeof(T) + + 2 * sizeof(T), + (T *)auxiliary_e, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + + // copy features to pooled_features_gdram + for (int c_idx = 0; c_idx < feature_in_len; c_idx++) { + __memcpy(auxiliary_d, point_features + c_idx * pts_num * sizeof(T), span_num_deal * sizeof(T), + GDRAM2NRAM); + __bang_collect((T *)auxiliary_e, (T *)auxiliary_d, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + *cnt) * (3 + feature_in_len) * sizeof(T) + + (3 + c_idx) * sizeof(T), + auxiliary_e, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + } + } + + // pooled_empty_flag_gdram set 0 + *((int *)auxiliary_a) = 0; + __memcpy(pooled_empty_flag_gdram + box_idx * sizeof(int), auxiliary_a, sizeof(int), NRAM2GDRAM); + + *cnt += select_num; + if (*cnt < sampled_pts_num) { + // duplicate same points for sampling + int repeat = sampled_pts_num / (*cnt) - 1; + int rem = sampled_pts_num % (*cnt); + if (repeat > 0) { + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + *cnt) * (3 + feature_in_len) * sizeof(T), + pooled_features_gdram + box_idx * sampled_pts_num * (3 + feature_in_len) * sizeof(T), + (*cnt) * (3 + feature_in_len) * sizeof(T), GDRAM2GDRAM, + (*cnt) * (3 + feature_in_len) * sizeof(T), 0, repeat - 1); + } + if (rem > 0) { + __memcpy( + pooled_features_gdram + + (box_idx * sampled_pts_num + (repeat + 1) * (*cnt)) * (3 + feature_in_len) * + sizeof(T), + pooled_features_gdram + box_idx * sampled_pts_num * (3 + feature_in_len) * sizeof(T), + rem * (3 + feature_in_len) * sizeof(T), GDRAM2GDRAM); + } + } +} + +template +__mlu_global__ void MLUUnion1KernelRoiPointPool3dLargeBoxesNumForward( + const int batch_size, + const int pts_num, + const int boxes_num, + const int feature_in_len, + const int sampled_pts_num, + const char *points_xyz_gdram, + const char *point_features_gdram, + const char *boxes3d_gdram, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram) { + if (coreId == 0x80) { + return; + } + size_t boxes_per_core = (batch_size * boxes_num) / taskDim; + size_t boxes_rem = (batch_size * boxes_num) % taskDim; + // calc batch_start, batch_end, first_batch_box_start, last batch_box_end for each core + int32_t batch_start = taskId < (boxes_rem + 1) ? + (taskId * (boxes_per_core + 1)) / boxes_num : + (taskId * boxes_per_core + boxes_rem) / boxes_num; + int32_t batch_end = taskId < boxes_rem ? + ((taskId + 1) * (boxes_per_core + 1) - 1) / boxes_num : + ((taskId + 1) * boxes_per_core + boxes_rem - 1) / boxes_num; + size_t first_batch_box_start = taskId < (boxes_rem + 1) ? + (taskId * (boxes_per_core + 1)) - batch_start * boxes_num : + taskId * boxes_per_core + boxes_rem - batch_start * boxes_num; + size_t last_batch_box_end = taskId < boxes_rem ? + (taskId + 1) * (boxes_per_core + 1) - batch_end * boxes_num : + ((taskId + 1) * boxes_per_core + boxes_rem) - batch_end * boxes_num; + + // points_xyz : [3, B, N] + const char *points_x_gdram = points_xyz_gdram; + const char *points_y_gdram = points_xyz_gdram + (1 * batch_size * pts_num) * sizeof(T); + const char *points_z_gdram = points_xyz_gdram + (2 * batch_size * pts_num) * sizeof(T); + + size_t boxes3d_size = PAD_UP(7, NFU_ALIGN_SIZE) * sizeof(T); + size_t span_num_deal = PAD_DOWN(MAX_NRAM_SIZE / TWELVE_SPLIT / sizeof(T), NFU_ALIGN_SIZE); + size_t align_num = NFU_ALIGN_SIZE; + int32_t repeat = pts_num / span_num_deal; + size_t rem = pts_num % span_num_deal; + size_t align_rem = CEIL_ALIGN(rem, align_num); + char *boxes3d = nram_buffer; + char *ping_points_x = nram_buffer + boxes3d_size; + char *ping_points_y = ping_points_x + span_num_deal * sizeof(T); + char *ping_points_z = ping_points_y + span_num_deal * sizeof(T); + size_t ping_pong_gap = 3 * span_num_deal * sizeof(T); + char *auxiliary_a = ping_points_x + 2 * ping_pong_gap; + char *auxiliary_b = auxiliary_a + span_num_deal * sizeof(T); + char *auxiliary_c = auxiliary_b + span_num_deal * sizeof(T); + char *auxiliary_d = auxiliary_c + span_num_deal * sizeof(T); + char *auxiliary_e = auxiliary_d + span_num_deal * sizeof(T); + char *auxiliary_f = auxiliary_e + span_num_deal * sizeof(T); + size_t span_load_input1_size = span_num_deal * sizeof(T); + size_t span_load_input2_size = span_num_deal * sizeof(T); + size_t span_load_input3_size = span_num_deal * sizeof(T); + size_t span_load_input4_size = span_num_deal * sizeof(T); + int cnt = 0; + + for (int bs_idx = batch_start; bs_idx <= batch_end; bs_idx++) { + const char *points_x_start = points_x_gdram + bs_idx * pts_num * sizeof(T); + const char *points_y_start = points_y_gdram + bs_idx * pts_num * sizeof(T); + const char *points_z_start = points_z_gdram + bs_idx * pts_num * sizeof(T); + const char *point_features_start = + point_features_gdram + bs_idx * feature_in_len * pts_num * sizeof(T); + char *pooled_features_start = + pooled_features_gdram + + (bs_idx * boxes_num * sampled_pts_num * (3 + feature_in_len)) * sizeof(T); + char *pooled_empty_flag_start = pooled_empty_flag_gdram + bs_idx * boxes_num * sizeof(int); + size_t box_start = bs_idx == batch_start ? first_batch_box_start : 0; + size_t box_end = bs_idx == batch_end ? last_batch_box_end : boxes_num; + + for (int box_idx = box_start; box_idx < box_end; box_idx++) { + __memcpy_async(boxes3d, + boxes3d_gdram + bs_idx * boxes_num * 7 * sizeof(T) + box_idx * 7 * sizeof(T), + 7 * sizeof(T), GDRAM2NRAM); + cnt = 0; + if (repeat > 0) { + __memcpy_async(ping_points_x, points_x_start, span_load_input1_size, GDRAM2NRAM); + __memcpy_async(ping_points_y, points_y_start, span_load_input2_size, GDRAM2NRAM); + __memcpy_async(ping_points_z, points_z_start, span_load_input3_size, GDRAM2NRAM); + __asm__ volatile("sync;"); + } + + for (int i = 0; i < repeat - 1; i++) { + __memcpy_async(ping_points_x + ((i + 1) % 2) * ping_pong_gap, + points_x_start + (i + 1) * span_load_input1_size, span_load_input1_size, + GDRAM2NRAM); + __memcpy_async(ping_points_y + ((i + 1) % 2) * ping_pong_gap, + points_y_start + (i + 1) * span_load_input2_size, span_load_input2_size, + GDRAM2NRAM); + __memcpy_async(ping_points_z + ((i + 1) % 2) * ping_pong_gap, + points_z_start + (i + 1) * span_load_input3_size, span_load_input3_size, + GDRAM2NRAM); + computeStoreRoipointPool3d( + boxes3d, &cnt, ping_points_x + (i % 2) * ping_pong_gap, + ping_points_y + (i % 2) * ping_pong_gap, ping_points_z + (i % 2) * ping_pong_gap, + point_features_start + i * span_load_input4_size, auxiliary_a, auxiliary_b, auxiliary_c, + auxiliary_d, auxiliary_e, auxiliary_f, box_idx, pts_num, feature_in_len, + sampled_pts_num, span_num_deal, pooled_features_start, pooled_empty_flag_start); + __asm__ volatile("sync;"); + } + + if (rem > 0) { + if (sizeof(T) == sizeof(float)) { + __bang_write_value((T *)(ping_points_x + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + __bang_write_value((T *)(ping_points_y + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + __bang_write_value((T *)(ping_points_z + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + } else { + __bang_write_value((T *)(ping_points_x + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + __bang_write_value((T *)(ping_points_y + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + __bang_write_value((T *)(ping_points_z + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + } + __memcpy_async(ping_points_x + (repeat % 2) * ping_pong_gap, + points_x_start + repeat * span_load_input1_size, rem * sizeof(T), + GDRAM2NRAM); + __memcpy_async(ping_points_y + (repeat % 2) * ping_pong_gap, + points_y_start + repeat * span_load_input2_size, rem * sizeof(T), + GDRAM2NRAM); + __memcpy_async(ping_points_z + (repeat % 2) * ping_pong_gap, + points_z_start + repeat * span_load_input3_size, rem * sizeof(T), + GDRAM2NRAM); + } + + if (repeat > 0 && rem > 0) { + computeStoreRoipointPool3d( + boxes3d, &cnt, ping_points_x + ((repeat - 1) % 2) * ping_pong_gap, + ping_points_y + ((repeat - 1) % 2) * ping_pong_gap, + ping_points_z + ((repeat - 1) % 2) * ping_pong_gap, + point_features_start + (repeat - 1) * span_load_input4_size, auxiliary_a, auxiliary_b, + auxiliary_c, auxiliary_d, auxiliary_e, auxiliary_f, box_idx, pts_num, feature_in_len, + sampled_pts_num, span_num_deal, pooled_features_start, pooled_empty_flag_start); + } else if (repeat > 0 && rem == 0) { + computeStoreLastBlockRoipointPool3d( + boxes3d, &cnt, ping_points_x + ((repeat - 1) % 2) * ping_pong_gap, + ping_points_y + ((repeat - 1) % 2) * ping_pong_gap, + ping_points_z + ((repeat - 1) % 2) * ping_pong_gap, + point_features_start + (repeat - 1) * span_load_input4_size, auxiliary_a, auxiliary_b, + auxiliary_c, auxiliary_d, auxiliary_e, auxiliary_f, box_idx, pts_num, feature_in_len, + sampled_pts_num, span_num_deal, span_num_deal, pooled_features_start, + pooled_empty_flag_start); + } + + if (rem > 0) { + __asm__ volatile("sync;"); + computeStoreLastBlockRoipointPool3d( + boxes3d, &cnt, ping_points_x + (repeat % 2) * ping_pong_gap, + ping_points_y + (repeat % 2) * ping_pong_gap, + ping_points_z + (repeat % 2) * ping_pong_gap, + point_features_start + repeat * span_load_input4_size, auxiliary_a, auxiliary_b, + auxiliary_c, auxiliary_d, auxiliary_e, auxiliary_f, box_idx, pts_num, feature_in_len, + sampled_pts_num, align_rem, span_num_deal, pooled_features_start, + pooled_empty_flag_start); + } + } + } +} + +template __mlu_global__ void MLUUnion1KernelRoiPointPool3dLargeBoxesNumForward( + const int batch_size, + const int pts_num, + const int boxes_num, + const int feature_in_len, + const int sampled_pts_num, + const char *points_xyz_gdram, + const char *point_features_gdram, + const char *boxes3d_gdram, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram); + +template __mlu_global__ void MLUUnion1KernelRoiPointPool3dLargeBoxesNumForward( + const int batch_size, + const int pts_num, + const int boxes_num, + const int feature_in_len, + const int sampled_pts_num, + const char *points_xyz_gdram, + const char *point_features_gdram, + const char *boxes3d_gdram, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram); + +void KernelRoiPointPool3dLargeBoxesNumForward(cnrtDim3_t k_dim, + cnrtFunctionType_t k_type, + cnrtQueue_t queue, + const cnrtDataType_t d_type, + const int batch_size, + const int pts_num, + const int boxes_num, + const int feature_in_len, + const int sampled_pts_num, + const void *points_xyz, + const void *boxes3d, + const void *point_features, + void *pooled_features, + int *pooled_empty_flag) { + switch (d_type) { + default: { break; } + case CNRT_FLOAT32: { + MLUUnion1KernelRoiPointPool3dLargeBoxesNumForward<<>>( + batch_size, pts_num, boxes_num, feature_in_len, sampled_pts_num, + (char *)points_xyz, (char *)point_features, (char *)boxes3d, + (char *)pooled_features, (char *)pooled_empty_flag); + }; break; + case CNRT_FLOAT16: { + MLUUnion1KernelRoiPointPool3dLargeBoxesNumForward<<>>( + batch_size, pts_num, boxes_num, feature_in_len, sampled_pts_num, + (char *)points_xyz, (char *)point_features, (char *)boxes3d, + (char *)pooled_features, (char *)pooled_empty_flag); + }; break; + } +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/roipoint_pool3d_mlu_kernel.mlu b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/roipoint_pool3d_mlu_kernel.mlu new file mode 100644 index 0000000000000000000000000000000000000000..f16d84047d3dfd3648ca788055acad75829317f6 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/roipoint_pool3d_mlu_kernel.mlu @@ -0,0 +1,544 @@ +/************************************************************************* + * Copyright (C) 2022 Cambricon. + * + * OR IMPLIED, INCLUDING BUvoid NOKType LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENvoid SHALL THE AUTHORS OR COPYRIGHKType HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORvoid OR OTHERWISE, ARISING FROM, OUKType OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *************************************************************************/ + +#include "common_mlu_helper.hpp" + +/************************************************************************************** + * + * NRAM partition: + * | boxes3d | cnt | + * | boxes_num * 7 * sizeof(T) | boxes_num * sizeof(int) | + * + * | ping points | pong points | aux_a ~ aux_f | + * | 3 * deal_num * sizeof(T) | 3 * deal_num * sizeof(T) | 6 * deal_num * sizeof(T) | + * + ***************************************************************************************/ +#define TWELVE_SPLIT 12 + +__nram__ char nram_buffer[MAX_NRAM_SIZE]; + +template +__mlu_func__ void checkPointsInBox3d(const T *boxes3d, + const size_t deal_num, + T *x, + T *y, + T *z, + T *auxiliary_a, + T *auxiliary_b, + T *auxiliary_c, + T *auxiliary_d, + T *auxiliary_e, + T *auxiliary_f, + T *pts_assign) { + // param box3d: (cx, cy, cz, dx, dy, dz, rz) in LiDAR coordinate + T cx = boxes3d[0]; + T cy = boxes3d[1]; + T cz = boxes3d[2]; + T dx = boxes3d[3]; + T dy = boxes3d[4]; + T dz = boxes3d[5]; + T rz = boxes3d[6]; + // shift to the center since cz in box3d is the bottom center + cz += 0.5 * dz; + + T cosa = (T)std::cos(-rz); + T sina = (T)std::sin(-rz); + + // x - cx + __bang_sub_scalar((T *)auxiliary_a, (T *)x, (T)cx, deal_num); + // y - cy + __bang_sub_scalar((T *)auxiliary_b, (T *)y, (T)cy, deal_num); + // z - cz + __bang_sub_scalar((T *)auxiliary_c, (T *)z, (T)cz, deal_num); + // |z - cz| + __bang_active_abs((T *)auxiliary_c, (T *)auxiliary_c, deal_num); + // |z - cz| > dz / 2.0 +#if __BANG_ARCH__ >= 322 + __bang_gt_scalar((T *)auxiliary_c, (T *)auxiliary_c, (T)(0.5 * dz), deal_num); +#else + __bang_write_value((T *)auxiliary_d, deal_num, (T)(0.5 * dz)); + __bang_lt((T *)auxiliary_c, (T *)auxiliary_d, (T *)auxiliary_c, deal_num); +#endif + // !(|z - cz| > dz / 2.0) + __bang_not((T *)auxiliary_c, (T *)auxiliary_c, deal_num); + // (x - cx) * cos(-rz) + __bang_mul_scalar((T *)auxiliary_d, (T *)auxiliary_a, (T)cosa, deal_num); + // (y - cy) * sin(-rz) + __bang_mul_scalar((T *)auxiliary_e, (T *)auxiliary_b, (T)sina, deal_num); + // local_x = (x - cx) * cos(-rz) + (y - cy) * -sin(-rz) + __bang_sub((T *)auxiliary_d, (T *)auxiliary_d, (T *)auxiliary_e, deal_num); + // |local_x| + __bang_active_abs((T *)auxiliary_d, (T *)auxiliary_d, deal_num); + // |local_x| < dx / 2.0 +#if __BANG_ARCH__ >= 322 + __bang_lt_scalar(auxiliary_d, auxiliary_d, (T)(0.5 * dx), deal_num); +#else + __bang_write_value((T *)auxiliary_e, deal_num, (T)(0.5 * dx)); + __bang_gt((T *)auxiliary_d, (T *)auxiliary_e, (T *)auxiliary_d, deal_num); +#endif + // (x - cx) * sin(-rz) + __bang_mul_scalar((T *)auxiliary_e, (T *)auxiliary_a, (T)sina, deal_num); + // (y - cy) * cos(-rz) + __bang_mul_scalar((T *)auxiliary_f, (T *)auxiliary_b, (T)cosa, deal_num); + // local_y = (x - cx) * sin(-rz) + (y - cy) * cos(-rz) + __bang_add((T *)auxiliary_e, (T *)auxiliary_e, (T *)auxiliary_f, deal_num); + // |local_y| + __bang_active_abs((T *)auxiliary_e, (T *)auxiliary_e, deal_num); + // |local_y| < dy / 2.0 +#if __BANG_ARCH__ >= 322 + __bang_lt_scalar(auxiliary_e, auxiliary_e, (T)(0.5 * dy), deal_num); +#else + __bang_write_value((T *)auxiliary_f, deal_num, (T)(0.5 * dy)); + __bang_gt((T *)auxiliary_e, (T *)auxiliary_f, (T *)auxiliary_e, deal_num); +#endif + // pts_assign = |x - cx| < dx / 2.0 && |y - cy| < dy / 2.0 && |z - cz| <= dz / 2.0 + __bang_mul((T *)pts_assign, (T *)auxiliary_c, (T *)auxiliary_d, deal_num); + __bang_mul((T *)pts_assign, (T *)pts_assign, (T *)auxiliary_e, deal_num); +} + +template +__mlu_func__ void computeStoreRoipointPool3d(char *boxes3d, + int *cnt, + char *points_x, + char *points_y, + char *points_z, + const char *point_features, + char *auxiliary_a, + char *auxiliary_b, + char *auxiliary_c, + char *auxiliary_d, + char *auxiliary_e, + char *auxiliary_f, + const int box_idx, + const int pts_num, + const int feature_in_len, + const int sampled_pts_num, + const size_t span_num_deal, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram) { + char *pts_assign = auxiliary_a; + if (cnt[box_idx] >= sampled_pts_num) { + return; + } + checkPointsInBox3d((T *)(boxes3d + box_idx * 7 * sizeof(T)), span_num_deal, (T *)points_x, + (T *)points_y, (T *)points_z, (T *)auxiliary_a, (T *)auxiliary_b, + (T *)auxiliary_c, (T *)auxiliary_d, (T *)auxiliary_e, (T *)auxiliary_f, + (T *)pts_assign); + + // __bang_select returns selected elements vector and the number of selected elements + __bang_select((T *)auxiliary_b, (T *)points_x, (T *)pts_assign, span_num_deal); + uint32_t select_num = *((uint32_t *)auxiliary_b); + + if (select_num == 0) { + return; + } + int sampled_pts_num_rem = sampled_pts_num - cnt[box_idx]; + int segnum = min((int)select_num, sampled_pts_num_rem) - 1; + + // copy x to pooled_features_gdram + // The result of __bang_select is composed of three parts: + // The first 4-byte is the number of selected element, whose data type is unsigned int. + // The next 124-byte is zero. The rest bytes are the selected elements. + int select_num_size = 128; + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + cnt[box_idx]) * (3 + feature_in_len) * sizeof(T), + (T *)((int8_t *)auxiliary_b + select_num_size), sizeof(T), NRAM2GDRAM, + (3 + feature_in_len) * sizeof(T), sizeof(T), segnum); + + // copy y to pooled_features_gdram + __bang_collect((T *)auxiliary_d, (T *)points_y, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + cnt[box_idx]) * (3 + feature_in_len) * sizeof(T) + + 1 * sizeof(T), + (T *)auxiliary_d, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + + // copy z to pooled_features_gdram + __bang_collect((T *)auxiliary_e, (T *)points_z, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + cnt[box_idx]) * (3 + feature_in_len) * sizeof(T) + + 2 * sizeof(T), + (T *)auxiliary_e, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + + // copy features to pooled_features_gdram + for (int c_idx = 0; c_idx < feature_in_len; c_idx++) { + __memcpy(auxiliary_d, point_features + c_idx * pts_num * sizeof(T), span_num_deal * sizeof(T), + GDRAM2NRAM); + __bang_collect((T *)auxiliary_e, (T *)auxiliary_d, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + cnt[box_idx]) * (3 + feature_in_len) * sizeof(T) + + (3 + c_idx) * sizeof(T), + auxiliary_e, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + } + + cnt[box_idx] += select_num; +} + +template +__mlu_func__ void computeStoreLastBlockRoipointPool3d(char *boxes3d, + int *cnt, + char *points_x, + char *points_y, + char *points_z, + const char *point_features, + char *auxiliary_a, + char *auxiliary_b, + char *auxiliary_c, + char *auxiliary_d, + char *auxiliary_e, + char *auxiliary_f, + const int box_idx, + const int pts_num, + const int feature_in_len, + const int sampled_pts_num, + const size_t span_num_deal, + const size_t auxiliary_num_deal, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram) { + char *pts_assign = auxiliary_a; + if (cnt[box_idx] >= sampled_pts_num) { + // pooled_empty_flag_gdram set 0 + *((int *)auxiliary_a) = 0; + __memcpy(pooled_empty_flag_gdram + box_idx * sizeof(int), auxiliary_a, sizeof(int), NRAM2GDRAM); + return; + } + checkPointsInBox3d((T *)(boxes3d + box_idx * 7 * sizeof(T)), span_num_deal, (T *)points_x, + (T *)points_y, (T *)points_z, (T *)auxiliary_a, (T *)auxiliary_b, + (T *)auxiliary_c, (T *)auxiliary_d, (T *)auxiliary_e, (T *)auxiliary_f, + (T *)pts_assign); + + // __bang_select returns selected elements vector and the number of selected elements + __bang_select((T *)auxiliary_b, (T *)points_x, (T *)pts_assign, span_num_deal); + uint32_t select_num = *((uint32_t *)auxiliary_b); + + if (cnt[box_idx] + select_num == 0) { + // pooled_empty_flag_gdram set 1 + *((int *)auxiliary_a) = 1; + __memcpy(pooled_empty_flag_gdram + box_idx * sizeof(int), auxiliary_a, sizeof(int), NRAM2GDRAM); + + // pooled_features_gdram set 0 + int repeat = (sampled_pts_num * (3 + feature_in_len)) / (auxiliary_num_deal * 6); + int rem = (sampled_pts_num * (3 + feature_in_len)) % (auxiliary_num_deal * 6); + // use auxiliary_a to auxiliary_f + __bang_write_zero((T *)auxiliary_a, PAD_UP(auxiliary_num_deal * 6, NFU_ALIGN_SIZE)); + if (repeat > 0) { + __memcpy(pooled_features_gdram + box_idx * sampled_pts_num * (3 + feature_in_len) * sizeof(T), + auxiliary_a, auxiliary_num_deal * 6 * sizeof(T), NRAM2GDRAM, + auxiliary_num_deal * 6 * sizeof(T), 0, repeat - 1); + } + if (rem > 0) { + __memcpy(pooled_features_gdram + + box_idx * sampled_pts_num * (3 + feature_in_len) * sizeof(T) + + repeat * auxiliary_num_deal * 6 * sizeof(T), + auxiliary_a, rem * sizeof(T), NRAM2GDRAM); + } + return; + } + + if (select_num > 0) { + int sampled_pts_num_rem = sampled_pts_num - cnt[box_idx]; + int segnum = min((int)select_num, sampled_pts_num_rem) - 1; + + // copy x to pooled_features_gdram + // The result of __bang_select is composed of three parts: + // The first 4-byte is the number of selected element, whose data type is unsigned int. + // The next 124-byte is zero. The rest bytes are the selected elements. + int select_num_size = 128; + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + cnt[box_idx]) * (3 + feature_in_len) * sizeof(T), + (T *)((int8_t *)auxiliary_b + select_num_size), sizeof(T), NRAM2GDRAM, + (3 + feature_in_len) * sizeof(T), sizeof(T), segnum); + + // copy y to pooled_features_gdram + __bang_collect((T *)auxiliary_d, (T *)points_y, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + cnt[box_idx]) * (3 + feature_in_len) * sizeof(T) + + 1 * sizeof(T), + (T *)auxiliary_d, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + + // copy z to pooled_features_gdram + __bang_collect((T *)auxiliary_e, (T *)points_z, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + cnt[box_idx]) * (3 + feature_in_len) * sizeof(T) + + 2 * sizeof(T), + (T *)auxiliary_e, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + + // copy features to pooled_features_gdram + for (int c_idx = 0; c_idx < feature_in_len; c_idx++) { + __memcpy(auxiliary_d, point_features + c_idx * pts_num * sizeof(T), span_num_deal * sizeof(T), + GDRAM2NRAM); + __bang_collect((T *)auxiliary_e, (T *)auxiliary_d, (T *)pts_assign, span_num_deal); + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + cnt[box_idx]) * (3 + feature_in_len) * sizeof(T) + + (3 + c_idx) * sizeof(T), + auxiliary_e, sizeof(T), NRAM2GDRAM, (3 + feature_in_len) * sizeof(T), sizeof(T), + segnum); + } + } + + // pooled_empty_flag_gdram set 0 + *((int *)auxiliary_a) = 0; + __memcpy(pooled_empty_flag_gdram + box_idx * sizeof(int), auxiliary_a, sizeof(int), NRAM2GDRAM); + + cnt[box_idx] += select_num; + if (cnt[box_idx] < sampled_pts_num) { + // duplicate same points for sampling + int repeat = sampled_pts_num / cnt[box_idx] - 1; + int rem = sampled_pts_num % cnt[box_idx]; + if (repeat > 0) { + __memcpy(pooled_features_gdram + + (box_idx * sampled_pts_num + cnt[box_idx]) * (3 + feature_in_len) * sizeof(T), + pooled_features_gdram + box_idx * sampled_pts_num * (3 + feature_in_len) * sizeof(T), + cnt[box_idx] * (3 + feature_in_len) * sizeof(T), GDRAM2GDRAM, + cnt[box_idx] * (3 + feature_in_len) * sizeof(T), 0, repeat - 1); + } + if (rem > 0) { + __memcpy(pooled_features_gdram + (box_idx * sampled_pts_num + (repeat + 1) * cnt[box_idx]) * + (3 + feature_in_len) * sizeof(T), + pooled_features_gdram + box_idx * sampled_pts_num * (3 + feature_in_len) * sizeof(T), + rem * (3 + feature_in_len) * sizeof(T), GDRAM2GDRAM); + } + } +} + +template +__mlu_global__ void MLUUnion1KernelRoiPointPool3dForward( + const int batch_size, + const int pts_num, + const int boxes_num, + const int feature_in_len, + const int sampled_pts_num, + const char *points_xyz_gdram, + const char *point_features_gdram, + const char *boxes3d_gdram, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram) { + if (coreId == 0x80) { + return; + } + size_t boxes_per_core = (batch_size * boxes_num) / taskDim; + size_t boxes_rem = (batch_size * boxes_num) % taskDim; + // calc batch_start, batch_end, first_batch_box_start, last batch_box_end for each core + int32_t batch_start = taskId < (boxes_rem + 1) ? + (taskId * (boxes_per_core + 1)) / boxes_num : + (taskId * boxes_per_core + boxes_rem) / boxes_num; + int32_t batch_end = taskId < boxes_rem ? + ((taskId + 1) * (boxes_per_core + 1) - 1) / boxes_num : + ((taskId + 1) * boxes_per_core + boxes_rem - 1) / boxes_num; + size_t first_batch_box_start = taskId < (boxes_rem + 1) ? + (taskId * (boxes_per_core + 1)) - batch_start * boxes_num : + taskId * boxes_per_core + boxes_rem - batch_start * boxes_num; + size_t last_batch_box_end = taskId < boxes_rem ? + (taskId + 1) * (boxes_per_core + 1) - batch_end * boxes_num : + ((taskId + 1) * boxes_per_core + boxes_rem) - batch_end * boxes_num; + + // points_xyz : [3, B, N] + const char *points_x_gdram = points_xyz_gdram; + const char *points_y_gdram = points_xyz_gdram + (1 * batch_size * pts_num) * sizeof(T); + const char *points_z_gdram = points_xyz_gdram + (2 * batch_size * pts_num) * sizeof(T); + + size_t boxes3d_size = PAD_UP(boxes_num * 7, NFU_ALIGN_SIZE) * sizeof(T); + size_t cnt_size = PAD_UP(boxes_num, NFU_ALIGN_SIZE) * sizeof(int); + size_t span_num_deal = PAD_DOWN( + (MAX_NRAM_SIZE - boxes3d_size - cnt_size) / TWELVE_SPLIT / sizeof(T), NFU_ALIGN_SIZE); + size_t align_num = NFU_ALIGN_SIZE; + int32_t repeat = pts_num / span_num_deal; + size_t rem = pts_num % span_num_deal; + size_t align_rem = CEIL_ALIGN(rem, align_num); + char *boxes3d = nram_buffer; + char *cnt = nram_buffer + boxes3d_size; + char *ping_points_x = cnt + cnt_size; + char *ping_points_y = ping_points_x + span_num_deal * sizeof(T); + char *ping_points_z = ping_points_y + span_num_deal * sizeof(T); + size_t ping_pong_gap = 3 * span_num_deal * sizeof(T); + char *auxiliary_a = ping_points_x + 2 * ping_pong_gap; + char *auxiliary_b = auxiliary_a + span_num_deal * sizeof(T); + char *auxiliary_c = auxiliary_b + span_num_deal * sizeof(T); + char *auxiliary_d = auxiliary_c + span_num_deal * sizeof(T); + char *auxiliary_e = auxiliary_d + span_num_deal * sizeof(T); + char *auxiliary_f = auxiliary_e + span_num_deal * sizeof(T); + size_t span_load_input1_size = span_num_deal * sizeof(T); + size_t span_load_input2_size = span_num_deal * sizeof(T); + size_t span_load_input3_size = span_num_deal * sizeof(T); + size_t span_load_input4_size = span_num_deal * sizeof(T); + + for (int bs_idx = batch_start; bs_idx <= batch_end; bs_idx++) { + __memcpy_async(boxes3d, boxes3d_gdram + bs_idx * boxes_num * 7 * sizeof(T), + boxes_num * 7 * sizeof(T), GDRAM2NRAM); + __bang_write_zero((int *)cnt, PAD_UP(boxes_num, NFU_ALIGN_SIZE)); + + const char *points_x_start = points_x_gdram + bs_idx * pts_num * sizeof(T); + const char *points_y_start = points_y_gdram + bs_idx * pts_num * sizeof(T); + const char *points_z_start = points_z_gdram + bs_idx * pts_num * sizeof(T); + const char *point_features_start = + point_features_gdram + bs_idx * feature_in_len * pts_num * sizeof(T); + char *pooled_features_start = + pooled_features_gdram + + (bs_idx * boxes_num * sampled_pts_num * (3 + feature_in_len)) * sizeof(T); + char *pooled_empty_flag_start = pooled_empty_flag_gdram + bs_idx * boxes_num * sizeof(int); + size_t box_start = bs_idx == batch_start ? first_batch_box_start : 0; + size_t box_end = bs_idx == batch_end ? last_batch_box_end : boxes_num; + + if (repeat > 0) { + __memcpy_async(ping_points_x, points_x_start, span_load_input1_size, GDRAM2NRAM); + __memcpy_async(ping_points_y, points_y_start, span_load_input2_size, GDRAM2NRAM); + __memcpy_async(ping_points_z, points_z_start, span_load_input3_size, GDRAM2NRAM); + __asm__ volatile("sync;"); + } + + for (int i = 0; i < repeat - 1; i++) { + __memcpy_async(ping_points_x + ((i + 1) % 2) * ping_pong_gap, + points_x_start + (i + 1) * span_load_input1_size, span_load_input1_size, + GDRAM2NRAM); + __memcpy_async(ping_points_y + ((i + 1) % 2) * ping_pong_gap, + points_y_start + (i + 1) * span_load_input2_size, span_load_input2_size, + GDRAM2NRAM); + __memcpy_async(ping_points_z + ((i + 1) % 2) * ping_pong_gap, + points_z_start + (i + 1) * span_load_input3_size, span_load_input3_size, + GDRAM2NRAM); + for (int box_idx = box_start; box_idx < box_end; box_idx++) { + computeStoreRoipointPool3d( + boxes3d, (int *)cnt, ping_points_x + (i % 2) * ping_pong_gap, + ping_points_y + (i % 2) * ping_pong_gap, ping_points_z + (i % 2) * ping_pong_gap, + point_features_start + i * span_load_input4_size, auxiliary_a, auxiliary_b, auxiliary_c, + auxiliary_d, auxiliary_e, auxiliary_f, box_idx, pts_num, feature_in_len, + sampled_pts_num, span_num_deal, pooled_features_start, pooled_empty_flag_start); + } + __asm__ volatile("sync;"); + } + + if (rem > 0) { + if (sizeof(T) == sizeof(float)) { + __bang_write_value((T *)(ping_points_x + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + __bang_write_value((T *)(ping_points_y + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + __bang_write_value((T *)(ping_points_z + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + } else { + __bang_write_value((T *)(ping_points_x + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + __bang_write_value((T *)(ping_points_y + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + __bang_write_value((T *)(ping_points_z + (repeat % 2) * ping_pong_gap + + PAD_DOWN(rem, NFU_ALIGN_SIZE) * sizeof(T)), + NFU_ALIGN_SIZE, (T)NAN); + } + __memcpy_async(ping_points_x + (repeat % 2) * ping_pong_gap, + points_x_start + repeat * span_load_input1_size, rem * sizeof(T), GDRAM2NRAM); + __memcpy_async(ping_points_y + (repeat % 2) * ping_pong_gap, + points_y_start + repeat * span_load_input2_size, rem * sizeof(T), GDRAM2NRAM); + __memcpy_async(ping_points_z + (repeat % 2) * ping_pong_gap, + points_z_start + repeat * span_load_input3_size, rem * sizeof(T), GDRAM2NRAM); + } + + if (repeat > 0 && rem > 0) { + for (int box_idx = box_start; box_idx < box_end; box_idx++) { + computeStoreRoipointPool3d( + boxes3d, (int *)cnt, ping_points_x + ((repeat - 1) % 2) * ping_pong_gap, + ping_points_y + ((repeat - 1) % 2) * ping_pong_gap, + ping_points_z + ((repeat - 1) % 2) * ping_pong_gap, + point_features_start + (repeat - 1) * span_load_input4_size, auxiliary_a, auxiliary_b, + auxiliary_c, auxiliary_d, auxiliary_e, auxiliary_f, box_idx, pts_num, feature_in_len, + sampled_pts_num, span_num_deal, pooled_features_start, pooled_empty_flag_start); + } + } else if (repeat > 0 && rem == 0) { + for (int box_idx = box_start; box_idx < box_end; box_idx++) { + computeStoreLastBlockRoipointPool3d( + boxes3d, (int *)cnt, ping_points_x + ((repeat - 1) % 2) * ping_pong_gap, + ping_points_y + ((repeat - 1) % 2) * ping_pong_gap, + ping_points_z + ((repeat - 1) % 2) * ping_pong_gap, + point_features_start + (repeat - 1) * span_load_input4_size, auxiliary_a, auxiliary_b, + auxiliary_c, auxiliary_d, auxiliary_e, auxiliary_f, box_idx, pts_num, feature_in_len, + sampled_pts_num, span_num_deal, span_num_deal, pooled_features_start, + pooled_empty_flag_start); + } + } + + if (rem > 0) { + __asm__ volatile("sync;"); + for (int box_idx = box_start; box_idx < box_end; box_idx++) { + computeStoreLastBlockRoipointPool3d( + boxes3d, (int *)cnt, ping_points_x + (repeat % 2) * ping_pong_gap, + ping_points_y + (repeat % 2) * ping_pong_gap, + ping_points_z + (repeat % 2) * ping_pong_gap, + point_features_start + repeat * span_load_input4_size, auxiliary_a, auxiliary_b, + auxiliary_c, auxiliary_d, auxiliary_e, auxiliary_f, box_idx, pts_num, feature_in_len, + sampled_pts_num, align_rem, span_num_deal, pooled_features_start, + pooled_empty_flag_start); + } + } + } +} + +template __mlu_global__ void MLUUnion1KernelRoiPointPool3dForward( + const int batch_size, + const int pts_num, + const int boxes_num, + const int feature_in_len, + const int sampled_pts_num, + const char *points_xyz_gdram, + const char *point_features_gdram, + const char *boxes3d_gdram, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram); + +template __mlu_global__ void MLUUnion1KernelRoiPointPool3dForward( + const int batch_size, + const int pts_num, + const int boxes_num, + const int feature_in_len, + const int sampled_pts_num, + const char *points_xyz_gdram, + const char *point_features_gdram, + const char *boxes3d_gdram, + char *pooled_features_gdram, + char *pooled_empty_flag_gdram); + +void KernelRoiPointPool3dForward(cnrtDim3_t k_dim, + cnrtFunctionType_t k_type, + cnrtQueue_t queue, + const cnrtDataType_t d_type, + const int batch_size, + const int pts_num, + const int boxes_num, + const int feature_in_len, + const int sampled_pts_num, + const void *points_xyz, + const void *boxes3d, + const void *point_features, + void *pooled_features, + int *pooled_empty_flag) { + switch (d_type) { + default: { break; } + case CNRT_FLOAT32: { + MLUUnion1KernelRoiPointPool3dForward<<>>( + batch_size, pts_num, boxes_num, feature_in_len, sampled_pts_num, + (char *)points_xyz, (char *)point_features, (char *)boxes3d, + (char *)pooled_features, (char *)pooled_empty_flag); + }; break; + case CNRT_FLOAT16: { + MLUUnion1KernelRoiPointPool3dForward<<>>( + batch_size, pts_num, boxes_num, feature_in_len, sampled_pts_num, + (char *)points_xyz, (char *)point_features, (char *)boxes3d, + (char *)pooled_features, (char *)pooled_empty_flag); + }; break; + } +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/tin_shift_mlu_kernel.mlu b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/tin_shift_mlu_kernel.mlu new file mode 100644 index 0000000000000000000000000000000000000000..ed64c2b68cd73d28959f5e9ee6cb34d68c8213cf --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mlu/tin_shift_mlu_kernel.mlu @@ -0,0 +1,307 @@ +/************************************************************************* + * Copyright (C) 2022 Cambricon. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *************************************************************************/ +#include "common_mlu_helper.hpp" + +__nram__ char data_nram[MAX_NRAM_SIZE]; + +template +__mlu_func__ void mluMultiKernelTinShift( + const T *input, const int *shifts, T *output, const int batch_size, + const int time_size, const int channel_size, const int hw_size, + const int group_size, const int group_channel) { + for (int cur_channel_index = taskId; + cur_channel_index < batch_size * channel_size; + cur_channel_index += taskDim) { + int n_index = cur_channel_index / channel_size; + int group_id = cur_channel_index % channel_size / group_channel; + int t_shift = shifts[n_index * group_size + group_id]; + int index = cur_channel_index % channel_size * hw_size + + n_index * time_size * channel_size * hw_size; + __bang_write_value(data_nram, MAX_NRAM_SIZE, (char)0); + __asm__ volatile("sync;"); + if (abs(t_shift) >= time_size) { + __memcpy(output + index, data_nram, hw_size * sizeof(T), NRAM2GDRAM, + channel_size * hw_size * sizeof(T), hw_size * sizeof(T), + time_size - 1); + } else { + if (t_shift > 0) { + __memcpy(data_nram + t_shift * hw_size * sizeof(T), input + index, + hw_size * sizeof(T), GDRAM2NRAM, hw_size * sizeof(T), + channel_size * hw_size * sizeof(T), time_size - 1 - t_shift); + __memcpy(output + index, data_nram, hw_size * sizeof(T), NRAM2GDRAM, + channel_size * hw_size * sizeof(T), hw_size * sizeof(T), + time_size - 1); + } else { + __memcpy(data_nram, input + (index - t_shift * channel_size * hw_size), + hw_size * sizeof(T), GDRAM2NRAM, hw_size * sizeof(T), + channel_size * hw_size * sizeof(T), time_size - 1 + t_shift); + __memcpy(output + index, data_nram, hw_size * sizeof(T), NRAM2GDRAM, + channel_size * hw_size * sizeof(T), hw_size * sizeof(T), + time_size - 1); + } + } + __asm__ volatile("sync;"); + } +} + +template +__mlu_func__ void mluHwSplit(const T *input, const int t_shift, + const int time_size, const int hw_size, + const int channel_size, const int index, + const int cur_sequence_index, + const int max_length_per_core, T *output) { + for (int cur_index = index; cur_index < index + hw_size; + cur_index += max_length_per_core) { + int memcpy_size = max_length_per_core; + if (cur_index + max_length_per_core > index + hw_size) { + memcpy_size = index + hw_size - cur_index; + } + if (cur_sequence_index - t_shift < 0 || + cur_sequence_index - t_shift >= time_size) { + __memcpy(output + cur_index, data_nram, memcpy_size * sizeof(T), + NRAM2GDRAM); + } else { + __memcpy(data_nram, input + cur_index - t_shift * channel_size * hw_size, + memcpy_size * sizeof(T), GDRAM2NRAM); + __memcpy(output + cur_index, data_nram, memcpy_size * sizeof(T), + NRAM2GDRAM); + } + __asm__ volatile("sync;"); + } +} + +template +__mlu_func__ void mluMultiKernelTinShiftSplitSequence( + const T *input, const int *shifts, T *output, const int batch_size, + const int time_size, const int channel_size, const int hw_size, + const int group_size, const int group_channel, + const int max_number_hw_per_core, const int max_length_per_core) { + const int tmp_max_number_hw_per_core = + max_number_hw_per_core > 0 ? max_number_hw_per_core : 1; + const int loop_time = time_size / tmp_max_number_hw_per_core + + ((time_size % tmp_max_number_hw_per_core) > 0 ? 1 : 0); + int segmentime_size = tmp_max_number_hw_per_core; + int res_segment = time_size % tmp_max_number_hw_per_core; + + for (int cur_segment_index = taskId; + cur_segment_index < loop_time * batch_size * channel_size; + cur_segment_index += taskDim) { + int n_index = cur_segment_index / loop_time / channel_size; + int group_id = cur_segment_index / loop_time % channel_size / group_channel; + int t_shift = shifts[n_index * group_size + group_id]; + int index = n_index * time_size * channel_size * hw_size + + (cur_segment_index / loop_time % channel_size) * hw_size + + cur_segment_index % loop_time * segmentime_size * hw_size * + channel_size; + char *dst_gdram2nram = data_nram; + const T *src_gdram2nram = input + index; + int count_gdram2nram = -1; + int count_nram2gdram = -1; + int next_sequence_index = + index / hw_size / channel_size % time_size + segmentime_size; + int cur_sequence_index = index / hw_size / channel_size % time_size; + __bang_write_value(data_nram, MAX_NRAM_SIZE, (char)0); + __asm__ volatile("sync;"); + if (max_number_hw_per_core == 0) { + mluHwSplit(input, t_shift, time_size, hw_size, channel_size, index, + cur_sequence_index, max_length_per_core, output); + continue; + } + if (abs(t_shift) >= time_size) { + if ((cur_segment_index + 1) % loop_time == 0 && res_segment != 0) { + __memcpy(output + index, data_nram, hw_size * sizeof(T), NRAM2GDRAM, + channel_size * hw_size * sizeof(T), hw_size * sizeof(T), + res_segment - 1); + } else { + __memcpy(output + index, data_nram, hw_size * sizeof(T), NRAM2GDRAM, + channel_size * hw_size * sizeof(T), hw_size * sizeof(T), + segmentime_size - 1); + } + continue; + } + if (t_shift == 0) { + if ((cur_segment_index + 1) % loop_time == 0 && res_segment != 0) { + dst_gdram2nram = data_nram; + src_gdram2nram = input + index; + count_gdram2nram = res_segment - 1; + count_nram2gdram = res_segment - 1; + } else { + dst_gdram2nram = data_nram; + src_gdram2nram = input + index; + count_gdram2nram = segmentime_size - 1; + count_nram2gdram = segmentime_size - 1; + } + } else if (t_shift > 0) { + int first_index_cur_channel = + n_index * time_size * channel_size * hw_size + + (cur_segment_index / loop_time % channel_size) * hw_size; + if ((cur_segment_index + 1) % loop_time == 0 && res_segment != 0) { + dst_gdram2nram = data_nram; + src_gdram2nram = + input + + (index - t_shift * channel_size * hw_size < first_index_cur_channel + ? first_index_cur_channel + : index - t_shift * channel_size * hw_size); + count_gdram2nram = res_segment - 1; + count_nram2gdram = res_segment - 1; + if (cur_sequence_index < t_shift && t_shift < next_sequence_index) { + dst_gdram2nram = + data_nram + t_shift % segmentime_size * hw_size * sizeof(T); + count_gdram2nram = res_segment - (t_shift - cur_sequence_index) - 1; + } + } else { + if (t_shift >= next_sequence_index) { + __memcpy(output + index, data_nram, hw_size * sizeof(T), NRAM2GDRAM, + channel_size * hw_size * sizeof(T), hw_size * sizeof(T), + segmentime_size - 1); + continue; + } else if (cur_sequence_index < t_shift && + t_shift < next_sequence_index) { + dst_gdram2nram = + data_nram + t_shift % segmentime_size * hw_size * sizeof(T); + src_gdram2nram = input + first_index_cur_channel; + count_gdram2nram = segmentime_size - (t_shift % segmentime_size) - 1; + count_nram2gdram = segmentime_size - 1; + } else { + dst_gdram2nram = data_nram; + src_gdram2nram = input + index - t_shift * channel_size * hw_size; + count_gdram2nram = segmentime_size - 1; + count_nram2gdram = segmentime_size - 1; + } + } + } else { + int offset_index = time_size + t_shift; + if (cur_sequence_index >= offset_index) { + if ((cur_segment_index + 1) % loop_time == 0 && res_segment != 0) { + __memcpy(output + index, data_nram, hw_size * sizeof(T), NRAM2GDRAM, + channel_size * hw_size * sizeof(T), hw_size * sizeof(T), + res_segment - 1); + continue; + } else { + __memcpy(output + index, data_nram, hw_size * sizeof(T), NRAM2GDRAM, + channel_size * hw_size * sizeof(T), hw_size * sizeof(T), + segmentime_size - 1); + continue; + } + } else { + dst_gdram2nram = data_nram; + src_gdram2nram = input + index - t_shift * channel_size * hw_size; + if (cur_sequence_index - t_shift + segmentime_size < time_size) { + count_gdram2nram = segmentime_size - 1; + count_nram2gdram = segmentime_size - 1; + } else { + count_gdram2nram = time_size - (cur_sequence_index - t_shift) - 1; + count_nram2gdram = + (segmentime_size - 1) < (time_size - cur_sequence_index - 1) + ? (segmentime_size - 1) + : (time_size - cur_sequence_index - 1); + } + } + } + __memcpy(dst_gdram2nram, src_gdram2nram, hw_size * sizeof(T), GDRAM2NRAM, + hw_size * sizeof(T), channel_size * hw_size * sizeof(T), + count_gdram2nram); + __memcpy(output + index, data_nram, hw_size * sizeof(T), NRAM2GDRAM, + channel_size * hw_size * sizeof(T), hw_size * sizeof(T), + count_nram2gdram); + __asm__ volatile("sync;"); + } +} + +__mlu_entry__ void MLUUnion1KernelTinShift( + const void *input, const void *shifts, void *output, const int batch_size, + const int time_size, const int channel_size, const int hw_size, + const int group_size, const int group_channel, + const cnrtDataType_t data_dtype) { + // make sure that memcore is not used + if (coreId == 0x80) { + return; + } + switch (data_dtype) { + case CNRT_FLOAT16: { + mluMultiKernelTinShift((half *)input, (const int *)shifts, (half *)output, + batch_size, time_size, channel_size, hw_size, + group_size, group_channel); + }; break; + case CNRT_FLOAT32: { + mluMultiKernelTinShift((float *)input, (const int *)shifts, + (float *)output, batch_size, time_size, + channel_size, hw_size, group_size, group_channel); + }; break; + default: { return; } + } +} + +__mlu_entry__ void MLUUnion1KernelTinShiftSplitSequence( + const void *input, const void *shifts, void *output, const int batch_size, + const int time_size, const int channel_size, const int hw_size, + const int group_size, const int group_channel, + const int max_number_hw_per_core, const int max_length_per_core, + const cnrtDataType_t data_dtype) { + // make sure that memcore is not used + if (coreId == 0x80) { + return; + } + switch (data_dtype) { + case CNRT_FLOAT16: { + mluMultiKernelTinShiftSplitSequence( + (half *)input, (const int *)shifts, (half *)output, batch_size, + time_size, channel_size, hw_size, group_size, group_channel, + max_number_hw_per_core, max_length_per_core); + }; break; + case CNRT_FLOAT32: { + mluMultiKernelTinShiftSplitSequence( + (float *)input, (const int *)shifts, (float *)output, batch_size, + time_size, channel_size, hw_size, group_size, group_channel, + max_number_hw_per_core, max_length_per_core); + }; break; + default: { return; } + } +} + +void KernelTinShiftForward( + cnrtDim3_t k_dim, cnrtFunctionType_t k_type, cnrtQueue_t queue, + const void *input, const void *shifts, void *output, const int batch_size, + const int time_size, const int channel_size, const int hw_size, + const int group_size, const int group_channel, + const cnrtDataType_t data_dtype, const int channel_per_core, + const int max_number_hw_per_core, const int max_length_per_core) { + if (channel_per_core >= 1) { + MLUUnion1KernelTinShift<<>>( + input, shifts, output, batch_size, time_size, channel_size, hw_size, + group_size, group_channel, data_dtype); + } else { + MLUUnion1KernelTinShiftSplitSequence<<>>( + input, shifts, output, batch_size, time_size, channel_size, hw_size, + group_size, group_channel, max_number_hw_per_core, max_length_per_core, + data_dtype); + } +} + +void KernelTinShiftBackward( + cnrtDim3_t k_dim, cnrtFunctionType_t k_type, cnrtQueue_t queue, + const void *grad_output, const void *shifts, void *grad_input, + const int batch_size, const int time_size, const int channel_size, + const int hw_size, const int group_size, const int group_channel, + const cnrtDataType_t data_dtype, const int channel_per_core, + const int max_number_hw_per_core, const int max_length_per_core) { + if (channel_per_core >= 1) { + MLUUnion1KernelTinShift<<>>( + grad_output, shifts, grad_input, batch_size, time_size, channel_size, + hw_size, group_size, group_channel, data_dtype); + } else { + MLUUnion1KernelTinShiftSplitSequence<<>>( + grad_output, shifts, grad_input, batch_size, time_size, channel_size, + hw_size, group_size, group_channel, max_number_hw_per_core, + max_length_per_core, data_dtype); + } +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSDevice.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSDevice.h new file mode 100644 index 0000000000000000000000000000000000000000..e1d9d49618d7aea6a30b42630350c5a7b77ea0ac --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSDevice.h @@ -0,0 +1,64 @@ +// Copyright © 2022 Apple Inc. + +// This file is modify from: +// https://github.com/pytorch/pytorch/blob/a85d1f0bcdd02cf18d3b0517337458cb51a18cdb/aten/src/ATen/mps/MPSDevice.h + +#pragma once +#include +#include +#include + +#ifdef __OBJC__ +#include +#include +#include +typedef id MTLDevice_t; +#else +typedef void* MTLDevice; +typedef void* MTLDevice_t; +#endif + +using namespace std; + +namespace at { +namespace mps { + +//----------------------------------------------------------------- +// MPSDevice +// +// MPSDevice is a singleton class that returns the default device +//----------------------------------------------------------------- + +class TORCH_API MPSDevice { + public: + /** + * MPSDevice should not be cloneable. + */ + MPSDevice(MPSDevice& other) = delete; + /** + * MPSDevice should not be assignable. + */ + void operator=(const MPSDevice&) = delete; + /** + * Gets single instance of the Device. + */ + static MPSDevice* getInstance(); + /** + * Returns the single device. + */ + MTLDevice_t device() { return _mtl_device; } + + ~MPSDevice(); + + private: + static MPSDevice* _device; + MTLDevice_t _mtl_device; + MPSDevice(); +}; + +TORCH_API bool is_available(); + +TORCH_API at::Allocator* GetMPSAllocator(bool useSharedAllocator = false); + +} // namespace mps +} // namespace at diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSLibrary.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSLibrary.h new file mode 100644 index 0000000000000000000000000000000000000000..41c33fba8cbdd43cc5b3285603c11c6f9eee617b --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSLibrary.h @@ -0,0 +1,61 @@ +#ifndef _MPS_LIBRARY_H_ +#define _MPS_LIBRARY_H_ + +#include +#include + +#ifdef __OBJC__ +#include +#include +#include + +typedef id MTLComputePipelineState_t; +typedef id MTLLibrary_t; +#else +typedef void* MTLComputePipelineState; +typedef void* MTLComputePipelineState_t; +typedef void* MTLLibrary; +typedef void* MTLLibrary_t; +#endif + +class MPSLibrary { + public: + // disable constructor for singleton + static MPSLibrary* createFromUrl(const std::string& library_url); + static MPSLibrary* createFromSource(const std::string& source); + ~MPSLibrary(); + + MTLLibrary_t library() { return _library; } + + MTLComputePipelineState_t getComputePipelineState( + const std::string& function_name); + + private: + MTLLibrary_t _library; + std::unordered_map _pso_map; +}; + +class MPSLibraryManager { + public: + // disable constructor for singleton + MPSLibraryManager(const MPSLibraryManager&) = delete; + MPSLibraryManager& operator=(const MPSLibraryManager&) = delete; + MPSLibraryManager(MPSLibraryManager&&) = delete; + MPSLibraryManager& operator=(MPSLibraryManager&&) = delete; + + static MPSLibraryManager* getInstance(); + + bool hasLibrary(const std::string& name); + + MPSLibrary* getLibrary(const std::string& library_url); + + MPSLibrary* createLibraryFromSouce(const std::string& name, + const std::string& sources); + + ~MPSLibraryManager(); + + private: + MPSLibraryManager(); + std::unordered_map> _library_map; +}; +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSLibrary.mm b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSLibrary.mm new file mode 100644 index 0000000000000000000000000000000000000000..99addc7e28222f890e0b65660bb97711b6b52305 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSLibrary.mm @@ -0,0 +1,107 @@ +#include "MPSLibrary.h" +#include "MPSDevice.h" + +static std::unique_ptr mps_library_manager=nullptr; + +MPSLibraryManager* MPSLibraryManager::getInstance() { + if(!mps_library_manager) + mps_library_manager = std::unique_ptr(new MPSLibraryManager()); + return mps_library_manager.get(); +} + +MPSLibraryManager::~MPSLibraryManager() {} + +MPSLibraryManager::MPSLibraryManager() {} + +bool MPSLibraryManager::hasLibrary(const std::string& name) { + return _library_map.find(name) != _library_map.end(); +} + +MPSLibrary* MPSLibraryManager::getLibrary(const std::string& library_url) { + if (_library_map.find(library_url) != _library_map.end()) { + return _library_map[library_url].get(); + } + _library_map.emplace(std::make_pair( + library_url, std::unique_ptr(MPSLibrary::createFromUrl(library_url)))); + return _library_map[library_url].get(); +} + +MPSLibrary* MPSLibraryManager::createLibraryFromSouce(const std::string& name, + const std::string& source) { + NSString* ns_name = [NSString stringWithCString:name.c_str()]; + if (_library_map.find(name) != _library_map.end()) { + NSLog(@"Library %@ already exist.", ns_name); + return nullptr; + } + + _library_map.emplace( + std::make_pair(name, std::unique_ptr(MPSLibrary::createFromSource(source)))); + return _library_map[name].get(); +} + +MPSLibrary* MPSLibrary::createFromUrl(const std::string& library_url) { + MPSLibrary* library = new MPSLibrary(); + @autoreleasepool { + NSError* error = nil; + + // load library and func + NSString* utl_str = [NSString stringWithCString:library_url.c_str()]; + NSURL* metal_url = [NSURL fileURLWithPath:utl_str]; + library->_library = [at::mps::MPSDevice::getInstance()->device() newLibraryWithURL:metal_url + error:&error]; + if (library->_library == nil) { + NSLog(@"Failed to find library, error %@.", error); + exit(1); + } + } + + return library; +} + +MPSLibrary* MPSLibrary::createFromSource(const std::string& sources) { + MPSLibrary* library = new MPSLibrary(); + @autoreleasepool { + NSError* error = nil; + + // load library and func + NSString* code_str = [NSString stringWithCString:sources.c_str()]; + library->_library = [at::mps::MPSDevice::getInstance()->device() newLibraryWithSource:code_str + options:nil + error:&error]; + if (library->_library == nil) { + NSLog(@"Failed to find library, error %@.", error); + exit(1); + } + } + + return library; +} + +MPSLibrary::~MPSLibrary() { + [_library release]; + _library = nil; +} + +MTLComputePipelineState_t MPSLibrary::getComputePipelineState(const std::string& function_name) { + if (_pso_map.find(function_name) != _pso_map.end()) { + return _pso_map[function_name]; + } + + MTLComputePipelineState_t pso; + @autoreleasepool { + NSError* error = nil; + + // create function + NSString* function_name_str = [NSString stringWithCString:function_name.c_str()]; + id func = [_library newFunctionWithName:function_name_str]; + if (func == nil) { + NSLog(@"Failed to created pipeline state object, error %@.", error); + exit(1); + } + // create pipeline + pso = [at::mps::MPSDevice::getInstance()->device() newComputePipelineStateWithFunction:func + error:&error]; + _pso_map.emplace(std::make_pair(function_name, pso)); + } + return _pso_map[function_name]; +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSStream.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSStream.h new file mode 100644 index 0000000000000000000000000000000000000000..54cd388494c8bbac636db44dd5c8afd1915357c6 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSStream.h @@ -0,0 +1,132 @@ +// Copyright © 2022 Apple Inc. + +// This file is modify from: +// https://github.com/pytorch/pytorch/blob/a85d1f0bcdd02cf18d3b0517337458cb51a18cdb/aten/src/ATen/mps/MPSStream.h + +#pragma once + +#include +#include + +#include +#include +#include +#include "MPSDevice.h" + +#ifdef __OBJC__ +#include +#include +#include +#include +typedef id MTLCommandQueue_t; +typedef id MTLCommandBuffer_t; +typedef id MTLSharedEvent_t; +typedef id MTLDevice_t; +#else +typedef void* MTLCommandQueue_t; +typedef void* MTLCommandQueue; +typedef void* MTLCommandBuffer_t; +typedef void* MTLCommandBuffer; +typedef void* MTLSharedEvent_t; +typedef void* dispatch_queue_t; +typedef void* MTLDevice_t; +#define nil NULL; +#endif + +namespace at { +namespace mps { + +//----------------------------------------------------------------- +// MPSStream +//----------------------------------------------------------------- + +class TORCH_API MPSStream { + public: + enum Unchecked { UNCHECKED }; + /// Construct a MPSStream from a Stream. This construction is checked, + /// and will raise an error if the Stream is not, in fact, a MPS stream. + explicit MPSStream(Stream stream); + + ~MPSStream(); + MTLCommandQueue_t commandQueue() const { return _commandQueue; }; + dispatch_queue_t queue() const { return _serialQueue; } + + MTLCommandBuffer_t commandBuffer(); + void commit(bool flush); + void commitAndWait(); + void synchronize(); + + void flush(); + + /// Get the MPS device index that this stream is associated with. + c10::DeviceIndex device_index() const { return _stream.device_index(); } + + MTLCommandQueue_t stream() const { return _commandQueue; }; + + MTLDevice_t device() const { return [_commandQueue device]; } + + /// Explicit conversion to Stream. + Stream unwrap() const { return _stream; } + + private: + Stream _stream; + MTLCommandQueue_t _commandQueue = nil; + MTLCommandBuffer_t _commandBuffer = nil; + void _flush(bool commitAndWait) const; + + dispatch_queue_t _serialQueue = nullptr; +}; + +/** + * Get the current MPS stream + */ +TORCH_API MPSStream* getCurrentMPSStream(); + +/** + * Get the default MPS stream + */ +TORCH_API MPSStream* getDefaultMPSStream(); + +//----------------------------------------------------------------- +// MPSStreamImpl +//----------------------------------------------------------------- + +class TORCH_API MPSStreamImpl { + public: + /** + * Gets single instance of the MPSStream. + */ + static MPSStream* getInstance(); + + private: + static MPSStream* _stream; + MPSStreamImpl(); +}; + +//----------------------------------------------------------------- +// MPSEvent +//----------------------------------------------------------------- + +struct TORCH_API MPSEvent { + MPSEvent(); + // MPSEvent(id device); + + ~MPSEvent(); + MTLSharedEvent_t event() const { return _event; } + + void recordEvent(MPSStream* stream); + void waitForEvent(MPSStream* queue); // waits on the cpu + bool queryEvent(); + uint64_t getCurrentValue() { return _currentValue; } + void setCurrentValue(uint64_t currValue) { _currentValue = currValue; } + + private: + bool _isRecorded = false; + uint64_t _currentValue = 0; + MTLSharedEvent_t _event; +}; + +typedef MPSEvent* mpsEvent_t; + +} // namespace mps +} // namespace at diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSUtils.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSUtils.h new file mode 100644 index 0000000000000000000000000000000000000000..2a4ce6d7978d566e88dd22ee4f9722df914ff0de --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/mps/MPSUtils.h @@ -0,0 +1,51 @@ +#ifndef _MPS_UTILS_H_ +#define _MPS_UTILS_H_ +#include +#ifdef __OBJC__ +#include +#include +#include + +typedef id MTLBuffer_t; +typedef id MTLComputeCommandEncoder_t; +#else +typedef void* MTLBuffer; +typedef void* MTLBuffer_t; +typedef void* MTLComputeCommandEncoder; +typedef void* MTLComputeCommandEncoder_t; +#endif + +// utils +static inline MTLBuffer_t getMTLBufferStorage(const at::Tensor& tensor) { + return __builtin_bit_cast(MTLBuffer_t, tensor.storage().data()); +} + +template , at::Tensor>::value, bool> = true> +void setMTLArg(MTLComputeCommandEncoder_t encoder, int index, T&& t); + +template , at::Tensor>::value, bool> = true> +void setMTLArg(MTLComputeCommandEncoder_t encoder, int index, T&& t) { + [encoder setBuffer:getMTLBufferStorage(t) offset:0 atIndex:index]; +} + +template , at::Tensor>::value, bool>> +void setMTLArg(MTLComputeCommandEncoder_t encoder, int index, T&& t) { + [encoder setBytes:&t length:sizeof(t) atIndex:index]; +} + +inline void setMTLArgsImpl(MTLComputeCommandEncoder_t, int) {} + +template +void setMTLArgsImpl(MTLComputeCommandEncoder_t encoder, int index, T&& t, Args&&... args) { + setMTLArg(encoder, index, std::forward(t)); + setMTLArgsImpl(encoder, index + 1, std::forward(args)...); +} + +template +void setMTLArgs(MTLComputeCommandEncoder_t encoder, MTLComputePipelineState_t pso, Args&&... args) { + [encoder setComputePipelineState:pso]; + setMTLArgsImpl(encoder, 0, std::forward(args)...); +} +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/parrots_cpp_helper.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/parrots_cpp_helper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..72701890dd727db911a1c0ce4d6790c1b531348d --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/parrots_cpp_helper.hpp @@ -0,0 +1,40 @@ +#ifndef PARROTS_CPP_HELPER +#define PARROTS_CPP_HELPER +#include +#include +#include +#include +#include + +using namespace parrots; + +#define PARROTS_PRIVATE_CASE_TYPE(prim_type, type, ...) \ + case prim_type: { \ + using scalar_t = type; \ + return __VA_ARGS__(); \ + } + +#define PARROTS_DISPATCH_FLOATING_TYPES(TYPE, ...) \ + [&] { \ + const auto& the_type = TYPE; \ + switch (the_type) { \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float64, double, __VA_ARGS__) \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float32, float, __VA_ARGS__) \ + default: \ + PARROTS_NOTSUPPORTED; \ + } \ + }() + +#define PARROTS_DISPATCH_FLOATING_TYPES_AND_HALF(TYPE, ...) \ + [&] { \ + const auto& the_type = TYPE; \ + switch (the_type) { \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float64, double, __VA_ARGS__) \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float32, float, __VA_ARGS__) \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float16, float16, __VA_ARGS__) \ + default: \ + PARROTS_NOTSUPPORTED; \ + } \ + }() + +#endif // PARROTS_CPP_HELPER diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/parrots_cuda_helper.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/parrots_cuda_helper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..539009c3f91b46ea58a3a64f0875d799e8bd0b65 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/parrots_cuda_helper.hpp @@ -0,0 +1,111 @@ +#ifndef PARROTS_CUDA_HELPER +#define PARROTS_CUDA_HELPER + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "common_cuda_helper.hpp" +#include "parrots_cudawarpfunction.cuh" + +using namespace parrots; +using phalf = float16; + +#define __PHALF(x) (x.y) + +#define PARROTS_CUDA_CHECK(exp) \ + do { \ + cudaError_t err = exp; \ + if (err != cudaSuccess) { \ + fprintf(stderr, "cudaCheckError() failed : %s\n", \ + cudaGetErrorString(err)); \ + exit(-1); \ + } \ + } while (0) + +#define PARROTS_PRIVATE_CASE_TYPE(prim_type, type, ...) \ + case prim_type: { \ + using scalar_t = type; \ + return __VA_ARGS__(); \ + } + +#define PARROTS_DISPATCH_FLOATING_TYPES(TYPE, ...) \ + [&] { \ + const auto& the_type = TYPE; \ + switch (the_type) { \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float64, double, __VA_ARGS__) \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float32, float, __VA_ARGS__) \ + default: \ + PARROTS_NOTSUPPORTED; \ + } \ + }() + +#define PARROTS_DISPATCH_FLOATING_TYPES_AND_HALF(TYPE, ...) \ + [&] { \ + const auto& the_type = TYPE; \ + switch (the_type) { \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float64, double, __VA_ARGS__) \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float32, float, __VA_ARGS__) \ + PARROTS_PRIVATE_CASE_TYPE(Prim::Float16, float16, __VA_ARGS__) \ + default: \ + PARROTS_NOTSUPPORTED; \ + } \ + }() + +/** atomicAdd **/ +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600 + +static __inline__ __device__ double atomicAdd(double* address, double val) { + unsigned long long int* address_as_ull = (unsigned long long int*)address; + unsigned long long int old = *address_as_ull, assumed; + if (val == 0.0) return __longlong_as_double(old); + do { + assumed = old; + old = atomicCAS(address_as_ull, assumed, + __double_as_longlong(val + __longlong_as_double(assumed))); + } while (assumed != old); + return __longlong_as_double(old); +} + +#endif + +static __inline__ __device__ float16 atomicAdd(float16* address, float16 val) { + unsigned int* aligned = + (unsigned int*)((size_t)address - ((size_t)address & 2)); + unsigned int old = *aligned; + unsigned int assumed; + unsigned short old_as_us; + do { + assumed = old; + old_as_us = + (unsigned short)((size_t)address & 2 ? old >> 16 : old & 0xffff); + +#if __CUDACC_VER_MAJOR__ >= 9 + float16 tmp; + tmp.x = old_as_us; + float16 sum = tmp + val; + unsigned short sum_as_us = sum.x; +// half sum = __float2half_rn(__half2float(__ushort_as_half(old_as_us)) +// + (float)(val)); unsigned short sum_as_us = __half_as_ushort(sum); +#else + unsigned short sum_as_us = + __float2half_rn(__half2float(old_as_us) + (float)(val)); +#endif + + unsigned int sum_as_ui = (size_t)address & 2 + ? (sum_as_us << 16) | (old & 0xffff) + : (old & 0xffff0000) | sum_as_us; + old = atomicCAS(aligned, assumed, sum_as_ui); + } while (assumed != old); + //__half_raw raw = {old_as_us}; + // return float16(raw); + return *reinterpret_cast(&old_as_us); +} +#endif // PARROTS_CUDA_HELPER diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_cpp_helper.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_cpp_helper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..f68e8740561ef833c09e1ba9f999922f5d04bce5 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_cpp_helper.hpp @@ -0,0 +1,27 @@ +#ifndef PYTORCH_CPP_HELPER +#define PYTORCH_CPP_HELPER +#include + +#include + +using namespace at; + +#define CHECK_CUDA(x) \ + TORCH_CHECK(x.device().is_cuda(), #x " must be a CUDA tensor") +#define CHECK_MLU(x) \ + TORCH_CHECK(x.device().type() == at::kMLU, #x " must be a MLU tensor") +#define CHECK_CPU(x) \ + TORCH_CHECK(x.device().type() == at::kCPU, #x " must be a CPU tensor") +#define CHECK_CONTIGUOUS(x) \ + TORCH_CHECK(x.is_contiguous(), #x " must be contiguous") +#define CHECK_CUDA_INPUT(x) \ + CHECK_CUDA(x); \ + CHECK_CONTIGUOUS(x) +#define CHECK_MLU_INPUT(x) \ + CHECK_MLU(x); \ + CHECK_CONTIGUOUS(x) +#define CHECK_CPU_INPUT(x) \ + CHECK_CPU(x); \ + CHECK_CONTIGUOUS(x) + +#endif // PYTORCH_CPP_HELPER diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_cuda_helper.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_cuda_helper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..52e512695a403abe2688f9bffeece633a02f189a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_cuda_helper.hpp @@ -0,0 +1,20 @@ +#ifndef PYTORCH_CUDA_HELPER +#define PYTORCH_CUDA_HELPER + +#include +#include +#include + +#include +#include + +#include "common_cuda_helper.hpp" + +using at::Half; +using at::Tensor; +using phalf = at::Half; + +#define __PHALF(x) (x) +#define DIVUP(m, n) ((m) / (n) + ((m) % (n) > 0)) + +#endif // PYTORCH_CUDA_HELPER diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_device_registry.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_device_registry.hpp new file mode 100644 index 0000000000000000000000000000000000000000..2a32b7270c3521f960394af7d18cbbd03ba50df1 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_device_registry.hpp @@ -0,0 +1,141 @@ +#ifndef PYTORCH_DEVICE_REGISTRY_H +#define PYTORCH_DEVICE_REGISTRY_H + +// Using is recommended in the official documentation in +// https://pytorch.org/tutorials/advanced/cpp_extension.html#writing-the-c-op. +// However, we use for compatibility with CUDA 9.0 +// Read https://github.com/pytorch/extension-cpp/issues/35 for more details. +#include + +#include +#include +#include +#include + +inline std::string GetDeviceStr(const at::Device& device) { + std::string str = DeviceTypeName(device.type(), true); + if (device.has_index()) { + str.push_back(':'); + str.append(std::to_string(device.index())); + } + return str; +} + +// Registry +template +class DeviceRegistry; + +template +class DeviceRegistry { + public: + using FunctionType = Ret (*)(Args...); + static const int MAX_DEVICE_TYPES = + int8_t(at::DeviceType::COMPILE_TIME_MAX_DEVICE_TYPES); + + void Register(at::DeviceType device, FunctionType function) { + funcs_[int8_t(device)] = function; + } + + FunctionType Find(at::DeviceType device) const { + return funcs_[int8_t(device)]; + } + + static DeviceRegistry& instance() { + static DeviceRegistry inst; + return inst; + } + + private: + DeviceRegistry() { + for (size_t i = 0; i < MAX_DEVICE_TYPES; ++i) { + funcs_[i] = nullptr; + } + }; + FunctionType funcs_[MAX_DEVICE_TYPES]; +}; + +// get device of first tensor param + +template , at::Tensor>::value, + bool> = true> +at::Device GetFirstTensorDevice(T&& t, Args&&... args) { + return std::forward(t).device(); +} +template , at::Tensor>::value, + bool> = true> +at::Device GetFirstTensorDevice(T&& t, Args&&... args) { + return GetFirstTensorDevice(std::forward(args)...); +} + +// check device consistency + +inline std::pair CheckDeviceConsistency( + const at::Device& device, int index) { + return {index, device}; +} + +template , at::Tensor>::value, + bool> = true> +std::pair CheckDeviceConsistency(const at::Device& device, + int index, T&& t, + Args&&... args); + +template , at::Tensor>::value, + bool> = true> +std::pair CheckDeviceConsistency(const at::Device& device, + int index, T&& t, + Args&&... args) { + auto new_device = std::forward(t).device(); + if (new_device.type() != device.type() || + new_device.index() != device.index()) { + return {index, new_device}; + } + return CheckDeviceConsistency(device, index + 1, std::forward(args)...); +} + +template < + typename T, typename... Args, + std::enable_if_t, at::Tensor>::value, bool>> +std::pair CheckDeviceConsistency(const at::Device& device, + int index, T&& t, + Args&&... args) { + return CheckDeviceConsistency(device, index + 1, std::forward(args)...); +} + +// dispatch + +template +auto Dispatch(const R& registry, const char* name, Args&&... args) { + auto device = GetFirstTensorDevice(std::forward(args)...); + auto inconsist = + CheckDeviceConsistency(device, 0, std::forward(args)...); + TORCH_CHECK(inconsist.first >= int(sizeof...(Args)), name, ": at param ", + inconsist.first, + ", inconsistent device: ", GetDeviceStr(inconsist.second).c_str(), + " vs ", GetDeviceStr(device).c_str(), "\n") + auto f_ptr = registry.Find(device.type()); + TORCH_CHECK(f_ptr != nullptr, name, ": implementation for device ", + GetDeviceStr(device).c_str(), " not found.\n") + return f_ptr(std::forward(args)...); +} + +// helper macro + +#define DEVICE_REGISTRY(key) DeviceRegistry::instance() + +#define REGISTER_DEVICE_IMPL(key, device, value) \ + struct key##_##device##_registerer { \ + key##_##device##_registerer() { \ + DEVICE_REGISTRY(key).Register(at::k##device, value); \ + } \ + }; \ + static key##_##device##_registerer _##key##_##device##_registerer; + +#define DISPATCH_DEVICE_IMPL(key, ...) \ + Dispatch(DEVICE_REGISTRY(key), #key, __VA_ARGS__) + +#endif // PYTORCH_DEVICE_REGISTRY diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_mlu_helper.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_mlu_helper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..e49572ca841211e2960192f1e0955b54819086cc --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_mlu_helper.hpp @@ -0,0 +1,61 @@ +/************************************************************************* + * Copyright (C) 2021 Cambricon. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *************************************************************************/ +#ifndef PYTORCH_MLU_HELPER_HPP_ +#define PYTORCH_MLU_HELPER_HPP_ + +#ifdef MMCV_WITH_MLU +#include "aten.h" + +#define NFU_ALIGN_SIZE 128 + +#define PAD_UP(x, y) (((x) / (y) + (int)((x) % (y) > 0)) * (y)) + +#define PAD_DOWN(x, y) (((x) / (y)) * (y)) + +#define CEIL_DIV(x, y) (((x) + (y)-1) / (y)) + +#define CEIL_ALIGN(x, y) (((x) + (y)-1) / (y) * (y)) + +inline int32_t getJobLimitCapability() { + CNcontext drv_ctx; + TORCH_CHECK(CN_SUCCESS == cnCtxGetCurrent(&drv_ctx), "cnCtxGetCurrent fails"); + CNctxConfigParam ctx_conf_param; + TORCH_CHECK( + CN_SUCCESS == cnGetCtxConfigParam(drv_ctx, CN_CTX_CONFIG_UNION_LIMIT, + &ctx_conf_param), + "cnGetCtxConfigParam fails."); + return (int32_t)ctx_conf_param.unionLimit; +} + +inline int32_t getCoreNumOfJobLimitCapability() { + switch (getJobLimitCapability()) { + default: + return torch_mlu::getDeviceAttr(cnrtAttrMcorePerCluster) * + getJobLimitCapability(); + case CN_KERNEL_CLASS_BLOCK: + return 1; + case CN_KERNEL_CLASS_UNION: + return torch_mlu::getDeviceAttr(cnrtAttrMcorePerCluster); + case CN_KERNEL_CLASS_UNION2: + return torch_mlu::getDeviceAttr(cnrtAttrMcorePerCluster) * 2; + case CN_KERNEL_CLASS_UNION4: + return torch_mlu::getDeviceAttr(cnrtAttrMcorePerCluster) * 4; + case CN_KERNEL_CLASS_UNION8: + return torch_mlu::getDeviceAttr(cnrtAttrMcorePerCluster) * 8; + case CN_KERNEL_CLASS_UNION16: + return torch_mlu::getDeviceAttr(cnrtAttrMcorePerCluster) * 16; + } +} + +#endif // MMCV_WITH_MLU + +#endif // PYTORCH_MLU_HELPER_HPP_ diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_npu_helper.hpp b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_npu_helper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..88607d23b360e519084efc09ad472b2a3b8cff74 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/pytorch_npu_helper.hpp @@ -0,0 +1,35 @@ +/****************************************************************************** + * Copyright (c) 2022 Huawei Technologies Co., Ltd + * All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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. + ******************************************************************************/ + +#ifndef PYTORCH_NPU_HELPER_HPP_ +#define PYTORCH_NPU_HELPER_HPP_ + +#include +#include +#include + +#include "pytorch_cpp_helper.hpp" +#include "pytorch_device_registry.hpp" + +#define NPU_NAME_SPACE at_npu::native + +#define REGISTER_NPU_IMPL(key, value) REGISTER_DEVICE_IMPL(key, XLA, value) + +#define CHECK_NPU(x) \ + TORCH_CHECK(x.device().type() == at::kXLA, #x " must be a NPU tensor") + +#endif // PYTORCH_NPU_HELPER_HPP_ diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/paramsgrid.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/paramsgrid.h new file mode 100644 index 0000000000000000000000000000000000000000..f23ff4482324c51012865c42f2a5f9e59d54848a --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/paramsgrid.h @@ -0,0 +1,70 @@ +// Copyright 2019 Yan Yan +// +// 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. + +#ifndef PARAMS_GRID_H_ +#define PARAMS_GRID_H_ +#include +#include + +namespace detail { +template +int getTotalSize(std::vector arg) { + return arg.size(); +} + +template +int getTotalSize(std::vector arg, std::vector... args) { + return arg.size() * getTotalSize(args...); +} + +template +int getSize(std::vector arg) { + return arg.size(); +} + +template +void assigner(TT &src, std::vector counter, std::vector &arg) { + std::get(src) = arg[counter[Idx]]; +} + +template +void assigner(TT &src, std::vector counter, std::vector &arg, + std::vector &... args) { + std::get(src) = arg[counter[Idx]]; + assigner(src, counter, args...); +} +} // namespace detail + +template +std::vector> paramsGrid(std::vector... args) { + int length = detail::getTotalSize(args...); + std::vector sizes = {detail::getSize(args)...}; + int size = sizes.size(); + + std::vector> params(length); + std::vector counter(size); + for (int i = 0; i < length; ++i) { + detail::assigner<0>(params[i], counter, args...); + counter[size - 1] += 1; + for (int c = size - 1; c >= 0; --c) { + if (counter[c] == sizes[c] && c > 0) { + counter[c - 1] += 1; + counter[c] = 0; + } + } + } + return params; +} + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/prettyprint.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/prettyprint.h new file mode 100644 index 0000000000000000000000000000000000000000..0a6bdc3361dc1ada31fdebef87989672c9aeb51c --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/prettyprint.h @@ -0,0 +1,493 @@ +// Copyright Louis Delacroix 2010 - 2014. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// A pretty printing library for C++ +// +// Usage: +// Include this header, and operator<< will "just work". + +#ifndef H_PRETTY_PRINT +#define H_PRETTY_PRINT + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace pretty_print { +namespace detail { +// SFINAE type trait to detect whether T::const_iterator exists. + +struct sfinae_base { + using yes = char; + using no = yes[2]; +}; + +template +struct has_const_iterator : private sfinae_base { + private: + template + static yes &test(typename C::const_iterator *); + template + static no &test(...); + + public: + static const bool value = sizeof(test(nullptr)) == sizeof(yes); + using type = T; +}; + +template +struct has_begin_end : private sfinae_base { + private: + template + static yes & + f(typename std::enable_if< + std::is_same(&C::begin)), + typename C::const_iterator (C::*)() const>::value>::type *); + + template + static no &f(...); + + template + static yes &g(typename std::enable_if< + std::is_same(&C::end)), + typename C::const_iterator (C::*)() const>::value, + void>::type *); + + template + static no &g(...); + + public: + static bool const beg_value = sizeof(f(nullptr)) == sizeof(yes); + static bool const end_value = sizeof(g(nullptr)) == sizeof(yes); +}; + +} // namespace detail + +// Holds the delimiter values for a specific character type + +template +struct delimiters_values { + using char_type = TChar; + const char_type *prefix; + const char_type *delimiter; + const char_type *postfix; +}; + +// Defines the delimiter values for a specific container and character type + +template +struct delimiters { + using type = delimiters_values; + static const type values; +}; + +// Functor to print containers. You can use this directly if you want +// to specify a non-default delimiters type. The printing logic can +// be customized by specializing the nested template. + +template , + typename TDelimiters = delimiters> +struct print_container_helper { + using delimiters_type = TDelimiters; + using ostream_type = std::basic_ostream; + + template + struct printer { + static void print_body(const U &c, ostream_type &stream) { + using std::begin; + using std::end; + + auto it = begin(c); + const auto the_end = end(c); + + if (it != the_end) { + for (;;) { + stream << *it; + + if (++it == the_end) break; + + if (delimiters_type::values.delimiter != NULL) + stream << delimiters_type::values.delimiter; + } + } + } + }; + + print_container_helper(const T &container) : container_(container) {} + + inline void operator()(ostream_type &stream) const { + if (delimiters_type::values.prefix != NULL) + stream << delimiters_type::values.prefix; + + printer::print_body(container_, stream); + + if (delimiters_type::values.postfix != NULL) + stream << delimiters_type::values.postfix; + } + + private: + const T &container_; +}; + +// Specialization for pairs + +template +template +struct print_container_helper::printer> { + using ostream_type = + typename print_container_helper::ostream_type; + + static void print_body(const std::pair &c, ostream_type &stream) { + stream << c.first; + if (print_container_helper::delimiters_type::values + .delimiter != NULL) + stream << print_container_helper::delimiters_type::values + .delimiter; + stream << c.second; + } +}; + +// Specialization for tuples + +template +template +struct print_container_helper::printer> { + using ostream_type = + typename print_container_helper::ostream_type; + using element_type = std::tuple; + + template + struct Int {}; + + static void print_body(const element_type &c, ostream_type &stream) { + tuple_print(c, stream, Int<0>()); + } + + static void tuple_print(const element_type &, ostream_type &, + Int) {} + + static void tuple_print( + const element_type &c, ostream_type &stream, + typename std::conditional, + std::nullptr_t>::type) { + stream << std::get<0>(c); + tuple_print(c, stream, Int<1>()); + } + + template + static void tuple_print(const element_type &c, ostream_type &stream, Int) { + if (print_container_helper::delimiters_type::values + .delimiter != NULL) + stream << print_container_helper::delimiters_type::values + .delimiter; + + stream << std::get(c); + + tuple_print(c, stream, Int()); + } +}; + +// Prints a print_container_helper to the specified stream. + +template +inline std::basic_ostream &operator<<( + std::basic_ostream &stream, + const print_container_helper &helper) { + helper(stream); + return stream; +} + +// Basic is_container template; specialize to derive from std::true_type for all +// desired container types + +template +struct is_container + : public std::integral_constant::value && + detail::has_begin_end::beg_value && + detail::has_begin_end::end_value> {}; + +template +struct is_container : std::true_type {}; + +template +struct is_container : std::false_type {}; + +template +struct is_container> : std::true_type {}; + +template +struct is_container> : std::true_type {}; + +template +struct is_container> : std::true_type {}; + +// Default delimiters + +template +struct delimiters { + static const delimiters_values values; +}; +template +const delimiters_values delimiters::values = {"[", ", ", "]"}; +template +struct delimiters { + static const delimiters_values values; +}; +template +const delimiters_values delimiters::values = {L"[", L", ", + L"]"}; + +// Delimiters for (multi)set and unordered_(multi)set + +template +struct delimiters<::std::set, char> { + static const delimiters_values values; +}; + +template +const delimiters_values + delimiters<::std::set, char>::values = {"{", ", ", + "}"}; + +template +struct delimiters<::std::set, wchar_t> { + static const delimiters_values values; +}; + +template +const delimiters_values + delimiters<::std::set, wchar_t>::values = { + L"{", L", ", L"}"}; + +template +struct delimiters<::std::multiset, char> { + static const delimiters_values values; +}; + +template +const delimiters_values + delimiters<::std::multiset, char>::values = { + "{", ", ", "}"}; + +template +struct delimiters<::std::multiset, wchar_t> { + static const delimiters_values values; +}; + +template +const delimiters_values + delimiters<::std::multiset, wchar_t>::values = { + L"{", L", ", L"}"}; + +template +struct delimiters<::std::unordered_set, char> { + static const delimiters_values values; +}; + +template +const delimiters_values delimiters< + ::std::unordered_set, char>::values = { + "{", ", ", "}"}; + +template +struct delimiters<::std::unordered_set, wchar_t> { + static const delimiters_values values; +}; + +template +const delimiters_values delimiters< + ::std::unordered_set, wchar_t>::values = { + L"{", L", ", L"}"}; + +template +struct delimiters<::std::unordered_multiset, + char> { + static const delimiters_values values; +}; + +template +const delimiters_values delimiters< + ::std::unordered_multiset, char>::values = { + "{", ", ", "}"}; + +template +struct delimiters<::std::unordered_multiset, + wchar_t> { + static const delimiters_values values; +}; + +template +const delimiters_values + delimiters<::std::unordered_multiset, + wchar_t>::values = {L"{", L", ", L"}"}; + +// Delimiters for pair and tuple + +template +struct delimiters, char> { + static const delimiters_values values; +}; +template +const delimiters_values delimiters, char>::values = { + "(", ", ", ")"}; +template +struct delimiters<::std::pair, wchar_t> { + static const delimiters_values values; +}; +template +const delimiters_values + delimiters<::std::pair, wchar_t>::values = {L"(", L", ", L")"}; + +template +struct delimiters, char> { + static const delimiters_values values; +}; +template +const delimiters_values delimiters, char>::values = { + "(", ", ", ")"}; +template +struct delimiters<::std::tuple, wchar_t> { + static const delimiters_values values; +}; +template +const delimiters_values + delimiters<::std::tuple, wchar_t>::values = {L"(", L", ", L")"}; + +// Type-erasing helper class for easy use of custom delimiters. +// Requires TCharTraits = std::char_traits and TChar = char or wchar_t, +// and MyDelims needs to be defined for TChar. Usage: "cout << +// pretty_print::custom_delims(x)". + +struct custom_delims_base { + virtual ~custom_delims_base() {} + virtual std::ostream &stream(::std::ostream &) = 0; + virtual std::wostream &stream(::std::wostream &) = 0; +}; + +template +struct custom_delims_wrapper : custom_delims_base { + custom_delims_wrapper(const T &t_) : t(t_) {} + + std::ostream &stream(std::ostream &s) { + return s << print_container_helper, Delims>( + t); + } + + std::wostream &stream(std::wostream &s) { + return s << print_container_helper, + Delims>(t); + } + + private: + const T &t; +}; + +template +struct custom_delims { + template + custom_delims(const Container &c) + : base(new custom_delims_wrapper(c)) {} + + std::unique_ptr base; +}; + +template +inline std::basic_ostream &operator<<( + std::basic_ostream &s, const custom_delims &p) { + return p.base->stream(s); +} + +// A wrapper for a C-style array given as pointer-plus-size. +// Usage: std::cout << pretty_print_array(arr, n) << std::endl; + +template +struct array_wrapper_n { + typedef const T *const_iterator; + typedef T value_type; + + array_wrapper_n(const T *const a, size_t n) : _array(a), _n(n) {} + inline const_iterator begin() const { return _array; } + inline const_iterator end() const { return _array + _n; } + + private: + const T *const _array; + size_t _n; +}; + +// A wrapper for hash-table based containers that offer local iterators to each +// bucket. Usage: std::cout << bucket_print(m, 4) << std::endl; (Prints bucket +// 5 of container m.) + +template +struct bucket_print_wrapper { + typedef typename T::const_local_iterator const_iterator; + typedef typename T::size_type size_type; + + const_iterator begin() const { return m_map.cbegin(n); } + + const_iterator end() const { return m_map.cend(n); } + + bucket_print_wrapper(const T &m, size_type bucket) : m_map(m), n(bucket) {} + + private: + const T &m_map; + const size_type n; +}; + +} // namespace pretty_print + +// Global accessor functions for the convenience wrappers + +template +inline pretty_print::array_wrapper_n pretty_print_array(const T *const a, + size_t n) { + return pretty_print::array_wrapper_n(a, n); +} + +template +pretty_print::bucket_print_wrapper bucket_print(const T &m, + typename T::size_type n) { + return pretty_print::bucket_print_wrapper(m, n); +} + +// Main magic entry point: An overload snuck into namespace std. +// Can we do better? + +namespace std { +// Prints a container to the stream using default delimiters + +template +inline typename enable_if<::pretty_print::is_container::value, + basic_ostream &>::type +operator<<(basic_ostream &stream, const T &container) { + return stream + << ::pretty_print::print_container_helper( + container); +} +} // namespace std + +#endif // H_PRETTY_PRINT diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/pybind11_utils.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/pybind11_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..026e35b1a6b52ec74fee27fbccd2dfda5ef845ce --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/pybind11_utils.h @@ -0,0 +1,60 @@ +// Copyright 2019 Yan Yan +// +// 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. + +#pragma once +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace py = pybind11; + +template +std::vector array2Vector(TPyObject arr) { + py::array arr_np = arr; + size_t size = arr.attr("size").template cast(); + py::array_t arr_cc = arr_np; + std::vector data(arr_cc.data(), arr_cc.data() + size); + return data; +} + +template +std::vector arrayT2Vector(py::array_t arr) { + std::vector data(arr.data(), arr.data() + arr.size()); + return data; +} + +template +tv::TensorView array2TensorView(TPyObject arr) { + py::array arr_np = arr; + py::array_t arr_cc = arr_np; + tv::Shape shape; + for (int i = 0; i < arr_cc.ndim(); ++i) { + shape.push_back(arr_cc.shape(i)); + } + return tv::TensorView(arr_cc.mutable_data(), shape); +} +template +tv::TensorView arrayT2TensorView(py::array_t arr) { + tv::Shape shape; + for (int i = 0; i < arr.ndim(); ++i) { + shape.push_back(arr.shape(i)); + } + return tv::TensorView(arr.mutable_data(), shape); +} diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/geometry.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/geometry.h new file mode 100644 index 0000000000000000000000000000000000000000..def6fe5e125a4e8c7e38f889887a6af80557f219 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/geometry.h @@ -0,0 +1,295 @@ +// Copyright 2019 Yan Yan +// +// 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. + +#ifndef SPCONV_GEOMETRY_H_ +#define SPCONV_GEOMETRY_H_ + +#include + +#include +#include + +template +TV_HOST_DEVICE Index getValidOutPos(const Index *input_pos, + const Index *kernelSize, + const Index *stride, const Index *padding, + const Index *dilation, + const Index *outSpatialShape, Index *out) { + Index lowers[NDim]; + Index uppers[NDim]; + Index counter[NDim]; + Index counterSize[NDim]; + Index pointCounter = 0; + Index val; + Index numPoints = 1; + Index m, offset; + bool valid = false; +#pragma unroll + for (unsigned i = 0; i < NDim; ++i) { + lowers[i] = (input_pos[i] - (kernelSize[i] - 1) * dilation[i] - 1 + + stride[i] + padding[i]) / + stride[i]; + uppers[i] = (input_pos[i] + padding[i]) / stride[i]; + } + +#pragma unroll + for (unsigned i = 0; i < NDim; ++i) { + counterSize[i] = ((uppers[i] - lowers[i]) / dilation[i] + 1); + numPoints *= counterSize[i]; + } + +#pragma unroll + for (unsigned i = 0; i < NDim; ++i) { + counter[i] = 0; + } + for (int i = 0; i < numPoints; ++i) { + valid = true; + m = 1; + offset = 0; +#pragma unroll + for (int j = NDim - 1; j >= 0; --j) { + val = uppers[j] - counter[j] * dilation[j]; + out[pointCounter * (NDim + 1) + j] = val; + if (val < 0 || (val > outSpatialShape[j] - 1)) { + valid = false; + // break; + } + offset += m * (input_pos[j] - val * stride[j] + padding[j]) / dilation[j]; + m *= kernelSize[j]; + } + + out[pointCounter * (NDim + 1) + NDim] = offset; + if (valid) ++pointCounter; + counter[NDim - 1] += 1; +#pragma unroll + for (int c = NDim - 1; c >= 0; --c) { + if (counter[c] == counterSize[c] && c > 0) { + counter[c - 1] += 1; + counter[c] = 0; + } + } + } + return pointCounter; +} + +template +TV_HOST_DEVICE Index getValidOutPosTranspose( + const Index *input_pos, const Index *kernelSize, const Index *stride, + const Index *padding, const Index *dilation, const Index *outSpatialShape, + Index *out) { + Index lowers[NDim]; + Index uppers[NDim]; + Index counter[NDim]; + Index counterSize[NDim]; + Index pointCounter = 0; + Index val; + Index numPoints = 1; + Index m, offset; + bool valid = false; +#pragma unroll + for (unsigned i = 0; i < NDim; ++i) { + lowers[i] = input_pos[i] * stride[i] - padding[i]; + uppers[i] = lowers[i] + (kernelSize[i] - 1) * dilation[i]; + } +#pragma unroll + for (unsigned i = 0; i < NDim; ++i) { + counterSize[i] = ((uppers[i] - lowers[i]) / dilation[i] + 1); + numPoints *= counterSize[i]; + } +#pragma unroll + for (unsigned i = 0; i < NDim; ++i) { + counter[i] = 0; + } + for (int i = 0; i < numPoints; ++i) { + valid = true; + m = 1; + offset = 0; +#pragma unroll + for (int j = NDim - 1; j >= 0; --j) { + val = uppers[j] - counter[j] * dilation[j]; + out[pointCounter * (NDim + 1) + j] = val; + if (val < 0 || (val > outSpatialShape[j] - 1)) { + valid = false; + } + offset += m * (val - lowers[j]) / dilation[j]; + m *= kernelSize[j]; + } + out[pointCounter * (NDim + 1) + NDim] = offset; + if (valid) ++pointCounter; + counter[NDim - 1] += 1; +#pragma unroll + for (int c = NDim - 1; c >= 0; --c) { + if (counter[c] == counterSize[c] && c > 0) { + counter[c - 1] += 1; + counter[c] = 0; + } + } + } + return pointCounter; +} + +template +Index getIndicePairsConv(tv::TensorView indicesIn, + tv::TensorView indicesOut, + tv::TensorView gridsOut, + tv::TensorView indicePairs, + tv::TensorView indiceNum, + const Index *kernelSize, const Index *stride, + const Index *padding, const Index *dilation, + const Index *outSpatialShape) { + // indicesOut: num_active * kernelVolume * (NDim + 1) + Index numAct = 0; + auto numActIn = indicesIn.dim(0); + Index batchIdx = 0; + Index spatialVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + spatialVolume *= outSpatialShape[i]; + } + Index kernelVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + kernelVolume *= kernelSize[i]; + } + Index numValidPoints = 0; + std::vector validPoints_(kernelVolume * (NDim + 1)); + Index *validPoints = validPoints_.data(); + Index *pointPtr = nullptr; + for (int j = 0; j < numActIn; ++j) { + batchIdx = indicesIn(j, 0); + numValidPoints = getValidOutPos( + indicesIn.data() + j * (NDim + 1) + 1, kernelSize, stride, padding, + dilation, outSpatialShape, validPoints); + for (Index i = 0; i < numValidPoints; ++i) { + pointPtr = validPoints + i * (NDim + 1); + auto offset = pointPtr[NDim]; + auto index = tv::rowArrayIdx(pointPtr, outSpatialShape) + + spatialVolume * batchIdx; + if (gridsOut[index] == -1) { + for (unsigned k = 1; k < NDim + 1; ++k) { + indicesOut(numAct, k) = pointPtr[k - 1]; + } + indicesOut(numAct, 0) = batchIdx; + gridsOut[index] = numAct++; + } + // indicePairs: [K, 2, L] + indicePairs(offset, 0, indiceNum[offset]) = j; + indicePairs(offset, 1, indiceNum[offset]++) = gridsOut[index]; + } + } + return numAct; +} + +template +Index getIndicePairsDeConv(tv::TensorView indicesIn, + tv::TensorView indicesOut, + tv::TensorView gridsOut, + tv::TensorView indicePairs, + tv::TensorView indiceNum, + const Index *kernelSize, const Index *stride, + const Index *padding, const Index *dilation, + const Index *outSpatialShape) { + Index numAct = 0; + auto numActIn = indicesIn.dim(0); + Index batchIdx = 0; + Index spatialVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + spatialVolume *= outSpatialShape[i]; + } + Index kernelVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + kernelVolume *= kernelSize[i]; + } + Index numValidPoints = 0; + std::vector validPoints_(kernelVolume * (NDim + 1)); + Index *validPoints = validPoints_.data(); + Index *pointPtr = nullptr; + for (int j = 0; j < numActIn; ++j) { + batchIdx = indicesIn(j, 0); + numValidPoints = getValidOutPosTranspose( + indicesIn.data() + j * (NDim + 1) + 1, kernelSize, stride, padding, + dilation, outSpatialShape, validPoints); + for (Index i = 0; i < numValidPoints; ++i) { + pointPtr = validPoints + i * (NDim + 1); + auto offset = pointPtr[NDim]; + auto index = tv::rowArrayIdx(pointPtr, outSpatialShape) + + spatialVolume * batchIdx; + if (gridsOut[index] == -1) { + for (unsigned k = 1; k < NDim + 1; ++k) { + indicesOut(numAct, k) = pointPtr[k - 1]; + } + indicesOut(numAct, 0) = batchIdx; + gridsOut[index] = numAct++; + } + // indicePairs: [K, 2, L] + indicePairs(offset, 0, indiceNum[offset]) = j; + indicePairs(offset, 1, indiceNum[offset]++) = gridsOut[index]; + } + } + return numAct; +} + +template +Index getIndicePairsSubM(tv::TensorView indicesIn, + tv::TensorView gridsOut, + tv::TensorView indicePairs, + tv::TensorView indiceNum, + const Index *const kernelSize, + const Index *const stride, const Index *const padding, + const Index *dilation, + const Index *const outSpatialShape) { + auto numActIn = indicesIn.dim(0); + Index spatialVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + spatialVolume *= outSpatialShape[i]; + } + Index kernelVolume = 1; +#pragma unroll + for (int i = 0; i < NDim; ++i) { + kernelVolume *= kernelSize[i]; + } + Index numValidPoints = 0; + // Index validPoints[kernelVolume * (NDim + 1)]; + std::vector validPoints_(kernelVolume * (NDim + 1)); + Index *validPoints = validPoints_.data(); + Index *pointPtr = nullptr; + Index index = 0; + for (int j = 0; j < numActIn; ++j) { + index = tv::rowArrayIdx(indicesIn.data() + j * (NDim + 1) + 1, + outSpatialShape) + + spatialVolume * indicesIn(j, 0); + gridsOut[index] = j; + } + for (int j = 0; j < numActIn; ++j) { + numValidPoints = getValidOutPos( + indicesIn.data() + j * (NDim + 1) + 1, kernelSize, stride, padding, + dilation, outSpatialShape, validPoints); + for (Index i = 0; i < numValidPoints; ++i) { + pointPtr = validPoints + i * (NDim + 1); + auto offset = pointPtr[NDim]; + index = tv::rowArrayIdx(pointPtr, outSpatialShape) + + spatialVolume * indicesIn(j, 0); + if (gridsOut[index] > -1) { + indicePairs(offset, 0, indiceNum[offset]) = j; + indicePairs(offset, 1, indiceNum[offset]++) = gridsOut[index]; + } + } + } + return numActIn; +} + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/indice.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/indice.h new file mode 100644 index 0000000000000000000000000000000000000000..96ce34e3b456f0c999002bd53b8b1a6ab082edae --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/indice.h @@ -0,0 +1,78 @@ +// Copyright 2019 Yan Yan +// +// 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. + +#ifndef SPARSE_CONV_INDICE_FUNCTOR_H_ +#define SPARSE_CONV_INDICE_FUNCTOR_H_ +#include + +namespace functor { +template +struct CreateConvIndicePairFunctorP1 { + Index operator()(const Device& d, tv::TensorView indicesIn, + tv::TensorView indicesOut, + tv::TensorView gridsOut, + tv::TensorView indicePairs, + tv::TensorView indiceNum, + tv::TensorView indicePairUnique, + const tv::SimpleVector kernelSize, + const tv::SimpleVector stride, + const tv::SimpleVector padding, + const tv::SimpleVector dilation, + const tv::SimpleVector outSpatialShape, + bool transpose); +}; + +template +struct CreateConvIndicePairFunctorP2 { + Index operator()(const Device& d, tv::TensorView indicesIn, + tv::TensorView indicesOut, + tv::TensorView gridsOut, + tv::TensorView indicePairs, + tv::TensorView indiceNum, + tv::TensorView indicePairUnique, + const tv::SimpleVector outSpatialShape, + bool transpose, bool resetGrid = false); +}; + +template +struct CreateConvIndicePairFunctor { + Index operator()(const Device& d, tv::TensorView indicesIn, + tv::TensorView indicesOut, + tv::TensorView gridsOut, + tv::TensorView indicePairs, + tv::TensorView indiceNum, + const tv::SimpleVector kernelSize, + const tv::SimpleVector stride, + const tv::SimpleVector padding, + const tv::SimpleVector dilation, + const tv::SimpleVector outSpatialShape, + bool transpose, bool resetGrid = false); +}; + +template +struct CreateSubMIndicePairFunctor { + Index operator()(const Device& d, tv::TensorView indicesIn, + tv::TensorView gridsOut, + tv::TensorView indicePairs, + tv::TensorView indiceNum, + const tv::SimpleVector kernelSize, + const tv::SimpleVector stride, + const tv::SimpleVector padding, + const tv::SimpleVector dilation, + const tv::SimpleVector outSpatialShape, + bool transpose, bool resetGrid = false); +}; +} // namespace functor + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/maxpool.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/maxpool.h new file mode 100644 index 0000000000000000000000000000000000000000..78f32edd4db70724d38826809672aa461a6d065e --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/maxpool.h @@ -0,0 +1,37 @@ +// Copyright 2019 Yan Yan +// +// 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. + +#ifndef SPARSE_MAXPOOL_FUNCTOR_H_ +#define SPARSE_MAXPOOL_FUNCTOR_H_ +#include + +namespace functor { +template +struct SparseMaxPoolForwardFunctor { + void operator()(const Device& d, tv::TensorView outFeatures, + tv::TensorView inFeatures, + tv::TensorView indices, int size); +}; + +template +struct SparseMaxPoolBackwardFunctor { + void operator()(const Device& d, tv::TensorView outFeatures, + tv::TensorView inFeatures, + tv::TensorView fout, + tv::TensorView fin, + tv::TensorView indices, int size); +}; +} // namespace functor + +#endif diff --git a/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/mp_helper.h b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/mp_helper.h new file mode 100644 index 0000000000000000000000000000000000000000..8262b30efb5e127d7e079ebdde0693c671fb96d6 --- /dev/null +++ b/FoodSeg103/demo/mmcv/mmcv/ops/csrc/common/utils/spconv/spconv/mp_helper.h @@ -0,0 +1,50 @@ +#ifndef MP_HELPER_H_ +#define MP_HELPER_H_ +#include +#include + +template +struct mp_list {}; + +template +using mp_list_c = mp_list...>; + +namespace detail { + +template +constexpr F mp_for_each_impl(mp_list, F &&f) { + return std::initializer_list{(f(T()), 0)...}, std::forward(f); +} + +template +constexpr F mp_for_each_impl(mp_list<>, F &&f) { + return std::forward(f); +} + +} // namespace detail + +namespace detail { + +template class B> +struct mp_rename_impl { + // An error "no type named 'type'" here means that the first argument to + // mp_rename is not a list +}; + +template