├── requirements ├── optional.txt ├── mminstall.txt ├── readthedocs.txt ├── runtime.txt ├── tests.txt └── docs.txt ├── tests ├── __init__.py ├── test_models │ ├── __init__.py │ ├── test_heads │ │ ├── __init__.py │ │ ├── test_gc_head.py │ │ ├── test_nl_head.py │ │ ├── test_isa_head.py │ │ ├── test_cc_head.py │ │ ├── test_ann_head.py │ │ ├── utils.py │ │ ├── test_ocr_head.py │ │ ├── test_da_head.py │ │ ├── test_ema_head.py │ │ ├── test_segmenter_mask_head.py │ │ ├── test_stdc_head.py │ │ ├── test_uper_head.py │ │ ├── test_psp_head.py │ │ └── test_segformer_head.py │ ├── test_losses │ │ └── __init__.py │ ├── test_necks │ │ ├── __init__.py │ │ ├── test_mla_neck.py │ │ ├── test_fpn.py │ │ └── test_multilevel_neck.py │ ├── test_utils │ │ └── __init__.py │ ├── test_segmentors │ │ └── __init__.py │ └── test_backbones │ │ ├── __init__.py │ │ ├── test_fast_scnn.py │ │ └── utils.py ├── test_inference.py └── test_digit_version.py ├── requirements.txt ├── mmseg ├── core │ ├── hook │ │ └── __init__.py │ ├── utils │ │ ├── __init__.py │ │ └── misc.py │ ├── seg │ │ ├── sampler │ │ │ ├── __init__.py │ │ │ └── base_pixel_sampler.py │ │ ├── __init__.py │ │ └── builder.py │ ├── optimizers │ │ └── __init__.py │ ├── __init__.py │ ├── evaluation │ │ └── __init__.py │ └── builder.py ├── datasets │ ├── samplers │ │ └── __init__.py │ ├── pipelines │ │ ├── formating.py │ │ └── __init__.py │ ├── dark_zurich.py │ ├── night_driving.py │ ├── hrf.py │ ├── drive.py │ ├── stare.py │ ├── isprs.py │ ├── chase_db1.py │ ├── potsdam.py │ ├── voc.py │ └── __init__.py ├── ops │ └── __init__.py ├── models │ ├── segmentors │ │ └── __init__.py │ ├── necks │ │ └── __init__.py │ ├── __init__.py │ ├── utils │ │ ├── __init__.py │ │ └── make_divisible.py │ ├── losses │ │ └── __init__.py │ ├── backbones │ │ └── __init__.py │ ├── decode_heads │ │ └── cc_head.py │ └── builder.py ├── utils │ ├── __init__.py │ ├── collect_env.py │ └── logger.py ├── apis │ └── __init__.py └── version.py ├── configs ├── setr │ ├── setr_mla_512x512_160k_b16_ade20k.py │ ├── setr_vit-large_mla_8x1_768x768_80k_cityscapes.py │ └── setr_vit-large_naive_8x1_768x768_80k_cityscapes.py ├── fcn │ ├── fcn_r101-d8_512x512_160k_ade20k.py │ ├── fcn_r101-d8_512x512_20k_voc12aug.py │ ├── fcn_r101-d8_512x512_40k_voc12aug.py │ ├── fcn_r101-d8_512x512_80k_ade20k.py │ ├── fcn_r101-d8_769x769_40k_cityscapes.py │ ├── fcn_r101-d8_769x769_80k_cityscapes.py │ ├── fcn_r50b-d8_769x769_80k_cityscapes.py │ ├── fcn_r101-d8_512x1024_40k_cityscapes.py │ ├── fcn_r101-d8_512x1024_80k_cityscapes.py │ ├── fcn_r50b-d8_512x1024_80k_cityscapes.py │ ├── fcn_d6_r101-d16_512x1024_40k_cityscapes.py │ ├── fcn_d6_r101-d16_512x1024_80k_cityscapes.py │ ├── fcn_d6_r101-d16_769x769_40k_cityscapes.py │ ├── fcn_d6_r101-d16_769x769_80k_cityscapes.py │ ├── fcn_d6_r50b-d16_512x1024_80k_cityscapes.py │ ├── fcn_d6_r50b-d16_769x769_80k_cityscapes.py │ ├── fcn_r101-d8_480x480_40k_pascal_context.py │ ├── fcn_r101-d8_480x480_80k_pascal_context.py │ ├── fcn_r101-d8_480x480_40k_pascal_context_59.py │ ├── fcn_r101-d8_480x480_80k_pascal_context_59.py │ ├── fcn_r101b-d8_769x769_80k_cityscapes.py │ ├── fcn_r101b-d8_512x1024_80k_cityscapes.py │ ├── fcn_d6_r101b-d16_512x1024_80k_cityscapes.py │ ├── fcn_d6_r101b-d16_769x769_80k_cityscapes.py │ ├── fcn_r50-d8_512x1024_40k_cityscapes.py │ ├── fcn_r50-d8_512x1024_80k_cityscapes.py │ ├── fcn_r101-d8_fp16_512x1024_80k_cityscapes.py │ ├── fcn_r50-d8_512x512_160k_ade20k.py │ ├── fcn_r50-d8_512x512_80k_ade20k.py │ ├── fcn_r50-d8_512x512_20k_voc12aug.py │ ├── fcn_r50-d8_512x512_40k_voc12aug.py │ ├── fcn_r18-d8_769x769_80k_cityscapes.py │ ├── fcn_r18-d8_512x1024_80k_cityscapes.py │ ├── fcn_r18b-d8_512x1024_80k_cityscapes.py │ ├── fcn_r18b-d8_769x769_80k_cityscapes.py │ ├── fcn_d6_r50-d16_512x1024_40k_cityscapes.py │ ├── fcn_d6_r50-d16_512x1024_80k_cityscapes.py │ ├── fcn_r50-d8_769x769_40k_cityscapes.py │ ├── fcn_r50-d8_769x769_80k_cityscapes.py │ ├── fcn_r50-d8_480x480_40k_pascal_context.py │ ├── fcn_r50-d8_480x480_80k_pascal_context.py │ ├── fcn_r50-d8_480x480_40k_pascal_context_59.py │ ├── fcn_r50-d8_480x480_80k_pascal_context_59.py │ ├── fcn_d6_r50-d16_769x769_40k_cityscapes.py │ └── fcn_d6_r50-d16_769x769_80k_cityscapes.py ├── sem_fpn │ ├── fpn_r101_512x512_160k_ade20k.py │ ├── fpn_r101_512x1024_80k_cityscapes.py │ ├── fpn_r50_512x1024_80k_cityscapes.py │ └── fpn_r50_512x512_160k_ade20k.py ├── psanet │ ├── psanet_r101-d8_512x512_80k_ade20k.py │ ├── psanet_r101-d8_512x512_160k_ade20k.py │ ├── psanet_r101-d8_512x512_20k_voc12aug.py │ ├── psanet_r101-d8_512x512_40k_voc12aug.py │ ├── psanet_r101-d8_512x1024_40k_cityscapes.py │ ├── psanet_r101-d8_512x1024_80k_cityscapes.py │ ├── psanet_r101-d8_769x769_40k_cityscapes.py │ ├── psanet_r101-d8_769x769_80k_cityscapes.py │ ├── psanet_r50-d8_512x1024_40k_cityscapes.py │ ├── psanet_r50-d8_512x1024_80k_cityscapes.py │ ├── psanet_r50-d8_512x512_20k_voc12aug.py │ ├── psanet_r50-d8_512x512_40k_voc12aug.py │ ├── psanet_r50-d8_512x512_80k_ade20k.py │ ├── psanet_r50-d8_512x512_160k_ade20k.py │ ├── psanet_r50-d8_769x769_40k_cityscapes.py │ └── psanet_r50-d8_769x769_80k_cityscapes.py ├── pspnet │ ├── pspnet_r101-d8_512x1024_40k_dark.py │ ├── pspnet_r101-d8_512x512_80k_ade20k.py │ ├── pspnet_r101-d8_512x512_160k_ade20k.py │ ├── pspnet_r101-d8_512x512_20k_voc12aug.py │ ├── pspnet_r101-d8_512x512_40k_voc12aug.py │ ├── pspnet_r101-d8_4x4_512x512_80k_potsdam.py │ ├── pspnet_r101-d8_512x1024_40k_cityscapes.py │ ├── pspnet_r101-d8_512x1024_80k_cityscapes.py │ ├── pspnet_r101-d8_769x769_40k_cityscapes.py │ ├── pspnet_r101-d8_769x769_80k_cityscapes.py │ ├── pspnet_r50b-d8_512x1024_80k_cityscapes.py │ ├── pspnet_r50b-d8_769x769_80k_cityscapes.py │ ├── pspnet_r101-d8_4x4_512x512_80k_vaihingen.py │ ├── pspnet_r101-d8_480x480_40k_pascal_context.py │ ├── pspnet_r101-d8_480x480_80k_pascal_context.py │ ├── pspnet_r101-d8_512x1024_40k_night_driving.py │ ├── pspnet_r101-d8_480x480_40k_pascal_context_59.py │ ├── pspnet_r101-d8_480x480_80k_pascal_context_59.py │ ├── pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k.py │ ├── pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k.py │ ├── pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k.py │ ├── pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k.py │ ├── pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k.py │ ├── pspnet_r101b-d8_512x1024_80k_dark.py │ ├── pspnet_r101b-d8_512x1024_80k_cityscapes.py │ ├── pspnet_r101b-d8_769x769_80k_cityscapes.py │ ├── pspnet_r101b-d8_512x1024_80k_night_driving.py │ ├── pspnet_r50-d8_512x1024_40k_cityscapes.py │ ├── pspnet_r50-d8_512x1024_80k_cityscapes.py │ ├── pspnet_r101-d8_fp16_512x1024_80k_cityscapes.py │ ├── pspnet_r101-d8_512x512_80k_loveda.py │ ├── pspnet_r50-d32_512x1024_80k_cityscapes.py │ ├── pspnet_r50-d8_512x512_80k_loveda.py │ ├── pspnet_r50-d8_4x4_512x512_80k_potsdam.py │ ├── pspnet_r50-d8_4x4_896x896_80k_isaid.py │ ├── pspnet_r50-d8_512x512_160k_ade20k.py │ ├── pspnet_r50-d8_512x512_80k_ade20k.py │ ├── pspnet_r50-d8_4x4_512x512_80k_vaihingen.py │ ├── pspnet_r50-d8_512x512_20k_voc12aug.py │ ├── pspnet_r50-d8_512x512_40k_voc12aug.py │ ├── pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k.py │ ├── pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k.py │ ├── pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k.py │ ├── pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k.py │ ├── pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k.py │ ├── pspnet_r18-d8_4x4_512x512_80k_potsdam.py │ ├── pspnet_r18-d8_4x4_896x896_80k_isaid.py │ ├── pspnet_r18-d8_512x1024_80k_cityscapes.py │ ├── pspnet_r18-d8_769x769_80k_cityscapes.py │ ├── pspnet_r18-d8_4x4_512x512_80k_vaihingen.py │ ├── pspnet_r18b-d8_512x1024_80k_cityscapes.py │ ├── pspnet_r18b-d8_769x769_80k_cityscapes.py │ ├── pspnet_r50b-d32_512x1024_80k_cityscapes.py │ ├── pspnet_r18-d8_512x512_80k_loveda.py │ ├── pspnet_r50-d8_769x769_40k_cityscapes.py │ ├── pspnet_r50-d8_769x769_80k_cityscapes.py │ ├── pspnet_r50-d8_480x480_40k_pascal_context.py │ ├── pspnet_r50-d8_480x480_80k_pascal_context.py │ ├── pspnet_r50-d8_480x480_40k_pascal_context_59.py │ ├── pspnet_r50-d8_480x480_80k_pascal_context_59.py │ ├── pspnet_r50-d8_rsb-pretrain_512x1024_adamw_80k_cityscapes.py │ ├── pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes.py │ ├── pspnet_r50-d8_512x1024_40k_dark.py │ ├── pspnet_r50-d8_512x1024_80k_dark.py │ ├── pspnet_r50-d8_512x1024_40k_night_driving.py │ └── pspnet_r50-d8_512x1024_80k_night_driving.py ├── upernet │ ├── upernet_r101_512x512_160k_ade20k.py │ ├── upernet_r101_512x512_80k_ade20k.py │ ├── upernet_r101_512x512_20k_voc12aug.py │ ├── upernet_r101_512x512_40k_voc12aug.py │ ├── upernet_r101_769x769_40k_cityscapes.py │ ├── upernet_r101_769x769_80k_cityscapes.py │ ├── upernet_r101_512x1024_40k_cityscapes.py │ ├── upernet_r101_512x1024_80k_cityscapes.py │ ├── upernet_r50_512x1024_40k_cityscapes.py │ ├── upernet_r50_512x1024_80k_cityscapes.py │ ├── upernet_r18_512x1024_40k_cityscapes.py │ ├── upernet_r18_512x1024_80k_cityscapes.py │ ├── upernet_r50_512x512_80k_ade20k.py │ ├── upernet_r50_512x512_160k_ade20k.py │ ├── upernet_r50_512x512_20k_voc12aug.py │ ├── upernet_r50_512x512_40k_voc12aug.py │ ├── upernet_r50_769x769_40k_cityscapes.py │ ├── upernet_r50_769x769_80k_cityscapes.py │ ├── upernet_r18_512x512_160k_ade20k.py │ ├── upernet_r18_512x512_80k_ade20k.py │ ├── upernet_r18_512x512_20k_voc12aug.py │ └── upernet_r18_512x512_40k_voc12aug.py ├── deeplabv3plus │ ├── deeplabv3plus_r101-d8_512x512_160k_ade20k.py │ ├── deeplabv3plus_r101-d8_512x512_20k_voc12aug.py │ ├── deeplabv3plus_r101-d8_512x512_40k_voc12aug.py │ ├── deeplabv3plus_r101-d8_512x512_80k_ade20k.py │ ├── deeplabv3plus_r101-d8_512x512_80k_potsdam.py │ ├── deeplabv3plus_r101-d8_769x769_40k_cityscapes.py │ ├── deeplabv3plus_r101-d8_769x769_80k_cityscapes.py │ ├── deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py │ ├── deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen.py │ ├── deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py │ ├── deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py │ ├── deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py │ ├── deeplabv3plus_r101-d8_480x480_40k_pascal_context.py │ ├── deeplabv3plus_r101-d8_480x480_80k_pascal_context.py │ ├── deeplabv3plus_r101-d8_480x480_40k_pascal_context_59.py │ ├── deeplabv3plus_r101-d8_480x480_80k_pascal_context_59.py │ ├── deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py │ ├── deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py │ ├── deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py │ ├── deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py │ ├── deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py │ ├── deeplabv3plus_r101-d8_512x512_80k_loveda.py │ ├── deeplabv3plus_r50-d8_512x512_80k_loveda.py │ ├── deeplabv3plus_r50-d8_4x4_896x896_80k_isaid.py │ ├── deeplabv3plus_r50-d8_512x512_160k_ade20k.py │ ├── deeplabv3plus_r50-d8_512x512_80k_ade20k.py │ ├── deeplabv3plus_r50-d8_512x512_80k_potsdam.py │ ├── deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen.py │ ├── deeplabv3plus_r50-d8_512x512_20k_voc12aug.py │ ├── deeplabv3plus_r50-d8_512x512_40k_voc12aug.py │ ├── deeplabv3plus_r18-d8_512x512_80k_potsdam.py │ ├── deeplabv3plus_r18-d8_4x4_896x896_80k_isaid.py │ ├── deeplabv3plus_r18-d8_769x769_80k_cityscapes.py │ ├── deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py │ ├── deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen.py │ ├── deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py │ ├── deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py │ ├── deeplabv3plus_r50-d8_769x769_40k_cityscapes.py │ ├── deeplabv3plus_r50-d8_769x769_80k_cityscapes.py │ ├── deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py │ ├── deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py │ ├── deeplabv3plus_r18-d8_512x512_80k_loveda.py │ ├── deeplabv3plus_r50-d8_480x480_40k_pascal_context.py │ ├── deeplabv3plus_r50-d8_480x480_80k_pascal_context.py │ ├── deeplabv3plus_r50-d8_480x480_40k_pascal_context_59.py │ └── deeplabv3plus_r50-d8_480x480_80k_pascal_context_59.py ├── vit │ ├── upernet_deit-b16_mln_512x512_160k_ade20k.py │ ├── upernet_deit-b16_512x512_160k_ade20k.py │ ├── upernet_deit-b16_512x512_80k_ade20k.py │ ├── upernet_deit-b16_ln_mln_512x512_160k_ade20k.py │ ├── upernet_deit-s16_512x512_160k_ade20k.py │ ├── upernet_deit-s16_512x512_80k_ade20k.py │ ├── upernet_deit-s16_mln_512x512_160k_ade20k.py │ ├── upernet_deit-s16_ln_mln_512x512_160k_ade20k.py │ ├── upernet_vit-b16_mln_512x512_160k_ade20k.py │ ├── upernet_vit-b16_mln_512x512_80k_ade20k.py │ └── upernet_vit-b16_ln_mln_512x512_160k_ade20k.py ├── _base_ │ ├── datasets │ │ ├── pascal_voc12_aug.py │ │ ├── cityscapes_768x768.py │ │ ├── cityscapes_769x769.py │ │ ├── cityscapes_832x832.py │ │ └── cityscapes_1024x1024.py │ ├── schedules │ │ ├── schedule_320k.py │ │ ├── schedule_20k.py │ │ ├── schedule_40k.py │ │ ├── schedule_80k.py │ │ └── schedule_160k.py │ ├── default_runtime.py │ └── models │ │ ├── lraspp_m-v3-d8.py │ │ ├── dpt_vit-b16.py │ │ ├── erfnet_fcn.py │ │ ├── segformer_mit-b0.py │ │ ├── fpn_r50.py │ │ ├── cgnet.py │ │ ├── segmenter_vit-b16_mask.py │ │ ├── ccnet_r50-d8.py │ │ ├── danet_r50-d8.py │ │ ├── pspnet_r50-d8.py │ │ ├── deeplabv3_r50-d8.py │ │ ├── fcn_r50-d8.py │ │ ├── isanet_r50-d8.py │ │ ├── upernet_r50.py │ │ ├── apcnet_r50-d8.py │ │ ├── dmnet_r50-d8.py │ │ ├── dnl_r50-d8.py │ │ ├── nonlocal_r50-d8.py │ │ ├── gcnet_r50-d8.py │ │ └── emanet_r50-d8.py ├── segformer │ ├── segformer_mit-b1_8x1_1024x1024_160k_cityscapes.py │ ├── segformer_mit-b1_512x512_160k_ade20k.py │ ├── segformer_mit-b2_512x512_160k_ade20k.py │ ├── segformer_mit-b3_512x512_160k_ade20k.py │ ├── segformer_mit-b4_512x512_160k_ade20k.py │ ├── segformer_mit-b5_512x512_160k_ade20k.py │ ├── segformer_mit-b2_8x1_1024x1024_160k_cityscapes.py │ ├── segformer_mit-b3_8x1_1024x1024_160k_cityscapes.py │ ├── segformer_mit-b4_8x1_1024x1024_160k_cityscapes.py │ ├── segformer_mit-b5_8x1_1024x1024_160k_cityscapes.py │ ├── segformer_mit-b0_512x512_160k_ade20k.py │ └── segformer_mit-b0_8x1_1024x1024_160k_cityscapes.py └── swin │ ├── upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K.py │ ├── upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K.py │ ├── upernet_swin_large_patch4_window12_512x512_pretrain_384x384_22K_160k_ade20k.py │ ├── upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py │ ├── upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py │ ├── upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K.py │ └── upernet_swin_large_patch4_window7_512x512_pretrain_224x224_22K_160k_ade20k.py ├── MANIFEST.in ├── pytest.ini ├── CITATION.cff ├── tools ├── dist_train.sh ├── dist_test.sh ├── slurm_train.sh ├── slurm_test.sh └── publish_model.py ├── .dev ├── log_collector │ ├── utils.py │ └── example_config.py ├── batch_train_list.txt └── upload_modelzoo.py ├── setup.cfg ├── LICENSES.md └── model-index.yml /requirements/optional.txt: -------------------------------------------------------------------------------- 1 | cityscapesscripts 2 | -------------------------------------------------------------------------------- /requirements/mminstall.txt: -------------------------------------------------------------------------------- 1 | mmcls>=0.20.1 2 | mmcv-full>=1.4.4,<1.7.0 3 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /requirements/readthedocs.txt: -------------------------------------------------------------------------------- 1 | mmcv 2 | prettytable 3 | torch 4 | torchvision 5 | -------------------------------------------------------------------------------- /tests/test_models/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_losses/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_necks/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /requirements/runtime.txt: -------------------------------------------------------------------------------- 1 | matplotlib 2 | mmcls>=0.20.1 3 | numpy 4 | packaging 5 | prettytable 6 | -------------------------------------------------------------------------------- /tests/test_models/test_segmentors/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /requirements/tests.txt: -------------------------------------------------------------------------------- 1 | codecov 2 | flake8 3 | interrogate 4 | pytest 5 | xdoctest>=0.10.0 6 | yapf 7 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | -r requirements/optional.txt 2 | -r requirements/runtime.txt 3 | -r requirements/tests.txt 4 | -------------------------------------------------------------------------------- /mmseg/core/hook/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .wandblogger_hook import MMSegWandbHook 3 | 4 | __all__ = ['MMSegWandbHook'] 5 | -------------------------------------------------------------------------------- /configs/setr/setr_mla_512x512_160k_b16_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./setr_mla_512x512_160k_b8_ade20k.py'] 2 | 3 | # num_gpus: 8 -> batch_size: 16 4 | data = dict(samples_per_gpu=2) 5 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include requirements/*.txt 2 | include mmseg/.mim/model-index.yml 3 | recursive-include mmseg/.mim/configs *.py *.yml 4 | recursive-include mmseg/.mim/tools *.py *.sh 5 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x512_160k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x512_20k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x512_40k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x512_80k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './fpn_r50_512x512_160k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_769x769_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) 3 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './psanet_r50-d8_512x512_80k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x1024_40k_dark.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_40k_dark.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_80k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fpn_r50_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r101_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_512x512_160k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r101_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_512x512_80k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /mmseg/datasets/samplers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .distributed_sampler import DistributedSampler 3 | 4 | __all__ = ['DistributedSampler'] 5 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x1024_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) 3 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './psanet_r50-d8_512x512_160k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './psanet_r50-d8_512x512_20k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './psanet_r50-d8_512x512_40k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_160k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_20k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_40k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r101_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_512x512_20k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r101_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_512x512_40k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r101_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_769x769_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r101_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r101-d16_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_d6_r50-d16_512x1024_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r101-d16_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_d6_r50-d16_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r101-d16_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_d6_r50-d16_769x769_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r101-d16_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_d6_r50-d16_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r50b-d16_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_d6_r50-d16_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r50b-d16_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_d6_r50-d16_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_480x480_40k_pascal_context.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_480x480_80k_pascal_context.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './psanet_r50-d8_512x1024_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './psanet_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './psanet_r50-d8_769x769_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './psanet_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_4x4_512x512_80k_potsdam.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_4x4_512x512_80k_potsdam.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_769x769_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) 3 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r101_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_512x1024_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r101_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_480x480_40k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_480x480_40k_pascal_context_59.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_480x480_80k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_480x480_80k_pascal_context_59.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_4x4_512x512_80k_vaihingen.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_4x4_512x512_80k_vaihingen.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_480x480_40k_pascal_context.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_480x480_80k_pascal_context.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x1024_40k_night_driving.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_40k_night_driving.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /mmseg/ops/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .encoding import Encoding 3 | from .wrappers import Upsample, resize 4 | 5 | __all__ = ['Upsample', 'resize', 'Encoding'] 6 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x512_160k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x512_20k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x512_40k_voc12aug.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x512_80k_ade20k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_potsdam.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x512_80k_potsdam.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_480x480_40k_pascal_context_59.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_480x480_80k_pascal_context_59.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_769x769_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101b-d8_512x1024_80k_dark.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_80k_dark.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /requirements/docs.txt: -------------------------------------------------------------------------------- 1 | docutils==0.16.0 2 | myst-parser 3 | -e git+https://github.com/gaotongxiao/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme 4 | sphinx==4.0.2 5 | sphinx_copybutton 6 | sphinx_markdown_tables 7 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict(pretrained='torchvision://resnet50', backbone=dict(type='ResNet')) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_480x480_40k_pascal_context.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_480x480_80k_pascal_context.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r101b-d16_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_d6_r50b-d16_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r101b-d16_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_d6_r50b-d16_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fpn_r50.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_480x480_40k_pascal_context_59.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_480x480_80k_pascal_context_59.py' 2 | model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) 3 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r50_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r50_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101b-d8_512x1024_80k_night_driving.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_80k_night_driving.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r101-d8_fp16_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r101-d8_512x1024_80k_cityscapes.py' 2 | # fp16 settings 3 | optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) 4 | # fp16 placeholder 5 | fp16 = dict() 6 | -------------------------------------------------------------------------------- /tests/test_models/test_backbones/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .utils import all_zeros, check_norm_state, is_block, is_norm 3 | 4 | __all__ = ['is_norm', 'is_block', 'all_zeros', 'check_norm_state'] 5 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /mmseg/core/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .dist_util import check_dist_init, sync_random_seed 3 | from .misc import add_prefix 4 | 5 | __all__ = ['add_prefix', 'check_dist_init', 'sync_random_seed'] 6 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet101', 4 | backbone=dict(type='ResNet', depth=101)) 5 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_fp16_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r101-d8_512x1024_80k_cityscapes.py' 2 | # fp16 settings 3 | optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) 4 | # fp16 placeholder 5 | fp16 = dict() 6 | -------------------------------------------------------------------------------- /configs/vit/upernet_deit-b16_mln_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_vit-b16_mln_512x512_160k_ade20k.py' 2 | 3 | model = dict( 4 | pretrained='pretrain/deit_base_patch16_224-b5f2ef4d.pth', 5 | backbone=dict(drop_path_rate=0.1), 6 | ) 7 | -------------------------------------------------------------------------------- /mmseg/core/seg/sampler/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .base_pixel_sampler import BasePixelSampler 3 | from .ohem_pixel_sampler import OHEMPixelSampler 4 | 5 | __all__ = ['BasePixelSampler', 'OHEMPixelSampler'] 6 | -------------------------------------------------------------------------------- /configs/vit/upernet_deit-b16_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_vit-b16_mln_512x512_160k_ade20k.py' 2 | 3 | model = dict( 4 | pretrained='pretrain/deit_base_patch16_224-b5f2ef4d.pth', 5 | backbone=dict(drop_path_rate=0.1), 6 | neck=None) 7 | -------------------------------------------------------------------------------- /configs/vit/upernet_deit-b16_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_vit-b16_mln_512x512_80k_ade20k.py' 2 | 3 | model = dict( 4 | pretrained='pretrain/deit_base_patch16_224-b5f2ef4d.pth', 5 | backbone=dict(drop_path_rate=0.1), 6 | neck=None) 7 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | -------------------------------------------------------------------------------- /configs/vit/upernet_deit-b16_ln_mln_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_vit-b16_mln_512x512_160k_ade20k.py' 2 | 3 | model = dict( 4 | pretrained='pretrain/deit_base_patch16_224-b5f2ef4d.pth', 5 | backbone=dict(drop_path_rate=0.1, final_norm=True)) 6 | -------------------------------------------------------------------------------- /mmseg/core/seg/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .builder import build_pixel_sampler 3 | from .sampler import BasePixelSampler, OHEMPixelSampler 4 | 5 | __all__ = ['build_pixel_sampler', 'BasePixelSampler', 'OHEMPixelSampler'] 6 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py' 2 | # fp16 settings 3 | optimizer_config = dict(type='Fp16OptimizerHook', loss_scale=512.) 4 | # fp16 placeholder 5 | fp16 = dict() 6 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r101-d8_512x512_80k_loveda.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_80k_loveda.py' 2 | model = dict( 3 | backbone=dict( 4 | depth=101, 5 | init_cfg=dict( 6 | type='Pretrained', checkpoint='open-mmlab://resnet101_v1c'))) 7 | -------------------------------------------------------------------------------- /configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fpn_r50.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' 4 | ] 5 | model = dict(decode_head=dict(num_classes=150)) 6 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_loveda.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x512_80k_loveda.py' 2 | model = dict( 3 | backbone=dict( 4 | depth=101, 5 | init_cfg=dict( 6 | type='Pretrained', checkpoint='open-mmlab://resnet101_v1c'))) 7 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) 7 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) 7 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d32_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict(backbone=dict(dilations=(1, 1, 2, 4), strides=(1, 2, 2, 2))) 6 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r18_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_512x1024_40k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict(in_channels=[64, 128, 256, 512]), 6 | auxiliary_head=dict(in_channels=256)) 7 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r18_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_r50_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict(in_channels=[64, 128, 256, 512]), 6 | auxiliary_head=dict(in_channels=256)) 7 | -------------------------------------------------------------------------------- /mmseg/models/segmentors/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .base import BaseSegmentor 3 | from .cascade_encoder_decoder import CascadeEncoderDecoder 4 | from .encoder_decoder import EncoderDecoder 5 | 6 | __all__ = ['BaseSegmentor', 'EncoderDecoder', 'CascadeEncoderDecoder'] 7 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_80k_loveda.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/loveda.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=7), auxiliary_head=dict(num_classes=7)) 7 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r50_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) 7 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 7 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_voc12_aug.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 7 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_4x4_512x512_80k_potsdam.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/potsdam.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=6), auxiliary_head=dict(num_classes=6)) 7 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_4x4_896x896_80k_isaid.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/isaid.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=16), auxiliary_head=dict(num_classes=16)) 7 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) 7 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) 7 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r50_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) 7 | -------------------------------------------------------------------------------- /mmseg/core/optimizers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .layer_decay_optimizer_constructor import ( 3 | LayerDecayOptimizerConstructor, LearningRateDecayOptimizerConstructor) 4 | 5 | __all__ = [ 6 | 'LearningRateDecayOptimizerConstructor', 'LayerDecayOptimizerConstructor' 7 | ] 8 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_4x4_512x512_80k_vaihingen.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/vaihingen.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=6), auxiliary_head=dict(num_classes=6)) 7 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | addopts = --xdoctest --xdoctest-style=auto 3 | norecursedirs = .git ignore build __pycache__ data docker docs .eggs 4 | 5 | filterwarnings= default 6 | ignore:.*No cfgstr given in Cacher constructor or call.*:Warning 7 | ignore:.*Define the __nice__ method for.*:Warning 8 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_loveda.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/loveda.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=7), auxiliary_head=dict(num_classes=7)) 7 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/psanet_r50-d8.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_20k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 8 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/psanet_r50-d8.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 8 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_20k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 8 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 8 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/coco-stuff10k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_20k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=171), auxiliary_head=dict(num_classes=171)) 7 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/coco-stuff10k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=171), auxiliary_head=dict(num_classes=171)) 7 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r50_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_20k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 8 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r50_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 8 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/isaid.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=16), auxiliary_head=dict(num_classes=16)) 7 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) 7 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=150), auxiliary_head=dict(num_classes=150)) 7 | -------------------------------------------------------------------------------- /configs/_base_/datasets/pascal_voc12_aug.py: -------------------------------------------------------------------------------- 1 | _base_ = './pascal_voc12.py' 2 | # dataset settings 3 | data = dict( 4 | train=dict( 5 | ann_dir=['SegmentationClass', 'SegmentationClassAug'], 6 | split=[ 7 | 'ImageSets/Segmentation/train.txt', 8 | 'ImageSets/Segmentation/aug.txt' 9 | ])) 10 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_potsdam.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/potsdam.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=6), auxiliary_head=dict(num_classes=6)) 8 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(mask_size=(66, 66), num_classes=150), 7 | auxiliary_head=dict(num_classes=150)) 8 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=171), auxiliary_head=dict(num_classes=171)) 8 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/psanet_r50-d8.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(mask_size=(66, 66), num_classes=150), 7 | auxiliary_head=dict(num_classes=150)) 8 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_160k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=171), auxiliary_head=dict(num_classes=171)) 8 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/coco-stuff164k.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_320k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=171), auxiliary_head=dict(num_classes=171)) 8 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/vaihingen.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=6), auxiliary_head=dict(num_classes=6)) 8 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_20k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 8 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21)) 8 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | cff-version: 1.2.0 2 | message: "If you use this software, please cite it as below." 3 | authors: 4 | - name: "Jing Xu, Wentao Shi, Pan Gao, Qizhu Li, Zhengwei Wang" 5 | title: "MUSTER: A Multi-scale Transformer-based Decoder for Semantic Segmentation" 6 | date-released: 2022-11-25 7 | url: "https://github.com/shiwt03/MUSTER" 8 | license: Apache-2.0 9 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r18-d8_4x4_512x512_80k_potsdam.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_4x4_512x512_80k_potsdam.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r18-d8_4x4_896x896_80k_isaid.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_4x4_896x896_80k_isaid.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /mmseg/core/seg/builder.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmcv.utils import Registry, build_from_cfg 3 | 4 | PIXEL_SAMPLERS = Registry('pixel sampler') 5 | 6 | 7 | def build_pixel_sampler(cfg, **default_args): 8 | """Build pixel sampler for segmentation map.""" 9 | return build_from_cfg(cfg, PIXEL_SAMPLERS, default_args) 10 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet18', 4 | backbone=dict(type='ResNet', depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './fcn_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet18', 4 | backbone=dict(type='ResNet', depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r18-d8_4x4_512x512_80k_vaihingen.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_4x4_512x512_80k_vaihingen.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet18', 4 | backbone=dict(type='ResNet', depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet18', 4 | backbone=dict(type='ResNet', depth=18), 5 | decode_head=dict( 6 | in_channels=512, 7 | channels=128, 8 | ), 9 | auxiliary_head=dict(in_channels=256, channels=64)) 10 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50b-d32_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | pretrained='torchvision://resnet50', 7 | backbone=dict(type='ResNet', dilations=(1, 1, 2, 4), strides=(1, 2, 2, 2))) 8 | -------------------------------------------------------------------------------- /mmseg/datasets/pipelines/formating.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | # flake8: noqa 3 | import warnings 4 | 5 | from .formatting import * 6 | 7 | warnings.warn('DeprecationWarning: mmseg.datasets.pipelines.formating will be ' 8 | 'deprecated in 2021, please replace it with ' 9 | 'mmseg.datasets.pipelines.formatting.') 10 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r50-d16_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | model = dict( 6 | backbone=dict(dilations=(1, 1, 1, 2), strides=(1, 2, 2, 1)), 7 | decode_head=dict(dilation=6), 8 | auxiliary_head=dict(dilation=6)) 9 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r50-d16_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | backbone=dict(dilations=(1, 1, 1, 2), strides=(1, 2, 2, 1)), 7 | decode_head=dict(dilation=6), 8 | auxiliary_head=dict(dilation=6)) 9 | -------------------------------------------------------------------------------- /mmseg/models/necks/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .featurepyramid import Feature2Pyramid 3 | from .fpn import FPN 4 | from .ic_neck import ICNeck 5 | from .jpu import JPU 6 | from .mla_neck import MLANeck 7 | from .multilevel_neck import MultiLevelNeck 8 | 9 | __all__ = [ 10 | 'FPN', 'MultiLevelNeck', 'MLANeck', 'ICNeck', 'JPU', 'Feature2Pyramid' 11 | ] 12 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r18-d8_512x512_80k_loveda.py: -------------------------------------------------------------------------------- 1 | _base_ = './pspnet_r50-d8_512x512_80k_loveda.py' 2 | model = dict( 3 | backbone=dict( 4 | depth=18, 5 | init_cfg=dict( 6 | type='Pretrained', checkpoint='open-mmlab://resnet18_v1c')), 7 | decode_head=dict( 8 | in_channels=512, 9 | channels=128, 10 | ), 11 | auxiliary_head=dict(in_channels=256, channels=64)) 12 | -------------------------------------------------------------------------------- /configs/vit/upernet_deit-s16_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_vit-b16_mln_512x512_160k_ade20k.py' 2 | 3 | model = dict( 4 | pretrained='pretrain/deit_small_patch16_224-cd65a155.pth', 5 | backbone=dict(num_heads=6, embed_dims=384, drop_path_rate=0.1), 6 | decode_head=dict(num_classes=150, in_channels=[384, 384, 384, 384]), 7 | neck=None, 8 | auxiliary_head=dict(num_classes=150, in_channels=384)) 9 | -------------------------------------------------------------------------------- /configs/vit/upernet_deit-s16_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_vit-b16_mln_512x512_80k_ade20k.py' 2 | 3 | model = dict( 4 | pretrained='pretrain/deit_small_patch16_224-cd65a155.pth', 5 | backbone=dict(num_heads=6, embed_dims=384, drop_path_rate=0.1), 6 | decode_head=dict(num_classes=150, in_channels=[384, 384, 384, 384]), 7 | neck=None, 8 | auxiliary_head=dict(num_classes=150, in_channels=384)) 9 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /mmseg/core/seg/sampler/base_pixel_sampler.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from abc import ABCMeta, abstractmethod 3 | 4 | 5 | class BasePixelSampler(metaclass=ABCMeta): 6 | """Base class of pixel sampler.""" 7 | 8 | def __init__(self, **kwargs): 9 | pass 10 | 11 | @abstractmethod 12 | def sample(self, seg_logit, seg_label): 13 | """Placeholder for sample function.""" 14 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_potsdam.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x512_80k_potsdam.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | c1_in_channels=64, 7 | c1_channels=12, 8 | in_channels=512, 9 | channels=128, 10 | ), 11 | auxiliary_head=dict(in_channels=256, channels=64)) 12 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r50_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r50_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_4x4_896x896_80k_isaid.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | c1_in_channels=64, 7 | c1_channels=12, 8 | in_channels=512, 9 | channels=128, 10 | ), 11 | auxiliary_head=dict(in_channels=256, channels=64)) 12 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | c1_in_channels=64, 7 | c1_channels=12, 8 | in_channels=512, 9 | channels=128, 10 | ), 11 | auxiliary_head=dict(in_channels=256, channels=64)) 12 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/psanet_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/psanet_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | c1_in_channels=64, 7 | c1_channels=12, 8 | in_channels=512, 9 | channels=128, 10 | ), 11 | auxiliary_head=dict(in_channels=256, channels=64)) 12 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet18_v1c', 4 | backbone=dict(depth=18), 5 | decode_head=dict( 6 | c1_in_channels=64, 7 | c1_channels=12, 8 | in_channels=512, 9 | channels=128, 10 | ), 11 | auxiliary_head=dict(in_channels=256, channels=64)) 12 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet18', 4 | backbone=dict(type='ResNet', depth=18), 5 | decode_head=dict( 6 | c1_in_channels=64, 7 | c1_channels=12, 8 | in_channels=512, 9 | channels=128, 10 | ), 11 | auxiliary_head=dict(in_channels=256, channels=64)) 12 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_769x769_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='torchvision://resnet18', 4 | backbone=dict(type='ResNet', depth=18), 5 | decode_head=dict( 6 | c1_in_channels=64, 7 | c1_channels=12, 8 | in_channels=512, 9 | channels=128, 10 | ), 11 | auxiliary_head=dict(in_channels=256, channels=64)) 12 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b1_8x1_1024x1024_160k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_8x1_1024x1024_160k_cityscapes.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b1_20220624-02e5a6a1.pth' # noqa 4 | model = dict( 5 | backbone=dict( 6 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint), 7 | embed_dims=64), 8 | decode_head=dict(in_channels=[64, 128, 320, 512])) 9 | -------------------------------------------------------------------------------- /configs/_base_/schedules/schedule_320k.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) 3 | optimizer_config = dict() 4 | # learning policy 5 | lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) 6 | # runtime settings 7 | runner = dict(type='IterBasedRunner', max_iters=320000) 8 | checkpoint_config = dict(by_epoch=False, interval=32000) 9 | evaluation = dict(interval=32000, metric='mIoU') 10 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(align_corners=True), 8 | auxiliary_head=dict(align_corners=True), 9 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 10 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r18_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' 4 | ] 5 | model = dict( 6 | pretrained='open-mmlab://resnet18_v1c', 7 | backbone=dict(depth=18), 8 | decode_head=dict(in_channels=[64, 128, 256, 512], num_classes=150), 9 | auxiliary_head=dict(in_channels=256, num_classes=150)) 10 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r18_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | pretrained='open-mmlab://resnet18_v1c', 7 | backbone=dict(depth=18), 8 | decode_head=dict(in_channels=[64, 128, 256, 512], num_classes=150), 9 | auxiliary_head=dict(in_channels=256, num_classes=150)) 10 | -------------------------------------------------------------------------------- /configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | './upernet_swin_base_patch4_window7_512x512_160k_ade20k_' 3 | 'pretrain_224x224_1K.py' 4 | ] 5 | checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window7_224_22k_20220317-4f79f7c0.pth' # noqa 6 | model = dict( 7 | backbone=dict( 8 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file))) 9 | -------------------------------------------------------------------------------- /configs/_base_/schedules/schedule_20k.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) 3 | optimizer_config = dict() 4 | # learning policy 5 | lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) 6 | # runtime settings 7 | runner = dict(type='IterBasedRunner', max_iters=20000) 8 | checkpoint_config = dict(by_epoch=False, interval=2000) 9 | evaluation = dict(interval=2000, metric='mIoU', pre_eval=True) 10 | -------------------------------------------------------------------------------- /configs/_base_/schedules/schedule_40k.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) 3 | optimizer_config = dict() 4 | # learning policy 5 | lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) 6 | # runtime settings 7 | runner = dict(type='IterBasedRunner', max_iters=40000) 8 | checkpoint_config = dict(by_epoch=False, interval=4000) 9 | evaluation = dict(interval=4000, metric='mIoU', pre_eval=True) 10 | -------------------------------------------------------------------------------- /configs/_base_/schedules/schedule_80k.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) 3 | optimizer_config = dict() 4 | # learning policy 5 | lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) 6 | # runtime settings 7 | runner = dict(type='IterBasedRunner', max_iters=80000) 8 | checkpoint_config = dict(by_epoch=False, interval=8000) 9 | evaluation = dict(interval=8000, metric='mIoU', pre_eval=True) 10 | -------------------------------------------------------------------------------- /configs/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | './upernet_swin_base_patch4_window12_512x512_160k_ade20k_' 3 | 'pretrain_384x384_1K.py' 4 | ] 5 | checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window12_384_22k_20220317-e5c09f74.pth' # noqa 6 | model = dict( 7 | backbone=dict( 8 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file))) 9 | -------------------------------------------------------------------------------- /configs/_base_/schedules/schedule_160k.py: -------------------------------------------------------------------------------- 1 | # optimizer 2 | optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) 3 | optimizer_config = dict() 4 | # learning policy 5 | lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) 6 | # runtime settings 7 | runner = dict(type='IterBasedRunner', max_iters=160000) 8 | checkpoint_config = dict(by_epoch=False, interval=16000) 9 | evaluation = dict(interval=16000, metric='mIoU', pre_eval=True) 10 | -------------------------------------------------------------------------------- /configs/vit/upernet_deit-s16_mln_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_vit-b16_mln_512x512_160k_ade20k.py' 2 | 3 | model = dict( 4 | pretrained='pretrain/deit_small_patch16_224-cd65a155.pth', 5 | backbone=dict(num_heads=6, embed_dims=384, drop_path_rate=0.1), 6 | decode_head=dict(num_classes=150, in_channels=[384, 384, 384, 384]), 7 | neck=dict(in_channels=[384, 384, 384, 384], out_channels=384), 8 | auxiliary_head=dict(num_classes=150, in_channels=384)) 9 | -------------------------------------------------------------------------------- /configs/_base_/default_runtime.py: -------------------------------------------------------------------------------- 1 | # yapf:disable 2 | log_config = dict( 3 | interval=50, 4 | hooks=[ 5 | dict(type='TextLoggerHook', by_epoch=False), 6 | # dict(type='TensorboardLoggerHook') 7 | # dict(type='PaviLoggerHook') # for internal services 8 | ]) 9 | # yapf:enable 10 | dist_params = dict(backend='nccl') 11 | log_level = 'INFO' 12 | load_from = None 13 | resume_from = None 14 | workflow = [('train', 1)] 15 | cudnn_benchmark = True 16 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b1_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_512x512_160k_ade20k.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b1_20220624-02e5a6a1.pth' # noqa 4 | 5 | # model settings 6 | model = dict( 7 | pretrained=checkpoint, 8 | backbone=dict( 9 | embed_dims=64, num_heads=[1, 2, 5, 8], num_layers=[2, 2, 2, 2]), 10 | decode_head=dict(in_channels=[64, 128, 320, 512])) 11 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b2_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_512x512_160k_ade20k.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b2_20220624-66e8bf70.pth' # noqa 4 | 5 | # model settings 6 | model = dict( 7 | pretrained=checkpoint, 8 | backbone=dict( 9 | embed_dims=64, num_heads=[1, 2, 5, 8], num_layers=[3, 4, 6, 3]), 10 | decode_head=dict(in_channels=[64, 128, 320, 512])) 11 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b3_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_512x512_160k_ade20k.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b3_20220624-13b1141c.pth' # noqa 4 | 5 | # model settings 6 | model = dict( 7 | pretrained=checkpoint, 8 | backbone=dict( 9 | embed_dims=64, num_heads=[1, 2, 5, 8], num_layers=[3, 4, 18, 3]), 10 | decode_head=dict(in_channels=[64, 128, 320, 512])) 11 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b4_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_512x512_160k_ade20k.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b4_20220624-d588d980.pth' # noqa 4 | 5 | # model settings 6 | model = dict( 7 | pretrained=checkpoint, 8 | backbone=dict( 9 | embed_dims=64, num_heads=[1, 2, 5, 8], num_layers=[3, 8, 27, 3]), 10 | decode_head=dict(in_channels=[64, 128, 320, 512])) 11 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b5_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_512x512_160k_ade20k.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b5_20220624-658746d9.pth' # noqa 4 | 5 | # model settings 6 | model = dict( 7 | pretrained=checkpoint, 8 | backbone=dict( 9 | embed_dims=64, num_heads=[1, 2, 5, 8], num_layers=[3, 6, 40, 3]), 10 | decode_head=dict(in_channels=[64, 128, 320, 512])) 11 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r18_512x512_20k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_20k.py' 5 | ] 6 | model = dict( 7 | pretrained='open-mmlab://resnet18_v1c', 8 | backbone=dict(depth=18), 9 | decode_head=dict(in_channels=[64, 128, 256, 512], num_classes=21), 10 | auxiliary_head=dict(in_channels=256, num_classes=21)) 11 | -------------------------------------------------------------------------------- /configs/upernet/upernet_r18_512x512_40k_voc12aug.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_r50.py', 3 | '../_base_/datasets/pascal_voc12_aug.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | pretrained='open-mmlab://resnet18_v1c', 8 | backbone=dict(depth=18), 9 | decode_head=dict(in_channels=[64, 128, 256, 512], num_classes=21), 10 | auxiliary_head=dict(in_channels=256, num_classes=21)) 11 | -------------------------------------------------------------------------------- /mmseg/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .collect_env import collect_env 3 | from .logger import get_root_logger 4 | from .misc import find_latest_checkpoint 5 | from .set_env import setup_multi_processes 6 | from .util_distribution import build_ddp, build_dp, get_device 7 | 8 | __all__ = [ 9 | 'get_root_logger', 'collect_env', 'find_latest_checkpoint', 10 | 'setup_multi_processes', 'build_ddp', 'build_dp', 'get_device' 11 | ] 12 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet101_v1c', 4 | backbone=dict( 5 | depth=101, 6 | dilations=(1, 1, 1, 2), 7 | strides=(1, 2, 2, 1), 8 | multi_grid=(1, 2, 4)), 9 | decode_head=dict( 10 | dilations=(1, 6, 12, 18), 11 | sampler=dict(type='OHEMPixelSampler', min_kept=100000))) 12 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py' 2 | model = dict( 3 | pretrained='open-mmlab://resnet101_v1c', 4 | backbone=dict( 5 | depth=101, 6 | dilations=(1, 1, 1, 2), 7 | strides=(1, 2, 2, 1), 8 | multi_grid=(1, 2, 4)), 9 | decode_head=dict( 10 | dilations=(1, 6, 12, 18), 11 | sampler=dict(type='OHEMPixelSampler', min_kept=100000))) 12 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_context.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=60), 7 | auxiliary_head=dict(num_classes=60), 8 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 9 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 10 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', '../_base_/datasets/pascal_context.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | decode_head=dict(num_classes=60), 7 | auxiliary_head=dict(num_classes=60), 8 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 9 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 10 | -------------------------------------------------------------------------------- /mmseg/datasets/dark_zurich.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .builder import DATASETS 3 | from .cityscapes import CityscapesDataset 4 | 5 | 6 | @DATASETS.register_module() 7 | class DarkZurichDataset(CityscapesDataset): 8 | """DarkZurichDataset dataset.""" 9 | 10 | def __init__(self, **kwargs): 11 | super().__init__( 12 | img_suffix='_rgb_anon.png', 13 | seg_map_suffix='_gt_labelTrainIds.png', 14 | **kwargs) 15 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b2_8x1_1024x1024_160k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_8x1_1024x1024_160k_cityscapes.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b2_20220624-66e8bf70.pth' # noqa 4 | model = dict( 5 | backbone=dict( 6 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint), 7 | embed_dims=64, 8 | num_layers=[3, 4, 6, 3]), 9 | decode_head=dict(in_channels=[64, 128, 320, 512])) 10 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b3_8x1_1024x1024_160k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_8x1_1024x1024_160k_cityscapes.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b3_20220624-13b1141c.pth' # noqa 4 | model = dict( 5 | backbone=dict( 6 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint), 7 | embed_dims=64, 8 | num_layers=[3, 4, 18, 3]), 9 | decode_head=dict(in_channels=[64, 128, 320, 512])) 10 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b4_8x1_1024x1024_160k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_8x1_1024x1024_160k_cityscapes.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b4_20220624-d588d980.pth' # noqa 4 | model = dict( 5 | backbone=dict( 6 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint), 7 | embed_dims=64, 8 | num_layers=[3, 8, 27, 3]), 9 | decode_head=dict(in_channels=[64, 128, 320, 512])) 10 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b5_8x1_1024x1024_160k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./segformer_mit-b0_8x1_1024x1024_160k_cityscapes.py'] 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b5_20220624-658746d9.pth' # noqa 4 | model = dict( 5 | backbone=dict( 6 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint), 7 | embed_dims=64, 8 | num_layers=[3, 6, 40, 3]), 9 | decode_head=dict(in_channels=[64, 128, 320, 512])) 10 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_loveda.py: -------------------------------------------------------------------------------- 1 | _base_ = './deeplabv3plus_r50-d8_512x512_80k_loveda.py' 2 | model = dict( 3 | backbone=dict( 4 | depth=18, 5 | init_cfg=dict( 6 | type='Pretrained', checkpoint='open-mmlab://resnet18_v1c')), 7 | decode_head=dict( 8 | c1_in_channels=64, 9 | c1_channels=12, 10 | in_channels=512, 11 | channels=128, 12 | ), 13 | auxiliary_head=dict(in_channels=256, channels=64)) 14 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_480x480_40k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', 3 | '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=59), 8 | auxiliary_head=dict(num_classes=59), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /configs/fcn/fcn_r50-d8_480x480_80k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', 3 | '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=59), 8 | auxiliary_head=dict(num_classes=59), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=60), 8 | auxiliary_head=dict(num_classes=60), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=60), 8 | auxiliary_head=dict(num_classes=60), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /mmseg/datasets/night_driving.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .builder import DATASETS 3 | from .cityscapes import CityscapesDataset 4 | 5 | 6 | @DATASETS.register_module() 7 | class NightDrivingDataset(CityscapesDataset): 8 | """NightDrivingDataset dataset.""" 9 | 10 | def __init__(self, **kwargs): 11 | super().__init__( 12 | img_suffix='_leftImg8bit.png', 13 | seg_map_suffix='_gtCoarse_labelTrainIds.png', 14 | **kwargs) 15 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=59), 8 | auxiliary_head=dict(num_classes=59), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', 3 | '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=59), 8 | auxiliary_head=dict(num_classes=59), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /tools/dist_train.sh: -------------------------------------------------------------------------------- 1 | CONFIG=$1 2 | GPUS=$2 3 | NNODES=${NNODES:-1} 4 | NODE_RANK=${NODE_RANK:-0} 5 | PORT=${PORT:-29500} 6 | MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"} 7 | 8 | PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ 9 | python -m torch.distributed.launch \ 10 | --nnodes=$NNODES \ 11 | --node_rank=$NODE_RANK \ 12 | --master_addr=$MASTER_ADDR \ 13 | --nproc_per_node=$GPUS \ 14 | --master_port=$PORT \ 15 | $(dirname "$0")/train.py \ 16 | $CONFIG \ 17 | --launcher pytorch ${@:3} 18 | -------------------------------------------------------------------------------- /configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = './upernet_vit-b16_mln_512x512_160k_ade20k.py' 2 | 3 | model = dict( 4 | pretrained='pretrain/deit_small_patch16_224-cd65a155.pth', 5 | backbone=dict( 6 | num_heads=6, embed_dims=384, drop_path_rate=0.1, final_norm=True), 7 | decode_head=dict(num_classes=150, in_channels=[384, 384, 384, 384]), 8 | neck=dict(in_channels=[384, 384, 384, 384], out_channels=384), 9 | auxiliary_head=dict(num_classes=150, in_channels=384)) 10 | -------------------------------------------------------------------------------- /mmseg/core/utils/misc.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | def add_prefix(inputs, prefix): 3 | """Add prefix for dict. 4 | 5 | Args: 6 | inputs (dict): The input dict with str keys. 7 | prefix (str): The prefix to add. 8 | 9 | Returns: 10 | 11 | dict: The dict with keys updated with ``prefix``. 12 | """ 13 | 14 | outputs = dict() 15 | for name, value in inputs.items(): 16 | outputs[f'{prefix}.{name}'] = value 17 | 18 | return outputs 19 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=60), 8 | auxiliary_head=dict(num_classes=60), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/pascal_context.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=60), 8 | auxiliary_head=dict(num_classes=60), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r50-d16_769x769_40k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | backbone=dict(dilations=(1, 1, 1, 2), strides=(1, 2, 2, 1)), 8 | decode_head=dict(align_corners=True, dilation=6), 9 | auxiliary_head=dict(align_corners=True, dilation=6), 10 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 11 | -------------------------------------------------------------------------------- /configs/fcn/fcn_d6_r50-d16_769x769_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/fcn_r50-d8.py', 3 | '../_base_/datasets/cityscapes_769x769.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | backbone=dict(dilations=(1, 1, 1, 2), strides=(1, 2, 2, 1)), 8 | decode_head=dict(align_corners=True, dilation=6), 9 | auxiliary_head=dict(align_corners=True, dilation=6), 10 | test_cfg=dict(mode='slide', crop_size=(769, 769), stride=(513, 513))) 11 | -------------------------------------------------------------------------------- /mmseg/core/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .builder import (OPTIMIZER_BUILDERS, build_optimizer, 3 | build_optimizer_constructor) 4 | from .evaluation import * # noqa: F401, F403 5 | from .hook import * # noqa: F401, F403 6 | from .optimizers import * # noqa: F401, F403 7 | from .seg import * # noqa: F401, F403 8 | from .utils import * # noqa: F401, F403 9 | 10 | __all__ = [ 11 | 'OPTIMIZER_BUILDERS', 'build_optimizer', 'build_optimizer_constructor' 12 | ] 13 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_40k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=59), 8 | auxiliary_head=dict(num_classes=59), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context_59.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/deeplabv3plus_r50-d8.py', 3 | '../_base_/datasets/pascal_context_59.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | decode_head=dict(num_classes=59), 8 | auxiliary_head=dict(num_classes=59), 9 | test_cfg=dict(mode='slide', crop_size=(480, 480), stride=(320, 320))) 10 | optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) 11 | -------------------------------------------------------------------------------- /configs/swin/upernet_swin_large_patch4_window12_512x512_pretrain_384x384_22K_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | 'upernet_swin_large_patch4_window7_512x512_' 3 | 'pretrain_224x224_22K_160k_ade20k.py' 4 | ] 5 | checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window12_384_22k_20220412-6580f57d.pth' # noqa 6 | model = dict( 7 | backbone=dict( 8 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), 9 | pretrain_img_size=384, 10 | window_size=12)) 11 | -------------------------------------------------------------------------------- /mmseg/core/evaluation/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .class_names import get_classes, get_palette 3 | from .eval_hooks import DistEvalHook, EvalHook 4 | from .metrics import (eval_metrics, intersect_and_union, mean_dice, 5 | mean_fscore, mean_iou, pre_eval_to_metrics) 6 | 7 | __all__ = [ 8 | 'EvalHook', 'DistEvalHook', 'mean_dice', 'mean_iou', 'mean_fscore', 9 | 'eval_metrics', 'get_classes', 'get_palette', 'pre_eval_to_metrics', 10 | 'intersect_and_union' 11 | ] 12 | -------------------------------------------------------------------------------- /mmseg/apis/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .inference import inference_segmentor, init_segmentor, show_result_pyplot 3 | from .test import multi_gpu_test, single_gpu_test 4 | from .train import (get_root_logger, init_random_seed, set_random_seed, 5 | train_segmentor) 6 | 7 | __all__ = [ 8 | 'get_root_logger', 'set_random_seed', 'train_segmentor', 'init_segmentor', 9 | 'inference_segmentor', 'multi_gpu_test', 'single_gpu_test', 10 | 'show_result_pyplot', 'init_random_seed' 11 | ] 12 | -------------------------------------------------------------------------------- /tools/dist_test.sh: -------------------------------------------------------------------------------- 1 | CONFIG=$1 2 | CHECKPOINT=$2 3 | GPUS=$3 4 | NNODES=${NNODES:-1} 5 | NODE_RANK=${NODE_RANK:-0} 6 | PORT=${PORT:-29500} 7 | MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"} 8 | 9 | PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ 10 | python -m torch.distributed.launch \ 11 | --nnodes=$NNODES \ 12 | --node_rank=$NODE_RANK \ 13 | --master_addr=$MASTER_ADDR \ 14 | --nproc_per_node=$GPUS \ 15 | --master_port=$PORT \ 16 | $(dirname "$0")/test.py \ 17 | $CONFIG \ 18 | $CHECKPOINT \ 19 | --launcher pytorch \ 20 | ${@:4} 21 | -------------------------------------------------------------------------------- /mmseg/utils/collect_env.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmcv.utils import collect_env as collect_base_env 3 | from mmcv.utils import get_git_hash 4 | 5 | import mmseg 6 | 7 | 8 | def collect_env(): 9 | """Collect the information of the running environments.""" 10 | env_info = collect_base_env() 11 | env_info['MMSegmentation'] = f'{mmseg.__version__}+{get_git_hash()[:7]}' 12 | 13 | return env_info 14 | 15 | 16 | if __name__ == '__main__': 17 | for name, val in collect_env().items(): 18 | print('{}: {}'.format(name, val)) 19 | -------------------------------------------------------------------------------- /mmseg/version.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) Open-MMLab. All rights reserved. 2 | 3 | __version__ = '0.28.0' 4 | 5 | 6 | def parse_version_info(version_str): 7 | version_info = [] 8 | for x in version_str.split('.'): 9 | if x.isdigit(): 10 | version_info.append(int(x)) 11 | elif x.find('rc') != -1: 12 | patch_version = x.split('rc') 13 | version_info.append(int(patch_version[0])) 14 | version_info.append(f'rc{patch_version[1]}') 15 | return tuple(version_info) 16 | 17 | 18 | version_info = parse_version_info(__version__) 19 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_gc_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models.decode_heads import GCHead 5 | from .utils import to_cuda 6 | 7 | 8 | def test_gc_head(): 9 | head = GCHead(in_channels=4, channels=4, num_classes=19) 10 | assert len(head.convs) == 2 11 | assert hasattr(head, 'gc_block') 12 | inputs = [torch.randn(1, 4, 23, 23)] 13 | if torch.cuda.is_available(): 14 | head, inputs = to_cuda(head, inputs) 15 | outputs = head(inputs) 16 | assert outputs.shape == (1, head.num_classes, 23, 23) 17 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_nl_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models.decode_heads import NLHead 5 | from .utils import to_cuda 6 | 7 | 8 | def test_nl_head(): 9 | head = NLHead(in_channels=8, channels=4, num_classes=19) 10 | assert len(head.convs) == 2 11 | assert hasattr(head, 'nl_block') 12 | inputs = [torch.randn(1, 8, 23, 23)] 13 | if torch.cuda.is_available(): 14 | head, inputs = to_cuda(head, inputs) 15 | outputs = head(inputs) 16 | assert outputs.shape == (1, head.num_classes, 23, 23) 17 | -------------------------------------------------------------------------------- /mmseg/models/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .backbones import * # noqa: F401,F403 3 | from .builder import (BACKBONES, HEADS, LOSSES, SEGMENTORS, build_backbone, 4 | build_head, build_loss, build_segmentor) 5 | from .decode_heads import * # noqa: F401,F403 6 | from .losses import * # noqa: F401,F403 7 | from .necks import * # noqa: F401,F403 8 | from .segmentors import * # noqa: F401,F403 9 | 10 | __all__ = [ 11 | 'BACKBONES', 'HEADS', 'LOSSES', 'SEGMENTORS', 'build_backbone', 12 | 'build_head', 'build_loss', 'build_segmentor' 13 | ] 14 | -------------------------------------------------------------------------------- /tests/test_models/test_necks/test_mla_neck.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models import MLANeck 5 | 6 | 7 | def test_mla(): 8 | in_channels = [4, 4, 4, 4] 9 | mla = MLANeck(in_channels, 32) 10 | 11 | inputs = [torch.randn(1, c, 12, 12) for i, c in enumerate(in_channels)] 12 | outputs = mla(inputs) 13 | assert outputs[0].shape == torch.Size([1, 32, 12, 12]) 14 | assert outputs[1].shape == torch.Size([1, 32, 12, 12]) 15 | assert outputs[2].shape == torch.Size([1, 32, 12, 12]) 16 | assert outputs[3].shape == torch.Size([1, 32, 12, 12]) 17 | -------------------------------------------------------------------------------- /configs/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | './upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_' 3 | 'pretrain_224x224_1K.py' 4 | ] 5 | checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_small_patch4_window7_224_20220317-7ba6d6dd.pth' # noqa 6 | model = dict( 7 | backbone=dict( 8 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), 9 | depths=[2, 2, 18, 2]), 10 | decode_head=dict(in_channels=[96, 192, 384, 768], num_classes=150), 11 | auxiliary_head=dict(in_channels=384, num_classes=150)) 12 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_isa_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models.decode_heads import ISAHead 5 | from .utils import to_cuda 6 | 7 | 8 | def test_isa_head(): 9 | 10 | inputs = [torch.randn(1, 8, 23, 23)] 11 | isa_head = ISAHead( 12 | in_channels=8, 13 | channels=4, 14 | num_classes=19, 15 | isa_channels=4, 16 | down_factor=(8, 8)) 17 | if torch.cuda.is_available(): 18 | isa_head, inputs = to_cuda(isa_head, inputs) 19 | output = isa_head(inputs) 20 | assert output.shape == (1, isa_head.num_classes, 23, 23) 21 | -------------------------------------------------------------------------------- /tools/slurm_train.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -x 4 | 5 | PARTITION=$1 6 | JOB_NAME=$2 7 | CONFIG=$3 8 | GPUS=${GPUS:-4} 9 | GPUS_PER_NODE=${GPUS_PER_NODE:-4} 10 | CPUS_PER_TASK=${CPUS_PER_TASK:-5} 11 | SRUN_ARGS=${SRUN_ARGS:-""} 12 | PY_ARGS=${@:4} 13 | 14 | PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ 15 | srun -p ${PARTITION} \ 16 | --job-name=${JOB_NAME} \ 17 | --gres=gpu:${GPUS_PER_NODE} \ 18 | --ntasks=${GPUS} \ 19 | --ntasks-per-node=${GPUS_PER_NODE} \ 20 | --cpus-per-task=${CPUS_PER_TASK} \ 21 | --kill-on-bad-exit=1 \ 22 | ${SRUN_ARGS} \ 23 | python -u tools/train.py ${CONFIG} --launcher="slurm" ${PY_ARGS} 24 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_cc_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import pytest 3 | import torch 4 | 5 | from mmseg.models.decode_heads import CCHead 6 | from .utils import to_cuda 7 | 8 | 9 | def test_cc_head(): 10 | head = CCHead(in_channels=16, channels=8, num_classes=19) 11 | assert len(head.convs) == 2 12 | assert hasattr(head, 'cca') 13 | if not torch.cuda.is_available(): 14 | pytest.skip('CCHead requires CUDA') 15 | inputs = [torch.randn(1, 16, 23, 23)] 16 | head, inputs = to_cuda(head, inputs) 17 | outputs = head(inputs) 18 | assert outputs.shape == (1, head.num_classes, 23, 23) 19 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_ann_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models.decode_heads import ANNHead 5 | from .utils import to_cuda 6 | 7 | 8 | def test_ann_head(): 9 | 10 | inputs = [torch.randn(1, 4, 45, 45), torch.randn(1, 8, 21, 21)] 11 | head = ANNHead( 12 | in_channels=[4, 8], 13 | channels=2, 14 | num_classes=19, 15 | in_index=[-2, -1], 16 | project_channels=8) 17 | if torch.cuda.is_available(): 18 | head, inputs = to_cuda(head, inputs) 19 | outputs = head(inputs) 20 | assert outputs.shape == (1, head.num_classes, 21, 21) 21 | -------------------------------------------------------------------------------- /tools/slurm_test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -x 4 | 5 | PARTITION=$1 6 | JOB_NAME=$2 7 | CONFIG=$3 8 | CHECKPOINT=$4 9 | GPUS=${GPUS:-4} 10 | GPUS_PER_NODE=${GPUS_PER_NODE:-4} 11 | CPUS_PER_TASK=${CPUS_PER_TASK:-5} 12 | PY_ARGS=${@:5} 13 | SRUN_ARGS=${SRUN_ARGS:-""} 14 | 15 | PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ 16 | srun -p ${PARTITION} \ 17 | --job-name=${JOB_NAME} \ 18 | --gres=gpu:${GPUS_PER_NODE} \ 19 | --ntasks=${GPUS} \ 20 | --ntasks-per-node=${GPUS_PER_NODE} \ 21 | --cpus-per-task=${CPUS_PER_TASK} \ 22 | --kill-on-bad-exit=1 \ 23 | ${SRUN_ARGS} \ 24 | python -u tools/test.py ${CONFIG} ${CHECKPOINT} --launcher="slurm" ${PY_ARGS} 25 | -------------------------------------------------------------------------------- /.dev/log_collector/utils.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | # modified from https://github.dev/open-mmlab/mmcv 3 | import os.path as osp 4 | import sys 5 | from importlib import import_module 6 | 7 | 8 | def load_config(cfg_dir: str) -> dict: 9 | assert cfg_dir.endswith('.py') 10 | root_path, file_name = osp.split(cfg_dir) 11 | temp_module = osp.splitext(file_name)[0] 12 | sys.path.insert(0, root_path) 13 | mod = import_module(temp_module) 14 | sys.path.pop(0) 15 | cfg_dict = { 16 | k: v 17 | for k, v in mod.__dict__.items() if not k.startswith('__') 18 | } 19 | del sys.modules[temp_module] 20 | return cfg_dict 21 | -------------------------------------------------------------------------------- /configs/setr/setr_vit-large_mla_8x1_768x768_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/setr_mla.py', '../_base_/datasets/cityscapes_768x768.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | model = dict( 6 | pretrained=None, 7 | backbone=dict( 8 | drop_rate=0, 9 | init_cfg=dict( 10 | type='Pretrained', checkpoint='pretrain/vit_large_p16.pth')), 11 | test_cfg=dict(mode='slide', crop_size=(768, 768), stride=(512, 512))) 12 | 13 | optimizer = dict( 14 | lr=0.002, 15 | weight_decay=0.0, 16 | paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) 17 | data = dict(samples_per_gpu=1) 18 | -------------------------------------------------------------------------------- /configs/setr/setr_vit-large_naive_8x1_768x768_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/setr_naive.py', 3 | '../_base_/datasets/cityscapes_768x768.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | model = dict( 7 | pretrained=None, 8 | backbone=dict( 9 | drop_rate=0., 10 | init_cfg=dict( 11 | type='Pretrained', checkpoint='pretrain/vit_large_p16.pth')), 12 | test_cfg=dict(mode='slide', crop_size=(768, 768), stride=(512, 512))) 13 | 14 | optimizer = dict( 15 | weight_decay=0.0, 16 | paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10.)})) 17 | 18 | data = dict(samples_per_gpu=1) 19 | -------------------------------------------------------------------------------- /configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | './upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_' 3 | 'pretrain_224x224_1K.py' 4 | ] 5 | checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window7_224_20220317-e9b98025.pth' # noqa 6 | model = dict( 7 | backbone=dict( 8 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), 9 | embed_dims=128, 10 | depths=[2, 2, 18, 2], 11 | num_heads=[4, 8, 16, 32]), 12 | decode_head=dict(in_channels=[128, 256, 512, 1024], num_classes=150), 13 | auxiliary_head=dict(in_channels=512, num_classes=150)) 14 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/utils.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmcv.cnn import ConvModule 3 | from mmcv.utils.parrots_wrapper import SyncBatchNorm 4 | 5 | 6 | def _conv_has_norm(module, sync_bn): 7 | for m in module.modules(): 8 | if isinstance(m, ConvModule): 9 | if not m.with_norm: 10 | return False 11 | if sync_bn: 12 | if not isinstance(m.bn, SyncBatchNorm): 13 | return False 14 | return True 15 | 16 | 17 | def to_cuda(module, data): 18 | module = module.cuda() 19 | if isinstance(data, list): 20 | for i in range(len(data)): 21 | data[i] = data[i].cuda() 22 | return module, data 23 | -------------------------------------------------------------------------------- /.dev/log_collector/example_config.py: -------------------------------------------------------------------------------- 1 | work_dir = '../../work_dirs' 2 | metric = 'mIoU' 3 | 4 | # specify the log files we would like to collect in `log_items` 5 | log_items = [ 6 | 'segformer_mit-b5_512x512_160k_ade20k_cnn_lr_with_warmup', 7 | 'segformer_mit-b5_512x512_160k_ade20k_cnn_no_warmup_lr', 8 | 'segformer_mit-b5_512x512_160k_ade20k_mit_trans_lr', 9 | 'segformer_mit-b5_512x512_160k_ade20k_swin_trans_lr' 10 | ] 11 | # or specify ignore_keywords, then the folders whose name contain 12 | # `'segformer'` won't be collected 13 | # ignore_keywords = ['segformer'] 14 | 15 | # should not include metric 16 | other_info_keys = ['mAcc'] 17 | markdown_file = 'markdowns/lr_in_trans.json.md' 18 | json_file = 'jsons/trans_in_cnn.json' 19 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_ocr_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models.decode_heads import FCNHead, OCRHead 5 | from .utils import to_cuda 6 | 7 | 8 | def test_ocr_head(): 9 | 10 | inputs = [torch.randn(1, 8, 23, 23)] 11 | ocr_head = OCRHead( 12 | in_channels=8, channels=4, num_classes=19, ocr_channels=8) 13 | fcn_head = FCNHead(in_channels=8, channels=4, num_classes=19) 14 | if torch.cuda.is_available(): 15 | head, inputs = to_cuda(ocr_head, inputs) 16 | head, inputs = to_cuda(fcn_head, inputs) 17 | prev_output = fcn_head(inputs) 18 | output = ocr_head(inputs, prev_output) 19 | assert output.shape == (1, ocr_head.num_classes, 23, 23) 20 | -------------------------------------------------------------------------------- /mmseg/models/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .embed import PatchEmbed 3 | from .inverted_residual import InvertedResidual, InvertedResidualV3 4 | from .make_divisible import make_divisible 5 | from .res_layer import ResLayer 6 | from .se_layer import SELayer 7 | from .self_attention_block import SelfAttentionBlock 8 | from .shape_convert import (nchw2nlc2nchw, nchw_to_nlc, nlc2nchw2nlc, 9 | nlc_to_nchw) 10 | from .up_conv_block import UpConvBlock 11 | 12 | __all__ = [ 13 | 'ResLayer', 'SelfAttentionBlock', 'make_divisible', 'InvertedResidual', 14 | 'UpConvBlock', 'InvertedResidualV3', 'SELayer', 'PatchEmbed', 15 | 'nchw_to_nlc', 'nlc_to_nchw', 'nchw2nlc2nchw', 'nlc2nchw2nlc' 16 | ] 17 | -------------------------------------------------------------------------------- /configs/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | 'upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_' 3 | 'pretrain_224x224_1K.py' 4 | ] 5 | checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_base_patch4_window12_384_20220317-55b0104a.pth' # noqa 6 | model = dict( 7 | backbone=dict( 8 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), 9 | pretrain_img_size=384, 10 | embed_dims=128, 11 | depths=[2, 2, 18, 2], 12 | num_heads=[4, 8, 16, 32], 13 | window_size=12), 14 | decode_head=dict(in_channels=[128, 256, 512, 1024], num_classes=150), 15 | auxiliary_head=dict(in_channels=512, num_classes=150)) 16 | -------------------------------------------------------------------------------- /mmseg/models/losses/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .accuracy import Accuracy, accuracy 3 | from .cross_entropy_loss import (CrossEntropyLoss, binary_cross_entropy, 4 | cross_entropy, mask_cross_entropy) 5 | from .dice_loss import DiceLoss 6 | from .focal_loss import FocalLoss 7 | from .lovasz_loss import LovaszLoss 8 | from .tversky_loss import TverskyLoss 9 | from .utils import reduce_loss, weight_reduce_loss, weighted_loss 10 | 11 | __all__ = [ 12 | 'accuracy', 'Accuracy', 'cross_entropy', 'binary_cross_entropy', 13 | 'mask_cross_entropy', 'CrossEntropyLoss', 'reduce_loss', 14 | 'weight_reduce_loss', 'weighted_loss', 'LovaszLoss', 'DiceLoss', 15 | 'FocalLoss', 'TverskyLoss' 16 | ] 17 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_da_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models.decode_heads import DAHead 5 | from .utils import to_cuda 6 | 7 | 8 | def test_da_head(): 9 | 10 | inputs = [torch.randn(1, 16, 23, 23)] 11 | head = DAHead(in_channels=16, channels=8, num_classes=19, pam_channels=8) 12 | if torch.cuda.is_available(): 13 | head, inputs = to_cuda(head, inputs) 14 | outputs = head(inputs) 15 | assert isinstance(outputs, tuple) and len(outputs) == 3 16 | for output in outputs: 17 | assert output.shape == (1, head.num_classes, 23, 23) 18 | test_output = head.forward_test(inputs, None, None) 19 | assert test_output.shape == (1, head.num_classes, 23, 23) 20 | -------------------------------------------------------------------------------- /configs/swin/upernet_swin_large_patch4_window7_512x512_pretrain_224x224_22K_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | 'upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_' 3 | 'pretrain_224x224_1K.py' 4 | ] 5 | checkpoint_file = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/swin/swin_large_patch4_window7_224_22k_20220412-aeecf2aa.pth' # noqa 6 | model = dict( 7 | backbone=dict( 8 | init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file), 9 | pretrain_img_size=224, 10 | embed_dims=192, 11 | depths=[2, 2, 18, 2], 12 | num_heads=[6, 12, 24, 48], 13 | window_size=7), 14 | decode_head=dict(in_channels=[192, 384, 768, 1536], num_classes=150), 15 | auxiliary_head=dict(in_channels=768, num_classes=150)) 16 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_ema_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models.decode_heads import EMAHead 5 | from .utils import to_cuda 6 | 7 | 8 | def test_emanet_head(): 9 | head = EMAHead( 10 | in_channels=4, 11 | ema_channels=3, 12 | channels=2, 13 | num_stages=3, 14 | num_bases=2, 15 | num_classes=19) 16 | for param in head.ema_mid_conv.parameters(): 17 | assert not param.requires_grad 18 | assert hasattr(head, 'ema_module') 19 | inputs = [torch.randn(1, 4, 23, 23)] 20 | if torch.cuda.is_available(): 21 | head, inputs = to_cuda(head, inputs) 22 | outputs = head(inputs) 23 | assert outputs.shape == (1, head.num_classes, 23, 23) 24 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [yapf] 2 | based_on_style = pep8 3 | blank_line_before_nested_class_or_def = true 4 | split_before_expression_after_opening_paren = true 5 | 6 | [isort] 7 | line_length = 79 8 | multi_line_output = 0 9 | extra_standard_library = setuptools 10 | known_first_party = mmseg 11 | known_third_party = PIL,cityscapesscripts,cv2,detail,matplotlib,mmcv,numpy,onnxruntime,packaging,prettytable,pytest,pytorch_sphinx_theme,requests,scipy,seaborn,torch,ts 12 | no_lines_before = STDLIB,LOCALFOLDER 13 | default_section = THIRDPARTY 14 | 15 | # ignore-words-list needs to be lowercase format. For example, if we want to 16 | # ignore word "BA", then we need to append "ba" to ignore-words-list rather 17 | # than "BA" 18 | [codespell] 19 | skip = *.po,*.ts,*.ipynb 20 | count = 21 | quiet-level = 3 22 | ignore-words-list = formating,sur,hist,dota,ba 23 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_segmenter_mask_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models.decode_heads import SegmenterMaskTransformerHead 5 | from .utils import _conv_has_norm, to_cuda 6 | 7 | 8 | def test_segmenter_mask_transformer_head(): 9 | head = SegmenterMaskTransformerHead( 10 | in_channels=2, 11 | channels=2, 12 | num_classes=150, 13 | num_layers=2, 14 | num_heads=3, 15 | embed_dims=192, 16 | dropout_ratio=0.0) 17 | assert _conv_has_norm(head, sync_bn=True) 18 | head.init_weights() 19 | 20 | inputs = [torch.randn(1, 2, 32, 32)] 21 | if torch.cuda.is_available(): 22 | head, inputs = to_cuda(head, inputs) 23 | outputs = head(inputs) 24 | assert outputs.shape == (1, head.num_classes, 32, 32) 25 | -------------------------------------------------------------------------------- /LICENSES.md: -------------------------------------------------------------------------------- 1 | # Licenses for special features 2 | 3 | In this file, we list the features with other licenses instead of Apache 2.0. Users should be careful about adopting these features in any commercial matters. 4 | 5 | | Feature | Files | License | 6 | | :-------: | :-------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------: | 7 | | SegFormer | [mmseg/models/decode_heads/segformer_head.py](https://github.com/open-mmlab/mmsegmentation/blob/master/mmseg/models/decode_heads/segformer_head.py) | [NVIDIA License](https://github.com/NVlabs/SegFormer#license) | 8 | -------------------------------------------------------------------------------- /configs/_base_/models/lraspp_m-v3-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', eps=0.001, requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | backbone=dict( 6 | type='MobileNetV3', 7 | arch='large', 8 | out_indices=(1, 3, 16), 9 | norm_cfg=norm_cfg), 10 | decode_head=dict( 11 | type='LRASPPHead', 12 | in_channels=(16, 24, 960), 13 | in_index=(0, 1, 2), 14 | channels=128, 15 | input_transform='multiple_select', 16 | dropout_ratio=0.1, 17 | num_classes=19, 18 | norm_cfg=norm_cfg, 19 | act_cfg=dict(type='ReLU'), 20 | align_corners=False, 21 | loss_decode=dict( 22 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 23 | # model training and testing settings 24 | train_cfg=dict(), 25 | test_cfg=dict(mode='whole')) 26 | -------------------------------------------------------------------------------- /mmseg/datasets/hrf.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | 3 | from .builder import DATASETS 4 | from .custom import CustomDataset 5 | 6 | 7 | @DATASETS.register_module() 8 | class HRFDataset(CustomDataset): 9 | """HRF dataset. 10 | 11 | In segmentation map annotation for HRF, 0 stands for background, which is 12 | included in 2 categories. ``reduce_zero_label`` is fixed to False. The 13 | ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to 14 | '.png'. 15 | """ 16 | 17 | CLASSES = ('background', 'vessel') 18 | 19 | PALETTE = [[120, 120, 120], [6, 230, 230]] 20 | 21 | def __init__(self, **kwargs): 22 | super(HRFDataset, self).__init__( 23 | img_suffix='.png', 24 | seg_map_suffix='.png', 25 | reduce_zero_label=False, 26 | **kwargs) 27 | assert self.file_client.exists(self.img_dir) 28 | -------------------------------------------------------------------------------- /mmseg/datasets/drive.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | 3 | from .builder import DATASETS 4 | from .custom import CustomDataset 5 | 6 | 7 | @DATASETS.register_module() 8 | class DRIVEDataset(CustomDataset): 9 | """DRIVE dataset. 10 | 11 | In segmentation map annotation for DRIVE, 0 stands for background, which is 12 | included in 2 categories. ``reduce_zero_label`` is fixed to False. The 13 | ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to 14 | '_manual1.png'. 15 | """ 16 | 17 | CLASSES = ('background', 'vessel') 18 | 19 | PALETTE = [[120, 120, 120], [6, 230, 230]] 20 | 21 | def __init__(self, **kwargs): 22 | super(DRIVEDataset, self).__init__( 23 | img_suffix='.png', 24 | seg_map_suffix='_manual1.png', 25 | reduce_zero_label=False, 26 | **kwargs) 27 | assert self.file_client.exists(self.img_dir) 28 | -------------------------------------------------------------------------------- /mmseg/datasets/stare.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import os.path as osp 3 | 4 | from .builder import DATASETS 5 | from .custom import CustomDataset 6 | 7 | 8 | @DATASETS.register_module() 9 | class STAREDataset(CustomDataset): 10 | """STARE dataset. 11 | 12 | In segmentation map annotation for STARE, 0 stands for background, which is 13 | included in 2 categories. ``reduce_zero_label`` is fixed to False. The 14 | ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to 15 | '.ah.png'. 16 | """ 17 | 18 | CLASSES = ('background', 'vessel') 19 | 20 | PALETTE = [[120, 120, 120], [6, 230, 230]] 21 | 22 | def __init__(self, **kwargs): 23 | super(STAREDataset, self).__init__( 24 | img_suffix='.png', 25 | seg_map_suffix='.ah.png', 26 | reduce_zero_label=False, 27 | **kwargs) 28 | assert osp.exists(self.img_dir) 29 | -------------------------------------------------------------------------------- /mmseg/datasets/isprs.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .builder import DATASETS 3 | from .custom import CustomDataset 4 | 5 | 6 | @DATASETS.register_module() 7 | class ISPRSDataset(CustomDataset): 8 | """ISPRS dataset. 9 | 10 | In segmentation map annotation for LoveDA, 0 is the ignore index. 11 | ``reduce_zero_label`` should be set to True. The ``img_suffix`` and 12 | ``seg_map_suffix`` are both fixed to '.png'. 13 | """ 14 | CLASSES = ('impervious_surface', 'building', 'low_vegetation', 'tree', 15 | 'car', 'clutter') 16 | 17 | PALETTE = [[255, 255, 255], [0, 0, 255], [0, 255, 255], [0, 255, 0], 18 | [255, 255, 0], [255, 0, 0]] 19 | 20 | def __init__(self, **kwargs): 21 | super(ISPRSDataset, self).__init__( 22 | img_suffix='.png', 23 | seg_map_suffix='.png', 24 | reduce_zero_label=True, 25 | **kwargs) 26 | -------------------------------------------------------------------------------- /mmseg/datasets/chase_db1.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | 3 | from .builder import DATASETS 4 | from .custom import CustomDataset 5 | 6 | 7 | @DATASETS.register_module() 8 | class ChaseDB1Dataset(CustomDataset): 9 | """Chase_db1 dataset. 10 | 11 | In segmentation map annotation for Chase_db1, 0 stands for background, 12 | which is included in 2 categories. ``reduce_zero_label`` is fixed to False. 13 | The ``img_suffix`` is fixed to '.png' and ``seg_map_suffix`` is fixed to 14 | '_1stHO.png'. 15 | """ 16 | 17 | CLASSES = ('background', 'vessel') 18 | 19 | PALETTE = [[120, 120, 120], [6, 230, 230]] 20 | 21 | def __init__(self, **kwargs): 22 | super(ChaseDB1Dataset, self).__init__( 23 | img_suffix='.png', 24 | seg_map_suffix='_1stHO.png', 25 | reduce_zero_label=False, 26 | **kwargs) 27 | assert self.file_client.exists(self.img_dir) 28 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_rsb-pretrain_512x1024_adamw_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth' # noqa 6 | model = dict( 7 | pretrained=None, 8 | backbone=dict( 9 | type='ResNet', 10 | init_cfg=dict( 11 | type='Pretrained', prefix='backbone.', checkpoint=checkpoint))) 12 | 13 | optimizer = dict(_delete_=True, type='AdamW', lr=0.0005, weight_decay=0.05) 14 | optimizer_config = dict(grad_clip=dict(max_norm=1, norm_type=2)) 15 | # learning policy 16 | lr_config = dict( 17 | _delete_=True, 18 | policy='step', 19 | warmup='linear', 20 | warmup_iters=1000, 21 | warmup_ratio=0.001, 22 | step=[60000, 72000], 23 | by_epoch=False) 24 | -------------------------------------------------------------------------------- /mmseg/datasets/potsdam.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .builder import DATASETS 3 | from .custom import CustomDataset 4 | 5 | 6 | @DATASETS.register_module() 7 | class PotsdamDataset(CustomDataset): 8 | """ISPRS Potsdam dataset. 9 | 10 | In segmentation map annotation for Potsdam dataset, 0 is the ignore index. 11 | ``reduce_zero_label`` should be set to True. The ``img_suffix`` and 12 | ``seg_map_suffix`` are both fixed to '.png'. 13 | """ 14 | CLASSES = ('impervious_surface', 'building', 'low_vegetation', 'tree', 15 | 'car', 'clutter') 16 | 17 | PALETTE = [[255, 255, 255], [0, 0, 255], [0, 255, 255], [0, 255, 0], 18 | [255, 255, 0], [255, 0, 0]] 19 | 20 | def __init__(self, **kwargs): 21 | super(PotsdamDataset, self).__init__( 22 | img_suffix='.png', 23 | seg_map_suffix='.png', 24 | reduce_zero_label=True, 25 | **kwargs) 26 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth' # noqa 6 | model = dict( 7 | pretrained=None, 8 | backbone=dict( 9 | type='ResNet', 10 | init_cfg=dict( 11 | type='Pretrained', prefix='backbone.', checkpoint=checkpoint), 12 | dilations=(1, 1, 2, 4), 13 | strides=(1, 2, 2, 2))) 14 | 15 | optimizer = dict(_delete_=True, type='AdamW', lr=0.0005, weight_decay=0.05) 16 | optimizer_config = dict(grad_clip=dict(max_norm=1, norm_type=2)) 17 | # learning policy 18 | lr_config = dict( 19 | _delete_=True, 20 | policy='step', 21 | warmup='linear', 22 | warmup_iters=1000, 23 | warmup_ratio=0.001, 24 | step=[60000, 72000], 25 | by_epoch=False) 26 | -------------------------------------------------------------------------------- /mmseg/datasets/pipelines/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .compose import Compose 3 | from .formatting import (Collect, ImageToTensor, ToDataContainer, ToTensor, 4 | Transpose, to_tensor) 5 | from .loading import LoadAnnotations, LoadImageFromFile 6 | from .test_time_aug import MultiScaleFlipAug 7 | from .transforms import (CLAHE, AdjustGamma, Normalize, Pad, 8 | PhotoMetricDistortion, RandomCrop, RandomCutOut, 9 | RandomFlip, RandomMosaic, RandomRotate, Rerange, 10 | Resize, RGB2Gray, SegRescale) 11 | 12 | __all__ = [ 13 | 'Compose', 'to_tensor', 'ToTensor', 'ImageToTensor', 'ToDataContainer', 14 | 'Transpose', 'Collect', 'LoadAnnotations', 'LoadImageFromFile', 15 | 'MultiScaleFlipAug', 'Resize', 'RandomFlip', 'Pad', 'RandomCrop', 16 | 'Normalize', 'SegRescale', 'PhotoMetricDistortion', 'RandomRotate', 17 | 'AdjustGamma', 'CLAHE', 'Rerange', 'RGB2Gray', 'RandomCutOut', 18 | 'RandomMosaic' 19 | ] 20 | -------------------------------------------------------------------------------- /mmseg/utils/logger.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import logging 3 | 4 | from mmcv.utils import get_logger 5 | 6 | 7 | def get_root_logger(log_file=None, log_level=logging.INFO): 8 | """Get the root logger. 9 | 10 | The logger will be initialized if it has not been initialized. By default a 11 | StreamHandler will be added. If `log_file` is specified, a FileHandler will 12 | also be added. The name of the root logger is the top-level package name, 13 | e.g., "mmseg". 14 | 15 | Args: 16 | log_file (str | None): The log filename. If specified, a FileHandler 17 | will be added to the root logger. 18 | log_level (int): The root logger level. Note that only the process of 19 | rank 0 is affected, while other processes will set the level to 20 | "Error" and be silent most of the time. 21 | 22 | Returns: 23 | logging.Logger: The root logger. 24 | """ 25 | 26 | logger = get_logger(name='mmseg', log_file=log_file, log_level=log_level) 27 | 28 | return logger 29 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b0_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/segformer_mit-b0.py', '../_base_/datasets/ade20k.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' 4 | ] 5 | 6 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b0_20220624-7e0fe6dd.pth' # noqa 7 | 8 | model = dict(pretrained=checkpoint, decode_head=dict(num_classes=150)) 9 | 10 | # optimizer 11 | optimizer = dict( 12 | _delete_=True, 13 | type='AdamW', 14 | lr=0.00006, 15 | betas=(0.9, 0.999), 16 | weight_decay=0.01, 17 | paramwise_cfg=dict( 18 | custom_keys={ 19 | 'pos_block': dict(decay_mult=0.), 20 | 'norm': dict(decay_mult=0.), 21 | 'head': dict(lr_mult=10.) 22 | })) 23 | 24 | lr_config = dict( 25 | _delete_=True, 26 | policy='poly', 27 | warmup='linear', 28 | warmup_iters=1500, 29 | warmup_ratio=1e-6, 30 | power=1.0, 31 | min_lr=0.0, 32 | by_epoch=False) 33 | 34 | data = dict(samples_per_gpu=2, workers_per_gpu=2) 35 | -------------------------------------------------------------------------------- /tests/test_models/test_necks/test_fpn.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models import FPN 5 | 6 | 7 | def test_fpn(): 8 | in_channels = [64, 128, 256, 512] 9 | inputs = [ 10 | torch.randn(1, c, 56 // 2**i, 56 // 2**i) 11 | for i, c in enumerate(in_channels) 12 | ] 13 | 14 | fpn = FPN(in_channels, 64, len(in_channels)) 15 | outputs = fpn(inputs) 16 | assert outputs[0].shape == torch.Size([1, 64, 56, 56]) 17 | assert outputs[1].shape == torch.Size([1, 64, 28, 28]) 18 | assert outputs[2].shape == torch.Size([1, 64, 14, 14]) 19 | assert outputs[3].shape == torch.Size([1, 64, 7, 7]) 20 | 21 | fpn = FPN( 22 | in_channels, 23 | 64, 24 | len(in_channels), 25 | upsample_cfg=dict(mode='nearest', scale_factor=2.0)) 26 | outputs = fpn(inputs) 27 | assert outputs[0].shape == torch.Size([1, 64, 56, 56]) 28 | assert outputs[1].shape == torch.Size([1, 64, 28, 28]) 29 | assert outputs[2].shape == torch.Size([1, 64, 14, 14]) 30 | assert outputs[3].shape == torch.Size([1, 64, 7, 7]) 31 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x1024_40k_dark.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | img_norm_cfg = dict( 6 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 7 | test_pipeline = [ 8 | dict(type='LoadImageFromFile'), 9 | dict( 10 | type='MultiScaleFlipAug', 11 | img_scale=(1920, 1080), 12 | # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], 13 | flip=False, 14 | transforms=[ 15 | dict(type='Resize', keep_ratio=True), 16 | dict(type='RandomFlip'), 17 | dict(type='Normalize', **img_norm_cfg), 18 | dict(type='ImageToTensor', keys=['img']), 19 | dict(type='Collect', keys=['img']), 20 | ]) 21 | ] 22 | 23 | data = dict( 24 | test=dict( 25 | type='DarkZurichDataset', 26 | data_root='data/dark_zurich/', 27 | img_dir='rgb_anon/val/night/GOPR0356', 28 | ann_dir='gt/val/night/GOPR0356', 29 | pipeline=test_pipeline)) 30 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x1024_80k_dark.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | 6 | img_norm_cfg = dict( 7 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 8 | test_pipeline = [ 9 | dict(type='LoadImageFromFile'), 10 | dict( 11 | type='MultiScaleFlipAug', 12 | img_scale=(1920, 1080), 13 | # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], 14 | flip=False, 15 | transforms=[ 16 | dict(type='Resize', keep_ratio=True), 17 | dict(type='RandomFlip'), 18 | dict(type='Normalize', **img_norm_cfg), 19 | dict(type='ImageToTensor', keys=['img']), 20 | dict(type='Collect', keys=['img']), 21 | ]) 22 | ] 23 | 24 | data = dict( 25 | test=dict( 26 | type='DarkZurichDataset', 27 | data_root='data/dark_zurich/', 28 | img_dir='rgb_anon/val/night/GOPR0356', 29 | ann_dir='gt/val/night/GOPR0356', 30 | pipeline=test_pipeline)) 31 | -------------------------------------------------------------------------------- /tests/test_inference.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import os.path as osp 3 | 4 | import mmcv 5 | 6 | from mmseg.apis import inference_segmentor, init_segmentor 7 | 8 | 9 | def test_test_time_augmentation_on_cpu(): 10 | config_file = 'configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py' 11 | config = mmcv.Config.fromfile(config_file) 12 | 13 | # Remove pretrain model download for testing 14 | config.model.pretrained = None 15 | # Replace SyncBN with BN to inference on CPU 16 | norm_cfg = dict(type='BN', requires_grad=True) 17 | config.model.backbone.norm_cfg = norm_cfg 18 | config.model.decode_head.norm_cfg = norm_cfg 19 | config.model.auxiliary_head.norm_cfg = norm_cfg 20 | 21 | # Enable test time augmentation 22 | config.data.test.pipeline[1].flip = True 23 | 24 | checkpoint_file = None 25 | model = init_segmentor(config, checkpoint_file, device='cpu') 26 | 27 | img = mmcv.imread( 28 | osp.join(osp.dirname(__file__), 'data/color.jpg'), 'color') 29 | result = inference_segmentor(model, img) 30 | assert result[0].shape == (288, 512) 31 | -------------------------------------------------------------------------------- /configs/_base_/models/dpt_vit-b16.py: -------------------------------------------------------------------------------- 1 | norm_cfg = dict(type='SyncBN', requires_grad=True) 2 | model = dict( 3 | type='EncoderDecoder', 4 | pretrained='pretrain/vit-b16_p16_224-80ecf9dd.pth', # noqa 5 | backbone=dict( 6 | type='VisionTransformer', 7 | img_size=224, 8 | embed_dims=768, 9 | num_layers=12, 10 | num_heads=12, 11 | out_indices=(2, 5, 8, 11), 12 | final_norm=False, 13 | with_cls_token=True, 14 | output_cls_token=True), 15 | decode_head=dict( 16 | type='DPTHead', 17 | in_channels=(768, 768, 768, 768), 18 | channels=256, 19 | embed_dims=768, 20 | post_process_channels=[96, 192, 384, 768], 21 | num_classes=150, 22 | readout_type='project', 23 | input_transform='multiple_select', 24 | in_index=(0, 1, 2, 3), 25 | norm_cfg=norm_cfg, 26 | loss_decode=dict( 27 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 28 | auxiliary_head=None, 29 | # model training and testing settings 30 | train_cfg=dict(), 31 | test_cfg=dict(mode='whole')) # yapf: disable 32 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x1024_40k_night_driving.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' 4 | ] 5 | 6 | img_norm_cfg = dict( 7 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 8 | test_pipeline = [ 9 | dict(type='LoadImageFromFile'), 10 | dict( 11 | type='MultiScaleFlipAug', 12 | img_scale=(1920, 1080), 13 | # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], 14 | flip=False, 15 | transforms=[ 16 | dict(type='Resize', keep_ratio=True), 17 | dict(type='RandomFlip'), 18 | dict(type='Normalize', **img_norm_cfg), 19 | dict(type='ImageToTensor', keys=['img']), 20 | dict(type='Collect', keys=['img']), 21 | ]) 22 | ] 23 | data = dict( 24 | test=dict( 25 | type='NightDrivingDataset', 26 | data_root='data/NighttimeDrivingTest/', 27 | img_dir='leftImg8bit/test/night', 28 | ann_dir='gtCoarse_daytime_trainvaltest/test/night', 29 | pipeline=test_pipeline)) 30 | -------------------------------------------------------------------------------- /configs/pspnet/pspnet_r50-d8_512x1024_80k_night_driving.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py', 3 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_80k.py' 4 | ] 5 | 6 | img_norm_cfg = dict( 7 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 8 | test_pipeline = [ 9 | dict(type='LoadImageFromFile'), 10 | dict( 11 | type='MultiScaleFlipAug', 12 | img_scale=(1920, 1080), 13 | # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], 14 | flip=False, 15 | transforms=[ 16 | dict(type='Resize', keep_ratio=True), 17 | dict(type='RandomFlip'), 18 | dict(type='Normalize', **img_norm_cfg), 19 | dict(type='ImageToTensor', keys=['img']), 20 | dict(type='Collect', keys=['img']), 21 | ]) 22 | ] 23 | data = dict( 24 | test=dict( 25 | type='NightDrivingDataset', 26 | data_root='data/NighttimeDrivingTest/', 27 | img_dir='leftImg8bit/test/night', 28 | ann_dir='gtCoarse_daytime_trainvaltest/test/night', 29 | pipeline=test_pipeline)) 30 | -------------------------------------------------------------------------------- /configs/_base_/models/erfnet_fcn.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained=None, 6 | backbone=dict( 7 | type='ERFNet', 8 | in_channels=3, 9 | enc_downsample_channels=(16, 64, 128), 10 | enc_stage_non_bottlenecks=(5, 8), 11 | enc_non_bottleneck_dilations=(2, 4, 8, 16), 12 | enc_non_bottleneck_channels=(64, 128), 13 | dec_upsample_channels=(64, 16), 14 | dec_stages_non_bottleneck=(2, 2), 15 | dec_non_bottleneck_channels=(64, 16), 16 | dropout_ratio=0.1, 17 | init_cfg=None), 18 | decode_head=dict( 19 | type='FCNHead', 20 | in_channels=16, 21 | channels=128, 22 | num_convs=1, 23 | concat_input=False, 24 | dropout_ratio=0.1, 25 | num_classes=19, 26 | norm_cfg=norm_cfg, 27 | align_corners=False, 28 | loss_decode=dict( 29 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 30 | # model training and testing settings 31 | train_cfg=dict(), 32 | test_cfg=dict(mode='whole')) 33 | -------------------------------------------------------------------------------- /configs/_base_/models/segformer_mit-b0.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained=None, 6 | backbone=dict( 7 | type='MixVisionTransformer', 8 | in_channels=3, 9 | embed_dims=32, 10 | num_stages=4, 11 | num_layers=[2, 2, 2, 2], 12 | num_heads=[1, 2, 5, 8], 13 | patch_sizes=[7, 3, 3, 3], 14 | sr_ratios=[8, 4, 2, 1], 15 | out_indices=(0, 1, 2, 3), 16 | mlp_ratio=4, 17 | qkv_bias=True, 18 | drop_rate=0.0, 19 | attn_drop_rate=0.0, 20 | drop_path_rate=0.1), 21 | decode_head=dict( 22 | type='SegformerHead', 23 | in_channels=[32, 64, 160, 256], 24 | in_index=[0, 1, 2, 3], 25 | channels=256, 26 | dropout_ratio=0.1, 27 | num_classes=19, 28 | norm_cfg=norm_cfg, 29 | align_corners=False, 30 | loss_decode=dict( 31 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 32 | # model training and testing settings 33 | train_cfg=dict(), 34 | test_cfg=dict(mode='whole')) 35 | -------------------------------------------------------------------------------- /tests/test_digit_version.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmseg import digit_version 3 | 4 | 5 | def test_digit_version(): 6 | assert digit_version('0.2.16') == (0, 2, 16, 0, 0, 0) 7 | assert digit_version('1.2.3') == (1, 2, 3, 0, 0, 0) 8 | assert digit_version('1.2.3rc0') == (1, 2, 3, 0, -1, 0) 9 | assert digit_version('1.2.3rc1') == (1, 2, 3, 0, -1, 1) 10 | assert digit_version('1.0rc0') == (1, 0, 0, 0, -1, 0) 11 | assert digit_version('1.0') == digit_version('1.0.0') 12 | assert digit_version('1.5.0+cuda90_cudnn7.6.3_lms') == digit_version('1.5') 13 | assert digit_version('1.0.0dev') < digit_version('1.0.0a') 14 | assert digit_version('1.0.0a') < digit_version('1.0.0a1') 15 | assert digit_version('1.0.0a') < digit_version('1.0.0b') 16 | assert digit_version('1.0.0b') < digit_version('1.0.0rc') 17 | assert digit_version('1.0.0rc1') < digit_version('1.0.0') 18 | assert digit_version('1.0.0') < digit_version('1.0.0post') 19 | assert digit_version('1.0.0post') < digit_version('1.0.0post1') 20 | assert digit_version('v1') == (1, 0, 0, 0, 0, 0) 21 | assert digit_version('v1.1.5') == (1, 1, 5, 0, 0, 0) 22 | -------------------------------------------------------------------------------- /configs/vit/upernet_vit-b16_mln_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_vit-b16_ln_mln.py', 3 | '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_160k.py' 5 | ] 6 | 7 | model = dict( 8 | pretrained='pretrain/vit_base_patch16_224.pth', 9 | decode_head=dict(num_classes=150), 10 | auxiliary_head=dict(num_classes=150)) 11 | 12 | # AdamW optimizer, no weight decay for position embedding & layer norm 13 | # in backbone 14 | optimizer = dict( 15 | _delete_=True, 16 | type='AdamW', 17 | lr=0.00006, 18 | betas=(0.9, 0.999), 19 | weight_decay=0.01, 20 | paramwise_cfg=dict( 21 | custom_keys={ 22 | 'pos_embed': dict(decay_mult=0.), 23 | 'cls_token': dict(decay_mult=0.), 24 | 'norm': dict(decay_mult=0.) 25 | })) 26 | 27 | lr_config = dict( 28 | _delete_=True, 29 | policy='poly', 30 | warmup='linear', 31 | warmup_iters=1500, 32 | warmup_ratio=1e-6, 33 | power=1.0, 34 | min_lr=0.0, 35 | by_epoch=False) 36 | 37 | # By default, models are trained on 8 GPUs with 2 images per GPU 38 | data = dict(samples_per_gpu=2) 39 | -------------------------------------------------------------------------------- /configs/vit/upernet_vit-b16_mln_512x512_80k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_vit-b16_ln_mln.py', 3 | '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_80k.py' 5 | ] 6 | 7 | model = dict( 8 | pretrained='pretrain/vit_base_patch16_224.pth', 9 | decode_head=dict(num_classes=150), 10 | auxiliary_head=dict(num_classes=150)) 11 | 12 | # AdamW optimizer, no weight decay for position embedding & layer norm 13 | # in backbone 14 | optimizer = dict( 15 | _delete_=True, 16 | type='AdamW', 17 | lr=0.00006, 18 | betas=(0.9, 0.999), 19 | weight_decay=0.01, 20 | paramwise_cfg=dict( 21 | custom_keys={ 22 | 'pos_embed': dict(decay_mult=0.), 23 | 'cls_token': dict(decay_mult=0.), 24 | 'norm': dict(decay_mult=0.) 25 | })) 26 | 27 | lr_config = dict( 28 | _delete_=True, 29 | policy='poly', 30 | warmup='linear', 31 | warmup_iters=1500, 32 | warmup_ratio=1e-6, 33 | power=1.0, 34 | min_lr=0.0, 35 | by_epoch=False) 36 | 37 | # By default, models are trained on 8 GPUs with 2 images per GPU 38 | data = dict(samples_per_gpu=2) 39 | -------------------------------------------------------------------------------- /mmseg/models/backbones/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .beit import BEiT 3 | from .bisenetv1 import BiSeNetV1 4 | from .bisenetv2 import BiSeNetV2 5 | from .cgnet import CGNet 6 | from .erfnet import ERFNet 7 | from .fast_scnn import FastSCNN 8 | from .hrnet import HRNet 9 | from .icnet import ICNet 10 | from .mae import MAE 11 | from .mit import MixVisionTransformer 12 | from .mobilenet_v2 import MobileNetV2 13 | from .mobilenet_v3 import MobileNetV3 14 | from .resnest import ResNeSt 15 | from .resnet import ResNet, ResNetV1c, ResNetV1d 16 | from .resnext import ResNeXt 17 | from .stdc import STDCContextPathNet, STDCNet 18 | from .swin import SwinTransformer 19 | from .timm_backbone import TIMMBackbone 20 | from .twins import PCPVT, SVT 21 | from .unet import UNet 22 | from .vit import VisionTransformer 23 | 24 | __all__ = [ 25 | 'ResNet', 'ResNetV1c', 'ResNetV1d', 'ResNeXt', 'HRNet', 'FastSCNN', 26 | 'ResNeSt', 'MobileNetV2', 'UNet', 'CGNet', 'MobileNetV3', 27 | 'VisionTransformer', 'SwinTransformer', 'MixVisionTransformer', 28 | 'BiSeNetV1', 'BiSeNetV2', 'ICNet', 'TIMMBackbone', 'ERFNet', 'PCPVT', 29 | 'SVT', 'STDCNet', 'STDCContextPathNet', 'BEiT', 'MAE' 30 | ] 31 | -------------------------------------------------------------------------------- /.dev/batch_train_list.txt: -------------------------------------------------------------------------------- 1 | configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py 2 | configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py 3 | configs/hrnet/fcn_hr48_512x512_160k_ade20k.py 4 | configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py 5 | configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py 6 | configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py 7 | configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py 8 | configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py 9 | configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py 10 | configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py 11 | configs/fastscnn/fast_scnn_lr0.12_8x4_160k_cityscapes.py 12 | configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py 13 | configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py 14 | configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py 15 | configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py 16 | configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py 17 | configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py 18 | configs/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py 19 | configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py 20 | -------------------------------------------------------------------------------- /configs/segformer/segformer_mit-b0_8x1_1024x1024_160k_cityscapes.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/segformer_mit-b0.py', 3 | '../_base_/datasets/cityscapes_1024x1024.py', 4 | '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py' 5 | ] 6 | 7 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b0_20220624-7e0fe6dd.pth' # noqa 8 | 9 | model = dict( 10 | backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), 11 | test_cfg=dict(mode='slide', crop_size=(1024, 1024), stride=(768, 768))) 12 | 13 | # optimizer 14 | optimizer = dict( 15 | _delete_=True, 16 | type='AdamW', 17 | lr=0.00006, 18 | betas=(0.9, 0.999), 19 | weight_decay=0.01, 20 | paramwise_cfg=dict( 21 | custom_keys={ 22 | 'pos_block': dict(decay_mult=0.), 23 | 'norm': dict(decay_mult=0.), 24 | 'head': dict(lr_mult=10.) 25 | })) 26 | 27 | lr_config = dict( 28 | _delete_=True, 29 | policy='poly', 30 | warmup='linear', 31 | warmup_iters=1500, 32 | warmup_ratio=1e-6, 33 | power=1.0, 34 | min_lr=0.0, 35 | by_epoch=False) 36 | 37 | data = dict(samples_per_gpu=1, workers_per_gpu=1) 38 | -------------------------------------------------------------------------------- /tests/test_models/test_necks/test_multilevel_neck.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models import MultiLevelNeck 5 | 6 | 7 | def test_multilevel_neck(): 8 | 9 | # Test init_weights 10 | MultiLevelNeck([266], 32).init_weights() 11 | 12 | # Test multi feature maps 13 | in_channels = [32, 64, 128, 256] 14 | inputs = [torch.randn(1, c, 14, 14) for i, c in enumerate(in_channels)] 15 | 16 | neck = MultiLevelNeck(in_channels, 32) 17 | outputs = neck(inputs) 18 | assert outputs[0].shape == torch.Size([1, 32, 7, 7]) 19 | assert outputs[1].shape == torch.Size([1, 32, 14, 14]) 20 | assert outputs[2].shape == torch.Size([1, 32, 28, 28]) 21 | assert outputs[3].shape == torch.Size([1, 32, 56, 56]) 22 | 23 | # Test one feature map 24 | in_channels = [768] 25 | inputs = [torch.randn(1, 768, 14, 14)] 26 | 27 | neck = MultiLevelNeck(in_channels, 32) 28 | outputs = neck(inputs) 29 | assert outputs[0].shape == torch.Size([1, 32, 7, 7]) 30 | assert outputs[1].shape == torch.Size([1, 32, 14, 14]) 31 | assert outputs[2].shape == torch.Size([1, 32, 28, 28]) 32 | assert outputs[3].shape == torch.Size([1, 32, 56, 56]) 33 | -------------------------------------------------------------------------------- /configs/_base_/models/fpn_r50.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 1, 1), 12 | strides=(1, 2, 2, 2), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | neck=dict( 18 | type='FPN', 19 | in_channels=[256, 512, 1024, 2048], 20 | out_channels=256, 21 | num_outs=4), 22 | decode_head=dict( 23 | type='FPNHead', 24 | in_channels=[256, 256, 256, 256], 25 | in_index=[0, 1, 2, 3], 26 | feature_strides=[4, 8, 16, 32], 27 | channels=128, 28 | dropout_ratio=0.1, 29 | num_classes=19, 30 | norm_cfg=norm_cfg, 31 | align_corners=False, 32 | loss_decode=dict( 33 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 34 | # model training and testing settings 35 | train_cfg=dict(), 36 | test_cfg=dict(mode='whole')) 37 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_stdc_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from mmseg.models.decode_heads import STDCHead 5 | from .utils import to_cuda 6 | 7 | 8 | def test_stdc_head(): 9 | inputs = [torch.randn(1, 32, 21, 21)] 10 | head = STDCHead( 11 | in_channels=32, 12 | channels=8, 13 | num_convs=1, 14 | num_classes=2, 15 | in_index=-1, 16 | loss_decode=[ 17 | dict( 18 | type='CrossEntropyLoss', loss_name='loss_ce', loss_weight=1.0), 19 | dict(type='DiceLoss', loss_name='loss_dice', loss_weight=1.0) 20 | ]) 21 | if torch.cuda.is_available(): 22 | head, inputs = to_cuda(head, inputs) 23 | outputs = head(inputs) 24 | assert isinstance(outputs, torch.Tensor) and len(outputs) == 1 25 | assert outputs.shape == torch.Size([1, head.num_classes, 21, 21]) 26 | 27 | fake_label = torch.ones_like( 28 | outputs[:, 0:1, :, :], dtype=torch.int16).long() 29 | loss = head.losses(seg_logit=outputs, seg_label=fake_label) 30 | assert loss['loss_ce'] != torch.zeros_like(loss['loss_ce']) 31 | assert loss['loss_dice'] != torch.zeros_like(loss['loss_dice']) 32 | -------------------------------------------------------------------------------- /tools/publish_model.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import argparse 3 | import subprocess 4 | 5 | import torch 6 | 7 | 8 | def parse_args(): 9 | parser = argparse.ArgumentParser( 10 | description='Process a checkpoint to be published') 11 | parser.add_argument('in_file', help='input checkpoint filename') 12 | parser.add_argument('out_file', help='output checkpoint filename') 13 | args = parser.parse_args() 14 | return args 15 | 16 | 17 | def process_checkpoint(in_file, out_file): 18 | checkpoint = torch.load(in_file, map_location='cpu') 19 | # remove optimizer for smaller file size 20 | if 'optimizer' in checkpoint: 21 | del checkpoint['optimizer'] 22 | # if it is necessary to remove some sensitive data in checkpoint['meta'], 23 | # add the code here. 24 | torch.save(checkpoint, out_file) 25 | sha = subprocess.check_output(['sha256sum', out_file]).decode() 26 | final_file = out_file.rstrip('.pth') + '-{}.pth'.format(sha[:8]) 27 | subprocess.Popen(['mv', out_file, final_file]) 28 | 29 | 30 | def main(): 31 | args = parse_args() 32 | process_checkpoint(args.in_file, args.out_file) 33 | 34 | 35 | if __name__ == '__main__': 36 | main() 37 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_uper_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import pytest 3 | import torch 4 | 5 | from mmseg.models.decode_heads import UPerHead 6 | from .utils import _conv_has_norm, to_cuda 7 | 8 | 9 | def test_uper_head(): 10 | 11 | with pytest.raises(AssertionError): 12 | # fpn_in_channels must be list|tuple 13 | UPerHead(in_channels=4, channels=2, num_classes=19) 14 | 15 | # test no norm_cfg 16 | head = UPerHead( 17 | in_channels=[4, 2], channels=2, num_classes=19, in_index=[-2, -1]) 18 | assert not _conv_has_norm(head, sync_bn=False) 19 | 20 | # test with norm_cfg 21 | head = UPerHead( 22 | in_channels=[4, 2], 23 | channels=2, 24 | num_classes=19, 25 | norm_cfg=dict(type='SyncBN'), 26 | in_index=[-2, -1]) 27 | assert _conv_has_norm(head, sync_bn=True) 28 | 29 | inputs = [torch.randn(1, 4, 45, 45), torch.randn(1, 2, 21, 21)] 30 | head = UPerHead( 31 | in_channels=[4, 2], channels=2, num_classes=19, in_index=[-2, -1]) 32 | if torch.cuda.is_available(): 33 | head, inputs = to_cuda(head, inputs) 34 | outputs = head(inputs) 35 | assert outputs.shape == (1, head.num_classes, 45, 45) 36 | -------------------------------------------------------------------------------- /configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../_base_/models/upernet_vit-b16_ln_mln.py', 3 | '../_base_/datasets/ade20k.py', '../_base_/default_runtime.py', 4 | '../_base_/schedules/schedule_160k.py' 5 | ] 6 | 7 | model = dict( 8 | pretrained='pretrain/vit_base_patch16_224.pth', 9 | backbone=dict(drop_path_rate=0.1, final_norm=True), 10 | decode_head=dict(num_classes=150), 11 | auxiliary_head=dict(num_classes=150)) 12 | 13 | # AdamW optimizer, no weight decay for position embedding & layer norm 14 | # in backbone 15 | optimizer = dict( 16 | _delete_=True, 17 | type='AdamW', 18 | lr=0.00006, 19 | betas=(0.9, 0.999), 20 | weight_decay=0.01, 21 | paramwise_cfg=dict( 22 | custom_keys={ 23 | 'pos_embed': dict(decay_mult=0.), 24 | 'cls_token': dict(decay_mult=0.), 25 | 'norm': dict(decay_mult=0.) 26 | })) 27 | 28 | lr_config = dict( 29 | _delete_=True, 30 | policy='poly', 31 | warmup='linear', 32 | warmup_iters=1500, 33 | warmup_ratio=1e-6, 34 | power=1.0, 35 | min_lr=0.0, 36 | by_epoch=False) 37 | 38 | # By default, models are trained on 8 GPUs with 2 images per GPU 39 | data = dict(samples_per_gpu=2) 40 | -------------------------------------------------------------------------------- /configs/_base_/models/cgnet.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', eps=1e-03, requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | backbone=dict( 6 | type='CGNet', 7 | norm_cfg=norm_cfg, 8 | in_channels=3, 9 | num_channels=(32, 64, 128), 10 | num_blocks=(3, 21), 11 | dilations=(2, 4), 12 | reductions=(8, 16)), 13 | decode_head=dict( 14 | type='FCNHead', 15 | in_channels=256, 16 | in_index=2, 17 | channels=256, 18 | num_convs=0, 19 | concat_input=False, 20 | dropout_ratio=0, 21 | num_classes=19, 22 | norm_cfg=norm_cfg, 23 | loss_decode=dict( 24 | type='CrossEntropyLoss', 25 | use_sigmoid=False, 26 | loss_weight=1.0, 27 | class_weight=[ 28 | 2.5959933, 6.7415504, 3.5354059, 9.8663225, 9.690899, 9.369352, 29 | 10.289121, 9.953208, 4.3097677, 9.490387, 7.674431, 9.396905, 30 | 10.347791, 6.3927646, 10.226669, 10.241062, 10.280587, 31 | 10.396974, 10.055647 32 | ])), 33 | # model training and testing settings 34 | train_cfg=dict(sampler=None), 35 | test_cfg=dict(mode='whole')) 36 | -------------------------------------------------------------------------------- /configs/_base_/models/segmenter_vit-b16_mask.py: -------------------------------------------------------------------------------- 1 | checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segmenter/vit_base_p16_384_20220308-96dfe169.pth' # noqa 2 | # model settings 3 | backbone_norm_cfg = dict(type='LN', eps=1e-6, requires_grad=True) 4 | model = dict( 5 | type='EncoderDecoder', 6 | pretrained=checkpoint, 7 | backbone=dict( 8 | type='VisionTransformer', 9 | img_size=(512, 512), 10 | patch_size=16, 11 | in_channels=3, 12 | embed_dims=768, 13 | num_layers=12, 14 | num_heads=12, 15 | drop_path_rate=0.1, 16 | attn_drop_rate=0.0, 17 | drop_rate=0.0, 18 | final_norm=True, 19 | norm_cfg=backbone_norm_cfg, 20 | with_cls_token=True, 21 | interpolate_mode='bicubic', 22 | ), 23 | decode_head=dict( 24 | type='SegmenterMaskTransformerHead', 25 | in_channels=768, 26 | channels=768, 27 | num_classes=150, 28 | num_layers=2, 29 | num_heads=12, 30 | embed_dims=768, 31 | dropout_ratio=0.0, 32 | loss_decode=dict( 33 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), 34 | ), 35 | test_cfg=dict(mode='slide', crop_size=(512, 512), stride=(480, 480)), 36 | ) 37 | -------------------------------------------------------------------------------- /mmseg/datasets/voc.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import os.path as osp 3 | 4 | from .builder import DATASETS 5 | from .custom import CustomDataset 6 | 7 | 8 | @DATASETS.register_module() 9 | class PascalVOCDataset(CustomDataset): 10 | """Pascal VOC dataset. 11 | 12 | Args: 13 | split (str): Split txt file for Pascal VOC. 14 | """ 15 | 16 | CLASSES = ('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 17 | 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 18 | 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 19 | 'train', 'tvmonitor') 20 | 21 | PALETTE = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], 22 | [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], 23 | [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], 24 | [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], 25 | [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128]] 26 | 27 | def __init__(self, split, **kwargs): 28 | super(PascalVOCDataset, self).__init__( 29 | img_suffix='.jpg', seg_map_suffix='.png', split=split, **kwargs) 30 | assert osp.exists(self.img_dir) and self.split is not None 31 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_psp_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import pytest 3 | import torch 4 | 5 | from mmseg.models.decode_heads import PSPHead 6 | from .utils import _conv_has_norm, to_cuda 7 | 8 | 9 | def test_psp_head(): 10 | 11 | with pytest.raises(AssertionError): 12 | # pool_scales must be list|tuple 13 | PSPHead(in_channels=4, channels=2, num_classes=19, pool_scales=1) 14 | 15 | # test no norm_cfg 16 | head = PSPHead(in_channels=4, channels=2, num_classes=19) 17 | assert not _conv_has_norm(head, sync_bn=False) 18 | 19 | # test with norm_cfg 20 | head = PSPHead( 21 | in_channels=4, 22 | channels=2, 23 | num_classes=19, 24 | norm_cfg=dict(type='SyncBN')) 25 | assert _conv_has_norm(head, sync_bn=True) 26 | 27 | inputs = [torch.randn(1, 4, 23, 23)] 28 | head = PSPHead( 29 | in_channels=4, channels=2, num_classes=19, pool_scales=(1, 2, 3)) 30 | if torch.cuda.is_available(): 31 | head, inputs = to_cuda(head, inputs) 32 | assert head.psp_modules[0][0].output_size == 1 33 | assert head.psp_modules[1][0].output_size == 2 34 | assert head.psp_modules[2][0].output_size == 3 35 | outputs = head(inputs) 36 | assert outputs.shape == (1, head.num_classes, 23, 23) 37 | -------------------------------------------------------------------------------- /mmseg/core/builder.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import copy 3 | 4 | from mmcv.runner.optimizer import OPTIMIZER_BUILDERS as MMCV_OPTIMIZER_BUILDERS 5 | from mmcv.utils import Registry, build_from_cfg 6 | 7 | OPTIMIZER_BUILDERS = Registry( 8 | 'optimizer builder', parent=MMCV_OPTIMIZER_BUILDERS) 9 | 10 | 11 | def build_optimizer_constructor(cfg): 12 | constructor_type = cfg.get('type') 13 | if constructor_type in OPTIMIZER_BUILDERS: 14 | return build_from_cfg(cfg, OPTIMIZER_BUILDERS) 15 | elif constructor_type in MMCV_OPTIMIZER_BUILDERS: 16 | return build_from_cfg(cfg, MMCV_OPTIMIZER_BUILDERS) 17 | else: 18 | raise KeyError(f'{constructor_type} is not registered ' 19 | 'in the optimizer builder registry.') 20 | 21 | 22 | def build_optimizer(model, cfg): 23 | optimizer_cfg = copy.deepcopy(cfg) 24 | constructor_type = optimizer_cfg.pop('constructor', 25 | 'DefaultOptimizerConstructor') 26 | paramwise_cfg = optimizer_cfg.pop('paramwise_cfg', None) 27 | optim_constructor = build_optimizer_constructor( 28 | dict( 29 | type=constructor_type, 30 | optimizer_cfg=optimizer_cfg, 31 | paramwise_cfg=paramwise_cfg)) 32 | optimizer = optim_constructor(model) 33 | return optimizer 34 | -------------------------------------------------------------------------------- /tests/test_models/test_backbones/test_fast_scnn.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import pytest 3 | import torch 4 | 5 | from mmseg.models.backbones import FastSCNN 6 | 7 | 8 | def test_fastscnn_backbone(): 9 | with pytest.raises(AssertionError): 10 | # Fast-SCNN channel constraints. 11 | FastSCNN( 12 | 3, (32, 48), 13 | 64, (64, 96, 128), (2, 2, 1), 14 | global_out_channels=127, 15 | higher_in_channels=64, 16 | lower_in_channels=128) 17 | 18 | # Test FastSCNN Standard Forward 19 | model = FastSCNN( 20 | in_channels=3, 21 | downsample_dw_channels=(4, 6), 22 | global_in_channels=8, 23 | global_block_channels=(8, 12, 16), 24 | global_block_strides=(2, 2, 1), 25 | global_out_channels=16, 26 | higher_in_channels=8, 27 | lower_in_channels=16, 28 | fusion_out_channels=16, 29 | ) 30 | model.init_weights() 31 | model.train() 32 | batch_size = 4 33 | imgs = torch.randn(batch_size, 3, 64, 128) 34 | feat = model(imgs) 35 | 36 | assert len(feat) == 3 37 | # higher-res 38 | assert feat[0].shape == torch.Size([batch_size, 8, 8, 16]) 39 | # lower-res 40 | assert feat[1].shape == torch.Size([batch_size, 16, 2, 4]) 41 | # FFM output 42 | assert feat[2].shape == torch.Size([batch_size, 16, 8, 16]) 43 | -------------------------------------------------------------------------------- /mmseg/models/utils/make_divisible.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | def make_divisible(value, divisor, min_value=None, min_ratio=0.9): 3 | """Make divisible function. 4 | 5 | This function rounds the channel number to the nearest value that can be 6 | divisible by the divisor. It is taken from the original tf repo. It ensures 7 | that all layers have a channel number that is divisible by divisor. It can 8 | be seen here: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py # noqa 9 | 10 | Args: 11 | value (int): The original channel number. 12 | divisor (int): The divisor to fully divide the channel number. 13 | min_value (int): The minimum value of the output channel. 14 | Default: None, means that the minimum value equal to the divisor. 15 | min_ratio (float): The minimum ratio of the rounded channel number to 16 | the original channel number. Default: 0.9. 17 | 18 | Returns: 19 | int: The modified output channel number. 20 | """ 21 | 22 | if min_value is None: 23 | min_value = divisor 24 | new_value = max(min_value, int(value + divisor / 2) // divisor * divisor) 25 | # Make sure that round down does not go down by more than (1-min_ratio). 26 | if new_value < min_ratio * value: 27 | new_value += divisor 28 | return new_value 29 | -------------------------------------------------------------------------------- /tests/test_models/test_heads/test_segformer_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import pytest 3 | import torch 4 | 5 | from mmseg.models.decode_heads import SegformerHead 6 | 7 | 8 | def test_segformer_head(): 9 | with pytest.raises(AssertionError): 10 | # `in_channels` must have same length as `in_index` 11 | SegformerHead( 12 | in_channels=(1, 2, 3), in_index=(0, 1), channels=5, num_classes=2) 13 | 14 | H, W = (64, 64) 15 | in_channels = (32, 64, 160, 256) 16 | shapes = [(H // 2**(i + 2), W // 2**(i + 2)) 17 | for i in range(len(in_channels))] 18 | model = SegformerHead( 19 | in_channels=in_channels, 20 | in_index=[0, 1, 2, 3], 21 | channels=256, 22 | num_classes=19) 23 | 24 | with pytest.raises(IndexError): 25 | # in_index must match the input feature maps. 26 | inputs = [ 27 | torch.randn((1, in_channel, *shape)) 28 | for in_channel, shape in zip(in_channels, shapes) 29 | ][:3] 30 | temp = model(inputs) 31 | 32 | # Normal Input 33 | # ((1, 32, 16, 16), (1, 64, 8, 8), (1, 160, 4, 4), (1, 256, 2, 2) 34 | inputs = [ 35 | torch.randn((1, in_channel, *shape)) 36 | for in_channel, shape in zip(in_channels, shapes) 37 | ] 38 | temp = model(inputs) 39 | 40 | assert temp.shape == (1, 19, H // 4, W // 4) 41 | -------------------------------------------------------------------------------- /configs/_base_/datasets/cityscapes_768x768.py: -------------------------------------------------------------------------------- 1 | _base_ = './cityscapes.py' 2 | img_norm_cfg = dict( 3 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 4 | crop_size = (768, 768) 5 | train_pipeline = [ 6 | dict(type='LoadImageFromFile'), 7 | dict(type='LoadAnnotations'), 8 | dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), 9 | dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), 10 | dict(type='RandomFlip', prob=0.5), 11 | dict(type='PhotoMetricDistortion'), 12 | dict(type='Normalize', **img_norm_cfg), 13 | dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), 14 | dict(type='DefaultFormatBundle'), 15 | dict(type='Collect', keys=['img', 'gt_semantic_seg']), 16 | ] 17 | test_pipeline = [ 18 | dict(type='LoadImageFromFile'), 19 | dict( 20 | type='MultiScaleFlipAug', 21 | img_scale=(2048, 1024), 22 | # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], 23 | flip=False, 24 | transforms=[ 25 | dict(type='Resize', keep_ratio=False), 26 | dict(type='RandomFlip'), 27 | dict(type='Normalize', **img_norm_cfg), 28 | dict(type='ImageToTensor', keys=['img']), 29 | dict(type='Collect', keys=['img']), 30 | ]) 31 | ] 32 | data = dict( 33 | train=dict(pipeline=train_pipeline), 34 | val=dict(pipeline=test_pipeline), 35 | test=dict(pipeline=test_pipeline)) 36 | -------------------------------------------------------------------------------- /configs/_base_/datasets/cityscapes_769x769.py: -------------------------------------------------------------------------------- 1 | _base_ = './cityscapes.py' 2 | img_norm_cfg = dict( 3 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 4 | crop_size = (769, 769) 5 | train_pipeline = [ 6 | dict(type='LoadImageFromFile'), 7 | dict(type='LoadAnnotations'), 8 | dict(type='Resize', img_scale=(2049, 1025), ratio_range=(0.5, 2.0)), 9 | dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), 10 | dict(type='RandomFlip', prob=0.5), 11 | dict(type='PhotoMetricDistortion'), 12 | dict(type='Normalize', **img_norm_cfg), 13 | dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), 14 | dict(type='DefaultFormatBundle'), 15 | dict(type='Collect', keys=['img', 'gt_semantic_seg']), 16 | ] 17 | test_pipeline = [ 18 | dict(type='LoadImageFromFile'), 19 | dict( 20 | type='MultiScaleFlipAug', 21 | img_scale=(2049, 1025), 22 | # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], 23 | flip=False, 24 | transforms=[ 25 | dict(type='Resize', keep_ratio=True), 26 | dict(type='RandomFlip'), 27 | dict(type='Normalize', **img_norm_cfg), 28 | dict(type='ImageToTensor', keys=['img']), 29 | dict(type='Collect', keys=['img']), 30 | ]) 31 | ] 32 | data = dict( 33 | train=dict(pipeline=train_pipeline), 34 | val=dict(pipeline=test_pipeline), 35 | test=dict(pipeline=test_pipeline)) 36 | -------------------------------------------------------------------------------- /configs/_base_/datasets/cityscapes_832x832.py: -------------------------------------------------------------------------------- 1 | _base_ = './cityscapes.py' 2 | img_norm_cfg = dict( 3 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 4 | crop_size = (832, 832) 5 | train_pipeline = [ 6 | dict(type='LoadImageFromFile'), 7 | dict(type='LoadAnnotations'), 8 | dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), 9 | dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), 10 | dict(type='RandomFlip', prob=0.5), 11 | dict(type='PhotoMetricDistortion'), 12 | dict(type='Normalize', **img_norm_cfg), 13 | dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), 14 | dict(type='DefaultFormatBundle'), 15 | dict(type='Collect', keys=['img', 'gt_semantic_seg']), 16 | ] 17 | test_pipeline = [ 18 | dict(type='LoadImageFromFile'), 19 | dict( 20 | type='MultiScaleFlipAug', 21 | img_scale=(2048, 1024), 22 | # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], 23 | flip=False, 24 | transforms=[ 25 | dict(type='Resize', keep_ratio=True), 26 | dict(type='RandomFlip'), 27 | dict(type='Normalize', **img_norm_cfg), 28 | dict(type='ImageToTensor', keys=['img']), 29 | dict(type='Collect', keys=['img']), 30 | ]) 31 | ] 32 | data = dict( 33 | train=dict(pipeline=train_pipeline), 34 | val=dict(pipeline=test_pipeline), 35 | test=dict(pipeline=test_pipeline)) 36 | -------------------------------------------------------------------------------- /configs/_base_/datasets/cityscapes_1024x1024.py: -------------------------------------------------------------------------------- 1 | _base_ = './cityscapes.py' 2 | img_norm_cfg = dict( 3 | mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) 4 | crop_size = (1024, 1024) 5 | train_pipeline = [ 6 | dict(type='LoadImageFromFile'), 7 | dict(type='LoadAnnotations'), 8 | dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)), 9 | dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), 10 | dict(type='RandomFlip', prob=0.5), 11 | dict(type='PhotoMetricDistortion'), 12 | dict(type='Normalize', **img_norm_cfg), 13 | dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255), 14 | dict(type='DefaultFormatBundle'), 15 | dict(type='Collect', keys=['img', 'gt_semantic_seg']), 16 | ] 17 | test_pipeline = [ 18 | dict(type='LoadImageFromFile'), 19 | dict( 20 | type='MultiScaleFlipAug', 21 | img_scale=(2048, 1024), 22 | # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], 23 | flip=False, 24 | transforms=[ 25 | dict(type='Resize', keep_ratio=True), 26 | dict(type='RandomFlip'), 27 | dict(type='Normalize', **img_norm_cfg), 28 | dict(type='ImageToTensor', keys=['img']), 29 | dict(type='Collect', keys=['img']), 30 | ]) 31 | ] 32 | data = dict( 33 | train=dict(pipeline=train_pipeline), 34 | val=dict(pipeline=test_pipeline), 35 | test=dict(pipeline=test_pipeline)) 36 | -------------------------------------------------------------------------------- /mmseg/datasets/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .ade import ADE20KDataset 3 | from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset 4 | from .chase_db1 import ChaseDB1Dataset 5 | from .cityscapes import CityscapesDataset 6 | from .coco_stuff import COCOStuffDataset 7 | from .custom import CustomDataset 8 | from .dark_zurich import DarkZurichDataset 9 | from .dataset_wrappers import (ConcatDataset, MultiImageMixDataset, 10 | RepeatDataset) 11 | from .drive import DRIVEDataset 12 | from .hrf import HRFDataset 13 | from .isaid import iSAIDDataset 14 | from .isprs import ISPRSDataset 15 | from .loveda import LoveDADataset 16 | from .night_driving import NightDrivingDataset 17 | from .pascal_context import PascalContextDataset, PascalContextDataset59 18 | from .potsdam import PotsdamDataset 19 | from .stare import STAREDataset 20 | from .voc import PascalVOCDataset 21 | 22 | __all__ = [ 23 | 'CustomDataset', 'build_dataloader', 'ConcatDataset', 'RepeatDataset', 24 | 'DATASETS', 'build_dataset', 'PIPELINES', 'CityscapesDataset', 25 | 'PascalVOCDataset', 'ADE20KDataset', 'PascalContextDataset', 26 | 'PascalContextDataset59', 'ChaseDB1Dataset', 'DRIVEDataset', 'HRFDataset', 27 | 'STAREDataset', 'DarkZurichDataset', 'NightDrivingDataset', 28 | 'COCOStuffDataset', 'LoveDADataset', 'MultiImageMixDataset', 29 | 'iSAIDDataset', 'ISPRSDataset', 'PotsdamDataset' 30 | ] 31 | -------------------------------------------------------------------------------- /configs/_base_/models/ccnet_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='CCHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | recurrence=2, 23 | dropout_ratio=0.1, 24 | num_classes=19, 25 | norm_cfg=norm_cfg, 26 | align_corners=False, 27 | loss_decode=dict( 28 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 29 | auxiliary_head=dict( 30 | type='FCNHead', 31 | in_channels=1024, 32 | in_index=2, 33 | channels=256, 34 | num_convs=1, 35 | concat_input=False, 36 | dropout_ratio=0.1, 37 | num_classes=19, 38 | norm_cfg=norm_cfg, 39 | align_corners=False, 40 | loss_decode=dict( 41 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 42 | # model training and testing settings 43 | train_cfg=dict(), 44 | test_cfg=dict(mode='whole')) 45 | -------------------------------------------------------------------------------- /model-index.yml: -------------------------------------------------------------------------------- 1 | Import: 2 | - configs/ann/ann.yml 3 | - configs/apcnet/apcnet.yml 4 | - configs/beit/beit.yml 5 | - configs/bisenetv1/bisenetv1.yml 6 | - configs/bisenetv2/bisenetv2.yml 7 | - configs/ccnet/ccnet.yml 8 | - configs/cgnet/cgnet.yml 9 | - configs/convnext/convnext.yml 10 | - configs/danet/danet.yml 11 | - configs/deeplabv3/deeplabv3.yml 12 | - configs/deeplabv3plus/deeplabv3plus.yml 13 | - configs/dmnet/dmnet.yml 14 | - configs/dnlnet/dnlnet.yml 15 | - configs/dpt/dpt.yml 16 | - configs/emanet/emanet.yml 17 | - configs/encnet/encnet.yml 18 | - configs/erfnet/erfnet.yml 19 | - configs/fastfcn/fastfcn.yml 20 | - configs/fastscnn/fastscnn.yml 21 | - configs/fcn/fcn.yml 22 | - configs/gcnet/gcnet.yml 23 | - configs/hrnet/hrnet.yml 24 | - configs/icnet/icnet.yml 25 | - configs/isanet/isanet.yml 26 | - configs/knet/knet.yml 27 | - configs/mae/mae.yml 28 | - configs/mobilenet_v2/mobilenet_v2.yml 29 | - configs/mobilenet_v3/mobilenet_v3.yml 30 | - configs/nonlocal_net/nonlocal_net.yml 31 | - configs/ocrnet/ocrnet.yml 32 | - configs/point_rend/point_rend.yml 33 | - configs/psanet/psanet.yml 34 | - configs/pspnet/pspnet.yml 35 | - configs/resnest/resnest.yml 36 | - configs/segformer/segformer.yml 37 | - configs/segmenter/segmenter.yml 38 | - configs/sem_fpn/sem_fpn.yml 39 | - configs/setr/setr.yml 40 | - configs/stdc/stdc.yml 41 | - configs/swin/swin.yml 42 | - configs/twins/twins.yml 43 | - configs/unet/unet.yml 44 | - configs/upernet/upernet.yml 45 | - configs/vit/vit.yml 46 | -------------------------------------------------------------------------------- /configs/_base_/models/danet_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='DAHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | pam_channels=64, 23 | dropout_ratio=0.1, 24 | num_classes=19, 25 | norm_cfg=norm_cfg, 26 | align_corners=False, 27 | loss_decode=dict( 28 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 29 | auxiliary_head=dict( 30 | type='FCNHead', 31 | in_channels=1024, 32 | in_index=2, 33 | channels=256, 34 | num_convs=1, 35 | concat_input=False, 36 | dropout_ratio=0.1, 37 | num_classes=19, 38 | norm_cfg=norm_cfg, 39 | align_corners=False, 40 | loss_decode=dict( 41 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 42 | # model training and testing settings 43 | train_cfg=dict(), 44 | test_cfg=dict(mode='whole')) 45 | -------------------------------------------------------------------------------- /configs/_base_/models/pspnet_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='PSPHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | pool_scales=(1, 2, 3, 6), 23 | dropout_ratio=0.1, 24 | num_classes=19, 25 | norm_cfg=norm_cfg, 26 | align_corners=False, 27 | loss_decode=dict( 28 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 29 | auxiliary_head=dict( 30 | type='FCNHead', 31 | in_channels=1024, 32 | in_index=2, 33 | channels=256, 34 | num_convs=1, 35 | concat_input=False, 36 | dropout_ratio=0.1, 37 | num_classes=19, 38 | norm_cfg=norm_cfg, 39 | align_corners=False, 40 | loss_decode=dict( 41 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 42 | # model training and testing settings 43 | train_cfg=dict(), 44 | test_cfg=dict(mode='whole')) 45 | -------------------------------------------------------------------------------- /configs/_base_/models/deeplabv3_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='ASPPHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | dilations=(1, 12, 24, 36), 23 | dropout_ratio=0.1, 24 | num_classes=19, 25 | norm_cfg=norm_cfg, 26 | align_corners=False, 27 | loss_decode=dict( 28 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 29 | auxiliary_head=dict( 30 | type='FCNHead', 31 | in_channels=1024, 32 | in_index=2, 33 | channels=256, 34 | num_convs=1, 35 | concat_input=False, 36 | dropout_ratio=0.1, 37 | num_classes=19, 38 | norm_cfg=norm_cfg, 39 | align_corners=False, 40 | loss_decode=dict( 41 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 42 | # model training and testing settings 43 | train_cfg=dict(), 44 | test_cfg=dict(mode='whole')) 45 | -------------------------------------------------------------------------------- /configs/_base_/models/fcn_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='FCNHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | num_convs=2, 23 | concat_input=True, 24 | dropout_ratio=0.1, 25 | num_classes=19, 26 | norm_cfg=norm_cfg, 27 | align_corners=False, 28 | loss_decode=dict( 29 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 30 | auxiliary_head=dict( 31 | type='FCNHead', 32 | in_channels=1024, 33 | in_index=2, 34 | channels=256, 35 | num_convs=1, 36 | concat_input=False, 37 | dropout_ratio=0.1, 38 | num_classes=19, 39 | norm_cfg=norm_cfg, 40 | align_corners=False, 41 | loss_decode=dict( 42 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 43 | # model training and testing settings 44 | train_cfg=dict(), 45 | test_cfg=dict(mode='whole')) 46 | -------------------------------------------------------------------------------- /configs/_base_/models/isanet_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='ISAHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | isa_channels=256, 23 | down_factor=(8, 8), 24 | dropout_ratio=0.1, 25 | num_classes=19, 26 | norm_cfg=norm_cfg, 27 | align_corners=False, 28 | loss_decode=dict( 29 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 30 | auxiliary_head=dict( 31 | type='FCNHead', 32 | in_channels=1024, 33 | in_index=2, 34 | channels=256, 35 | num_convs=1, 36 | concat_input=False, 37 | dropout_ratio=0.1, 38 | num_classes=19, 39 | norm_cfg=norm_cfg, 40 | align_corners=False, 41 | loss_decode=dict( 42 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 43 | # model training and testing settings 44 | train_cfg=dict(), 45 | test_cfg=dict(mode='whole')) 46 | -------------------------------------------------------------------------------- /configs/_base_/models/upernet_r50.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 1, 1), 12 | strides=(1, 2, 2, 2), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='UPerHead', 19 | in_channels=[256, 512, 1024, 2048], 20 | in_index=[0, 1, 2, 3], 21 | pool_scales=(1, 2, 3, 6), 22 | channels=512, 23 | dropout_ratio=0.1, 24 | num_classes=19, 25 | norm_cfg=norm_cfg, 26 | align_corners=False, 27 | loss_decode=dict( 28 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 29 | auxiliary_head=dict( 30 | type='FCNHead', 31 | in_channels=1024, 32 | in_index=2, 33 | channels=256, 34 | num_convs=1, 35 | concat_input=False, 36 | dropout_ratio=0.1, 37 | num_classes=19, 38 | norm_cfg=norm_cfg, 39 | align_corners=False, 40 | loss_decode=dict( 41 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 42 | # model training and testing settings 43 | train_cfg=dict(), 44 | test_cfg=dict(mode='whole')) 45 | -------------------------------------------------------------------------------- /configs/_base_/models/apcnet_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='APCHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | pool_scales=(1, 2, 3, 6), 23 | dropout_ratio=0.1, 24 | num_classes=19, 25 | norm_cfg=dict(type='SyncBN', requires_grad=True), 26 | align_corners=False, 27 | loss_decode=dict( 28 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 29 | auxiliary_head=dict( 30 | type='FCNHead', 31 | in_channels=1024, 32 | in_index=2, 33 | channels=256, 34 | num_convs=1, 35 | concat_input=False, 36 | dropout_ratio=0.1, 37 | num_classes=19, 38 | norm_cfg=norm_cfg, 39 | align_corners=False, 40 | loss_decode=dict( 41 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 42 | # model training and testing settings 43 | train_cfg=dict(), 44 | test_cfg=dict(mode='whole')) 45 | -------------------------------------------------------------------------------- /configs/_base_/models/dmnet_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='DMHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | filter_sizes=(1, 3, 5, 7), 23 | dropout_ratio=0.1, 24 | num_classes=19, 25 | norm_cfg=dict(type='SyncBN', requires_grad=True), 26 | align_corners=False, 27 | loss_decode=dict( 28 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 29 | auxiliary_head=dict( 30 | type='FCNHead', 31 | in_channels=1024, 32 | in_index=2, 33 | channels=256, 34 | num_convs=1, 35 | concat_input=False, 36 | dropout_ratio=0.1, 37 | num_classes=19, 38 | norm_cfg=norm_cfg, 39 | align_corners=False, 40 | loss_decode=dict( 41 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 42 | # model training and testing settings 43 | train_cfg=dict(), 44 | test_cfg=dict(mode='whole')) 45 | -------------------------------------------------------------------------------- /tests/test_models/test_backbones/utils.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | from torch.nn.modules import GroupNorm 4 | from torch.nn.modules.batchnorm import _BatchNorm 5 | 6 | from mmseg.models.backbones.resnet import BasicBlock, Bottleneck 7 | from mmseg.models.backbones.resnext import Bottleneck as BottleneckX 8 | 9 | 10 | def is_block(modules): 11 | """Check if is ResNet building block.""" 12 | if isinstance(modules, (BasicBlock, Bottleneck, BottleneckX)): 13 | return True 14 | return False 15 | 16 | 17 | def is_norm(modules): 18 | """Check if is one of the norms.""" 19 | if isinstance(modules, (GroupNorm, _BatchNorm)): 20 | return True 21 | return False 22 | 23 | 24 | def all_zeros(modules): 25 | """Check if the weight(and bias) is all zero.""" 26 | weight_zero = torch.allclose(modules.weight.data, 27 | torch.zeros_like(modules.weight.data)) 28 | if hasattr(modules, 'bias'): 29 | bias_zero = torch.allclose(modules.bias.data, 30 | torch.zeros_like(modules.bias.data)) 31 | else: 32 | bias_zero = True 33 | 34 | return weight_zero and bias_zero 35 | 36 | 37 | def check_norm_state(modules, train_state): 38 | """Check if norm layer is in correct train state.""" 39 | for mod in modules: 40 | if isinstance(mod, _BatchNorm): 41 | if mod.training != train_state: 42 | return False 43 | return True 44 | -------------------------------------------------------------------------------- /.dev/upload_modelzoo.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import argparse 3 | import os 4 | import os.path as osp 5 | 6 | import oss2 7 | 8 | ACCESS_KEY_ID = os.getenv('OSS_ACCESS_KEY_ID', None) 9 | ACCESS_KEY_SECRET = os.getenv('OSS_ACCESS_KEY_SECRET', None) 10 | BUCKET_NAME = 'openmmlab' 11 | ENDPOINT = 'https://oss-accelerate.aliyuncs.com' 12 | 13 | 14 | def parse_args(): 15 | parser = argparse.ArgumentParser(description='Upload models to OSS') 16 | parser.add_argument('model_zoo', type=str, help='model_zoo input') 17 | parser.add_argument( 18 | '--dst-folder', 19 | type=str, 20 | default='mmsegmentation/v0.5', 21 | help='destination folder') 22 | return parser.parse_args() 23 | 24 | 25 | def main(): 26 | args = parse_args() 27 | model_zoo = args.model_zoo 28 | dst_folder = args.dst_folder 29 | bucket = oss2.Bucket( 30 | oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET), ENDPOINT, BUCKET_NAME) 31 | 32 | for root, dirs, files in os.walk(model_zoo): 33 | for file in files: 34 | file_path = osp.relpath(osp.join(root, file), model_zoo) 35 | print(f'Uploading {file_path}') 36 | 37 | oss2.resumable_upload(bucket, osp.join(dst_folder, file_path), 38 | osp.join(model_zoo, file_path)) 39 | bucket.put_object_acl( 40 | osp.join(dst_folder, file_path), oss2.OBJECT_ACL_PUBLIC_READ) 41 | 42 | 43 | if __name__ == '__main__': 44 | main() 45 | -------------------------------------------------------------------------------- /configs/_base_/models/dnl_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='DNLHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | dropout_ratio=0.1, 23 | reduction=2, 24 | use_scale=True, 25 | mode='embedded_gaussian', 26 | num_classes=19, 27 | norm_cfg=norm_cfg, 28 | align_corners=False, 29 | loss_decode=dict( 30 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 31 | auxiliary_head=dict( 32 | type='FCNHead', 33 | in_channels=1024, 34 | in_index=2, 35 | channels=256, 36 | num_convs=1, 37 | concat_input=False, 38 | dropout_ratio=0.1, 39 | num_classes=19, 40 | norm_cfg=norm_cfg, 41 | align_corners=False, 42 | loss_decode=dict( 43 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 44 | # model training and testing settings 45 | train_cfg=dict(), 46 | test_cfg=dict(mode='whole')) 47 | -------------------------------------------------------------------------------- /mmseg/models/decode_heads/cc_head.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import torch 3 | 4 | from ..builder import HEADS 5 | from .fcn_head import FCNHead 6 | 7 | try: 8 | from mmcv.ops import CrissCrossAttention 9 | except ModuleNotFoundError: 10 | CrissCrossAttention = None 11 | 12 | 13 | @HEADS.register_module() 14 | class CCHead(FCNHead): 15 | """CCNet: Criss-Cross Attention for Semantic Segmentation. 16 | 17 | This head is the implementation of `CCNet 18 | `_. 19 | 20 | Args: 21 | recurrence (int): Number of recurrence of Criss Cross Attention 22 | module. Default: 2. 23 | """ 24 | 25 | def __init__(self, recurrence=2, **kwargs): 26 | if CrissCrossAttention is None: 27 | raise RuntimeError('Please install mmcv-full for ' 28 | 'CrissCrossAttention ops') 29 | super(CCHead, self).__init__(num_convs=2, **kwargs) 30 | self.recurrence = recurrence 31 | self.cca = CrissCrossAttention(self.channels) 32 | 33 | def forward(self, inputs): 34 | """Forward function.""" 35 | x = self._transform_inputs(inputs) 36 | output = self.convs[0](x) 37 | for _ in range(self.recurrence): 38 | output = self.cca(output) 39 | output = self.convs[1](output) 40 | if self.concat_input: 41 | output = self.conv_cat(torch.cat([x, output], dim=1)) 42 | output = self.cls_seg(output) 43 | return output 44 | -------------------------------------------------------------------------------- /configs/_base_/models/nonlocal_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='NLHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | dropout_ratio=0.1, 23 | reduction=2, 24 | use_scale=True, 25 | mode='embedded_gaussian', 26 | num_classes=19, 27 | norm_cfg=norm_cfg, 28 | align_corners=False, 29 | loss_decode=dict( 30 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 31 | auxiliary_head=dict( 32 | type='FCNHead', 33 | in_channels=1024, 34 | in_index=2, 35 | channels=256, 36 | num_convs=1, 37 | concat_input=False, 38 | dropout_ratio=0.1, 39 | num_classes=19, 40 | norm_cfg=norm_cfg, 41 | align_corners=False, 42 | loss_decode=dict( 43 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 44 | # model training and testing settings 45 | train_cfg=dict(), 46 | test_cfg=dict(mode='whole')) 47 | -------------------------------------------------------------------------------- /configs/_base_/models/gcnet_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='GCHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=512, 22 | ratio=1 / 4., 23 | pooling_type='att', 24 | fusion_types=('channel_add', ), 25 | dropout_ratio=0.1, 26 | num_classes=19, 27 | norm_cfg=norm_cfg, 28 | align_corners=False, 29 | loss_decode=dict( 30 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 31 | auxiliary_head=dict( 32 | type='FCNHead', 33 | in_channels=1024, 34 | in_index=2, 35 | channels=256, 36 | num_convs=1, 37 | concat_input=False, 38 | dropout_ratio=0.1, 39 | num_classes=19, 40 | norm_cfg=norm_cfg, 41 | align_corners=False, 42 | loss_decode=dict( 43 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 44 | # model training and testing settings 45 | train_cfg=dict(), 46 | test_cfg=dict(mode='whole')) 47 | -------------------------------------------------------------------------------- /configs/_base_/models/emanet_r50-d8.py: -------------------------------------------------------------------------------- 1 | # model settings 2 | norm_cfg = dict(type='SyncBN', requires_grad=True) 3 | model = dict( 4 | type='EncoderDecoder', 5 | pretrained='open-mmlab://resnet50_v1c', 6 | backbone=dict( 7 | type='ResNetV1c', 8 | depth=50, 9 | num_stages=4, 10 | out_indices=(0, 1, 2, 3), 11 | dilations=(1, 1, 2, 4), 12 | strides=(1, 2, 1, 1), 13 | norm_cfg=norm_cfg, 14 | norm_eval=False, 15 | style='pytorch', 16 | contract_dilation=True), 17 | decode_head=dict( 18 | type='EMAHead', 19 | in_channels=2048, 20 | in_index=3, 21 | channels=256, 22 | ema_channels=512, 23 | num_bases=64, 24 | num_stages=3, 25 | momentum=0.1, 26 | dropout_ratio=0.1, 27 | num_classes=19, 28 | norm_cfg=norm_cfg, 29 | align_corners=False, 30 | loss_decode=dict( 31 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), 32 | auxiliary_head=dict( 33 | type='FCNHead', 34 | in_channels=1024, 35 | in_index=2, 36 | channels=256, 37 | num_convs=1, 38 | concat_input=False, 39 | dropout_ratio=0.1, 40 | num_classes=19, 41 | norm_cfg=norm_cfg, 42 | align_corners=False, 43 | loss_decode=dict( 44 | type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), 45 | # model training and testing settings 46 | train_cfg=dict(), 47 | test_cfg=dict(mode='whole')) 48 | -------------------------------------------------------------------------------- /mmseg/models/builder.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import warnings 3 | 4 | from mmcv.cnn import MODELS as MMCV_MODELS 5 | from mmcv.cnn.bricks.registry import ATTENTION as MMCV_ATTENTION 6 | from mmcv.utils import Registry 7 | 8 | MODELS = Registry('models', parent=MMCV_MODELS) 9 | ATTENTION = Registry('attention', parent=MMCV_ATTENTION) 10 | 11 | BACKBONES = MODELS 12 | NECKS = MODELS 13 | HEADS = MODELS 14 | LOSSES = MODELS 15 | SEGMENTORS = MODELS 16 | 17 | 18 | def build_backbone(cfg): 19 | """Build backbone.""" 20 | return BACKBONES.build(cfg) 21 | 22 | 23 | def build_neck(cfg): 24 | """Build neck.""" 25 | return NECKS.build(cfg) 26 | 27 | 28 | def build_head(cfg): 29 | """Build head.""" 30 | return HEADS.build(cfg) 31 | 32 | 33 | def build_loss(cfg): 34 | """Build loss.""" 35 | return LOSSES.build(cfg) 36 | 37 | 38 | def build_segmentor(cfg, train_cfg=None, test_cfg=None): 39 | """Build segmentor.""" 40 | if train_cfg is not None or test_cfg is not None: 41 | warnings.warn( 42 | 'train_cfg and test_cfg is deprecated, ' 43 | 'please specify them in model', UserWarning) 44 | assert cfg.get('train_cfg') is None or train_cfg is None, \ 45 | 'train_cfg specified in both outer field and model field ' 46 | assert cfg.get('test_cfg') is None or test_cfg is None, \ 47 | 'test_cfg specified in both outer field and model field ' 48 | return SEGMENTORS.build( 49 | cfg, default_args=dict(train_cfg=train_cfg, test_cfg=test_cfg)) 50 | --------------------------------------------------------------------------------