From 12f261f4480d66071fb3fcace277d71a9fab214c Mon Sep 17 00:00:00 2001 From: Chenhongyi Yang Date: Sun, 11 Dec 2022 22:15:52 +0000 Subject: [PATCH] first commit --- CITATION.cff | 9 + CONTRIBUTING.md | 61 + LICENSE | 203 ++ MANIFEST.in | 4 + README.md | 197 ++ configs/_base_/datasets/cifar100_bs16.py | 36 + configs/_base_/datasets/cifar10_bs16.py | 35 + configs/_base_/datasets/cub_bs8_384.py | 54 + configs/_base_/datasets/cub_bs8_448.py | 54 + configs/_base_/datasets/imagenet21k_bs128.py | 43 + .../imagenet_bs128_poolformer_medium_224.py | 71 + .../imagenet_bs128_poolformer_small_224.py | 71 + .../_base_/datasets/imagenet_bs256_rsb_a12.py | 53 + .../_base_/datasets/imagenet_bs256_rsb_a3.py | 53 + configs/_base_/datasets/imagenet_bs32.py | 40 + .../datasets/imagenet_bs32_pil_bicubic.py | 48 + .../datasets/imagenet_bs32_pil_resize.py | 40 + configs/_base_/datasets/imagenet_bs64.py | 40 + .../_base_/datasets/imagenet_bs64_autoaug.py | 43 + .../datasets/imagenet_bs64_convmixer_224.py | 71 + .../datasets/imagenet_bs64_mixer_224.py | 48 + .../datasets/imagenet_bs64_pil_resize.py | 40 + .../imagenet_bs64_pil_resize_autoaug.py | 53 + .../_base_/datasets/imagenet_bs64_swin_224.py | 71 + .../datasets/imagenet_bs64_swin_224_lmdb.py | 80 + .../_base_/datasets/imagenet_bs64_swin_256.py | 71 + .../_base_/datasets/imagenet_bs64_swin_384.py | 43 + .../_base_/datasets/imagenet_bs64_t2t_224.py | 71 + configs/_base_/datasets/pipelines/auto_aug.py | 96 + configs/_base_/datasets/pipelines/rand_aug.py | 43 + .../_base_/datasets/stanford_cars_bs8_448.py | 46 + configs/_base_/datasets/voc_bs16.py | 41 + configs/_base_/default_runtime.py | 16 + configs/_base_/models/conformer/base-p16.py | 22 + configs/_base_/models/conformer/small-p16.py | 22 + configs/_base_/models/conformer/small-p32.py | 26 + configs/_base_/models/conformer/tiny-p16.py | 22 + .../models/convmixer/convmixer-1024-20.py | 11 + .../models/convmixer/convmixer-1536-20.py | 11 + .../models/convmixer/convmixer-768-32.py | 11 + .../_base_/models/convnext/convnext-base.py | 23 + .../_base_/models/convnext/convnext-large.py | 23 + .../_base_/models/convnext/convnext-small.py | 23 + .../_base_/models/convnext/convnext-tiny.py | 23 + .../_base_/models/convnext/convnext-xlarge.py | 23 + configs/_base_/models/densenet/densenet121.py | 11 + configs/_base_/models/densenet/densenet161.py | 11 + configs/_base_/models/densenet/densenet169.py | 11 + configs/_base_/models/densenet/densenet201.py | 11 + configs/_base_/models/efficientnet_b0.py | 12 + configs/_base_/models/efficientnet_b1.py | 12 + configs/_base_/models/efficientnet_b2.py | 12 + configs/_base_/models/efficientnet_b3.py | 12 + configs/_base_/models/efficientnet_b4.py | 12 + configs/_base_/models/efficientnet_b5.py | 12 + configs/_base_/models/efficientnet_b6.py | 12 + configs/_base_/models/efficientnet_b7.py | 12 + configs/_base_/models/efficientnet_b8.py | 12 + configs/_base_/models/efficientnet_em.py | 13 + configs/_base_/models/efficientnet_es.py | 13 + .../_base_/models/hornet/hornet-base-gf.py | 21 + configs/_base_/models/hornet/hornet-base.py | 21 + .../_base_/models/hornet/hornet-large-gf.py | 21 + .../models/hornet/hornet-large-gf384.py | 17 + configs/_base_/models/hornet/hornet-large.py | 21 + .../_base_/models/hornet/hornet-small-gf.py | 21 + configs/_base_/models/hornet/hornet-small.py | 21 + .../_base_/models/hornet/hornet-tiny-gf.py | 21 + configs/_base_/models/hornet/hornet-tiny.py | 21 + configs/_base_/models/hrnet/hrnet-w18.py | 15 + configs/_base_/models/hrnet/hrnet-w30.py | 15 + configs/_base_/models/hrnet/hrnet-w32.py | 15 + configs/_base_/models/hrnet/hrnet-w40.py | 15 + configs/_base_/models/hrnet/hrnet-w44.py | 15 + configs/_base_/models/hrnet/hrnet-w48.py | 15 + configs/_base_/models/hrnet/hrnet-w64.py | 15 + .../_base_/models/mlp_mixer_base_patch16.py | 25 + .../_base_/models/mlp_mixer_large_patch16.py | 25 + configs/_base_/models/mobilenet_v2_1x.py | 12 + .../models/mobilenet_v3_large_imagenet.py | 16 + .../_base_/models/mobilenet_v3_small_cifar.py | 13 + .../models/mobilenet_v3_small_imagenet.py | 16 + configs/_base_/models/mvit/mvitv2-base.py | 19 + configs/_base_/models/mvit/mvitv2-large.py | 23 + configs/_base_/models/mvit/mvitv2-small.py | 19 + configs/_base_/models/mvit/mvitv2-tiny.py | 19 + .../models/poolformer/poolformer_m36.py | 22 + .../models/poolformer/poolformer_m48.py | 22 + .../models/poolformer/poolformer_s12.py | 22 + .../models/poolformer/poolformer_s24.py | 22 + .../models/poolformer/poolformer_s36.py | 22 + configs/_base_/models/regnet/regnetx_1.6gf.py | 12 + configs/_base_/models/regnet/regnetx_12gf.py | 12 + configs/_base_/models/regnet/regnetx_3.2gf.py | 12 + configs/_base_/models/regnet/regnetx_4.0gf.py | 12 + configs/_base_/models/regnet/regnetx_400mf.py | 12 + configs/_base_/models/regnet/regnetx_6.4gf.py | 12 + configs/_base_/models/regnet/regnetx_8.0gf.py | 12 + configs/_base_/models/regnet/regnetx_800mf.py | 12 + configs/_base_/models/repmlp-base_224.py | 18 + configs/_base_/models/repvgg-A0_in1k.py | 15 + .../_base_/models/repvgg-B3_lbs-mixup_in1k.py | 23 + configs/_base_/models/res2net101-w26-s4.py | 18 + configs/_base_/models/res2net50-w14-s8.py | 18 + configs/_base_/models/res2net50-w26-s4.py | 18 + configs/_base_/models/res2net50-w26-s6.py | 18 + configs/_base_/models/res2net50-w26-s8.py | 18 + configs/_base_/models/res2net50-w48-s2.py | 18 + configs/_base_/models/resnest101.py | 24 + configs/_base_/models/resnest200.py | 24 + configs/_base_/models/resnest269.py | 24 + configs/_base_/models/resnest50.py | 23 + configs/_base_/models/resnet101.py | 17 + configs/_base_/models/resnet101_cifar.py | 16 + configs/_base_/models/resnet152.py | 17 + configs/_base_/models/resnet152_cifar.py | 16 + configs/_base_/models/resnet18.py | 17 + configs/_base_/models/resnet18_cifar.py | 16 + configs/_base_/models/resnet34.py | 17 + configs/_base_/models/resnet34_cifar.py | 16 + configs/_base_/models/resnet34_gem.py | 17 + configs/_base_/models/resnet50.py | 17 + configs/_base_/models/resnet50_cifar.py | 16 + .../_base_/models/resnet50_cifar_cutmix.py | 18 + configs/_base_/models/resnet50_cifar_mixup.py | 17 + configs/_base_/models/resnet50_cutmix.py | 18 + .../_base_/models/resnet50_label_smooth.py | 18 + configs/_base_/models/resnet50_mixup.py | 18 + configs/_base_/models/resnetv1c50.py | 17 + configs/_base_/models/resnetv1d101.py | 17 + configs/_base_/models/resnetv1d152.py | 17 + configs/_base_/models/resnetv1d50.py | 17 + configs/_base_/models/resnext101_32x4d.py | 19 + configs/_base_/models/resnext101_32x8d.py | 19 + configs/_base_/models/resnext152_32x4d.py | 19 + configs/_base_/models/resnext50_32x4d.py | 19 + configs/_base_/models/seresnet101.py | 17 + configs/_base_/models/seresnet50.py | 17 + configs/_base_/models/seresnext101_32x4d.py | 20 + configs/_base_/models/seresnext50_32x4d.py | 20 + configs/_base_/models/shufflenet_v1_1x.py | 12 + configs/_base_/models/shufflenet_v2_1x.py | 12 + .../models/swin_transformer/base_224.py | 22 + .../models/swin_transformer/base_384.py | 16 + .../models/swin_transformer/large_224.py | 12 + .../models/swin_transformer/large_384.py | 16 + .../models/swin_transformer/small_224.py | 23 + .../models/swin_transformer/tiny_224.py | 22 + .../models/swin_transformer_v2/base_256.py | 25 + .../models/swin_transformer_v2/base_384.py | 17 + .../models/swin_transformer_v2/large_256.py | 16 + .../models/swin_transformer_v2/large_384.py | 16 + .../models/swin_transformer_v2/small_256.py | 25 + .../models/swin_transformer_v2/tiny_256.py | 25 + configs/_base_/models/t2t-vit-t-14.py | 41 + configs/_base_/models/t2t-vit-t-19.py | 41 + configs/_base_/models/t2t-vit-t-24.py | 41 + configs/_base_/models/tnt_s_patch16_224.py | 29 + configs/_base_/models/twins_pcpvt_base.py | 30 + configs/_base_/models/twins_svt_base.py | 30 + configs/_base_/models/van/van_b0.py | 21 + configs/_base_/models/van/van_b1.py | 21 + configs/_base_/models/van/van_b2.py | 13 + configs/_base_/models/van/van_b3.py | 13 + configs/_base_/models/van/van_b4.py | 13 + configs/_base_/models/van/van_b5.py | 13 + configs/_base_/models/van/van_b6.py | 13 + configs/_base_/models/van/van_base.py | 1 + configs/_base_/models/van/van_large.py | 1 + configs/_base_/models/van/van_small.py | 1 + configs/_base_/models/van/van_tiny.py | 1 + configs/_base_/models/vgg11.py | 10 + configs/_base_/models/vgg11bn.py | 11 + configs/_base_/models/vgg13.py | 10 + configs/_base_/models/vgg13bn.py | 11 + configs/_base_/models/vgg16.py | 10 + configs/_base_/models/vgg16bn.py | 11 + configs/_base_/models/vgg19.py | 10 + configs/_base_/models/vgg19bn.py | 11 + configs/_base_/models/vit-base-p16.py | 25 + configs/_base_/models/vit-base-p32.py | 24 + configs/_base_/models/vit-large-p16.py | 24 + configs/_base_/models/vit-large-p32.py | 24 + configs/_base_/models/wide-resnet50.py | 20 + configs/_base_/schedules/cifar10_bs128.py | 6 + configs/_base_/schedules/cub_bs64.py | 13 + .../imagenet_bs1024_adamw_conformer.py | 29 + .../schedules/imagenet_bs1024_adamw_swin.py | 30 + .../_base_/schedules/imagenet_bs1024_coslr.py | 12 + .../imagenet_bs1024_linearlr_bn_nowd.py | 17 + configs/_base_/schedules/imagenet_bs2048.py | 12 + .../_base_/schedules/imagenet_bs2048_AdamW.py | 20 + .../_base_/schedules/imagenet_bs2048_coslr.py | 12 + .../_base_/schedules/imagenet_bs2048_rsb.py | 12 + configs/_base_/schedules/imagenet_bs256.py | 6 + .../_base_/schedules/imagenet_bs256_140e.py | 6 + .../imagenet_bs256_200e_coslr_warmup.py | 11 + .../_base_/schedules/imagenet_bs256_coslr.py | 6 + .../schedules/imagenet_bs256_epochstep.py | 6 + .../_base_/schedules/imagenet_bs4096_AdamW.py | 24 + configs/_base_/schedules/stanford_cars_bs8.py | 7 + configs/conformer/README.md | 37 + .../conformer-base-p16_8xb128_in1k.py | 9 + .../conformer-small-p16_8xb128_in1k.py | 9 + .../conformer-small-p32_8xb128_in1k.py | 9 + .../conformer-tiny-p16_8xb128_in1k.py | 9 + configs/conformer/metafile.yml | 78 + configs/convmixer/README.md | 42 + .../convmixer-1024-20_10xb64_in1k.py | 10 + .../convmixer-1536-20_10xb64_in1k.py | 10 + .../convmixer/convmixer-768-32_10xb64_in1k.py | 10 + configs/convmixer/metafile.yml | 61 + configs/convnext/README.md | 59 + .../convnext/convnext-base_32xb128_in1k.py | 12 + .../convnext/convnext-large_64xb64_in1k.py | 12 + .../convnext/convnext-small_32xb128_in1k.py | 12 + .../convnext/convnext-tiny_32xb128_in1k.py | 12 + .../convnext/convnext-xlarge_64xb64_in1k.py | 12 + configs/convnext/metafile.yml | 221 ++ configs/cspnet/README.md | 41 + configs/cspnet/cspdarknet50_8xb32_in1k.py | 65 + configs/cspnet/cspresnet50_8xb32_in1k.py | 66 + configs/cspnet/cspresnext50_8xb32_in1k.py | 65 + configs/cspnet/metafile.yml | 64 + configs/csra/README.md | 36 + configs/csra/metafile.yml | 29 + .../csra/resnet101-csra_1xb16_voc07-448px.py | 75 + configs/deit/README.md | 52 + ...eit-base-distilled_ft-16xb32_in1k-384px.py | 9 + .../deit-base-distilled_pt-16xb64_in1k.py | 10 + .../deit/deit-base_ft-16xb32_in1k-384px.py | 29 + configs/deit/deit-base_pt-16xb64_in1k.py | 13 + .../deit-small-distilled_pt-4xb256_in1k.py | 7 + configs/deit/deit-small_pt-4xb256_in1k.py | 44 + .../deit-tiny-distilled_pt-4xb256_in1k.py | 7 + configs/deit/deit-tiny_pt-4xb256_in1k.py | 7 + configs/deit/metafile.yml | 153 + configs/densenet/README.md | 41 + configs/densenet/densenet121_4xb256_in1k.py | 10 + configs/densenet/densenet161_4xb256_in1k.py | 10 + configs/densenet/densenet169_4xb256_in1k.py | 10 + configs/densenet/densenet201_4xb256_in1k.py | 10 + configs/densenet/metafile.yml | 76 + configs/efficientformer/README.md | 47 + .../efficientformer-l1_8xb128_in1k.py | 24 + .../efficientformer-l3_8xb128_in1k.py | 24 + .../efficientformer-l7_8xb128_in1k.py | 24 + configs/efficientformer/metafile.yml | 67 + configs/efficientnet/README.md | 62 + .../efficientnet-b0_8xb32-01norm_in1k.py | 39 + .../efficientnet-b0_8xb32_in1k.py | 39 + .../efficientnet-b1_8xb32-01norm_in1k.py | 39 + .../efficientnet-b1_8xb32_in1k.py | 39 + .../efficientnet-b2_8xb32-01norm_in1k.py | 39 + .../efficientnet-b2_8xb32_in1k.py | 39 + .../efficientnet-b3_8xb32-01norm_in1k.py | 39 + .../efficientnet-b3_8xb32_in1k.py | 39 + .../efficientnet-b4_8xb32-01norm_in1k.py | 39 + .../efficientnet-b4_8xb32_in1k.py | 39 + .../efficientnet-b5_8xb32-01norm_in1k.py | 39 + .../efficientnet-b5_8xb32_in1k.py | 39 + .../efficientnet-b6_8xb32-01norm_in1k.py | 39 + .../efficientnet-b6_8xb32_in1k.py | 39 + .../efficientnet-b7_8xb32-01norm_in1k.py | 39 + .../efficientnet-b7_8xb32_in1k.py | 39 + .../efficientnet-b8_8xb32-01norm_in1k.py | 39 + .../efficientnet-b8_8xb32_in1k.py | 39 + .../efficientnet-em_8xb32-01norm_in1k.py | 39 + .../efficientnet-es_8xb32-01norm_in1k.py | 39 + configs/efficientnet/metafile.yml | 391 +++ .../resnet50_b32x8_fp16_dynamic_imagenet.py | 6 + configs/fp16/resnet50_b32x8_fp16_imagenet.py | 6 + configs/gpvit/gpvit_l1.py | 61 + configs/gpvit/gpvit_l2.py | 61 + configs/gpvit/gpvit_l3.py | 61 + configs/gpvit/gpvit_l4.py | 61 + configs/hornet/README.md | 51 + configs/hornet/hornet-base-gf_8xb64_in1k.py | 13 + configs/hornet/hornet-base_8xb64_in1k.py | 13 + configs/hornet/hornet-small-gf_8xb64_in1k.py | 13 + configs/hornet/hornet-small_8xb64_in1k.py | 13 + configs/hornet/hornet-tiny-gf_8xb128_in1k.py | 13 + configs/hornet/hornet-tiny_8xb128_in1k.py | 13 + configs/hornet/metafile.yml | 97 + configs/hrnet/README.md | 44 + configs/hrnet/hrnet-w18_4xb32_in1k.py | 6 + configs/hrnet/hrnet-w30_4xb32_in1k.py | 6 + configs/hrnet/hrnet-w32_4xb32_in1k.py | 6 + configs/hrnet/hrnet-w40_4xb32_in1k.py | 6 + configs/hrnet/hrnet-w44_4xb32_in1k.py | 6 + configs/hrnet/hrnet-w48_4xb32_in1k.py | 6 + configs/hrnet/hrnet-w64_4xb32_in1k.py | 6 + configs/hrnet/metafile.yml | 162 + configs/lenet/README.md | 28 + configs/lenet/lenet5_mnist.py | 59 + configs/mlp_mixer/README.md | 37 + configs/mlp_mixer/metafile.yml | 50 + .../mlp-mixer-base-p16_64xb64_in1k.py | 6 + .../mlp-mixer-large-p16_64xb64_in1k.py | 6 + configs/mobilenet_v2/README.md | 38 + configs/mobilenet_v2/metafile.yml | 34 + .../mobilenet_v2/mobilenet-v2_8xb32_in1k.py | 6 + .../mobilenet_v2_b32x8_imagenet.py | 6 + configs/mobilenet_v3/README.md | 36 + configs/mobilenet_v3/metafile.yml | 47 + .../mobilenet-v3-large_8xb32_in1k.py | 158 + .../mobilenet-v3-small_8xb16_cifar10.py | 8 + .../mobilenet-v3-small_8xb32_in1k.py | 158 + .../mobilenet_v3_large_imagenet.py | 6 + .../mobilenet_v3/mobilenet_v3_small_cifar.py | 6 + .../mobilenet_v3_small_imagenet.py | 6 + configs/mvit/README.md | 44 + configs/mvit/metafile.yml | 95 + configs/mvit/mvitv2-base_8xb256_in1k.py | 29 + configs/mvit/mvitv2-large_8xb256_in1k.py | 29 + configs/mvit/mvitv2-small_8xb256_in1k.py | 29 + configs/mvit/mvitv2-tiny_8xb256_in1k.py | 29 + configs/poolformer/README.md | 38 + configs/poolformer/metafile.yml | 99 + .../poolformer/poolformer-m36_32xb128_in1k.py | 8 + .../poolformer/poolformer-m48_32xb128_in1k.py | 8 + .../poolformer/poolformer-s12_32xb128_in1k.py | 8 + .../poolformer/poolformer-s24_32xb128_in1k.py | 8 + .../poolformer/poolformer-s36_32xb128_in1k.py | 8 + configs/regnet/README.md | 51 + configs/regnet/metafile.yml | 122 + configs/regnet/regnetx-1.6gf_8xb128_in1k.py | 6 + configs/regnet/regnetx-12gf_8xb64_in1k.py | 11 + configs/regnet/regnetx-3.2gf_8xb64_in1k.py | 11 + configs/regnet/regnetx-4.0gf_8xb64_in1k.py | 11 + configs/regnet/regnetx-400mf_8xb128_in1k.py | 77 + configs/regnet/regnetx-6.4gf_8xb64_in1k.py | 11 + configs/regnet/regnetx-8.0gf_8xb64_in1k.py | 11 + configs/regnet/regnetx-800mf_8xb128_in1k.py | 6 + configs/repmlp/README.md | 93 + configs/repmlp/metafile.yml | 48 + .../repmlp/repmlp-base_8xb64_in1k-256px.py | 21 + configs/repmlp/repmlp-base_8xb64_in1k.py | 20 + .../repmlp/repmlp-base_delopy_8xb64_in1k.py | 3 + .../repmlp-base_deploy_8xb64_in1k-256px.py | 3 + configs/repvgg/README.md | 101 + .../repvgg-A0_deploy_4xb64-coslr-120e_in1k.py | 3 + .../repvgg-A1_deploy_4xb64-coslr-120e_in1k.py | 3 + .../repvgg-A2_deploy_4xb64-coslr-120e_in1k.py | 3 + .../repvgg-B0_deploy_4xb64-coslr-120e_in1k.py | 3 + .../repvgg-B1_deploy_4xb64-coslr-120e_in1k.py | 3 + ...epvgg-B1g2_deploy_4xb64-coslr-120e_in1k.py | 3 + ...epvgg-B1g4_deploy_4xb64-coslr-120e_in1k.py | 3 + .../repvgg-B2_deploy_4xb64-coslr-120e_in1k.py | 3 + ...4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py | 3 + ...4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py | 3 + ...4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py | 3 + ...4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py | 3 + configs/repvgg/metafile.yml | 208 ++ .../repvgg/repvgg-A0_4xb64-coslr-120e_in1k.py | 8 + .../repvgg/repvgg-A1_4xb64-coslr-120e_in1k.py | 3 + .../repvgg/repvgg-A2_4xb64-coslr-120e_in1k.py | 3 + .../repvgg/repvgg-B0_4xb64-coslr-120e_in1k.py | 3 + .../repvgg/repvgg-B1_4xb64-coslr-120e_in1k.py | 3 + .../repvgg-B1g2_4xb64-coslr-120e_in1k.py | 3 + .../repvgg-B1g4_4xb64-coslr-120e_in1k.py | 3 + .../repvgg/repvgg-B2_4xb64-coslr-120e_in1k.py | 3 + ...4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py | 3 + ...4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py | 6 + ...4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py | 3 + ...4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py | 3 + configs/res2net/README.md | 37 + configs/res2net/metafile.yml | 70 + .../res2net/res2net101-w26-s4_8xb32_in1k.py | 5 + .../res2net/res2net50-w14-s8_8xb32_in1k.py | 5 + .../res2net/res2net50-w26-s8_8xb32_in1k.py | 5 + configs/resnest/README.md | 26 + configs/resnest/resnest101_32xb64_in1k.py | 181 + configs/resnest/resnest101_b64x32_imagenet.py | 6 + configs/resnest/resnest200_64xb32_in1k.py | 181 + configs/resnest/resnest200_b32x64_imagenet.py | 6 + configs/resnest/resnest269_64xb32_in1k.py | 181 + configs/resnest/resnest269_b32x64_imagenet.py | 6 + configs/resnest/resnest50_32xb64_in1k.py | 181 + configs/resnest/resnest50_b64x32_imagenet.py | 6 + configs/resnet/README.md | 91 + configs/resnet/metafile.yml | 365 +++ configs/resnet/resnet101_8xb16_cifar10.py | 5 + configs/resnet/resnet101_8xb32_in1k.py | 4 + configs/resnet/resnet101_b16x8_cifar10.py | 6 + configs/resnet/resnet101_b32x8_imagenet.py | 6 + configs/resnet/resnet152_8xb16_cifar10.py | 5 + configs/resnet/resnet152_8xb32_in1k.py | 4 + configs/resnet/resnet152_b16x8_cifar10.py | 6 + configs/resnet/resnet152_b32x8_imagenet.py | 6 + configs/resnet/resnet18_8xb16_cifar10.py | 4 + configs/resnet/resnet18_8xb32_in1k.py | 4 + configs/resnet/resnet18_b16x8_cifar10.py | 6 + configs/resnet/resnet18_b32x8_imagenet.py | 6 + configs/resnet/resnet34_8xb16_cifar10.py | 4 + configs/resnet/resnet34_8xb32_in1k.py | 4 + configs/resnet/resnet34_b16x8_cifar10.py | 6 + configs/resnet/resnet34_b32x8_imagenet.py | 6 + .../resnet50_32xb64-warmup-coslr_in1k.py | 5 + .../resnet/resnet50_32xb64-warmup-lbs_in1k.py | 12 + configs/resnet/resnet50_32xb64-warmup_in1k.py | 4 + .../resnet/resnet50_8xb128_coslr-90e_in21k.py | 11 + .../resnet/resnet50_8xb16-mixup_cifar10.py | 5 + configs/resnet/resnet50_8xb16_cifar10.py | 4 + configs/resnet/resnet50_8xb16_cifar100.py | 10 + .../resnet50_8xb256-rsb-a1-600e_in1k.py | 33 + .../resnet50_8xb256-rsb-a2-300e_in1k.py | 25 + .../resnet50_8xb256-rsb-a3-100e_in1k.py | 19 + .../resnet50_8xb32-coslr-preciseBN_in1k.py | 12 + configs/resnet/resnet50_8xb32-coslr_in1k.py | 5 + configs/resnet/resnet50_8xb32-cutmix_in1k.py | 5 + .../resnet50_8xb32-fp16-dynamic_in1k.py | 4 + configs/resnet/resnet50_8xb32-fp16_in1k.py | 4 + configs/resnet/resnet50_8xb32-lbs_in1k.py | 5 + configs/resnet/resnet50_8xb32-mixup_in1k.py | 5 + configs/resnet/resnet50_8xb32_in1k.py | 4 + configs/resnet/resnet50_8xb8_cars.py | 19 + configs/resnet/resnet50_8xb8_cub.py | 19 + configs/resnet/resnet50_b16x8_cifar10.py | 6 + configs/resnet/resnet50_b16x8_cifar100.py | 6 + .../resnet/resnet50_b16x8_cifar10_mixup.py | 6 + .../resnet/resnet50_b32x8_coslr_imagenet.py | 6 + .../resnet/resnet50_b32x8_cutmix_imagenet.py | 6 + configs/resnet/resnet50_b32x8_imagenet.py | 6 + .../resnet50_b32x8_label_smooth_imagenet.py | 6 + .../resnet/resnet50_b32x8_mixup_imagenet.py | 6 + .../resnet50_b64x32_warmup_coslr_imagenet.py | 6 + .../resnet/resnet50_b64x32_warmup_imagenet.py | 6 + ...t50_b64x32_warmup_label_smooth_imagenet.py | 6 + configs/resnet/resnetv1c101_8xb32_in1k.py | 7 + configs/resnet/resnetv1c152_8xb32_in1k.py | 7 + configs/resnet/resnetv1c50_8xb32_in1k.py | 5 + configs/resnet/resnetv1d101_8xb32_in1k.py | 5 + configs/resnet/resnetv1d101_b32x8_imagenet.py | 6 + configs/resnet/resnetv1d152_8xb32_in1k.py | 5 + configs/resnet/resnetv1d152_b32x8_imagenet.py | 6 + configs/resnet/resnetv1d50_8xb32_in1k.py | 5 + configs/resnet/resnetv1d50_b32x8_imagenet.py | 6 + configs/resnext/README.md | 36 + configs/resnext/metafile.yml | 73 + .../resnext/resnext101-32x4d_8xb32_in1k.py | 5 + .../resnext/resnext101-32x8d_8xb32_in1k.py | 5 + .../resnext101_32x4d_b32x8_imagenet.py | 6 + .../resnext101_32x8d_b32x8_imagenet.py | 6 + .../resnext/resnext152-32x4d_8xb32_in1k.py | 5 + .../resnext152_32x4d_b32x8_imagenet.py | 6 + configs/resnext/resnext50-32x4d_8xb32_in1k.py | 5 + .../resnext/resnext50_32x4d_b32x8_imagenet.py | 6 + configs/seresnet/README.md | 34 + configs/seresnet/metafile.yml | 47 + configs/seresnet/seresnet101_8xb32_in1k.py | 5 + .../seresnet/seresnet101_b32x8_imagenet.py | 6 + configs/seresnet/seresnet50_8xb32_in1k.py | 6 + configs/seresnet/seresnet50_b32x8_imagenet.py | 6 + .../seresnet/seresnext101-32x4d_8xb32_in1k.py | 5 + .../seresnext101_32x4d_b32x8_imagenet.py | 6 + .../seresnet/seresnext50-32x4d_8xb32_in1k.py | 5 + .../seresnext50_32x4d_b32x8_imagenet.py | 6 + configs/shufflenet_v1/README.md | 33 + configs/shufflenet_v1/metafile.yml | 35 + .../shufflenet-v1-1x_16xb64_in1k.py | 6 + ..._v1_1x_b64x16_linearlr_bn_nowd_imagenet.py | 6 + configs/shufflenet_v2/README.md | 33 + configs/shufflenet_v2/metafile.yml | 35 + .../shufflenet-v2-1x_16xb64_in1k.py | 6 + ..._v2_1x_b64x16_linearlr_bn_nowd_imagenet.py | 6 + configs/swin_transformer/README.md | 60 + configs/swin_transformer/metafile.yml | 201 ++ .../swin-base_16xb64_in1k-384px.py | 7 + .../swin_transformer/swin-base_16xb64_in1k.py | 6 + .../swin-large_16xb64_in1k-384px.py | 7 + .../swin-large_16xb64_in1k.py | 7 + .../swin-large_8xb8_cub_384px.py | 37 + .../swin-small_16xb64_in1k.py | 6 + .../swin_transformer/swin-tiny_16xb64_in1k.py | 6 + .../swin_base_224_b16x64_300e_imagenet.py | 6 + .../swin_base_384_evalonly_imagenet.py | 6 + .../swin_large_224_evalonly_imagenet.py | 6 + .../swin_large_384_evalonly_imagenet.py | 6 + .../swin_small_224_b16x64_300e_imagenet.py | 6 + .../swin_tiny_224_b16x64_300e_imagenet.py | 6 + configs/swin_transformer_v2/README.md | 58 + configs/swin_transformer_v2/metafile.yml | 204 ++ .../swinv2-base-w16_16xb64_in1k-256px.py | 8 + ...v2-base-w16_in21k-pre_16xb64_in1k-256px.py | 13 + ...v2-base-w24_in21k-pre_16xb64_in1k-384px.py | 14 + .../swinv2-base-w8_16xb64_in1k-256px.py | 6 + ...2-large-w16_in21k-pre_16xb64_in1k-256px.py | 13 + ...2-large-w24_in21k-pre_16xb64_in1k-384px.py | 15 + .../swinv2-small-w16_16xb64_in1k-256px.py | 8 + .../swinv2-small-w8_16xb64_in1k-256px.py | 6 + .../swinv2-tiny-w16_16xb64_in1k-256px.py | 8 + .../swinv2-tiny-w8_16xb64_in1k-256px.py | 6 + configs/t2t_vit/README.md | 36 + configs/t2t_vit/metafile.yml | 58 + configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py | 35 + configs/t2t_vit/t2t-vit-t-19_8xb64_in1k.py | 35 + configs/t2t_vit/t2t-vit-t-24_8xb64_in1k.py | 35 + configs/tnt/README.md | 36 + configs/tnt/metafile.yml | 29 + configs/tnt/tnt-s-p16_16xb64_in1k.py | 39 + .../tnt_s_patch16_224_evalonly_imagenet.py | 6 + configs/twins/README.md | 39 + configs/twins/metafile.yml | 114 + configs/twins/twins-pcpvt-base_8xb128_in1k.py | 33 + .../twins/twins-pcpvt-large_16xb64_in1k.py | 5 + .../twins/twins-pcpvt-small_8xb128_in1k.py | 3 + configs/twins/twins-svt-base_8xb128_in1k.py | 33 + configs/twins/twins-svt-large_16xb64_in1k.py | 5 + configs/twins/twins-svt-small_8xb128_in1k.py | 3 + configs/van/README.md | 50 + configs/van/metafile.yml | 84 + configs/van/van-b0_8xb128_in1k.py | 61 + configs/van/van-b1_8xb128_in1k.py | 61 + configs/van/van-b2_8xb128_in1k.py | 61 + configs/van/van-b3_8xb128_in1k.py | 61 + configs/van/van-b4_8xb128_in1k.py | 61 + configs/van/van-base_8xb128_in1k.py | 6 + configs/van/van-large_8xb128_in1k.py | 6 + configs/van/van-small_8xb128_in1k.py | 6 + configs/van/van-tiny_8xb128_in1k.py | 6 + configs/vgg/README.md | 39 + configs/vgg/metafile.yml | 125 + configs/vgg/vgg11_8xb32_in1k.py | 7 + configs/vgg/vgg11_b32x8_imagenet.py | 6 + configs/vgg/vgg11bn_8xb32_in1k.py | 5 + configs/vgg/vgg11bn_b32x8_imagenet.py | 6 + configs/vgg/vgg13_8xb32_in1k.py | 6 + configs/vgg/vgg13_b32x8_imagenet.py | 6 + configs/vgg/vgg13bn_8xb32_in1k.py | 5 + configs/vgg/vgg13bn_b32x8_imagenet.py | 6 + configs/vgg/vgg16_8xb16_voc.py | 25 + configs/vgg/vgg16_8xb32_in1k.py | 6 + configs/vgg/vgg16_b16x8_voc.py | 6 + configs/vgg/vgg16_b32x8_imagenet.py | 6 + configs/vgg/vgg16bn_8xb32_in1k.py | 5 + configs/vgg/vgg16bn_b32x8_imagenet.py | 6 + configs/vgg/vgg19_8xb32_in1k.py | 6 + configs/vgg/vgg19_b32x8_imagenet.py | 6 + configs/vgg/vgg19bn_8xb32_in1k.py | 5 + configs/vgg/vgg19bn_b32x8_imagenet.py | 6 + configs/vision_transformer/README.md | 57 + configs/vision_transformer/metafile.yml | 79 + .../vit-base-p16_ft-4xb544-ipu_in1k.py | 115 + .../vit-base-p16_ft-64xb64_in1k-384.py | 36 + .../vit-base-p16_pt-64xb64_in1k-224.py | 12 + .../vit-base-p32_ft-64xb64_in1k-384.py | 36 + .../vit-base-p32_pt-64xb64_in1k-224.py | 12 + .../vit-large-p16_ft-64xb64_in1k-384.py | 36 + .../vit-large-p16_pt-64xb64_in1k-224.py | 12 + .../vit-large-p32_ft-64xb64_in1k-384.py | 37 + .../vit-large-p32_pt-64xb64_in1k-224.py | 12 + configs/wrn/README.md | 35 + configs/wrn/metafile.yml | 77 + configs/wrn/wide-resnet101_8xb32_in1k.py | 7 + configs/wrn/wide-resnet50_8xb32_in1k.py | 5 + configs/wrn/wide-resnet50_timm_8xb32_in1k.py | 5 + docs/en/Makefile | 20 + docs/en/_static/css/readthedocs.css | 27 + docs/en/_static/image/mmcls-logo.png | Bin 0 -> 33009 bytes .../image/tools/analysis/analyze_log.jpg | Bin 0 -> 68146 bytes .../tools/visualization/lr_schedule1.png | Bin 0 -> 30065 bytes .../tools/visualization/lr_schedule2.png | Bin 0 -> 48176 bytes docs/en/_static/js/custom.js | 1 + docs/en/_templates/classtemplate.rst | 14 + docs/en/api/apis.rst | 45 + docs/en/api/core.rst | 62 + docs/en/api/datasets.rst | 61 + docs/en/api/models.rst | 141 + docs/en/api/models.utils.augment.rst | 35 + docs/en/api/models.utils.rst | 50 + docs/en/api/transforms.rst | 171 + docs/en/api/utils.rst | 23 + docs/en/changelog.md | 746 +++++ docs/en/community/CONTRIBUTING.md | 1 + docs/en/compatibility.md | 8 + docs/en/conf.py | 256 ++ docs/en/device/npu.md | 64 + docs/en/docutils.conf | 2 + docs/en/faq.md | 84 + docs/en/getting_started.md | 275 ++ docs/en/index.rst | 99 + docs/en/install.md | 219 ++ docs/en/model_zoo.md | 162 + docs/en/stat.py | 100 + docs/en/tools/analysis.md | 211 ++ docs/en/tools/miscellaneous.md | 59 + docs/en/tools/model_serving.md | 87 + docs/en/tools/onnx2tensorrt.md | 80 + docs/en/tools/pytorch2onnx.md | 204 ++ docs/en/tools/pytorch2torchscript.md | 56 + docs/en/tools/visualization.md | 302 ++ .../tutorials/MMClassification_python.ipynb | 2040 ++++++++++++ .../en/tutorials/MMClassification_tools.ipynb | 1249 +++++++ docs/en/tutorials/config.md | 417 +++ docs/en/tutorials/data_pipeline.md | 150 + docs/en/tutorials/finetune.md | 236 ++ docs/en/tutorials/new_dataset.md | 239 ++ docs/en/tutorials/new_modules.md | 272 ++ docs/en/tutorials/runtime.md | 257 ++ docs/en/tutorials/schedule.md | 341 ++ docs/zh_CN/Makefile | 20 + docs/zh_CN/_static/css/readthedocs.css | 27 + docs/zh_CN/_static/image/mmcls-logo.png | Bin 0 -> 33009 bytes .../image/tools/analysis/analyze_log.jpg | Bin 0 -> 68146 bytes .../tools/visualization/lr_schedule1.png | Bin 0 -> 30065 bytes .../tools/visualization/lr_schedule2.png | Bin 0 -> 48176 bytes docs/zh_CN/_static/js/custom.js | 1 + docs/zh_CN/api | 1 + docs/zh_CN/changelog.md | 1 + docs/zh_CN/community/CONTRIBUTING.md | 62 + docs/zh_CN/compatibility.md | 7 + docs/zh_CN/conf.py | 241 ++ docs/zh_CN/device/npu.md | 34 + docs/zh_CN/docutils.conf | 2 + docs/zh_CN/faq.md | 74 + docs/zh_CN/getting_started.md | 266 ++ docs/zh_CN/imgs/qq_group_qrcode.jpg | Bin 0 -> 71955 bytes docs/zh_CN/imgs/zhihu_qrcode.jpg | Bin 0 -> 397245 bytes docs/zh_CN/index.rst | 99 + docs/zh_CN/install.md | 210 ++ docs/zh_CN/model_zoo.md | 1 + docs/zh_CN/stat.py | 99 + docs/zh_CN/tools/analysis.md | 211 ++ docs/zh_CN/tools/miscellaneous.md | 59 + docs/zh_CN/tools/model_serving.md | 87 + docs/zh_CN/tools/onnx2tensorrt.md | 75 + docs/zh_CN/tools/pytorch2onnx.md | 88 + docs/zh_CN/tools/pytorch2torchscript.md | 54 + docs/zh_CN/tools/visualization.md | 302 ++ .../MMClassification_python_cn.ipynb | 2041 ++++++++++++ .../tutorials/MMClassification_tools_cn.ipynb | 1247 +++++++ docs/zh_CN/tutorials/config.md | 417 +++ docs/zh_CN/tutorials/data_pipeline.md | 148 + docs/zh_CN/tutorials/finetune.md | 222 ++ docs/zh_CN/tutorials/new_dataset.md | 230 ++ docs/zh_CN/tutorials/new_modules.md | 280 ++ docs/zh_CN/tutorials/runtime.md | 260 ++ docs/zh_CN/tutorials/schedule.md | 333 ++ downstream/mmdetection/.circleci/config.yml | 162 + .../.dev_scripts/batch_test_list.py | 359 ++ .../.dev_scripts/batch_train_list.txt | 66 + .../.dev_scripts/benchmark_filter.py | 167 + .../.dev_scripts/benchmark_inference_fps.py | 170 + .../.dev_scripts/benchmark_test_image.py | 102 + .../mmdetection/.dev_scripts/check_links.py | 157 + .../convert_test_benchmark_script.py | 119 + .../convert_train_benchmark_script.py | 99 + .../mmdetection/.dev_scripts/gather_models.py | 340 ++ .../gather_test_benchmark_metric.py | 96 + .../gather_train_benchmark_metric.py | 150 + downstream/mmdetection/.dev_scripts/linter.sh | 3 + .../.dev_scripts/test_benchmark.sh | 119 + .../.dev_scripts/test_init_backbone.py | 181 + .../.dev_scripts/train_benchmark.sh | 134 + .../mmdetection/.github/CODE_OF_CONDUCT.md | 76 + .../mmdetection/.github/CONTRIBUTING.md | 1 + .../.github/ISSUE_TEMPLATE/config.yml | 9 + .../.github/ISSUE_TEMPLATE/error-report.md | 46 + .../.github/ISSUE_TEMPLATE/feature_request.md | 21 + .../ISSUE_TEMPLATE/general_questions.md | 7 + .../reimplementation_questions.md | 67 + .../.github/pull_request_template.md | 25 + .../mmdetection/.github/workflows/build.yml | 288 ++ .../.github/workflows/build_pat.yml | 28 + .../mmdetection/.github/workflows/deploy.yml | 28 + .../mmdetection/.github/workflows/lint.yml | 27 + downstream/mmdetection/.gitignore | 124 + downstream/mmdetection/.owners.yml | 14 + .../mmdetection/.pre-commit-config.yaml | 50 + downstream/mmdetection/.readthedocs.yml | 9 + downstream/mmdetection/CITATION.cff | 8 + downstream/mmdetection/LICENSE | 203 ++ downstream/mmdetection/MANIFEST.in | 6 + downstream/mmdetection/README.md | 357 ++ .../_base_/datasets/cityscapes_detection.py | 56 + .../_base_/datasets/cityscapes_instance.py | 56 + .../configs/_base_/datasets/coco_detection.py | 49 + .../configs/_base_/datasets/coco_instance.py | 49 + .../_base_/datasets/coco_instance_semantic.py | 54 + .../configs/_base_/datasets/coco_panoptic.py | 59 + .../configs/_base_/datasets/deepfashion.py | 53 + .../_base_/datasets/lvis_v0.5_instance.py | 24 + .../_base_/datasets/lvis_v1_instance.py | 24 + .../_base_/datasets/openimages_detection.py | 65 + .../configs/_base_/datasets/voc0712.py | 55 + .../configs/_base_/datasets/wider_face.py | 63 + .../configs/_base_/default_runtime.py | 27 + .../models/cascade_mask_rcnn_r50_fpn.py | 196 ++ .../_base_/models/cascade_rcnn_r50_fpn.py | 179 + .../_base_/models/fast_rcnn_r50_fpn.py | 62 + .../_base_/models/faster_rcnn_r50_caffe_c4.py | 117 + .../models/faster_rcnn_r50_caffe_dc5.py | 105 + .../_base_/models/faster_rcnn_r50_fpn.py | 108 + .../_base_/models/mask_rcnn_r50_caffe_c4.py | 125 + .../_base_/models/mask_rcnn_r50_fpn.py | 120 + .../_base_/models/retinanet_r50_fpn.py | 60 + .../configs/_base_/models/rpn_r50_caffe_c4.py | 58 + .../configs/_base_/models/rpn_r50_fpn.py | 58 + .../configs/_base_/models/ssd300.py | 56 + .../configs/_base_/schedules/schedule_1x.py | 11 + .../configs/_base_/schedules/schedule_20e.py | 11 + .../configs/_base_/schedules/schedule_2x.py | 11 + .../configs/albu_example/README.md | 31 + .../mask_rcnn_r50_fpn_albu_1x_coco.py | 73 + downstream/mmdetection/configs/atss/README.md | 31 + .../configs/atss/atss_r101_fpn_1x_coco.py | 6 + .../configs/atss/atss_r50_fpn_1x_coco.py | 62 + .../mmdetection/configs/atss/metafile.yml | 60 + .../mmdetection/configs/autoassign/README.md | 35 + .../autoassign_r50_fpn_8x2_1x_coco.py | 85 + .../configs/autoassign/metafile.yml | 33 + .../mmdetection/configs/carafe/README.md | 42 + .../faster_rcnn_r50_fpn_carafe_1x_coco.py | 50 + .../mask_rcnn_r50_fpn_carafe_1x_coco.py | 60 + .../mmdetection/configs/carafe/metafile.yml | 55 + .../configs/cascade_rcnn/README.md | 79 + ...ascade_mask_rcnn_r101_caffe_fpn_1x_coco.py | 7 + ...ask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py | 7 + .../cascade_mask_rcnn_r101_fpn_1x_coco.py | 6 + .../cascade_mask_rcnn_r101_fpn_20e_coco.py | 6 + ...cade_mask_rcnn_r101_fpn_mstrain_3x_coco.py | 6 + ...cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py | 41 + ...mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py | 49 + .../cascade_mask_rcnn_r50_fpn_1x_coco.py | 5 + .../cascade_mask_rcnn_r50_fpn_20e_coco.py | 5 + ...scade_mask_rcnn_r50_fpn_mstrain_3x_coco.py | 4 + ...ascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py | 14 + ...scade_mask_rcnn_x101_32x4d_fpn_20e_coco.py | 14 + ...ask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py | 14 + ...ask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py | 60 + ...ascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py | 14 + ...scade_mask_rcnn_x101_64x4d_fpn_20e_coco.py | 14 + ...ask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py | 14 + .../cascade_rcnn_r101_caffe_fpn_1x_coco.py | 7 + .../cascade_rcnn_r101_fpn_1x_coco.py | 6 + .../cascade_rcnn_r101_fpn_20e_coco.py | 6 + .../cascade_rcnn_r50_caffe_fpn_1x_coco.py | 42 + .../cascade_rcnn_r50_fpn_1x_coco.py | 5 + .../cascade_rcnn_r50_fpn_20e_coco.py | 4 + .../cascade_rcnn_x101_32x4d_fpn_1x_coco.py | 14 + .../cascade_rcnn_x101_32x4d_fpn_20e_coco.py | 14 + .../cascade_rcnn_x101_64x4d_fpn_1x_coco.py | 15 + .../cascade_rcnn_x101_64x4d_fpn_20e_coco.py | 15 + .../configs/cascade_rcnn/metafile.yml | 525 +++ .../mmdetection/configs/cascade_rpn/README.md | 41 + .../crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py | 77 + .../crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py | 92 + .../cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py | 77 + .../configs/cascade_rpn/metafile.yml | 44 + .../mmdetection/configs/centernet/README.md | 40 + .../centernet/centernet_resnet18_140e_coco.py | 3 + .../centernet_resnet18_dcnv2_140e_coco.py | 127 + .../configs/centernet/metafile.yml | 46 + .../configs/centripetalnet/README.md | 36 + ...lnet_hourglass104_mstest_16x6_210e_coco.py | 110 + .../configs/centripetalnet/metafile.yml | 39 + .../mmdetection/configs/cityscapes/README.md | 46 + .../faster_rcnn_r50_fpn_1x_cityscapes.py | 44 + .../mask_rcnn_r50_fpn_1x_cityscapes.py | 51 + .../configs/common/lsj_100e_coco_instance.py | 90 + .../common/mstrain-poly_3x_coco_instance.py | 80 + .../configs/common/mstrain_3x_coco.py | 76 + .../common/mstrain_3x_coco_instance.py | 76 + .../configs/common/ssj_270k_coco_instance.py | 91 + .../common/ssj_scp_270k_coco_instance.py | 97 + .../mmdetection/configs/convnext/README.md | 40 + ...7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py | 32 + ...7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py | 149 + ...nvnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py | 90 + .../mmdetection/configs/convnext/metafile.yml | 93 + .../mmdetection/configs/cornernet/README.md | 43 + ...rnet_hourglass104_mstest_10x5_210e_coco.py | 110 + ...rnet_hourglass104_mstest_32x3_210e_coco.py | 110 + ...ernet_hourglass104_mstest_8x6_210e_coco.py | 110 + .../configs/cornernet/metafile.yml | 83 + downstream/mmdetection/configs/dcn/README.md | 48 + ..._mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py | 5 + ...e_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py | 5 + ...rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py | 5 + ...scade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py | 5 + ...ascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py | 5 + ...aster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py | 5 + ...faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py | 5 + .../dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py | 12 + ...rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py | 16 + .../mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py | 5 + .../mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py | 5 + ...k_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py | 7 + .../mmdetection/configs/dcn/metafile.yml | 272 ++ .../mmdetection/configs/dcnv2/README.md | 37 + ...aster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py | 5 + ...cnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py | 5 + .../faster_rcnn_r50_fpn_mdpool_1x_coco.py | 12 + ..._rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py | 7 + .../mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py | 5 + .../mmdetection/configs/dcnv2/metafile.yml | 123 + downstream/mmdetection/configs/ddod/README.md | 31 + .../configs/ddod/ddod_r50_fpn_1x_coco.py | 67 + .../mmdetection/configs/ddod/metafile.yml | 33 + .../mmdetection/configs/deepfashion/README.md | 70 + .../mask_rcnn_r50_fpn_15e_deepfashion.py | 10 + .../configs/deformable_detr/README.md | 41 + .../deformable_detr_r50_16x2_50e_coco.py | 177 + ...eformable_detr_refine_r50_16x2_50e_coco.py | 2 + ..._detr_twostage_refine_r50_16x2_50e_coco.py | 2 + .../configs/deformable_detr/metafile.yml | 56 + .../mmdetection/configs/detectors/README.md | 69 + .../detectors/cascade_rcnn_r50_rfp_1x_coco.py | 28 + .../detectors/cascade_rcnn_r50_sac_1x_coco.py | 12 + .../detectors_cascade_rcnn_r50_1x_coco.py | 32 + .../detectors/detectors_htc_r101_20e_coco.py | 28 + .../detectors/detectors_htc_r50_1x_coco.py | 28 + .../configs/detectors/htc_r50_rfp_1x_coco.py | 24 + .../configs/detectors/htc_r50_sac_1x_coco.py | 8 + .../configs/detectors/metafile.yml | 114 + downstream/mmdetection/configs/detr/README.md | 37 + .../configs/detr/detr_r50_8x2_150e_coco.py | 150 + .../mmdetection/configs/detr/metafile.yml | 33 + .../configs/double_heads/README.md | 32 + .../dh_faster_rcnn_r50_fpn_1x_coco.py | 23 + .../configs/double_heads/metafile.yml | 41 + .../mmdetection/configs/dyhead/README.md | 52 + .../atss_r50_caffe_fpn_dyhead_1x_coco.py | 112 + .../dyhead/atss_r50_fpn_dyhead_1x_coco.py | 65 + ...win-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py | 164 + .../mmdetection/configs/dyhead/metafile.yml | 76 + .../configs/dynamic_rcnn/README.md | 30 + .../dynamic_rcnn_r50_fpn_1x_coco.py | 28 + .../configs/dynamic_rcnn/metafile.yml | 35 + .../configs/efficientnet/README.md | 30 + .../configs/efficientnet/metafile.yml | 19 + ...retinanet_effb3_fpn_crop896_8x4_1x_coco.py | 94 + .../configs/empirical_attention/README.md | 33 + ...ter_rcnn_r50_fpn_attention_0010_1x_coco.py | 13 + ...rcnn_r50_fpn_attention_0010_dcn_1x_coco.py | 16 + ...ter_rcnn_r50_fpn_attention_1111_1x_coco.py | 13 + ...rcnn_r50_fpn_attention_1111_dcn_1x_coco.py | 16 + .../configs/empirical_attention/metafile.yml | 103 + .../mmdetection/configs/fast_rcnn/README.md | 73 + .../fast_rcnn_r101_caffe_fpn_1x_coco.py | 7 + .../fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py | 6 + .../fast_rcnn/fast_rcnn_r101_fpn_2x_coco.py | 6 + .../fast_rcnn_r50_caffe_fpn_1x_coco.py | 48 + .../fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py | 52 + .../fast_rcnn/fast_rcnn_r50_fpn_2x_coco.py | 5 + .../mmdetection/configs/faster_rcnn/README.md | 88 + .../faster_rcnn_r101_caffe_fpn_1x_coco.py | 7 + ...ter_rcnn_r101_caffe_fpn_mstrain_3x_coco.py | 49 + .../faster_rcnn_r101_fpn_1x_coco.py | 6 + .../faster_rcnn_r101_fpn_2x_coco.py | 6 + .../faster_rcnn_r101_fpn_mstrain_3x_coco.py | 7 + .../faster_rcnn_r50_caffe_c4_1x_coco.py | 39 + ...aster_rcnn_r50_caffe_c4_mstrain_1x_coco.py | 38 + .../faster_rcnn_r50_caffe_dc5_1x_coco.py | 37 + ...ster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py | 42 + ...ster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py | 4 + .../faster_rcnn_r50_caffe_fpn_1x_coco.py | 41 + .../faster_rcnn_r50_caffe_fpn_90k_coco.py | 15 + ..._fpn_mstrain_1x_coco-person-bicycle-car.py | 9 + ...nn_r50_caffe_fpn_mstrain_1x_coco-person.py | 9 + ...ster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py | 46 + ...ster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py | 4 + ...ster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py | 47 + ...ter_rcnn_r50_caffe_fpn_mstrain_90k_coco.py | 15 + .../faster_rcnn_r50_fpn_1x_coco.py | 5 + .../faster_rcnn_r50_fpn_2x_coco.py | 5 + ...faster_rcnn_r50_fpn_bounded_iou_1x_coco.py | 6 + .../faster_rcnn_r50_fpn_ciou_1x_coco.py | 6 + .../faster_rcnn_r50_fpn_fp16_1x_coco.py | 3 + .../faster_rcnn_r50_fpn_giou_1x_coco.py | 6 + .../faster_rcnn_r50_fpn_iou_1x_coco.py | 6 + .../faster_rcnn_r50_fpn_mstrain_3x_coco.py | 3 + .../faster_rcnn_r50_fpn_ohem_1x_coco.py | 2 + .../faster_rcnn_r50_fpn_soft_nms_1x_coco.py | 12 + ...aster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py | 17 + .../faster_rcnn_x101_32x4d_fpn_1x_coco.py | 14 + .../faster_rcnn_x101_32x4d_fpn_2x_coco.py | 14 + ...ter_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py | 16 + ...ter_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py | 62 + .../faster_rcnn_x101_64x4d_fpn_1x_coco.py | 14 + .../faster_rcnn_x101_64x4d_fpn_2x_coco.py | 14 + ...ter_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py | 16 + .../configs/faster_rcnn/metafile.yml | 451 +++ downstream/mmdetection/configs/fcos/README.md | 45 + ...nreg-giou_r50_caffe_fpn_gn-head_1x_coco.py | 54 + ...-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py | 56 + ...os_center_r50_caffe_fpn_gn-head_1x_coco.py | 2 + .../fcos_r101_caffe_fpn_gn-head_1x_coco.py | 7 + ...ffe_fpn_gn-head_mstrain_640-800_2x_coco.py | 47 + .../fcos_r50_caffe_fpn_gn-head_1x_coco.py | 106 + .../fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py | 4 + ...ffe_fpn_gn-head_mstrain_640-800_2x_coco.py | 39 + ...x4d_fpn_gn-head_mstrain_640-800_2x_coco.py | 60 + .../mmdetection/configs/fcos/metafile.yml | 146 + .../mmdetection/configs/foveabox/README.md | 53 + ...ovea_align_r101_fpn_gn-head_4x4_2x_coco.py | 12 + ...fpn_gn-head_mstrain_640-800_4x4_2x_coco.py | 29 + ...fovea_align_r50_fpn_gn-head_4x4_2x_coco.py | 10 + ...fpn_gn-head_mstrain_640-800_4x4_2x_coco.py | 25 + .../foveabox/fovea_r101_fpn_4x4_1x_coco.py | 6 + .../foveabox/fovea_r101_fpn_4x4_2x_coco.py | 6 + .../foveabox/fovea_r50_fpn_4x4_1x_coco.py | 52 + .../foveabox/fovea_r50_fpn_4x4_2x_coco.py | 4 + .../mmdetection/configs/foveabox/metafile.yml | 172 + downstream/mmdetection/configs/fpg/README.md | 43 + ...er_rcnn_r50_fpg-chn128_crop640_50e_coco.py | 9 + .../faster_rcnn_r50_fpg_crop640_50e_coco.py | 48 + .../faster_rcnn_r50_fpn_crop640_50e_coco.py | 73 + ...sk_rcnn_r50_fpg-chn128_crop640_50e_coco.py | 10 + .../fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py | 48 + .../fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py | 79 + .../mmdetection/configs/fpg/metafile.yml | 104 + ...tinanet_r50_fpg-chn128_crop640_50e_coco.py | 5 + .../fpg/retinanet_r50_fpg_crop640_50e_coco.py | 53 + .../mmdetection/configs/free_anchor/README.md | 37 + .../configs/free_anchor/metafile.yml | 79 + .../retinanet_free_anchor_r101_fpn_1x_coco.py | 6 + .../retinanet_free_anchor_r50_fpn_1x_coco.py | 22 + ...anet_free_anchor_x101_32x4d_fpn_1x_coco.py | 13 + downstream/mmdetection/configs/fsaf/README.md | 57 + .../configs/fsaf/fsaf_r101_fpn_1x_coco.py | 6 + .../configs/fsaf/fsaf_r50_fpn_1x_coco.py | 48 + .../fsaf/fsaf_x101_64x4d_fpn_1x_coco.py | 14 + .../mmdetection/configs/fsaf/metafile.yml | 80 + .../mmdetection/configs/gcnet/README.md | 69 + ..._x101_32x4d_fpn_syncbn-backbone_1x_coco.py | 4 + ...fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py | 4 + ...kbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py | 11 + ...ckbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py | 11 + ...n_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py | 11 + ...pn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py | 11 + ...ask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py | 8 + ...mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py | 8 + ...k_rcnn_r101_fpn_syncbn-backbone_1x_coco.py | 4 + ...n_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py | 11 + ...pn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py | 11 + ...mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py | 8 + .../mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py | 8 + ...sk_rcnn_r50_fpn_syncbn-backbone_1x_coco.py | 4 + ...n_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py | 11 + ...pn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py | 11 + ..._x101_32x4d_fpn_syncbn-backbone_1x_coco.py | 4 + ...n_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py | 11 + ...pn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py | 11 + .../mmdetection/configs/gcnet/metafile.yml | 440 +++ downstream/mmdetection/configs/gfl/README.md | 42 + ...fl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py | 15 + .../gfl/gfl_r101_fpn_mstrain_2x_coco.py | 13 + .../configs/gfl/gfl_r50_fpn_1x_coco.py | 57 + .../gfl/gfl_r50_fpn_mstrain_2x_coco.py | 22 + ...1_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py | 18 + .../gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py | 16 + .../mmdetection/configs/gfl/metafile.yml | 134 + downstream/mmdetection/configs/ghm/README.md | 33 + .../mmdetection/configs/ghm/metafile.yml | 101 + .../ghm/retinanet_ghm_r101_fpn_1x_coco.py | 6 + .../ghm/retinanet_ghm_r50_fpn_1x_coco.py | 19 + .../retinanet_ghm_x101_32x4d_fpn_1x_coco.py | 14 + .../retinanet_ghm_x101_64x4d_fpn_1x_coco.py | 14 + .../mmdetection/configs/gn+ws/README.md | 54 + .../faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py | 6 + .../faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py | 16 + ...r_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py | 18 + ...er_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py | 18 + ..._rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py | 4 + .../mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py | 6 + ...k_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py | 4 + .../mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py | 20 + ...x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py | 4 + ...k_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py | 19 + ..._x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py | 4 + ...sk_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py | 19 + .../mmdetection/configs/gn+ws/metafile.yml | 263 ++ downstream/mmdetection/configs/gn/README.md | 41 + .../gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py | 7 + .../gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py | 5 + .../gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py | 49 + .../gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py | 5 + ...ask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py | 17 + ...ask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py | 5 + .../mmdetection/configs/gn/metafile.yml | 162 + .../gpvit/mask_rcnn/gpvit_l1_maskrcnn_1x.py | 173 + .../gpvit/mask_rcnn/gpvit_l1_maskrcnn_3x.py | 207 ++ .../gpvit/mask_rcnn/gpvit_l2_maskrcnn_1x.py | 173 + .../gpvit/mask_rcnn/gpvit_l2_maskrcnn_3x.py | 207 ++ .../gpvit/mask_rcnn/gpvit_l3_maskrcnn_1x.py | 173 + .../gpvit/mask_rcnn/gpvit_l3_maskrcnn_3x.py | 207 ++ .../gpvit/mask_rcnn/gpvit_l4_maskrcnn_1x.py | 173 + .../gpvit/mask_rcnn/gpvit_l4_maskrcnn_3x.py | 207 ++ .../gpvit/retinanet/gpvit_l1_retinanet_1x.py | 115 + .../gpvit/retinanet/gpvit_l1_retinanet_3x.py | 149 + .../gpvit/retinanet/gpvit_l2_retinanet_1x.py | 115 + .../gpvit/retinanet/gpvit_l2_retinanet_3x.py | 149 + .../gpvit/retinanet/gpvit_l3_retinanet_1x.py | 115 + .../gpvit/retinanet/gpvit_l3_retinanet_3x.py | 149 + .../gpvit/retinanet/gpvit_l4_retinanet_1x.py | 115 + .../gpvit/retinanet/gpvit_l4_retinanet_3x.py | 149 + .../mmdetection/configs/grid_rcnn/README.md | 47 + .../grid_rcnn_r101_fpn_gn-head_2x_coco.py | 7 + .../grid_rcnn_r50_fpn_gn-head_1x_coco.py | 11 + .../grid_rcnn_r50_fpn_gn-head_2x_coco.py | 131 + ...rid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py | 24 + ...rid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py | 13 + .../configs/grid_rcnn/metafile.yml | 101 + .../mmdetection/configs/groie/README.md | 72 + .../faster_rcnn_r50_fpn_groie_1x_coco.py | 25 + ...grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py | 45 + ...cbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py | 45 + .../groie/mask_rcnn_r50_fpn_groie_1x_coco.py | 45 + ...cbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py | 45 + .../mmdetection/configs/groie/metafile.yml | 93 + .../configs/guided_anchoring/README.md | 59 + .../ga_fast_r50_caffe_fpn_1x_coco.py | 65 + .../ga_faster_r101_caffe_fpn_1x_coco.py | 7 + .../ga_faster_r50_caffe_fpn_1x_coco.py | 65 + .../ga_faster_r50_fpn_1x_coco.py | 65 + .../ga_faster_x101_32x4d_fpn_1x_coco.py | 14 + .../ga_faster_x101_64x4d_fpn_1x_coco.py | 14 + .../ga_retinanet_r101_caffe_fpn_1x_coco.py | 7 + .../ga_retinanet_r101_caffe_fpn_mstrain_2x.py | 169 + .../ga_retinanet_r50_caffe_fpn_1x_coco.py | 62 + .../ga_retinanet_r50_fpn_1x_coco.py | 62 + .../ga_retinanet_x101_32x4d_fpn_1x_coco.py | 14 + .../ga_retinanet_x101_64x4d_fpn_1x_coco.py | 14 + .../ga_rpn_r101_caffe_fpn_1x_coco.py | 8 + .../ga_rpn_r50_caffe_fpn_1x_coco.py | 58 + .../ga_rpn_r50_fpn_1x_coco.py | 58 + .../ga_rpn_x101_32x4d_fpn_1x_coco.py | 14 + .../ga_rpn_x101_64x4d_fpn_1x_coco.py | 14 + .../configs/guided_anchoring/metafile.yml | 246 ++ .../mmdetection/configs/hrnet/README.md | 101 + ...cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py | 11 + ...cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py | 40 + ...cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py | 12 + .../cascade_rcnn_hrnetv2p_w18_20e_coco.py | 11 + .../cascade_rcnn_hrnetv2p_w32_20e_coco.py | 40 + .../cascade_rcnn_hrnetv2p_w40_20e_coco.py | 12 + .../hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py | 11 + .../hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py | 5 + .../hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py | 37 + .../hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py | 4 + .../hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py | 11 + .../hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py | 4 + .../fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py | 10 + .../fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py | 4 + ...w18_gn-head_mstrain_640-800_4x4_2x_coco.py | 10 + .../fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py | 70 + .../fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py | 4 + ...w32_gn-head_mstrain_640-800_4x4_2x_coco.py | 39 + ...w40_gn-head_mstrain_640-800_4x4_2x_coco.py | 11 + .../hrnet/htc_hrnetv2p_w18_20e_coco.py | 10 + .../hrnet/htc_hrnetv2p_w32_20e_coco.py | 37 + .../hrnet/htc_hrnetv2p_w40_20e_coco.py | 11 + .../hrnet/htc_hrnetv2p_w40_28e_coco.py | 4 + .../hrnet/htc_x101_64x4d_fpn_16x1_28e_coco.py | 4 + .../hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py | 10 + .../hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py | 4 + .../hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py | 37 + .../hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py | 4 + .../hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py | 11 + .../hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py | 4 + .../mmdetection/configs/hrnet/metafile.yml | 971 ++++++ downstream/mmdetection/configs/htc/README.md | 67 + .../configs/htc/htc_r101_fpn_20e_coco.py | 9 + .../configs/htc/htc_r50_fpn_1x_coco.py | 56 + .../configs/htc/htc_r50_fpn_20e_coco.py | 4 + .../htc_without_semantic_r50_fpn_1x_coco.py | 236 ++ .../htc/htc_x101_32x4d_fpn_16x1_20e_coco.py | 19 + .../htc/htc_x101_64x4d_fpn_16x1_20e_coco.py | 19 + ...nv_c3-c5_mstrain_400_1400_16x1_20e_coco.py | 43 + .../mmdetection/configs/htc/metafile.yml | 165 + .../mmdetection/configs/instaboost/README.md | 58 + ...e_mask_rcnn_r101_fpn_instaboost_4x_coco.py | 7 + ...de_mask_rcnn_r50_fpn_instaboost_4x_coco.py | 28 + ..._rcnn_x101_64x4d_fpn_instaboost_4x_coco.py | 14 + .../mask_rcnn_r101_fpn_instaboost_4x_coco.py | 6 + .../mask_rcnn_r50_fpn_instaboost_4x_coco.py | 28 + ..._rcnn_x101_64x4d_fpn_instaboost_4x_coco.py | 14 + .../configs/instaboost/metafile.yml | 99 + downstream/mmdetection/configs/lad/README.md | 44 + .../lad/lad_r101_paa_r50_fpn_coco_1x.py | 126 + .../lad/lad_r50_paa_r101_fpn_coco_1x.py | 125 + .../mmdetection/configs/lad/metafile.yml | 42 + downstream/mmdetection/configs/ld/README.md | 43 + .../ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py | 44 + .../ld/ld_r18_gflv1_r101_fpn_coco_1x.py | 62 + .../ld/ld_r34_gflv1_r101_fpn_coco_1x.py | 19 + .../ld/ld_r50_gflv1_r101_fpn_coco_1x.py | 19 + .../mmdetection/configs/ld/metafile.yml | 72 + .../mmdetection/configs/legacy_1.x/README.md | 54 + .../cascade_mask_rcnn_r50_fpn_1x_coco_v1.py | 79 + .../faster_rcnn_r50_fpn_1x_coco_v1.py | 38 + .../mask_rcnn_r50_fpn_1x_coco_v1.py | 34 + .../retinanet_r50_caffe_fpn_1x_coco_v1.py | 41 + .../retinanet_r50_fpn_1x_coco_v1.py | 17 + .../configs/legacy_1.x/ssd300_coco_v1.py | 84 + .../mmdetection/configs/libra_rcnn/README.md | 53 + .../libra_fast_rcnn_r50_fpn_1x_coco.py | 50 + .../libra_faster_rcnn_r101_fpn_1x_coco.py | 6 + .../libra_faster_rcnn_r50_fpn_1x_coco.py | 41 + ...ibra_faster_rcnn_x101_64x4d_fpn_1x_coco.py | 14 + .../libra_retinanet_r50_fpn_1x_coco.py | 26 + .../configs/libra_rcnn/metafile.yml | 99 + downstream/mmdetection/configs/lvis/README.md | 56 + ..._r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py | 6 + ...101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py | 6 + ...n_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py | 31 + ...r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py | 31 + ...32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py | 14 + ...x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py | 14 + ...64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py | 14 + ...x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py | 14 + .../mmdetection/configs/mask2former/README.md | 73 + ...k2former_r101_lsj_8x2_50e_coco-panoptic.py | 7 + .../mask2former_r101_lsj_8x2_50e_coco.py | 7 + ...sk2former_r50_lsj_8x2_50e_coco-panoptic.py | 253 ++ .../mask2former_r50_lsj_8x2_50e_coco.py | 79 + ...w12-384-in21k_lsj_8x2_50e_coco-panoptic.py | 5 + ...-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py | 42 + ...2-384-in21k_lsj_16x1_100e_coco-panoptic.py | 26 + ...n-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py | 37 + ...ormer_swin-s-p4-w7-224_lsj_8x2_50e_coco.py | 37 + ...n-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py | 62 + ...ormer_swin-t-p4-w7-224_lsj_8x2_50e_coco.py | 61 + .../configs/mask2former/metafile.yml | 223 ++ .../mmdetection/configs/mask_rcnn/README.md | 59 + .../mask_rcnn_r101_caffe_fpn_1x_coco.py | 7 + ...cnn_r101_caffe_fpn_mstrain-poly_3x_coco.py | 55 + .../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py | 6 + .../mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py | 6 + ...mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py | 10 + .../mask_rcnn_r50_caffe_c4_1x_coco.py | 39 + .../mask_rcnn_r50_caffe_fpn_1x_coco.py | 40 + ...rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py | 49 + ...rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py | 4 + ...rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py | 4 + ...mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py | 45 + ...mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py | 61 + .../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py | 5 + .../mask_rcnn_r50_fpn_1x_wandb_coco.py | 26 + .../mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py | 5 + .../mask_rcnn_r50_fpn_fp16_1x_coco.py | 3 + .../mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py | 4 + .../mask_rcnn_r50_fpn_poly_1x_coco.py | 23 + .../mask_rcnn_x101_32x4d_fpn_1x_coco.py | 14 + .../mask_rcnn_x101_32x4d_fpn_2x_coco.py | 14 + ...cnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py | 18 + .../mask_rcnn_x101_32x8d_fpn_1x_coco.py | 65 + ...cnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py | 60 + ...cnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py | 85 + .../mask_rcnn_x101_64x4d_fpn_1x_coco.py | 14 + .../mask_rcnn_x101_64x4d_fpn_2x_coco.py | 14 + ...cnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py | 18 + .../configs/mask_rcnn/metafile.yml | 447 +++ .../mmdetection/configs/maskformer/README.md | 53 + .../maskformer_r50_mstrain_16x1_75e_coco.py | 238 ++ ...er_swin-l-p4-w12_mstrain_64x1_300e_coco.py | 67 + .../configs/maskformer/metafile.yml | 43 + .../mmdetection/configs/ms_rcnn/README.md | 36 + .../mmdetection/configs/ms_rcnn/metafile.yml | 159 + .../ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py | 7 + .../ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py | 4 + .../ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py | 16 + .../ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py | 4 + .../ms_rcnn/ms_rcnn_r50_fpn_1x_coco.py | 16 + .../ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py | 14 + .../ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py | 14 + .../ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py | 4 + .../mmdetection/configs/nas_fcos/README.md | 35 + .../mmdetection/configs/nas_fcos/metafile.yml | 44 + ...shead_r50_caffe_fpn_gn-head_4x4_1x_coco.py | 100 + ...shead_r50_caffe_fpn_gn-head_4x4_1x_coco.py | 99 + .../mmdetection/configs/nas_fpn/README.md | 36 + .../mmdetection/configs/nas_fpn/metafile.yml | 59 + .../retinanet_r50_fpn_crop640_50e_coco.py | 85 + .../retinanet_r50_nasfpn_crop640_50e_coco.py | 84 + .../mmdetection/configs/openimages/README.md | 148 + .../faster_rcnn_r50_fpn_32x2_1x_openimages.py | 23 + ...nn_r50_fpn_32x2_1x_openimages_challenge.py | 47 + ...ter_rcnn_r50_fpn_32x2_cas_1x_openimages.py | 5 + ...50_fpn_32x2_cas_1x_openimages_challenge.py | 5 + .../configs/openimages/metafile.yml | 102 + .../retinanet_r50_fpn_32x2_1x_openimages.py | 22 + .../openimages/ssd300_32x8_36e_openimages.py | 83 + downstream/mmdetection/configs/paa/README.md | 47 + .../mmdetection/configs/paa/metafile.yml | 104 + .../configs/paa/paa_r101_fpn_1x_coco.py | 6 + .../configs/paa/paa_r101_fpn_2x_coco.py | 3 + .../paa/paa_r101_fpn_mstrain_3x_coco.py | 6 + .../configs/paa/paa_r50_fpn_1.5x_coco.py | 3 + .../configs/paa/paa_r50_fpn_1x_coco.py | 70 + .../configs/paa/paa_r50_fpn_2x_coco.py | 3 + .../paa/paa_r50_fpn_mstrain_3x_coco.py | 20 + .../mmdetection/configs/pafpn/README.md | 34 + .../pafpn/faster_rcnn_r50_pafpn_1x_coco.py | 8 + .../mmdetection/configs/pafpn/metafile.yml | 38 + .../configs/panoptic_fpn/README.md | 62 + .../configs/panoptic_fpn/metafile.yml | 70 + .../panoptic_fpn_r101_fpn_1x_coco.py | 6 + .../panoptic_fpn_r101_fpn_mstrain_3x_coco.py | 6 + .../panoptic_fpn_r50_fpn_1x_coco.py | 33 + .../panoptic_fpn_r50_fpn_mstrain_3x_coco.py | 61 + .../mmdetection/configs/pascal_voc/README.md | 40 + ...r_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py | 81 + .../faster_rcnn_r50_fpn_1x_voc0712.py | 14 + .../faster_rcnn_r50_fpn_1x_voc0712_cocofmt.py | 75 + .../retinanet_r50_fpn_1x_voc0712.py | 14 + .../configs/pascal_voc/ssd300_voc0712.py | 74 + .../configs/pascal_voc/ssd512_voc0712.py | 57 + downstream/mmdetection/configs/pisa/README.md | 50 + .../mmdetection/configs/pisa/metafile.yml | 110 + .../pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py | 30 + ...pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py | 30 + .../pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py | 30 + .../pisa_mask_rcnn_x101_32x4d_fpn_1x_coco.py | 30 + .../pisa/pisa_retinanet_r50_fpn_1x_coco.py | 7 + .../pisa_retinanet_x101_32x4d_fpn_1x_coco.py | 7 + .../configs/pisa/pisa_ssd300_coco.py | 8 + .../configs/pisa/pisa_ssd512_coco.py | 8 + .../mmdetection/configs/point_rend/README.md | 33 + .../configs/point_rend/metafile.yml | 54 + ...oint_rend_r50_caffe_fpn_mstrain_1x_coco.py | 44 + ...oint_rend_r50_caffe_fpn_mstrain_3x_coco.py | 4 + downstream/mmdetection/configs/pvt/README.md | 57 + .../mmdetection/configs/pvt/metafile.yml | 243 ++ .../pvt/retinanet_pvt-l_fpn_1x_coco.py | 7 + .../pvt/retinanet_pvt-m_fpn_1x_coco.py | 6 + .../pvt/retinanet_pvt-s_fpn_1x_coco.py | 6 + .../pvt/retinanet_pvt-t_fpn_1x_coco.py | 16 + .../pvt/retinanet_pvtv2-b0_fpn_1x_coco.py | 17 + .../pvt/retinanet_pvtv2-b1_fpn_1x_coco.py | 7 + .../pvt/retinanet_pvtv2-b2_fpn_1x_coco.py | 8 + .../pvt/retinanet_pvtv2-b3_fpn_1x_coco.py | 8 + .../pvt/retinanet_pvtv2-b4_fpn_1x_coco.py | 18 + .../pvt/retinanet_pvtv2-b5_fpn_1x_coco.py | 19 + .../mmdetection/configs/queryinst/README.md | 36 + .../configs/queryinst/metafile.yml | 100 + ..._proposals_crop_mstrain_480-800_3x_coco.py | 7 + ...ryinst_r101_fpn_mstrain_480-800_3x_coco.py | 7 + .../queryinst/queryinst_r50_fpn_1x_coco.py | 138 + ..._proposals_crop_mstrain_480-800_3x_coco.py | 54 + ...eryinst_r50_fpn_mstrain_480-800_3x_coco.py | 23 + .../mmdetection/configs/regnet/README.md | 122 + ..._rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py | 17 + ..._rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py | 63 + ..._rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py | 17 + ...sk_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py | 17 + ..._rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py | 17 + ..._rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py | 17 + .../faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py | 57 + .../faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py | 3 + ..._rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py | 61 + ..._rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py | 17 + ...er_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py | 17 + ..._rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py | 17 + ..._regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py | 26 + .../mask_rcnn_regnetx-12GF_fpn_1x_coco.py | 17 + .../mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py | 58 + ..._regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py | 7 + ..._rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py | 66 + ..._regnetx-400MF_fpn_mstrain-poly_3x_coco.py | 26 + .../mask_rcnn_regnetx-4GF_fpn_1x_coco.py | 17 + ...nn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py | 26 + .../mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py | 17 + ..._regnetx-800MF_fpn_mstrain-poly_3x_coco.py | 26 + .../mask_rcnn_regnetx-8GF_fpn_1x_coco.py | 17 + .../mmdetection/configs/regnet/metafile.yml | 797 +++++ .../retinanet_regnetx-1.6GF_fpn_1x_coco.py | 17 + .../retinanet_regnetx-3.2GF_fpn_1x_coco.py | 59 + .../retinanet_regnetx-800MF_fpn_1x_coco.py | 17 + .../mmdetection/configs/reppoints/README.md | 59 + ...50_grid_center_fpn_gn-neck+head_1x_coco.py | 2 + .../bbox_r50_grid_fpn_gn-neck+head_1x_coco.py | 13 + .../configs/reppoints/metafile.yml | 181 + .../configs/reppoints/reppoints.png | Bin 0 -> 1198109 bytes ...nts_minmax_r50_fpn_gn-neck+head_1x_coco.py | 2 + ...01_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py | 8 + ...ts_moment_r101_fpn_gn-neck+head_2x_coco.py | 6 + .../reppoints_moment_r50_fpn_1x_coco.py | 67 + ...nts_moment_r50_fpn_gn-neck+head_1x_coco.py | 4 + ...nts_moment_r50_fpn_gn-neck+head_2x_coco.py | 3 + ...01_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py | 16 + ...ial_minmax_r50_fpn_gn-neck+head_1x_coco.py | 2 + .../mmdetection/configs/res2net/README.md | 77 + .../cascade_mask_rcnn_r2_101_fpn_20e_coco.py | 10 + .../cascade_rcnn_r2_101_fpn_20e_coco.py | 10 + .../res2net/faster_rcnn_r2_101_fpn_2x_coco.py | 10 + .../res2net/htc_r2_101_fpn_20e_coco.py | 13 + .../res2net/mask_rcnn_r2_101_fpn_2x_coco.py | 10 + .../mmdetection/configs/res2net/metafile.yml | 146 + .../mmdetection/configs/resnest/README.md | 54 + ...pn_syncbn-backbone+head_mstrain_1x_coco.py | 7 + ...pn_syncbn-backbone+head_mstrain_1x_coco.py | 118 + ...cbn-backbone+head_mstrain-range_1x_coco.py | 7 + ...cbn-backbone+head_mstrain-range_1x_coco.py | 116 + ...cbn-backbone+head_mstrain-range_1x_coco.py | 7 + ...cbn-backbone+head_mstrain-range_1x_coco.py | 62 + ...pn_syncbn-backbone+head_mstrain_1x_coco.py | 7 + ...pn_syncbn-backbone+head_mstrain_1x_coco.py | 64 + .../mmdetection/configs/resnest/metafile.yml | 230 ++ .../configs/resnet_strikes_back/README.md | 40 + ..._mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py | 18 + ...aster_rcnn_r50_fpn_rsb-pretrain_1x_coco.py | 18 + .../mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py | 18 + .../configs/resnet_strikes_back/metafile.yml | 116 + .../retinanet_r50_fpn_rsb-pretrain_1x_coco.py | 18 + .../mmdetection/configs/retinanet/README.md | 53 + .../configs/retinanet/metafile.yml | 312 ++ .../retinanet_r101_caffe_fpn_1x_coco.py | 7 + ...etinanet_r101_caffe_fpn_mstrain_3x_coco.py | 7 + .../retinanet/retinanet_r101_fpn_1x_coco.py | 6 + .../retinanet/retinanet_r101_fpn_2x_coco.py | 6 + ...inanet_r101_fpn_mstrain_640-800_3x_coco.py | 6 + .../retinanet_r18_fpn_1x8_1x_coco.py | 23 + .../retinanet/retinanet_r18_fpn_1x_coco.py | 18 + .../retinanet_r50_caffe_fpn_1x_coco.py | 41 + ...retinanet_r50_caffe_fpn_mstrain_1x_coco.py | 46 + ...retinanet_r50_caffe_fpn_mstrain_2x_coco.py | 4 + ...retinanet_r50_caffe_fpn_mstrain_3x_coco.py | 4 + .../retinanet/retinanet_r50_fpn_1x_coco.py | 7 + .../retinanet/retinanet_r50_fpn_2x_coco.py | 4 + .../retinanet/retinanet_r50_fpn_90k_coco.py | 15 + .../retinanet_r50_fpn_fp16_1x_coco.py | 3 + ...tinanet_r50_fpn_mstrain_640-800_3x_coco.py | 5 + .../retinanet_x101_32x4d_fpn_1x_coco.py | 14 + .../retinanet_x101_32x4d_fpn_2x_coco.py | 14 + .../retinanet_x101_64x4d_fpn_1x_coco.py | 14 + .../retinanet_x101_64x4d_fpn_2x_coco.py | 14 + ..._x101_64x4d_fpn_mstrain_640-800_3x_coco.py | 8 + downstream/mmdetection/configs/rpn/README.md | 39 + .../configs/rpn/rpn_r101_caffe_fpn_1x_coco.py | 7 + .../configs/rpn/rpn_r101_fpn_1x_coco.py | 6 + .../configs/rpn/rpn_r101_fpn_2x_coco.py | 6 + .../configs/rpn/rpn_r50_caffe_c4_1x_coco.py | 38 + .../configs/rpn/rpn_r50_caffe_fpn_1x_coco.py | 41 + .../configs/rpn/rpn_r50_fpn_1x_coco.py | 18 + .../configs/rpn/rpn_r50_fpn_2x_coco.py | 5 + .../configs/rpn/rpn_x101_32x4d_fpn_1x_coco.py | 14 + .../configs/rpn/rpn_x101_32x4d_fpn_2x_coco.py | 14 + .../configs/rpn/rpn_x101_64x4d_fpn_1x_coco.py | 14 + .../configs/rpn/rpn_x101_64x4d_fpn_2x_coco.py | 14 + downstream/mmdetection/configs/sabl/README.md | 47 + .../mmdetection/configs/sabl/metafile.yml | 140 + .../sabl_cascade_rcnn_r101_fpn_1x_coco.py | 90 + .../sabl/sabl_cascade_rcnn_r50_fpn_1x_coco.py | 86 + .../sabl/sabl_faster_rcnn_r101_fpn_1x_coco.py | 38 + .../sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py | 34 + .../sabl/sabl_retinanet_r101_fpn_1x_coco.py | 54 + .../sabl_retinanet_r101_fpn_gn_1x_coco.py | 56 + ...etinanet_r101_fpn_gn_2x_ms_480_960_coco.py | 73 + ...etinanet_r101_fpn_gn_2x_ms_640_800_coco.py | 73 + .../sabl/sabl_retinanet_r50_fpn_1x_coco.py | 50 + .../sabl/sabl_retinanet_r50_fpn_gn_1x_coco.py | 52 + .../mmdetection/configs/scnet/README.md | 63 + .../mmdetection/configs/scnet/metafile.yml | 116 + .../configs/scnet/scnet_r101_fpn_20e_coco.py | 6 + .../configs/scnet/scnet_r50_fpn_1x_coco.py | 136 + .../configs/scnet/scnet_r50_fpn_20e_coco.py | 4 + .../scnet/scnet_x101_64x4d_fpn_20e_coco.py | 15 + .../scnet_x101_64x4d_fpn_8x1_20e_coco.py | 8 + .../mmdetection/configs/scratch/README.md | 35 + ...ter_rcnn_r50_fpn_gn-all_scratch_6x_coco.py | 24 + ...ask_rcnn_r50_fpn_gn-all_scratch_6x_coco.py | 25 + .../mmdetection/configs/scratch/metafile.yml | 48 + .../mmdetection/configs/seesaw_loss/README.md | 47 + ...n_random_seesaw_loss_mstrain_2x_lvis_v1.py | 132 + ...saw_loss_normed_mask_mstrain_2x_lvis_v1.py | 5 + ...mple1e-3_seesaw_loss_mstrain_2x_lvis_v1.py | 98 + ...saw_loss_normed_mask_mstrain_2x_lvis_v1.py | 5 + ...n_random_seesaw_loss_mstrain_2x_lvis_v1.py | 6 + ...saw_loss_normed_mask_mstrain_2x_lvis_v1.py | 6 + ...mple1e-3_seesaw_loss_mstrain_2x_lvis_v1.py | 6 + ...saw_loss_normed_mask_mstrain_2x_lvis_v1.py | 6 + ...n_random_seesaw_loss_mstrain_2x_lvis_v1.py | 75 + ...saw_loss_normed_mask_mstrain_2x_lvis_v1.py | 5 + ...mple1e-3_seesaw_loss_mstrain_2x_lvis_v1.py | 41 + ...saw_loss_normed_mask_mstrain_2x_lvis_v1.py | 5 + .../configs/seesaw_loss/metafile.yml | 203 ++ .../configs/selfsup_pretrain/README.md | 109 + ...sk_rcnn_r50_fpn_mocov2-pretrain_1x_coco.py | 13 + ...rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco.py | 32 + ...mask_rcnn_r50_fpn_swav-pretrain_1x_coco.py | 13 + ...k_rcnn_r50_fpn_swav-pretrain_ms-2x_coco.py | 32 + .../configs/simple_copy_paste/README.md | 38 + ...syncbn-all_rpn-2conv_ssj_32x2_270k_coco.py | 20 + ..._syncbn-all_rpn-2conv_ssj_32x2_90k_coco.py | 7 + ...bn-all_rpn-2conv_ssj_scp_32x2_270k_coco.py | 20 + ...cbn-all_rpn-2conv_ssj_scp_32x2_90k_coco.py | 7 + .../configs/simple_copy_paste/metafile.yml | 92 + downstream/mmdetection/configs/solo/README.md | 54 + .../decoupled_solo_light_r50_fpn_3x_coco.py | 63 + .../solo/decoupled_solo_r50_fpn_1x_coco.py | 28 + .../solo/decoupled_solo_r50_fpn_3x_coco.py | 25 + .../mmdetection/configs/solo/metafile.yml | 115 + .../configs/solo/solo_r50_fpn_1x_coco.py | 53 + .../configs/solo/solo_r50_fpn_3x_coco.py | 28 + .../mmdetection/configs/solov2/README.md | 59 + .../mmdetection/configs/solov2/metafile.yml | 119 + .../solov2/solov2_light_r18_fpn_3x_coco.py | 7 + .../solov2/solov2_light_r34_fpn_3x_coco.py | 7 + .../solov2_light_r50_dcn_fpn_3x_coco.py | 62 + .../solov2/solov2_light_r50_fpn_3x_coco.py | 57 + .../solov2/solov2_r101_dcn_fpn_3x_coco.py | 13 + .../configs/solov2/solov2_r101_fpn_3x_coco.py | 6 + .../configs/solov2/solov2_r50_fpn_1x_coco.py | 61 + .../configs/solov2/solov2_r50_fpn_3x_coco.py | 28 + .../solov2/solov2_x101_dcn_fpn_3x_coco.py | 17 + .../mmdetection/configs/sparse_rcnn/README.md | 38 + .../configs/sparse_rcnn/metafile.yml | 80 + ..._proposals_crop_mstrain_480-800_3x_coco.py | 7 + ...e_rcnn_r101_fpn_mstrain_480-800_3x_coco.py | 7 + .../sparse_rcnn_r50_fpn_1x_coco.py | 95 + ..._proposals_crop_mstrain_480-800_3x_coco.py | 52 + ...se_rcnn_r50_fpn_mstrain_480-800_3x_coco.py | 23 + downstream/mmdetection/configs/ssd/README.md | 62 + .../mmdetection/configs/ssd/metafile.yml | 78 + .../mmdetection/configs/ssd/ssd300_coco.py | 71 + .../mmdetection/configs/ssd/ssd512_coco.py | 84 + .../ssdlite_mobilenetv2_scratch_600e_coco.py | 150 + .../configs/strong_baselines/README.md | 20 + ..._fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py | 80 + ...syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py | 2 + ..._fpn_syncbn-all_rpn-2conv_lsj_400e_coco.py | 6 + ..._fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py | 22 + ...syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py | 3 + ...0_fpn_syncbn-all_rpn-2conv_lsj_50e_coco.py | 5 + downstream/mmdetection/configs/swin/README.md | 41 + ...n_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco.py | 6 + .../mask_rcnn_swin-t-p4-w7_fpn_1x_coco.py | 42 + ...n_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco.py | 3 + ...k_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py | 91 + .../mmdetection/configs/swin/metafile.yml | 120 + .../retinanet_swin-t-p4-w7_fpn_1x_coco.py | 30 + .../configs/timm_example/README.md | 62 + ...inanet_timm_efficientnet_b1_fpn_1x_coco.py | 20 + .../retinanet_timm_tv_resnet50_fpn_1x_coco.py | 19 + downstream/mmdetection/configs/tood/README.md | 40 + .../mmdetection/configs/tood/metafile.yml | 95 + ...od_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py | 7 + .../tood/tood_r101_fpn_mstrain_2x_coco.py | 7 + .../configs/tood/tood_r50_fpn_1x_coco.py | 74 + .../tood/tood_r50_fpn_anchor_based_1x_coco.py | 2 + .../tood/tood_r50_fpn_mstrain_2x_coco.py | 22 + ...1_64x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py | 7 + .../tood_x101_64x4d_fpn_mstrain_2x_coco.py | 16 + .../mmdetection/configs/tridentnet/README.md | 38 + .../configs/tridentnet/metafile.yml | 55 + .../tridentnet_r50_caffe_1x_coco.py | 55 + .../tridentnet_r50_caffe_mstrain_1x_coco.py | 22 + .../tridentnet_r50_caffe_mstrain_3x_coco.py | 4 + .../mmdetection/configs/vfnet/README.md | 48 + .../mmdetection/configs/vfnet/metafile.yml | 116 + .../configs/vfnet/vfnet_r101_fpn_1x_coco.py | 6 + .../configs/vfnet/vfnet_r101_fpn_2x_coco.py | 8 + ...t_r101_fpn_mdconv_c3-c5_mstrain_2x_coco.py | 15 + .../vfnet/vfnet_r101_fpn_mstrain_2x_coco.py | 6 + ...r2_101_fpn_mdconv_c3-c5_mstrain_2x_coco.py | 18 + .../vfnet/vfnet_r2_101_fpn_mstrain_2x_coco.py | 16 + .../configs/vfnet/vfnet_r50_fpn_1x_coco.py | 107 + ...et_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py | 6 + .../vfnet/vfnet_r50_fpn_mstrain_2x_coco.py | 39 + ..._32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py | 17 + .../vfnet_x101_32x4d_fpn_mstrain_2x_coco.py | 15 + ..._64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py | 17 + .../vfnet_x101_64x4d_fpn_mstrain_2x_coco.py | 15 + .../mmdetection/configs/wider_face/README.md | 57 + .../configs/wider_face/ssd300_wider_face.py | 18 + .../mmdetection/configs/yolact/README.md | 75 + .../mmdetection/configs/yolact/metafile.yml | 78 + .../configs/yolact/yolact_r101_1x8_coco.py | 7 + .../configs/yolact/yolact_r50_1x8_coco.py | 165 + .../configs/yolact/yolact_r50_8x8_coco.py | 16 + downstream/mmdetection/configs/yolo/README.md | 55 + .../mmdetection/configs/yolo/metafile.yml | 124 + .../configs/yolo/yolov3_d53_320_273e_coco.py | 42 + .../yolov3_d53_fp16_mstrain-608_273e_coco.py | 3 + .../yolo/yolov3_d53_mstrain-416_273e_coco.py | 42 + .../yolo/yolov3_d53_mstrain-608_273e_coco.py | 132 + .../yolo/yolov3_mobilenetv2_320_300e_coco.py | 53 + ...olov3_mobilenetv2_mstrain-416_300e_coco.py | 142 + .../mmdetection/configs/yolof/README.md | 35 + .../mmdetection/configs/yolof/metafile.yml | 32 + .../configs/yolof/yolof_r50_c5_8x8_1x_coco.py | 111 + .../yolof/yolof_r50_c5_8x8_iter-1x_coco.py | 14 + .../mmdetection/configs/yolox/README.md | 39 + .../mmdetection/configs/yolox/metafile.yml | 70 + .../configs/yolox/yolox_l_8x8_300e_coco.py | 8 + .../configs/yolox/yolox_m_8x8_300e_coco.py | 8 + .../configs/yolox/yolox_nano_8x8_300e_coco.py | 11 + .../configs/yolox/yolox_s_8x8_300e_coco.py | 165 + .../configs/yolox/yolox_tiny_8x8_300e_coco.py | 58 + .../configs/yolox/yolox_x_8x8_300e_coco.py | 8 + .../mmdetection/docs/en/1_exist_data_model.md | 697 ++++ .../mmdetection/docs/en/2_new_data_model.md | 264 ++ .../docs/en/3_exist_data_new_model.md | 283 ++ downstream/mmdetection/docs/en/Makefile | 20 + .../docs/en/_static/css/readthedocs.css | 6 + .../docs/en/_static/image/mmdet-logo.png | Bin 0 -> 32181 bytes downstream/mmdetection/docs/en/api.rst | 108 + downstream/mmdetection/docs/en/changelog.md | 1681 ++++++++++ .../mmdetection/docs/en/compatibility.md | 178 + downstream/mmdetection/docs/en/conf.py | 116 + downstream/mmdetection/docs/en/conventions.md | 78 + downstream/mmdetection/docs/en/faq.md | 232 ++ downstream/mmdetection/docs/en/get_started.md | 208 ++ downstream/mmdetection/docs/en/index.rst | 57 + downstream/mmdetection/docs/en/make.bat | 35 + downstream/mmdetection/docs/en/model_zoo.md | 358 ++ downstream/mmdetection/docs/en/projects.md | 57 + .../docs/en/robustness_benchmarking.md | 110 + downstream/mmdetection/docs/en/stat.py | 64 + .../mmdetection/docs/en/switch_language.md | 3 + .../mmdetection/docs/en/tutorials/config.md | 544 +++ .../docs/en/tutorials/customize_dataset.md | 542 +++ .../docs/en/tutorials/customize_losses.md | 126 + .../docs/en/tutorials/customize_models.md | 363 ++ .../docs/en/tutorials/customize_runtime.md | 323 ++ .../docs/en/tutorials/data_pipeline.md | 199 ++ .../mmdetection/docs/en/tutorials/finetune.md | 89 + .../mmdetection/docs/en/tutorials/how_to.md | 204 ++ .../mmdetection/docs/en/tutorials/index.rst | 17 + .../mmdetection/docs/en/tutorials/init_cfg.md | 161 + .../docs/en/tutorials/onnx2tensorrt.md | 106 + .../docs/en/tutorials/pytorch2onnx.md | 334 ++ .../en/tutorials/test_results_submission.md | 112 + .../docs/en/tutorials/useful_hooks.md | 83 + .../mmdetection/docs/en/useful_tools.md | 502 +++ .../docs/zh_cn/1_exist_data_model.md | 678 ++++ .../docs/zh_cn/2_new_data_model.md | 267 ++ .../docs/zh_cn/3_exist_data_new_model.md | 283 ++ downstream/mmdetection/docs/zh_cn/Makefile | 20 + .../docs/zh_cn/_static/css/readthedocs.css | 6 + .../docs/zh_cn/_static/image/mmdet-logo.png | Bin 0 -> 32181 bytes downstream/mmdetection/docs/zh_cn/api.rst | 108 + downstream/mmdetection/docs/zh_cn/article.md | 53 + .../mmdetection/docs/zh_cn/compatibility.md | 177 + downstream/mmdetection/docs/zh_cn/conf.py | 118 + .../mmdetection/docs/zh_cn/conventions.md | 75 + downstream/mmdetection/docs/zh_cn/faq.md | 162 + .../mmdetection/docs/zh_cn/get_started.md | 256 ++ downstream/mmdetection/docs/zh_cn/index.rst | 55 + downstream/mmdetection/docs/zh_cn/make.bat | 35 + .../mmdetection/docs/zh_cn/model_zoo.md | 333 ++ downstream/mmdetection/docs/zh_cn/projects.md | 48 + .../docs/zh_cn/robustness_benchmarking.md | 109 + downstream/mmdetection/docs/zh_cn/stat.py | 64 + .../mmdetection/docs/zh_cn/switch_language.md | 3 + .../docs/zh_cn/tutorials/config.md | 522 +++ .../docs/zh_cn/tutorials/customize_dataset.md | 456 +++ .../docs/zh_cn/tutorials/customize_losses.md | 125 + .../docs/zh_cn/tutorials/customize_models.md | 359 ++ .../docs/zh_cn/tutorials/customize_runtime.md | 1 + .../docs/zh_cn/tutorials/data_pipeline.md | 190 ++ .../docs/zh_cn/tutorials/finetune.md | 87 + .../docs/zh_cn/tutorials/how_to.md | 203 ++ .../docs/zh_cn/tutorials/index.rst | 14 + .../docs/zh_cn/tutorials/init_cfg.md | 161 + .../docs/zh_cn/tutorials/onnx2tensorrt.md | 106 + .../docs/zh_cn/tutorials/pytorch2onnx.md | 3 + .../mmdetection/docs/zh_cn/useful_tools.md | 1 + downstream/mmdetection/mmdet/__init__.py | 29 + downstream/mmdetection/mmdet/apis/__init__.py | 12 + .../mmdetection/mmdet/apis/inference.py | 251 ++ downstream/mmdetection/mmdet/apis/test.py | 209 ++ downstream/mmdetection/mmdet/apis/train.py | 244 ++ downstream/mmdetection/mmdet/core/__init__.py | 10 + .../mmdetection/mmdet/core/anchor/__init__.py | 14 + .../mmdet/core/anchor/anchor_generator.py | 866 +++++ .../mmdetection/mmdet/core/anchor/builder.py | 19 + .../mmdet/core/anchor/point_generator.py | 263 ++ .../mmdetection/mmdet/core/anchor/utils.py | 72 + .../mmdetection/mmdet/core/bbox/__init__.py | 28 + .../mmdet/core/bbox/assigners/__init__.py | 22 + .../bbox/assigners/approx_max_iou_assigner.py | 146 + .../core/bbox/assigners/assign_result.py | 206 ++ .../core/bbox/assigners/atss_assigner.py | 234 ++ .../core/bbox/assigners/base_assigner.py | 10 + .../bbox/assigners/center_region_assigner.py | 336 ++ .../core/bbox/assigners/grid_assigner.py | 156 + .../core/bbox/assigners/hungarian_assigner.py | 146 + .../bbox/assigners/mask_hungarian_assigner.py | 132 + .../core/bbox/assigners/max_iou_assigner.py | 218 ++ .../core/bbox/assigners/point_assigner.py | 134 + .../core/bbox/assigners/region_assigner.py | 222 ++ .../core/bbox/assigners/sim_ota_assigner.py | 257 ++ .../bbox/assigners/task_aligned_assigner.py | 151 + .../core/bbox/assigners/uniform_assigner.py | 135 + .../mmdetection/mmdet/core/bbox/builder.py | 21 + .../mmdet/core/bbox/coder/__init__.py | 15 + .../mmdet/core/bbox/coder/base_bbox_coder.py | 18 + .../core/bbox/coder/bucketing_bbox_coder.py | 351 ++ .../core/bbox/coder/delta_xywh_bbox_coder.py | 392 +++ .../bbox/coder/distance_point_bbox_coder.py | 63 + .../coder/legacy_delta_xywh_bbox_coder.py | 216 ++ .../core/bbox/coder/pseudo_bbox_coder.py | 19 + .../mmdet/core/bbox/coder/tblr_bbox_coder.py | 206 ++ .../mmdet/core/bbox/coder/yolo_bbox_coder.py | 83 + .../mmdetection/mmdet/core/bbox/demodata.py | 42 + .../core/bbox/iou_calculators/__init__.py | 5 + .../core/bbox/iou_calculators/builder.py | 9 + .../bbox/iou_calculators/iou2d_calculator.py | 261 ++ .../mmdet/core/bbox/match_costs/__init__.py | 9 + .../mmdet/core/bbox/match_costs/builder.py | 9 + .../mmdet/core/bbox/match_costs/match_cost.py | 359 ++ .../mmdet/core/bbox/samplers/__init__.py | 19 + .../mmdet/core/bbox/samplers/base_sampler.py | 102 + .../core/bbox/samplers/combined_sampler.py | 21 + .../samplers/instance_balanced_pos_sampler.py | 56 + .../bbox/samplers/iou_balanced_neg_sampler.py | 158 + .../core/bbox/samplers/mask_pseudo_sampler.py | 44 + .../bbox/samplers/mask_sampling_result.py | 60 + .../mmdet/core/bbox/samplers/ohem_sampler.py | 111 + .../core/bbox/samplers/pseudo_sampler.py | 42 + .../core/bbox/samplers/random_sampler.py | 82 + .../core/bbox/samplers/sampling_result.py | 153 + .../core/bbox/samplers/score_hlr_sampler.py | 265 ++ .../mmdetection/mmdet/core/bbox/transforms.py | 270 ++ .../mmdet/core/data_structures/__init__.py | 5 + .../core/data_structures/general_data.py | 326 ++ .../core/data_structures/instance_data.py | 188 ++ .../mmdet/core/evaluation/__init__.py | 19 + .../mmdet/core/evaluation/bbox_overlaps.py | 65 + .../mmdet/core/evaluation/class_names.py | 332 ++ .../mmdet/core/evaluation/eval_hooks.py | 140 + .../mmdet/core/evaluation/mean_ap.py | 782 +++++ .../mmdet/core/evaluation/panoptic_utils.py | 6 + .../mmdet/core/evaluation/recall.py | 197 ++ .../mmdetection/mmdet/core/export/__init__.py | 12 + .../mmdet/core/export/model_wrappers.py | 183 ++ .../mmdet/core/export/onnx_helper.py | 223 ++ .../mmdet/core/export/pytorch2onnx.py | 159 + .../mmdetection/mmdet/core/hook/__init__.py | 17 + .../mmdet/core/hook/checkloss_hook.py | 24 + downstream/mmdetection/mmdet/core/hook/ema.py | 130 + .../mmdet/core/hook/memory_profiler_hook.py | 55 + .../mmdet/core/hook/set_epoch_info_hook.py | 15 + .../mmdet/core/hook/sync_norm_hook.py | 52 + .../mmdet/core/hook/sync_random_size_hook.py | 72 + .../mmdet/core/hook/wandblogger_hook.py | 586 ++++ .../mmdet/core/hook/yolox_lrupdater_hook.py | 67 + .../mmdet/core/hook/yolox_mode_switch_hook.py | 52 + .../mmdetection/mmdet/core/mask/__init__.py | 9 + .../mmdet/core/mask/mask_target.py | 127 + .../mmdetection/mmdet/core/mask/structures.py | 1102 +++++++ .../mmdetection/mmdet/core/mask/utils.py | 89 + .../mmdet/core/optimizers/__init__.py | 9 + .../mmdet/core/optimizers/builder.py | 33 + .../layer_decay_optimizer_constructor.py | 154 + .../mmdet/core/post_processing/__init__.py | 10 + .../mmdet/core/post_processing/bbox_nms.py | 171 + .../mmdet/core/post_processing/matrix_nms.py | 121 + .../mmdet/core/post_processing/merge_augs.py | 154 + .../mmdetection/mmdet/core/utils/__init__.py | 13 + .../mmdet/core/utils/dist_utils.py | 193 ++ .../mmdetection/mmdet/core/utils/misc.py | 208 ++ .../mmdet/core/visualization/__init__.py | 9 + .../mmdet/core/visualization/image.py | 559 ++++ .../mmdet/core/visualization/palette.py | 63 + .../mmdetection/mmdet/datasets/__init__.py | 28 + .../mmdet/datasets/api_wrappers/__init__.py | 7 + .../mmdet/datasets/api_wrappers/coco_api.py | 47 + .../api_wrappers/panoptic_evaluation.py | 228 ++ .../mmdetection/mmdet/datasets/builder.py | 215 ++ .../mmdetection/mmdet/datasets/cityscapes.py | 338 ++ downstream/mmdetection/mmdet/datasets/coco.py | 649 ++++ .../mmdet/datasets/coco_panoptic.py | 692 ++++ .../mmdetection/mmdet/datasets/custom.py | 410 +++ .../mmdet/datasets/dataset_wrappers.py | 456 +++ .../mmdetection/mmdet/datasets/deepfashion.py | 16 + downstream/mmdetection/mmdet/datasets/lvis.py | 742 +++++ .../mmdetection/mmdet/datasets/openimages.py | 891 +++++ .../mmdet/datasets/pipelines/__init__.py | 31 + .../mmdet/datasets/pipelines/auto_augment.py | 894 +++++ .../mmdet/datasets/pipelines/compose.py | 55 + .../mmdet/datasets/pipelines/formating.py | 9 + .../mmdet/datasets/pipelines/formatting.py | 392 +++ .../mmdet/datasets/pipelines/instaboost.py | 118 + .../mmdet/datasets/pipelines/loading.py | 643 ++++ .../mmdet/datasets/pipelines/test_time_aug.py | 121 + .../mmdet/datasets/pipelines/transforms.py | 2919 +++++++++++++++++ .../mmdet/datasets/samplers/__init__.py | 10 + .../datasets/samplers/class_aware_sampler.py | 176 + .../datasets/samplers/distributed_sampler.py | 54 + .../mmdet/datasets/samplers/group_sampler.py | 148 + .../datasets/samplers/infinite_sampler.py | 186 ++ .../mmdetection/mmdet/datasets/utils.py | 166 + downstream/mmdetection/mmdet/datasets/voc.py | 112 + .../mmdetection/mmdet/datasets/wider_face.py | 54 + .../mmdetection/mmdet/datasets/xml_style.py | 178 + .../mmdetection/mmdet/models/__init__.py | 19 + .../mmdet/models/backbones/__init__.py | 28 + .../mmdet/models/backbones/adapter_modules.py | 386 +++ .../mmdet/models/backbones/csp_darknet.py | 284 ++ .../mmdet/models/backbones/darknet.py | 213 ++ .../models/backbones/detectors_resnet.py | 353 ++ .../models/backbones/detectors_resnext.py | 123 + .../mmdet/models/backbones/efficientnet.py | 417 +++ .../mmdet/models/backbones/gpvit.py | 51 + .../mmdet/models/backbones/gpvit_adapter.py | 320 ++ .../mmdet/models/backbones/hourglass.py | 222 ++ .../mmdet/models/backbones/hrnet.py | 589 ++++ .../mmdet/models/backbones/mobilenet_v2.py | 197 ++ .../mmdetection/mmdet/models/backbones/pvt.py | 591 ++++ .../mmdet/models/backbones/regnet.py | 356 ++ .../mmdet/models/backbones/res2net.py | 327 ++ .../mmdet/models/backbones/resnest.py | 322 ++ .../mmdet/models/backbones/resnet.py | 672 ++++ .../mmdet/models/backbones/resnext.py | 154 + .../mmdet/models/backbones/ssd_vgg.py | 128 + .../mmdet/models/backbones/swin.py | 763 +++++ .../mmdet/models/backbones/trident_resnet.py | 298 ++ .../mmdetection/mmdet/models/builder.py | 59 + .../mmdet/models/dense_heads/__init__.py | 58 + .../models/dense_heads/anchor_free_head.py | 350 ++ .../mmdet/models/dense_heads/anchor_head.py | 542 +++ .../mmdet/models/dense_heads/atss_head.py | 501 +++ .../models/dense_heads/autoassign_head.py | 527 +++ .../models/dense_heads/base_dense_head.py | 526 +++ .../models/dense_heads/base_mask_head.py | 116 + .../models/dense_heads/cascade_rpn_head.py | 801 +++++ .../models/dense_heads/centernet_head.py | 412 +++ .../models/dense_heads/centripetal_head.py | 430 +++ .../mmdet/models/dense_heads/corner_head.py | 1086 ++++++ .../mmdet/models/dense_heads/ddod_head.py | 778 +++++ .../dense_heads/deformable_detr_head.py | 318 ++ .../models/dense_heads/dense_test_mixins.py | 206 ++ .../mmdet/models/dense_heads/detr_head.py | 844 +++++ .../models/dense_heads/embedding_rpn_head.py | 116 + .../mmdet/models/dense_heads/fcos_head.py | 455 +++ .../mmdet/models/dense_heads/fovea_head.py | 385 +++ .../dense_heads/free_anchor_retina_head.py | 272 ++ .../mmdet/models/dense_heads/fsaf_head.py | 433 +++ .../models/dense_heads/ga_retina_head.py | 113 + .../mmdet/models/dense_heads/ga_rpn_head.py | 177 + .../mmdet/models/dense_heads/gfl_head.py | 648 ++++ .../models/dense_heads/guided_anchor_head.py | 868 +++++ .../mmdet/models/dense_heads/lad_head.py | 232 ++ .../mmdet/models/dense_heads/ld_head.py | 261 ++ .../models/dense_heads/mask2former_head.py | 430 +++ .../models/dense_heads/maskformer_head.py | 555 ++++ .../mmdet/models/dense_heads/nasfcos_head.py | 80 + .../mmdet/models/dense_heads/paa_head.py | 756 +++++ .../models/dense_heads/pisa_retinanet_head.py | 155 + .../mmdet/models/dense_heads/pisa_ssd_head.py | 140 + .../models/dense_heads/reppoints_head.py | 764 +++++ .../mmdet/models/dense_heads/retina_head.py | 115 + .../models/dense_heads/retina_sepbn_head.py | 118 + .../mmdet/models/dense_heads/rpn_head.py | 265 ++ .../models/dense_heads/sabl_retina_head.py | 630 ++++ .../mmdet/models/dense_heads/solo_head.py | 1182 +++++++ .../mmdet/models/dense_heads/solov2_head.py | 749 +++++ .../mmdet/models/dense_heads/ssd_head.py | 357 ++ .../mmdet/models/dense_heads/tood_head.py | 778 +++++ .../mmdet/models/dense_heads/vfnet_head.py | 740 +++++ .../mmdet/models/dense_heads/yolact_head.py | 1018 ++++++ .../mmdet/models/dense_heads/yolo_head.py | 621 ++++ .../mmdet/models/dense_heads/yolof_head.py | 416 +++ .../mmdet/models/dense_heads/yolox_head.py | 493 +++ .../mmdet/models/detectors/__init__.py | 58 + .../mmdet/models/detectors/atss.py | 19 + .../mmdet/models/detectors/autoassign.py | 19 + .../mmdet/models/detectors/base.py | 360 ++ .../mmdet/models/detectors/cascade_rcnn.py | 49 + .../mmdet/models/detectors/centernet.py | 111 + .../mmdet/models/detectors/cornernet.py | 97 + .../mmdet/models/detectors/ddod.py | 19 + .../mmdet/models/detectors/deformable_detr.py | 10 + .../mmdet/models/detectors/detr.py | 70 + .../mmdet/models/detectors/fast_rcnn.py | 55 + .../mmdet/models/detectors/faster_rcnn.py | 27 + .../mmdet/models/detectors/fcos.py | 19 + .../mmdet/models/detectors/fovea.py | 19 + .../mmdet/models/detectors/fsaf.py | 19 + .../mmdetection/mmdet/models/detectors/gfl.py | 18 + .../mmdet/models/detectors/grid_rcnn.py | 32 + .../mmdetection/mmdet/models/detectors/htc.py | 16 + .../mmdet/models/detectors/kd_one_stage.py | 103 + .../mmdetection/mmdet/models/detectors/lad.py | 92 + .../mmdet/models/detectors/mask2former.py | 27 + .../mmdet/models/detectors/mask_rcnn.py | 27 + .../models/detectors/mask_scoring_rcnn.py | 30 + .../mmdet/models/detectors/maskformer.py | 256 ++ .../mmdet/models/detectors/nasfcos.py | 22 + .../mmdetection/mmdet/models/detectors/paa.py | 19 + .../mmdet/models/detectors/panoptic_fpn.py | 34 + .../detectors/panoptic_two_stage_segmentor.py | 279 ++ .../mmdet/models/detectors/point_rend.py | 32 + .../mmdet/models/detectors/queryinst.py | 28 + .../models/detectors/reppoints_detector.py | 24 + .../mmdet/models/detectors/retinanet.py | 19 + .../mmdetection/mmdet/models/detectors/rpn.py | 159 + .../mmdet/models/detectors/scnet.py | 11 + .../mmdet/models/detectors/single_stage.py | 171 + .../detectors/single_stage_instance_seg.py | 363 ++ .../mmdet/models/detectors/solo.py | 30 + .../mmdet/models/detectors/solov2.py | 30 + .../mmdet/models/detectors/sparse_rcnn.py | 111 + .../mmdet/models/detectors/tood.py | 23 + .../models/detectors/trident_faster_rcnn.py | 70 + .../mmdet/models/detectors/two_stage.py | 211 ++ .../mmdet/models/detectors/vfnet.py | 20 + .../mmdet/models/detectors/yolact.py | 120 + .../mmdet/models/detectors/yolo.py | 42 + .../mmdet/models/detectors/yolof.py | 19 + .../mmdet/models/detectors/yolox.py | 136 + .../mmdet/models/losses/__init__.py | 32 + .../mmdet/models/losses/accuracy.py | 79 + .../mmdet/models/losses/ae_loss.py | 103 + .../mmdet/models/losses/balanced_l1_loss.py | 124 + .../mmdet/models/losses/cross_entropy_loss.py | 301 ++ .../mmdet/models/losses/dice_loss.py | 146 + .../mmdet/models/losses/focal_loss.py | 244 ++ .../models/losses/gaussian_focal_loss.py | 92 + .../mmdet/models/losses/gfocal_loss.py | 245 ++ .../mmdet/models/losses/ghm_loss.py | 213 ++ .../mmdet/models/losses/iou_loss.py | 474 +++ .../mmdet/models/losses/kd_loss.py | 88 + .../mmdet/models/losses/mse_loss.py | 57 + .../mmdet/models/losses/pisa_loss.py | 184 ++ .../mmdet/models/losses/seesaw_loss.py | 262 ++ .../mmdet/models/losses/smooth_l1_loss.py | 146 + .../mmdetection/mmdet/models/losses/utils.py | 105 + .../mmdet/models/losses/varifocal_loss.py | 134 + .../mmdet/models/necks/__init__.py | 23 + .../mmdetection/mmdet/models/necks/bfp.py | 102 + .../mmdet/models/necks/channel_mapper.py | 100 + .../mmdet/models/necks/ct_resnet_neck.py | 94 + .../mmdet/models/necks/dilated_encoder.py | 109 + .../mmdetection/mmdet/models/necks/dyhead.py | 174 + .../mmdetection/mmdet/models/necks/fpg.py | 406 +++ .../mmdetection/mmdet/models/necks/fpn.py | 204 ++ .../mmdet/models/necks/fpn_carafe.py | 275 ++ .../mmdetection/mmdet/models/necks/hrfpn.py | 100 + .../mmdetection/mmdet/models/necks/nas_fpn.py | 158 + .../mmdet/models/necks/nasfcos_fpn.py | 170 + .../mmdetection/mmdet/models/necks/pafpn.py | 158 + .../mmdetection/mmdet/models/necks/rfp.py | 135 + .../mmdet/models/necks/ssd_neck.py | 129 + .../mmdet/models/necks/yolo_neck.py | 140 + .../mmdet/models/necks/yolox_pafpn.py | 156 + .../mmdet/models/plugins/__init__.py | 9 + .../mmdet/models/plugins/dropblock.py | 85 + .../plugins/msdeformattn_pixel_decoder.py | 269 ++ .../mmdet/models/plugins/pixel_decoder.py | 243 ++ .../mmdet/models/roi_heads/__init__.py | 37 + .../mmdet/models/roi_heads/base_roi_head.py | 103 + .../models/roi_heads/bbox_heads/__init__.py | 14 + .../models/roi_heads/bbox_heads/bbox_head.py | 594 ++++ .../roi_heads/bbox_heads/convfc_bbox_head.py | 229 ++ .../models/roi_heads/bbox_heads/dii_head.py | 426 +++ .../roi_heads/bbox_heads/double_bbox_head.py | 178 + .../models/roi_heads/bbox_heads/sabl_head.py | 596 ++++ .../roi_heads/bbox_heads/scnet_bbox_head.py | 77 + .../models/roi_heads/cascade_roi_head.py | 631 ++++ .../mmdet/models/roi_heads/double_roi_head.py | 34 + .../models/roi_heads/dynamic_roi_head.py | 155 + .../mmdet/models/roi_heads/grid_roi_head.py | 170 + .../mmdet/models/roi_heads/htc_roi_head.py | 628 ++++ .../models/roi_heads/mask_heads/__init__.py | 20 + .../roi_heads/mask_heads/coarse_mask_head.py | 100 + .../roi_heads/mask_heads/dynamic_mask_head.py | 147 + .../roi_heads/mask_heads/fcn_mask_head.py | 414 +++ .../mask_heads/feature_relay_head.py | 53 + .../mask_heads/fused_semantic_head.py | 118 + .../mask_heads/global_context_head.py | 101 + .../models/roi_heads/mask_heads/grid_head.py | 363 ++ .../roi_heads/mask_heads/htc_mask_head.py | 39 + .../roi_heads/mask_heads/mask_point_head.py | 253 ++ .../roi_heads/mask_heads/maskiou_head.py | 183 ++ .../roi_heads/mask_heads/scnet_mask_head.py | 28 + .../mask_heads/scnet_semantic_head.py | 28 + .../models/roi_heads/mask_scoring_roi_head.py | 113 + .../mmdet/models/roi_heads/pisa_roi_head.py | 160 + .../models/roi_heads/point_rend_roi_head.py | 393 +++ .../roi_heads/roi_extractors/__init__.py | 6 + .../roi_extractors/base_roi_extractor.py | 88 + .../roi_extractors/generic_roi_extractor.py | 84 + .../single_level_roi_extractor.py | 115 + .../mmdet/models/roi_heads/scnet_roi_head.py | 605 ++++ .../models/roi_heads/shared_heads/__init__.py | 4 + .../roi_heads/shared_heads/res_layer.py | 80 + .../mmdet/models/roi_heads/sparse_roi_head.py | 424 +++ .../models/roi_heads/standard_roi_head.py | 401 +++ .../mmdet/models/roi_heads/test_mixins.py | 311 ++ .../models/roi_heads/trident_roi_head.py | 120 + .../mmdet/models/seg_heads/__init__.py | 3 + .../models/seg_heads/base_semantic_head.py | 86 + .../models/seg_heads/panoptic_fpn_head.py | 155 + .../panoptic_fusion_heads/__init__.py | 5 + .../base_panoptic_fusion_head.py | 48 + .../heuristic_fusion_head.py | 126 + .../maskformer_fusion_head.py | 241 ++ .../mmdet/models/utils/__init__.py | 34 + .../mmdet/models/utils/brick_wrappers.py | 51 + .../mmdetection/mmdet/models/utils/builder.py | 47 + .../mmdet/models/utils/ckpt_convert.py | 137 + .../mmdet/models/utils/conv_upsample.py | 67 + .../mmdet/models/utils/csp_layer.py | 150 + .../mmdet/models/utils/gaussian_target.py | 268 ++ .../mmdet/models/utils/inverted_residual.py | 130 + .../mmdet/models/utils/make_divisible.py | 28 + .../mmdetection/mmdet/models/utils/misc.py | 72 + .../mmdet/models/utils/normed_predictor.py | 88 + .../models/utils/panoptic_gt_processing.py | 68 + .../mmdet/models/utils/point_sample.py | 87 + .../mmdet/models/utils/positional_encoding.py | 163 + .../mmdet/models/utils/res_layer.py | 190 ++ .../mmdet/models/utils/se_layer.py | 127 + .../mmdet/models/utils/transformer.py | 1167 +++++++ .../mmdetection/mmdet/utils/__init__.py | 17 + .../mmdetection/mmdet/utils/collect_env.py | 17 + .../mmdetection/mmdet/utils/compat_config.py | 139 + .../mmdet/utils/contextmanagers.py | 122 + downstream/mmdetection/mmdet/utils/logger.py | 65 + downstream/mmdetection/mmdet/utils/memory.py | 213 ++ downstream/mmdetection/mmdet/utils/misc.py | 76 + .../mmdetection/mmdet/utils/profiling.py | 40 + .../mmdet/utils/replace_cfg_vals.py | 70 + .../mmdetection/mmdet/utils/setup_env.py | 53 + .../mmdetection/mmdet/utils/split_batch.py | 45 + .../mmdet/utils/util_distribution.py | 74 + .../mmdetection/mmdet/utils/util_mixins.py | 105 + .../mmdetection/mmdet/utils/util_random.py | 34 + downstream/mmdetection/mmdet/version.py | 19 + downstream/mmdetection/model-index.yml | 72 + downstream/mmdetection/pytest.ini | 7 + downstream/mmdetection/requirements.txt | 4 + downstream/mmdetection/requirements/albu.txt | 1 + downstream/mmdetection/requirements/build.txt | 3 + downstream/mmdetection/requirements/docs.txt | 7 + .../mmdetection/requirements/mminstall.txt | 1 + .../mmdetection/requirements/optional.txt | 5 + .../mmdetection/requirements/readthedocs.txt | 3 + .../mmdetection/requirements/runtime.txt | 5 + downstream/mmdetection/requirements/tests.txt | 15 + downstream/mmdetection/setup.cfg | 21 + downstream/mmdetection/setup.py | 220 ++ .../tools/analysis_tools/analyze_logs.py | 204 ++ .../tools/analysis_tools/analyze_results.py | 365 +++ .../tools/analysis_tools/benchmark.py | 195 ++ .../analysis_tools/coco_error_analysis.py | 339 ++ .../tools/analysis_tools/confusion_matrix.py | 273 ++ .../tools/analysis_tools/eval_metric.py | 88 + .../tools/analysis_tools/get_flops.py | 97 + .../tools/analysis_tools/optimize_anchors.py | 376 +++ .../tools/analysis_tools/robustness_eval.py | 251 ++ .../tools/analysis_tools/test_robustness.py | 387 +++ .../tools/dataset_converters/cityscapes.py | 152 + .../tools/dataset_converters/images2coco.py | 101 + .../tools/dataset_converters/pascal_voc.py | 237 ++ .../tools/deployment/mmdet2torchserve.py | 110 + .../tools/deployment/mmdet_handler.py | 71 + .../tools/deployment/onnx2tensorrt.py | 266 ++ .../tools/deployment/pytorch2onnx.py | 357 ++ .../mmdetection/tools/deployment/test.py | 157 + .../tools/deployment/test_torchserver.py | 74 + downstream/mmdetection/tools/dist_test.sh | 22 + downstream/mmdetection/tools/dist_train.sh | 18 + .../mmdetection/tools/misc/browse_dataset.py | 137 + .../tools/misc/download_dataset.py | 102 + .../tools/misc/gen_coco_panoptic_test_info.py | 34 + .../mmdetection/tools/misc/get_image_metas.py | 116 + .../mmdetection/tools/misc/print_config.py | 60 + .../mmdetection/tools/misc/split_coco.py | 109 + .../model_converters/detectron2pytorch.py | 83 + .../tools/model_converters/publish_model.py | 43 + .../tools/model_converters/regnet2mmdet.py | 90 + .../tools/model_converters/selfsup2mmdet.py | 42 + .../model_converters/upgrade_model_version.py | 210 ++ .../model_converters/upgrade_ssd_version.py | 58 + downstream/mmdetection/tools/slurm_test.sh | 24 + downstream/mmdetection/tools/slurm_train.sh | 24 + downstream/mmdetection/tools/test.py | 247 ++ downstream/mmdetection/tools/train.py | 278 ++ .../mmsegmentation/.circleci/config.yml | 161 + .../mmsegmentation/.dev/batch_test_list.py | 133 + .../mmsegmentation/.dev/batch_train_list.txt | 19 + .../.dev/benchmark_evaluation.sh | 41 + .../.dev/benchmark_inference.py | 149 + .../mmsegmentation/.dev/benchmark_train.sh | 40 + downstream/mmsegmentation/.dev/check_urls.py | 101 + .../gather_benchmark_evaluation_results.py | 91 + .../.dev/gather_benchmark_train_results.py | 100 + .../mmsegmentation/.dev/gather_models.py | 211 ++ .../generate_benchmark_evaluation_script.py | 114 + .../.dev/generate_benchmark_train_script.py | 91 + .../.dev/log_collector/example_config.py | 18 + .../.dev/log_collector/log_collector.py | 143 + .../.dev/log_collector/readme.md | 143 + .../.dev/log_collector/utils.py | 20 + downstream/mmsegmentation/.dev/md2yml.py | 291 ++ .../mmsegmentation/.dev/upload_modelzoo.py | 45 + .../mmsegmentation/.github/CODE_OF_CONDUCT.md | 76 + .../mmsegmentation/.github/CONTRIBUTING.md | 58 + .../.github/ISSUE_TEMPLATE/config.yml | 6 + .../.github/ISSUE_TEMPLATE/error-report.md | 48 + .../.github/ISSUE_TEMPLATE/feature_request.md | 22 + .../ISSUE_TEMPLATE/general_questions.md | 8 + .../reimplementation_questions.md | 70 + .../.github/pull_request_template.md | 25 + .../.github/workflows/build.yml | 252 ++ .../.github/workflows/deploy.yml | 26 + .../mmsegmentation/.github/workflows/lint.yml | 31 + downstream/mmsegmentation/.gitignore | 119 + downstream/mmsegmentation/.owners.yml | 9 + .../mmsegmentation/.pre-commit-config.yaml | 57 + downstream/mmsegmentation/.readthedocs.yml | 9 + downstream/mmsegmentation/CITATION.cff | 8 + downstream/mmsegmentation/LICENSE | 203 ++ downstream/mmsegmentation/MANIFEST.in | 4 + downstream/mmsegmentation/README.md | 204 ++ .../configs/_base_/datasets/ade20k.py | 54 + .../configs/_base_/datasets/ade20k_640x640.py | 54 + .../configs/_base_/datasets/chase_db1.py | 59 + .../configs/_base_/datasets/cityscapes.py | 54 + .../_base_/datasets/cityscapes_1024x1024.py | 35 + .../_base_/datasets/cityscapes_768x768.py | 35 + .../_base_/datasets/cityscapes_769x769.py | 35 + .../_base_/datasets/cityscapes_832x832.py | 35 + .../configs/_base_/datasets/coco-stuff10k.py | 57 + .../configs/_base_/datasets/coco-stuff164k.py | 54 + .../configs/_base_/datasets/drive.py | 59 + .../configs/_base_/datasets/hrf.py | 59 + .../configs/_base_/datasets/isaid.py | 62 + .../configs/_base_/datasets/loveda.py | 54 + .../configs/_base_/datasets/pascal_context.py | 60 + .../_base_/datasets/pascal_context_59.py | 60 + .../configs/_base_/datasets/pascal_voc12.py | 57 + .../_base_/datasets/pascal_voc12_aug.py | 9 + .../configs/_base_/datasets/potsdam.py | 54 + .../configs/_base_/datasets/stare.py | 59 + .../configs/_base_/datasets/vaihingen.py | 54 + .../configs/_base_/default_runtime.py | 14 + .../configs/_base_/models/ann_r50-d8.py | 46 + .../configs/_base_/models/apcnet_r50-d8.py | 44 + .../_base_/models/bisenetv1_r18-d32.py | 68 + .../configs/_base_/models/bisenetv2.py | 80 + .../configs/_base_/models/ccnet_r50-d8.py | 44 + .../configs/_base_/models/cgnet.py | 35 + .../configs/_base_/models/danet_r50-d8.py | 44 + .../configs/_base_/models/deeplabv3_r50-d8.py | 44 + .../_base_/models/deeplabv3_unet_s5-d16.py | 50 + .../_base_/models/deeplabv3plus_r50-d8.py | 46 + .../configs/_base_/models/dmnet_r50-d8.py | 44 + .../configs/_base_/models/dnl_r50-d8.py | 46 + .../configs/_base_/models/dpt_vit-b16.py | 31 + .../configs/_base_/models/emanet_r50-d8.py | 47 + .../configs/_base_/models/encnet_r50-d8.py | 48 + .../configs/_base_/models/erfnet_fcn.py | 32 + .../configs/_base_/models/fast_scnn.py | 57 + .../_base_/models/fastfcn_r50-d32_jpu_psp.py | 53 + .../configs/_base_/models/fcn_hr18.py | 52 + .../configs/_base_/models/fcn_r50-d8.py | 45 + .../configs/_base_/models/fcn_unet_s5-d16.py | 51 + .../configs/_base_/models/fpn_r50.py | 36 + .../configs/_base_/models/gcnet_r50-d8.py | 46 + .../configs/_base_/models/icnet_r50-d8.py | 74 + .../configs/_base_/models/isanet_r50-d8.py | 45 + .../configs/_base_/models/lraspp_m-v3-d8.py | 25 + .../configs/_base_/models/nonlocal_r50-d8.py | 46 + .../configs/_base_/models/ocrnet_hr18.py | 68 + .../configs/_base_/models/ocrnet_r50-d8.py | 47 + .../configs/_base_/models/pointrend_r50.py | 56 + .../configs/_base_/models/psanet_r50-d8.py | 49 + .../configs/_base_/models/pspnet_r50-d8.py | 44 + .../_base_/models/pspnet_unet_s5-d16.py | 50 + .../configs/_base_/models/segformer_mit-b0.py | 34 + .../_base_/models/segmenter_vit-b16_mask.py | 36 + .../configs/_base_/models/setr_mla.py | 95 + .../configs/_base_/models/setr_naive.py | 80 + .../configs/_base_/models/setr_pup.py | 80 + .../configs/_base_/models/stdc.py | 83 + .../_base_/models/twins_pcpvt-s_fpn.py | 45 + .../_base_/models/twins_pcpvt-s_upernet.py | 53 + .../configs/_base_/models/upernet_beit.py | 50 + .../configs/_base_/models/upernet_convnext.py | 44 + .../configs/_base_/models/upernet_r50.py | 44 + .../configs/_base_/models/upernet_swin.py | 54 + .../_base_/models/upernet_vit-b16_ln_mln.py | 57 + .../configs/_base_/schedules/schedule_160k.py | 9 + .../configs/_base_/schedules/schedule_20k.py | 9 + .../configs/_base_/schedules/schedule_320k.py | 9 + .../configs/_base_/schedules/schedule_40k.py | 9 + .../configs/_base_/schedules/schedule_80k.py | 9 + .../configs/_base_/segformer/ade20k_repeat.py | 56 + .../_base_/segformer/default_runtime.py | 14 + .../_base_/segformer/schedule_160k_adamw.py | 9 + .../configs/_base_/segformer/segformer.py | 23 + .../mmsegmentation/configs/ann/README.md | 69 + downstream/mmsegmentation/configs/ann/ann.yml | 305 ++ .../ann_r101-d8_512x1024_40k_cityscapes.py | 2 + .../ann_r101-d8_512x1024_80k_cityscapes.py | 2 + .../ann/ann_r101-d8_512x512_160k_ade20k.py | 2 + .../ann/ann_r101-d8_512x512_20k_voc12aug.py | 2 + .../ann/ann_r101-d8_512x512_40k_voc12aug.py | 2 + .../ann/ann_r101-d8_512x512_80k_ade20k.py | 2 + .../ann/ann_r101-d8_769x769_40k_cityscapes.py | 2 + .../ann/ann_r101-d8_769x769_80k_cityscapes.py | 2 + .../ann/ann_r50-d8_512x1024_40k_cityscapes.py | 4 + .../ann/ann_r50-d8_512x1024_80k_cityscapes.py | 4 + .../ann/ann_r50-d8_512x512_160k_ade20k.py | 6 + .../ann/ann_r50-d8_512x512_20k_voc12aug.py | 6 + .../ann/ann_r50-d8_512x512_40k_voc12aug.py | 6 + .../ann/ann_r50-d8_512x512_80k_ade20k.py | 6 + .../ann/ann_r50-d8_769x769_40k_cityscapes.py | 9 + .../ann/ann_r50-d8_769x769_80k_cityscapes.py | 9 + .../mmsegmentation/configs/apcnet/README.md | 58 + .../mmsegmentation/configs/apcnet/apcnet.yml | 232 ++ .../apcnet_r101-d8_512x1024_40k_cityscapes.py | 2 + .../apcnet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../apcnet_r101-d8_512x512_160k_ade20k.py | 2 + .../apcnet_r101-d8_512x512_80k_ade20k.py | 2 + .../apcnet_r101-d8_769x769_40k_cityscapes.py | 2 + .../apcnet_r101-d8_769x769_80k_cityscapes.py | 2 + .../apcnet_r50-d8_512x1024_40k_cityscapes.py | 4 + .../apcnet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../apcnet_r50-d8_512x512_160k_ade20k.py | 6 + .../apcnet_r50-d8_512x512_80k_ade20k.py | 6 + .../apcnet_r50-d8_769x769_40k_cityscapes.py | 9 + .../apcnet_r50-d8_769x769_80k_cityscapes.py | 9 + .../mmsegmentation/configs/beit/README.md | 84 + .../mmsegmentation/configs/beit/beit.yml | 45 + ...pernet_beit-base_640x640_160k_ade20k_ms.py | 24 + ...ernet_beit-base_8x2_640x640_160k_ade20k.py | 30 + ..._beit-large_fp16_640x640_160k_ade20k_ms.py | 22 + ...beit-large_fp16_8x1_640x640_160k_ade20k.py | 47 + .../configs/bisenetv1/README.md | 63 + .../configs/bisenetv1/bisenetv1.yml | 234 ++ ..._lr5e-3_4x4_512x512_160k_coco-stuff164k.py | 6 + ..._lr5e-3_4x4_512x512_160k_coco-stuff164k.py | 18 + ...1_r18-d32_4x4_1024x1024_160k_cityscapes.py | 11 + ..._in1k-pre_4x4_1024x1024_160k_cityscapes.py | 16 + ..._in1k-pre_4x8_1024x1024_160k_cityscapes.py | 5 + ..._lr5e-3_4x4_512x512_160k_coco-stuff164k.py | 6 + ..._lr5e-3_4x4_512x512_160k_coco-stuff164k.py | 13 + ...1_r50-d32_4x4_1024x1024_160k_cityscapes.py | 42 + ..._in1k-pre_4x4_1024x1024_160k_cityscapes.py | 7 + ..._lr5e-3_4x4_512x512_160k_coco-stuff164k.py | 7 + ..._lr5e-3_4x4_512x512_160k_coco-stuff164k.py | 18 + .../configs/bisenetv2/README.md | 53 + .../configs/bisenetv2/bisenetv2.yml | 88 + ...netv2_fcn_4x4_1024x1024_160k_cityscapes.py | 11 + ...netv2_fcn_4x8_1024x1024_160k_cityscapes.py | 11 + ..._fcn_fp16_4x4_1024x1024_160k_cityscapes.py | 5 + ..._fcn_ohem_4x4_1024x1024_160k_cityscapes.py | 12 + .../mmsegmentation/configs/ccnet/README.md | 67 + .../mmsegmentation/configs/ccnet/ccnet.yml | 305 ++ .../ccnet_r101-d8_512x1024_40k_cityscapes.py | 2 + .../ccnet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../ccnet_r101-d8_512x512_160k_ade20k.py | 2 + .../ccnet_r101-d8_512x512_20k_voc12aug.py | 2 + .../ccnet_r101-d8_512x512_40k_voc12aug.py | 2 + .../ccnet/ccnet_r101-d8_512x512_80k_ade20k.py | 2 + .../ccnet_r101-d8_769x769_40k_cityscapes.py | 2 + .../ccnet_r101-d8_769x769_80k_cityscapes.py | 2 + .../ccnet_r50-d8_512x1024_40k_cityscapes.py | 4 + .../ccnet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../ccnet/ccnet_r50-d8_512x512_160k_ade20k.py | 6 + .../ccnet_r50-d8_512x512_20k_voc12aug.py | 7 + .../ccnet_r50-d8_512x512_40k_voc12aug.py | 7 + .../ccnet/ccnet_r50-d8_512x512_80k_ade20k.py | 6 + .../ccnet_r50-d8_769x769_40k_cityscapes.py | 9 + .../ccnet_r50-d8_769x769_80k_cityscapes.py | 9 + .../mmsegmentation/configs/cgnet/README.md | 45 + .../mmsegmentation/configs/cgnet/cgnet.yml | 59 + .../cgnet/cgnet_512x1024_60k_cityscapes.py | 66 + .../cgnet/cgnet_680x680_60k_cityscapes.py | 50 + .../mmsegmentation/configs/convnext/README.md | 71 + .../configs/convnext/convnext.yml | 133 + ..._convnext_base_fp16_512x512_160k_ade20k.py | 40 + ..._convnext_base_fp16_640x640_160k_ade20k.py | 55 + ...convnext_large_fp16_640x640_160k_ade20k.py | 55 + ...convnext_small_fp16_512x512_160k_ade20k.py | 54 + ..._convnext_tiny_fp16_512x512_160k_ade20k.py | 54 + ...onvnext_xlarge_fp16_640x640_160k_ade20k.py | 55 + .../mmsegmentation/configs/danet/README.md | 66 + .../mmsegmentation/configs/danet/danet.yml | 301 ++ .../danet_r101-d8_512x1024_40k_cityscapes.py | 2 + .../danet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../danet_r101-d8_512x512_160k_ade20k.py | 2 + .../danet_r101-d8_512x512_20k_voc12aug.py | 2 + .../danet_r101-d8_512x512_40k_voc12aug.py | 2 + .../danet/danet_r101-d8_512x512_80k_ade20k.py | 2 + .../danet_r101-d8_769x769_40k_cityscapes.py | 2 + .../danet_r101-d8_769x769_80k_cityscapes.py | 2 + .../danet_r50-d8_512x1024_40k_cityscapes.py | 4 + .../danet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../danet/danet_r50-d8_512x512_160k_ade20k.py | 6 + .../danet_r50-d8_512x512_20k_voc12aug.py | 7 + .../danet_r50-d8_512x512_40k_voc12aug.py | 7 + .../danet/danet_r50-d8_512x512_80k_ade20k.py | 6 + .../danet_r50-d8_769x769_40k_cityscapes.py | 9 + .../danet_r50-d8_769x769_80k_cityscapes.py | 9 + .../configs/deeplabv3/README.md | 116 + .../configs/deeplabv3/deeplabv3.yml | 756 +++++ ..._r101-d16-mg124_512x1024_40k_cityscapes.py | 11 + ..._r101-d16-mg124_512x1024_80k_cityscapes.py | 11 + ...abv3_r101-d8_480x480_40k_pascal_context.py | 2 + ...3_r101-d8_480x480_40k_pascal_context_59.py | 2 + ...abv3_r101-d8_480x480_80k_pascal_context.py | 2 + ...3_r101-d8_480x480_80k_pascal_context_59.py | 2 + ...eplabv3_r101-d8_512x1024_40k_cityscapes.py | 2 + ...eplabv3_r101-d8_512x1024_80k_cityscapes.py | 2 + .../deeplabv3_r101-d8_512x512_160k_ade20k.py | 2 + .../deeplabv3_r101-d8_512x512_20k_voc12aug.py | 2 + .../deeplabv3_r101-d8_512x512_40k_voc12aug.py | 2 + ...r101-d8_512x512_4x4_160k_coco-stuff164k.py | 2 + ...3_r101-d8_512x512_4x4_20k_coco-stuff10k.py | 2 + ...r101-d8_512x512_4x4_320k_coco-stuff164k.py | 2 + ...3_r101-d8_512x512_4x4_40k_coco-stuff10k.py | 2 + ..._r101-d8_512x512_4x4_80k_coco-stuff164k.py | 2 + .../deeplabv3_r101-d8_512x512_80k_ade20k.py | 2 + ...eeplabv3_r101-d8_769x769_40k_cityscapes.py | 2 + ...eeplabv3_r101-d8_769x769_80k_cityscapes.py | 2 + ...v3_r101-d8_fp16_512x1024_80k_cityscapes.py | 5 + ...plabv3_r101b-d8_512x1024_80k_cityscapes.py | 4 + ...eplabv3_r101b-d8_769x769_80k_cityscapes.py | 4 + ...eeplabv3_r18-d8_512x1024_80k_cityscapes.py | 9 + ...deeplabv3_r18-d8_769x769_80k_cityscapes.py | 9 + ...eplabv3_r18b-d8_512x1024_80k_cityscapes.py | 9 + ...eeplabv3_r18b-d8_769x769_80k_cityscapes.py | 9 + ...labv3_r50-d8_480x480_40k_pascal_context.py | 10 + ...v3_r50-d8_480x480_40k_pascal_context_59.py | 10 + ...labv3_r50-d8_480x480_80k_pascal_context.py | 10 + ...v3_r50-d8_480x480_80k_pascal_context_59.py | 10 + ...eeplabv3_r50-d8_512x1024_40k_cityscapes.py | 4 + ...eeplabv3_r50-d8_512x1024_80k_cityscapes.py | 4 + .../deeplabv3_r50-d8_512x512_160k_ade20k.py | 6 + .../deeplabv3_r50-d8_512x512_20k_voc12aug.py | 7 + .../deeplabv3_r50-d8_512x512_40k_voc12aug.py | 7 + ..._r50-d8_512x512_4x4_160k_coco-stuff164k.py | 7 + ...v3_r50-d8_512x512_4x4_20k_coco-stuff10k.py | 7 + ..._r50-d8_512x512_4x4_320k_coco-stuff164k.py | 7 + ...v3_r50-d8_512x512_4x4_40k_coco-stuff10k.py | 7 + ...3_r50-d8_512x512_4x4_80k_coco-stuff164k.py | 7 + .../deeplabv3_r50-d8_512x512_80k_ade20k.py | 6 + ...deeplabv3_r50-d8_769x769_40k_cityscapes.py | 9 + ...deeplabv3_r50-d8_769x769_80k_cityscapes.py | 9 + ...eplabv3_r50b-d8_512x1024_80k_cityscapes.py | 2 + ...eeplabv3_r50b-d8_769x769_80k_cityscapes.py | 2 + .../configs/deeplabv3plus/README.md | 129 + .../configs/deeplabv3plus/deeplabv3plus.yml | 850 +++++ ..._r101-d16-mg124_512x1024_40k_cityscapes.py | 11 + ..._r101-d16-mg124_512x1024_80k_cityscapes.py | 11 + ...plus_r101-d8_480x480_40k_pascal_context.py | 2 + ...s_r101-d8_480x480_40k_pascal_context_59.py | 2 + ...plus_r101-d8_480x480_80k_pascal_context.py | 2 + ...s_r101-d8_480x480_80k_pascal_context_59.py | 2 + ...3plus_r101-d8_4x4_512x512_80k_vaihingen.py | 2 + ...bv3plus_r101-d8_512x1024_40k_cityscapes.py | 2 + ...bv3plus_r101-d8_512x1024_80k_cityscapes.py | 2 + ...eplabv3plus_r101-d8_512x512_160k_ade20k.py | 2 + ...plabv3plus_r101-d8_512x512_20k_voc12aug.py | 2 + ...plabv3plus_r101-d8_512x512_40k_voc12aug.py | 2 + ...eeplabv3plus_r101-d8_512x512_80k_ade20k.py | 2 + ...eeplabv3plus_r101-d8_512x512_80k_loveda.py | 6 + ...eplabv3plus_r101-d8_512x512_80k_potsdam.py | 2 + ...abv3plus_r101-d8_769x769_40k_cityscapes.py | 2 + ...abv3plus_r101-d8_769x769_80k_cityscapes.py | 2 + ...us_r101-d8_fp16_512x1024_80k_cityscapes.py | 5 + ...v3plus_r101b-d8_512x1024_80k_cityscapes.py | 4 + ...bv3plus_r101b-d8_769x769_80k_cityscapes.py | 4 + ...v3plus_r18-d8_4x4_512x512_80k_vaihingen.py | 11 + ...plabv3plus_r18-d8_4x4_896x896_80k_isaid.py | 11 + ...abv3plus_r18-d8_512x1024_80k_cityscapes.py | 11 + ...deeplabv3plus_r18-d8_512x512_80k_loveda.py | 13 + ...eeplabv3plus_r18-d8_512x512_80k_potsdam.py | 11 + ...labv3plus_r18-d8_769x769_80k_cityscapes.py | 11 + ...bv3plus_r18b-d8_512x1024_80k_cityscapes.py | 11 + ...abv3plus_r18b-d8_769x769_80k_cityscapes.py | 11 + ...3plus_r50-d8_480x480_40k_pascal_context.py | 10 + ...us_r50-d8_480x480_40k_pascal_context_59.py | 10 + ...3plus_r50-d8_480x480_80k_pascal_context.py | 10 + ...us_r50-d8_480x480_80k_pascal_context_59.py | 10 + ...v3plus_r50-d8_4x4_512x512_80k_vaihingen.py | 7 + ...plabv3plus_r50-d8_4x4_896x896_80k_isaid.py | 6 + ...abv3plus_r50-d8_512x1024_40k_cityscapes.py | 5 + ...abv3plus_r50-d8_512x1024_80k_cityscapes.py | 5 + ...eeplabv3plus_r50-d8_512x512_160k_ade20k.py | 6 + ...eplabv3plus_r50-d8_512x512_20k_voc12aug.py | 7 + ...eplabv3plus_r50-d8_512x512_40k_voc12aug.py | 7 + ...deeplabv3plus_r50-d8_512x512_80k_ade20k.py | 6 + ...deeplabv3plus_r50-d8_512x512_80k_loveda.py | 6 + ...eeplabv3plus_r50-d8_512x512_80k_potsdam.py | 7 + ...labv3plus_r50-d8_769x769_40k_cityscapes.py | 9 + ...labv3plus_r50-d8_769x769_80k_cityscapes.py | 9 + ...bv3plus_r50b-d8_512x1024_80k_cityscapes.py | 2 + ...abv3plus_r50b-d8_769x769_80k_cityscapes.py | 2 + .../mmsegmentation/configs/dmnet/README.md | 58 + .../mmsegmentation/configs/dmnet/dmnet.yml | 232 ++ .../dmnet_r101-d8_512x1024_40k_cityscapes.py | 2 + .../dmnet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../dmnet_r101-d8_512x512_160k_ade20k.py | 2 + .../dmnet/dmnet_r101-d8_512x512_80k_ade20k.py | 2 + .../dmnet_r101-d8_769x769_40k_cityscapes.py | 2 + .../dmnet_r101-d8_769x769_80k_cityscapes.py | 2 + .../dmnet_r50-d8_512x1024_40k_cityscapes.py | 4 + .../dmnet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../dmnet/dmnet_r50-d8_512x512_160k_ade20k.py | 6 + .../dmnet/dmnet_r50-d8_512x512_80k_ade20k.py | 6 + .../dmnet_r50-d8_769x769_40k_cityscapes.py | 9 + .../dmnet_r50-d8_769x769_80k_cityscapes.py | 9 + .../mmsegmentation/configs/dnlnet/README.md | 61 + .../dnl_r101-d8_512x1024_40k_cityscapes.py | 2 + .../dnl_r101-d8_512x1024_80k_cityscapes.py | 2 + .../dnlnet/dnl_r101-d8_512x512_160k_ade20k.py | 2 + .../dnlnet/dnl_r101-d8_512x512_80k_ade20k.py | 2 + .../dnl_r101-d8_769x769_40k_cityscapes.py | 2 + .../dnl_r101-d8_769x769_80k_cityscapes.py | 2 + .../dnl_r50-d8_512x1024_40k_cityscapes.py | 4 + .../dnl_r50-d8_512x1024_80k_cityscapes.py | 4 + .../dnlnet/dnl_r50-d8_512x512_160k_ade20k.py | 6 + .../dnlnet/dnl_r50-d8_512x512_80k_ade20k.py | 6 + .../dnl_r50-d8_769x769_40k_cityscapes.py | 9 + .../dnl_r50-d8_769x769_80k_cityscapes.py | 12 + .../mmsegmentation/configs/dnlnet/dnlnet.yml | 228 ++ .../mmsegmentation/configs/dpt/README.md | 66 + downstream/mmsegmentation/configs/dpt/dpt.yml | 37 + .../dpt/dpt_vit-b16_512x512_160k_ade20k.py | 32 + .../mmsegmentation/configs/emanet/README.md | 45 + .../mmsegmentation/configs/emanet/emanet.yml | 103 + .../emanet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../emanet_r101-d8_769x769_80k_cityscapes.py | 2 + .../emanet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../emanet_r50-d8_769x769_80k_cityscapes.py | 9 + .../mmsegmentation/configs/encnet/README.md | 58 + .../mmsegmentation/configs/encnet/encnet.yml | 232 ++ .../encnet_r101-d8_512x1024_40k_cityscapes.py | 2 + .../encnet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../encnet_r101-d8_512x512_160k_ade20k.py | 2 + .../encnet_r101-d8_512x512_20k_voc12aug.py | 2 + .../encnet_r101-d8_512x512_40k_voc12aug.py | 2 + .../encnet_r101-d8_512x512_80k_ade20k.py | 2 + .../encnet_r101-d8_769x769_40k_cityscapes.py | 2 + .../encnet_r101-d8_769x769_80k_cityscapes.py | 2 + .../encnet_r50-d8_512x1024_40k_cityscapes.py | 4 + .../encnet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../encnet_r50-d8_512x512_160k_ade20k.py | 6 + .../encnet_r50-d8_512x512_20k_voc12aug.py | 7 + .../encnet_r50-d8_512x512_40k_voc12aug.py | 7 + .../encnet_r50-d8_512x512_80k_ade20k.py | 6 + .../encnet_r50-d8_769x769_40k_cityscapes.py | 9 + .../encnet_r50-d8_769x769_80k_cityscapes.py | 9 + .../encnet_r50s-d8_512x512_80k_ade20k.py | 8 + .../mmsegmentation/configs/erfnet/README.md | 51 + .../mmsegmentation/configs/erfnet/erfnet.yml | 37 + ...erfnet_fcn_4x4_512x1024_160k_cityscapes.py | 8 + .../mmsegmentation/configs/fastfcn/README.md | 62 + .../configs/fastfcn/fastfcn.yml | 235 ++ ...32_jpu_aspp_4x4_512x1024_80k_cityscapes.py | 6 + ...50-d32_jpu_aspp_512x1024_80k_cityscapes.py | 20 + ...cn_r50-d32_jpu_aspp_512x512_160k_ade20k.py | 20 + ...fcn_r50-d32_jpu_aspp_512x512_80k_ade20k.py | 20 + ...d32_jpu_enc_4x4_512x1024_80k_cityscapes.py | 6 + ...r50-d32_jpu_enc_512x1024_80k_cityscapes.py | 24 + ...fcn_r50-d32_jpu_enc_512x512_160k_ade20k.py | 24 + ...tfcn_r50-d32_jpu_enc_512x512_80k_ade20k.py | 24 + ...d32_jpu_psp_4x4_512x1024_80k_cityscapes.py | 9 + ...r50-d32_jpu_psp_512x1024_80k_cityscapes.py | 5 + ...fcn_r50-d32_jpu_psp_512x512_160k_ade20k.py | 7 + ...tfcn_r50-d32_jpu_psp_512x512_80k_ade20k.py | 7 + .../mmsegmentation/configs/fastscnn/README.md | 41 + .../fast_scnn_lr0.12_8x4_160k_cityscapes.py | 10 + .../configs/fastscnn/fastscnn.yml | 35 + .../mmsegmentation/configs/fcn/README.md | 110 + downstream/mmsegmentation/configs/fcn/fcn.yml | 827 +++++ ...fcn_d6_r101-d16_512x1024_40k_cityscapes.py | 2 + ...fcn_d6_r101-d16_512x1024_80k_cityscapes.py | 2 + .../fcn_d6_r101-d16_769x769_40k_cityscapes.py | 2 + .../fcn_d6_r101-d16_769x769_80k_cityscapes.py | 2 + ...cn_d6_r101b-d16_512x1024_80k_cityscapes.py | 4 + ...fcn_d6_r101b-d16_769x769_80k_cityscapes.py | 4 + .../fcn_d6_r50-d16_512x1024_40k_cityscapes.py | 8 + .../fcn_d6_r50-d16_512x1024_80k_cityscapes.py | 8 + .../fcn_d6_r50-d16_769x769_40k_cityscapes.py | 10 + .../fcn_d6_r50-d16_769x769_80k_cityscapes.py | 10 + ...fcn_d6_r50b-d16_512x1024_80k_cityscapes.py | 2 + .../fcn_d6_r50b-d16_769x769_80k_cityscapes.py | 2 + .../fcn_r101-d8_480x480_40k_pascal_context.py | 2 + ...n_r101-d8_480x480_40k_pascal_context_59.py | 2 + .../fcn_r101-d8_480x480_80k_pascal_context.py | 2 + ...n_r101-d8_480x480_80k_pascal_context_59.py | 2 + .../fcn_r101-d8_512x1024_40k_cityscapes.py | 2 + .../fcn_r101-d8_512x1024_80k_cityscapes.py | 2 + .../fcn/fcn_r101-d8_512x512_160k_ade20k.py | 2 + .../fcn/fcn_r101-d8_512x512_20k_voc12aug.py | 2 + .../fcn/fcn_r101-d8_512x512_40k_voc12aug.py | 2 + .../fcn/fcn_r101-d8_512x512_80k_ade20k.py | 2 + .../fcn/fcn_r101-d8_769x769_40k_cityscapes.py | 2 + .../fcn/fcn_r101-d8_769x769_80k_cityscapes.py | 2 + ...cn_r101-d8_fp16_512x1024_80k_cityscapes.py | 5 + .../fcn_r101b-d8_512x1024_80k_cityscapes.py | 4 + .../fcn_r101b-d8_769x769_80k_cityscapes.py | 4 + .../fcn/fcn_r18-d8_512x1024_80k_cityscapes.py | 9 + .../fcn/fcn_r18-d8_769x769_80k_cityscapes.py | 9 + .../fcn_r18b-d8_512x1024_80k_cityscapes.py | 9 + .../fcn/fcn_r18b-d8_769x769_80k_cityscapes.py | 9 + .../fcn_r50-d8_480x480_40k_pascal_context.py | 9 + ...cn_r50-d8_480x480_40k_pascal_context_59.py | 10 + .../fcn_r50-d8_480x480_80k_pascal_context.py | 9 + ...cn_r50-d8_480x480_80k_pascal_context_59.py | 10 + .../fcn/fcn_r50-d8_512x1024_40k_cityscapes.py | 4 + .../fcn/fcn_r50-d8_512x1024_80k_cityscapes.py | 4 + .../fcn/fcn_r50-d8_512x512_160k_ade20k.py | 6 + .../fcn/fcn_r50-d8_512x512_20k_voc12aug.py | 6 + .../fcn/fcn_r50-d8_512x512_40k_voc12aug.py | 6 + .../fcn/fcn_r50-d8_512x512_80k_ade20k.py | 6 + .../fcn/fcn_r50-d8_769x769_40k_cityscapes.py | 9 + .../fcn/fcn_r50-d8_769x769_80k_cityscapes.py | 9 + .../fcn_r50b-d8_512x1024_80k_cityscapes.py | 2 + .../fcn/fcn_r50b-d8_769x769_80k_cityscapes.py | 2 + .../mmsegmentation/configs/gcnet/README.md | 67 + .../mmsegmentation/configs/gcnet/gcnet.yml | 305 ++ .../gcnet_r101-d8_512x1024_40k_cityscapes.py | 2 + .../gcnet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../gcnet_r101-d8_512x512_160k_ade20k.py | 2 + .../gcnet_r101-d8_512x512_20k_voc12aug.py | 2 + .../gcnet_r101-d8_512x512_40k_voc12aug.py | 2 + .../gcnet/gcnet_r101-d8_512x512_80k_ade20k.py | 2 + .../gcnet_r101-d8_769x769_40k_cityscapes.py | 2 + .../gcnet_r101-d8_769x769_80k_cityscapes.py | 2 + .../gcnet_r50-d8_512x1024_40k_cityscapes.py | 4 + .../gcnet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../gcnet/gcnet_r50-d8_512x512_160k_ade20k.py | 6 + .../gcnet_r50-d8_512x512_20k_voc12aug.py | 7 + .../gcnet_r50-d8_512x512_40k_voc12aug.py | 7 + .../gcnet/gcnet_r50-d8_512x512_80k_ade20k.py | 6 + .../gcnet_r50-d8_769x769_40k_cityscapes.py | 9 + .../gcnet_r50-d8_769x769_80k_cityscapes.py | 9 + .../configs/gpvit/gpvit_l1_segformer.py | 75 + .../configs/gpvit/gpvit_l1_upernet.py | 85 + .../configs/gpvit/gpvit_l2_segformer.py | 75 + .../configs/gpvit/gpvit_l2_upernet.py | 85 + .../configs/gpvit/gpvit_l3_segformer.py | 75 + .../configs/gpvit/gpvit_l3_upernet.py | 85 + .../configs/gpvit/gpvit_l4_segformer.py | 75 + .../configs/gpvit/gpvit_l4_upernet.py | 85 + .../mmsegmentation/configs/hrnet/README.md | 121 + .../fcn_hr18_480x480_40k_pascal_context.py | 8 + .../fcn_hr18_480x480_40k_pascal_context_59.py | 8 + .../fcn_hr18_480x480_80k_pascal_context.py | 8 + .../fcn_hr18_480x480_80k_pascal_context_59.py | 8 + .../fcn_hr18_4x4_512x512_80k_vaihingen.py | 5 + .../hrnet/fcn_hr18_4x4_896x896_80k_isaid.py | 5 + .../fcn_hr18_512x1024_160k_cityscapes.py | 4 + .../hrnet/fcn_hr18_512x1024_40k_cityscapes.py | 4 + .../hrnet/fcn_hr18_512x1024_80k_cityscapes.py | 4 + .../hrnet/fcn_hr18_512x512_160k_ade20k.py | 5 + .../hrnet/fcn_hr18_512x512_20k_voc12aug.py | 5 + .../hrnet/fcn_hr18_512x512_40k_voc12aug.py | 5 + .../hrnet/fcn_hr18_512x512_80k_ade20k.py | 5 + .../hrnet/fcn_hr18_512x512_80k_loveda.py | 5 + .../hrnet/fcn_hr18_512x512_80k_potsdam.py | 5 + .../fcn_hr18s_480x480_40k_pascal_context.py | 9 + ...fcn_hr18s_480x480_40k_pascal_context_59.py | 9 + .../fcn_hr18s_480x480_80k_pascal_context.py | 9 + ...fcn_hr18s_480x480_80k_pascal_context_59.py | 9 + .../fcn_hr18s_4x4_512x512_80k_vaihingen.py | 9 + .../hrnet/fcn_hr18s_4x4_896x896_80k_isaid.py | 9 + .../fcn_hr18s_512x1024_160k_cityscapes.py | 9 + .../fcn_hr18s_512x1024_40k_cityscapes.py | 9 + .../fcn_hr18s_512x1024_80k_cityscapes.py | 9 + .../hrnet/fcn_hr18s_512x512_160k_ade20k.py | 9 + .../hrnet/fcn_hr18s_512x512_20k_voc12aug.py | 9 + .../hrnet/fcn_hr18s_512x512_40k_voc12aug.py | 9 + .../hrnet/fcn_hr18s_512x512_80k_ade20k.py | 9 + .../hrnet/fcn_hr18s_512x512_80k_loveda.py | 11 + .../hrnet/fcn_hr18s_512x512_80k_potsdam.py | 9 + .../fcn_hr48_480x480_40k_pascal_context.py | 10 + .../fcn_hr48_480x480_40k_pascal_context_59.py | 10 + .../fcn_hr48_480x480_80k_pascal_context.py | 10 + .../fcn_hr48_480x480_80k_pascal_context_59.py | 10 + .../fcn_hr48_4x4_512x512_80k_vaihingen.py | 10 + .../hrnet/fcn_hr48_4x4_896x896_80k_isaid.py | 10 + .../fcn_hr48_512x1024_160k_cityscapes.py | 10 + .../hrnet/fcn_hr48_512x1024_40k_cityscapes.py | 10 + .../hrnet/fcn_hr48_512x1024_80k_cityscapes.py | 10 + .../hrnet/fcn_hr48_512x512_160k_ade20k.py | 10 + .../hrnet/fcn_hr48_512x512_20k_voc12aug.py | 10 + .../hrnet/fcn_hr48_512x512_40k_voc12aug.py | 10 + .../hrnet/fcn_hr48_512x512_80k_ade20k.py | 10 + .../hrnet/fcn_hr48_512x512_80k_loveda.py | 11 + .../hrnet/fcn_hr48_512x512_80k_potsdam.py | 10 + .../mmsegmentation/configs/hrnet/hrnet.yml | 695 ++++ .../mmsegmentation/configs/icnet/README.md | 55 + .../mmsegmentation/configs/icnet/icnet.yml | 207 ++ .../icnet_r101-d8_832x832_160k_cityscapes.py | 2 + .../icnet_r101-d8_832x832_80k_cityscapes.py | 2 + ...101-d8_in1k-pre_832x832_160k_cityscapes.py | 7 + ...r101-d8_in1k-pre_832x832_80k_cityscapes.py | 7 + .../icnet_r18-d8_832x832_160k_cityscapes.py | 3 + .../icnet_r18-d8_832x832_80k_cityscapes.py | 3 + ...r18-d8_in1k-pre_832x832_160k_cityscapes.py | 8 + ..._r18-d8_in1k-pre_832x832_80k_cityscapes.py | 8 + .../icnet_r50-d8_832x832_160k_cityscapes.py | 5 + .../icnet_r50-d8_832x832_80k_cityscapes.py | 5 + ...r50-d8_in1k-pre_832x832_160k_cityscapes.py | 6 + ..._r50-d8_in1k-pre_832x832_80k_cityscapes.py | 6 + .../mmsegmentation/configs/isanet/README.md | 79 + .../mmsegmentation/configs/isanet/isanet.yml | 369 +++ .../isanet_r101-d8_512x1024_40k_cityscapes.py | 2 + .../isanet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../isanet_r101-d8_512x512_160k_ade20k.py | 2 + .../isanet_r101-d8_512x512_20k_voc12aug.py | 2 + .../isanet_r101-d8_512x512_40k_voc12aug.py | 2 + .../isanet_r101-d8_512x512_80k_ade20k.py | 2 + .../isanet_r101-d8_769x769_40k_cityscapes.py | 2 + .../isanet_r101-d8_769x769_80k_cityscapes.py | 2 + .../isanet_r50-d8_512x1024_40k_cityscapes.py | 4 + .../isanet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../isanet_r50-d8_512x512_160k_ade20k.py | 6 + .../isanet_r50-d8_512x512_20k_voc12aug.py | 7 + .../isanet_r50-d8_512x512_40k_voc12aug.py | 7 + .../isanet_r50-d8_512x512_80k_ade20k.py | 6 + .../isanet_r50-d8_769x769_40k_cityscapes.py | 9 + .../isanet_r50-d8_769x769_80k_cityscapes.py | 9 + .../mmsegmentation/configs/knet/README.md | 49 + .../mmsegmentation/configs/knet/knet.yml | 169 + ...bv3_r50-d8_8x2_512x512_adamw_80k_ade20k.py | 93 + ...fcn_r50-d8_8x2_512x512_adamw_80k_ade20k.py | 93 + ...net_r50-d8_8x2_512x512_adamw_80k_ade20k.py | 92 + ...net_r50-d8_8x2_512x512_adamw_80k_ade20k.py | 93 + ...net_swin-l_8x2_512x512_adamw_80k_ade20k.py | 19 + ...net_swin-l_8x2_640x640_adamw_80k_ade20k.py | 54 + ...net_swin-t_8x2_512x512_adamw_80k_ade20k.py | 57 + .../configs/mobilenet_v2/README.md | 55 + ...eplabv3_m-v2-d8_512x1024_80k_cityscapes.py | 12 + .../deeplabv3_m-v2-d8_512x512_160k_ade20k.py | 12 + ...bv3plus_m-v2-d8_512x1024_80k_cityscapes.py | 12 + ...eplabv3plus_m-v2-d8_512x512_160k_ade20k.py | 12 + .../fcn_m-v2-d8_512x1024_80k_cityscapes.py | 12 + .../fcn_m-v2-d8_512x512_160k_ade20k.py | 12 + .../configs/mobilenet_v2/mobilenet_v2.yml | 169 + .../pspnet_m-v2-d8_512x1024_80k_cityscapes.py | 12 + .../pspnet_m-v2-d8_512x512_160k_ade20k.py | 12 + .../configs/mobilenet_v3/README.md | 47 + ...lraspp_m-v3-d8_512x1024_320k_cityscapes.py | 11 + ...-v3-d8_scratch_512x1024_320k_cityscapes.py | 9 + ...raspp_m-v3s-d8_512x1024_320k_cityscapes.py | 23 + ...v3s-d8_scratch_512x1024_320k_cityscapes.py | 22 + .../configs/mobilenet_v3/mobilenet_v3.yml | 89 + .../configs/nonlocal_net/README.md | 67 + .../configs/nonlocal_net/nonlocal_net.yml | 301 ++ ...onlocal_r101-d8_512x1024_40k_cityscapes.py | 2 + ...onlocal_r101-d8_512x1024_80k_cityscapes.py | 2 + .../nonlocal_r101-d8_512x512_160k_ade20k.py | 2 + .../nonlocal_r101-d8_512x512_20k_voc12aug.py | 2 + .../nonlocal_r101-d8_512x512_40k_voc12aug.py | 2 + .../nonlocal_r101-d8_512x512_80k_ade20k.py | 2 + ...nonlocal_r101-d8_769x769_40k_cityscapes.py | 2 + ...nonlocal_r101-d8_769x769_80k_cityscapes.py | 2 + ...nonlocal_r50-d8_512x1024_40k_cityscapes.py | 4 + ...nonlocal_r50-d8_512x1024_80k_cityscapes.py | 4 + .../nonlocal_r50-d8_512x512_160k_ade20k.py | 6 + .../nonlocal_r50-d8_512x512_20k_voc12aug.py | 7 + .../nonlocal_r50-d8_512x512_40k_voc12aug.py | 7 + .../nonlocal_r50-d8_512x512_80k_ade20k.py | 6 + .../nonlocal_r50-d8_769x769_40k_cityscapes.py | 9 + .../nonlocal_r50-d8_769x769_80k_cityscapes.py | 9 + .../mmsegmentation/configs/ocrnet/README.md | 88 + .../mmsegmentation/configs/ocrnet/ocrnet.yml | 438 +++ .../ocrnet_hr18_512x1024_160k_cityscapes.py | 4 + .../ocrnet_hr18_512x1024_40k_cityscapes.py | 4 + .../ocrnet_hr18_512x1024_80k_cityscapes.py | 4 + .../ocrnet/ocrnet_hr18_512x512_160k_ade20k.py | 35 + .../ocrnet_hr18_512x512_20k_voc12aug.py | 36 + .../ocrnet_hr18_512x512_40k_voc12aug.py | 36 + .../ocrnet/ocrnet_hr18_512x512_80k_ade20k.py | 35 + .../ocrnet_hr18s_512x1024_160k_cityscapes.py | 9 + .../ocrnet_hr18s_512x1024_40k_cityscapes.py | 9 + .../ocrnet_hr18s_512x1024_80k_cityscapes.py | 9 + .../ocrnet_hr18s_512x512_160k_ade20k.py | 9 + .../ocrnet_hr18s_512x512_20k_voc12aug.py | 9 + .../ocrnet_hr18s_512x512_40k_voc12aug.py | 9 + .../ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py | 9 + .../ocrnet_hr48_512x1024_160k_cityscapes.py | 39 + .../ocrnet_hr48_512x1024_40k_cityscapes.py | 39 + .../ocrnet_hr48_512x1024_80k_cityscapes.py | 39 + .../ocrnet/ocrnet_hr48_512x512_160k_ade20k.py | 39 + .../ocrnet_hr48_512x512_20k_voc12aug.py | 39 + .../ocrnet_hr48_512x512_40k_voc12aug.py | 39 + .../ocrnet/ocrnet_hr48_512x512_80k_ade20k.py | 39 + ...net_r101-d8_512x1024_40k_b16_cityscapes.py | 7 + ...rnet_r101-d8_512x1024_40k_b8_cityscapes.py | 5 + ...net_r101-d8_512x1024_80k_b16_cityscapes.py | 7 + .../configs/point_rend/README.md | 50 + .../configs/point_rend/point_rend.yml | 104 + .../pointrend_r101_512x1024_80k_cityscapes.py | 2 + .../pointrend_r101_512x512_160k_ade20k.py | 2 + .../pointrend_r50_512x1024_80k_cityscapes.py | 5 + .../pointrend_r50_512x512_160k_ade20k.py | 32 + .../mmsegmentation/configs/psanet/README.md | 67 + .../mmsegmentation/configs/psanet/psanet.yml | 305 ++ .../psanet_r101-d8_512x1024_40k_cityscapes.py | 2 + .../psanet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../psanet_r101-d8_512x512_160k_ade20k.py | 2 + .../psanet_r101-d8_512x512_20k_voc12aug.py | 2 + .../psanet_r101-d8_512x512_40k_voc12aug.py | 2 + .../psanet_r101-d8_512x512_80k_ade20k.py | 2 + .../psanet_r101-d8_769x769_40k_cityscapes.py | 2 + .../psanet_r101-d8_769x769_80k_cityscapes.py | 2 + .../psanet_r50-d8_512x1024_40k_cityscapes.py | 4 + .../psanet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../psanet_r50-d8_512x512_160k_ade20k.py | 7 + .../psanet_r50-d8_512x512_20k_voc12aug.py | 7 + .../psanet_r50-d8_512x512_40k_voc12aug.py | 7 + .../psanet_r50-d8_512x512_80k_ade20k.py | 7 + .../psanet_r50-d8_769x769_40k_cityscapes.py | 9 + .../psanet_r50-d8_769x769_80k_cityscapes.py | 9 + .../mmsegmentation/configs/pspnet/README.md | 177 + .../mmsegmentation/configs/pspnet/pspnet.yml | 1077 ++++++ ...pnet_r101-d8_480x480_40k_pascal_context.py | 2 + ...t_r101-d8_480x480_40k_pascal_context_59.py | 2 + ...pnet_r101-d8_480x480_80k_pascal_context.py | 2 + ...t_r101-d8_480x480_80k_pascal_context_59.py | 2 + .../pspnet_r101-d8_4x4_512x512_80k_potsdam.py | 2 + ...spnet_r101-d8_4x4_512x512_80k_vaihingen.py | 2 + .../pspnet_r101-d8_512x1024_40k_cityscapes.py | 2 + .../pspnet_r101-d8_512x1024_40k_dark.py | 2 + ...pnet_r101-d8_512x1024_40k_night_driving.py | 2 + .../pspnet_r101-d8_512x1024_80k_cityscapes.py | 2 + .../pspnet_r101-d8_512x512_160k_ade20k.py | 2 + .../pspnet_r101-d8_512x512_20k_voc12aug.py | 2 + .../pspnet_r101-d8_512x512_40k_voc12aug.py | 2 + ...r101-d8_512x512_4x4_160k_coco-stuff164k.py | 2 + ...t_r101-d8_512x512_4x4_20k_coco-stuff10k.py | 2 + ...r101-d8_512x512_4x4_320k_coco-stuff164k.py | 2 + ...t_r101-d8_512x512_4x4_40k_coco-stuff10k.py | 2 + ..._r101-d8_512x512_4x4_80k_coco-stuff164k.py | 2 + .../pspnet_r101-d8_512x512_80k_ade20k.py | 2 + .../pspnet_r101-d8_512x512_80k_loveda.py | 6 + .../pspnet_r101-d8_769x769_40k_cityscapes.py | 2 + .../pspnet_r101-d8_769x769_80k_cityscapes.py | 2 + ...et_r101-d8_fp16_512x1024_80k_cityscapes.py | 5 + ...pspnet_r101b-d8_512x1024_80k_cityscapes.py | 4 + .../pspnet_r101b-d8_512x1024_80k_dark.py | 4 + ...net_r101b-d8_512x1024_80k_night_driving.py | 4 + .../pspnet_r101b-d8_769x769_80k_cityscapes.py | 4 + .../pspnet_r18-d8_4x4_512x512_80k_potsdam.py | 9 + ...pspnet_r18-d8_4x4_512x512_80k_vaihingen.py | 9 + .../pspnet_r18-d8_4x4_896x896_80k_isaid.py | 9 + .../pspnet_r18-d8_512x1024_80k_cityscapes.py | 9 + .../pspnet_r18-d8_512x512_80k_loveda.py | 11 + .../pspnet_r18-d8_769x769_80k_cityscapes.py | 9 + .../pspnet_r18b-d8_512x1024_80k_cityscapes.py | 9 + .../pspnet_r18b-d8_769x769_80k_cityscapes.py | 9 + .../pspnet_r50-d32_512x1024_80k_cityscapes.py | 5 + ...-pretrain_512x1024_adamw_80k_cityscapes.py | 25 + ...spnet_r50-d8_480x480_40k_pascal_context.py | 10 + ...et_r50-d8_480x480_40k_pascal_context_59.py | 10 + ...spnet_r50-d8_480x480_80k_pascal_context.py | 10 + ...et_r50-d8_480x480_80k_pascal_context_59.py | 10 + .../pspnet_r50-d8_4x4_512x512_80k_potsdam.py | 6 + ...pspnet_r50-d8_4x4_512x512_80k_vaihingen.py | 6 + .../pspnet_r50-d8_4x4_896x896_80k_isaid.py | 6 + .../pspnet_r50-d8_512x1024_40k_cityscapes.py | 4 + .../pspnet/pspnet_r50-d8_512x1024_40k_dark.py | 29 + ...spnet_r50-d8_512x1024_40k_night_driving.py | 29 + .../pspnet_r50-d8_512x1024_80k_cityscapes.py | 4 + .../pspnet/pspnet_r50-d8_512x1024_80k_dark.py | 30 + ...spnet_r50-d8_512x1024_80k_night_driving.py | 29 + .../pspnet_r50-d8_512x512_160k_ade20k.py | 6 + .../pspnet_r50-d8_512x512_20k_voc12aug.py | 7 + .../pspnet_r50-d8_512x512_40k_voc12aug.py | 7 + ..._r50-d8_512x512_4x4_160k_coco-stuff164k.py | 7 + ...et_r50-d8_512x512_4x4_20k_coco-stuff10k.py | 6 + ..._r50-d8_512x512_4x4_320k_coco-stuff164k.py | 7 + ...et_r50-d8_512x512_4x4_40k_coco-stuff10k.py | 6 + ...t_r50-d8_512x512_4x4_80k_coco-stuff164k.py | 7 + .../pspnet_r50-d8_512x512_80k_ade20k.py | 6 + .../pspnet_r50-d8_512x512_80k_loveda.py | 6 + .../pspnet_r50-d8_769x769_40k_cityscapes.py | 9 + .../pspnet_r50-d8_769x769_80k_cityscapes.py | 9 + ...-pretrain_512x1024_adamw_80k_cityscapes.py | 23 + ...pspnet_r50b-d32_512x1024_80k_cityscapes.py | 7 + .../pspnet_r50b-d8_512x1024_80k_cityscapes.py | 2 + .../pspnet_r50b-d8_769x769_80k_cityscapes.py | 2 + .../mmsegmentation/configs/resnest/README.md | 53 + ...eplabv3_s101-d8_512x1024_80k_cityscapes.py | 9 + .../deeplabv3_s101-d8_512x512_160k_ade20k.py | 9 + ...bv3plus_s101-d8_512x1024_80k_cityscapes.py | 9 + ...eplabv3plus_s101-d8_512x512_160k_ade20k.py | 9 + .../fcn_s101-d8_512x1024_80k_cityscapes.py | 9 + .../fcn_s101-d8_512x512_160k_ade20k.py | 9 + .../pspnet_s101-d8_512x1024_80k_cityscapes.py | 9 + .../pspnet_s101-d8_512x512_160k_ade20k.py | 9 + .../configs/resnest/resnest.yml | 177 + .../configs/segformer/README.md | 107 + .../configs/segformer/segformer.yml | 303 ++ .../segformer_mit-b0_512x512_160k_ade20k.py | 33 + ...er_mit-b0_8x1_1024x1024_160k_cityscapes.py | 36 + .../segformer_mit-b1_512x512_160k_ade20k.py | 8 + ...er_mit-b1_8x1_1024x1024_160k_cityscapes.py | 7 + .../segformer_mit-b2_512x512_160k_ade20k.py | 8 + ...er_mit-b2_8x1_1024x1024_160k_cityscapes.py | 8 + .../segformer_mit-b3_512x512_160k_ade20k.py | 8 + ...er_mit-b3_8x1_1024x1024_160k_cityscapes.py | 8 + .../segformer_mit-b4_512x512_160k_ade20k.py | 8 + ...er_mit-b4_8x1_1024x1024_160k_cityscapes.py | 8 + .../segformer_mit-b5_512x512_160k_ade20k.py | 8 + .../segformer_mit-b5_640x640_160k_ade20k.py | 44 + ...er_mit-b5_8x1_1024x1024_160k_cityscapes.py | 8 + .../configs/segmenter/README.md | 73 + .../configs/segmenter/segmenter.yml | 125 + ...nter_vit-b_mask_8x1_512x512_160k_ade20k.py | 43 + ...nter_vit-l_mask_8x1_512x512_160k_ade20k.py | 61 + ...er_vit-s_linear_8x1_512x512_160k_ade20k.py | 14 + ...nter_vit-s_mask_8x1_512x512_160k_ade20k.py | 66 + ...nter_vit-t_mask_8x1_512x512_160k_ade20k.py | 56 + .../mmsegmentation/configs/sem_fpn/README.md | 50 + .../fpn_r101_512x1024_80k_cityscapes.py | 2 + .../sem_fpn/fpn_r101_512x512_160k_ade20k.py | 2 + .../fpn_r50_512x1024_80k_cityscapes.py | 4 + .../sem_fpn/fpn_r50_512x512_160k_ade20k.py | 5 + .../configs/sem_fpn/sem_fpn.yml | 104 + .../mmsegmentation/configs/setr/README.md | 73 + .../mmsegmentation/configs/setr/setr.yml | 164 + .../setr/setr_mla_512x512_160k_b16_ade20k.py | 4 + .../setr/setr_mla_512x512_160k_b8_ade20k.py | 85 + .../setr_naive_512x512_160k_b16_ade20k.py | 67 + .../setr/setr_pup_512x512_160k_b16_ade20k.py | 67 + ...it-large_mla_8x1_768x768_80k_cityscapes.py | 17 + ...-large_naive_8x1_768x768_80k_cityscapes.py | 18 + ...it-large_pup_8x1_768x768_80k_cityscapes.py | 64 + .../mmsegmentation/configs/stdc/README.md | 72 + .../mmsegmentation/configs/stdc/stdc.yml | 87 + .../stdc/stdc1_512x1024_80k_cityscapes.py | 9 + .../stdc1_in1k-pre_512x1024_80k_cityscapes.py | 6 + .../stdc/stdc2_512x1024_80k_cityscapes.py | 2 + .../stdc2_in1k-pre_512x1024_80k_cityscapes.py | 6 + .../mmsegmentation/configs/swin/README.md | 75 + .../mmsegmentation/configs/swin/swin.yml | 117 + ...512x512_160k_ade20k_pretrain_384x384_1K.py | 15 + ...12x512_160k_ade20k_pretrain_384x384_22K.py | 8 + ...512x512_160k_ade20k_pretrain_224x224_1K.py | 13 + ...12x512_160k_ade20k_pretrain_224x224_22K.py | 8 + ...512x512_160k_ade20k_pretrain_224x224_1K.py | 11 + ...512x512_160k_ade20k_pretrain_224x224_1K.py | 45 + .../mmsegmentation/configs/twins/README.md | 76 + .../mmsegmentation/configs/twins/twins.yml | 265 ++ ...vt-b_fpn_fpnhead_8x4_512x512_80k_ade20k.py | 8 + ...cpvt-b_uperhead_8x2_512x512_160k_ade20k.py | 11 + ...vt-l_fpn_fpnhead_8x4_512x512_80k_ade20k.py | 8 + ...cpvt-l_uperhead_8x2_512x512_160k_ade20k.py | 11 + ...vt-s_fpn_fpnhead_8x4_512x512_80k_ade20k.py | 6 + ...cpvt-s_uperhead_8x4_512x512_160k_ade20k.py | 26 + ...vt-b_fpn_fpnhead_8x4_512x512_80k_ade20k.py | 12 + ..._svt-b_uperhead_8x2_512x512_160k_ade20k.py | 12 + ...vt-l_fpn_fpnhead_8x4_512x512_80k_ade20k.py | 13 + ..._svt-l_uperhead_8x2_512x512_160k_ade20k.py | 13 + ...vt-s_fpn_fpnhead_8x4_512x512_80k_ade20k.py | 22 + ..._svt-s_uperhead_8x2_512x512_160k_ade20k.py | 43 + .../mmsegmentation/configs/unet/README.md | 92 + ...labv3_unet_s5-d16_128x128_40k_chase_db1.py | 7 + ...deeplabv3_unet_s5-d16_128x128_40k_stare.py | 6 + .../deeplabv3_unet_s5-d16_256x256_40k_hrf.py | 6 + .../deeplabv3_unet_s5-d16_64x64_40k_drive.py | 6 + ...6_ce-1.0-dice-3.0_128x128_40k_chase-db1.py | 6 + ...5-d16_ce-1.0-dice-3.0_128x128_40k_stare.py | 6 + ..._s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf.py | 6 + ..._s5-d16_ce-1.0-dice-3.0_64x64_40k_drive.py | 6 + .../fcn_unet_s5-d16_128x128_40k_chase_db1.py | 6 + .../unet/fcn_unet_s5-d16_128x128_40k_stare.py | 6 + .../unet/fcn_unet_s5-d16_256x256_40k_hrf.py | 6 + ...net_s5-d16_4x4_512x1024_160k_cityscapes.py | 16 + .../unet/fcn_unet_s5-d16_64x64_40k_drive.py | 6 + ...6_ce-1.0-dice-3.0_128x128_40k_chase-db1.py | 6 + ...5-d16_ce-1.0-dice-3.0_128x128_40k_stare.py | 6 + ..._s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf.py | 6 + ..._s5-d16_ce-1.0-dice-3.0_64x64_40k_drive.py | 6 + ...spnet_unet_s5-d16_128x128_40k_chase_db1.py | 7 + .../pspnet_unet_s5-d16_128x128_40k_stare.py | 6 + .../pspnet_unet_s5-d16_256x256_40k_hrf.py | 6 + .../pspnet_unet_s5-d16_64x64_40k_drive.py | 6 + ...6_ce-1.0-dice-3.0_128x128_40k_chase-db1.py | 6 + ...5-d16_ce-1.0-dice-3.0_128x128_40k_stare.py | 6 + ..._s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf.py | 6 + ..._s5-d16_ce-1.0-dice-3.0_64x64_40k_drive.py | 6 + .../mmsegmentation/configs/unet/unet.yml | 377 +++ .../mmsegmentation/configs/upernet/README.md | 67 + .../configs/upernet/upernet.yml | 305 ++ .../upernet_r101_512x1024_40k_cityscapes.py | 2 + .../upernet_r101_512x1024_80k_cityscapes.py | 2 + .../upernet_r101_512x512_160k_ade20k.py | 2 + .../upernet_r101_512x512_20k_voc12aug.py | 2 + .../upernet_r101_512x512_40k_voc12aug.py | 2 + .../upernet_r101_512x512_80k_ade20k.py | 2 + .../upernet_r101_769x769_40k_cityscapes.py | 2 + .../upernet_r101_769x769_80k_cityscapes.py | 2 + .../upernet_r50_512x1024_40k_cityscapes.py | 4 + .../upernet_r50_512x1024_80k_cityscapes.py | 4 + .../upernet_r50_512x512_160k_ade20k.py | 6 + .../upernet_r50_512x512_20k_voc12aug.py | 7 + .../upernet_r50_512x512_40k_voc12aug.py | 7 + .../upernet/upernet_r50_512x512_80k_ade20k.py | 6 + .../upernet_r50_769x769_40k_cityscapes.py | 9 + .../upernet_r50_769x769_80k_cityscapes.py | 9 + .../mmsegmentation/configs/vit/README.md | 69 + .../upernet_deit-b16_512x512_160k_ade20k.py | 6 + .../upernet_deit-b16_512x512_80k_ade20k.py | 6 + ...net_deit-b16_ln_mln_512x512_160k_ade20k.py | 5 + ...pernet_deit-b16_mln_512x512_160k_ade20k.py | 6 + .../upernet_deit-s16_512x512_160k_ade20k.py | 8 + .../upernet_deit-s16_512x512_80k_ade20k.py | 8 + ...net_deit-s16_ln_mln_512x512_160k_ade20k.py | 9 + ...pernet_deit-s16_mln_512x512_160k_ade20k.py | 8 + ...rnet_vit-b16_ln_mln_512x512_160k_ade20k.py | 39 + ...upernet_vit-b16_mln_512x512_160k_ade20k.py | 38 + .../upernet_vit-b16_mln_512x512_80k_ade20k.py | 38 + downstream/mmsegmentation/configs/vit/vit.yml | 243 ++ downstream/mmsegmentation/mmseg/__init__.py | 62 + .../mmsegmentation/mmseg/apis/__init__.py | 11 + .../mmsegmentation/mmseg/apis/inference.py | 136 + downstream/mmsegmentation/mmseg/apis/test.py | 233 ++ downstream/mmsegmentation/mmseg/apis/train.py | 191 ++ .../mmsegmentation/mmseg/core/__init__.py | 13 + .../mmsegmentation/mmseg/core/builder.py | 33 + .../mmseg/core/evaluation/__init__.py | 11 + .../mmseg/core/evaluation/class_names.py | 316 ++ .../mmseg/core/evaluation/eval_hooks.py | 128 + .../mmseg/core/evaluation/metrics.py | 395 +++ .../core/layer_decay_optimizer_constructor.py | 87 + .../mmsegmentation/mmseg/core/seg/__init__.py | 5 + .../mmsegmentation/mmseg/core/seg/builder.py | 9 + .../mmseg/core/seg/sampler/__init__.py | 5 + .../core/seg/sampler/base_pixel_sampler.py | 13 + .../core/seg/sampler/ohem_pixel_sampler.py | 85 + .../mmseg/core/utils/__init__.py | 10 + .../mmseg/core/utils/dist_util.py | 46 + .../layer_decay_optimizer_constructor.py | 148 + .../mmsegmentation/mmseg/core/utils/misc.py | 18 + .../mmsegmentation/mmseg/datasets/__init__.py | 30 + .../mmsegmentation/mmseg/datasets/ade.py | 167 + .../mmsegmentation/mmseg/datasets/builder.py | 191 ++ .../mmseg/datasets/chase_db1.py | 27 + .../mmseg/datasets/cityscapes.py | 214 ++ .../mmseg/datasets/coco_stuff.py | 94 + .../mmsegmentation/mmseg/datasets/custom.py | 487 +++ .../mmseg/datasets/dark_zurich.py | 14 + .../mmseg/datasets/dataset_wrappers.py | 277 ++ .../mmsegmentation/mmseg/datasets/drive.py | 27 + .../mmsegmentation/mmseg/datasets/hrf.py | 27 + .../mmsegmentation/mmseg/datasets/isaid.py | 82 + .../mmsegmentation/mmseg/datasets/isprs.py | 25 + .../mmsegmentation/mmseg/datasets/loveda.py | 92 + .../mmseg/datasets/night_driving.py | 14 + .../mmseg/datasets/pascal_context.py | 103 + .../mmseg/datasets/pipelines/__init__.py | 19 + .../mmseg/datasets/pipelines/compose.py | 52 + .../mmseg/datasets/pipelines/formating.py | 9 + .../mmseg/datasets/pipelines/formatting.py | 289 ++ .../mmseg/datasets/pipelines/loading.py | 158 + .../mmseg/datasets/pipelines/test_time_aug.py | 134 + .../mmseg/datasets/pipelines/transforms.py | 1546 +++++++++ .../mmsegmentation/mmseg/datasets/potsdam.py | 25 + .../mmseg/datasets/samplers/__init__.py | 4 + .../datasets/samplers/distributed_sampler.py | 71 + .../mmsegmentation/mmseg/datasets/stare.py | 28 + .../mmsegmentation/mmseg/datasets/voc.py | 30 + .../mmseg/dev/custom_opt_constructor.py | 258 ++ .../mmsegmentation/mmseg/models/__init__.py | 13 + .../mmseg/models/backbones/__init__.py | 31 + .../mmseg/models/backbones/beit.py | 532 +++ .../mmseg/models/backbones/bisenetv1.py | 332 ++ .../mmseg/models/backbones/bisenetv2.py | 622 ++++ .../mmseg/models/backbones/cgnet.py | 372 +++ .../mmseg/models/backbones/erfnet.py | 329 ++ .../mmseg/models/backbones/fast_scnn.py | 409 +++ .../mmseg/models/backbones/gpvit.py | 51 + .../mmseg/models/backbones/hrnet.py | 642 ++++ .../mmseg/models/backbones/icnet.py | 166 + .../mmseg/models/backbones/mit.py | 450 +++ .../mmseg/models/backbones/mobilenet_v2.py | 197 ++ .../mmseg/models/backbones/mobilenet_v3.py | 267 ++ .../mmseg/models/backbones/resnest.py | 318 ++ .../mmseg/models/backbones/resnet.py | 714 ++++ .../mmseg/models/backbones/resnext.py | 150 + .../mmseg/models/backbones/stdc.py | 422 +++ .../mmseg/models/backbones/swin.py | 756 +++++ .../mmseg/models/backbones/timm_backbone.py | 63 + .../mmseg/models/backbones/twins.py | 588 ++++ .../mmseg/models/backbones/unet.py | 438 +++ .../mmseg/models/backbones/vit.py | 428 +++ .../mmsegmentation/mmseg/models/builder.py | 49 + .../mmseg/models/decode_heads/__init__.py | 41 + .../mmseg/models/decode_heads/ann_head.py | 246 ++ .../mmseg/models/decode_heads/apc_head.py | 159 + .../mmseg/models/decode_heads/aspp_head.py | 122 + .../decode_heads/cascade_decode_head.py | 58 + .../mmseg/models/decode_heads/cc_head.py | 43 + .../mmseg/models/decode_heads/da_head.py | 179 + .../mmseg/models/decode_heads/decode_head.py | 267 ++ .../mmseg/models/decode_heads/dm_head.py | 141 + .../mmseg/models/decode_heads/dnl_head.py | 137 + .../mmseg/models/decode_heads/dpt_head.py | 294 ++ .../mmseg/models/decode_heads/ema_head.py | 169 + .../mmseg/models/decode_heads/enc_head.py | 188 ++ .../mmseg/models/decode_heads/fcn_head.py | 96 + .../mmseg/models/decode_heads/fpn_head.py | 69 + .../mmseg/models/decode_heads/gc_head.py | 48 + .../mmseg/models/decode_heads/isa_head.py | 143 + .../mmseg/models/decode_heads/knet_head.py | 453 +++ .../mmseg/models/decode_heads/lraspp_head.py | 91 + .../mmseg/models/decode_heads/nl_head.py | 50 + .../mmseg/models/decode_heads/ocr_head.py | 128 + .../mmseg/models/decode_heads/point_head.py | 364 ++ .../mmseg/models/decode_heads/psa_head.py | 197 ++ .../mmseg/models/decode_heads/psp_head.py | 117 + .../models/decode_heads/segformer_head.py | 66 + .../models/decode_heads/segformer_head_ori.py | 85 + .../decode_heads/segmenter_mask_head.py | 133 + .../models/decode_heads/sep_aspp_head.py | 102 + .../mmseg/models/decode_heads/sep_fcn_head.py | 60 + .../models/decode_heads/setr_mla_head.py | 63 + .../mmseg/models/decode_heads/setr_up_head.py | 81 + .../mmseg/models/decode_heads/stdc_head.py | 85 + .../mmseg/models/decode_heads/uper_head.py | 140 + .../mmseg/models/losses/__init__.py | 15 + .../mmseg/models/losses/accuracy.py | 88 + .../mmseg/models/losses/cross_entropy_loss.py | 295 ++ .../mmseg/models/losses/dice_loss.py | 137 + .../mmseg/models/losses/focal_loss.py | 327 ++ .../mmseg/models/losses/lovasz_loss.py | 323 ++ .../mmseg/models/losses/utils.py | 126 + .../mmseg/models/necks/__init__.py | 11 + .../mmseg/models/necks/featurepyramid.py | 67 + .../mmsegmentation/mmseg/models/necks/fpn.py | 213 ++ .../mmseg/models/necks/ic_neck.py | 148 + .../mmsegmentation/mmseg/models/necks/jpu.py | 131 + .../mmseg/models/necks/mla_neck.py | 118 + .../mmseg/models/necks/multilevel_neck.py | 81 + .../mmseg/models/segmentors/__init__.py | 6 + .../mmseg/models/segmentors/base.py | 286 ++ .../segmentors/cascade_encoder_decoder.py | 88 + .../models/segmentors/encoder_decoder.py | 284 ++ .../mmseg/models/utils/__init__.py | 16 + .../mmseg/models/utils/embed.py | 330 ++ .../mmseg/models/utils/inverted_residual.py | 213 ++ .../mmseg/models/utils/make_divisible.py | 28 + .../mmseg/models/utils/res_layer.py | 96 + .../mmseg/models/utils/se_layer.py | 58 + .../models/utils/self_attention_block.py | 160 + .../mmseg/models/utils/shape_convert.py | 107 + .../mmseg/models/utils/up_conv_block.py | 102 + .../mmsegmentation/mmseg/ops/__init__.py | 5 + .../mmsegmentation/mmseg/ops/encoding.py | 75 + .../mmsegmentation/mmseg/ops/wrappers.py | 51 + .../mmsegmentation/mmseg/utils/__init__.py | 10 + .../mmsegmentation/mmseg/utils/collect_env.py | 18 + .../mmsegmentation/mmseg/utils/logger.py | 28 + downstream/mmsegmentation/mmseg/utils/misc.py | 41 + .../mmsegmentation/mmseg/utils/set_env.py | 55 + downstream/mmsegmentation/mmseg/version.py | 18 + downstream/mmsegmentation/model-index.yml | 44 + downstream/mmsegmentation/pytest.ini | 7 + downstream/mmsegmentation/requirements.txt | 3 + .../mmsegmentation/requirements/docs.txt | 6 + .../mmsegmentation/requirements/mminstall.txt | 2 + .../mmsegmentation/requirements/optional.txt | 1 + .../requirements/readthedocs.txt | 4 + .../mmsegmentation/requirements/runtime.txt | 5 + .../mmsegmentation/requirements/tests.txt | 6 + downstream/mmsegmentation/setup.cfg | 19 + downstream/mmsegmentation/setup.py | 200 ++ .../mmsegmentation/tools/analyze_logs.py | 128 + downstream/mmsegmentation/tools/benchmark.py | 120 + .../mmsegmentation/tools/browse_dataset.py | 182 + .../mmsegmentation/tools/confusion_matrix.py | 184 ++ .../tools/convert_datasets/chase_db1.py | 88 + .../tools/convert_datasets/cityscapes.py | 56 + .../tools/convert_datasets/coco_stuff10k.py | 307 ++ .../tools/convert_datasets/coco_stuff164k.py | 264 ++ .../tools/convert_datasets/drive.py | 113 + .../tools/convert_datasets/hrf.py | 111 + .../tools/convert_datasets/isaid.py | 245 ++ .../tools/convert_datasets/loveda.py | 73 + .../tools/convert_datasets/pascal_context.py | 87 + .../tools/convert_datasets/potsdam.py | 157 + .../tools/convert_datasets/stare.py | 166 + .../tools/convert_datasets/vaihingen.py | 155 + .../tools/convert_datasets/voc_aug.py | 92 + .../mmsegmentation/tools/deploy_test.py | 338 ++ downstream/mmsegmentation/tools/dist_test.sh | 20 + downstream/mmsegmentation/tools/dist_train.sh | 18 + downstream/mmsegmentation/tools/get_flops.py | 131 + .../tools/model_converters/beit2mmseg.py | 56 + .../tools/model_converters/mit2mmseg.py | 82 + .../tools/model_converters/stdc2mmseg.py | 71 + .../tools/model_converters/swin2mmseg.py | 87 + .../tools/model_converters/twins2mmseg.py | 87 + .../tools/model_converters/vit2mmseg.py | 70 + .../tools/model_converters/vitjax2mmseg.py | 123 + .../mmsegmentation/tools/onnx2tensorrt.py | 289 ++ .../mmsegmentation/tools/print_config.py | 69 + .../mmsegmentation/tools/publish_model.py | 36 + .../mmsegmentation/tools/pytorch2onnx.py | 405 +++ .../tools/pytorch2torchscript.py | 185 ++ downstream/mmsegmentation/tools/slurm_test.sh | 24 + .../mmsegmentation/tools/slurm_train.sh | 23 + downstream/mmsegmentation/tools/test.py | 319 ++ .../tools/torchserve/mmseg2torchserve.py | 111 + .../tools/torchserve/mmseg_handler.py | 56 + .../tools/torchserve/test_torchserve.py | 58 + downstream/mmsegmentation/tools/train.py | 392 +++ mmcls/__init__.py | 60 + mmcls/apis/__init__.py | 10 + mmcls/apis/inference.py | 120 + mmcls/apis/test.py | 213 ++ mmcls/apis/train.py | 233 ++ mmcls/core/__init__.py | 5 + mmcls/core/evaluation/__init__.py | 12 + mmcls/core/evaluation/eval_hooks.py | 78 + mmcls/core/evaluation/eval_metrics.py | 259 ++ mmcls/core/evaluation/mean_ap.py | 74 + .../evaluation/multilabel_eval_metrics.py | 72 + mmcls/core/export/__init__.py | 4 + mmcls/core/export/test.py | 96 + mmcls/core/hook/__init__.py | 10 + mmcls/core/hook/class_num_check_hook.py | 73 + mmcls/core/hook/lr_updater.py | 83 + mmcls/core/hook/precise_bn_hook.py | 180 + mmcls/core/hook/wandblogger_hook.py | 343 ++ mmcls/core/optimizers/__init__.py | 6 + mmcls/core/optimizers/lamb.py | 227 ++ mmcls/core/utils/__init__.py | 7 + mmcls/core/utils/dist_utils.py | 102 + mmcls/core/utils/misc.py | 8 + mmcls/core/visualization/__init__.py | 8 + mmcls/core/visualization/image.py | 343 ++ mmcls/datasets/__init__.py | 25 + mmcls/datasets/base_dataset.py | 221 ++ mmcls/datasets/builder.py | 183 ++ mmcls/datasets/cifar.py | 155 + mmcls/datasets/cub.py | 129 + mmcls/datasets/custom.py | 229 ++ mmcls/datasets/dataset_wrappers.py | 332 ++ mmcls/datasets/imagenet.py | 1059 ++++++ mmcls/datasets/imagenet21k.py | 174 + mmcls/datasets/mnist.py | 185 ++ mmcls/datasets/multi_label.py | 79 + mmcls/datasets/pipelines/__init__.py | 22 + mmcls/datasets/pipelines/auto_augment.py | 921 ++++++ mmcls/datasets/pipelines/compose.py | 43 + mmcls/datasets/pipelines/formatting.py | 195 ++ mmcls/datasets/pipelines/loading.py | 138 + mmcls/datasets/pipelines/transforms.py | 1146 +++++++ mmcls/datasets/samplers/__init__.py | 5 + .../datasets/samplers/distributed_sampler.py | 60 + mmcls/datasets/samplers/repeat_aug.py | 106 + mmcls/datasets/stanford_cars.py | 210 ++ mmcls/datasets/utils.py | 153 + mmcls/datasets/voc.py | 94 + mmcls/gpvit_dev/amp/runner.py | 140 + mmcls/gpvit_dev/models/backbones/gpvit.py | 290 ++ mmcls/gpvit_dev/models/build.py | 27 + mmcls/gpvit_dev/models/modules/patch_embed.py | 290 ++ mmcls/gpvit_dev/models/necks/group_neck.py | 52 + mmcls/gpvit_dev/models/utils/attentions.py | 599 ++++ mmcls/models/__init__.py | 14 + mmcls/models/backbones/__init__.py | 53 + mmcls/models/backbones/alexnet.py | 56 + mmcls/models/backbones/base_backbone.py | 33 + mmcls/models/backbones/conformer.py | 626 ++++ mmcls/models/backbones/convmixer.py | 176 + mmcls/models/backbones/convnext.py | 349 ++ mmcls/models/backbones/cspnet.py | 679 ++++ mmcls/models/backbones/deit.py | 117 + mmcls/models/backbones/densenet.py | 332 ++ mmcls/models/backbones/efficientformer.py | 606 ++++ mmcls/models/backbones/efficientnet.py | 407 +++ mmcls/models/backbones/hornet.py | 499 +++ mmcls/models/backbones/hrnet.py | 563 ++++ mmcls/models/backbones/lenet.py | 42 + mmcls/models/backbones/mlp_mixer.py | 263 ++ mmcls/models/backbones/mobilenet_v2.py | 264 ++ mmcls/models/backbones/mobilenet_v3.py | 195 ++ mmcls/models/backbones/mvit.py | 700 ++++ mmcls/models/backbones/poolformer.py | 416 +++ mmcls/models/backbones/regnet.py | 323 ++ mmcls/models/backbones/repmlp.py | 578 ++++ mmcls/models/backbones/repvgg.py | 619 ++++ mmcls/models/backbones/res2net.py | 306 ++ mmcls/models/backbones/resnest.py | 339 ++ mmcls/models/backbones/resnet.py | 688 ++++ mmcls/models/backbones/resnet_cifar.py | 81 + mmcls/models/backbones/resnext.py | 148 + mmcls/models/backbones/seresnet.py | 125 + mmcls/models/backbones/seresnext.py | 155 + mmcls/models/backbones/shufflenet_v1.py | 321 ++ mmcls/models/backbones/shufflenet_v2.py | 304 ++ mmcls/models/backbones/swin_transformer.py | 548 ++++ mmcls/models/backbones/swin_transformer_v2.py | 560 ++++ mmcls/models/backbones/t2t_vit.py | 440 +++ mmcls/models/backbones/timm_backbone.py | 112 + mmcls/models/backbones/tnt.py | 368 +++ mmcls/models/backbones/twins.py | 723 ++++ mmcls/models/backbones/van.py | 445 +++ mmcls/models/backbones/vgg.py | 183 ++ mmcls/models/backbones/vision_transformer.py | 383 +++ mmcls/models/builder.py | 38 + mmcls/models/classifiers/__init__.py | 5 + mmcls/models/classifiers/base.py | 224 ++ mmcls/models/classifiers/image.py | 160 + mmcls/models/heads/__init__.py | 17 + mmcls/models/heads/base_head.py | 15 + mmcls/models/heads/cls_head.py | 116 + mmcls/models/heads/conformer_head.py | 132 + mmcls/models/heads/deit_head.py | 96 + mmcls/models/heads/efficientformer_head.py | 96 + mmcls/models/heads/linear_head.py | 81 + mmcls/models/heads/multi_label_csra_head.py | 121 + mmcls/models/heads/multi_label_head.py | 99 + mmcls/models/heads/multi_label_linear_head.py | 85 + mmcls/models/heads/stacked_head.py | 163 + mmcls/models/heads/vision_transformer_head.py | 123 + mmcls/models/losses/__init__.py | 17 + mmcls/models/losses/accuracy.py | 143 + mmcls/models/losses/asymmetric_loss.py | 149 + mmcls/models/losses/cross_entropy_loss.py | 209 ++ mmcls/models/losses/focal_loss.py | 116 + mmcls/models/losses/label_smooth_loss.py | 157 + mmcls/models/losses/seesaw_loss.py | 173 + mmcls/models/losses/utils.py | 119 + mmcls/models/necks/__init__.py | 8 + mmcls/models/necks/gap.py | 45 + mmcls/models/necks/gem.py | 53 + mmcls/models/necks/hr_fuse.py | 83 + mmcls/models/utils/__init__.py | 20 + mmcls/models/utils/attention.py | 564 ++++ mmcls/models/utils/augment/__init__.py | 9 + mmcls/models/utils/augment/augments.py | 73 + mmcls/models/utils/augment/builder.py | 8 + mmcls/models/utils/augment/cutmix.py | 175 + mmcls/models/utils/augment/identity.py | 29 + mmcls/models/utils/augment/mixup.py | 80 + mmcls/models/utils/augment/resizemix.py | 93 + mmcls/models/utils/augment/utils.py | 24 + mmcls/models/utils/channel_shuffle.py | 29 + mmcls/models/utils/embed.py | 420 +++ mmcls/models/utils/helpers.py | 53 + mmcls/models/utils/inverted_residual.py | 125 + mmcls/models/utils/layer_scale.py | 35 + mmcls/models/utils/make_divisible.py | 25 + mmcls/models/utils/position_encoding.py | 41 + mmcls/models/utils/se_layer.py | 80 + mmcls/utils/__init__.py | 12 + mmcls/utils/collect_env.py | 17 + mmcls/utils/device.py | 15 + mmcls/utils/distribution.py | 80 + mmcls/utils/logger.py | 56 + mmcls/utils/setup_env.py | 47 + mmcls/version.py | 28 + model-index.yml | 34 + requirements.txt | 3 + requirements/docs.txt | 6 + requirements/mminstall.txt | 2 + requirements/optional.txt | 5 + requirements/readthedocs.txt | 3 + requirements/runtime.txt | 4 + requirements/tests.txt | 8 + resources/gpvit_release_intro.png | Bin 0 -> 856607 bytes setup.cfg | 23 + setup.py | 194 ++ tests/data/color.jpg | Bin 0 -> 39779 bytes tests/data/dataset/a/1.JPG | 0 tests/data/dataset/ann.txt | 3 + tests/data/dataset/b/2.jpeg | 0 tests/data/dataset/b/subb/3.jpg | 0 tests/data/dataset/classes.txt | 2 + tests/data/gray.jpg | Bin 0 -> 39088 bytes tests/data/retinanet.py | 83 + tests/data/test.logjson | 10 + tests/test_data/test_builder.py | 272 ++ tests/test_data/test_datasets/test_common.py | 911 +++++ .../test_datasets/test_dataset_utils.py | 22 + .../test_datasets/test_dataset_wrapper.py | 192 ++ tests/test_data/test_datasets/test_sampler.py | 53 + .../test_pipelines/test_auto_augment.py | 1242 +++++++ .../test_data/test_pipelines/test_loading.py | 59 + .../test_pipelines/test_transform.py | 1301 ++++++++ tests/test_downstream/test_mmdet_inference.py | 118 + tests/test_metrics/test_losses.py | 362 ++ tests/test_metrics/test_metrics.py | 93 + tests/test_metrics/test_utils.py | 49 + tests/test_models/test_backbones/__init__.py | 1 + .../test_backbones/test_conformer.py | 111 + .../test_backbones/test_convmixer.py | 84 + .../test_backbones/test_convnext.py | 96 + .../test_models/test_backbones/test_cspnet.py | 147 + tests/test_models/test_backbones/test_deit.py | 131 + .../test_backbones/test_densenet.py | 95 + .../test_backbones/test_efficientformer.py | 199 ++ .../test_backbones/test_efficientnet.py | 144 + .../test_models/test_backbones/test_hornet.py | 174 + .../test_models/test_backbones/test_hrnet.py | 93 + .../test_backbones/test_mlp_mixer.py | 119 + .../test_backbones/test_mobilenet_v2.py | 259 ++ .../test_backbones/test_mobilenet_v3.py | 175 + tests/test_models/test_backbones/test_mvit.py | 185 ++ .../test_backbones/test_poolformer.py | 143 + .../test_models/test_backbones/test_regnet.py | 94 + .../test_models/test_backbones/test_repmlp.py | 172 + .../test_models/test_backbones/test_repvgg.py | 350 ++ .../test_backbones/test_res2net.py | 71 + .../test_backbones/test_resnest.py | 44 + .../test_models/test_backbones/test_resnet.py | 618 ++++ .../test_backbones/test_resnet_cifar.py | 67 + .../test_backbones/test_resnext.py | 61 + .../test_backbones/test_seresnet.py | 247 ++ .../test_backbones/test_seresnext.py | 74 + .../test_backbones/test_shufflenet_v1.py | 246 ++ .../test_backbones/test_shufflenet_v2.py | 205 ++ .../test_backbones/test_swin_transformer.py | 255 ++ .../test_swin_transformer_v2.py | 243 ++ .../test_backbones/test_t2t_vit.py | 188 ++ .../test_backbones/test_timm_backbone.py | 204 ++ tests/test_models/test_backbones/test_tnt.py | 50 + .../test_models/test_backbones/test_twins.py | 243 ++ tests/test_models/test_backbones/test_van.py | 188 ++ tests/test_models/test_backbones/test_vgg.py | 139 + .../test_backbones/test_vision_transformer.py | 183 ++ tests/test_models/test_backbones/utils.py | 31 + tests/test_models/test_classifiers.py | 326 ++ tests/test_models/test_heads.py | 400 +++ tests/test_models/test_neck.py | 87 + .../test_models/test_utils/test_attention.py | 208 ++ tests/test_models/test_utils/test_augment.py | 96 + tests/test_models/test_utils/test_embed.py | 88 + .../test_utils/test_inverted_residual.py | 82 + .../test_utils/test_layer_scale.py | 48 + tests/test_models/test_utils/test_misc.py | 59 + .../test_utils/test_position_encoding.py | 10 + tests/test_models/test_utils/test_se.py | 95 + tests/test_runtime/test_eval_hook.py | 204 ++ tests/test_runtime/test_hooks.py | 158 + tests/test_runtime/test_num_class_hook.py | 84 + tests/test_runtime/test_optimizer.py | 309 ++ tests/test_runtime/test_preciseBN_hook.py | 274 ++ tests/test_utils/test_device.py | 28 + tests/test_utils/test_logger.py | 55 + tests/test_utils/test_setup_env.py | 68 + tests/test_utils/test_version_utils.py | 21 + tests/test_utils/test_visualization.py | 100 + tools/analysis_tools/analyze_logs.py | 215 ++ tools/analysis_tools/analyze_results.py | 115 + tools/analysis_tools/eval_metric.py | 71 + tools/analysis_tools/get_flops.py | 55 + tools/convert_models/efficientnet_to_mmcls.py | 215 ++ tools/convert_models/hornet2mmcls.py | 61 + tools/convert_models/mlpmixer_to_mmcls.py | 58 + tools/convert_models/mobilenetv2_to_mmcls.py | 135 + tools/convert_models/publish_model.py | 55 + tools/convert_models/reparameterize_model.py | 55 + tools/convert_models/reparameterize_repvgg.py | 60 + tools/convert_models/repvgg_to_mmcls.py | 60 + tools/convert_models/shufflenetv2_to_mmcls.py | 113 + tools/convert_models/torchvision_to_mmcls.py | 63 + tools/convert_models/twins2mmcls.py | 73 + tools/convert_models/van2mmcls.py | 65 + tools/convert_models/vgg_to_mmcls.py | 117 + tools/dataset_tools/create_lmdb_dataset.py | 148 + tools/deployment/mmcls2torchserve.py | 111 + tools/deployment/mmcls_handler.py | 51 + tools/deployment/onnx2tensorrt.py | 155 + tools/deployment/pytorch2mlmodel.py | 160 + tools/deployment/pytorch2onnx.py | 232 ++ tools/deployment/pytorch2torchscript.py | 139 + tools/deployment/test.py | 128 + tools/deployment/test_torchserver.py | 45 + tools/dist_test.sh | 22 + tools/dist_train.sh | 19 + tools/dist_train_arm.sh | 32 + tools/kfold-cross-valid.py | 371 +++ tools/misc/print_config.py | 35 + tools/misc/verify_dataset.py | 131 + tools/slurm_test.sh | 24 + tools/slurm_train.sh | 24 + tools/test.py | 243 ++ tools/train.py | 208 ++ tools/visualizations/vis_cam.py | 356 ++ tools/visualizations/vis_lr.py | 334 ++ tools/visualizations/vis_pipeline.py | 337 ++ 3283 files changed, 276231 insertions(+) create mode 100644 CITATION.cff create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 README.md create mode 100644 configs/_base_/datasets/cifar100_bs16.py create mode 100644 configs/_base_/datasets/cifar10_bs16.py create mode 100644 configs/_base_/datasets/cub_bs8_384.py create mode 100644 configs/_base_/datasets/cub_bs8_448.py create mode 100644 configs/_base_/datasets/imagenet21k_bs128.py create mode 100644 configs/_base_/datasets/imagenet_bs128_poolformer_medium_224.py create mode 100644 configs/_base_/datasets/imagenet_bs128_poolformer_small_224.py create mode 100644 configs/_base_/datasets/imagenet_bs256_rsb_a12.py create mode 100644 configs/_base_/datasets/imagenet_bs256_rsb_a3.py create mode 100644 configs/_base_/datasets/imagenet_bs32.py create mode 100644 configs/_base_/datasets/imagenet_bs32_pil_bicubic.py create mode 100644 configs/_base_/datasets/imagenet_bs32_pil_resize.py create mode 100644 configs/_base_/datasets/imagenet_bs64.py create mode 100644 configs/_base_/datasets/imagenet_bs64_autoaug.py create mode 100644 configs/_base_/datasets/imagenet_bs64_convmixer_224.py create mode 100644 configs/_base_/datasets/imagenet_bs64_mixer_224.py create mode 100644 configs/_base_/datasets/imagenet_bs64_pil_resize.py create mode 100644 configs/_base_/datasets/imagenet_bs64_pil_resize_autoaug.py create mode 100644 configs/_base_/datasets/imagenet_bs64_swin_224.py create mode 100644 configs/_base_/datasets/imagenet_bs64_swin_224_lmdb.py create mode 100644 configs/_base_/datasets/imagenet_bs64_swin_256.py create mode 100644 configs/_base_/datasets/imagenet_bs64_swin_384.py create mode 100644 configs/_base_/datasets/imagenet_bs64_t2t_224.py create mode 100644 configs/_base_/datasets/pipelines/auto_aug.py create mode 100644 configs/_base_/datasets/pipelines/rand_aug.py create mode 100644 configs/_base_/datasets/stanford_cars_bs8_448.py create mode 100644 configs/_base_/datasets/voc_bs16.py create mode 100644 configs/_base_/default_runtime.py create mode 100644 configs/_base_/models/conformer/base-p16.py create mode 100644 configs/_base_/models/conformer/small-p16.py create mode 100644 configs/_base_/models/conformer/small-p32.py create mode 100644 configs/_base_/models/conformer/tiny-p16.py create mode 100644 configs/_base_/models/convmixer/convmixer-1024-20.py create mode 100644 configs/_base_/models/convmixer/convmixer-1536-20.py create mode 100644 configs/_base_/models/convmixer/convmixer-768-32.py create mode 100644 configs/_base_/models/convnext/convnext-base.py create mode 100644 configs/_base_/models/convnext/convnext-large.py create mode 100644 configs/_base_/models/convnext/convnext-small.py create mode 100644 configs/_base_/models/convnext/convnext-tiny.py create mode 100644 configs/_base_/models/convnext/convnext-xlarge.py create mode 100644 configs/_base_/models/densenet/densenet121.py create mode 100644 configs/_base_/models/densenet/densenet161.py create mode 100644 configs/_base_/models/densenet/densenet169.py create mode 100644 configs/_base_/models/densenet/densenet201.py create mode 100644 configs/_base_/models/efficientnet_b0.py create mode 100644 configs/_base_/models/efficientnet_b1.py create mode 100644 configs/_base_/models/efficientnet_b2.py create mode 100644 configs/_base_/models/efficientnet_b3.py create mode 100644 configs/_base_/models/efficientnet_b4.py create mode 100644 configs/_base_/models/efficientnet_b5.py create mode 100644 configs/_base_/models/efficientnet_b6.py create mode 100644 configs/_base_/models/efficientnet_b7.py create mode 100644 configs/_base_/models/efficientnet_b8.py create mode 100644 configs/_base_/models/efficientnet_em.py create mode 100644 configs/_base_/models/efficientnet_es.py create mode 100644 configs/_base_/models/hornet/hornet-base-gf.py create mode 100644 configs/_base_/models/hornet/hornet-base.py create mode 100644 configs/_base_/models/hornet/hornet-large-gf.py create mode 100644 configs/_base_/models/hornet/hornet-large-gf384.py create mode 100644 configs/_base_/models/hornet/hornet-large.py create mode 100644 configs/_base_/models/hornet/hornet-small-gf.py create mode 100644 configs/_base_/models/hornet/hornet-small.py create mode 100644 configs/_base_/models/hornet/hornet-tiny-gf.py create mode 100644 configs/_base_/models/hornet/hornet-tiny.py create mode 100644 configs/_base_/models/hrnet/hrnet-w18.py create mode 100644 configs/_base_/models/hrnet/hrnet-w30.py create mode 100644 configs/_base_/models/hrnet/hrnet-w32.py create mode 100644 configs/_base_/models/hrnet/hrnet-w40.py create mode 100644 configs/_base_/models/hrnet/hrnet-w44.py create mode 100644 configs/_base_/models/hrnet/hrnet-w48.py create mode 100644 configs/_base_/models/hrnet/hrnet-w64.py create mode 100644 configs/_base_/models/mlp_mixer_base_patch16.py create mode 100644 configs/_base_/models/mlp_mixer_large_patch16.py create mode 100644 configs/_base_/models/mobilenet_v2_1x.py create mode 100644 configs/_base_/models/mobilenet_v3_large_imagenet.py create mode 100644 configs/_base_/models/mobilenet_v3_small_cifar.py create mode 100644 configs/_base_/models/mobilenet_v3_small_imagenet.py create mode 100644 configs/_base_/models/mvit/mvitv2-base.py create mode 100644 configs/_base_/models/mvit/mvitv2-large.py create mode 100644 configs/_base_/models/mvit/mvitv2-small.py create mode 100644 configs/_base_/models/mvit/mvitv2-tiny.py create mode 100644 configs/_base_/models/poolformer/poolformer_m36.py create mode 100644 configs/_base_/models/poolformer/poolformer_m48.py create mode 100644 configs/_base_/models/poolformer/poolformer_s12.py create mode 100644 configs/_base_/models/poolformer/poolformer_s24.py create mode 100644 configs/_base_/models/poolformer/poolformer_s36.py create mode 100644 configs/_base_/models/regnet/regnetx_1.6gf.py create mode 100644 configs/_base_/models/regnet/regnetx_12gf.py create mode 100644 configs/_base_/models/regnet/regnetx_3.2gf.py create mode 100644 configs/_base_/models/regnet/regnetx_4.0gf.py create mode 100644 configs/_base_/models/regnet/regnetx_400mf.py create mode 100644 configs/_base_/models/regnet/regnetx_6.4gf.py create mode 100644 configs/_base_/models/regnet/regnetx_8.0gf.py create mode 100644 configs/_base_/models/regnet/regnetx_800mf.py create mode 100644 configs/_base_/models/repmlp-base_224.py create mode 100644 configs/_base_/models/repvgg-A0_in1k.py create mode 100644 configs/_base_/models/repvgg-B3_lbs-mixup_in1k.py create mode 100644 configs/_base_/models/res2net101-w26-s4.py create mode 100644 configs/_base_/models/res2net50-w14-s8.py create mode 100644 configs/_base_/models/res2net50-w26-s4.py create mode 100644 configs/_base_/models/res2net50-w26-s6.py create mode 100644 configs/_base_/models/res2net50-w26-s8.py create mode 100644 configs/_base_/models/res2net50-w48-s2.py create mode 100644 configs/_base_/models/resnest101.py create mode 100644 configs/_base_/models/resnest200.py create mode 100644 configs/_base_/models/resnest269.py create mode 100644 configs/_base_/models/resnest50.py create mode 100644 configs/_base_/models/resnet101.py create mode 100644 configs/_base_/models/resnet101_cifar.py create mode 100644 configs/_base_/models/resnet152.py create mode 100644 configs/_base_/models/resnet152_cifar.py create mode 100644 configs/_base_/models/resnet18.py create mode 100644 configs/_base_/models/resnet18_cifar.py create mode 100644 configs/_base_/models/resnet34.py create mode 100644 configs/_base_/models/resnet34_cifar.py create mode 100644 configs/_base_/models/resnet34_gem.py create mode 100644 configs/_base_/models/resnet50.py create mode 100644 configs/_base_/models/resnet50_cifar.py create mode 100644 configs/_base_/models/resnet50_cifar_cutmix.py create mode 100644 configs/_base_/models/resnet50_cifar_mixup.py create mode 100644 configs/_base_/models/resnet50_cutmix.py create mode 100644 configs/_base_/models/resnet50_label_smooth.py create mode 100644 configs/_base_/models/resnet50_mixup.py create mode 100644 configs/_base_/models/resnetv1c50.py create mode 100644 configs/_base_/models/resnetv1d101.py create mode 100644 configs/_base_/models/resnetv1d152.py create mode 100644 configs/_base_/models/resnetv1d50.py create mode 100644 configs/_base_/models/resnext101_32x4d.py create mode 100644 configs/_base_/models/resnext101_32x8d.py create mode 100644 configs/_base_/models/resnext152_32x4d.py create mode 100644 configs/_base_/models/resnext50_32x4d.py create mode 100644 configs/_base_/models/seresnet101.py create mode 100644 configs/_base_/models/seresnet50.py create mode 100644 configs/_base_/models/seresnext101_32x4d.py create mode 100644 configs/_base_/models/seresnext50_32x4d.py create mode 100644 configs/_base_/models/shufflenet_v1_1x.py create mode 100644 configs/_base_/models/shufflenet_v2_1x.py create mode 100644 configs/_base_/models/swin_transformer/base_224.py create mode 100644 configs/_base_/models/swin_transformer/base_384.py create mode 100644 configs/_base_/models/swin_transformer/large_224.py create mode 100644 configs/_base_/models/swin_transformer/large_384.py create mode 100644 configs/_base_/models/swin_transformer/small_224.py create mode 100644 configs/_base_/models/swin_transformer/tiny_224.py create mode 100644 configs/_base_/models/swin_transformer_v2/base_256.py create mode 100644 configs/_base_/models/swin_transformer_v2/base_384.py create mode 100644 configs/_base_/models/swin_transformer_v2/large_256.py create mode 100644 configs/_base_/models/swin_transformer_v2/large_384.py create mode 100644 configs/_base_/models/swin_transformer_v2/small_256.py create mode 100644 configs/_base_/models/swin_transformer_v2/tiny_256.py create mode 100644 configs/_base_/models/t2t-vit-t-14.py create mode 100644 configs/_base_/models/t2t-vit-t-19.py create mode 100644 configs/_base_/models/t2t-vit-t-24.py create mode 100644 configs/_base_/models/tnt_s_patch16_224.py create mode 100644 configs/_base_/models/twins_pcpvt_base.py create mode 100644 configs/_base_/models/twins_svt_base.py create mode 100644 configs/_base_/models/van/van_b0.py create mode 100644 configs/_base_/models/van/van_b1.py create mode 100644 configs/_base_/models/van/van_b2.py create mode 100644 configs/_base_/models/van/van_b3.py create mode 100644 configs/_base_/models/van/van_b4.py create mode 100644 configs/_base_/models/van/van_b5.py create mode 100644 configs/_base_/models/van/van_b6.py create mode 100644 configs/_base_/models/van/van_base.py create mode 100644 configs/_base_/models/van/van_large.py create mode 100644 configs/_base_/models/van/van_small.py create mode 100644 configs/_base_/models/van/van_tiny.py create mode 100644 configs/_base_/models/vgg11.py create mode 100644 configs/_base_/models/vgg11bn.py create mode 100644 configs/_base_/models/vgg13.py create mode 100644 configs/_base_/models/vgg13bn.py create mode 100644 configs/_base_/models/vgg16.py create mode 100644 configs/_base_/models/vgg16bn.py create mode 100644 configs/_base_/models/vgg19.py create mode 100644 configs/_base_/models/vgg19bn.py create mode 100644 configs/_base_/models/vit-base-p16.py create mode 100644 configs/_base_/models/vit-base-p32.py create mode 100644 configs/_base_/models/vit-large-p16.py create mode 100644 configs/_base_/models/vit-large-p32.py create mode 100644 configs/_base_/models/wide-resnet50.py create mode 100644 configs/_base_/schedules/cifar10_bs128.py create mode 100644 configs/_base_/schedules/cub_bs64.py create mode 100644 configs/_base_/schedules/imagenet_bs1024_adamw_conformer.py create mode 100644 configs/_base_/schedules/imagenet_bs1024_adamw_swin.py create mode 100644 configs/_base_/schedules/imagenet_bs1024_coslr.py create mode 100644 configs/_base_/schedules/imagenet_bs1024_linearlr_bn_nowd.py create mode 100644 configs/_base_/schedules/imagenet_bs2048.py create mode 100644 configs/_base_/schedules/imagenet_bs2048_AdamW.py create mode 100644 configs/_base_/schedules/imagenet_bs2048_coslr.py create mode 100644 configs/_base_/schedules/imagenet_bs2048_rsb.py create mode 100644 configs/_base_/schedules/imagenet_bs256.py create mode 100644 configs/_base_/schedules/imagenet_bs256_140e.py create mode 100644 configs/_base_/schedules/imagenet_bs256_200e_coslr_warmup.py create mode 100644 configs/_base_/schedules/imagenet_bs256_coslr.py create mode 100644 configs/_base_/schedules/imagenet_bs256_epochstep.py create mode 100644 configs/_base_/schedules/imagenet_bs4096_AdamW.py create mode 100644 configs/_base_/schedules/stanford_cars_bs8.py create mode 100644 configs/conformer/README.md create mode 100644 configs/conformer/conformer-base-p16_8xb128_in1k.py create mode 100644 configs/conformer/conformer-small-p16_8xb128_in1k.py create mode 100644 configs/conformer/conformer-small-p32_8xb128_in1k.py create mode 100644 configs/conformer/conformer-tiny-p16_8xb128_in1k.py create mode 100644 configs/conformer/metafile.yml create mode 100644 configs/convmixer/README.md create mode 100644 configs/convmixer/convmixer-1024-20_10xb64_in1k.py create mode 100644 configs/convmixer/convmixer-1536-20_10xb64_in1k.py create mode 100644 configs/convmixer/convmixer-768-32_10xb64_in1k.py create mode 100644 configs/convmixer/metafile.yml create mode 100644 configs/convnext/README.md create mode 100644 configs/convnext/convnext-base_32xb128_in1k.py create mode 100644 configs/convnext/convnext-large_64xb64_in1k.py create mode 100644 configs/convnext/convnext-small_32xb128_in1k.py create mode 100644 configs/convnext/convnext-tiny_32xb128_in1k.py create mode 100644 configs/convnext/convnext-xlarge_64xb64_in1k.py create mode 100644 configs/convnext/metafile.yml create mode 100644 configs/cspnet/README.md create mode 100644 configs/cspnet/cspdarknet50_8xb32_in1k.py create mode 100644 configs/cspnet/cspresnet50_8xb32_in1k.py create mode 100644 configs/cspnet/cspresnext50_8xb32_in1k.py create mode 100644 configs/cspnet/metafile.yml create mode 100644 configs/csra/README.md create mode 100644 configs/csra/metafile.yml create mode 100644 configs/csra/resnet101-csra_1xb16_voc07-448px.py create mode 100644 configs/deit/README.md create mode 100644 configs/deit/deit-base-distilled_ft-16xb32_in1k-384px.py create mode 100644 configs/deit/deit-base-distilled_pt-16xb64_in1k.py create mode 100644 configs/deit/deit-base_ft-16xb32_in1k-384px.py create mode 100644 configs/deit/deit-base_pt-16xb64_in1k.py create mode 100644 configs/deit/deit-small-distilled_pt-4xb256_in1k.py create mode 100644 configs/deit/deit-small_pt-4xb256_in1k.py create mode 100644 configs/deit/deit-tiny-distilled_pt-4xb256_in1k.py create mode 100644 configs/deit/deit-tiny_pt-4xb256_in1k.py create mode 100644 configs/deit/metafile.yml create mode 100644 configs/densenet/README.md create mode 100644 configs/densenet/densenet121_4xb256_in1k.py create mode 100644 configs/densenet/densenet161_4xb256_in1k.py create mode 100644 configs/densenet/densenet169_4xb256_in1k.py create mode 100644 configs/densenet/densenet201_4xb256_in1k.py create mode 100644 configs/densenet/metafile.yml create mode 100644 configs/efficientformer/README.md create mode 100644 configs/efficientformer/efficientformer-l1_8xb128_in1k.py create mode 100644 configs/efficientformer/efficientformer-l3_8xb128_in1k.py create mode 100644 configs/efficientformer/efficientformer-l7_8xb128_in1k.py create mode 100644 configs/efficientformer/metafile.yml create mode 100644 configs/efficientnet/README.md create mode 100644 configs/efficientnet/efficientnet-b0_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-b0_8xb32_in1k.py create mode 100644 configs/efficientnet/efficientnet-b1_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-b1_8xb32_in1k.py create mode 100644 configs/efficientnet/efficientnet-b2_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-b2_8xb32_in1k.py create mode 100644 configs/efficientnet/efficientnet-b3_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-b3_8xb32_in1k.py create mode 100644 configs/efficientnet/efficientnet-b4_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-b4_8xb32_in1k.py create mode 100644 configs/efficientnet/efficientnet-b5_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-b5_8xb32_in1k.py create mode 100644 configs/efficientnet/efficientnet-b6_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-b6_8xb32_in1k.py create mode 100644 configs/efficientnet/efficientnet-b7_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-b7_8xb32_in1k.py create mode 100644 configs/efficientnet/efficientnet-b8_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-b8_8xb32_in1k.py create mode 100644 configs/efficientnet/efficientnet-em_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/efficientnet-es_8xb32-01norm_in1k.py create mode 100644 configs/efficientnet/metafile.yml create mode 100644 configs/fp16/resnet50_b32x8_fp16_dynamic_imagenet.py create mode 100644 configs/fp16/resnet50_b32x8_fp16_imagenet.py create mode 100644 configs/gpvit/gpvit_l1.py create mode 100644 configs/gpvit/gpvit_l2.py create mode 100644 configs/gpvit/gpvit_l3.py create mode 100644 configs/gpvit/gpvit_l4.py create mode 100644 configs/hornet/README.md create mode 100644 configs/hornet/hornet-base-gf_8xb64_in1k.py create mode 100644 configs/hornet/hornet-base_8xb64_in1k.py create mode 100644 configs/hornet/hornet-small-gf_8xb64_in1k.py create mode 100644 configs/hornet/hornet-small_8xb64_in1k.py create mode 100644 configs/hornet/hornet-tiny-gf_8xb128_in1k.py create mode 100644 configs/hornet/hornet-tiny_8xb128_in1k.py create mode 100644 configs/hornet/metafile.yml create mode 100644 configs/hrnet/README.md create mode 100644 configs/hrnet/hrnet-w18_4xb32_in1k.py create mode 100644 configs/hrnet/hrnet-w30_4xb32_in1k.py create mode 100644 configs/hrnet/hrnet-w32_4xb32_in1k.py create mode 100644 configs/hrnet/hrnet-w40_4xb32_in1k.py create mode 100644 configs/hrnet/hrnet-w44_4xb32_in1k.py create mode 100644 configs/hrnet/hrnet-w48_4xb32_in1k.py create mode 100644 configs/hrnet/hrnet-w64_4xb32_in1k.py create mode 100644 configs/hrnet/metafile.yml create mode 100644 configs/lenet/README.md create mode 100644 configs/lenet/lenet5_mnist.py create mode 100644 configs/mlp_mixer/README.md create mode 100644 configs/mlp_mixer/metafile.yml create mode 100644 configs/mlp_mixer/mlp-mixer-base-p16_64xb64_in1k.py create mode 100644 configs/mlp_mixer/mlp-mixer-large-p16_64xb64_in1k.py create mode 100644 configs/mobilenet_v2/README.md create mode 100644 configs/mobilenet_v2/metafile.yml create mode 100644 configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py create mode 100644 configs/mobilenet_v2/mobilenet_v2_b32x8_imagenet.py create mode 100644 configs/mobilenet_v3/README.md create mode 100644 configs/mobilenet_v3/metafile.yml create mode 100644 configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py create mode 100644 configs/mobilenet_v3/mobilenet-v3-small_8xb16_cifar10.py create mode 100644 configs/mobilenet_v3/mobilenet-v3-small_8xb32_in1k.py create mode 100644 configs/mobilenet_v3/mobilenet_v3_large_imagenet.py create mode 100644 configs/mobilenet_v3/mobilenet_v3_small_cifar.py create mode 100644 configs/mobilenet_v3/mobilenet_v3_small_imagenet.py create mode 100644 configs/mvit/README.md create mode 100644 configs/mvit/metafile.yml create mode 100644 configs/mvit/mvitv2-base_8xb256_in1k.py create mode 100644 configs/mvit/mvitv2-large_8xb256_in1k.py create mode 100644 configs/mvit/mvitv2-small_8xb256_in1k.py create mode 100644 configs/mvit/mvitv2-tiny_8xb256_in1k.py create mode 100644 configs/poolformer/README.md create mode 100644 configs/poolformer/metafile.yml create mode 100644 configs/poolformer/poolformer-m36_32xb128_in1k.py create mode 100644 configs/poolformer/poolformer-m48_32xb128_in1k.py create mode 100644 configs/poolformer/poolformer-s12_32xb128_in1k.py create mode 100644 configs/poolformer/poolformer-s24_32xb128_in1k.py create mode 100644 configs/poolformer/poolformer-s36_32xb128_in1k.py create mode 100644 configs/regnet/README.md create mode 100644 configs/regnet/metafile.yml create mode 100644 configs/regnet/regnetx-1.6gf_8xb128_in1k.py create mode 100644 configs/regnet/regnetx-12gf_8xb64_in1k.py create mode 100644 configs/regnet/regnetx-3.2gf_8xb64_in1k.py create mode 100644 configs/regnet/regnetx-4.0gf_8xb64_in1k.py create mode 100644 configs/regnet/regnetx-400mf_8xb128_in1k.py create mode 100644 configs/regnet/regnetx-6.4gf_8xb64_in1k.py create mode 100644 configs/regnet/regnetx-8.0gf_8xb64_in1k.py create mode 100644 configs/regnet/regnetx-800mf_8xb128_in1k.py create mode 100644 configs/repmlp/README.md create mode 100644 configs/repmlp/metafile.yml create mode 100644 configs/repmlp/repmlp-base_8xb64_in1k-256px.py create mode 100644 configs/repmlp/repmlp-base_8xb64_in1k.py create mode 100644 configs/repmlp/repmlp-base_delopy_8xb64_in1k.py create mode 100644 configs/repmlp/repmlp-base_deploy_8xb64_in1k-256px.py create mode 100644 configs/repvgg/README.md create mode 100644 configs/repvgg/deploy/repvgg-A0_deploy_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-A1_deploy_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-A2_deploy_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-B0_deploy_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-B1_deploy_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-B1g2_deploy_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-B1g4_deploy_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-B2_deploy_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-B2g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-B3_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-B3g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py create mode 100644 configs/repvgg/deploy/repvgg-D2se_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py create mode 100644 configs/repvgg/metafile.yml create mode 100644 configs/repvgg/repvgg-A0_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/repvgg-A1_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/repvgg-A2_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/repvgg-B0_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/repvgg-B1_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/repvgg-B1g2_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/repvgg-B1g4_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/repvgg-B2_4xb64-coslr-120e_in1k.py create mode 100644 configs/repvgg/repvgg-B2g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py create mode 100644 configs/repvgg/repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py create mode 100644 configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py create mode 100644 configs/repvgg/repvgg-D2se_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py create mode 100644 configs/res2net/README.md create mode 100644 configs/res2net/metafile.yml create mode 100644 configs/res2net/res2net101-w26-s4_8xb32_in1k.py create mode 100644 configs/res2net/res2net50-w14-s8_8xb32_in1k.py create mode 100644 configs/res2net/res2net50-w26-s8_8xb32_in1k.py create mode 100644 configs/resnest/README.md create mode 100644 configs/resnest/resnest101_32xb64_in1k.py create mode 100644 configs/resnest/resnest101_b64x32_imagenet.py create mode 100644 configs/resnest/resnest200_64xb32_in1k.py create mode 100644 configs/resnest/resnest200_b32x64_imagenet.py create mode 100644 configs/resnest/resnest269_64xb32_in1k.py create mode 100644 configs/resnest/resnest269_b32x64_imagenet.py create mode 100644 configs/resnest/resnest50_32xb64_in1k.py create mode 100644 configs/resnest/resnest50_b64x32_imagenet.py create mode 100644 configs/resnet/README.md create mode 100644 configs/resnet/metafile.yml create mode 100644 configs/resnet/resnet101_8xb16_cifar10.py create mode 100644 configs/resnet/resnet101_8xb32_in1k.py create mode 100644 configs/resnet/resnet101_b16x8_cifar10.py create mode 100644 configs/resnet/resnet101_b32x8_imagenet.py create mode 100644 configs/resnet/resnet152_8xb16_cifar10.py create mode 100644 configs/resnet/resnet152_8xb32_in1k.py create mode 100644 configs/resnet/resnet152_b16x8_cifar10.py create mode 100644 configs/resnet/resnet152_b32x8_imagenet.py create mode 100644 configs/resnet/resnet18_8xb16_cifar10.py create mode 100644 configs/resnet/resnet18_8xb32_in1k.py create mode 100644 configs/resnet/resnet18_b16x8_cifar10.py create mode 100644 configs/resnet/resnet18_b32x8_imagenet.py create mode 100644 configs/resnet/resnet34_8xb16_cifar10.py create mode 100644 configs/resnet/resnet34_8xb32_in1k.py create mode 100644 configs/resnet/resnet34_b16x8_cifar10.py create mode 100644 configs/resnet/resnet34_b32x8_imagenet.py create mode 100644 configs/resnet/resnet50_32xb64-warmup-coslr_in1k.py create mode 100644 configs/resnet/resnet50_32xb64-warmup-lbs_in1k.py create mode 100644 configs/resnet/resnet50_32xb64-warmup_in1k.py create mode 100644 configs/resnet/resnet50_8xb128_coslr-90e_in21k.py create mode 100644 configs/resnet/resnet50_8xb16-mixup_cifar10.py create mode 100644 configs/resnet/resnet50_8xb16_cifar10.py create mode 100644 configs/resnet/resnet50_8xb16_cifar100.py create mode 100644 configs/resnet/resnet50_8xb256-rsb-a1-600e_in1k.py create mode 100644 configs/resnet/resnet50_8xb256-rsb-a2-300e_in1k.py create mode 100644 configs/resnet/resnet50_8xb256-rsb-a3-100e_in1k.py create mode 100644 configs/resnet/resnet50_8xb32-coslr-preciseBN_in1k.py create mode 100644 configs/resnet/resnet50_8xb32-coslr_in1k.py create mode 100644 configs/resnet/resnet50_8xb32-cutmix_in1k.py create mode 100644 configs/resnet/resnet50_8xb32-fp16-dynamic_in1k.py create mode 100644 configs/resnet/resnet50_8xb32-fp16_in1k.py create mode 100644 configs/resnet/resnet50_8xb32-lbs_in1k.py create mode 100644 configs/resnet/resnet50_8xb32-mixup_in1k.py create mode 100644 configs/resnet/resnet50_8xb32_in1k.py create mode 100644 configs/resnet/resnet50_8xb8_cars.py create mode 100644 configs/resnet/resnet50_8xb8_cub.py create mode 100644 configs/resnet/resnet50_b16x8_cifar10.py create mode 100644 configs/resnet/resnet50_b16x8_cifar100.py create mode 100644 configs/resnet/resnet50_b16x8_cifar10_mixup.py create mode 100644 configs/resnet/resnet50_b32x8_coslr_imagenet.py create mode 100644 configs/resnet/resnet50_b32x8_cutmix_imagenet.py create mode 100644 configs/resnet/resnet50_b32x8_imagenet.py create mode 100644 configs/resnet/resnet50_b32x8_label_smooth_imagenet.py create mode 100644 configs/resnet/resnet50_b32x8_mixup_imagenet.py create mode 100644 configs/resnet/resnet50_b64x32_warmup_coslr_imagenet.py create mode 100644 configs/resnet/resnet50_b64x32_warmup_imagenet.py create mode 100644 configs/resnet/resnet50_b64x32_warmup_label_smooth_imagenet.py create mode 100644 configs/resnet/resnetv1c101_8xb32_in1k.py create mode 100644 configs/resnet/resnetv1c152_8xb32_in1k.py create mode 100644 configs/resnet/resnetv1c50_8xb32_in1k.py create mode 100644 configs/resnet/resnetv1d101_8xb32_in1k.py create mode 100644 configs/resnet/resnetv1d101_b32x8_imagenet.py create mode 100644 configs/resnet/resnetv1d152_8xb32_in1k.py create mode 100644 configs/resnet/resnetv1d152_b32x8_imagenet.py create mode 100644 configs/resnet/resnetv1d50_8xb32_in1k.py create mode 100644 configs/resnet/resnetv1d50_b32x8_imagenet.py create mode 100644 configs/resnext/README.md create mode 100644 configs/resnext/metafile.yml create mode 100644 configs/resnext/resnext101-32x4d_8xb32_in1k.py create mode 100644 configs/resnext/resnext101-32x8d_8xb32_in1k.py create mode 100644 configs/resnext/resnext101_32x4d_b32x8_imagenet.py create mode 100644 configs/resnext/resnext101_32x8d_b32x8_imagenet.py create mode 100644 configs/resnext/resnext152-32x4d_8xb32_in1k.py create mode 100644 configs/resnext/resnext152_32x4d_b32x8_imagenet.py create mode 100644 configs/resnext/resnext50-32x4d_8xb32_in1k.py create mode 100644 configs/resnext/resnext50_32x4d_b32x8_imagenet.py create mode 100644 configs/seresnet/README.md create mode 100644 configs/seresnet/metafile.yml create mode 100644 configs/seresnet/seresnet101_8xb32_in1k.py create mode 100644 configs/seresnet/seresnet101_b32x8_imagenet.py create mode 100644 configs/seresnet/seresnet50_8xb32_in1k.py create mode 100644 configs/seresnet/seresnet50_b32x8_imagenet.py create mode 100644 configs/seresnet/seresnext101-32x4d_8xb32_in1k.py create mode 100644 configs/seresnet/seresnext101_32x4d_b32x8_imagenet.py create mode 100644 configs/seresnet/seresnext50-32x4d_8xb32_in1k.py create mode 100644 configs/seresnet/seresnext50_32x4d_b32x8_imagenet.py create mode 100644 configs/shufflenet_v1/README.md create mode 100644 configs/shufflenet_v1/metafile.yml create mode 100644 configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py create mode 100644 configs/shufflenet_v1/shufflenet_v1_1x_b64x16_linearlr_bn_nowd_imagenet.py create mode 100644 configs/shufflenet_v2/README.md create mode 100644 configs/shufflenet_v2/metafile.yml create mode 100644 configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py create mode 100644 configs/shufflenet_v2/shufflenet_v2_1x_b64x16_linearlr_bn_nowd_imagenet.py create mode 100644 configs/swin_transformer/README.md create mode 100644 configs/swin_transformer/metafile.yml create mode 100644 configs/swin_transformer/swin-base_16xb64_in1k-384px.py create mode 100644 configs/swin_transformer/swin-base_16xb64_in1k.py create mode 100644 configs/swin_transformer/swin-large_16xb64_in1k-384px.py create mode 100644 configs/swin_transformer/swin-large_16xb64_in1k.py create mode 100644 configs/swin_transformer/swin-large_8xb8_cub_384px.py create mode 100644 configs/swin_transformer/swin-small_16xb64_in1k.py create mode 100644 configs/swin_transformer/swin-tiny_16xb64_in1k.py create mode 100644 configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py create mode 100644 configs/swin_transformer/swin_base_384_evalonly_imagenet.py create mode 100644 configs/swin_transformer/swin_large_224_evalonly_imagenet.py create mode 100644 configs/swin_transformer/swin_large_384_evalonly_imagenet.py create mode 100644 configs/swin_transformer/swin_small_224_b16x64_300e_imagenet.py create mode 100644 configs/swin_transformer/swin_tiny_224_b16x64_300e_imagenet.py create mode 100644 configs/swin_transformer_v2/README.md create mode 100644 configs/swin_transformer_v2/metafile.yml create mode 100644 configs/swin_transformer_v2/swinv2-base-w16_16xb64_in1k-256px.py create mode 100644 configs/swin_transformer_v2/swinv2-base-w16_in21k-pre_16xb64_in1k-256px.py create mode 100644 configs/swin_transformer_v2/swinv2-base-w24_in21k-pre_16xb64_in1k-384px.py create mode 100644 configs/swin_transformer_v2/swinv2-base-w8_16xb64_in1k-256px.py create mode 100644 configs/swin_transformer_v2/swinv2-large-w16_in21k-pre_16xb64_in1k-256px.py create mode 100644 configs/swin_transformer_v2/swinv2-large-w24_in21k-pre_16xb64_in1k-384px.py create mode 100644 configs/swin_transformer_v2/swinv2-small-w16_16xb64_in1k-256px.py create mode 100644 configs/swin_transformer_v2/swinv2-small-w8_16xb64_in1k-256px.py create mode 100644 configs/swin_transformer_v2/swinv2-tiny-w16_16xb64_in1k-256px.py create mode 100644 configs/swin_transformer_v2/swinv2-tiny-w8_16xb64_in1k-256px.py create mode 100644 configs/t2t_vit/README.md create mode 100644 configs/t2t_vit/metafile.yml create mode 100644 configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py create mode 100644 configs/t2t_vit/t2t-vit-t-19_8xb64_in1k.py create mode 100644 configs/t2t_vit/t2t-vit-t-24_8xb64_in1k.py create mode 100644 configs/tnt/README.md create mode 100644 configs/tnt/metafile.yml create mode 100644 configs/tnt/tnt-s-p16_16xb64_in1k.py create mode 100644 configs/tnt/tnt_s_patch16_224_evalonly_imagenet.py create mode 100644 configs/twins/README.md create mode 100644 configs/twins/metafile.yml create mode 100644 configs/twins/twins-pcpvt-base_8xb128_in1k.py create mode 100644 configs/twins/twins-pcpvt-large_16xb64_in1k.py create mode 100644 configs/twins/twins-pcpvt-small_8xb128_in1k.py create mode 100644 configs/twins/twins-svt-base_8xb128_in1k.py create mode 100644 configs/twins/twins-svt-large_16xb64_in1k.py create mode 100644 configs/twins/twins-svt-small_8xb128_in1k.py create mode 100644 configs/van/README.md create mode 100644 configs/van/metafile.yml create mode 100644 configs/van/van-b0_8xb128_in1k.py create mode 100644 configs/van/van-b1_8xb128_in1k.py create mode 100644 configs/van/van-b2_8xb128_in1k.py create mode 100644 configs/van/van-b3_8xb128_in1k.py create mode 100644 configs/van/van-b4_8xb128_in1k.py create mode 100644 configs/van/van-base_8xb128_in1k.py create mode 100644 configs/van/van-large_8xb128_in1k.py create mode 100644 configs/van/van-small_8xb128_in1k.py create mode 100644 configs/van/van-tiny_8xb128_in1k.py create mode 100644 configs/vgg/README.md create mode 100644 configs/vgg/metafile.yml create mode 100644 configs/vgg/vgg11_8xb32_in1k.py create mode 100644 configs/vgg/vgg11_b32x8_imagenet.py create mode 100644 configs/vgg/vgg11bn_8xb32_in1k.py create mode 100644 configs/vgg/vgg11bn_b32x8_imagenet.py create mode 100644 configs/vgg/vgg13_8xb32_in1k.py create mode 100644 configs/vgg/vgg13_b32x8_imagenet.py create mode 100644 configs/vgg/vgg13bn_8xb32_in1k.py create mode 100644 configs/vgg/vgg13bn_b32x8_imagenet.py create mode 100644 configs/vgg/vgg16_8xb16_voc.py create mode 100644 configs/vgg/vgg16_8xb32_in1k.py create mode 100644 configs/vgg/vgg16_b16x8_voc.py create mode 100644 configs/vgg/vgg16_b32x8_imagenet.py create mode 100644 configs/vgg/vgg16bn_8xb32_in1k.py create mode 100644 configs/vgg/vgg16bn_b32x8_imagenet.py create mode 100644 configs/vgg/vgg19_8xb32_in1k.py create mode 100644 configs/vgg/vgg19_b32x8_imagenet.py create mode 100644 configs/vgg/vgg19bn_8xb32_in1k.py create mode 100644 configs/vgg/vgg19bn_b32x8_imagenet.py create mode 100644 configs/vision_transformer/README.md create mode 100644 configs/vision_transformer/metafile.yml create mode 100644 configs/vision_transformer/vit-base-p16_ft-4xb544-ipu_in1k.py create mode 100644 configs/vision_transformer/vit-base-p16_ft-64xb64_in1k-384.py create mode 100644 configs/vision_transformer/vit-base-p16_pt-64xb64_in1k-224.py create mode 100644 configs/vision_transformer/vit-base-p32_ft-64xb64_in1k-384.py create mode 100644 configs/vision_transformer/vit-base-p32_pt-64xb64_in1k-224.py create mode 100644 configs/vision_transformer/vit-large-p16_ft-64xb64_in1k-384.py create mode 100644 configs/vision_transformer/vit-large-p16_pt-64xb64_in1k-224.py create mode 100644 configs/vision_transformer/vit-large-p32_ft-64xb64_in1k-384.py create mode 100644 configs/vision_transformer/vit-large-p32_pt-64xb64_in1k-224.py create mode 100644 configs/wrn/README.md create mode 100644 configs/wrn/metafile.yml create mode 100644 configs/wrn/wide-resnet101_8xb32_in1k.py create mode 100644 configs/wrn/wide-resnet50_8xb32_in1k.py create mode 100644 configs/wrn/wide-resnet50_timm_8xb32_in1k.py create mode 100644 docs/en/Makefile create mode 100644 docs/en/_static/css/readthedocs.css create mode 100644 docs/en/_static/image/mmcls-logo.png create mode 100644 docs/en/_static/image/tools/analysis/analyze_log.jpg create mode 100644 docs/en/_static/image/tools/visualization/lr_schedule1.png create mode 100644 docs/en/_static/image/tools/visualization/lr_schedule2.png create mode 100644 docs/en/_static/js/custom.js create mode 100644 docs/en/_templates/classtemplate.rst create mode 100644 docs/en/api/apis.rst create mode 100644 docs/en/api/core.rst create mode 100644 docs/en/api/datasets.rst create mode 100644 docs/en/api/models.rst create mode 100644 docs/en/api/models.utils.augment.rst create mode 100644 docs/en/api/models.utils.rst create mode 100644 docs/en/api/transforms.rst create mode 100644 docs/en/api/utils.rst create mode 100644 docs/en/changelog.md create mode 120000 docs/en/community/CONTRIBUTING.md create mode 100644 docs/en/compatibility.md create mode 100644 docs/en/conf.py create mode 100644 docs/en/device/npu.md create mode 100644 docs/en/docutils.conf create mode 100644 docs/en/faq.md create mode 100644 docs/en/getting_started.md create mode 100644 docs/en/index.rst create mode 100644 docs/en/install.md create mode 100644 docs/en/model_zoo.md create mode 100755 docs/en/stat.py create mode 100644 docs/en/tools/analysis.md create mode 100644 docs/en/tools/miscellaneous.md create mode 100644 docs/en/tools/model_serving.md create mode 100644 docs/en/tools/onnx2tensorrt.md create mode 100644 docs/en/tools/pytorch2onnx.md create mode 100644 docs/en/tools/pytorch2torchscript.md create mode 100644 docs/en/tools/visualization.md create mode 100755 docs/en/tutorials/MMClassification_python.ipynb create mode 100755 docs/en/tutorials/MMClassification_tools.ipynb create mode 100644 docs/en/tutorials/config.md create mode 100644 docs/en/tutorials/data_pipeline.md create mode 100644 docs/en/tutorials/finetune.md create mode 100644 docs/en/tutorials/new_dataset.md create mode 100644 docs/en/tutorials/new_modules.md create mode 100644 docs/en/tutorials/runtime.md create mode 100644 docs/en/tutorials/schedule.md create mode 100644 docs/zh_CN/Makefile create mode 100644 docs/zh_CN/_static/css/readthedocs.css create mode 100644 docs/zh_CN/_static/image/mmcls-logo.png create mode 100644 docs/zh_CN/_static/image/tools/analysis/analyze_log.jpg create mode 100644 docs/zh_CN/_static/image/tools/visualization/lr_schedule1.png create mode 100644 docs/zh_CN/_static/image/tools/visualization/lr_schedule2.png create mode 100644 docs/zh_CN/_static/js/custom.js create mode 120000 docs/zh_CN/api create mode 120000 docs/zh_CN/changelog.md create mode 100644 docs/zh_CN/community/CONTRIBUTING.md create mode 100644 docs/zh_CN/compatibility.md create mode 100644 docs/zh_CN/conf.py create mode 100644 docs/zh_CN/device/npu.md create mode 100644 docs/zh_CN/docutils.conf create mode 100644 docs/zh_CN/faq.md create mode 100644 docs/zh_CN/getting_started.md create mode 100644 docs/zh_CN/imgs/qq_group_qrcode.jpg create mode 100644 docs/zh_CN/imgs/zhihu_qrcode.jpg create mode 100644 docs/zh_CN/index.rst create mode 100644 docs/zh_CN/install.md create mode 120000 docs/zh_CN/model_zoo.md create mode 100755 docs/zh_CN/stat.py create mode 100644 docs/zh_CN/tools/analysis.md create mode 100644 docs/zh_CN/tools/miscellaneous.md create mode 100644 docs/zh_CN/tools/model_serving.md create mode 100644 docs/zh_CN/tools/onnx2tensorrt.md create mode 100644 docs/zh_CN/tools/pytorch2onnx.md create mode 100644 docs/zh_CN/tools/pytorch2torchscript.md create mode 100644 docs/zh_CN/tools/visualization.md create mode 100755 docs/zh_CN/tutorials/MMClassification_python_cn.ipynb create mode 100755 docs/zh_CN/tutorials/MMClassification_tools_cn.ipynb create mode 100644 docs/zh_CN/tutorials/config.md create mode 100644 docs/zh_CN/tutorials/data_pipeline.md create mode 100644 docs/zh_CN/tutorials/finetune.md create mode 100644 docs/zh_CN/tutorials/new_dataset.md create mode 100644 docs/zh_CN/tutorials/new_modules.md create mode 100644 docs/zh_CN/tutorials/runtime.md create mode 100644 docs/zh_CN/tutorials/schedule.md create mode 100644 downstream/mmdetection/.circleci/config.yml create mode 100644 downstream/mmdetection/.dev_scripts/batch_test_list.py create mode 100644 downstream/mmdetection/.dev_scripts/batch_train_list.txt create mode 100644 downstream/mmdetection/.dev_scripts/benchmark_filter.py create mode 100644 downstream/mmdetection/.dev_scripts/benchmark_inference_fps.py create mode 100644 downstream/mmdetection/.dev_scripts/benchmark_test_image.py create mode 100755 downstream/mmdetection/.dev_scripts/check_links.py create mode 100644 downstream/mmdetection/.dev_scripts/convert_test_benchmark_script.py create mode 100644 downstream/mmdetection/.dev_scripts/convert_train_benchmark_script.py create mode 100644 downstream/mmdetection/.dev_scripts/gather_models.py create mode 100644 downstream/mmdetection/.dev_scripts/gather_test_benchmark_metric.py create mode 100644 downstream/mmdetection/.dev_scripts/gather_train_benchmark_metric.py create mode 100644 downstream/mmdetection/.dev_scripts/linter.sh create mode 100644 downstream/mmdetection/.dev_scripts/test_benchmark.sh create mode 100644 downstream/mmdetection/.dev_scripts/test_init_backbone.py create mode 100644 downstream/mmdetection/.dev_scripts/train_benchmark.sh create mode 100644 downstream/mmdetection/.github/CODE_OF_CONDUCT.md create mode 100644 downstream/mmdetection/.github/CONTRIBUTING.md create mode 100644 downstream/mmdetection/.github/ISSUE_TEMPLATE/config.yml create mode 100644 downstream/mmdetection/.github/ISSUE_TEMPLATE/error-report.md create mode 100644 downstream/mmdetection/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 downstream/mmdetection/.github/ISSUE_TEMPLATE/general_questions.md create mode 100644 downstream/mmdetection/.github/ISSUE_TEMPLATE/reimplementation_questions.md create mode 100644 downstream/mmdetection/.github/pull_request_template.md create mode 100644 downstream/mmdetection/.github/workflows/build.yml create mode 100644 downstream/mmdetection/.github/workflows/build_pat.yml create mode 100644 downstream/mmdetection/.github/workflows/deploy.yml create mode 100644 downstream/mmdetection/.github/workflows/lint.yml create mode 100644 downstream/mmdetection/.gitignore create mode 100644 downstream/mmdetection/.owners.yml create mode 100644 downstream/mmdetection/.pre-commit-config.yaml create mode 100644 downstream/mmdetection/.readthedocs.yml create mode 100644 downstream/mmdetection/CITATION.cff create mode 100644 downstream/mmdetection/LICENSE create mode 100644 downstream/mmdetection/MANIFEST.in create mode 100644 downstream/mmdetection/README.md create mode 100644 downstream/mmdetection/configs/_base_/datasets/cityscapes_detection.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/cityscapes_instance.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/coco_detection.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/coco_instance.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/coco_instance_semantic.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/coco_panoptic.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/deepfashion.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/lvis_v0.5_instance.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/lvis_v1_instance.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/openimages_detection.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/voc0712.py create mode 100644 downstream/mmdetection/configs/_base_/datasets/wider_face.py create mode 100644 downstream/mmdetection/configs/_base_/default_runtime.py create mode 100644 downstream/mmdetection/configs/_base_/models/cascade_mask_rcnn_r50_fpn.py create mode 100644 downstream/mmdetection/configs/_base_/models/cascade_rcnn_r50_fpn.py create mode 100644 downstream/mmdetection/configs/_base_/models/fast_rcnn_r50_fpn.py create mode 100644 downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_caffe_c4.py create mode 100644 downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_caffe_dc5.py create mode 100644 downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_fpn.py create mode 100644 downstream/mmdetection/configs/_base_/models/mask_rcnn_r50_caffe_c4.py create mode 100644 downstream/mmdetection/configs/_base_/models/mask_rcnn_r50_fpn.py create mode 100644 downstream/mmdetection/configs/_base_/models/retinanet_r50_fpn.py create mode 100644 downstream/mmdetection/configs/_base_/models/rpn_r50_caffe_c4.py create mode 100644 downstream/mmdetection/configs/_base_/models/rpn_r50_fpn.py create mode 100644 downstream/mmdetection/configs/_base_/models/ssd300.py create mode 100644 downstream/mmdetection/configs/_base_/schedules/schedule_1x.py create mode 100644 downstream/mmdetection/configs/_base_/schedules/schedule_20e.py create mode 100644 downstream/mmdetection/configs/_base_/schedules/schedule_2x.py create mode 100644 downstream/mmdetection/configs/albu_example/README.md create mode 100644 downstream/mmdetection/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py create mode 100644 downstream/mmdetection/configs/atss/README.md create mode 100644 downstream/mmdetection/configs/atss/atss_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/atss/atss_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/atss/metafile.yml create mode 100644 downstream/mmdetection/configs/autoassign/README.md create mode 100644 downstream/mmdetection/configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py create mode 100644 downstream/mmdetection/configs/autoassign/metafile.yml create mode 100644 downstream/mmdetection/configs/carafe/README.md create mode 100644 downstream/mmdetection/configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py create mode 100644 downstream/mmdetection/configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py create mode 100644 downstream/mmdetection/configs/carafe/metafile.yml create mode 100644 downstream/mmdetection/configs/cascade_rcnn/README.md create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rcnn/metafile.yml create mode 100644 downstream/mmdetection/configs/cascade_rpn/README.md create mode 100644 downstream/mmdetection/configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/cascade_rpn/metafile.yml create mode 100644 downstream/mmdetection/configs/centernet/README.md create mode 100644 downstream/mmdetection/configs/centernet/centernet_resnet18_140e_coco.py create mode 100644 downstream/mmdetection/configs/centernet/centernet_resnet18_dcnv2_140e_coco.py create mode 100644 downstream/mmdetection/configs/centernet/metafile.yml create mode 100644 downstream/mmdetection/configs/centripetalnet/README.md create mode 100644 downstream/mmdetection/configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py create mode 100644 downstream/mmdetection/configs/centripetalnet/metafile.yml create mode 100644 downstream/mmdetection/configs/cityscapes/README.md create mode 100644 downstream/mmdetection/configs/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes.py create mode 100644 downstream/mmdetection/configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py create mode 100644 downstream/mmdetection/configs/common/lsj_100e_coco_instance.py create mode 100644 downstream/mmdetection/configs/common/mstrain-poly_3x_coco_instance.py create mode 100644 downstream/mmdetection/configs/common/mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/common/mstrain_3x_coco_instance.py create mode 100644 downstream/mmdetection/configs/common/ssj_270k_coco_instance.py create mode 100644 downstream/mmdetection/configs/common/ssj_scp_270k_coco_instance.py create mode 100644 downstream/mmdetection/configs/convnext/README.md create mode 100644 downstream/mmdetection/configs/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py create mode 100644 downstream/mmdetection/configs/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py create mode 100644 downstream/mmdetection/configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py create mode 100644 downstream/mmdetection/configs/convnext/metafile.yml create mode 100644 downstream/mmdetection/configs/cornernet/README.md create mode 100644 downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py create mode 100644 downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py create mode 100644 downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py create mode 100644 downstream/mmdetection/configs/cornernet/metafile.yml create mode 100644 downstream/mmdetection/configs/dcn/README.md create mode 100644 downstream/mmdetection/configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcn/metafile.yml create mode 100644 downstream/mmdetection/configs/dcnv2/README.md create mode 100644 downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcnv2/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/dcnv2/metafile.yml create mode 100644 downstream/mmdetection/configs/ddod/README.md create mode 100644 downstream/mmdetection/configs/ddod/ddod_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/ddod/metafile.yml create mode 100644 downstream/mmdetection/configs/deepfashion/README.md create mode 100644 downstream/mmdetection/configs/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion.py create mode 100644 downstream/mmdetection/configs/deformable_detr/README.md create mode 100644 downstream/mmdetection/configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py create mode 100644 downstream/mmdetection/configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py create mode 100644 downstream/mmdetection/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py create mode 100644 downstream/mmdetection/configs/deformable_detr/metafile.yml create mode 100644 downstream/mmdetection/configs/detectors/README.md create mode 100644 downstream/mmdetection/configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py create mode 100644 downstream/mmdetection/configs/detectors/cascade_rcnn_r50_sac_1x_coco.py create mode 100644 downstream/mmdetection/configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py create mode 100644 downstream/mmdetection/configs/detectors/detectors_htc_r101_20e_coco.py create mode 100644 downstream/mmdetection/configs/detectors/detectors_htc_r50_1x_coco.py create mode 100644 downstream/mmdetection/configs/detectors/htc_r50_rfp_1x_coco.py create mode 100644 downstream/mmdetection/configs/detectors/htc_r50_sac_1x_coco.py create mode 100644 downstream/mmdetection/configs/detectors/metafile.yml create mode 100644 downstream/mmdetection/configs/detr/README.md create mode 100644 downstream/mmdetection/configs/detr/detr_r50_8x2_150e_coco.py create mode 100644 downstream/mmdetection/configs/detr/metafile.yml create mode 100644 downstream/mmdetection/configs/double_heads/README.md create mode 100644 downstream/mmdetection/configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/double_heads/metafile.yml create mode 100644 downstream/mmdetection/configs/dyhead/README.md create mode 100644 downstream/mmdetection/configs/dyhead/atss_r50_caffe_fpn_dyhead_1x_coco.py create mode 100644 downstream/mmdetection/configs/dyhead/atss_r50_fpn_dyhead_1x_coco.py create mode 100644 downstream/mmdetection/configs/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/dyhead/metafile.yml create mode 100644 downstream/mmdetection/configs/dynamic_rcnn/README.md create mode 100644 downstream/mmdetection/configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/dynamic_rcnn/metafile.yml create mode 100644 downstream/mmdetection/configs/efficientnet/README.md create mode 100644 downstream/mmdetection/configs/efficientnet/metafile.yml create mode 100644 downstream/mmdetection/configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py create mode 100644 downstream/mmdetection/configs/empirical_attention/README.md create mode 100644 downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py create mode 100644 downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py create mode 100644 downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py create mode 100644 downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py create mode 100644 downstream/mmdetection/configs/empirical_attention/metafile.yml create mode 100644 downstream/mmdetection/configs/fast_rcnn/README.md create mode 100644 downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/README.md create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_90k_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_90k_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_ciou_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_soft_nms_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/faster_rcnn/metafile.yml create mode 100644 downstream/mmdetection/configs/fcos/README.md create mode 100644 downstream/mmdetection/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py create mode 100644 downstream/mmdetection/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py create mode 100644 downstream/mmdetection/configs/fcos/fcos_center_r50_caffe_fpn_gn-head_1x_coco.py create mode 100644 downstream/mmdetection/configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py create mode 100644 downstream/mmdetection/configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py create mode 100644 downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py create mode 100644 downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py create mode 100644 downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py create mode 100644 downstream/mmdetection/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py create mode 100644 downstream/mmdetection/configs/fcos/metafile.yml create mode 100644 downstream/mmdetection/configs/foveabox/README.md create mode 100644 downstream/mmdetection/configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py create mode 100644 downstream/mmdetection/configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py create mode 100644 downstream/mmdetection/configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/foveabox/metafile.yml create mode 100644 downstream/mmdetection/configs/fpg/README.md create mode 100644 downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpn_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/fpg/metafile.yml create mode 100644 downstream/mmdetection/configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/free_anchor/README.md create mode 100644 downstream/mmdetection/configs/free_anchor/metafile.yml create mode 100644 downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/fsaf/README.md create mode 100644 downstream/mmdetection/configs/fsaf/fsaf_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/fsaf/fsaf_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/fsaf/metafile.yml create mode 100644 downstream/mmdetection/configs/gcnet/README.md create mode 100644 downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/gcnet/metafile.yml create mode 100644 downstream/mmdetection/configs/gfl/README.md create mode 100644 downstream/mmdetection/configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/gfl/gfl_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/gfl/metafile.yml create mode 100644 downstream/mmdetection/configs/ghm/README.md create mode 100644 downstream/mmdetection/configs/ghm/metafile.yml create mode 100644 downstream/mmdetection/configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/README.md create mode 100644 downstream/mmdetection/configs/gn+ws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py create mode 100644 downstream/mmdetection/configs/gn+ws/metafile.yml create mode 100644 downstream/mmdetection/configs/gn/README.md create mode 100644 downstream/mmdetection/configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py create mode 100644 downstream/mmdetection/configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py create mode 100644 downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py create mode 100644 downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py create mode 100644 downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py create mode 100644 downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py create mode 100644 downstream/mmdetection/configs/gn/metafile.yml create mode 100644 downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_1x.py create mode 100644 downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_3x.py create mode 100644 downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_1x.py create mode 100644 downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_3x.py create mode 100644 downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_1x.py create mode 100644 downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_3x.py create mode 100644 downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_1x.py create mode 100644 downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_3x.py create mode 100644 downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_1x.py create mode 100644 downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_3x.py create mode 100644 downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_1x.py create mode 100644 downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_3x.py create mode 100644 downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_1x.py create mode 100644 downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_3x.py create mode 100644 downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_1x.py create mode 100644 downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_3x.py create mode 100644 downstream/mmdetection/configs/grid_rcnn/README.md create mode 100644 downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py create mode 100644 downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_1x_coco.py create mode 100644 downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py create mode 100644 downstream/mmdetection/configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py create mode 100644 downstream/mmdetection/configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py create mode 100644 downstream/mmdetection/configs/grid_rcnn/metafile.yml create mode 100644 downstream/mmdetection/configs/groie/README.md create mode 100644 downstream/mmdetection/configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py create mode 100644 downstream/mmdetection/configs/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py create mode 100644 downstream/mmdetection/configs/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py create mode 100644 downstream/mmdetection/configs/groie/mask_rcnn_r50_fpn_groie_1x_coco.py create mode 100644 downstream/mmdetection/configs/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py create mode 100644 downstream/mmdetection/configs/groie/metafile.yml create mode 100644 downstream/mmdetection/configs/guided_anchoring/README.md create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_fast_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_faster_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_mstrain_2x.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_rpn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/guided_anchoring/metafile.yml create mode 100644 downstream/mmdetection/configs/hrnet/README.md create mode 100644 downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w18_20e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w32_20e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w40_20e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w40_28e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/htc_x101_64x4d_fpn_16x1_28e_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py create mode 100644 downstream/mmdetection/configs/hrnet/metafile.yml create mode 100644 downstream/mmdetection/configs/htc/README.md create mode 100644 downstream/mmdetection/configs/htc/htc_r101_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/htc/htc_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/htc/htc_r50_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/htc/htc_without_semantic_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py create mode 100644 downstream/mmdetection/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py create mode 100644 downstream/mmdetection/configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py create mode 100644 downstream/mmdetection/configs/htc/metafile.yml create mode 100644 downstream/mmdetection/configs/instaboost/README.md create mode 100644 downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_r101_fpn_instaboost_4x_coco.py create mode 100644 downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py create mode 100644 downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py create mode 100644 downstream/mmdetection/configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py create mode 100644 downstream/mmdetection/configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py create mode 100644 downstream/mmdetection/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py create mode 100644 downstream/mmdetection/configs/instaboost/metafile.yml create mode 100644 downstream/mmdetection/configs/lad/README.md create mode 100644 downstream/mmdetection/configs/lad/lad_r101_paa_r50_fpn_coco_1x.py create mode 100644 downstream/mmdetection/configs/lad/lad_r50_paa_r101_fpn_coco_1x.py create mode 100644 downstream/mmdetection/configs/lad/metafile.yml create mode 100644 downstream/mmdetection/configs/ld/README.md create mode 100644 downstream/mmdetection/configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py create mode 100644 downstream/mmdetection/configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py create mode 100644 downstream/mmdetection/configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py create mode 100644 downstream/mmdetection/configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py create mode 100644 downstream/mmdetection/configs/ld/metafile.yml create mode 100644 downstream/mmdetection/configs/legacy_1.x/README.md create mode 100644 downstream/mmdetection/configs/legacy_1.x/cascade_mask_rcnn_r50_fpn_1x_coco_v1.py create mode 100644 downstream/mmdetection/configs/legacy_1.x/faster_rcnn_r50_fpn_1x_coco_v1.py create mode 100644 downstream/mmdetection/configs/legacy_1.x/mask_rcnn_r50_fpn_1x_coco_v1.py create mode 100644 downstream/mmdetection/configs/legacy_1.x/retinanet_r50_caffe_fpn_1x_coco_v1.py create mode 100644 downstream/mmdetection/configs/legacy_1.x/retinanet_r50_fpn_1x_coco_v1.py create mode 100644 downstream/mmdetection/configs/legacy_1.x/ssd300_coco_v1.py create mode 100644 downstream/mmdetection/configs/libra_rcnn/README.md create mode 100644 downstream/mmdetection/configs/libra_rcnn/libra_fast_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/libra_rcnn/metafile.yml create mode 100644 downstream/mmdetection/configs/lvis/README.md create mode 100644 downstream/mmdetection/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py create mode 100644 downstream/mmdetection/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py create mode 100644 downstream/mmdetection/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py create mode 100644 downstream/mmdetection/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py create mode 100644 downstream/mmdetection/configs/mask2former/README.md create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py create mode 100644 downstream/mmdetection/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py create mode 100644 downstream/mmdetection/configs/mask2former/metafile.yml create mode 100644 downstream/mmdetection/configs/mask_rcnn/README.md create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_c4_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_wandb_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_poly_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/mask_rcnn/metafile.yml create mode 100644 downstream/mmdetection/configs/maskformer/README.md create mode 100644 downstream/mmdetection/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py create mode 100644 downstream/mmdetection/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py create mode 100644 downstream/mmdetection/configs/maskformer/metafile.yml create mode 100644 downstream/mmdetection/configs/ms_rcnn/README.md create mode 100644 downstream/mmdetection/configs/ms_rcnn/metafile.yml create mode 100644 downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/nas_fcos/README.md create mode 100644 downstream/mmdetection/configs/nas_fcos/metafile.yml create mode 100644 downstream/mmdetection/configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py create mode 100644 downstream/mmdetection/configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py create mode 100644 downstream/mmdetection/configs/nas_fpn/README.md create mode 100644 downstream/mmdetection/configs/nas_fpn/metafile.yml create mode 100644 downstream/mmdetection/configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py create mode 100644 downstream/mmdetection/configs/openimages/README.md create mode 100644 downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py create mode 100644 downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py create mode 100644 downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py create mode 100644 downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py create mode 100644 downstream/mmdetection/configs/openimages/metafile.yml create mode 100644 downstream/mmdetection/configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py create mode 100644 downstream/mmdetection/configs/openimages/ssd300_32x8_36e_openimages.py create mode 100644 downstream/mmdetection/configs/paa/README.md create mode 100644 downstream/mmdetection/configs/paa/metafile.yml create mode 100644 downstream/mmdetection/configs/paa/paa_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/paa/paa_r101_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/paa/paa_r101_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/paa/paa_r50_fpn_1.5x_coco.py create mode 100644 downstream/mmdetection/configs/paa/paa_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/paa/paa_r50_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/paa/paa_r50_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/pafpn/README.md create mode 100644 downstream/mmdetection/configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pafpn/metafile.yml create mode 100644 downstream/mmdetection/configs/panoptic_fpn/README.md create mode 100644 downstream/mmdetection/configs/panoptic_fpn/metafile.yml create mode 100644 downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/pascal_voc/README.md create mode 100644 downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py create mode 100644 downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py create mode 100644 downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712_cocofmt.py create mode 100644 downstream/mmdetection/configs/pascal_voc/retinanet_r50_fpn_1x_voc0712.py create mode 100644 downstream/mmdetection/configs/pascal_voc/ssd300_voc0712.py create mode 100644 downstream/mmdetection/configs/pascal_voc/ssd512_voc0712.py create mode 100644 downstream/mmdetection/configs/pisa/README.md create mode 100644 downstream/mmdetection/configs/pisa/metafile.yml create mode 100644 downstream/mmdetection/configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pisa/pisa_mask_rcnn_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pisa/pisa_ssd300_coco.py create mode 100644 downstream/mmdetection/configs/pisa/pisa_ssd512_coco.py create mode 100644 downstream/mmdetection/configs/point_rend/README.md create mode 100644 downstream/mmdetection/configs/point_rend/metafile.yml create mode 100644 downstream/mmdetection/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/README.md create mode 100644 downstream/mmdetection/configs/pvt/metafile.yml create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvt-l_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvt-m_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvt-s_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvt-t_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvtv2-b0_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvtv2-b1_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvtv2-b2_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvtv2-b3_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvtv2-b4_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/pvt/retinanet_pvtv2-b5_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/queryinst/README.md create mode 100644 downstream/mmdetection/configs/queryinst/metafile.yml create mode 100644 downstream/mmdetection/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/README.md create mode 100644 downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/metafile.yml create mode 100644 downstream/mmdetection/configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/README.md create mode 100644 downstream/mmdetection/configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+head_1x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/metafile.yml create mode 100644 downstream/mmdetection/configs/reppoints/reppoints.png create mode 100644 downstream/mmdetection/configs/reppoints/reppoints_minmax_r50_fpn_gn-neck+head_1x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/reppoints_moment_r101_fpn_gn-neck+head_2x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py create mode 100644 downstream/mmdetection/configs/reppoints/reppoints_partial_minmax_r50_fpn_gn-neck+head_1x_coco.py create mode 100644 downstream/mmdetection/configs/res2net/README.md create mode 100644 downstream/mmdetection/configs/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/res2net/cascade_rcnn_r2_101_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/res2net/htc_r2_101_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/res2net/mask_rcnn_r2_101_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/res2net/metafile.yml create mode 100644 downstream/mmdetection/configs/resnest/README.md create mode 100644 downstream/mmdetection/configs/resnest/cascade_mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnest/cascade_mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnest/cascade_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnest/cascade_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnest/faster_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnest/mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnest/metafile.yml create mode 100644 downstream/mmdetection/configs/resnet_strikes_back/README.md create mode 100644 downstream/mmdetection/configs/resnet_strikes_back/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnet_strikes_back/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnet_strikes_back/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/resnet_strikes_back/metafile.yml create mode 100644 downstream/mmdetection/configs/resnet_strikes_back/retinanet_r50_fpn_rsb-pretrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/README.md create mode 100644 downstream/mmdetection/configs/retinanet/metafile.yml create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r101_caffe_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r101_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r101_fpn_mstrain_640-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r18_fpn_1x8_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r18_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r50_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r50_fpn_90k_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_r50_fpn_mstrain_640-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_x101_32x4d_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_x101_64x4d_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/retinanet/retinanet_x101_64x4d_fpn_mstrain_640-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/README.md create mode 100644 downstream/mmdetection/configs/rpn/rpn_r101_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_r101_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_r50_caffe_c4_1x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_r50_caffe_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_r50_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_x101_32x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_x101_32x4d_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_x101_64x4d_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/rpn/rpn_x101_64x4d_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/sabl/README.md create mode 100644 downstream/mmdetection/configs/sabl/metafile.yml create mode 100644 downstream/mmdetection/configs/sabl/sabl_cascade_rcnn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/sabl/sabl_cascade_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/sabl/sabl_faster_rcnn_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/sabl/sabl_retinanet_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/sabl/sabl_retinanet_r101_fpn_gn_1x_coco.py create mode 100644 downstream/mmdetection/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco.py create mode 100644 downstream/mmdetection/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco.py create mode 100644 downstream/mmdetection/configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/sabl/sabl_retinanet_r50_fpn_gn_1x_coco.py create mode 100644 downstream/mmdetection/configs/scnet/README.md create mode 100644 downstream/mmdetection/configs/scnet/metafile.yml create mode 100644 downstream/mmdetection/configs/scnet/scnet_r101_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/scnet/scnet_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/scnet/scnet_r50_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/scnet/scnet_x101_64x4d_fpn_20e_coco.py create mode 100644 downstream/mmdetection/configs/scnet/scnet_x101_64x4d_fpn_8x1_20e_coco.py create mode 100644 downstream/mmdetection/configs/scratch/README.md create mode 100644 downstream/mmdetection/configs/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco.py create mode 100644 downstream/mmdetection/configs/scratch/mask_rcnn_r50_fpn_gn-all_scratch_6x_coco.py create mode 100644 downstream/mmdetection/configs/scratch/metafile.yml create mode 100644 downstream/mmdetection/configs/seesaw_loss/README.md create mode 100644 downstream/mmdetection/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py create mode 100644 downstream/mmdetection/configs/seesaw_loss/metafile.yml create mode 100644 downstream/mmdetection/configs/selfsup_pretrain/README.md create mode 100644 downstream/mmdetection/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco.py create mode 100644 downstream/mmdetection/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco.py create mode 100644 downstream/mmdetection/configs/simple_copy_paste/README.md create mode 100644 downstream/mmdetection/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco.py create mode 100644 downstream/mmdetection/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco.py create mode 100644 downstream/mmdetection/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco.py create mode 100644 downstream/mmdetection/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco.py create mode 100644 downstream/mmdetection/configs/simple_copy_paste/metafile.yml create mode 100644 downstream/mmdetection/configs/solo/README.md create mode 100644 downstream/mmdetection/configs/solo/decoupled_solo_light_r50_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solo/decoupled_solo_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/solo/decoupled_solo_r50_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solo/metafile.yml create mode 100644 downstream/mmdetection/configs/solo/solo_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/solo/solo_r50_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solov2/README.md create mode 100644 downstream/mmdetection/configs/solov2/metafile.yml create mode 100644 downstream/mmdetection/configs/solov2/solov2_light_r18_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solov2/solov2_light_r34_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solov2/solov2_light_r50_dcn_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solov2/solov2_light_r50_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solov2/solov2_r101_dcn_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solov2/solov2_r101_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solov2/solov2_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/solov2/solov2_r50_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/solov2/solov2_x101_dcn_fpn_3x_coco.py create mode 100644 downstream/mmdetection/configs/sparse_rcnn/README.md create mode 100644 downstream/mmdetection/configs/sparse_rcnn/metafile.yml create mode 100644 downstream/mmdetection/configs/sparse_rcnn/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/sparse_rcnn/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/sparse_rcnn/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/sparse_rcnn/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco.py create mode 100644 downstream/mmdetection/configs/ssd/README.md create mode 100644 downstream/mmdetection/configs/ssd/metafile.yml create mode 100644 downstream/mmdetection/configs/ssd/ssd300_coco.py create mode 100644 downstream/mmdetection/configs/ssd/ssd512_coco.py create mode 100644 downstream/mmdetection/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py create mode 100644 downstream/mmdetection/configs/strong_baselines/README.md create mode 100644 downstream/mmdetection/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py create mode 100644 downstream/mmdetection/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py create mode 100644 downstream/mmdetection/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_400e_coco.py create mode 100644 downstream/mmdetection/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py create mode 100644 downstream/mmdetection/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py create mode 100644 downstream/mmdetection/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_50e_coco.py create mode 100644 downstream/mmdetection/configs/swin/README.md create mode 100644 downstream/mmdetection/configs/swin/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco.py create mode 100644 downstream/mmdetection/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco.py create mode 100644 downstream/mmdetection/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py create mode 100644 downstream/mmdetection/configs/swin/metafile.yml create mode 100644 downstream/mmdetection/configs/swin/retinanet_swin-t-p4-w7_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/timm_example/README.md create mode 100644 downstream/mmdetection/configs/timm_example/retinanet_timm_efficientnet_b1_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/timm_example/retinanet_timm_tv_resnet50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/tood/README.md create mode 100644 downstream/mmdetection/configs/tood/metafile.yml create mode 100644 downstream/mmdetection/configs/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/tood/tood_r101_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/tood/tood_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/tood/tood_r50_fpn_anchor_based_1x_coco.py create mode 100644 downstream/mmdetection/configs/tood/tood_r50_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/tood/tood_x101_64x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/tood/tood_x101_64x4d_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/tridentnet/README.md create mode 100644 downstream/mmdetection/configs/tridentnet/metafile.yml create mode 100644 downstream/mmdetection/configs/tridentnet/tridentnet_r50_caffe_1x_coco.py create mode 100644 downstream/mmdetection/configs/tridentnet/tridentnet_r50_caffe_mstrain_1x_coco.py create mode 100644 downstream/mmdetection/configs/tridentnet/tridentnet_r50_caffe_mstrain_3x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/README.md create mode 100644 downstream/mmdetection/configs/vfnet/metafile.yml create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_r101_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_r101_fpn_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_r101_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_r2_101_fpn_mdconv_c3-c5_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_r2_101_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_r50_fpn_1x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_r50_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_x101_32x4d_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/vfnet/vfnet_x101_64x4d_fpn_mstrain_2x_coco.py create mode 100644 downstream/mmdetection/configs/wider_face/README.md create mode 100644 downstream/mmdetection/configs/wider_face/ssd300_wider_face.py create mode 100644 downstream/mmdetection/configs/yolact/README.md create mode 100644 downstream/mmdetection/configs/yolact/metafile.yml create mode 100644 downstream/mmdetection/configs/yolact/yolact_r101_1x8_coco.py create mode 100644 downstream/mmdetection/configs/yolact/yolact_r50_1x8_coco.py create mode 100644 downstream/mmdetection/configs/yolact/yolact_r50_8x8_coco.py create mode 100644 downstream/mmdetection/configs/yolo/README.md create mode 100644 downstream/mmdetection/configs/yolo/metafile.yml create mode 100644 downstream/mmdetection/configs/yolo/yolov3_d53_320_273e_coco.py create mode 100644 downstream/mmdetection/configs/yolo/yolov3_d53_fp16_mstrain-608_273e_coco.py create mode 100644 downstream/mmdetection/configs/yolo/yolov3_d53_mstrain-416_273e_coco.py create mode 100644 downstream/mmdetection/configs/yolo/yolov3_d53_mstrain-608_273e_coco.py create mode 100644 downstream/mmdetection/configs/yolo/yolov3_mobilenetv2_320_300e_coco.py create mode 100644 downstream/mmdetection/configs/yolo/yolov3_mobilenetv2_mstrain-416_300e_coco.py create mode 100644 downstream/mmdetection/configs/yolof/README.md create mode 100644 downstream/mmdetection/configs/yolof/metafile.yml create mode 100644 downstream/mmdetection/configs/yolof/yolof_r50_c5_8x8_1x_coco.py create mode 100644 downstream/mmdetection/configs/yolof/yolof_r50_c5_8x8_iter-1x_coco.py create mode 100644 downstream/mmdetection/configs/yolox/README.md create mode 100644 downstream/mmdetection/configs/yolox/metafile.yml create mode 100644 downstream/mmdetection/configs/yolox/yolox_l_8x8_300e_coco.py create mode 100644 downstream/mmdetection/configs/yolox/yolox_m_8x8_300e_coco.py create mode 100644 downstream/mmdetection/configs/yolox/yolox_nano_8x8_300e_coco.py create mode 100644 downstream/mmdetection/configs/yolox/yolox_s_8x8_300e_coco.py create mode 100644 downstream/mmdetection/configs/yolox/yolox_tiny_8x8_300e_coco.py create mode 100644 downstream/mmdetection/configs/yolox/yolox_x_8x8_300e_coco.py create mode 100644 downstream/mmdetection/docs/en/1_exist_data_model.md create mode 100644 downstream/mmdetection/docs/en/2_new_data_model.md create mode 100644 downstream/mmdetection/docs/en/3_exist_data_new_model.md create mode 100644 downstream/mmdetection/docs/en/Makefile create mode 100644 downstream/mmdetection/docs/en/_static/css/readthedocs.css create mode 100644 downstream/mmdetection/docs/en/_static/image/mmdet-logo.png create mode 100644 downstream/mmdetection/docs/en/api.rst create mode 100644 downstream/mmdetection/docs/en/changelog.md create mode 100644 downstream/mmdetection/docs/en/compatibility.md create mode 100644 downstream/mmdetection/docs/en/conf.py create mode 100644 downstream/mmdetection/docs/en/conventions.md create mode 100644 downstream/mmdetection/docs/en/faq.md create mode 100644 downstream/mmdetection/docs/en/get_started.md create mode 100644 downstream/mmdetection/docs/en/index.rst create mode 100644 downstream/mmdetection/docs/en/make.bat create mode 100644 downstream/mmdetection/docs/en/model_zoo.md create mode 100644 downstream/mmdetection/docs/en/projects.md create mode 100644 downstream/mmdetection/docs/en/robustness_benchmarking.md create mode 100755 downstream/mmdetection/docs/en/stat.py create mode 100644 downstream/mmdetection/docs/en/switch_language.md create mode 100644 downstream/mmdetection/docs/en/tutorials/config.md create mode 100644 downstream/mmdetection/docs/en/tutorials/customize_dataset.md create mode 100644 downstream/mmdetection/docs/en/tutorials/customize_losses.md create mode 100644 downstream/mmdetection/docs/en/tutorials/customize_models.md create mode 100644 downstream/mmdetection/docs/en/tutorials/customize_runtime.md create mode 100644 downstream/mmdetection/docs/en/tutorials/data_pipeline.md create mode 100644 downstream/mmdetection/docs/en/tutorials/finetune.md create mode 100644 downstream/mmdetection/docs/en/tutorials/how_to.md create mode 100644 downstream/mmdetection/docs/en/tutorials/index.rst create mode 100644 downstream/mmdetection/docs/en/tutorials/init_cfg.md create mode 100644 downstream/mmdetection/docs/en/tutorials/onnx2tensorrt.md create mode 100644 downstream/mmdetection/docs/en/tutorials/pytorch2onnx.md create mode 100644 downstream/mmdetection/docs/en/tutorials/test_results_submission.md create mode 100644 downstream/mmdetection/docs/en/tutorials/useful_hooks.md create mode 100644 downstream/mmdetection/docs/en/useful_tools.md create mode 100644 downstream/mmdetection/docs/zh_cn/1_exist_data_model.md create mode 100644 downstream/mmdetection/docs/zh_cn/2_new_data_model.md create mode 100644 downstream/mmdetection/docs/zh_cn/3_exist_data_new_model.md create mode 100644 downstream/mmdetection/docs/zh_cn/Makefile create mode 100644 downstream/mmdetection/docs/zh_cn/_static/css/readthedocs.css create mode 100644 downstream/mmdetection/docs/zh_cn/_static/image/mmdet-logo.png create mode 100644 downstream/mmdetection/docs/zh_cn/api.rst create mode 100644 downstream/mmdetection/docs/zh_cn/article.md create mode 100644 downstream/mmdetection/docs/zh_cn/compatibility.md create mode 100644 downstream/mmdetection/docs/zh_cn/conf.py create mode 100644 downstream/mmdetection/docs/zh_cn/conventions.md create mode 100644 downstream/mmdetection/docs/zh_cn/faq.md create mode 100644 downstream/mmdetection/docs/zh_cn/get_started.md create mode 100644 downstream/mmdetection/docs/zh_cn/index.rst create mode 100644 downstream/mmdetection/docs/zh_cn/make.bat create mode 100644 downstream/mmdetection/docs/zh_cn/model_zoo.md create mode 100644 downstream/mmdetection/docs/zh_cn/projects.md create mode 100644 downstream/mmdetection/docs/zh_cn/robustness_benchmarking.md create mode 100755 downstream/mmdetection/docs/zh_cn/stat.py create mode 100644 downstream/mmdetection/docs/zh_cn/switch_language.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/config.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/customize_dataset.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/customize_losses.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/customize_models.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/customize_runtime.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/data_pipeline.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/finetune.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/how_to.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/index.rst create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/init_cfg.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/onnx2tensorrt.md create mode 100644 downstream/mmdetection/docs/zh_cn/tutorials/pytorch2onnx.md create mode 100644 downstream/mmdetection/docs/zh_cn/useful_tools.md create mode 100644 downstream/mmdetection/mmdet/__init__.py create mode 100644 downstream/mmdetection/mmdet/apis/__init__.py create mode 100644 downstream/mmdetection/mmdet/apis/inference.py create mode 100644 downstream/mmdetection/mmdet/apis/test.py create mode 100644 downstream/mmdetection/mmdet/apis/train.py create mode 100644 downstream/mmdetection/mmdet/core/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/anchor/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/anchor/anchor_generator.py create mode 100644 downstream/mmdetection/mmdet/core/anchor/builder.py create mode 100644 downstream/mmdetection/mmdet/core/anchor/point_generator.py create mode 100644 downstream/mmdetection/mmdet/core/anchor/utils.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/approx_max_iou_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/assign_result.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/atss_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/base_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/center_region_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/grid_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/hungarian_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/mask_hungarian_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/max_iou_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/point_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/region_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/sim_ota_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/task_aligned_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/assigners/uniform_assigner.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/builder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/coder/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/coder/base_bbox_coder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/coder/bucketing_bbox_coder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/coder/delta_xywh_bbox_coder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/coder/distance_point_bbox_coder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/coder/legacy_delta_xywh_bbox_coder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/coder/pseudo_bbox_coder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/coder/tblr_bbox_coder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/coder/yolo_bbox_coder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/demodata.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/iou_calculators/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/iou_calculators/builder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/iou_calculators/iou2d_calculator.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/match_costs/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/match_costs/builder.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/match_costs/match_cost.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/base_sampler.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/combined_sampler.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/instance_balanced_pos_sampler.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/iou_balanced_neg_sampler.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/mask_pseudo_sampler.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/mask_sampling_result.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/ohem_sampler.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/pseudo_sampler.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/random_sampler.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/sampling_result.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/samplers/score_hlr_sampler.py create mode 100644 downstream/mmdetection/mmdet/core/bbox/transforms.py create mode 100644 downstream/mmdetection/mmdet/core/data_structures/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/data_structures/general_data.py create mode 100644 downstream/mmdetection/mmdet/core/data_structures/instance_data.py create mode 100644 downstream/mmdetection/mmdet/core/evaluation/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/evaluation/bbox_overlaps.py create mode 100644 downstream/mmdetection/mmdet/core/evaluation/class_names.py create mode 100644 downstream/mmdetection/mmdet/core/evaluation/eval_hooks.py create mode 100644 downstream/mmdetection/mmdet/core/evaluation/mean_ap.py create mode 100644 downstream/mmdetection/mmdet/core/evaluation/panoptic_utils.py create mode 100644 downstream/mmdetection/mmdet/core/evaluation/recall.py create mode 100644 downstream/mmdetection/mmdet/core/export/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/export/model_wrappers.py create mode 100644 downstream/mmdetection/mmdet/core/export/onnx_helper.py create mode 100644 downstream/mmdetection/mmdet/core/export/pytorch2onnx.py create mode 100644 downstream/mmdetection/mmdet/core/hook/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/hook/checkloss_hook.py create mode 100644 downstream/mmdetection/mmdet/core/hook/ema.py create mode 100644 downstream/mmdetection/mmdet/core/hook/memory_profiler_hook.py create mode 100644 downstream/mmdetection/mmdet/core/hook/set_epoch_info_hook.py create mode 100644 downstream/mmdetection/mmdet/core/hook/sync_norm_hook.py create mode 100644 downstream/mmdetection/mmdet/core/hook/sync_random_size_hook.py create mode 100644 downstream/mmdetection/mmdet/core/hook/wandblogger_hook.py create mode 100644 downstream/mmdetection/mmdet/core/hook/yolox_lrupdater_hook.py create mode 100644 downstream/mmdetection/mmdet/core/hook/yolox_mode_switch_hook.py create mode 100644 downstream/mmdetection/mmdet/core/mask/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/mask/mask_target.py create mode 100644 downstream/mmdetection/mmdet/core/mask/structures.py create mode 100644 downstream/mmdetection/mmdet/core/mask/utils.py create mode 100644 downstream/mmdetection/mmdet/core/optimizers/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/optimizers/builder.py create mode 100644 downstream/mmdetection/mmdet/core/optimizers/layer_decay_optimizer_constructor.py create mode 100644 downstream/mmdetection/mmdet/core/post_processing/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/post_processing/bbox_nms.py create mode 100644 downstream/mmdetection/mmdet/core/post_processing/matrix_nms.py create mode 100644 downstream/mmdetection/mmdet/core/post_processing/merge_augs.py create mode 100644 downstream/mmdetection/mmdet/core/utils/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/utils/dist_utils.py create mode 100644 downstream/mmdetection/mmdet/core/utils/misc.py create mode 100644 downstream/mmdetection/mmdet/core/visualization/__init__.py create mode 100644 downstream/mmdetection/mmdet/core/visualization/image.py create mode 100644 downstream/mmdetection/mmdet/core/visualization/palette.py create mode 100644 downstream/mmdetection/mmdet/datasets/__init__.py create mode 100644 downstream/mmdetection/mmdet/datasets/api_wrappers/__init__.py create mode 100644 downstream/mmdetection/mmdet/datasets/api_wrappers/coco_api.py create mode 100644 downstream/mmdetection/mmdet/datasets/api_wrappers/panoptic_evaluation.py create mode 100644 downstream/mmdetection/mmdet/datasets/builder.py create mode 100644 downstream/mmdetection/mmdet/datasets/cityscapes.py create mode 100644 downstream/mmdetection/mmdet/datasets/coco.py create mode 100644 downstream/mmdetection/mmdet/datasets/coco_panoptic.py create mode 100644 downstream/mmdetection/mmdet/datasets/custom.py create mode 100644 downstream/mmdetection/mmdet/datasets/dataset_wrappers.py create mode 100644 downstream/mmdetection/mmdet/datasets/deepfashion.py create mode 100644 downstream/mmdetection/mmdet/datasets/lvis.py create mode 100644 downstream/mmdetection/mmdet/datasets/openimages.py create mode 100644 downstream/mmdetection/mmdet/datasets/pipelines/__init__.py create mode 100644 downstream/mmdetection/mmdet/datasets/pipelines/auto_augment.py create mode 100644 downstream/mmdetection/mmdet/datasets/pipelines/compose.py create mode 100644 downstream/mmdetection/mmdet/datasets/pipelines/formating.py create mode 100644 downstream/mmdetection/mmdet/datasets/pipelines/formatting.py create mode 100644 downstream/mmdetection/mmdet/datasets/pipelines/instaboost.py create mode 100644 downstream/mmdetection/mmdet/datasets/pipelines/loading.py create mode 100644 downstream/mmdetection/mmdet/datasets/pipelines/test_time_aug.py create mode 100644 downstream/mmdetection/mmdet/datasets/pipelines/transforms.py create mode 100644 downstream/mmdetection/mmdet/datasets/samplers/__init__.py create mode 100644 downstream/mmdetection/mmdet/datasets/samplers/class_aware_sampler.py create mode 100644 downstream/mmdetection/mmdet/datasets/samplers/distributed_sampler.py create mode 100644 downstream/mmdetection/mmdet/datasets/samplers/group_sampler.py create mode 100644 downstream/mmdetection/mmdet/datasets/samplers/infinite_sampler.py create mode 100644 downstream/mmdetection/mmdet/datasets/utils.py create mode 100644 downstream/mmdetection/mmdet/datasets/voc.py create mode 100644 downstream/mmdetection/mmdet/datasets/wider_face.py create mode 100644 downstream/mmdetection/mmdet/datasets/xml_style.py create mode 100644 downstream/mmdetection/mmdet/models/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/adapter_modules.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/csp_darknet.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/darknet.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/detectors_resnet.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/detectors_resnext.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/efficientnet.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/gpvit.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/gpvit_adapter.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/hourglass.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/hrnet.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/mobilenet_v2.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/pvt.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/regnet.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/res2net.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/resnest.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/resnet.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/resnext.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/ssd_vgg.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/swin.py create mode 100644 downstream/mmdetection/mmdet/models/backbones/trident_resnet.py create mode 100644 downstream/mmdetection/mmdet/models/builder.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/anchor_free_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/anchor_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/atss_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/autoassign_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/base_dense_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/base_mask_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/cascade_rpn_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/centernet_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/centripetal_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/corner_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/ddod_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/deformable_detr_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/dense_test_mixins.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/detr_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/embedding_rpn_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/fcos_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/fovea_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/free_anchor_retina_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/fsaf_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/ga_retina_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/ga_rpn_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/gfl_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/guided_anchor_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/lad_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/ld_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/mask2former_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/maskformer_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/nasfcos_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/paa_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/pisa_retinanet_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/pisa_ssd_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/reppoints_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/retina_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/retina_sepbn_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/rpn_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/sabl_retina_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/solo_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/solov2_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/ssd_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/tood_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/vfnet_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/yolact_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/yolo_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/yolof_head.py create mode 100644 downstream/mmdetection/mmdet/models/dense_heads/yolox_head.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/atss.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/autoassign.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/base.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/cascade_rcnn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/centernet.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/cornernet.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/ddod.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/deformable_detr.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/detr.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/fast_rcnn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/faster_rcnn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/fcos.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/fovea.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/fsaf.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/gfl.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/grid_rcnn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/htc.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/kd_one_stage.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/lad.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/mask2former.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/mask_rcnn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/mask_scoring_rcnn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/maskformer.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/nasfcos.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/paa.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/panoptic_fpn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/panoptic_two_stage_segmentor.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/point_rend.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/queryinst.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/reppoints_detector.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/retinanet.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/rpn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/scnet.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/single_stage.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/single_stage_instance_seg.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/solo.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/solov2.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/sparse_rcnn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/tood.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/trident_faster_rcnn.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/two_stage.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/vfnet.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/yolact.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/yolo.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/yolof.py create mode 100644 downstream/mmdetection/mmdet/models/detectors/yolox.py create mode 100644 downstream/mmdetection/mmdet/models/losses/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/losses/accuracy.py create mode 100644 downstream/mmdetection/mmdet/models/losses/ae_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/balanced_l1_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/cross_entropy_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/dice_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/focal_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/gaussian_focal_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/gfocal_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/ghm_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/iou_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/kd_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/mse_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/pisa_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/seesaw_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/smooth_l1_loss.py create mode 100644 downstream/mmdetection/mmdet/models/losses/utils.py create mode 100644 downstream/mmdetection/mmdet/models/losses/varifocal_loss.py create mode 100644 downstream/mmdetection/mmdet/models/necks/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/necks/bfp.py create mode 100644 downstream/mmdetection/mmdet/models/necks/channel_mapper.py create mode 100644 downstream/mmdetection/mmdet/models/necks/ct_resnet_neck.py create mode 100644 downstream/mmdetection/mmdet/models/necks/dilated_encoder.py create mode 100644 downstream/mmdetection/mmdet/models/necks/dyhead.py create mode 100644 downstream/mmdetection/mmdet/models/necks/fpg.py create mode 100644 downstream/mmdetection/mmdet/models/necks/fpn.py create mode 100644 downstream/mmdetection/mmdet/models/necks/fpn_carafe.py create mode 100644 downstream/mmdetection/mmdet/models/necks/hrfpn.py create mode 100644 downstream/mmdetection/mmdet/models/necks/nas_fpn.py create mode 100644 downstream/mmdetection/mmdet/models/necks/nasfcos_fpn.py create mode 100644 downstream/mmdetection/mmdet/models/necks/pafpn.py create mode 100644 downstream/mmdetection/mmdet/models/necks/rfp.py create mode 100644 downstream/mmdetection/mmdet/models/necks/ssd_neck.py create mode 100644 downstream/mmdetection/mmdet/models/necks/yolo_neck.py create mode 100644 downstream/mmdetection/mmdet/models/necks/yolox_pafpn.py create mode 100644 downstream/mmdetection/mmdet/models/plugins/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/plugins/dropblock.py create mode 100644 downstream/mmdetection/mmdet/models/plugins/msdeformattn_pixel_decoder.py create mode 100644 downstream/mmdetection/mmdet/models/plugins/pixel_decoder.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/base_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/bbox_heads/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/bbox_heads/bbox_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/bbox_heads/convfc_bbox_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/bbox_heads/dii_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/bbox_heads/double_bbox_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/bbox_heads/sabl_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/bbox_heads/scnet_bbox_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/cascade_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/double_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/dynamic_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/grid_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/htc_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/coarse_mask_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/dynamic_mask_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/fcn_mask_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/feature_relay_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/fused_semantic_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/global_context_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/grid_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/htc_mask_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/mask_point_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/maskiou_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/scnet_mask_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_heads/scnet_semantic_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/mask_scoring_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/pisa_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/point_rend_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/roi_extractors/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/roi_extractors/base_roi_extractor.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/roi_extractors/generic_roi_extractor.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/roi_extractors/single_level_roi_extractor.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/scnet_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/shared_heads/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/shared_heads/res_layer.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/sparse_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/standard_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/test_mixins.py create mode 100644 downstream/mmdetection/mmdet/models/roi_heads/trident_roi_head.py create mode 100644 downstream/mmdetection/mmdet/models/seg_heads/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/seg_heads/base_semantic_head.py create mode 100644 downstream/mmdetection/mmdet/models/seg_heads/panoptic_fpn_head.py create mode 100644 downstream/mmdetection/mmdet/models/seg_heads/panoptic_fusion_heads/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/seg_heads/panoptic_fusion_heads/base_panoptic_fusion_head.py create mode 100644 downstream/mmdetection/mmdet/models/seg_heads/panoptic_fusion_heads/heuristic_fusion_head.py create mode 100644 downstream/mmdetection/mmdet/models/seg_heads/panoptic_fusion_heads/maskformer_fusion_head.py create mode 100644 downstream/mmdetection/mmdet/models/utils/__init__.py create mode 100644 downstream/mmdetection/mmdet/models/utils/brick_wrappers.py create mode 100644 downstream/mmdetection/mmdet/models/utils/builder.py create mode 100644 downstream/mmdetection/mmdet/models/utils/ckpt_convert.py create mode 100644 downstream/mmdetection/mmdet/models/utils/conv_upsample.py create mode 100644 downstream/mmdetection/mmdet/models/utils/csp_layer.py create mode 100644 downstream/mmdetection/mmdet/models/utils/gaussian_target.py create mode 100644 downstream/mmdetection/mmdet/models/utils/inverted_residual.py create mode 100644 downstream/mmdetection/mmdet/models/utils/make_divisible.py create mode 100644 downstream/mmdetection/mmdet/models/utils/misc.py create mode 100644 downstream/mmdetection/mmdet/models/utils/normed_predictor.py create mode 100644 downstream/mmdetection/mmdet/models/utils/panoptic_gt_processing.py create mode 100644 downstream/mmdetection/mmdet/models/utils/point_sample.py create mode 100644 downstream/mmdetection/mmdet/models/utils/positional_encoding.py create mode 100644 downstream/mmdetection/mmdet/models/utils/res_layer.py create mode 100644 downstream/mmdetection/mmdet/models/utils/se_layer.py create mode 100644 downstream/mmdetection/mmdet/models/utils/transformer.py create mode 100644 downstream/mmdetection/mmdet/utils/__init__.py create mode 100644 downstream/mmdetection/mmdet/utils/collect_env.py create mode 100644 downstream/mmdetection/mmdet/utils/compat_config.py create mode 100644 downstream/mmdetection/mmdet/utils/contextmanagers.py create mode 100644 downstream/mmdetection/mmdet/utils/logger.py create mode 100644 downstream/mmdetection/mmdet/utils/memory.py create mode 100644 downstream/mmdetection/mmdet/utils/misc.py create mode 100644 downstream/mmdetection/mmdet/utils/profiling.py create mode 100644 downstream/mmdetection/mmdet/utils/replace_cfg_vals.py create mode 100644 downstream/mmdetection/mmdet/utils/setup_env.py create mode 100644 downstream/mmdetection/mmdet/utils/split_batch.py create mode 100644 downstream/mmdetection/mmdet/utils/util_distribution.py create mode 100644 downstream/mmdetection/mmdet/utils/util_mixins.py create mode 100644 downstream/mmdetection/mmdet/utils/util_random.py create mode 100644 downstream/mmdetection/mmdet/version.py create mode 100644 downstream/mmdetection/model-index.yml create mode 100644 downstream/mmdetection/pytest.ini create mode 100644 downstream/mmdetection/requirements.txt create mode 100644 downstream/mmdetection/requirements/albu.txt create mode 100644 downstream/mmdetection/requirements/build.txt create mode 100644 downstream/mmdetection/requirements/docs.txt create mode 100644 downstream/mmdetection/requirements/mminstall.txt create mode 100644 downstream/mmdetection/requirements/optional.txt create mode 100644 downstream/mmdetection/requirements/readthedocs.txt create mode 100644 downstream/mmdetection/requirements/runtime.txt create mode 100644 downstream/mmdetection/requirements/tests.txt create mode 100644 downstream/mmdetection/setup.cfg create mode 100755 downstream/mmdetection/setup.py create mode 100755 downstream/mmdetection/tools/analysis_tools/analyze_logs.py create mode 100644 downstream/mmdetection/tools/analysis_tools/analyze_results.py create mode 100644 downstream/mmdetection/tools/analysis_tools/benchmark.py create mode 100644 downstream/mmdetection/tools/analysis_tools/coco_error_analysis.py create mode 100644 downstream/mmdetection/tools/analysis_tools/confusion_matrix.py create mode 100644 downstream/mmdetection/tools/analysis_tools/eval_metric.py create mode 100644 downstream/mmdetection/tools/analysis_tools/get_flops.py create mode 100644 downstream/mmdetection/tools/analysis_tools/optimize_anchors.py create mode 100644 downstream/mmdetection/tools/analysis_tools/robustness_eval.py create mode 100644 downstream/mmdetection/tools/analysis_tools/test_robustness.py create mode 100644 downstream/mmdetection/tools/dataset_converters/cityscapes.py create mode 100644 downstream/mmdetection/tools/dataset_converters/images2coco.py create mode 100644 downstream/mmdetection/tools/dataset_converters/pascal_voc.py create mode 100644 downstream/mmdetection/tools/deployment/mmdet2torchserve.py create mode 100644 downstream/mmdetection/tools/deployment/mmdet_handler.py create mode 100644 downstream/mmdetection/tools/deployment/onnx2tensorrt.py create mode 100644 downstream/mmdetection/tools/deployment/pytorch2onnx.py create mode 100644 downstream/mmdetection/tools/deployment/test.py create mode 100644 downstream/mmdetection/tools/deployment/test_torchserver.py create mode 100755 downstream/mmdetection/tools/dist_test.sh create mode 100755 downstream/mmdetection/tools/dist_train.sh create mode 100644 downstream/mmdetection/tools/misc/browse_dataset.py create mode 100644 downstream/mmdetection/tools/misc/download_dataset.py create mode 100644 downstream/mmdetection/tools/misc/gen_coco_panoptic_test_info.py create mode 100644 downstream/mmdetection/tools/misc/get_image_metas.py create mode 100644 downstream/mmdetection/tools/misc/print_config.py create mode 100644 downstream/mmdetection/tools/misc/split_coco.py create mode 100644 downstream/mmdetection/tools/model_converters/detectron2pytorch.py create mode 100644 downstream/mmdetection/tools/model_converters/publish_model.py create mode 100644 downstream/mmdetection/tools/model_converters/regnet2mmdet.py create mode 100644 downstream/mmdetection/tools/model_converters/selfsup2mmdet.py create mode 100644 downstream/mmdetection/tools/model_converters/upgrade_model_version.py create mode 100644 downstream/mmdetection/tools/model_converters/upgrade_ssd_version.py create mode 100755 downstream/mmdetection/tools/slurm_test.sh create mode 100755 downstream/mmdetection/tools/slurm_train.sh create mode 100644 downstream/mmdetection/tools/test.py create mode 100644 downstream/mmdetection/tools/train.py create mode 100644 downstream/mmsegmentation/.circleci/config.yml create mode 100644 downstream/mmsegmentation/.dev/batch_test_list.py create mode 100644 downstream/mmsegmentation/.dev/batch_train_list.txt create mode 100755 downstream/mmsegmentation/.dev/benchmark_evaluation.sh create mode 100644 downstream/mmsegmentation/.dev/benchmark_inference.py create mode 100755 downstream/mmsegmentation/.dev/benchmark_train.sh create mode 100644 downstream/mmsegmentation/.dev/check_urls.py create mode 100644 downstream/mmsegmentation/.dev/gather_benchmark_evaluation_results.py create mode 100644 downstream/mmsegmentation/.dev/gather_benchmark_train_results.py create mode 100644 downstream/mmsegmentation/.dev/gather_models.py create mode 100644 downstream/mmsegmentation/.dev/generate_benchmark_evaluation_script.py create mode 100644 downstream/mmsegmentation/.dev/generate_benchmark_train_script.py create mode 100644 downstream/mmsegmentation/.dev/log_collector/example_config.py create mode 100644 downstream/mmsegmentation/.dev/log_collector/log_collector.py create mode 100644 downstream/mmsegmentation/.dev/log_collector/readme.md create mode 100644 downstream/mmsegmentation/.dev/log_collector/utils.py create mode 100755 downstream/mmsegmentation/.dev/md2yml.py create mode 100644 downstream/mmsegmentation/.dev/upload_modelzoo.py create mode 100644 downstream/mmsegmentation/.github/CODE_OF_CONDUCT.md create mode 100644 downstream/mmsegmentation/.github/CONTRIBUTING.md create mode 100644 downstream/mmsegmentation/.github/ISSUE_TEMPLATE/config.yml create mode 100644 downstream/mmsegmentation/.github/ISSUE_TEMPLATE/error-report.md create mode 100644 downstream/mmsegmentation/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 downstream/mmsegmentation/.github/ISSUE_TEMPLATE/general_questions.md create mode 100644 downstream/mmsegmentation/.github/ISSUE_TEMPLATE/reimplementation_questions.md create mode 100644 downstream/mmsegmentation/.github/pull_request_template.md create mode 100644 downstream/mmsegmentation/.github/workflows/build.yml create mode 100644 downstream/mmsegmentation/.github/workflows/deploy.yml create mode 100644 downstream/mmsegmentation/.github/workflows/lint.yml create mode 100644 downstream/mmsegmentation/.gitignore create mode 100644 downstream/mmsegmentation/.owners.yml create mode 100644 downstream/mmsegmentation/.pre-commit-config.yaml create mode 100644 downstream/mmsegmentation/.readthedocs.yml create mode 100644 downstream/mmsegmentation/CITATION.cff create mode 100644 downstream/mmsegmentation/LICENSE create mode 100644 downstream/mmsegmentation/MANIFEST.in create mode 100644 downstream/mmsegmentation/README.md create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/ade20k.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/ade20k_640x640.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/chase_db1.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/cityscapes.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/cityscapes_1024x1024.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/cityscapes_768x768.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/cityscapes_769x769.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/cityscapes_832x832.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/coco-stuff10k.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/drive.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/hrf.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/isaid.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/loveda.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/pascal_context.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/pascal_voc12.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/pascal_voc12_aug.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/potsdam.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/stare.py create mode 100644 downstream/mmsegmentation/configs/_base_/datasets/vaihingen.py create mode 100644 downstream/mmsegmentation/configs/_base_/default_runtime.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/ann_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/apcnet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/bisenetv1_r18-d32.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/bisenetv2.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/ccnet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/cgnet.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/danet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/deeplabv3_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/deeplabv3_unet_s5-d16.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/deeplabv3plus_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/dmnet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/dnl_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/dpt_vit-b16.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/emanet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/encnet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/erfnet_fcn.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/fast_scnn.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/fastfcn_r50-d32_jpu_psp.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/fcn_hr18.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/fcn_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/fcn_unet_s5-d16.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/fpn_r50.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/gcnet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/icnet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/isanet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/lraspp_m-v3-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/nonlocal_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/ocrnet_hr18.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/ocrnet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/pointrend_r50.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/psanet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/pspnet_r50-d8.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/pspnet_unet_s5-d16.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/segformer_mit-b0.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/segmenter_vit-b16_mask.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/setr_mla.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/setr_naive.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/setr_pup.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/stdc.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/twins_pcpvt-s_fpn.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/twins_pcpvt-s_upernet.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/upernet_beit.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/upernet_convnext.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/upernet_r50.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/upernet_swin.py create mode 100644 downstream/mmsegmentation/configs/_base_/models/upernet_vit-b16_ln_mln.py create mode 100644 downstream/mmsegmentation/configs/_base_/schedules/schedule_160k.py create mode 100644 downstream/mmsegmentation/configs/_base_/schedules/schedule_20k.py create mode 100644 downstream/mmsegmentation/configs/_base_/schedules/schedule_320k.py create mode 100644 downstream/mmsegmentation/configs/_base_/schedules/schedule_40k.py create mode 100644 downstream/mmsegmentation/configs/_base_/schedules/schedule_80k.py create mode 100644 downstream/mmsegmentation/configs/_base_/segformer/ade20k_repeat.py create mode 100644 downstream/mmsegmentation/configs/_base_/segformer/default_runtime.py create mode 100644 downstream/mmsegmentation/configs/_base_/segformer/schedule_160k_adamw.py create mode 100644 downstream/mmsegmentation/configs/_base_/segformer/segformer.py create mode 100644 downstream/mmsegmentation/configs/ann/README.md create mode 100644 downstream/mmsegmentation/configs/ann/ann.yml create mode 100644 downstream/mmsegmentation/configs/ann/ann_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ann/ann_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/apcnet/README.md create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet.yml create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/apcnet/apcnet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/beit/README.md create mode 100644 downstream/mmsegmentation/configs/beit/beit.yml create mode 100644 downstream/mmsegmentation/configs/beit/upernet_beit-base_640x640_160k_ade20k_ms.py create mode 100644 downstream/mmsegmentation/configs/beit/upernet_beit-base_8x2_640x640_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/beit/upernet_beit-large_fp16_640x640_160k_ade20k_ms.py create mode 100644 downstream/mmsegmentation/configs/beit/upernet_beit-large_fp16_8x1_640x640_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/README.md create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1.yml create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r101-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_4x4_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x4_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_in1k-pre_4x8_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r18-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_4x4_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_in1k-pre_4x4_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_in1k-pre_lr5e-3_4x4_512x512_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/bisenetv1/bisenetv1_r50-d32_lr5e-3_4x4_512x512_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/bisenetv2/README.md create mode 100644 downstream/mmsegmentation/configs/bisenetv2/bisenetv2.yml create mode 100644 downstream/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4x4_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_4x8_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_fp16_4x4_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/bisenetv2/bisenetv2_fcn_ohem_4x4_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ccnet/README.md create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet.yml create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ccnet/ccnet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/cgnet/README.md create mode 100644 downstream/mmsegmentation/configs/cgnet/cgnet.yml create mode 100644 downstream/mmsegmentation/configs/cgnet/cgnet_512x1024_60k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/cgnet/cgnet_680x680_60k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/convnext/README.md create mode 100644 downstream/mmsegmentation/configs/convnext/convnext.yml create mode 100644 downstream/mmsegmentation/configs/convnext/upernet_convnext_base_fp16_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/convnext/upernet_convnext_base_fp16_640x640_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/convnext/upernet_convnext_large_fp16_640x640_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/convnext/upernet_convnext_small_fp16_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/convnext/upernet_convnext_tiny_fp16_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/convnext/upernet_convnext_xlarge_fp16_640x640_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/danet/README.md create mode 100644 downstream/mmsegmentation/configs/danet/danet.yml create mode 100644 downstream/mmsegmentation/configs/danet/danet_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/danet/danet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/README.md create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3.yml create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d16-mg124_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x512_4x4_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x512_4x4_20k_coco-stuff10k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x512_4x4_320k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x512_4x4_40k_coco-stuff10k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x512_4x4_80k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101-d8_fp16_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r101b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r18-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r18b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x512_4x4_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x512_4x4_20k_coco-stuff10k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x512_4x4_320k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x512_4x4_40k_coco-stuff10k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x512_4x4_80k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3/deeplabv3_r50b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/README.md create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus.yml create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d16-mg124_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_4x4_512x512_80k_vaihingen.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_loveda.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_512x512_80k_potsdam.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101-d8_fp16_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r101b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4x4_512x512_80k_vaihingen.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_4x4_896x896_80k_isaid.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_loveda.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_512x512_80k_potsdam.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r18b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4x4_512x512_80k_vaihingen.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_4x4_896x896_80k_isaid.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_loveda.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_512x512_80k_potsdam.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/deeplabv3plus/deeplabv3plus_r50b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dmnet/README.md create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet.yml create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dmnet/dmnet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/README.md create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnl_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/dnlnet/dnlnet.yml create mode 100644 downstream/mmsegmentation/configs/dpt/README.md create mode 100644 downstream/mmsegmentation/configs/dpt/dpt.yml create mode 100644 downstream/mmsegmentation/configs/dpt/dpt_vit-b16_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/emanet/README.md create mode 100644 downstream/mmsegmentation/configs/emanet/emanet.yml create mode 100644 downstream/mmsegmentation/configs/emanet/emanet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/emanet/emanet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/emanet/emanet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/emanet/emanet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/encnet/README.md create mode 100644 downstream/mmsegmentation/configs/encnet/encnet.yml create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/encnet/encnet_r50s-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/erfnet/README.md create mode 100644 downstream/mmsegmentation/configs/erfnet/erfnet.yml create mode 100644 downstream/mmsegmentation/configs/erfnet/erfnet_fcn_4x4_512x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/README.md create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn.yml create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_4x4_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_aspp_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_4x4_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_enc_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_4x4_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fastfcn/fastfcn_r50-d32_jpu_psp_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fastscnn/README.md create mode 100644 downstream/mmsegmentation/configs/fastscnn/fast_scnn_lr0.12_8x4_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fastscnn/fastscnn.yml create mode 100644 downstream/mmsegmentation/configs/fcn/README.md create mode 100644 downstream/mmsegmentation/configs/fcn/fcn.yml create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r101-d16_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r101-d16_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r101-d16_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r101-d16_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r101b-d16_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r101b-d16_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r50-d16_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r50-d16_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r50-d16_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r50-d16_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r50b-d16_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_d6_r50b-d16_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101-d8_fp16_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r101b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r18-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r18-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r18b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r18b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/fcn/fcn_r50b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/gcnet/README.md create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet.yml create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/gcnet/gcnet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/gpvit/gpvit_l1_segformer.py create mode 100644 downstream/mmsegmentation/configs/gpvit/gpvit_l1_upernet.py create mode 100644 downstream/mmsegmentation/configs/gpvit/gpvit_l2_segformer.py create mode 100644 downstream/mmsegmentation/configs/gpvit/gpvit_l2_upernet.py create mode 100644 downstream/mmsegmentation/configs/gpvit/gpvit_l3_segformer.py create mode 100644 downstream/mmsegmentation/configs/gpvit/gpvit_l3_upernet.py create mode 100644 downstream/mmsegmentation/configs/gpvit/gpvit_l4_segformer.py create mode 100644 downstream/mmsegmentation/configs/gpvit/gpvit_l4_upernet.py create mode 100644 downstream/mmsegmentation/configs/hrnet/README.md create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_4x4_512x512_80k_vaihingen.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_4x4_896x896_80k_isaid.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_512x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_512x512_80k_loveda.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18_512x512_80k_potsdam.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_4x4_512x512_80k_vaihingen.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_4x4_896x896_80k_isaid.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_512x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_512x512_80k_loveda.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr18s_512x512_80k_potsdam.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_4x4_512x512_80k_vaihingen.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_4x4_896x896_80k_isaid.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_512x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_512x512_80k_loveda.py create mode 100644 downstream/mmsegmentation/configs/hrnet/fcn_hr48_512x512_80k_potsdam.py create mode 100644 downstream/mmsegmentation/configs/hrnet/hrnet.yml create mode 100644 downstream/mmsegmentation/configs/icnet/README.md create mode 100644 downstream/mmsegmentation/configs/icnet/icnet.yml create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r101-d8_832x832_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r101-d8_832x832_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r101-d8_in1k-pre_832x832_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r101-d8_in1k-pre_832x832_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r18-d8_832x832_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r18-d8_832x832_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r18-d8_in1k-pre_832x832_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r18-d8_in1k-pre_832x832_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r50-d8_832x832_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r50-d8_832x832_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r50-d8_in1k-pre_832x832_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/icnet/icnet_r50-d8_in1k-pre_832x832_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/isanet/README.md create mode 100644 downstream/mmsegmentation/configs/isanet/isanet.yml create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/isanet/isanet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/knet/README.md create mode 100644 downstream/mmsegmentation/configs/knet/knet.yml create mode 100644 downstream/mmsegmentation/configs/knet/knet_s3_deeplabv3_r50-d8_8x2_512x512_adamw_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/knet/knet_s3_fcn_r50-d8_8x2_512x512_adamw_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/knet/knet_s3_pspnet_r50-d8_8x2_512x512_adamw_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/knet/knet_s3_upernet_r50-d8_8x2_512x512_adamw_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/knet/knet_s3_upernet_swin-l_8x2_512x512_adamw_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/knet/knet_s3_upernet_swin-l_8x2_640x640_adamw_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/knet/knet_s3_upernet_swin-t_8x2_512x512_adamw_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/README.md create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/deeplabv3_m-v2-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/deeplabv3plus_m-v2-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/fcn_m-v2-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/mobilenet_v2.yml create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/pspnet_m-v2-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v2/pspnet_m-v2-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v3/README.md create mode 100644 downstream/mmsegmentation/configs/mobilenet_v3/lraspp_m-v3-d8_512x1024_320k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v3/lraspp_m-v3-d8_scratch_512x1024_320k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v3/lraspp_m-v3s-d8_512x1024_320k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v3/lraspp_m-v3s-d8_scratch_512x1024_320k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/mobilenet_v3/mobilenet_v3.yml create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/README.md create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_net.yml create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/nonlocal_net/nonlocal_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/README.md create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet.yml create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18_512x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18s_512x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18s_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18s_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18s_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18s_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18s_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr18s_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr48_512x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr48_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr48_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr48_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr48_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr48_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_hr48_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b16_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_512x1024_40k_b8_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/ocrnet/ocrnet_r101-d8_512x1024_80k_b16_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/point_rend/README.md create mode 100644 downstream/mmsegmentation/configs/point_rend/point_rend.yml create mode 100644 downstream/mmsegmentation/configs/point_rend/pointrend_r101_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/point_rend/pointrend_r101_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/point_rend/pointrend_r50_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/point_rend/pointrend_r50_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/psanet/README.md create mode 100644 downstream/mmsegmentation/configs/psanet/psanet.yml create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/psanet/psanet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/README.md create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet.yml create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_4x4_512x512_80k_potsdam.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_4x4_512x512_80k_vaihingen.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x1024_40k_dark.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x1024_40k_night_driving.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_4x4_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_4x4_20k_coco-stuff10k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_4x4_320k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_4x4_40k_coco-stuff10k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_4x4_80k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_512x512_80k_loveda.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101-d8_fp16_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101b-d8_512x1024_80k_dark.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101b-d8_512x1024_80k_night_driving.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r101b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r18-d8_4x4_512x512_80k_potsdam.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r18-d8_4x4_512x512_80k_vaihingen.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r18-d8_4x4_896x896_80k_isaid.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r18-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r18-d8_512x512_80k_loveda.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r18-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r18b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d32_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d32_rsb-pretrain_512x1024_adamw_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_480x480_40k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_480x480_80k_pascal_context_59.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_4x4_512x512_80k_potsdam.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_4x4_512x512_80k_vaihingen.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_4x4_896x896_80k_isaid.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x1024_40k_dark.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x1024_40k_night_driving.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x1024_80k_dark.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x1024_80k_night_driving.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_4x4_160k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_4x4_20k_coco-stuff10k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_4x4_320k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_4x4_40k_coco-stuff10k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_4x4_80k_coco-stuff164k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_512x512_80k_loveda.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50-d8_rsb-pretrain_512x1024_adamw_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50b-d32_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50b-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/pspnet/pspnet_r50b-d8_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/resnest/README.md create mode 100644 downstream/mmsegmentation/configs/resnest/deeplabv3_s101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/resnest/deeplabv3_s101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/resnest/deeplabv3plus_s101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/resnest/deeplabv3plus_s101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/resnest/fcn_s101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/resnest/fcn_s101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/resnest/pspnet_s101-d8_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/resnest/pspnet_s101-d8_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/resnest/resnest.yml create mode 100644 downstream/mmsegmentation/configs/segformer/README.md create mode 100644 downstream/mmsegmentation/configs/segformer/segformer.yml create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b0_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b0_8x1_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b1_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b1_8x1_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b2_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b2_8x1_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b3_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b3_8x1_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b4_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b4_8x1_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b5_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b5_640x640_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segformer/segformer_mit-b5_8x1_1024x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/segmenter/README.md create mode 100644 downstream/mmsegmentation/configs/segmenter/segmenter.yml create mode 100644 downstream/mmsegmentation/configs/segmenter/segmenter_vit-b_mask_8x1_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segmenter/segmenter_vit-l_mask_8x1_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segmenter/segmenter_vit-s_linear_8x1_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segmenter/segmenter_vit-s_mask_8x1_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/segmenter/segmenter_vit-t_mask_8x1_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/sem_fpn/README.md create mode 100644 downstream/mmsegmentation/configs/sem_fpn/fpn_r101_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/sem_fpn/fpn_r101_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/sem_fpn/fpn_r50_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/sem_fpn/fpn_r50_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/sem_fpn/sem_fpn.yml create mode 100644 downstream/mmsegmentation/configs/setr/README.md create mode 100644 downstream/mmsegmentation/configs/setr/setr.yml create mode 100644 downstream/mmsegmentation/configs/setr/setr_mla_512x512_160k_b16_ade20k.py create mode 100644 downstream/mmsegmentation/configs/setr/setr_mla_512x512_160k_b8_ade20k.py create mode 100644 downstream/mmsegmentation/configs/setr/setr_naive_512x512_160k_b16_ade20k.py create mode 100644 downstream/mmsegmentation/configs/setr/setr_pup_512x512_160k_b16_ade20k.py create mode 100644 downstream/mmsegmentation/configs/setr/setr_vit-large_mla_8x1_768x768_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/setr/setr_vit-large_naive_8x1_768x768_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/setr/setr_vit-large_pup_8x1_768x768_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/stdc/README.md create mode 100644 downstream/mmsegmentation/configs/stdc/stdc.yml create mode 100644 downstream/mmsegmentation/configs/stdc/stdc1_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/stdc/stdc1_in1k-pre_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/stdc/stdc2_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/stdc/stdc2_in1k-pre_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/swin/README.md create mode 100644 downstream/mmsegmentation/configs/swin/swin.yml create mode 100644 downstream/mmsegmentation/configs/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_1K.py create mode 100644 downstream/mmsegmentation/configs/swin/upernet_swin_base_patch4_window12_512x512_160k_ade20k_pretrain_384x384_22K.py create mode 100644 downstream/mmsegmentation/configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py create mode 100644 downstream/mmsegmentation/configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_22K.py create mode 100644 downstream/mmsegmentation/configs/swin/upernet_swin_small_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py create mode 100644 downstream/mmsegmentation/configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py create mode 100644 downstream/mmsegmentation/configs/twins/README.md create mode 100644 downstream/mmsegmentation/configs/twins/twins.yml create mode 100644 downstream/mmsegmentation/configs/twins/twins_pcpvt-b_fpn_fpnhead_8x4_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_pcpvt-b_uperhead_8x2_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_pcpvt-l_fpn_fpnhead_8x4_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_pcpvt-l_uperhead_8x2_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_pcpvt-s_fpn_fpnhead_8x4_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_pcpvt-s_uperhead_8x4_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_svt-b_fpn_fpnhead_8x4_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_svt-b_uperhead_8x2_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_svt-l_fpn_fpnhead_8x4_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_svt-l_uperhead_8x2_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_svt-s_fpn_fpnhead_8x4_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/twins/twins_svt-s_uperhead_8x2_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/unet/README.md create mode 100644 downstream/mmsegmentation/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_chase_db1.py create mode 100644 downstream/mmsegmentation/configs/unet/deeplabv3_unet_s5-d16_128x128_40k_stare.py create mode 100644 downstream/mmsegmentation/configs/unet/deeplabv3_unet_s5-d16_256x256_40k_hrf.py create mode 100644 downstream/mmsegmentation/configs/unet/deeplabv3_unet_s5-d16_64x64_40k_drive.py create mode 100644 downstream/mmsegmentation/configs/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1.py create mode 100644 downstream/mmsegmentation/configs/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare.py create mode 100644 downstream/mmsegmentation/configs/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf.py create mode 100644 downstream/mmsegmentation/configs/unet/deeplabv3_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive.py create mode 100644 downstream/mmsegmentation/configs/unet/fcn_unet_s5-d16_128x128_40k_chase_db1.py create mode 100644 downstream/mmsegmentation/configs/unet/fcn_unet_s5-d16_128x128_40k_stare.py create mode 100644 downstream/mmsegmentation/configs/unet/fcn_unet_s5-d16_256x256_40k_hrf.py create mode 100644 downstream/mmsegmentation/configs/unet/fcn_unet_s5-d16_4x4_512x1024_160k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/unet/fcn_unet_s5-d16_64x64_40k_drive.py create mode 100644 downstream/mmsegmentation/configs/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1.py create mode 100644 downstream/mmsegmentation/configs/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare.py create mode 100644 downstream/mmsegmentation/configs/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf.py create mode 100644 downstream/mmsegmentation/configs/unet/fcn_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive.py create mode 100644 downstream/mmsegmentation/configs/unet/pspnet_unet_s5-d16_128x128_40k_chase_db1.py create mode 100644 downstream/mmsegmentation/configs/unet/pspnet_unet_s5-d16_128x128_40k_stare.py create mode 100644 downstream/mmsegmentation/configs/unet/pspnet_unet_s5-d16_256x256_40k_hrf.py create mode 100644 downstream/mmsegmentation/configs/unet/pspnet_unet_s5-d16_64x64_40k_drive.py create mode 100644 downstream/mmsegmentation/configs/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_chase-db1.py create mode 100644 downstream/mmsegmentation/configs/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_128x128_40k_stare.py create mode 100644 downstream/mmsegmentation/configs/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_256x256_40k_hrf.py create mode 100644 downstream/mmsegmentation/configs/unet/pspnet_unet_s5-d16_ce-1.0-dice-3.0_64x64_40k_drive.py create mode 100644 downstream/mmsegmentation/configs/unet/unet.yml create mode 100644 downstream/mmsegmentation/configs/upernet/README.md create mode 100644 downstream/mmsegmentation/configs/upernet/upernet.yml create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r101_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r101_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r101_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r101_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r101_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r101_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r101_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r101_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r50_512x1024_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r50_512x1024_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r50_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r50_512x512_20k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r50_512x512_40k_voc12aug.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r50_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r50_769x769_40k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/upernet/upernet_r50_769x769_80k_cityscapes.py create mode 100644 downstream/mmsegmentation/configs/vit/README.md create mode 100644 downstream/mmsegmentation/configs/vit/upernet_deit-b16_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_deit-b16_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_deit-b16_ln_mln_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_deit-b16_mln_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_deit-s16_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_deit-s16_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_deit-s16_ln_mln_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_deit-s16_mln_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_vit-b16_ln_mln_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_vit-b16_mln_512x512_160k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/upernet_vit-b16_mln_512x512_80k_ade20k.py create mode 100644 downstream/mmsegmentation/configs/vit/vit.yml create mode 100644 downstream/mmsegmentation/mmseg/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/apis/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/apis/inference.py create mode 100644 downstream/mmsegmentation/mmseg/apis/test.py create mode 100644 downstream/mmsegmentation/mmseg/apis/train.py create mode 100644 downstream/mmsegmentation/mmseg/core/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/core/builder.py create mode 100644 downstream/mmsegmentation/mmseg/core/evaluation/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/core/evaluation/class_names.py create mode 100644 downstream/mmsegmentation/mmseg/core/evaluation/eval_hooks.py create mode 100644 downstream/mmsegmentation/mmseg/core/evaluation/metrics.py create mode 100644 downstream/mmsegmentation/mmseg/core/layer_decay_optimizer_constructor.py create mode 100644 downstream/mmsegmentation/mmseg/core/seg/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/core/seg/builder.py create mode 100644 downstream/mmsegmentation/mmseg/core/seg/sampler/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/core/seg/sampler/base_pixel_sampler.py create mode 100644 downstream/mmsegmentation/mmseg/core/seg/sampler/ohem_pixel_sampler.py create mode 100644 downstream/mmsegmentation/mmseg/core/utils/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/core/utils/dist_util.py create mode 100644 downstream/mmsegmentation/mmseg/core/utils/layer_decay_optimizer_constructor.py create mode 100644 downstream/mmsegmentation/mmseg/core/utils/misc.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/ade.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/builder.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/chase_db1.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/cityscapes.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/coco_stuff.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/custom.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/dark_zurich.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/dataset_wrappers.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/drive.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/hrf.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/isaid.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/isprs.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/loveda.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/night_driving.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/pascal_context.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/pipelines/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/pipelines/compose.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/pipelines/formating.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/pipelines/formatting.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/pipelines/loading.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/pipelines/test_time_aug.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/pipelines/transforms.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/potsdam.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/samplers/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/samplers/distributed_sampler.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/stare.py create mode 100644 downstream/mmsegmentation/mmseg/datasets/voc.py create mode 100644 downstream/mmsegmentation/mmseg/dev/custom_opt_constructor.py create mode 100644 downstream/mmsegmentation/mmseg/models/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/beit.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/bisenetv1.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/bisenetv2.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/cgnet.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/erfnet.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/fast_scnn.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/gpvit.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/hrnet.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/icnet.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/mit.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/mobilenet_v2.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/mobilenet_v3.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/resnest.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/resnet.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/resnext.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/stdc.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/swin.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/timm_backbone.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/twins.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/unet.py create mode 100644 downstream/mmsegmentation/mmseg/models/backbones/vit.py create mode 100644 downstream/mmsegmentation/mmseg/models/builder.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/ann_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/apc_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/aspp_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/cascade_decode_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/cc_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/da_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/decode_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/dm_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/dnl_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/dpt_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/ema_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/enc_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/fcn_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/fpn_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/gc_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/isa_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/knet_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/lraspp_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/nl_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/ocr_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/point_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/psa_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/psp_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/segformer_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/segformer_head_ori.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/segmenter_mask_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/sep_aspp_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/sep_fcn_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/setr_mla_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/setr_up_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/stdc_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/decode_heads/uper_head.py create mode 100644 downstream/mmsegmentation/mmseg/models/losses/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/models/losses/accuracy.py create mode 100644 downstream/mmsegmentation/mmseg/models/losses/cross_entropy_loss.py create mode 100644 downstream/mmsegmentation/mmseg/models/losses/dice_loss.py create mode 100644 downstream/mmsegmentation/mmseg/models/losses/focal_loss.py create mode 100644 downstream/mmsegmentation/mmseg/models/losses/lovasz_loss.py create mode 100644 downstream/mmsegmentation/mmseg/models/losses/utils.py create mode 100644 downstream/mmsegmentation/mmseg/models/necks/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/models/necks/featurepyramid.py create mode 100644 downstream/mmsegmentation/mmseg/models/necks/fpn.py create mode 100644 downstream/mmsegmentation/mmseg/models/necks/ic_neck.py create mode 100644 downstream/mmsegmentation/mmseg/models/necks/jpu.py create mode 100644 downstream/mmsegmentation/mmseg/models/necks/mla_neck.py create mode 100644 downstream/mmsegmentation/mmseg/models/necks/multilevel_neck.py create mode 100644 downstream/mmsegmentation/mmseg/models/segmentors/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/models/segmentors/base.py create mode 100644 downstream/mmsegmentation/mmseg/models/segmentors/cascade_encoder_decoder.py create mode 100644 downstream/mmsegmentation/mmseg/models/segmentors/encoder_decoder.py create mode 100644 downstream/mmsegmentation/mmseg/models/utils/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/models/utils/embed.py create mode 100644 downstream/mmsegmentation/mmseg/models/utils/inverted_residual.py create mode 100644 downstream/mmsegmentation/mmseg/models/utils/make_divisible.py create mode 100644 downstream/mmsegmentation/mmseg/models/utils/res_layer.py create mode 100644 downstream/mmsegmentation/mmseg/models/utils/se_layer.py create mode 100644 downstream/mmsegmentation/mmseg/models/utils/self_attention_block.py create mode 100644 downstream/mmsegmentation/mmseg/models/utils/shape_convert.py create mode 100644 downstream/mmsegmentation/mmseg/models/utils/up_conv_block.py create mode 100644 downstream/mmsegmentation/mmseg/ops/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/ops/encoding.py create mode 100644 downstream/mmsegmentation/mmseg/ops/wrappers.py create mode 100644 downstream/mmsegmentation/mmseg/utils/__init__.py create mode 100644 downstream/mmsegmentation/mmseg/utils/collect_env.py create mode 100644 downstream/mmsegmentation/mmseg/utils/logger.py create mode 100644 downstream/mmsegmentation/mmseg/utils/misc.py create mode 100644 downstream/mmsegmentation/mmseg/utils/set_env.py create mode 100644 downstream/mmsegmentation/mmseg/version.py create mode 100644 downstream/mmsegmentation/model-index.yml create mode 100644 downstream/mmsegmentation/pytest.ini create mode 100644 downstream/mmsegmentation/requirements.txt create mode 100644 downstream/mmsegmentation/requirements/docs.txt create mode 100644 downstream/mmsegmentation/requirements/mminstall.txt create mode 100644 downstream/mmsegmentation/requirements/optional.txt create mode 100644 downstream/mmsegmentation/requirements/readthedocs.txt create mode 100644 downstream/mmsegmentation/requirements/runtime.txt create mode 100644 downstream/mmsegmentation/requirements/tests.txt create mode 100644 downstream/mmsegmentation/setup.cfg create mode 100755 downstream/mmsegmentation/setup.py create mode 100644 downstream/mmsegmentation/tools/analyze_logs.py create mode 100644 downstream/mmsegmentation/tools/benchmark.py create mode 100644 downstream/mmsegmentation/tools/browse_dataset.py create mode 100644 downstream/mmsegmentation/tools/confusion_matrix.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/chase_db1.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/cityscapes.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/coco_stuff10k.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/coco_stuff164k.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/drive.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/hrf.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/isaid.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/loveda.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/pascal_context.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/potsdam.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/stare.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/vaihingen.py create mode 100644 downstream/mmsegmentation/tools/convert_datasets/voc_aug.py create mode 100644 downstream/mmsegmentation/tools/deploy_test.py create mode 100755 downstream/mmsegmentation/tools/dist_test.sh create mode 100755 downstream/mmsegmentation/tools/dist_train.sh create mode 100644 downstream/mmsegmentation/tools/get_flops.py create mode 100644 downstream/mmsegmentation/tools/model_converters/beit2mmseg.py create mode 100644 downstream/mmsegmentation/tools/model_converters/mit2mmseg.py create mode 100644 downstream/mmsegmentation/tools/model_converters/stdc2mmseg.py create mode 100644 downstream/mmsegmentation/tools/model_converters/swin2mmseg.py create mode 100644 downstream/mmsegmentation/tools/model_converters/twins2mmseg.py create mode 100644 downstream/mmsegmentation/tools/model_converters/vit2mmseg.py create mode 100644 downstream/mmsegmentation/tools/model_converters/vitjax2mmseg.py create mode 100644 downstream/mmsegmentation/tools/onnx2tensorrt.py create mode 100644 downstream/mmsegmentation/tools/print_config.py create mode 100644 downstream/mmsegmentation/tools/publish_model.py create mode 100644 downstream/mmsegmentation/tools/pytorch2onnx.py create mode 100644 downstream/mmsegmentation/tools/pytorch2torchscript.py create mode 100755 downstream/mmsegmentation/tools/slurm_test.sh create mode 100755 downstream/mmsegmentation/tools/slurm_train.sh create mode 100644 downstream/mmsegmentation/tools/test.py create mode 100644 downstream/mmsegmentation/tools/torchserve/mmseg2torchserve.py create mode 100644 downstream/mmsegmentation/tools/torchserve/mmseg_handler.py create mode 100644 downstream/mmsegmentation/tools/torchserve/test_torchserve.py create mode 100644 downstream/mmsegmentation/tools/train.py create mode 100644 mmcls/__init__.py create mode 100644 mmcls/apis/__init__.py create mode 100644 mmcls/apis/inference.py create mode 100644 mmcls/apis/test.py create mode 100644 mmcls/apis/train.py create mode 100644 mmcls/core/__init__.py create mode 100644 mmcls/core/evaluation/__init__.py create mode 100644 mmcls/core/evaluation/eval_hooks.py create mode 100644 mmcls/core/evaluation/eval_metrics.py create mode 100644 mmcls/core/evaluation/mean_ap.py create mode 100644 mmcls/core/evaluation/multilabel_eval_metrics.py create mode 100644 mmcls/core/export/__init__.py create mode 100644 mmcls/core/export/test.py create mode 100644 mmcls/core/hook/__init__.py create mode 100644 mmcls/core/hook/class_num_check_hook.py create mode 100644 mmcls/core/hook/lr_updater.py create mode 100644 mmcls/core/hook/precise_bn_hook.py create mode 100644 mmcls/core/hook/wandblogger_hook.py create mode 100644 mmcls/core/optimizers/__init__.py create mode 100644 mmcls/core/optimizers/lamb.py create mode 100644 mmcls/core/utils/__init__.py create mode 100644 mmcls/core/utils/dist_utils.py create mode 100644 mmcls/core/utils/misc.py create mode 100644 mmcls/core/visualization/__init__.py create mode 100644 mmcls/core/visualization/image.py create mode 100644 mmcls/datasets/__init__.py create mode 100644 mmcls/datasets/base_dataset.py create mode 100644 mmcls/datasets/builder.py create mode 100644 mmcls/datasets/cifar.py create mode 100644 mmcls/datasets/cub.py create mode 100644 mmcls/datasets/custom.py create mode 100644 mmcls/datasets/dataset_wrappers.py create mode 100644 mmcls/datasets/imagenet.py create mode 100644 mmcls/datasets/imagenet21k.py create mode 100644 mmcls/datasets/mnist.py create mode 100644 mmcls/datasets/multi_label.py create mode 100644 mmcls/datasets/pipelines/__init__.py create mode 100644 mmcls/datasets/pipelines/auto_augment.py create mode 100644 mmcls/datasets/pipelines/compose.py create mode 100644 mmcls/datasets/pipelines/formatting.py create mode 100644 mmcls/datasets/pipelines/loading.py create mode 100644 mmcls/datasets/pipelines/transforms.py create mode 100644 mmcls/datasets/samplers/__init__.py create mode 100644 mmcls/datasets/samplers/distributed_sampler.py create mode 100644 mmcls/datasets/samplers/repeat_aug.py create mode 100644 mmcls/datasets/stanford_cars.py create mode 100644 mmcls/datasets/utils.py create mode 100644 mmcls/datasets/voc.py create mode 100644 mmcls/gpvit_dev/amp/runner.py create mode 100644 mmcls/gpvit_dev/models/backbones/gpvit.py create mode 100644 mmcls/gpvit_dev/models/build.py create mode 100644 mmcls/gpvit_dev/models/modules/patch_embed.py create mode 100644 mmcls/gpvit_dev/models/necks/group_neck.py create mode 100644 mmcls/gpvit_dev/models/utils/attentions.py create mode 100644 mmcls/models/__init__.py create mode 100644 mmcls/models/backbones/__init__.py create mode 100644 mmcls/models/backbones/alexnet.py create mode 100644 mmcls/models/backbones/base_backbone.py create mode 100644 mmcls/models/backbones/conformer.py create mode 100644 mmcls/models/backbones/convmixer.py create mode 100644 mmcls/models/backbones/convnext.py create mode 100644 mmcls/models/backbones/cspnet.py create mode 100644 mmcls/models/backbones/deit.py create mode 100644 mmcls/models/backbones/densenet.py create mode 100644 mmcls/models/backbones/efficientformer.py create mode 100644 mmcls/models/backbones/efficientnet.py create mode 100644 mmcls/models/backbones/hornet.py create mode 100644 mmcls/models/backbones/hrnet.py create mode 100644 mmcls/models/backbones/lenet.py create mode 100644 mmcls/models/backbones/mlp_mixer.py create mode 100644 mmcls/models/backbones/mobilenet_v2.py create mode 100644 mmcls/models/backbones/mobilenet_v3.py create mode 100644 mmcls/models/backbones/mvit.py create mode 100644 mmcls/models/backbones/poolformer.py create mode 100644 mmcls/models/backbones/regnet.py create mode 100644 mmcls/models/backbones/repmlp.py create mode 100644 mmcls/models/backbones/repvgg.py create mode 100644 mmcls/models/backbones/res2net.py create mode 100644 mmcls/models/backbones/resnest.py create mode 100644 mmcls/models/backbones/resnet.py create mode 100644 mmcls/models/backbones/resnet_cifar.py create mode 100644 mmcls/models/backbones/resnext.py create mode 100644 mmcls/models/backbones/seresnet.py create mode 100644 mmcls/models/backbones/seresnext.py create mode 100644 mmcls/models/backbones/shufflenet_v1.py create mode 100644 mmcls/models/backbones/shufflenet_v2.py create mode 100644 mmcls/models/backbones/swin_transformer.py create mode 100644 mmcls/models/backbones/swin_transformer_v2.py create mode 100644 mmcls/models/backbones/t2t_vit.py create mode 100644 mmcls/models/backbones/timm_backbone.py create mode 100644 mmcls/models/backbones/tnt.py create mode 100644 mmcls/models/backbones/twins.py create mode 100644 mmcls/models/backbones/van.py create mode 100644 mmcls/models/backbones/vgg.py create mode 100644 mmcls/models/backbones/vision_transformer.py create mode 100644 mmcls/models/builder.py create mode 100644 mmcls/models/classifiers/__init__.py create mode 100644 mmcls/models/classifiers/base.py create mode 100644 mmcls/models/classifiers/image.py create mode 100644 mmcls/models/heads/__init__.py create mode 100644 mmcls/models/heads/base_head.py create mode 100644 mmcls/models/heads/cls_head.py create mode 100644 mmcls/models/heads/conformer_head.py create mode 100644 mmcls/models/heads/deit_head.py create mode 100644 mmcls/models/heads/efficientformer_head.py create mode 100644 mmcls/models/heads/linear_head.py create mode 100755 mmcls/models/heads/multi_label_csra_head.py create mode 100644 mmcls/models/heads/multi_label_head.py create mode 100644 mmcls/models/heads/multi_label_linear_head.py create mode 100644 mmcls/models/heads/stacked_head.py create mode 100644 mmcls/models/heads/vision_transformer_head.py create mode 100644 mmcls/models/losses/__init__.py create mode 100644 mmcls/models/losses/accuracy.py create mode 100644 mmcls/models/losses/asymmetric_loss.py create mode 100644 mmcls/models/losses/cross_entropy_loss.py create mode 100644 mmcls/models/losses/focal_loss.py create mode 100644 mmcls/models/losses/label_smooth_loss.py create mode 100644 mmcls/models/losses/seesaw_loss.py create mode 100644 mmcls/models/losses/utils.py create mode 100644 mmcls/models/necks/__init__.py create mode 100644 mmcls/models/necks/gap.py create mode 100644 mmcls/models/necks/gem.py create mode 100644 mmcls/models/necks/hr_fuse.py create mode 100644 mmcls/models/utils/__init__.py create mode 100644 mmcls/models/utils/attention.py create mode 100644 mmcls/models/utils/augment/__init__.py create mode 100644 mmcls/models/utils/augment/augments.py create mode 100644 mmcls/models/utils/augment/builder.py create mode 100644 mmcls/models/utils/augment/cutmix.py create mode 100644 mmcls/models/utils/augment/identity.py create mode 100644 mmcls/models/utils/augment/mixup.py create mode 100644 mmcls/models/utils/augment/resizemix.py create mode 100644 mmcls/models/utils/augment/utils.py create mode 100644 mmcls/models/utils/channel_shuffle.py create mode 100644 mmcls/models/utils/embed.py create mode 100644 mmcls/models/utils/helpers.py create mode 100644 mmcls/models/utils/inverted_residual.py create mode 100644 mmcls/models/utils/layer_scale.py create mode 100644 mmcls/models/utils/make_divisible.py create mode 100644 mmcls/models/utils/position_encoding.py create mode 100644 mmcls/models/utils/se_layer.py create mode 100644 mmcls/utils/__init__.py create mode 100644 mmcls/utils/collect_env.py create mode 100644 mmcls/utils/device.py create mode 100644 mmcls/utils/distribution.py create mode 100644 mmcls/utils/logger.py create mode 100644 mmcls/utils/setup_env.py create mode 100644 mmcls/version.py create mode 100644 model-index.yml create mode 100644 requirements.txt create mode 100644 requirements/docs.txt create mode 100644 requirements/mminstall.txt create mode 100644 requirements/optional.txt create mode 100644 requirements/readthedocs.txt create mode 100644 requirements/runtime.txt create mode 100644 requirements/tests.txt create mode 100644 resources/gpvit_release_intro.png create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 tests/data/color.jpg create mode 100644 tests/data/dataset/a/1.JPG create mode 100644 tests/data/dataset/ann.txt create mode 100644 tests/data/dataset/b/2.jpeg create mode 100644 tests/data/dataset/b/subb/3.jpg create mode 100644 tests/data/dataset/classes.txt create mode 100644 tests/data/gray.jpg create mode 100644 tests/data/retinanet.py create mode 100644 tests/data/test.logjson create mode 100644 tests/test_data/test_builder.py create mode 100644 tests/test_data/test_datasets/test_common.py create mode 100644 tests/test_data/test_datasets/test_dataset_utils.py create mode 100644 tests/test_data/test_datasets/test_dataset_wrapper.py create mode 100644 tests/test_data/test_datasets/test_sampler.py create mode 100644 tests/test_data/test_pipelines/test_auto_augment.py create mode 100644 tests/test_data/test_pipelines/test_loading.py create mode 100644 tests/test_data/test_pipelines/test_transform.py create mode 100644 tests/test_downstream/test_mmdet_inference.py create mode 100644 tests/test_metrics/test_losses.py create mode 100644 tests/test_metrics/test_metrics.py create mode 100644 tests/test_metrics/test_utils.py create mode 100644 tests/test_models/test_backbones/__init__.py create mode 100644 tests/test_models/test_backbones/test_conformer.py create mode 100644 tests/test_models/test_backbones/test_convmixer.py create mode 100644 tests/test_models/test_backbones/test_convnext.py create mode 100644 tests/test_models/test_backbones/test_cspnet.py create mode 100644 tests/test_models/test_backbones/test_deit.py create mode 100644 tests/test_models/test_backbones/test_densenet.py create mode 100644 tests/test_models/test_backbones/test_efficientformer.py create mode 100644 tests/test_models/test_backbones/test_efficientnet.py create mode 100644 tests/test_models/test_backbones/test_hornet.py create mode 100644 tests/test_models/test_backbones/test_hrnet.py create mode 100644 tests/test_models/test_backbones/test_mlp_mixer.py create mode 100644 tests/test_models/test_backbones/test_mobilenet_v2.py create mode 100644 tests/test_models/test_backbones/test_mobilenet_v3.py create mode 100644 tests/test_models/test_backbones/test_mvit.py create mode 100644 tests/test_models/test_backbones/test_poolformer.py create mode 100644 tests/test_models/test_backbones/test_regnet.py create mode 100644 tests/test_models/test_backbones/test_repmlp.py create mode 100644 tests/test_models/test_backbones/test_repvgg.py create mode 100644 tests/test_models/test_backbones/test_res2net.py create mode 100644 tests/test_models/test_backbones/test_resnest.py create mode 100644 tests/test_models/test_backbones/test_resnet.py create mode 100644 tests/test_models/test_backbones/test_resnet_cifar.py create mode 100644 tests/test_models/test_backbones/test_resnext.py create mode 100644 tests/test_models/test_backbones/test_seresnet.py create mode 100644 tests/test_models/test_backbones/test_seresnext.py create mode 100644 tests/test_models/test_backbones/test_shufflenet_v1.py create mode 100644 tests/test_models/test_backbones/test_shufflenet_v2.py create mode 100644 tests/test_models/test_backbones/test_swin_transformer.py create mode 100644 tests/test_models/test_backbones/test_swin_transformer_v2.py create mode 100644 tests/test_models/test_backbones/test_t2t_vit.py create mode 100644 tests/test_models/test_backbones/test_timm_backbone.py create mode 100644 tests/test_models/test_backbones/test_tnt.py create mode 100644 tests/test_models/test_backbones/test_twins.py create mode 100644 tests/test_models/test_backbones/test_van.py create mode 100644 tests/test_models/test_backbones/test_vgg.py create mode 100644 tests/test_models/test_backbones/test_vision_transformer.py create mode 100644 tests/test_models/test_backbones/utils.py create mode 100644 tests/test_models/test_classifiers.py create mode 100644 tests/test_models/test_heads.py create mode 100644 tests/test_models/test_neck.py create mode 100644 tests/test_models/test_utils/test_attention.py create mode 100644 tests/test_models/test_utils/test_augment.py create mode 100644 tests/test_models/test_utils/test_embed.py create mode 100644 tests/test_models/test_utils/test_inverted_residual.py create mode 100644 tests/test_models/test_utils/test_layer_scale.py create mode 100644 tests/test_models/test_utils/test_misc.py create mode 100644 tests/test_models/test_utils/test_position_encoding.py create mode 100644 tests/test_models/test_utils/test_se.py create mode 100644 tests/test_runtime/test_eval_hook.py create mode 100644 tests/test_runtime/test_hooks.py create mode 100644 tests/test_runtime/test_num_class_hook.py create mode 100644 tests/test_runtime/test_optimizer.py create mode 100644 tests/test_runtime/test_preciseBN_hook.py create mode 100644 tests/test_utils/test_device.py create mode 100644 tests/test_utils/test_logger.py create mode 100644 tests/test_utils/test_setup_env.py create mode 100644 tests/test_utils/test_version_utils.py create mode 100644 tests/test_utils/test_visualization.py create mode 100644 tools/analysis_tools/analyze_logs.py create mode 100644 tools/analysis_tools/analyze_results.py create mode 100644 tools/analysis_tools/eval_metric.py create mode 100644 tools/analysis_tools/get_flops.py create mode 100644 tools/convert_models/efficientnet_to_mmcls.py create mode 100644 tools/convert_models/hornet2mmcls.py create mode 100644 tools/convert_models/mlpmixer_to_mmcls.py create mode 100644 tools/convert_models/mobilenetv2_to_mmcls.py create mode 100644 tools/convert_models/publish_model.py create mode 100644 tools/convert_models/reparameterize_model.py create mode 100644 tools/convert_models/reparameterize_repvgg.py create mode 100644 tools/convert_models/repvgg_to_mmcls.py create mode 100644 tools/convert_models/shufflenetv2_to_mmcls.py create mode 100644 tools/convert_models/torchvision_to_mmcls.py create mode 100644 tools/convert_models/twins2mmcls.py create mode 100644 tools/convert_models/van2mmcls.py create mode 100644 tools/convert_models/vgg_to_mmcls.py create mode 100644 tools/dataset_tools/create_lmdb_dataset.py create mode 100644 tools/deployment/mmcls2torchserve.py create mode 100644 tools/deployment/mmcls_handler.py create mode 100644 tools/deployment/onnx2tensorrt.py create mode 100644 tools/deployment/pytorch2mlmodel.py create mode 100644 tools/deployment/pytorch2onnx.py create mode 100644 tools/deployment/pytorch2torchscript.py create mode 100644 tools/deployment/test.py create mode 100644 tools/deployment/test_torchserver.py create mode 100644 tools/dist_test.sh create mode 100644 tools/dist_train.sh create mode 100644 tools/dist_train_arm.sh create mode 100644 tools/kfold-cross-valid.py create mode 100644 tools/misc/print_config.py create mode 100644 tools/misc/verify_dataset.py create mode 100644 tools/slurm_test.sh create mode 100644 tools/slurm_train.sh create mode 100644 tools/test.py create mode 100644 tools/train.py create mode 100644 tools/visualizations/vis_cam.py create mode 100644 tools/visualizations/vis_lr.py create mode 100644 tools/visualizations/vis_pipeline.py diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..0c0d773 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,9 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +title: "OpenMMLab's Image Classification Toolbox and Benchmark" +authors: + - name: "MMClassification Contributors" +version: 0.15.0 +date-released: 2020-07-09 +repository-code: "https://github.com/open-mmlab/mmclassification" +license: Apache-2.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..8a0c632 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,61 @@ +# Contributing to OpenMMLab + +All kinds of contributions are welcome, including but not limited to the following. + +- Fix typo or bugs +- Add documentation or translate the documentation into other languages +- Add new features and components + +## Workflow + +1. fork and pull the latest OpenMMLab repository (MMClassification) +2. checkout a new branch (do not use master branch for PRs) +3. commit your changes +4. create a PR + +```{note} +If you plan to add some new features that involve large changes, it is encouraged to open an issue for discussion first. +``` + +## Code style + +### Python + +We adopt [PEP8](https://www.python.org/dev/peps/pep-0008/) as the preferred code style. + +We use the following tools for linting and formatting: + +- [flake8](https://github.com/PyCQA/flake8): A wrapper around some linter tools. +- [isort](https://github.com/timothycrosley/isort): A Python utility to sort imports. +- [yapf](https://github.com/google/yapf): A formatter for Python files. +- [codespell](https://github.com/codespell-project/codespell): A Python utility to fix common misspellings in text files. +- [mdformat](https://github.com/executablebooks/mdformat): Mdformat is an opinionated Markdown formatter that can be used to enforce a consistent style in Markdown files. +- [docformatter](https://github.com/myint/docformatter): A formatter to format docstring. + +Style configurations can be found in [setup.cfg](./setup.cfg). + +We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`, `markdown files`, +fixes `end-of-files`, `double-quoted-strings`, `python-encoding-pragma`, `mixed-line-ending`, sorts `requirments.txt` automatically on every commit. +The config for a pre-commit hook is stored in [.pre-commit-config](https://github.com/open-mmlab/mmclassification/blob/master/.pre-commit-config.yaml). + +After you clone the repository, you will need to install initialize pre-commit hook. + +```shell +pip install -U pre-commit +``` + +From the repository folder + +```shell +pre-commit install +``` + +After this on every commit check code linters and formatter will be enforced. + +```{important} +Before you create a PR, make sure that your code lints and is formatted by yapf. +``` + +### C++ and CUDA + +We follow the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f731325 --- /dev/null +++ b/LICENSE @@ -0,0 +1,203 @@ +Copyright (c) OpenMMLab. All rights reserved + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 MMClassification Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..17ddc8c --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,4 @@ +include requirements/*.txt +include mmcls/.mim/model-index.yml +recursive-include mmcls/.mim/configs *.py *.yml +recursive-include mmcls/.mim/tools *.py *.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..75c9cf5 --- /dev/null +++ b/README.md @@ -0,0 +1,197 @@ +# GPViT: A High Resolution Non-Hierarchical Vision Transformer with Group Propagation +

+ +

+ +GPViT is a high-resolution non-hierarchical vision transformer architecture designed for high-performing visual recognition. This repository contains the official PyTorch implementation of our paper: + +[GPViT: A High Resolution Non-Hierarchical Vision Transformer with Group Propagation, *Chenhongyi Yang**, *Jiarui Xu**, *Shalini De Mello*, *Elliot J. Crowley*, *Xiaolong Wang*.](TBD) + +## Usage + +### Environment Setup +Our code base is built upon the MM-series toolkits. Specifically, classification is based on [MMClassification](); object detection is based on [MMDetection](); and semantic segmentation is based on [MMSegmentation](). Users can follow the official site of those toolkit to set up their environments. We also provide a sample setting up script as following: + +```shell +conda create -n gpvit python=3.7 -y +source activate gpvit +pip install torch==1.7.1+cu101 torchvision==0.8.2+cu101 -f https://download.pytorch.org/whl/torch_stable.html +pip install -U openmim +mim install mmcv-full==1.4.8 +pip install timm +pip install lmdb # for ImageNet experiments +pip install -v -e . +cd downstream/mmdetection # setup object detection and instance segmentation +pip install -v -e . +cd ../mmsegmentation # setup semantic segmentation +pip install -v -e . +``` + +### Data Preparation +Please follow [MMClassification](), [MMDetection]() and [MMSegmentation]() to set up the ImageNet, COCO and ADE20K datasets. For ImageNet experiment, we convert the dataset to LMDB format to accelerate training and testing. For example, you can convert you own dataset by running: +```shell +python tools/dataset_tools/create_lmdb_dataset.py \ + --train-img-dir data/imagenet/train \ + --train-out data/imagenet/imagenet_lmdb/train \ + --val_img_dir data/imagenet/val \ + --val-out data/imagenet/imagenet_lmdb/val +``` +After setting up, the datasets file structure should be as follows: +``` +GPViT +|-- data +| |-- imagenet +| | |-- imagenet_lmdb +| | | |-- train +| | | | |-- data.mdb +| | | | |-- lock.mdb +| | | |-- val +| | | | |-- data.mdb +| | | | |-- lock.mdb +| | |-- meta +| | | |- ... +|-- downstream +| |-- mmsegmentation +| | |-- data +| | | |-- ade +| | | | |-- ADEChallengeData2016 +| | | | | |-- annotations +| | | | | | |-- ... +| | | | | |-- images +| | | | | | |-- ... +| | | | | |-- objectInfo150.txt +| | | | | |-- sceneCategories.txt +| | |-- ... +| |-- mmdetection +| | |-- data +| | | |-- coco +| | | | |-- train2017 +| | | | | |-- ... +| | | | |-- val2017 +| | | | | |-- ... +| | | | |-- annotations +| | | | | |-- instances_train2017.json +| | | | | |-- instances_val2017.json +| | | | | |-- ... +| | |-- ... +|-- ... +``` + +### ImageNet classification +#### Training GPViT +```shell +# Example: Training GPViT-L1 model +zsh tool/dist_train.sh configs/gpvit/gpvit_l1.py 16 +``` +#### Testing GPViT +```shell +# Example: Testing GPViT-L1 model +zsh tool/dist_test.sh configs/gpvit/gpvit_l1.py work_dirs/gpvit_l1/epoch_300.pth 16 --metrics accuracy +``` +### COCO Object Detection and Instance Segmentation + +#### Training GPViT based Mask R-CNN +```shell +# Example: Training GPViT-L1 models with 1x and 3x+MS schedules +zsh tools/dist_train.sh configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_1x.py 16 +zsh tools/dist_train.sh configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_3x.py 16 +``` + +#### Training GPViT based RetinaNet +```shell +# Example: Training GPViT-L1 models with 1x and 3x+MS schedules +zsh tools/dist_train.sh configs/gpvit/retinanet/gpvit_l1_retinanet_1x.py 16 +zsh tools/dist_train.sh configs/gpvit/retinanet/gpvit_l4_retinanet_3x.py 16 +``` + +#### Testing GPViT based Mask R-CNN +```shell +# Example: Testing GPViT-L1 Mask R-CNN 1x model +zsh tools/dist_test.sh configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_1x.py work_dirs/gpvit_l1_maskrcnn_1x/epoch_12.pth 16 --eval bbox segm +``` + +#### Testing GPViT based RetinaNet +```shell +# Example: Testing GPViT-L1 RetinaNet 1x model +zsh tools/dist_test.sh configs/gpvit/retinanet/gpvit_l1_retinanet_1x.py work_dirs/gpvit_l1_retinanet_1x/epoch_12.pth 16 --eval bbox +``` + +### ADE20K semantic segmentation +#### Training GPViT based semantic segmentation models +```shell +# Example: Training GPViT-L1 based SegFormer and UperNet models +zsh tools/dist_train.sh configs/gpvit/gpvit_l1_segformer.py 16 +zsh tools/dist_train.sh configs/gpvit/gpvit_l1_upernet.py 16 +``` +#### Testing GPViT based semantic segmentation models +```shell +# Example: Testing GPViT-L1 based SegFormer and UperNet models +zsh tools/dist_test.sh configs/gpvit/gpvit_l1_segformer.py work_dirs/gpvit_l1_segformer/iter_160000.pth 16 --eval mIoU +zsh tools/dist_test.sh configs/gpvit/gpvit_l1_upernet.py work_dirs/gpvit_l1_upernet/iter_160000.pth 16 --eval mIoU +``` + +## Benchmark results + +### ImageNet-1k classification +| Model | #Params (M) | Top-1 Acc | Top-5 Acc | Config | Model | +|:--------:|:-----------:|:---------:|:---------:|:----------:|:---------:| +| GPViT-L1 | 9.3 | 80.5 | 95.4 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/configs/gpvit/gpvit_l1.py) | [model]() | +| GPViT-L2 | 23.8 | 83.4 | 96.6 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/configs/gpvit/gpvit_l2.py) | [model]() | +| GPViT-L3 | 36.2 | 84.1 | 96.9 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/configs/gpvit/gpvit_l3.py) | [model]() | +| GPViT-L4 | 75.4 | 84.3 | 96.9 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/configs/gpvit/gpvit_l4.py) | [model]() | + +### COCO Mask R-CNN 1x Schedule +| Model | #Params (M) | AP Box | AP Mask | Config | Model | +|:--------:|:-----------:|:------:|:-------:|:----------:|:---------:| +| GPViT-L1 | 33 | 48.1 | 42.7 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_1x.py) | [model]() | +| GPViT-L2 | 50 | 49.9 | 43.9 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_1x.py) | [model]() | +| GPViT-L3 | 64 | 50.4 | 44.4 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_1x.py) | [model]() | +| GPViT-L4 | 109 | 51.0 | 45.0 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_1x.py) | [model]() | + +### COCO Mask R-CNN 3x+MS Schedule +| Model | #Params (M) | AP Box | AP Mask | Config | Model | +|:--------:|:-----------:|:------:|:-------:|:----------:|:---------:| +| GPViT-L1 | 33 | 50.2 | 44.3 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_3x.py) | [model]() | +| GPViT-L2 | 50 | 51.4 | 45.1 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_3x.py) | [model]() | +| GPViT-L3 | 64 | 51.6 | 45.2 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_3x.py) | [model]() | +| GPViT-L4 | 109 | 52.1 | 45.7 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_3x.py) | [model]() | + +### COCO RetinaNet 1x Schedule +| Model | #Params (M) | AP Box | Config | Model | +|:--------:|:-----------:|:------:|:----------:|:---------:| +| GPViT-L1 | 21 | 45.8 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_1x.py) | [model]() | +| GPViT-L2 | 37 | 48.0 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_1x.py) | [model]() | +| GPViT-L3 | 52 | 48.3 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_1x.py) | [model]() | +| GPViT-L4 | 96 | 48.7 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_1x.py) | [model]() | + +### COCO RetinaNet 3x+MS Schedule +| Model | #Params (M) | AP Box | Config | Model | +|:--------:|:-----------:|:------:|:----------:|:---------:| +| GPViT-L1 | 21 | 48.1 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_3x.py) | [model]() | +| GPViT-L2 | 37 | 49.0 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_3x.py) | [model]() | +| GPViT-L3 | 52 | 49.4 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_3x.py) | [model]() | +| GPViT-L4 | 96 | 49.8 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_3x.py) | [model]() | + +### ADE20K UperNet +| Model | #Params (M) | mIoU | Config | Model | +|:--------:|:-----------:|:----:|:----------:|:---------:| +| GPViT-L1 | 37 | 49.1 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmsegmentation/configs/gpvit/gpvit_l1_upernet.py) | [model]() | +| GPViT-L2 | 53 | 50.2 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmsegmentation/configs/gpvit/gpvit_l2_upernet.py) | [model]() | +| GPViT-L3 | 66 | 51.7 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmsegmentation/configs/gpvit/gpvit_l3_upernet.py) | [model]() | +| GPViT-L4 | 107 | 52.5 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmsegmentation/configs/gpvit/gpvit_l14_upernet.py) | [model]() | + +### ADE20K SegFormer +| Model | #Params (M) | mIoU | Config | Model | +|:--------:|:-----------:|:----:|:----------:|:---------:| +| GPViT-L1 | 9 | 46.9 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmsegmentation/configs/gpvit/gpvit_l1_segformer.py) | [model]() | +| GPViT-L2 | 24 | 49.2 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmsegmentation/configs/gpvit/gpvit_l2_segformer.py) | [model]() | +| GPViT-L3 | 36 | 50.8 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmsegmentation/configs/gpvit/gpvit_l3_segformer.py) | [model]() | +| GPViT-L4 | 76 | 51.3 | [config](https://github.com/ChenhongyiYang/GPViT/blob/main/downstream/mmsegmentation/configs/gpvit/gpvit_l14_segformer.py) | [model]() | + + + +## Citation +``` +TBD +``` + diff --git a/configs/_base_/datasets/cifar100_bs16.py b/configs/_base_/datasets/cifar100_bs16.py new file mode 100644 index 0000000..d4f8db7 --- /dev/null +++ b/configs/_base_/datasets/cifar100_bs16.py @@ -0,0 +1,36 @@ +# dataset settings +dataset_type = 'CIFAR100' +img_norm_cfg = dict( + mean=[129.304, 124.070, 112.434], + std=[68.170, 65.392, 70.418], + to_rgb=False) +train_pipeline = [ + dict(type='RandomCrop', size=32, padding=4), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=16, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/cifar100', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/cifar100', + pipeline=test_pipeline, + test_mode=True), + test=dict( + type=dataset_type, + data_prefix='data/cifar100', + pipeline=test_pipeline, + test_mode=True)) diff --git a/configs/_base_/datasets/cifar10_bs16.py b/configs/_base_/datasets/cifar10_bs16.py new file mode 100644 index 0000000..0d28adf --- /dev/null +++ b/configs/_base_/datasets/cifar10_bs16.py @@ -0,0 +1,35 @@ +# dataset settings +dataset_type = 'CIFAR10' +img_norm_cfg = dict( + mean=[125.307, 122.961, 113.8575], + std=[51.5865, 50.847, 51.255], + to_rgb=False) +train_pipeline = [ + dict(type='RandomCrop', size=32, padding=4), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=16, + workers_per_gpu=2, + train=dict( + type=dataset_type, data_prefix='data/cifar10', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/cifar10', + pipeline=test_pipeline, + test_mode=True), + test=dict( + type=dataset_type, + data_prefix='data/cifar10', + pipeline=test_pipeline, + test_mode=True)) diff --git a/configs/_base_/datasets/cub_bs8_384.py b/configs/_base_/datasets/cub_bs8_384.py new file mode 100644 index 0000000..4acad24 --- /dev/null +++ b/configs/_base_/datasets/cub_bs8_384.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'CUB' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=510), + dict(type='RandomCrop', size=384), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=510), + dict(type='CenterCrop', crop_size=384), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data_root = 'data/CUB_200_2011/' +data = dict( + samples_per_gpu=8, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'images.txt', + image_class_labels_file=data_root + 'image_class_labels.txt', + train_test_split_file=data_root + 'train_test_split.txt', + data_prefix=data_root + 'images', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'images.txt', + image_class_labels_file=data_root + 'image_class_labels.txt', + train_test_split_file=data_root + 'train_test_split.txt', + data_prefix=data_root + 'images', + test_mode=True, + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'images.txt', + image_class_labels_file=data_root + 'image_class_labels.txt', + train_test_split_file=data_root + 'train_test_split.txt', + data_prefix=data_root + 'images', + test_mode=True, + pipeline=test_pipeline)) + +evaluation = dict( + interval=1, metric='accuracy', + save_best='auto') # save the checkpoint with highest accuracy diff --git a/configs/_base_/datasets/cub_bs8_448.py b/configs/_base_/datasets/cub_bs8_448.py new file mode 100644 index 0000000..9e909a1 --- /dev/null +++ b/configs/_base_/datasets/cub_bs8_448.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'CUB' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=600), + dict(type='RandomCrop', size=448), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=600), + dict(type='CenterCrop', crop_size=448), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data_root = 'data/CUB_200_2011/' +data = dict( + samples_per_gpu=8, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'images.txt', + image_class_labels_file=data_root + 'image_class_labels.txt', + train_test_split_file=data_root + 'train_test_split.txt', + data_prefix=data_root + 'images', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'images.txt', + image_class_labels_file=data_root + 'image_class_labels.txt', + train_test_split_file=data_root + 'train_test_split.txt', + data_prefix=data_root + 'images', + test_mode=True, + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'images.txt', + image_class_labels_file=data_root + 'image_class_labels.txt', + train_test_split_file=data_root + 'train_test_split.txt', + data_prefix=data_root + 'images', + test_mode=True, + pipeline=test_pipeline)) + +evaluation = dict( + interval=1, metric='accuracy', + save_best='auto') # save the checkpoint with highest accuracy diff --git a/configs/_base_/datasets/imagenet21k_bs128.py b/configs/_base_/datasets/imagenet21k_bs128.py new file mode 100644 index 0000000..b81a746 --- /dev/null +++ b/configs/_base_/datasets/imagenet21k_bs128.py @@ -0,0 +1,43 @@ +# dataset settings +dataset_type = 'ImageNet21k' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=128, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet21k/train', + pipeline=train_pipeline, + recursion_subdir=True), + val=dict( + type=dataset_type, + data_prefix='data/imagenet21k/val', + ann_file='data/imagenet21k/meta/val.txt', + pipeline=test_pipeline, + recursion_subdir=True), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet21k/val', + ann_file='data/imagenet21k/meta/val.txt', + pipeline=test_pipeline, + recursion_subdir=True)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs128_poolformer_medium_224.py b/configs/_base_/datasets/imagenet_bs128_poolformer_medium_224.py new file mode 100644 index 0000000..667e58a --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs128_poolformer_medium_224.py @@ -0,0 +1,71 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(236, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=128, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs128_poolformer_small_224.py b/configs/_base_/datasets/imagenet_bs128_poolformer_small_224.py new file mode 100644 index 0000000..76aee7e --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs128_poolformer_small_224.py @@ -0,0 +1,71 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(248, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=128, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs256_rsb_a12.py b/configs/_base_/datasets/imagenet_bs256_rsb_a12.py new file mode 100644 index 0000000..7596855 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs256_rsb_a12.py @@ -0,0 +1,53 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=7, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(236, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=256, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs256_rsb_a3.py b/configs/_base_/datasets/imagenet_bs256_rsb_a3.py new file mode 100644 index 0000000..aee640d --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs256_rsb_a3.py @@ -0,0 +1,53 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=160), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=6, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(236, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=256, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs32.py b/configs/_base_/datasets/imagenet_bs32.py new file mode 100644 index 0000000..8a54659 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs32.py @@ -0,0 +1,40 @@ +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=32, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs32_pil_bicubic.py b/configs/_base_/datasets/imagenet_bs32_pil_bicubic.py new file mode 100644 index 0000000..d66c1bd --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs32_pil_bicubic.py @@ -0,0 +1,48 @@ +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(256, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=32, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs32_pil_resize.py b/configs/_base_/datasets/imagenet_bs32_pil_resize.py new file mode 100644 index 0000000..22b74f7 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs32_pil_resize.py @@ -0,0 +1,40 @@ +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224, backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1), backend='pillow'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=32, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64.py b/configs/_base_/datasets/imagenet_bs64.py new file mode 100644 index 0000000..b9f866a --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64.py @@ -0,0 +1,40 @@ +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_autoaug.py b/configs/_base_/datasets/imagenet_bs64_autoaug.py new file mode 100644 index 0000000..a1092a3 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_autoaug.py @@ -0,0 +1,43 @@ +_base_ = ['./pipelines/auto_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='AutoAugment', policies={{_base_.auto_increasing_policies}}), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_convmixer_224.py b/configs/_base_/datasets/imagenet_bs64_convmixer_224.py new file mode 100644 index 0000000..afd7113 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_convmixer_224.py @@ -0,0 +1,71 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(233, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_mixer_224.py b/configs/_base_/datasets/imagenet_bs64_mixer_224.py new file mode 100644 index 0000000..a005436 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_mixer_224.py @@ -0,0 +1,48 @@ +# dataset settings +dataset_type = 'ImageNet' + +# change according to https://github.com/rwightman/pytorch-image-models/blob +# /master/timm/models/mlp_mixer.py +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) + +# training is not supported for now +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224, backend='cv2'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', size=(256, -1), backend='cv2', interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_pil_resize.py b/configs/_base_/datasets/imagenet_bs64_pil_resize.py new file mode 100644 index 0000000..95d0e1f --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_pil_resize.py @@ -0,0 +1,40 @@ +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224, backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1), backend='pillow'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_pil_resize_autoaug.py b/configs/_base_/datasets/imagenet_bs64_pil_resize_autoaug.py new file mode 100644 index 0000000..2a9a4de --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_pil_resize_autoaug.py @@ -0,0 +1,53 @@ +_base_ = [ + 'pipelines/auto_aug.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='AutoAugment', policies={{_base_.policy_imagenet}}), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(256, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_swin_224.py b/configs/_base_/datasets/imagenet_bs64_swin_224.py new file mode 100644 index 0000000..4a059a3 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_swin_224.py @@ -0,0 +1,71 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(256, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_swin_224_lmdb.py b/configs/_base_/datasets/imagenet_bs64_swin_224_lmdb.py new file mode 100644 index 0000000..7d79449 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_swin_224_lmdb.py @@ -0,0 +1,80 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFileLMDB', + file_client_args={ + 'backend': 'lmdb', + 'db_path': 'data/imagenet/imagenet_lmdb/train' + }), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFileLMDB', + file_client_args={ + 'backend': 'lmdb', + 'db_path': 'data/imagenet/imagenet_lmdb/val' + }), + dict( + type='Resize', + size=(256, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='', + ann_file='data/imagenet/meta/train.txt', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_swin_256.py b/configs/_base_/datasets/imagenet_bs64_swin_256.py new file mode 100644 index 0000000..1f73683 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_swin_256.py @@ -0,0 +1,71 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=256, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(292, -1), # ( 256 / 224 * 256 ) + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=256), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_swin_384.py b/configs/_base_/datasets/imagenet_bs64_swin_384.py new file mode 100644 index 0000000..d263939 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_swin_384.py @@ -0,0 +1,43 @@ +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=384, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=384, backend='pillow', interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_t2t_224.py b/configs/_base_/datasets/imagenet_bs64_t2t_224.py new file mode 100644 index 0000000..1190d6f --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_t2t_224.py @@ -0,0 +1,71 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(248, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=4, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=1, metric='accuracy', save_best='auto') diff --git a/configs/_base_/datasets/pipelines/auto_aug.py b/configs/_base_/datasets/pipelines/auto_aug.py new file mode 100644 index 0000000..5a10f7e --- /dev/null +++ b/configs/_base_/datasets/pipelines/auto_aug.py @@ -0,0 +1,96 @@ +# Policy for ImageNet, refers to +# https://github.com/DeepVoltaire/AutoAugment/blame/master/autoaugment.py +policy_imagenet = [ + [ + dict(type='Posterize', bits=4, prob=0.4), + dict(type='Rotate', angle=30., prob=0.6) + ], + [ + dict(type='Solarize', thr=256 / 9 * 4, prob=0.6), + dict(type='AutoContrast', prob=0.6) + ], + [dict(type='Equalize', prob=0.8), + dict(type='Equalize', prob=0.6)], + [ + dict(type='Posterize', bits=5, prob=0.6), + dict(type='Posterize', bits=5, prob=0.6) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Solarize', thr=256 / 9 * 5, prob=0.2) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8) + ], + [ + dict(type='Solarize', thr=256 / 9 * 6, prob=0.6), + dict(type='Equalize', prob=0.6) + ], + [dict(type='Posterize', bits=6, prob=0.8), + dict(type='Equalize', prob=1.)], + [ + dict(type='Rotate', angle=10., prob=0.2), + dict(type='Solarize', thr=256 / 9, prob=0.6) + ], + [ + dict(type='Equalize', prob=0.6), + dict(type='Posterize', bits=5, prob=0.4) + ], + [ + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8), + dict(type='ColorTransform', magnitude=0., prob=0.4) + ], + [ + dict(type='Rotate', angle=30., prob=0.4), + dict(type='Equalize', prob=0.6) + ], + [dict(type='Equalize', prob=0.0), + dict(type='Equalize', prob=0.8)], + [dict(type='Invert', prob=0.6), + dict(type='Equalize', prob=1.)], + [ + dict(type='ColorTransform', magnitude=0.4, prob=0.6), + dict(type='Contrast', magnitude=0.8, prob=1.) + ], + [ + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8), + dict(type='ColorTransform', magnitude=0.2, prob=1.) + ], + [ + dict(type='ColorTransform', magnitude=0.8, prob=0.8), + dict(type='Solarize', thr=256 / 9 * 2, prob=0.8) + ], + [ + dict(type='Sharpness', magnitude=0.7, prob=0.4), + dict(type='Invert', prob=0.6) + ], + [ + dict( + type='Shear', + magnitude=0.3 / 9 * 5, + prob=0.6, + direction='horizontal'), + dict(type='Equalize', prob=1.) + ], + [ + dict(type='ColorTransform', magnitude=0., prob=0.4), + dict(type='Equalize', prob=0.6) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Solarize', thr=256 / 9 * 5, prob=0.2) + ], + [ + dict(type='Solarize', thr=256 / 9 * 4, prob=0.6), + dict(type='AutoContrast', prob=0.6) + ], + [dict(type='Invert', prob=0.6), + dict(type='Equalize', prob=1.)], + [ + dict(type='ColorTransform', magnitude=0.4, prob=0.6), + dict(type='Contrast', magnitude=0.8, prob=1.) + ], + [dict(type='Equalize', prob=0.8), + dict(type='Equalize', prob=0.6)], +] diff --git a/configs/_base_/datasets/pipelines/rand_aug.py b/configs/_base_/datasets/pipelines/rand_aug.py new file mode 100644 index 0000000..f2bab3c --- /dev/null +++ b/configs/_base_/datasets/pipelines/rand_aug.py @@ -0,0 +1,43 @@ +# Refers to `_RAND_INCREASING_TRANSFORMS` in pytorch-image-models +rand_increasing_policies = [ + dict(type='AutoContrast'), + dict(type='Equalize'), + dict(type='Invert'), + dict(type='Rotate', magnitude_key='angle', magnitude_range=(0, 30)), + dict(type='Posterize', magnitude_key='bits', magnitude_range=(4, 0)), + dict(type='Solarize', magnitude_key='thr', magnitude_range=(256, 0)), + dict( + type='SolarizeAdd', + magnitude_key='magnitude', + magnitude_range=(0, 110)), + dict( + type='ColorTransform', + magnitude_key='magnitude', + magnitude_range=(0, 0.9)), + dict(type='Contrast', magnitude_key='magnitude', magnitude_range=(0, 0.9)), + dict( + type='Brightness', magnitude_key='magnitude', + magnitude_range=(0, 0.9)), + dict( + type='Sharpness', magnitude_key='magnitude', magnitude_range=(0, 0.9)), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + direction='horizontal'), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + direction='vertical'), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.45), + direction='horizontal'), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.45), + direction='vertical') +] diff --git a/configs/_base_/datasets/stanford_cars_bs8_448.py b/configs/_base_/datasets/stanford_cars_bs8_448.py new file mode 100644 index 0000000..636b2e1 --- /dev/null +++ b/configs/_base_/datasets/stanford_cars_bs8_448.py @@ -0,0 +1,46 @@ +# dataset settings +dataset_type = 'StanfordCars' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=512), + dict(type='RandomCrop', size=448), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=512), + dict(type='CenterCrop', crop_size=448), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data_root = 'data/stanfordcars' +data = dict( + samples_per_gpu=8, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix=data_root, + test_mode=False, + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix=data_root, + test_mode=True, + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_prefix=data_root, + test_mode=True, + pipeline=test_pipeline)) + +evaluation = dict( + interval=1, metric='accuracy', + save_best='auto') # save the checkpoint with highest accuracy diff --git a/configs/_base_/datasets/voc_bs16.py b/configs/_base_/datasets/voc_bs16.py new file mode 100644 index 0000000..73fa0bc --- /dev/null +++ b/configs/_base_/datasets/voc_bs16.py @@ -0,0 +1,41 @@ +# dataset settings +dataset_type = 'VOC' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=16, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/VOCdevkit/VOC2007/', + ann_file='data/VOCdevkit/VOC2007/ImageSets/Main/trainval.txt', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/VOCdevkit/VOC2007/', + ann_file='data/VOCdevkit/VOC2007/ImageSets/Main/test.txt', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + data_prefix='data/VOCdevkit/VOC2007/', + ann_file='data/VOCdevkit/VOC2007/ImageSets/Main/test.txt', + pipeline=test_pipeline)) +evaluation = dict( + interval=1, metric=['mAP', 'CP', 'OP', 'CR', 'OR', 'CF1', 'OF1']) diff --git a/configs/_base_/default_runtime.py b/configs/_base_/default_runtime.py new file mode 100644 index 0000000..ba965a4 --- /dev/null +++ b/configs/_base_/default_runtime.py @@ -0,0 +1,16 @@ +# checkpoint saving +checkpoint_config = dict(interval=1) +# yapf:disable +log_config = dict( + interval=100, + hooks=[ + dict(type='TextLoggerHook'), + # dict(type='TensorboardLoggerHook') + ]) +# yapf:enable + +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] diff --git a/configs/_base_/models/conformer/base-p16.py b/configs/_base_/models/conformer/base-p16.py new file mode 100644 index 0000000..157dcc9 --- /dev/null +++ b/configs/_base_/models/conformer/base-p16.py @@ -0,0 +1,22 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='Conformer', arch='base', drop_path_rate=0.1, init_cfg=None), + neck=None, + head=dict( + type='ConformerHead', + num_classes=1000, + in_channels=[1536, 576], + init_cfg=None, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/conformer/small-p16.py b/configs/_base_/models/conformer/small-p16.py new file mode 100644 index 0000000..1729808 --- /dev/null +++ b/configs/_base_/models/conformer/small-p16.py @@ -0,0 +1,22 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='Conformer', arch='small', drop_path_rate=0.1, init_cfg=None), + neck=None, + head=dict( + type='ConformerHead', + num_classes=1000, + in_channels=[1024, 384], + init_cfg=None, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/conformer/small-p32.py b/configs/_base_/models/conformer/small-p32.py new file mode 100644 index 0000000..593aba1 --- /dev/null +++ b/configs/_base_/models/conformer/small-p32.py @@ -0,0 +1,26 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='Conformer', + arch='small', + patch_size=32, + drop_path_rate=0.1, + init_cfg=None), + neck=None, + head=dict( + type='ConformerHead', + num_classes=1000, + in_channels=[1024, 384], + init_cfg=None, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/conformer/tiny-p16.py b/configs/_base_/models/conformer/tiny-p16.py new file mode 100644 index 0000000..dad8eca --- /dev/null +++ b/configs/_base_/models/conformer/tiny-p16.py @@ -0,0 +1,22 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='Conformer', arch='tiny', drop_path_rate=0.1, init_cfg=None), + neck=None, + head=dict( + type='ConformerHead', + num_classes=1000, + in_channels=[256, 384], + init_cfg=None, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/convmixer/convmixer-1024-20.py b/configs/_base_/models/convmixer/convmixer-1024-20.py new file mode 100644 index 0000000..a8f4d51 --- /dev/null +++ b/configs/_base_/models/convmixer/convmixer-1024-20.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvMixer', arch='1024/20'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convmixer/convmixer-1536-20.py b/configs/_base_/models/convmixer/convmixer-1536-20.py new file mode 100644 index 0000000..9ad8209 --- /dev/null +++ b/configs/_base_/models/convmixer/convmixer-1536-20.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvMixer', arch='1536/20'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convmixer/convmixer-768-32.py b/configs/_base_/models/convmixer/convmixer-768-32.py new file mode 100644 index 0000000..1cba528 --- /dev/null +++ b/configs/_base_/models/convmixer/convmixer-768-32.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvMixer', arch='768/32', act_cfg=dict(type='ReLU')), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convnext/convnext-base.py b/configs/_base_/models/convnext/convnext-base.py new file mode 100644 index 0000000..7fc5ce7 --- /dev/null +++ b/configs/_base_/models/convnext/convnext-base.py @@ -0,0 +1,23 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='base', + out_indices=(3, ), + drop_path_rate=0.5, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convnext/convnext-large.py b/configs/_base_/models/convnext/convnext-large.py new file mode 100644 index 0000000..4d9e37c --- /dev/null +++ b/configs/_base_/models/convnext/convnext-large.py @@ -0,0 +1,23 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='large', + out_indices=(3, ), + drop_path_rate=0.5, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convnext/convnext-small.py b/configs/_base_/models/convnext/convnext-small.py new file mode 100644 index 0000000..989ad1d --- /dev/null +++ b/configs/_base_/models/convnext/convnext-small.py @@ -0,0 +1,23 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='small', + out_indices=(3, ), + drop_path_rate=0.4, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convnext/convnext-tiny.py b/configs/_base_/models/convnext/convnext-tiny.py new file mode 100644 index 0000000..0b692ab --- /dev/null +++ b/configs/_base_/models/convnext/convnext-tiny.py @@ -0,0 +1,23 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='tiny', + out_indices=(3, ), + drop_path_rate=0.1, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convnext/convnext-xlarge.py b/configs/_base_/models/convnext/convnext-xlarge.py new file mode 100644 index 0000000..0c75e32 --- /dev/null +++ b/configs/_base_/models/convnext/convnext-xlarge.py @@ -0,0 +1,23 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='xlarge', + out_indices=(3, ), + drop_path_rate=0.5, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/densenet/densenet121.py b/configs/_base_/models/densenet/densenet121.py new file mode 100644 index 0000000..0a14d30 --- /dev/null +++ b/configs/_base_/models/densenet/densenet121.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='DenseNet', arch='121'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/densenet/densenet161.py b/configs/_base_/models/densenet/densenet161.py new file mode 100644 index 0000000..61a0d83 --- /dev/null +++ b/configs/_base_/models/densenet/densenet161.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='DenseNet', arch='161'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2208, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/densenet/densenet169.py b/configs/_base_/models/densenet/densenet169.py new file mode 100644 index 0000000..779ea17 --- /dev/null +++ b/configs/_base_/models/densenet/densenet169.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='DenseNet', arch='169'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1664, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/densenet/densenet201.py b/configs/_base_/models/densenet/densenet201.py new file mode 100644 index 0000000..2909af0 --- /dev/null +++ b/configs/_base_/models/densenet/densenet201.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='DenseNet', arch='201'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1920, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/efficientnet_b0.py b/configs/_base_/models/efficientnet_b0.py new file mode 100644 index 0000000..d9ba685 --- /dev/null +++ b/configs/_base_/models/efficientnet_b0.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b0'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b1.py b/configs/_base_/models/efficientnet_b1.py new file mode 100644 index 0000000..63e15c8 --- /dev/null +++ b/configs/_base_/models/efficientnet_b1.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b1'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b2.py b/configs/_base_/models/efficientnet_b2.py new file mode 100644 index 0000000..5edcfa5 --- /dev/null +++ b/configs/_base_/models/efficientnet_b2.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b2'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1408, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b3.py b/configs/_base_/models/efficientnet_b3.py new file mode 100644 index 0000000..c7c6d6d --- /dev/null +++ b/configs/_base_/models/efficientnet_b3.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b3'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b4.py b/configs/_base_/models/efficientnet_b4.py new file mode 100644 index 0000000..06840ed --- /dev/null +++ b/configs/_base_/models/efficientnet_b4.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b4'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1792, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b5.py b/configs/_base_/models/efficientnet_b5.py new file mode 100644 index 0000000..a86eebd --- /dev/null +++ b/configs/_base_/models/efficientnet_b5.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b5'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b6.py b/configs/_base_/models/efficientnet_b6.py new file mode 100644 index 0000000..4eada1d --- /dev/null +++ b/configs/_base_/models/efficientnet_b6.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b6'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2304, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b7.py b/configs/_base_/models/efficientnet_b7.py new file mode 100644 index 0000000..1d84ba4 --- /dev/null +++ b/configs/_base_/models/efficientnet_b7.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b7'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2560, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b8.py b/configs/_base_/models/efficientnet_b8.py new file mode 100644 index 0000000..c950064 --- /dev/null +++ b/configs/_base_/models/efficientnet_b8.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b8'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2816, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_em.py b/configs/_base_/models/efficientnet_em.py new file mode 100644 index 0000000..abecdbe --- /dev/null +++ b/configs/_base_/models/efficientnet_em.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + # `em` means EfficientNet-EdgeTPU-M arch + backbone=dict(type='EfficientNet', arch='em', act_cfg=dict(type='ReLU')), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_es.py b/configs/_base_/models/efficientnet_es.py new file mode 100644 index 0000000..911ba4a --- /dev/null +++ b/configs/_base_/models/efficientnet_es.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + # `es` means EfficientNet-EdgeTPU-S arch + backbone=dict(type='EfficientNet', arch='es', act_cfg=dict(type='ReLU')), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hornet/hornet-base-gf.py b/configs/_base_/models/hornet/hornet-base-gf.py new file mode 100644 index 0000000..7544970 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-base-gf.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='base-gf', drop_path_rate=0.5), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/hornet/hornet-base.py b/configs/_base_/models/hornet/hornet-base.py new file mode 100644 index 0000000..8276414 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-base.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='base', drop_path_rate=0.5), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/hornet/hornet-large-gf.py b/configs/_base_/models/hornet/hornet-large-gf.py new file mode 100644 index 0000000..a5b5511 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-large-gf.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='large-gf', drop_path_rate=0.2), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/hornet/hornet-large-gf384.py b/configs/_base_/models/hornet/hornet-large-gf384.py new file mode 100644 index 0000000..fbb5478 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-large-gf384.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='large-gf384', drop_path_rate=0.4), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ]) diff --git a/configs/_base_/models/hornet/hornet-large.py b/configs/_base_/models/hornet/hornet-large.py new file mode 100644 index 0000000..26d99e1 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-large.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='large', drop_path_rate=0.2), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/hornet/hornet-small-gf.py b/configs/_base_/models/hornet/hornet-small-gf.py new file mode 100644 index 0000000..42d9d11 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-small-gf.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='small-gf', drop_path_rate=0.4), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/hornet/hornet-small.py b/configs/_base_/models/hornet/hornet-small.py new file mode 100644 index 0000000..e803976 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-small.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='small', drop_path_rate=0.4), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/hornet/hornet-tiny-gf.py b/configs/_base_/models/hornet/hornet-tiny-gf.py new file mode 100644 index 0000000..0e417d0 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-tiny-gf.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='tiny-gf', drop_path_rate=0.2), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/hornet/hornet-tiny.py b/configs/_base_/models/hornet/hornet-tiny.py new file mode 100644 index 0000000..068d7d6 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-tiny.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='tiny', drop_path_rate=0.2), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/hrnet/hrnet-w18.py b/configs/_base_/models/hrnet/hrnet-w18.py new file mode 100644 index 0000000..f7fbf29 --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w18.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w18'), + neck=[ + dict(type='HRFuseScales', in_channels=(18, 36, 72, 144)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w30.py b/configs/_base_/models/hrnet/hrnet-w30.py new file mode 100644 index 0000000..babcaca --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w30.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w30'), + neck=[ + dict(type='HRFuseScales', in_channels=(30, 60, 120, 240)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w32.py b/configs/_base_/models/hrnet/hrnet-w32.py new file mode 100644 index 0000000..2c1e980 --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w32.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w32'), + neck=[ + dict(type='HRFuseScales', in_channels=(32, 64, 128, 256)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w40.py b/configs/_base_/models/hrnet/hrnet-w40.py new file mode 100644 index 0000000..83f65d8 --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w40.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w40'), + neck=[ + dict(type='HRFuseScales', in_channels=(40, 80, 160, 320)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w44.py b/configs/_base_/models/hrnet/hrnet-w44.py new file mode 100644 index 0000000..e75dc0f --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w44.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w44'), + neck=[ + dict(type='HRFuseScales', in_channels=(44, 88, 176, 352)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w48.py b/configs/_base_/models/hrnet/hrnet-w48.py new file mode 100644 index 0000000..f060495 --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w48.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w48'), + neck=[ + dict(type='HRFuseScales', in_channels=(48, 96, 192, 384)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w64.py b/configs/_base_/models/hrnet/hrnet-w64.py new file mode 100644 index 0000000..844c3fe --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w64.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w64'), + neck=[ + dict(type='HRFuseScales', in_channels=(64, 128, 256, 512)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mlp_mixer_base_patch16.py b/configs/_base_/models/mlp_mixer_base_patch16.py new file mode 100644 index 0000000..5ebd17f --- /dev/null +++ b/configs/_base_/models/mlp_mixer_base_patch16.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='MlpMixer', + arch='b', + img_size=224, + patch_size=16, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=dict(type='GlobalAveragePooling', dim=1), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), +) diff --git a/configs/_base_/models/mlp_mixer_large_patch16.py b/configs/_base_/models/mlp_mixer_large_patch16.py new file mode 100644 index 0000000..ff10713 --- /dev/null +++ b/configs/_base_/models/mlp_mixer_large_patch16.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='MlpMixer', + arch='l', + img_size=224, + patch_size=16, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=dict(type='GlobalAveragePooling', dim=1), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), +) diff --git a/configs/_base_/models/mobilenet_v2_1x.py b/configs/_base_/models/mobilenet_v2_1x.py new file mode 100644 index 0000000..6ebff1e --- /dev/null +++ b/configs/_base_/models/mobilenet_v2_1x.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV2', widen_factor=1.0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mobilenet_v3_large_imagenet.py b/configs/_base_/models/mobilenet_v3_large_imagenet.py new file mode 100644 index 0000000..5318f50 --- /dev/null +++ b/configs/_base_/models/mobilenet_v3_large_imagenet.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV3', arch='large'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='StackedLinearClsHead', + num_classes=1000, + in_channels=960, + mid_channels=[1280], + dropout_rate=0.2, + act_cfg=dict(type='HSwish'), + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + init_cfg=dict( + type='Normal', layer='Linear', mean=0., std=0.01, bias=0.), + topk=(1, 5))) diff --git a/configs/_base_/models/mobilenet_v3_small_cifar.py b/configs/_base_/models/mobilenet_v3_small_cifar.py new file mode 100644 index 0000000..5dbe980 --- /dev/null +++ b/configs/_base_/models/mobilenet_v3_small_cifar.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV3', arch='small'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='StackedLinearClsHead', + num_classes=10, + in_channels=576, + mid_channels=[1280], + act_cfg=dict(type='HSwish'), + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/mobilenet_v3_small_imagenet.py b/configs/_base_/models/mobilenet_v3_small_imagenet.py new file mode 100644 index 0000000..af6cc1b --- /dev/null +++ b/configs/_base_/models/mobilenet_v3_small_imagenet.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV3', arch='small'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='StackedLinearClsHead', + num_classes=1000, + in_channels=576, + mid_channels=[1024], + dropout_rate=0.2, + act_cfg=dict(type='HSwish'), + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + init_cfg=dict( + type='Normal', layer='Linear', mean=0., std=0.01, bias=0.), + topk=(1, 5))) diff --git a/configs/_base_/models/mvit/mvitv2-base.py b/configs/_base_/models/mvit/mvitv2-base.py new file mode 100644 index 0000000..c75e78e --- /dev/null +++ b/configs/_base_/models/mvit/mvitv2-base.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict(type='MViT', arch='base', drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + in_channels=768, + num_classes=1000, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/mvit/mvitv2-large.py b/configs/_base_/models/mvit/mvitv2-large.py new file mode 100644 index 0000000..aa4a325 --- /dev/null +++ b/configs/_base_/models/mvit/mvitv2-large.py @@ -0,0 +1,23 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='MViT', + arch='large', + drop_path_rate=0.5, + dim_mul_in_attention=False), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + in_channels=1152, + num_classes=1000, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/mvit/mvitv2-small.py b/configs/_base_/models/mvit/mvitv2-small.py new file mode 100644 index 0000000..bb9329d --- /dev/null +++ b/configs/_base_/models/mvit/mvitv2-small.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict(type='MViT', arch='small', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + in_channels=768, + num_classes=1000, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/mvit/mvitv2-tiny.py b/configs/_base_/models/mvit/mvitv2-tiny.py new file mode 100644 index 0000000..7ca85dc --- /dev/null +++ b/configs/_base_/models/mvit/mvitv2-tiny.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict(type='MViT', arch='tiny', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + in_channels=768, + num_classes=1000, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/poolformer/poolformer_m36.py b/configs/_base_/models/poolformer/poolformer_m36.py new file mode 100644 index 0000000..276a721 --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_m36.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='m36', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/poolformer/poolformer_m48.py b/configs/_base_/models/poolformer/poolformer_m48.py new file mode 100644 index 0000000..8c006ac --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_m48.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='m48', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/poolformer/poolformer_s12.py b/configs/_base_/models/poolformer/poolformer_s12.py new file mode 100644 index 0000000..b7b3600 --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_s12.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='s12', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/poolformer/poolformer_s24.py b/configs/_base_/models/poolformer/poolformer_s24.py new file mode 100644 index 0000000..822ab5b --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_s24.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='s24', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/poolformer/poolformer_s36.py b/configs/_base_/models/poolformer/poolformer_s36.py new file mode 100644 index 0000000..489f222 --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_s36.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='s36', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/regnet/regnetx_1.6gf.py b/configs/_base_/models/regnet/regnetx_1.6gf.py new file mode 100644 index 0000000..b81f0ad --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_1.6gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_1.6gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=912, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_12gf.py b/configs/_base_/models/regnet/regnetx_12gf.py new file mode 100644 index 0000000..383d4f8 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_12gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_12gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2240, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_3.2gf.py b/configs/_base_/models/regnet/regnetx_3.2gf.py new file mode 100644 index 0000000..67d4541 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_3.2gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_3.2gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1008, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_4.0gf.py b/configs/_base_/models/regnet/regnetx_4.0gf.py new file mode 100644 index 0000000..01419c6 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_4.0gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_4.0gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1360, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_400mf.py b/configs/_base_/models/regnet/regnetx_400mf.py new file mode 100644 index 0000000..ef518b9 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_400mf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_400mf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=384, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_6.4gf.py b/configs/_base_/models/regnet/regnetx_6.4gf.py new file mode 100644 index 0000000..44e6222 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_6.4gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_6.4gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1624, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_8.0gf.py b/configs/_base_/models/regnet/regnetx_8.0gf.py new file mode 100644 index 0000000..2929826 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_8.0gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_8.0gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1920, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_800mf.py b/configs/_base_/models/regnet/regnetx_800mf.py new file mode 100644 index 0000000..210f760 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_800mf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_800mf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=672, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/repmlp-base_224.py b/configs/_base_/models/repmlp-base_224.py new file mode 100644 index 0000000..7db0077 --- /dev/null +++ b/configs/_base_/models/repmlp-base_224.py @@ -0,0 +1,18 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='RepMLPNet', + arch='B', + img_size=224, + out_indices=(3, ), + reparam_conv_kernels=(1, 3), + deploy=False), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/repvgg-A0_in1k.py b/configs/_base_/models/repvgg-A0_in1k.py new file mode 100644 index 0000000..093ffb7 --- /dev/null +++ b/configs/_base_/models/repvgg-A0_in1k.py @@ -0,0 +1,15 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='RepVGG', + arch='A0', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/repvgg-B3_lbs-mixup_in1k.py b/configs/_base_/models/repvgg-B3_lbs-mixup_in1k.py new file mode 100644 index 0000000..5bb07db --- /dev/null +++ b/configs/_base_/models/repvgg-B3_lbs-mixup_in1k.py @@ -0,0 +1,23 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='RepVGG', + arch='B3', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2560, + loss=dict( + type='LabelSmoothLoss', + loss_weight=1.0, + label_smooth_val=0.1, + mode='classy_vision', + num_classes=1000), + topk=(1, 5), + ), + train_cfg=dict( + augments=dict(type='BatchMixup', alpha=0.2, num_classes=1000, + prob=1.))) diff --git a/configs/_base_/models/res2net101-w26-s4.py b/configs/_base_/models/res2net101-w26-s4.py new file mode 100644 index 0000000..3bf64c5 --- /dev/null +++ b/configs/_base_/models/res2net101-w26-s4.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=101, + scales=4, + base_width=26, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w14-s8.py b/configs/_base_/models/res2net50-w14-s8.py new file mode 100644 index 0000000..5875142 --- /dev/null +++ b/configs/_base_/models/res2net50-w14-s8.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=8, + base_width=14, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w26-s4.py b/configs/_base_/models/res2net50-w26-s4.py new file mode 100644 index 0000000..be8fdb5 --- /dev/null +++ b/configs/_base_/models/res2net50-w26-s4.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=4, + base_width=26, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w26-s6.py b/configs/_base_/models/res2net50-w26-s6.py new file mode 100644 index 0000000..281b136 --- /dev/null +++ b/configs/_base_/models/res2net50-w26-s6.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=6, + base_width=26, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w26-s8.py b/configs/_base_/models/res2net50-w26-s8.py new file mode 100644 index 0000000..b4f62f3 --- /dev/null +++ b/configs/_base_/models/res2net50-w26-s8.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=8, + base_width=26, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w48-s2.py b/configs/_base_/models/res2net50-w48-s2.py new file mode 100644 index 0000000..8675c91 --- /dev/null +++ b/configs/_base_/models/res2net50-w48-s2.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=2, + base_width=48, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnest101.py b/configs/_base_/models/resnest101.py new file mode 100644 index 0000000..97f7749 --- /dev/null +++ b/configs/_base_/models/resnest101.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeSt', + depth=101, + num_stages=4, + stem_channels=128, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + num_classes=1000, + reduction='mean', + loss_weight=1.0), + topk=(1, 5), + cal_acc=False)) +train_cfg = dict(mixup=dict(alpha=0.2, num_classes=1000)) diff --git a/configs/_base_/models/resnest200.py b/configs/_base_/models/resnest200.py new file mode 100644 index 0000000..4610017 --- /dev/null +++ b/configs/_base_/models/resnest200.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeSt', + depth=200, + num_stages=4, + stem_channels=128, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + num_classes=1000, + reduction='mean', + loss_weight=1.0), + topk=(1, 5), + cal_acc=False)) +train_cfg = dict(mixup=dict(alpha=0.2, num_classes=1000)) diff --git a/configs/_base_/models/resnest269.py b/configs/_base_/models/resnest269.py new file mode 100644 index 0000000..ad365d0 --- /dev/null +++ b/configs/_base_/models/resnest269.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeSt', + depth=269, + num_stages=4, + stem_channels=128, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + num_classes=1000, + reduction='mean', + loss_weight=1.0), + topk=(1, 5), + cal_acc=False)) +train_cfg = dict(mixup=dict(alpha=0.2, num_classes=1000)) diff --git a/configs/_base_/models/resnest50.py b/configs/_base_/models/resnest50.py new file mode 100644 index 0000000..15269d4 --- /dev/null +++ b/configs/_base_/models/resnest50.py @@ -0,0 +1,23 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeSt', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + num_classes=1000, + reduction='mean', + loss_weight=1.0), + topk=(1, 5), + cal_acc=False)) +train_cfg = dict(mixup=dict(alpha=0.2, num_classes=1000)) diff --git a/configs/_base_/models/resnet101.py b/configs/_base_/models/resnet101.py new file mode 100644 index 0000000..1147cd4 --- /dev/null +++ b/configs/_base_/models/resnet101.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet101_cifar.py b/configs/_base_/models/resnet101_cifar.py new file mode 100644 index 0000000..a84d470 --- /dev/null +++ b/configs/_base_/models/resnet101_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=101, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet152.py b/configs/_base_/models/resnet152.py new file mode 100644 index 0000000..94a718c --- /dev/null +++ b/configs/_base_/models/resnet152.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=152, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet152_cifar.py b/configs/_base_/models/resnet152_cifar.py new file mode 100644 index 0000000..55c0cc6 --- /dev/null +++ b/configs/_base_/models/resnet152_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=152, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet18.py b/configs/_base_/models/resnet18.py new file mode 100644 index 0000000..7c66758 --- /dev/null +++ b/configs/_base_/models/resnet18.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=18, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet18_cifar.py b/configs/_base_/models/resnet18_cifar.py new file mode 100644 index 0000000..7b9cf1e --- /dev/null +++ b/configs/_base_/models/resnet18_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=18, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet34.py b/configs/_base_/models/resnet34.py new file mode 100644 index 0000000..100ee28 --- /dev/null +++ b/configs/_base_/models/resnet34.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=34, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet34_cifar.py b/configs/_base_/models/resnet34_cifar.py new file mode 100644 index 0000000..55d033b --- /dev/null +++ b/configs/_base_/models/resnet34_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=34, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet34_gem.py b/configs/_base_/models/resnet34_gem.py new file mode 100644 index 0000000..5c0e0d3 --- /dev/null +++ b/configs/_base_/models/resnet34_gem.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=34, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GeneralizedMeanPooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet50.py b/configs/_base_/models/resnet50.py new file mode 100644 index 0000000..129a2bb --- /dev/null +++ b/configs/_base_/models/resnet50.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet50_cifar.py b/configs/_base_/models/resnet50_cifar.py new file mode 100644 index 0000000..33b66d5 --- /dev/null +++ b/configs/_base_/models/resnet50_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet50_cifar_cutmix.py b/configs/_base_/models/resnet50_cifar_cutmix.py new file mode 100644 index 0000000..73c38be --- /dev/null +++ b/configs/_base_/models/resnet50_cifar_cutmix.py @@ -0,0 +1,18 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='MultiLabelLinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0, use_soft=True)), + train_cfg=dict( + augments=dict(type='BatchCutMix', alpha=1.0, num_classes=10, + prob=1.0))) diff --git a/configs/_base_/models/resnet50_cifar_mixup.py b/configs/_base_/models/resnet50_cifar_mixup.py new file mode 100644 index 0000000..3de14f3 --- /dev/null +++ b/configs/_base_/models/resnet50_cifar_mixup.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='MultiLabelLinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0, use_soft=True)), + train_cfg=dict( + augments=dict(type='BatchMixup', alpha=1., num_classes=10, prob=1.))) diff --git a/configs/_base_/models/resnet50_cutmix.py b/configs/_base_/models/resnet50_cutmix.py new file mode 100644 index 0000000..fb79088 --- /dev/null +++ b/configs/_base_/models/resnet50_cutmix.py @@ -0,0 +1,18 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='MultiLabelLinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0, use_soft=True)), + train_cfg=dict( + augments=dict( + type='BatchCutMix', alpha=1.0, num_classes=1000, prob=1.0))) diff --git a/configs/_base_/models/resnet50_label_smooth.py b/configs/_base_/models/resnet50_label_smooth.py new file mode 100644 index 0000000..b6f7937 --- /dev/null +++ b/configs/_base_/models/resnet50_label_smooth.py @@ -0,0 +1,18 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet50_mixup.py b/configs/_base_/models/resnet50_mixup.py new file mode 100644 index 0000000..8ff9522 --- /dev/null +++ b/configs/_base_/models/resnet50_mixup.py @@ -0,0 +1,18 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='MultiLabelLinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0, use_soft=True)), + train_cfg=dict( + augments=dict(type='BatchMixup', alpha=0.2, num_classes=1000, + prob=1.))) diff --git a/configs/_base_/models/resnetv1c50.py b/configs/_base_/models/resnetv1c50.py new file mode 100644 index 0000000..3b973e2 --- /dev/null +++ b/configs/_base_/models/resnetv1c50.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnetv1d101.py b/configs/_base_/models/resnetv1d101.py new file mode 100644 index 0000000..1e56223 --- /dev/null +++ b/configs/_base_/models/resnetv1d101.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNetV1d', + depth=101, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnetv1d152.py b/configs/_base_/models/resnetv1d152.py new file mode 100644 index 0000000..58cc73b --- /dev/null +++ b/configs/_base_/models/resnetv1d152.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNetV1d', + depth=152, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnetv1d50.py b/configs/_base_/models/resnetv1d50.py new file mode 100644 index 0000000..015aaa3 --- /dev/null +++ b/configs/_base_/models/resnetv1d50.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNetV1d', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnext101_32x4d.py b/configs/_base_/models/resnext101_32x4d.py new file mode 100644 index 0000000..1c89fb6 --- /dev/null +++ b/configs/_base_/models/resnext101_32x4d.py @@ -0,0 +1,19 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeXt', + depth=101, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnext101_32x8d.py b/configs/_base_/models/resnext101_32x8d.py new file mode 100644 index 0000000..2bb63f3 --- /dev/null +++ b/configs/_base_/models/resnext101_32x8d.py @@ -0,0 +1,19 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeXt', + depth=101, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=8, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnext152_32x4d.py b/configs/_base_/models/resnext152_32x4d.py new file mode 100644 index 0000000..d392eff --- /dev/null +++ b/configs/_base_/models/resnext152_32x4d.py @@ -0,0 +1,19 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeXt', + depth=152, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnext50_32x4d.py b/configs/_base_/models/resnext50_32x4d.py new file mode 100644 index 0000000..0604262 --- /dev/null +++ b/configs/_base_/models/resnext50_32x4d.py @@ -0,0 +1,19 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeXt', + depth=50, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/seresnet101.py b/configs/_base_/models/seresnet101.py new file mode 100644 index 0000000..137a6f9 --- /dev/null +++ b/configs/_base_/models/seresnet101.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SEResNet', + depth=101, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/seresnet50.py b/configs/_base_/models/seresnet50.py new file mode 100644 index 0000000..e5f6bfc --- /dev/null +++ b/configs/_base_/models/seresnet50.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SEResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/seresnext101_32x4d.py b/configs/_base_/models/seresnext101_32x4d.py new file mode 100644 index 0000000..cc8a62c --- /dev/null +++ b/configs/_base_/models/seresnext101_32x4d.py @@ -0,0 +1,20 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SEResNeXt', + depth=101, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + se_ratio=16, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/seresnext50_32x4d.py b/configs/_base_/models/seresnext50_32x4d.py new file mode 100644 index 0000000..0cdf7cb --- /dev/null +++ b/configs/_base_/models/seresnext50_32x4d.py @@ -0,0 +1,20 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SEResNeXt', + depth=50, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + se_ratio=16, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/shufflenet_v1_1x.py b/configs/_base_/models/shufflenet_v1_1x.py new file mode 100644 index 0000000..f0f9d1f --- /dev/null +++ b/configs/_base_/models/shufflenet_v1_1x.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ShuffleNetV1', groups=3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=960, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/shufflenet_v2_1x.py b/configs/_base_/models/shufflenet_v2_1x.py new file mode 100644 index 0000000..190800e --- /dev/null +++ b/configs/_base_/models/shufflenet_v2_1x.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ShuffleNetV2', widen_factor=1.0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/swin_transformer/base_224.py b/configs/_base_/models/swin_transformer/base_224.py new file mode 100644 index 0000000..e16b4e6 --- /dev/null +++ b/configs/_base_/models/swin_transformer/base_224.py @@ -0,0 +1,22 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', arch='base', img_size=224, drop_path_rate=0.5), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/swin_transformer/base_384.py b/configs/_base_/models/swin_transformer/base_384.py new file mode 100644 index 0000000..ce78981 --- /dev/null +++ b/configs/_base_/models/swin_transformer/base_384.py @@ -0,0 +1,16 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', + arch='base', + img_size=384, + stage_cfgs=dict(block_cfgs=dict(window_size=12))), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer/large_224.py b/configs/_base_/models/swin_transformer/large_224.py new file mode 100644 index 0000000..747d00e --- /dev/null +++ b/configs/_base_/models/swin_transformer/large_224.py @@ -0,0 +1,12 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict(type='SwinTransformer', arch='large', img_size=224), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer/large_384.py b/configs/_base_/models/swin_transformer/large_384.py new file mode 100644 index 0000000..7026f81 --- /dev/null +++ b/configs/_base_/models/swin_transformer/large_384.py @@ -0,0 +1,16 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', + arch='large', + img_size=384, + stage_cfgs=dict(block_cfgs=dict(window_size=12))), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer/small_224.py b/configs/_base_/models/swin_transformer/small_224.py new file mode 100644 index 0000000..7873986 --- /dev/null +++ b/configs/_base_/models/swin_transformer/small_224.py @@ -0,0 +1,23 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', arch='small', img_size=224, + drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/swin_transformer/tiny_224.py b/configs/_base_/models/swin_transformer/tiny_224.py new file mode 100644 index 0000000..2d68d66 --- /dev/null +++ b/configs/_base_/models/swin_transformer/tiny_224.py @@ -0,0 +1,22 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', arch='tiny', img_size=224, drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/swin_transformer_v2/base_256.py b/configs/_base_/models/swin_transformer_v2/base_256.py new file mode 100644 index 0000000..f711a9c --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/base_256.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='base', + img_size=256, + drop_path_rate=0.5), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/swin_transformer_v2/base_384.py b/configs/_base_/models/swin_transformer_v2/base_384.py new file mode 100644 index 0000000..5fb9aea --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/base_384.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='base', + img_size=384, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False)) diff --git a/configs/_base_/models/swin_transformer_v2/large_256.py b/configs/_base_/models/swin_transformer_v2/large_256.py new file mode 100644 index 0000000..fe557c3 --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/large_256.py @@ -0,0 +1,16 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='large', + img_size=256, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer_v2/large_384.py b/configs/_base_/models/swin_transformer_v2/large_384.py new file mode 100644 index 0000000..a626c40 --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/large_384.py @@ -0,0 +1,16 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='large', + img_size=384, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer_v2/small_256.py b/configs/_base_/models/swin_transformer_v2/small_256.py new file mode 100644 index 0000000..8808f09 --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/small_256.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='small', + img_size=256, + drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/swin_transformer_v2/tiny_256.py b/configs/_base_/models/swin_transformer_v2/tiny_256.py new file mode 100644 index 0000000..d40e394 --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/tiny_256.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='tiny', + img_size=256, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/t2t-vit-t-14.py b/configs/_base_/models/t2t-vit-t-14.py new file mode 100644 index 0000000..91dbb67 --- /dev/null +++ b/configs/_base_/models/t2t-vit-t-14.py @@ -0,0 +1,41 @@ +# model settings +embed_dims = 384 +num_classes = 1000 + +model = dict( + type='ImageClassifier', + backbone=dict( + type='T2T_ViT', + img_size=224, + in_channels=3, + embed_dims=embed_dims, + t2t_cfg=dict( + token_dims=64, + use_performer=False, + ), + num_layers=14, + layer_cfgs=dict( + num_heads=6, + feedforward_channels=3 * embed_dims, # mlp_ratio = 3 + ), + drop_path_rate=0.1, + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=num_classes, + in_channels=embed_dims, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + init_cfg=dict(type='TruncNormal', layer='Linear', std=.02)), + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, prob=0.5, num_classes=num_classes), + dict(type='BatchCutMix', alpha=1.0, prob=0.5, num_classes=num_classes), + ])) diff --git a/configs/_base_/models/t2t-vit-t-19.py b/configs/_base_/models/t2t-vit-t-19.py new file mode 100644 index 0000000..8ab139d --- /dev/null +++ b/configs/_base_/models/t2t-vit-t-19.py @@ -0,0 +1,41 @@ +# model settings +embed_dims = 448 +num_classes = 1000 + +model = dict( + type='ImageClassifier', + backbone=dict( + type='T2T_ViT', + img_size=224, + in_channels=3, + embed_dims=embed_dims, + t2t_cfg=dict( + token_dims=64, + use_performer=False, + ), + num_layers=19, + layer_cfgs=dict( + num_heads=7, + feedforward_channels=3 * embed_dims, # mlp_ratio = 3 + ), + drop_path_rate=0.1, + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=num_classes, + in_channels=embed_dims, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + init_cfg=dict(type='TruncNormal', layer='Linear', std=.02)), + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, prob=0.5, num_classes=num_classes), + dict(type='BatchCutMix', alpha=1.0, prob=0.5, num_classes=num_classes), + ])) diff --git a/configs/_base_/models/t2t-vit-t-24.py b/configs/_base_/models/t2t-vit-t-24.py new file mode 100644 index 0000000..5990960 --- /dev/null +++ b/configs/_base_/models/t2t-vit-t-24.py @@ -0,0 +1,41 @@ +# model settings +embed_dims = 512 +num_classes = 1000 + +model = dict( + type='ImageClassifier', + backbone=dict( + type='T2T_ViT', + img_size=224, + in_channels=3, + embed_dims=embed_dims, + t2t_cfg=dict( + token_dims=64, + use_performer=False, + ), + num_layers=24, + layer_cfgs=dict( + num_heads=8, + feedforward_channels=3 * embed_dims, # mlp_ratio = 3 + ), + drop_path_rate=0.1, + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=num_classes, + in_channels=embed_dims, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + init_cfg=dict(type='TruncNormal', layer='Linear', std=.02)), + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, prob=0.5, num_classes=num_classes), + dict(type='BatchCutMix', alpha=1.0, prob=0.5, num_classes=num_classes), + ])) diff --git a/configs/_base_/models/tnt_s_patch16_224.py b/configs/_base_/models/tnt_s_patch16_224.py new file mode 100644 index 0000000..5e13d07 --- /dev/null +++ b/configs/_base_/models/tnt_s_patch16_224.py @@ -0,0 +1,29 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='TNT', + arch='s', + img_size=224, + patch_size=16, + in_channels=3, + ffn_ratio=4, + qkv_bias=False, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.1, + first_stride=4, + num_fcs=2, + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ]), + neck=None, + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=384, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + topk=(1, 5), + init_cfg=dict(type='TruncNormal', layer='Linear', std=.02))) diff --git a/configs/_base_/models/twins_pcpvt_base.py b/configs/_base_/models/twins_pcpvt_base.py new file mode 100644 index 0000000..473d7ee --- /dev/null +++ b/configs/_base_/models/twins_pcpvt_base.py @@ -0,0 +1,30 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PCPVT', + arch='base', + in_channels=3, + out_indices=(3, ), + qkv_bias=True, + norm_cfg=dict(type='LN', eps=1e-06), + norm_after_stage=[False, False, False, True], + drop_rate=0.0, + attn_drop_rate=0., + drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/twins_svt_base.py b/configs/_base_/models/twins_svt_base.py new file mode 100644 index 0000000..cabd373 --- /dev/null +++ b/configs/_base_/models/twins_svt_base.py @@ -0,0 +1,30 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SVT', + arch='base', + in_channels=3, + out_indices=(3, ), + qkv_bias=True, + norm_cfg=dict(type='LN'), + norm_after_stage=[False, False, False, True], + drop_rate=0.0, + attn_drop_rate=0., + drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/van/van_b0.py b/configs/_base_/models/van/van_b0.py new file mode 100644 index 0000000..5fa977e --- /dev/null +++ b/configs/_base_/models/van/van_b0.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='b0', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=256, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/van/van_b1.py b/configs/_base_/models/van/van_b1.py new file mode 100644 index 0000000..a27a50b --- /dev/null +++ b/configs/_base_/models/van/van_b1.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='b1', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) diff --git a/configs/_base_/models/van/van_b2.py b/configs/_base_/models/van/van_b2.py new file mode 100644 index 0000000..41b0484 --- /dev/null +++ b/configs/_base_/models/van/van_b2.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='b2', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False)) diff --git a/configs/_base_/models/van/van_b3.py b/configs/_base_/models/van/van_b3.py new file mode 100644 index 0000000..d32b12c --- /dev/null +++ b/configs/_base_/models/van/van_b3.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='b3', drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False)) diff --git a/configs/_base_/models/van/van_b4.py b/configs/_base_/models/van/van_b4.py new file mode 100644 index 0000000..417835c --- /dev/null +++ b/configs/_base_/models/van/van_b4.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='b4', drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False)) diff --git a/configs/_base_/models/van/van_b5.py b/configs/_base_/models/van/van_b5.py new file mode 100644 index 0000000..fe8b923 --- /dev/null +++ b/configs/_base_/models/van/van_b5.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='b5', drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False)) diff --git a/configs/_base_/models/van/van_b6.py b/configs/_base_/models/van/van_b6.py new file mode 100644 index 0000000..a0dfb3c --- /dev/null +++ b/configs/_base_/models/van/van_b6.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='b6', drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False)) diff --git a/configs/_base_/models/van/van_base.py b/configs/_base_/models/van/van_base.py new file mode 100644 index 0000000..5c2bcf0 --- /dev/null +++ b/configs/_base_/models/van/van_base.py @@ -0,0 +1 @@ +_base_ = ['./van-b2.py'] diff --git a/configs/_base_/models/van/van_large.py b/configs/_base_/models/van/van_large.py new file mode 100644 index 0000000..bc9536c --- /dev/null +++ b/configs/_base_/models/van/van_large.py @@ -0,0 +1 @@ +_base_ = ['./van-b3.py'] diff --git a/configs/_base_/models/van/van_small.py b/configs/_base_/models/van/van_small.py new file mode 100644 index 0000000..3973c22 --- /dev/null +++ b/configs/_base_/models/van/van_small.py @@ -0,0 +1 @@ +_base_ = ['./van-b1.py'] diff --git a/configs/_base_/models/van/van_tiny.py b/configs/_base_/models/van/van_tiny.py new file mode 100644 index 0000000..ace9ebb --- /dev/null +++ b/configs/_base_/models/van/van_tiny.py @@ -0,0 +1 @@ +_base_ = ['./van-b0.py'] diff --git a/configs/_base_/models/vgg11.py b/configs/_base_/models/vgg11.py new file mode 100644 index 0000000..2b6ee14 --- /dev/null +++ b/configs/_base_/models/vgg11.py @@ -0,0 +1,10 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VGG', depth=11, num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg11bn.py b/configs/_base_/models/vgg11bn.py new file mode 100644 index 0000000..cb4c64e --- /dev/null +++ b/configs/_base_/models/vgg11bn.py @@ -0,0 +1,11 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VGG', depth=11, norm_cfg=dict(type='BN'), num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg13.py b/configs/_base_/models/vgg13.py new file mode 100644 index 0000000..a938910 --- /dev/null +++ b/configs/_base_/models/vgg13.py @@ -0,0 +1,10 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VGG', depth=13, num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg13bn.py b/configs/_base_/models/vgg13bn.py new file mode 100644 index 0000000..b12173b --- /dev/null +++ b/configs/_base_/models/vgg13bn.py @@ -0,0 +1,11 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VGG', depth=13, norm_cfg=dict(type='BN'), num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg16.py b/configs/_base_/models/vgg16.py new file mode 100644 index 0000000..93ce864 --- /dev/null +++ b/configs/_base_/models/vgg16.py @@ -0,0 +1,10 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VGG', depth=16, num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg16bn.py b/configs/_base_/models/vgg16bn.py new file mode 100644 index 0000000..765e34f --- /dev/null +++ b/configs/_base_/models/vgg16bn.py @@ -0,0 +1,11 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VGG', depth=16, norm_cfg=dict(type='BN'), num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg19.py b/configs/_base_/models/vgg19.py new file mode 100644 index 0000000..6f4ab06 --- /dev/null +++ b/configs/_base_/models/vgg19.py @@ -0,0 +1,10 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VGG', depth=19, num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg19bn.py b/configs/_base_/models/vgg19bn.py new file mode 100644 index 0000000..c468b5d --- /dev/null +++ b/configs/_base_/models/vgg19bn.py @@ -0,0 +1,11 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VGG', depth=19, norm_cfg=dict(type='BN'), num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vit-base-p16.py b/configs/_base_/models/vit-base-p16.py new file mode 100644 index 0000000..bb42bed --- /dev/null +++ b/configs/_base_/models/vit-base-p16.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='b', + img_size=224, + patch_size=16, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, + mode='classy_vision'), + )) diff --git a/configs/_base_/models/vit-base-p32.py b/configs/_base_/models/vit-base-p32.py new file mode 100644 index 0000000..ad550ef --- /dev/null +++ b/configs/_base_/models/vit-base-p32.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='b', + img_size=224, + patch_size=32, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vit-large-p16.py b/configs/_base_/models/vit-large-p16.py new file mode 100644 index 0000000..9716230 --- /dev/null +++ b/configs/_base_/models/vit-large-p16.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='l', + img_size=224, + patch_size=16, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vit-large-p32.py b/configs/_base_/models/vit-large-p32.py new file mode 100644 index 0000000..f9491bb --- /dev/null +++ b/configs/_base_/models/vit-large-p32.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='l', + img_size=224, + patch_size=32, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/wide-resnet50.py b/configs/_base_/models/wide-resnet50.py new file mode 100644 index 0000000..a2913b9 --- /dev/null +++ b/configs/_base_/models/wide-resnet50.py @@ -0,0 +1,20 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + stem_channels=64, + base_channels=128, + expansion=2, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/schedules/cifar10_bs128.py b/configs/_base_/schedules/cifar10_bs128.py new file mode 100644 index 0000000..f134dbc --- /dev/null +++ b/configs/_base_/schedules/cifar10_bs128.py @@ -0,0 +1,6 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=[100, 150]) +runner = dict(type='EpochBasedRunner', max_epochs=200) diff --git a/configs/_base_/schedules/cub_bs64.py b/configs/_base_/schedules/cub_bs64.py new file mode 100644 index 0000000..93cce6a --- /dev/null +++ b/configs/_base_/schedules/cub_bs64.py @@ -0,0 +1,13 @@ +# optimizer +optimizer = dict( + type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005, nesterov=True) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=5, + warmup_ratio=0.01, + warmup_by_epoch=True) +runner = dict(type='EpochBasedRunner', max_epochs=100) diff --git a/configs/_base_/schedules/imagenet_bs1024_adamw_conformer.py b/configs/_base_/schedules/imagenet_bs1024_adamw_conformer.py new file mode 100644 index 0000000..92f1801 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs1024_adamw_conformer.py @@ -0,0 +1,29 @@ +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.cls_token': dict(decay_mult=0.0), + }) + +# for batch in each gpu is 128, 8 gpu +# lr = 5e-4 * 128 * 8 / 512 = 0.001 +optimizer = dict( + type='AdamW', + lr=5e-4 * 128 * 8 / 512, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=paramwise_cfg) +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + by_epoch=False, + min_lr_ratio=1e-2, + warmup='linear', + warmup_ratio=1e-3, + warmup_iters=5 * 1252, + warmup_by_epoch=False) + +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/configs/_base_/schedules/imagenet_bs1024_adamw_swin.py b/configs/_base_/schedules/imagenet_bs1024_adamw_swin.py new file mode 100644 index 0000000..2ad035c --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs1024_adamw_swin.py @@ -0,0 +1,30 @@ +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0) + }) + +# for batch in each gpu is 128, 8 gpu +# lr = 5e-4 * 128 * 8 / 512 = 0.001 +optimizer = dict( + type='AdamW', + lr=5e-4 * 1024 / 512, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=paramwise_cfg) +optimizer_config = dict(grad_clip=dict(max_norm=5.0)) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + by_epoch=False, + min_lr_ratio=1e-2, + warmup='linear', + warmup_ratio=1e-3, + warmup_iters=20, + warmup_by_epoch=True) + +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/configs/_base_/schedules/imagenet_bs1024_coslr.py b/configs/_base_/schedules/imagenet_bs1024_coslr.py new file mode 100644 index 0000000..ee84e7a --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs1024_coslr.py @@ -0,0 +1,12 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.8, momentum=0.9, weight_decay=5e-5) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=5, + warmup_ratio=0.1, + warmup_by_epoch=True) +runner = dict(type='EpochBasedRunner', max_epochs=100) diff --git a/configs/_base_/schedules/imagenet_bs1024_linearlr_bn_nowd.py b/configs/_base_/schedules/imagenet_bs1024_linearlr_bn_nowd.py new file mode 100644 index 0000000..99fbdda --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs1024_linearlr_bn_nowd.py @@ -0,0 +1,17 @@ +# optimizer +optimizer = dict( + type='SGD', + lr=0.5, + momentum=0.9, + weight_decay=0.00004, + paramwise_cfg=dict(norm_decay_mult=0)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='poly', + min_lr=0, + by_epoch=False, + warmup='constant', + warmup_iters=5000, +) +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/configs/_base_/schedules/imagenet_bs2048.py b/configs/_base_/schedules/imagenet_bs2048.py new file mode 100644 index 0000000..93fdebf --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs2048.py @@ -0,0 +1,12 @@ +# optimizer +optimizer = dict( + type='SGD', lr=0.8, momentum=0.9, weight_decay=0.0001, nesterov=True) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=2500, + warmup_ratio=0.25, + step=[30, 60, 90]) +runner = dict(type='EpochBasedRunner', max_epochs=100) diff --git a/configs/_base_/schedules/imagenet_bs2048_AdamW.py b/configs/_base_/schedules/imagenet_bs2048_AdamW.py new file mode 100644 index 0000000..6d4f208 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs2048_AdamW.py @@ -0,0 +1,20 @@ +# optimizer +# In ClassyVision, the lr is set to 0.003 for bs4096. +# In this implementation(bs2048), lr = 0.003 / 4096 * (32bs * 64gpus) = 0.0015 +optimizer = dict(type='AdamW', lr=0.0015, weight_decay=0.3) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# specific to vit pretrain +paramwise_cfg = dict( + custom_keys={ + '.backbone.cls_token': dict(decay_mult=0.0), + '.backbone.pos_embed': dict(decay_mult=0.0) + }) +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=10000, + warmup_ratio=1e-4) +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/configs/_base_/schedules/imagenet_bs2048_coslr.py b/configs/_base_/schedules/imagenet_bs2048_coslr.py new file mode 100644 index 0000000..b9e77f2 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs2048_coslr.py @@ -0,0 +1,12 @@ +# optimizer +optimizer = dict( + type='SGD', lr=0.8, momentum=0.9, weight_decay=0.0001, nesterov=True) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=2500, + warmup_ratio=0.25) +runner = dict(type='EpochBasedRunner', max_epochs=100) diff --git a/configs/_base_/schedules/imagenet_bs2048_rsb.py b/configs/_base_/schedules/imagenet_bs2048_rsb.py new file mode 100644 index 0000000..e021cb0 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs2048_rsb.py @@ -0,0 +1,12 @@ +# optimizer +optimizer = dict(type='Lamb', lr=0.005, weight_decay=0.02) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=1.0e-6, + warmup='linear', + # For ImageNet-1k, 626 iters per epoch, warmup 5 epochs. + warmup_iters=5 * 626, + warmup_ratio=0.0001) +runner = dict(type='EpochBasedRunner', max_epochs=100) diff --git a/configs/_base_/schedules/imagenet_bs256.py b/configs/_base_/schedules/imagenet_bs256.py new file mode 100644 index 0000000..3b5d198 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256.py @@ -0,0 +1,6 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=[30, 60, 90]) +runner = dict(type='EpochBasedRunner', max_epochs=100) diff --git a/configs/_base_/schedules/imagenet_bs256_140e.py b/configs/_base_/schedules/imagenet_bs256_140e.py new file mode 100644 index 0000000..caba157 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256_140e.py @@ -0,0 +1,6 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=[40, 80, 120]) +runner = dict(type='EpochBasedRunner', max_epochs=140) diff --git a/configs/_base_/schedules/imagenet_bs256_200e_coslr_warmup.py b/configs/_base_/schedules/imagenet_bs256_200e_coslr_warmup.py new file mode 100644 index 0000000..49456b2 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256_200e_coslr_warmup.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=25025, + warmup_ratio=0.25) +runner = dict(type='EpochBasedRunner', max_epochs=200) diff --git a/configs/_base_/schedules/imagenet_bs256_coslr.py b/configs/_base_/schedules/imagenet_bs256_coslr.py new file mode 100644 index 0000000..779b479 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256_coslr.py @@ -0,0 +1,6 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='CosineAnnealing', min_lr=0) +runner = dict(type='EpochBasedRunner', max_epochs=100) diff --git a/configs/_base_/schedules/imagenet_bs256_epochstep.py b/configs/_base_/schedules/imagenet_bs256_epochstep.py new file mode 100644 index 0000000..2347a04 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256_epochstep.py @@ -0,0 +1,6 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.045, momentum=0.9, weight_decay=0.00004) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', gamma=0.98, step=1) +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/configs/_base_/schedules/imagenet_bs4096_AdamW.py b/configs/_base_/schedules/imagenet_bs4096_AdamW.py new file mode 100644 index 0000000..75b00d8 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs4096_AdamW.py @@ -0,0 +1,24 @@ +# specific to vit pretrain +paramwise_cfg = dict(custom_keys={ + '.cls_token': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0) +}) + +# optimizer +optimizer = dict( + type='AdamW', + lr=0.003, + weight_decay=0.3, + paramwise_cfg=paramwise_cfg, +) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=10000, + warmup_ratio=1e-4, +) +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/configs/_base_/schedules/stanford_cars_bs8.py b/configs/_base_/schedules/stanford_cars_bs8.py new file mode 100644 index 0000000..dee252e --- /dev/null +++ b/configs/_base_/schedules/stanford_cars_bs8.py @@ -0,0 +1,7 @@ +# optimizer +optimizer = dict( + type='SGD', lr=0.003, momentum=0.9, weight_decay=0.0005, nesterov=True) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=[40, 70, 90]) +runner = dict(type='EpochBasedRunner', max_epochs=100) diff --git a/configs/conformer/README.md b/configs/conformer/README.md new file mode 100644 index 0000000..5b7d96b --- /dev/null +++ b/configs/conformer/README.md @@ -0,0 +1,37 @@ +# Conformer + +> [Conformer: Local Features Coupling Global Representations for Visual Recognition](https://arxiv.org/abs/2105.03889) + + + +## Abstract + +Within Convolutional Neural Network (CNN), the convolution operations are good at extracting local features but experience difficulty to capture global representations. Within visual transformer, the cascaded self-attention modules can capture long-distance feature dependencies but unfortunately deteriorate local feature details. In this paper, we propose a hybrid network structure, termed Conformer, to take advantage of convolutional operations and self-attention mechanisms for enhanced representation learning. Conformer roots in the Feature Coupling Unit (FCU), which fuses local features and global representations under different resolutions in an interactive fashion. Conformer adopts a concurrent structure so that local features and global representations are retained to the maximum extent. Experiments show that Conformer, under the comparable parameter complexity, outperforms the visual transformer (DeiT-B) by 2.3% on ImageNet. On MSCOCO, it outperforms ResNet-101 by 3.7% and 3.6% mAPs for object detection and instance segmentation, respectively, demonstrating the great potential to be a general backbone network. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-------------------: | :-------: | :------: | :-------: | :-------: | :---------------------------------------------------------------------: | :-----------------------------------------------------------------------: | +| Conformer-tiny-p16\* | 23.52 | 4.90 | 81.31 | 95.60 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/conformer/conformer-tiny-p16_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/conformer/conformer-tiny-p16_3rdparty_8xb128_in1k_20211206-f6860372.pth) | +| Conformer-small-p32\* | 38.85 | 7.09 | 81.96 | 96.02 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/conformer/conformer-small-p32_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/conformer/conformer-small-p32_8xb128_in1k_20211206-947a0816.pth) | +| Conformer-small-p16\* | 37.67 | 10.31 | 83.32 | 96.46 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/conformer/conformer-small-p16_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/conformer/conformer-small-p16_3rdparty_8xb128_in1k_20211206-3065dcf5.pth) | +| Conformer-base-p16\* | 83.29 | 22.89 | 83.82 | 96.59 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/conformer/conformer-base-p16_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/conformer/conformer-base-p16_3rdparty_8xb128_in1k_20211206-bfdf8637.pth) | + +*Models with * are converted from the [official repo](https://github.com/pengzhiliang/Conformer). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +``` +@article{peng2021conformer, + title={Conformer: Local Features Coupling Global Representations for Visual Recognition}, + author={Zhiliang Peng and Wei Huang and Shanzhi Gu and Lingxi Xie and Yaowei Wang and Jianbin Jiao and Qixiang Ye}, + journal={arXiv preprint arXiv:2105.03889}, + year={2021}, +} +``` diff --git a/configs/conformer/conformer-base-p16_8xb128_in1k.py b/configs/conformer/conformer-base-p16_8xb128_in1k.py new file mode 100644 index 0000000..29ed58b --- /dev/null +++ b/configs/conformer/conformer-base-p16_8xb128_in1k.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/conformer/base-p16.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_conformer.py', + '../_base_/default_runtime.py' +] + +data = dict(samples_per_gpu=128) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/conformer/conformer-small-p16_8xb128_in1k.py b/configs/conformer/conformer-small-p16_8xb128_in1k.py new file mode 100644 index 0000000..c40ed04 --- /dev/null +++ b/configs/conformer/conformer-small-p16_8xb128_in1k.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/conformer/small-p16.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_conformer.py', + '../_base_/default_runtime.py' +] + +data = dict(samples_per_gpu=128) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/conformer/conformer-small-p32_8xb128_in1k.py b/configs/conformer/conformer-small-p32_8xb128_in1k.py new file mode 100644 index 0000000..aaa1189 --- /dev/null +++ b/configs/conformer/conformer-small-p32_8xb128_in1k.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/conformer/small-p32.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_conformer.py', + '../_base_/default_runtime.py' +] + +data = dict(samples_per_gpu=128) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/conformer/conformer-tiny-p16_8xb128_in1k.py b/configs/conformer/conformer-tiny-p16_8xb128_in1k.py new file mode 100644 index 0000000..76a264c --- /dev/null +++ b/configs/conformer/conformer-tiny-p16_8xb128_in1k.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/conformer/tiny-p16.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_conformer.py', + '../_base_/default_runtime.py' +] + +data = dict(samples_per_gpu=128) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/conformer/metafile.yml b/configs/conformer/metafile.yml new file mode 100644 index 0000000..4efe05f --- /dev/null +++ b/configs/conformer/metafile.yml @@ -0,0 +1,78 @@ +Collections: + - Name: Conformer + Metadata: + Training Data: ImageNet-1k + Architecture: + - Layer Normalization + - Scaled Dot-Product Attention + - Dropout + Paper: + URL: https://arxiv.org/abs/2105.03889 + Title: "Conformer: Local Features Coupling Global Representations for Visual Recognition" + README: configs/conformer/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.19.0/mmcls/models/backbones/conformer.py + Version: v0.19.0 + +Models: + - Name: conformer-tiny-p16_3rdparty_8xb128_in1k + In Collection: Conformer + Config: configs/conformer/conformer-tiny-p16_8xb128_in1k.py + Metadata: + FLOPs: 4899611328 + Parameters: 23524704 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.31 + Top 5 Accuracy: 95.60 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/conformer/conformer-tiny-p16_3rdparty_8xb128_in1k_20211206-f6860372.pth + Converted From: + Weights: https://drive.google.com/file/d/19SxGhKcWOR5oQSxNUWUM2MGYiaWMrF1z/view?usp=sharing + Code: https://github.com/pengzhiliang/Conformer/blob/main/models.py#L65 + - Name: conformer-small-p16_3rdparty_8xb128_in1k + In Collection: Conformer + Config: configs/conformer/conformer-small-p16_8xb128_in1k.py + Metadata: + FLOPs: 10311309312 + Parameters: 37673424 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.32 + Top 5 Accuracy: 96.46 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/conformer/conformer-small-p16_3rdparty_8xb128_in1k_20211206-3065dcf5.pth + Converted From: + Weights: https://drive.google.com/file/d/1mpOlbLaVxOfEwV4-ha78j_1Ebqzj2B83/view?usp=sharing + Code: https://github.com/pengzhiliang/Conformer/blob/main/models.py#L73 + - Name: conformer-small-p32_8xb128_in1k + In Collection: Conformer + Config: configs/conformer/conformer-small-p32_8xb128_in1k.py + Metadata: + FLOPs: 7087281792 + Parameters: 38853072 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.96 + Top 5 Accuracy: 96.02 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/conformer/conformer-small-p32_8xb128_in1k_20211206-947a0816.pth + - Name: conformer-base-p16_3rdparty_8xb128_in1k + In Collection: Conformer + Config: configs/conformer/conformer-base-p16_8xb128_in1k.py + Metadata: + FLOPs: 22892078080 + Parameters: 83289136 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.82 + Top 5 Accuracy: 96.59 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/conformer/conformer-base-p16_3rdparty_8xb128_in1k_20211206-bfdf8637.pth + Converted From: + Weights: https://drive.google.com/file/d/1oeQ9LSOGKEUaYGu7WTlUGl3KDsQIi0MA/view?usp=sharing + Code: https://github.com/pengzhiliang/Conformer/blob/main/models.py#L89 diff --git a/configs/convmixer/README.md b/configs/convmixer/README.md new file mode 100644 index 0000000..763bad3 --- /dev/null +++ b/configs/convmixer/README.md @@ -0,0 +1,42 @@ +# ConvMixer + +> [Patches Are All You Need?](https://arxiv.org/abs/2201.09792) + + + +## Abstract + + + +Although convolutional networks have been the dominant architecture for vision tasks for many years, recent experiments have shown that Transformer-based models, most notably the Vision Transformer (ViT), may exceed their performance in some settings. However, due to the quadratic runtime of the self-attention layers in Transformers, ViTs require the use of patch embeddings, which group together small regions of the image into single input features, in order to be applied to larger image sizes. This raises a question: Is the performance of ViTs due to the inherently-more-powerful Transformer architecture, or is it at least partly due to using patches as the input representation? In this paper, we present some evidence for the latter: specifically, we propose the ConvMixer, an extremely simple model that is similar in spirit to the ViT and the even-more-basic MLP-Mixer in that it operates directly on patches as input, separates the mixing of spatial and channel dimensions, and maintains equal size and resolution throughout the network. In contrast, however, the ConvMixer uses only standard convolutions to achieve the mixing steps. Despite its simplicity, we show that the ConvMixer outperforms the ViT, MLP-Mixer, and some of their variants for similar parameter counts and data set sizes, in addition to outperforming classical vision models such as the ResNet. + + + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------------: | :-------: | :------: | :-------: | :-------: | :----------------------------------------------------------------------: | :------------------------------------------------------------------------: | +| ConvMixer-768/32\* | 21.11 | 19.62 | 80.16 | 95.08 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convmixer/convmixer-768-32_10xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convmixer/convmixer-768-32_3rdparty_10xb64_in1k_20220323-bca1f7b8.pth) | +| ConvMixer-1024/20\* | 24.38 | 5.55 | 76.94 | 93.36 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convmixer/convmixer-1024-20_10xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convmixer/convmixer-1024-20_3rdparty_10xb64_in1k_20220323-48f8aeba.pth) | +| ConvMixer-1536/20\* | 51.63 | 48.71 | 81.37 | 95.61 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convmixer/convmixer-1536-20_10xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convmixer/convmixer-1536_20_3rdparty_10xb64_in1k_20220323-ea5786f3.pth) | + +*Models with * are converted from the [official repo](https://github.com/locuslab/convmixer). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +```bibtex +@misc{trockman2022patches, + title={Patches Are All You Need?}, + author={Asher Trockman and J. Zico Kolter}, + year={2022}, + eprint={2201.09792}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/convmixer/convmixer-1024-20_10xb64_in1k.py b/configs/convmixer/convmixer-1024-20_10xb64_in1k.py new file mode 100644 index 0000000..58694d6 --- /dev/null +++ b/configs/convmixer/convmixer-1024-20_10xb64_in1k.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/convmixer/convmixer-1024-20.py', + '../_base_/datasets/imagenet_bs64_convmixer_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +optimizer = dict(lr=0.01) + +runner = dict(type='EpochBasedRunner', max_epochs=150) diff --git a/configs/convmixer/convmixer-1536-20_10xb64_in1k.py b/configs/convmixer/convmixer-1536-20_10xb64_in1k.py new file mode 100644 index 0000000..17a7559 --- /dev/null +++ b/configs/convmixer/convmixer-1536-20_10xb64_in1k.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/convmixer/convmixer-1536-20.py', + '../_base_/datasets/imagenet_bs64_convmixer_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +optimizer = dict(lr=0.01) + +runner = dict(type='EpochBasedRunner', max_epochs=150) diff --git a/configs/convmixer/convmixer-768-32_10xb64_in1k.py b/configs/convmixer/convmixer-768-32_10xb64_in1k.py new file mode 100644 index 0000000..fa4c060 --- /dev/null +++ b/configs/convmixer/convmixer-768-32_10xb64_in1k.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/convmixer/convmixer-768-32.py', + '../_base_/datasets/imagenet_bs64_convmixer_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +optimizer = dict(lr=0.01) + +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/configs/convmixer/metafile.yml b/configs/convmixer/metafile.yml new file mode 100644 index 0000000..7831d74 --- /dev/null +++ b/configs/convmixer/metafile.yml @@ -0,0 +1,61 @@ +Collections: + - Name: ConvMixer + Metadata: + Training Data: ImageNet-1k + Architecture: + - 1x1 Convolution + - LayerScale + Paper: + URL: https://arxiv.org/abs/2201.09792 + Title: Patches Are All You Need? + README: configs/convmixer/README.md + +Models: + - Name: convmixer-768-32_10xb64_in1k + Metadata: + FLOPs: 19623051264 + Parameters: 21110248 + In Collections: ConvMixer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 80.16 + Top 5 Accuracy: 95.08 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convmixer/convmixer-768-32_3rdparty_10xb64_in1k_20220323-bca1f7b8.pth + Config: configs/convmixer/convmixer-768-32_10xb64_in1k.py + Converted From: + Weights: https://github.com/tmp-iclr/convmixer/releases/download/v1.0/convmixer_768_32_ks7_p7_relu.pth.tar + Code: https://github.com/locuslab/convmixer + - Name: convmixer-1024-20_10xb64_in1k + Metadata: + FLOPs: 5550112768 + Parameters: 24383464 + In Collections: ConvMixer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 76.94 + Top 5 Accuracy: 93.36 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convmixer/convmixer-1024-20_3rdparty_10xb64_in1k_20220323-48f8aeba.pth + Config: configs/convmixer/convmixer-1024-20_10xb64_in1k.py + Converted From: + Weights: https://github.com/tmp-iclr/convmixer/releases/download/v1.0/convmixer_1024_20_ks9_p14.pth.tar + Code: https://github.com/locuslab/convmixer + - Name: convmixer-1536-20_10xb64_in1k + Metadata: + FLOPs: 48713170944 + Parameters: 51625960 + In Collections: ConvMixer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.37 + Top 5 Accuracy: 95.61 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convmixer/convmixer-1536_20_3rdparty_10xb64_in1k_20220323-ea5786f3.pth + Config: configs/convmixer/convmixer-1536-20_10xb64_in1k.py + Converted From: + Weights: https://github.com/tmp-iclr/convmixer/releases/download/v1.0/convmixer_1536_20_ks9_p7.pth.tar + Code: https://github.com/locuslab/convmixer diff --git a/configs/convnext/README.md b/configs/convnext/README.md new file mode 100644 index 0000000..7db8136 --- /dev/null +++ b/configs/convnext/README.md @@ -0,0 +1,59 @@ +# ConvNeXt + +> [A ConvNet for the 2020s](https://arxiv.org/abs/2201.03545v1) + + + +## Abstract + + + +The "Roaring 20s" of visual recognition began with the introduction of Vision Transformers (ViTs), which quickly superseded ConvNets as the state-of-the-art image classification model. A vanilla ViT, on the other hand, faces difficulties when applied to general computer vision tasks such as object detection and semantic segmentation. It is the hierarchical Transformers (e.g., Swin Transformers) that reintroduced several ConvNet priors, making Transformers practically viable as a generic vision backbone and demonstrating remarkable performance on a wide variety of vision tasks. However, the effectiveness of such hybrid approaches is still largely credited to the intrinsic superiority of Transformers, rather than the inherent inductive biases of convolutions. In this work, we reexamine the design spaces and test the limits of what a pure ConvNet can achieve. We gradually "modernize" a standard ResNet toward the design of a vision Transformer, and discover several key components that contribute to the performance difference along the way. The outcome of this exploration is a family of pure ConvNet models dubbed ConvNeXt. Constructed entirely from standard ConvNet modules, ConvNeXts compete favorably with Transformers in terms of accuracy and scalability, achieving 87.8% ImageNet top-1 accuracy and outperforming Swin Transformers on COCO detection and ADE20K segmentation, while maintaining the simplicity and efficiency of standard ConvNets. + + + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Pretrain | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------: | :----------: | :-------: | :------: | :-------: | :-------: | :-------------------------------------------------------------------: | :---------------------------------------------------------------------: | +| ConvNeXt-T\* | From scratch | 28.59 | 4.46 | 82.05 | 95.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-tiny_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-tiny_3rdparty_32xb128_in1k_20220124-18abde00.pth) | +| ConvNeXt-S\* | From scratch | 50.22 | 8.69 | 83.13 | 96.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-small_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-small_3rdparty_32xb128_in1k_20220124-d39b5192.pth) | +| ConvNeXt-B\* | From scratch | 88.59 | 15.36 | 83.85 | 96.74 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-base_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_3rdparty_32xb128_in1k_20220124-d0915162.pth) | +| ConvNeXt-B\* | ImageNet-21k | 88.59 | 15.36 | 85.81 | 97.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-base_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_in21k-pre-3rdparty_32xb128_in1k_20220124-eb2d6ada.pth) | +| ConvNeXt-L\* | From scratch | 197.77 | 34.37 | 84.30 | 96.89 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-large_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-large_3rdparty_64xb64_in1k_20220124-f8a0ded0.pth) | +| ConvNeXt-L\* | ImageNet-21k | 197.77 | 34.37 | 86.61 | 98.04 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-large_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-large_in21k-pre-3rdparty_64xb64_in1k_20220124-2412403d.pth) | +| ConvNeXt-XL\* | ImageNet-21k | 350.20 | 60.93 | 86.97 | 98.20 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-xlarge_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-xlarge_in21k-pre-3rdparty_64xb64_in1k_20220124-76b6863d.pth) | + +*Models with * are converted from the [official repo](https://github.com/facebookresearch/ConvNeXt). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +### Pre-trained Models + +The pre-trained models on ImageNet-1k or ImageNet-21k are used to fine-tune on the downstream tasks. + +| Model | Training Data | Params(M) | Flops(G) | Download | +| :-----------: | :-----------: | :-------: | :------: | :-----------------------------------------------------------------------------------------------------------------------------------: | +| ConvNeXt-T\* | ImageNet-1k | 28.59 | 4.46 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-tiny_3rdparty_32xb128-noema_in1k_20220222-2908964a.pth) | +| ConvNeXt-S\* | ImageNet-1k | 50.22 | 8.69 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-small_3rdparty_32xb128-noema_in1k_20220222-fa001ca5.pth) | +| ConvNeXt-B\* | ImageNet-1k | 88.59 | 15.36 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_3rdparty_32xb128-noema_in1k_20220222-dba4f95f.pth) | +| ConvNeXt-B\* | ImageNet-21k | 88.59 | 15.36 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_3rdparty_in21k_20220124-13b83eec.pth) | +| ConvNeXt-L\* | ImageNet-21k | 197.77 | 34.37 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-large_3rdparty_in21k_20220124-41b5a79f.pth) | +| ConvNeXt-XL\* | ImageNet-21k | 350.20 | 60.93 | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-xlarge_3rdparty_in21k_20220124-f909bad7.pth) | + +*Models with * are converted from the [official repo](https://github.com/facebookresearch/ConvNeXt).* + +## Citation + +```bibtex +@Article{liu2022convnet, + author = {Zhuang Liu and Hanzi Mao and Chao-Yuan Wu and Christoph Feichtenhofer and Trevor Darrell and Saining Xie}, + title = {A ConvNet for the 2020s}, + journal = {arXiv preprint arXiv:2201.03545}, + year = {2022}, +} +``` diff --git a/configs/convnext/convnext-base_32xb128_in1k.py b/configs/convnext/convnext-base_32xb128_in1k.py new file mode 100644 index 0000000..6c0450a --- /dev/null +++ b/configs/convnext/convnext-base_32xb128_in1k.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/convnext/convnext-base.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=128) + +optimizer = dict(lr=4e-3) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/convnext/convnext-large_64xb64_in1k.py b/configs/convnext/convnext-large_64xb64_in1k.py new file mode 100644 index 0000000..1faae25 --- /dev/null +++ b/configs/convnext/convnext-large_64xb64_in1k.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/convnext/convnext-large.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=64) + +optimizer = dict(lr=4e-3) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/convnext/convnext-small_32xb128_in1k.py b/configs/convnext/convnext-small_32xb128_in1k.py new file mode 100644 index 0000000..d820fc6 --- /dev/null +++ b/configs/convnext/convnext-small_32xb128_in1k.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/convnext/convnext-small.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=128) + +optimizer = dict(lr=4e-3) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/convnext/convnext-tiny_32xb128_in1k.py b/configs/convnext/convnext-tiny_32xb128_in1k.py new file mode 100644 index 0000000..46d0185 --- /dev/null +++ b/configs/convnext/convnext-tiny_32xb128_in1k.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/convnext/convnext-tiny.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=128) + +optimizer = dict(lr=4e-3) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/convnext/convnext-xlarge_64xb64_in1k.py b/configs/convnext/convnext-xlarge_64xb64_in1k.py new file mode 100644 index 0000000..7284901 --- /dev/null +++ b/configs/convnext/convnext-xlarge_64xb64_in1k.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/convnext/convnext-xlarge.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=64) + +optimizer = dict(lr=4e-3) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/convnext/metafile.yml b/configs/convnext/metafile.yml new file mode 100644 index 0000000..823f332 --- /dev/null +++ b/configs/convnext/metafile.yml @@ -0,0 +1,221 @@ +Collections: + - Name: ConvNeXt + Metadata: + Training Data: ImageNet-1k + Architecture: + - 1x1 Convolution + - LayerScale + Paper: + URL: https://arxiv.org/abs/2201.03545v1 + Title: A ConvNet for the 2020s + README: configs/convnext/README.md + Code: + Version: v0.20.1 + URL: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/convnext.py + +Models: + - Name: convnext-tiny_3rdparty_32xb128_in1k + Metadata: + FLOPs: 4457472768 + Parameters: 28589128 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.05 + Top 5 Accuracy: 95.86 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-tiny_3rdparty_32xb128_in1k_20220124-18abde00.pth + Config: configs/convnext/convnext-tiny_32xb128_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_tiny_1k_224_ema.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-tiny_3rdparty_32xb128-noema_in1k + Metadata: + Training Data: ImageNet-1k + FLOPs: 4457472768 + Parameters: 28589128 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.81 + Top 5 Accuracy: 95.67 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-tiny_3rdparty_32xb128-noema_in1k_20220222-2908964a.pth + Config: configs/convnext/convnext-tiny_32xb128_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_tiny_1k_224.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-small_3rdparty_32xb128_in1k + Metadata: + FLOPs: 8687008512 + Parameters: 50223688 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.13 + Top 5 Accuracy: 96.44 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-small_3rdparty_32xb128_in1k_20220124-d39b5192.pth + Config: configs/convnext/convnext-small_32xb128_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_small_1k_224_ema.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-small_3rdparty_32xb128-noema_in1k + Metadata: + Training Data: ImageNet-1k + FLOPs: 8687008512 + Parameters: 50223688 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.11 + Top 5 Accuracy: 96.34 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-small_3rdparty_32xb128-noema_in1k_20220222-fa001ca5.pth + Config: configs/convnext/convnext-small_32xb128_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_small_1k_224.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-base_3rdparty_32xb128_in1k + Metadata: + FLOPs: 15359124480 + Parameters: 88591464 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.85 + Top 5 Accuracy: 96.74 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_3rdparty_32xb128_in1k_20220124-d0915162.pth + Config: configs/convnext/convnext-base_32xb128_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_224_ema.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-base_3rdparty_32xb128-noema_in1k + Metadata: + Training Data: ImageNet-1k + FLOPs: 15359124480 + Parameters: 88591464 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.71 + Top 5 Accuracy: 96.60 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_3rdparty_32xb128-noema_in1k_20220222-dba4f95f.pth + Config: configs/convnext/convnext-base_32xb128_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_224.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-base_3rdparty_in21k + Metadata: + Training Data: ImageNet-21k + FLOPs: 15359124480 + Parameters: 88591464 + In Collections: ConvNeXt + Results: null + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_3rdparty_in21k_20220124-13b83eec.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_224.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-base_in21k-pre-3rdparty_32xb128_in1k + Metadata: + Training Data: + - ImageNet-21k + - ImageNet-1k + FLOPs: 15359124480 + Parameters: 88591464 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 85.81 + Top 5 Accuracy: 97.86 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_in21k-pre-3rdparty_32xb128_in1k_20220124-eb2d6ada.pth + Config: configs/convnext/convnext-base_32xb128_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_224.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-large_3rdparty_64xb64_in1k + Metadata: + FLOPs: 34368026112 + Parameters: 197767336 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.30 + Top 5 Accuracy: 96.89 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-large_3rdparty_64xb64_in1k_20220124-f8a0ded0.pth + Config: configs/convnext/convnext-large_64xb64_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_224_ema.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-large_3rdparty_in21k + Metadata: + Training Data: ImageNet-21k + FLOPs: 34368026112 + Parameters: 197767336 + In Collections: ConvNeXt + Results: null + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-large_3rdparty_in21k_20220124-41b5a79f.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_224.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-large_in21k-pre-3rdparty_64xb64_in1k + Metadata: + Training Data: + - ImageNet-21k + - ImageNet-1k + FLOPs: 34368026112 + Parameters: 197767336 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 86.61 + Top 5 Accuracy: 98.04 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-large_in21k-pre-3rdparty_64xb64_in1k_20220124-2412403d.pth + Config: configs/convnext/convnext-large_64xb64_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_224.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-xlarge_3rdparty_in21k + Metadata: + Training Data: ImageNet-21k + FLOPs: 60929820672 + Parameters: 350196968 + In Collections: ConvNeXt + Results: null + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-xlarge_3rdparty_in21k_20220124-f909bad7.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_224.pth + Code: https://github.com/facebookresearch/ConvNeXt + - Name: convnext-xlarge_in21k-pre-3rdparty_64xb64_in1k + Metadata: + Training Data: + - ImageNet-21k + - ImageNet-1k + FLOPs: 60929820672 + Parameters: 350196968 + In Collections: ConvNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 86.97 + Top 5 Accuracy: 98.20 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/convnext/convnext-xlarge_in21k-pre-3rdparty_64xb64_in1k_20220124-76b6863d.pth + Config: configs/convnext/convnext-xlarge_64xb64_in1k.py + Converted From: + Weights: https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_224_ema.pth + Code: https://github.com/facebookresearch/ConvNeXt diff --git a/configs/cspnet/README.md b/configs/cspnet/README.md new file mode 100644 index 0000000..10eb9d0 --- /dev/null +++ b/configs/cspnet/README.md @@ -0,0 +1,41 @@ +# CSPNet + +> [CSPNet: A New Backbone that can Enhance Learning Capability of CNN](https://arxiv.org/abs/1911.11929) + + + +## Abstract + + + +Neural networks have enabled state-of-the-art approaches to achieve incredible results on computer vision tasks such as object detection. However, such success greatly relies on costly computation resources, which hinders people with cheap devices from appreciating the advanced technology. In this paper, we propose Cross Stage Partial Network (CSPNet) to mitigate the problem that previous works require heavy inference computations from the network architecture perspective. We attribute the problem to the duplicate gradient information within network optimization. The proposed networks respect the variability of the gradients by integrating feature maps from the beginning and the end of a network stage, which, in our experiments, reduces computations by 20% with equivalent or even superior accuracy on the ImageNet dataset, and significantly outperforms state-of-the-art approaches in terms of AP50 on the MS COCO object detection dataset. The CSPNet is easy to implement and general enough to cope with architectures based on ResNet, ResNeXt, and DenseNet. Source code is at this https URL. + + + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Pretrain | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :------------: | :----------: | :-------: | :------: | :-------: | :-------: | :------------------------------------------------------------------: | :---------------------------------------------------------------------: | +| CSPDarkNet50\* | From scratch | 27.64 | 5.04 | 80.05 | 95.07 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/cspnet/cspdarknet50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/cspnet/cspdarknet50_3rdparty_8xb32_in1k_20220329-bd275287.pth) | +| CSPResNet50\* | From scratch | 21.62 | 3.48 | 79.55 | 94.68 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/cspnet/cspresnet50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/cspnet/cspresnet50_3rdparty_8xb32_in1k_20220329-dd6dddfb.pth) | +| CSPResNeXt50\* | From scratch | 20.57 | 3.11 | 79.96 | 94.96 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/cspnet/cspresnext50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/cspnet/cspresnext50_3rdparty_8xb32_in1k_20220329-2cc84d21.pth) | + +*Models with * are converted from the [timm repo](https://github.com/rwightman/pytorch-image-models). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +```bibtex +@inproceedings{wang2020cspnet, + title={CSPNet: A new backbone that can enhance learning capability of CNN}, + author={Wang, Chien-Yao and Liao, Hong-Yuan Mark and Wu, Yueh-Hua and Chen, Ping-Yang and Hsieh, Jun-Wei and Yeh, I-Hau}, + booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition workshops}, + pages={390--391}, + year={2020} +} +``` diff --git a/configs/cspnet/cspdarknet50_8xb32_in1k.py b/configs/cspnet/cspdarknet50_8xb32_in1k.py new file mode 100644 index 0000000..cf2ce73 --- /dev/null +++ b/configs/cspnet/cspdarknet50_8xb32_in1k.py @@ -0,0 +1,65 @@ +_base_ = [ + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='CSPDarkNet', depth=53), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(288, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=256), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=32, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/cspnet/cspresnet50_8xb32_in1k.py b/configs/cspnet/cspresnet50_8xb32_in1k.py new file mode 100644 index 0000000..f4cfbf8 --- /dev/null +++ b/configs/cspnet/cspresnet50_8xb32_in1k.py @@ -0,0 +1,66 @@ +_base_ = [ + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='CSPResNet', depth=50), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(288, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=256), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=32, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/cspnet/cspresnext50_8xb32_in1k.py b/configs/cspnet/cspresnext50_8xb32_in1k.py new file mode 100644 index 0000000..a82ab75 --- /dev/null +++ b/configs/cspnet/cspresnext50_8xb32_in1k.py @@ -0,0 +1,65 @@ +_base_ = [ + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='CSPResNeXt', depth=50), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(256, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=32, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/cspnet/metafile.yml b/configs/cspnet/metafile.yml new file mode 100644 index 0000000..8c4a78e --- /dev/null +++ b/configs/cspnet/metafile.yml @@ -0,0 +1,64 @@ +Collections: + - Name: CSPNet + Metadata: + Training Data: ImageNet-1k + Architecture: + - Cross Stage Partia Stage + Paper: + URL: https://arxiv.org/abs/1911.11929 + Title: 'CSPNet: A New Backbone that can Enhance Learning Capability of CNN' + README: configs/cspnet/README.md + Code: + Version: v0.22.0 + URL: https://github.com/open-mmlab/mmclassification/blob/v0.22.0/mmcls/models/backbones/cspnet.py + +Models: + - Name: cspdarknet50_3rdparty_8xb32_in1k + Metadata: + FLOPs: 5040000000 + Parameters: 27640000 + In Collections: CSPNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 80.05 + Top 5 Accuracy: 95.07 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/cspnet/cspdarknet50_3rdparty_8xb32_in1k_20220329-bd275287.pth + Config: configs/cspnet/cspdarknet50_8xb32_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspdarknet53_ra_256-d05c7c21.pth + Code: https://github.com/rwightman/pytorch-image-models + - Name: cspresnet50_3rdparty_8xb32_in1k + Metadata: + Training Data: ImageNet-1k + FLOPs: 3480000000 + Parameters: 21620000 + In Collections: CSPNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.55 + Top 5 Accuracy: 94.68 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/cspnet/cspresnet50_3rdparty_8xb32_in1k_20220329-dd6dddfb.pth + Config: configs/cspnet/cspresnet50_8xb32_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspresnet50_ra-d3e8d487.pth + Code: https://github.com/rwightman/pytorch-image-models + - Name: cspresnext50_3rdparty_8xb32_in1k + Metadata: + FLOPs: 3110000000 + Parameters: 20570000 + In Collections: CSPNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.96 + Top 5 Accuracy: 94.96 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/cspnet/cspresnext50_3rdparty_8xb32_in1k_20220329-2cc84d21.pth + Config: configs/cspnet/cspresnext50_8xb32_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspresnext50_ra_224-648b4713.pth + Code: https://github.com/rwightman/pytorch-image-models diff --git a/configs/csra/README.md b/configs/csra/README.md new file mode 100644 index 0000000..fa677cf --- /dev/null +++ b/configs/csra/README.md @@ -0,0 +1,36 @@ +# CSRA + +> [Residual Attention: A Simple but Effective Method for Multi-Label Recognition](https://arxiv.org/abs/2108.02456) + + + +## Abstract + +Multi-label image recognition is a challenging computer vision task of practical use. Progresses in this area, however, are often characterized by complicated methods, heavy computations, and lack of intuitive explanations. To effectively capture different spatial regions occupied by objects from different categories, we propose an embarrassingly simple module, named class-specific residual attention (CSRA). CSRA generates class-specific features for every category by proposing a simple spatial attention score, and then combines it with the class-agnostic average pooling feature. CSRA achieves state-of-the-art results on multilabel recognition, and at the same time is much simpler than them. Furthermore, with only 4 lines of code, CSRA also leads to consistent improvement across many diverse pretrained models and datasets without any extra training. CSRA is both easy to implement and light in computations, which also enjoys intuitive explanations and visualizations. + +
+ +
+ +## Results and models + +### VOC2007 + +| Model | Pretrain | Params(M) | Flops(G) | mAP | OF1 (%) | CF1 (%) | Config | Download | +| :------------: | :------------------------------------------------: | :-------: | :------: | :---: | :-----: | :-----: | :-----------------------------------------------: | :-------------------------------------------------: | +| Resnet101-CSRA | [ImageNet-1k](https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_8xb32_in1k_20210831-539c63f8.pth) | 23.55 | 4.12 | 94.98 | 90.80 | 89.16 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/csra/resnet101-csra_1xb16_voc07-448px.py) | [model](https://download.openmmlab.com/mmclassification/v0/csra/resnet101-csra_1xb16_voc07-448px_20220722-29efb40a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/csra/resnet101-csra_1xb16_voc07-448px_20220722-29efb40a.log.json) | + +## Citation + +```bibtex +@misc{https://doi.org/10.48550/arxiv.2108.02456, + doi = {10.48550/ARXIV.2108.02456}, + url = {https://arxiv.org/abs/2108.02456}, + author = {Zhu, Ke and Wu, Jianxin}, + keywords = {Computer Vision and Pattern Recognition (cs.CV), FOS: Computer and information sciences, FOS: Computer and information sciences}, + title = {Residual Attention: A Simple but Effective Method for Multi-Label Recognition}, + publisher = {arXiv}, + year = {2021}, + copyright = {arXiv.org perpetual, non-exclusive license} +} +``` diff --git a/configs/csra/metafile.yml b/configs/csra/metafile.yml new file mode 100644 index 0000000..f1fa622 --- /dev/null +++ b/configs/csra/metafile.yml @@ -0,0 +1,29 @@ +Collections: + - Name: CSRA + Metadata: + Training Data: PASCAL VOC 2007 + Architecture: + - Class-specific Residual Attention + Paper: + URL: https://arxiv.org/abs/1911.11929 + Title: 'Residual Attention: A Simple but Effective Method for Multi-Label Recognition' + README: configs/csra/README.md + Code: + Version: v0.24.0 + URL: https://github.com/open-mmlab/mmclassification/blob/v0.24.0/mmcls/models/heads/multi_label_csra_head.py + +Models: + - Name: resnet101-csra_1xb16_voc07-448px + Metadata: + FLOPs: 4120000000 + Parameters: 23550000 + In Collections: CSRA + Results: + - Dataset: PASCAL VOC 2007 + Metrics: + mAP: 94.98 + OF1: 90.80 + CF1: 89.16 + Task: Multi-Label Classification + Weights: https://download.openmmlab.com/mmclassification/v0/csra/resnet101-csra_1xb16_voc07-448px_20220722-29efb40a.pth + Config: configs/csra/resnet101-csra_1xb16_voc07-448px.py diff --git a/configs/csra/resnet101-csra_1xb16_voc07-448px.py b/configs/csra/resnet101-csra_1xb16_voc07-448px.py new file mode 100644 index 0000000..5dc5dd6 --- /dev/null +++ b/configs/csra/resnet101-csra_1xb16_voc07-448px.py @@ -0,0 +1,75 @@ +_base_ = ['../_base_/datasets/voc_bs16.py', '../_base_/default_runtime.py'] + +# Pre-trained Checkpoint Path +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_8xb32_in1k_20210831-539c63f8.pth' # noqa +# If you want to use the pre-trained weight of ResNet101-CutMix from +# the originary repo(https://github.com/Kevinz-code/CSRA). Script of +# 'tools/convert_models/torchvision_to_mmcls.py' can help you convert weight +# into mmcls format. The mAP result would hit 95.5 by using the weight. +# checkpoint = 'PATH/TO/PRE-TRAINED_WEIGHT' + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(3, ), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint, prefix='backbone')), + neck=None, + head=dict( + type='CSRAClsHead', + num_classes=20, + in_channels=2048, + num_heads=1, + lam=0.1, + loss=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0))) + +# dataset setting +img_norm_cfg = dict(mean=[0, 0, 0], std=[255, 255, 255], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=448, scale=(0.7, 1.0)), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=448), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + # map the difficult examples as negative ones(0) + train=dict(pipeline=train_pipeline, difficult_as_postive=False), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +# the lr of classifier.head is 10 * base_lr, which help convergence. +optimizer = dict( + type='SGD', + lr=0.0002, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(custom_keys={'head': dict(lr_mult=10)})) + +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='step', + step=6, + gamma=0.1, + warmup='linear', + warmup_iters=1, + warmup_ratio=1e-7, + warmup_by_epoch=True) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/deit/README.md b/configs/deit/README.md new file mode 100644 index 0000000..e310365 --- /dev/null +++ b/configs/deit/README.md @@ -0,0 +1,52 @@ +# DeiT + +> [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) + + + +## Abstract + +Recently, neural networks purely based on attention were shown to address image understanding tasks such as image classification. However, these visual transformers are pre-trained with hundreds of millions of images using an expensive infrastructure, thereby limiting their adoption. In this work, we produce a competitive convolution-free transformer by training on Imagenet only. We train them on a single computer in less than 3 days. Our reference vision transformer (86M parameters) achieves top-1 accuracy of 83.1% (single-crop evaluation) on ImageNet with no external data. More importantly, we introduce a teacher-student strategy specific to transformers. It relies on a distillation token ensuring that the student learns from the teacher through attention. We show the interest of this token-based distillation, especially when using a convnet as a teacher. This leads us to report results competitive with convnets for both Imagenet (where we obtain up to 85.2% accuracy) and when transferring to other tasks. We share our code and models. + +
+ +
+ +## Results and models + +### ImageNet-1k + +The teacher of the distilled version DeiT is RegNetY-16GF. + +| Model | Pretrain | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-------------------------: | :----------: | :-------: | :------: | :-------: | :-------: | :------------------------------------------------------------: | :--------------------------------------------------------------: | +| DeiT-tiny | From scratch | 5.72 | 1.08 | 74.50 | 92.24 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-tiny_pt-4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-tiny_pt-4xb256_in1k_20220218-13b382a0.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/deit/deit-tiny_pt-4xb256_in1k_20220218-13b382a0.log.json) | +| DeiT-tiny distilled\* | From scratch | 5.72 | 1.08 | 74.51 | 91.90 | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/deit/deit-tiny-distilled_pt-4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-tiny-distilled_3rdparty_pt-4xb256_in1k_20211216-c429839a.pth) | +| DeiT-small | From scratch | 22.05 | 4.24 | 80.69 | 95.06 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-small_pt-4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-small_pt-4xb256_in1k_20220218-9425b9bb.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/deit/deit-small_pt-4xb256_in1k_20220218-9425b9bb.log.json) | +| DeiT-small distilled\* | From scratch | 22.05 | 4.24 | 81.17 | 95.40 | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/deit/deit-small-distilled_pt-4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-small-distilled_3rdparty_pt-4xb256_in1k_20211216-4de1d725.pth) | +| DeiT-base | From scratch | 86.57 | 16.86 | 81.76 | 95.81 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-base_pt-16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-base_pt-16xb64_in1k_20220216-db63c16c.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/deit/deit-base_pt-16xb64_in1k_20220216-db63c16c.log.json) | +| DeiT-base\* | From scratch | 86.57 | 16.86 | 81.79 | 95.59 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-base_pt-16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-base_3rdparty_pt-16xb64_in1k_20211124-6f40c188.pth) | +| DeiT-base distilled\* | From scratch | 86.57 | 16.86 | 83.33 | 96.49 | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/deit/deit-base-distilled_pt-16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-base-distilled_3rdparty_pt-16xb64_in1k_20211216-42891296.pth) | +| DeiT-base 384px\* | ImageNet-1k | 86.86 | 49.37 | 83.04 | 96.31 | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/deit/deit-base_ft-16xb32_in1k-384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-base_3rdparty_ft-16xb32_in1k-384px_20211124-822d02f2.pth) | +| DeiT-base distilled 384px\* | ImageNet-1k | 86.86 | 49.37 | 85.55 | 97.35 | [config](https://github.com/open-mmlab/mmclassification/tree/master/configs/deit/deit-base-distilled_ft-16xb32_in1k-384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-base-distilled_3rdparty_ft-16xb32_in1k-384px_20211216-e48d6000.pth) | + +*Models with * are converted from the [official repo](https://github.com/facebookresearch/deit). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +```{warning} +MMClassification doesn't support training the distilled version DeiT. +And we provide distilled version checkpoints for inference only. +``` + +## Citation + +``` +@InProceedings{pmlr-v139-touvron21a, + title = {Training data-efficient image transformers & distillation through attention}, + author = {Touvron, Hugo and Cord, Matthieu and Douze, Matthijs and Massa, Francisco and Sablayrolles, Alexandre and Jegou, Herve}, + booktitle = {International Conference on Machine Learning}, + pages = {10347--10357}, + year = {2021}, + volume = {139}, + month = {July} +} +``` diff --git a/configs/deit/deit-base-distilled_ft-16xb32_in1k-384px.py b/configs/deit/deit-base-distilled_ft-16xb32_in1k-384px.py new file mode 100644 index 0000000..c8bdfb5 --- /dev/null +++ b/configs/deit/deit-base-distilled_ft-16xb32_in1k-384px.py @@ -0,0 +1,9 @@ +_base_ = './deit-base_ft-16xb32_in1k-384px.py' + +# model settings +model = dict( + backbone=dict(type='DistilledVisionTransformer'), + head=dict(type='DeiTClsHead'), + # Change to the path of the pretrained model + # init_cfg=dict(type='Pretrained', checkpoint=''), +) diff --git a/configs/deit/deit-base-distilled_pt-16xb64_in1k.py b/configs/deit/deit-base-distilled_pt-16xb64_in1k.py new file mode 100644 index 0000000..6716583 --- /dev/null +++ b/configs/deit/deit-base-distilled_pt-16xb64_in1k.py @@ -0,0 +1,10 @@ +_base_ = './deit-small_pt-4xb256_in1k.py' + +# model settings +model = dict( + backbone=dict(type='DistilledVisionTransformer', arch='deit-base'), + head=dict(type='DeiTClsHead', in_channels=768), +) + +# data settings +data = dict(samples_per_gpu=64, workers_per_gpu=5) diff --git a/configs/deit/deit-base_ft-16xb32_in1k-384px.py b/configs/deit/deit-base_ft-16xb32_in1k-384px.py new file mode 100644 index 0000000..db44416 --- /dev/null +++ b/configs/deit/deit-base_ft-16xb32_in1k-384px.py @@ -0,0 +1,29 @@ +_base_ = [ + '../_base_/datasets/imagenet_bs64_swin_384.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='deit-base', + img_size=384, + patch_size=16, + ), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + # Change to the path of the pretrained model + # init_cfg=dict(type='Pretrained', checkpoint=''), +) + +# data settings +data = dict(samples_per_gpu=32, workers_per_gpu=5) diff --git a/configs/deit/deit-base_pt-16xb64_in1k.py b/configs/deit/deit-base_pt-16xb64_in1k.py new file mode 100644 index 0000000..24c13dc --- /dev/null +++ b/configs/deit/deit-base_pt-16xb64_in1k.py @@ -0,0 +1,13 @@ +_base_ = './deit-small_pt-4xb256_in1k.py' + +# model settings +model = dict( + backbone=dict( + type='VisionTransformer', arch='deit-base', drop_path_rate=0.1), + head=dict(type='VisionTransformerClsHead', in_channels=768), +) + +# data settings +data = dict(samples_per_gpu=64, workers_per_gpu=5) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/deit/deit-small-distilled_pt-4xb256_in1k.py b/configs/deit/deit-small-distilled_pt-4xb256_in1k.py new file mode 100644 index 0000000..3b1fac2 --- /dev/null +++ b/configs/deit/deit-small-distilled_pt-4xb256_in1k.py @@ -0,0 +1,7 @@ +_base_ = './deit-small_pt-4xb256_in1k.py' + +# model settings +model = dict( + backbone=dict(type='DistilledVisionTransformer', arch='deit-small'), + head=dict(type='DeiTClsHead', in_channels=384), +) diff --git a/configs/deit/deit-small_pt-4xb256_in1k.py b/configs/deit/deit-small_pt-4xb256_in1k.py new file mode 100644 index 0000000..550f080 --- /dev/null +++ b/configs/deit/deit-small_pt-4xb256_in1k.py @@ -0,0 +1,44 @@ +# In small and tiny arch, remove drop path and EMA hook comparing with the +# original config +_base_ = [ + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='deit-small', + img_size=224, + patch_size=16), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=384, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) + +# data settings +data = dict(samples_per_gpu=256, workers_per_gpu=5) + +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.cls_token': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0) + }) +optimizer = dict(paramwise_cfg=paramwise_cfg) diff --git a/configs/deit/deit-tiny-distilled_pt-4xb256_in1k.py b/configs/deit/deit-tiny-distilled_pt-4xb256_in1k.py new file mode 100644 index 0000000..175f980 --- /dev/null +++ b/configs/deit/deit-tiny-distilled_pt-4xb256_in1k.py @@ -0,0 +1,7 @@ +_base_ = './deit-small_pt-4xb256_in1k.py' + +# model settings +model = dict( + backbone=dict(type='DistilledVisionTransformer', arch='deit-tiny'), + head=dict(type='DeiTClsHead', in_channels=192), +) diff --git a/configs/deit/deit-tiny_pt-4xb256_in1k.py b/configs/deit/deit-tiny_pt-4xb256_in1k.py new file mode 100644 index 0000000..43df6e1 --- /dev/null +++ b/configs/deit/deit-tiny_pt-4xb256_in1k.py @@ -0,0 +1,7 @@ +_base_ = './deit-small_pt-4xb256_in1k.py' + +# model settings +model = dict( + backbone=dict(type='VisionTransformer', arch='deit-tiny'), + head=dict(type='VisionTransformerClsHead', in_channels=192), +) diff --git a/configs/deit/metafile.yml b/configs/deit/metafile.yml new file mode 100644 index 0000000..ddd4c67 --- /dev/null +++ b/configs/deit/metafile.yml @@ -0,0 +1,153 @@ +Collections: + - Name: DeiT + Metadata: + Training Data: ImageNet-1k + Architecture: + - Layer Normalization + - Scaled Dot-Product Attention + - Attention Dropout + - Multi-Head Attention + Paper: + URL: https://arxiv.org/abs/2012.12877 + Title: "Training data-efficient image transformers & distillation through attention" + README: configs/deit/README.md + Code: + URL: v0.19.0 + Version: https://github.com/open-mmlab/mmclassification/blob/v0.19.0/mmcls/models/backbones/deit.py + +Models: + - Name: deit-tiny_pt-4xb256_in1k + Metadata: + FLOPs: 1080000000 + Parameters: 5720000 + In Collection: DeiT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 74.50 + Top 5 Accuracy: 92.24 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/deit/deit-tiny_pt-4xb256_in1k_20220218-13b382a0.pth + Config: configs/deit/deit-tiny_pt-4xb256_in1k.py + - Name: deit-tiny-distilled_3rdparty_pt-4xb256_in1k + Metadata: + FLOPs: 1080000000 + Parameters: 5720000 + In Collection: DeiT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 74.51 + Top 5 Accuracy: 91.90 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/deit/deit-tiny-distilled_3rdparty_pt-4xb256_in1k_20211216-c429839a.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/deit/deit_tiny_distilled_patch16_224-b40b3cf7.pth + Code: https://github.com/facebookresearch/deit/blob/f5123946205daf72a88783dae94cabff98c49c55/models.py#L108 + Config: configs/deit/deit-tiny-distilled_pt-4xb256_in1k.py + - Name: deit-small_pt-4xb256_in1k + Metadata: + FLOPs: 4240000000 + Parameters: 22050000 + In Collection: DeiT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 80.69 + Top 5 Accuracy: 95.06 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/deit/deit-small_pt-4xb256_in1k_20220218-9425b9bb.pth + Config: configs/deit/deit-small_pt-4xb256_in1k.py + - Name: deit-small-distilled_3rdparty_pt-4xb256_in1k + Metadata: + FLOPs: 4240000000 + Parameters: 22050000 + In Collection: DeiT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.17 + Top 5 Accuracy: 95.40 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/deit/deit-small-distilled_3rdparty_pt-4xb256_in1k_20211216-4de1d725.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/deit/deit_small_distilled_patch16_224-649709d9.pth + Code: https://github.com/facebookresearch/deit/blob/f5123946205daf72a88783dae94cabff98c49c55/models.py#L123 + Config: configs/deit/deit-small-distilled_pt-4xb256_in1k.py + - Name: deit-base_pt-16xb64_in1k + Metadata: + FLOPs: 16860000000 + Parameters: 86570000 + In Collection: DeiT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.76 + Top 5 Accuracy: 95.81 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/deit/deit-base_pt-16xb64_in1k_20220216-db63c16c.pth + Config: configs/deit/deit-base_pt-16xb64_in1k.py + - Name: deit-base_3rdparty_pt-16xb64_in1k + Metadata: + FLOPs: 16860000000 + Parameters: 86570000 + In Collection: DeiT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.79 + Top 5 Accuracy: 95.59 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/deit/deit-base_3rdparty_pt-16xb64_in1k_20211124-6f40c188.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/deit/deit_base_patch16_224-b5f2ef4d.pth + Code: https://github.com/facebookresearch/deit/blob/f5123946205daf72a88783dae94cabff98c49c55/models.py#L93 + Config: configs/deit/deit-base_pt-16xb64_in1k.py + - Name: deit-base-distilled_3rdparty_pt-16xb64_in1k + Metadata: + FLOPs: 16860000000 + Parameters: 86570000 + In Collection: DeiT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.33 + Top 5 Accuracy: 96.49 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/deit/deit-base-distilled_3rdparty_pt-16xb64_in1k_20211216-42891296.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/deit/deit_base_distilled_patch16_224-df68dfff.pth + Code: https://github.com/facebookresearch/deit/blob/f5123946205daf72a88783dae94cabff98c49c55/models.py#L138 + Config: configs/deit/deit-base-distilled_pt-16xb64_in1k.py + - Name: deit-base_3rdparty_ft-16xb32_in1k-384px + Metadata: + FLOPs: 49370000000 + Parameters: 86860000 + In Collection: DeiT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.04 + Top 5 Accuracy: 96.31 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/deit/deit-base_3rdparty_ft-16xb32_in1k-384px_20211124-822d02f2.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/deit/deit_base_patch16_384-8de9b5d1.pth + Code: https://github.com/facebookresearch/deit/blob/f5123946205daf72a88783dae94cabff98c49c55/models.py#L153 + Config: configs/deit/deit-base_ft-16xb32_in1k-384px.py + - Name: deit-base-distilled_3rdparty_ft-16xb32_in1k-384px + Metadata: + FLOPs: 49370000000 + Parameters: 86860000 + In Collection: DeiT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 85.55 + Top 5 Accuracy: 97.35 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/deit/deit-base-distilled_3rdparty_ft-16xb32_in1k-384px_20211216-e48d6000.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/deit/deit_base_distilled_patch16_384-d0272ac0.pth + Code: https://github.com/facebookresearch/deit/blob/f5123946205daf72a88783dae94cabff98c49c55/models.py#L168 + Config: configs/deit/deit-base-distilled_ft-16xb32_in1k-384px.py diff --git a/configs/densenet/README.md b/configs/densenet/README.md new file mode 100644 index 0000000..f07f25c --- /dev/null +++ b/configs/densenet/README.md @@ -0,0 +1,41 @@ +# DenseNet + +> [Densely Connected Convolutional Networks](https://arxiv.org/abs/1608.06993) + + + +## Abstract + +Recent work has shown that convolutional networks can be substantially deeper, more accurate, and efficient to train if they contain shorter connections between layers close to the input and those close to the output. In this paper, we embrace this observation and introduce the Dense Convolutional Network (DenseNet), which connects each layer to every other layer in a feed-forward fashion. Whereas traditional convolutional networks with L layers have L connections - one between each layer and its subsequent layer - our network has L(L+1)/2 direct connections. For each layer, the feature-maps of all preceding layers are used as inputs, and its own feature-maps are used as inputs into all subsequent layers. DenseNets have several compelling advantages: they alleviate the vanishing-gradient problem, strengthen feature propagation, encourage feature reuse, and substantially reduce the number of parameters. We evaluate our proposed architecture on four highly competitive object recognition benchmark tasks (CIFAR-10, CIFAR-100, SVHN, and ImageNet). DenseNets obtain significant improvements over the state-of-the-art on most of them, whilst requiring less computation to achieve high performance. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------: | :-------: | :------: | :-------: | :-------: | :-------------------------------------------------------------------------: | :---------------------------------------------------------------------------: | +| DenseNet121\* | 7.98 | 2.88 | 74.96 | 92.21 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet121_4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/densenet/densenet121_4xb256_in1k_20220426-07450f99.pth) | +| DenseNet169\* | 14.15 | 3.42 | 76.08 | 93.11 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet169_4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/densenet/densenet169_4xb256_in1k_20220426-a2889902.pth) | +| DenseNet201\* | 20.01 | 4.37 | 77.32 | 93.64 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet201_4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/densenet/densenet201_4xb256_in1k_20220426-05cae4ef.pth) | +| DenseNet161\* | 28.68 | 7.82 | 77.61 | 93.83 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet161_4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/densenet/densenet161_4xb256_in1k_20220426-ee6a80a9.pth) | + +*Models with * are converted from [pytorch](https://pytorch.org/vision/stable/models.html), guided by [original repo](https://github.com/liuzhuang13/DenseNet). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +```bibtex +@misc{https://doi.org/10.48550/arxiv.1608.06993, + doi = {10.48550/ARXIV.1608.06993}, + url = {https://arxiv.org/abs/1608.06993}, + author = {Huang, Gao and Liu, Zhuang and van der Maaten, Laurens and Weinberger, Kilian Q.}, + keywords = {Computer Vision and Pattern Recognition (cs.CV), Machine Learning (cs.LG), FOS: Computer and information sciences, FOS: Computer and information sciences}, + title = {Densely Connected Convolutional Networks}, + publisher = {arXiv}, + year = {2016}, + copyright = {arXiv.org perpetual, non-exclusive license} +} +``` diff --git a/configs/densenet/densenet121_4xb256_in1k.py b/configs/densenet/densenet121_4xb256_in1k.py new file mode 100644 index 0000000..08d65ae --- /dev/null +++ b/configs/densenet/densenet121_4xb256_in1k.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/densenet/densenet121.py', + '../_base_/datasets/imagenet_bs64.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=256) + +runner = dict(type='EpochBasedRunner', max_epochs=90) diff --git a/configs/densenet/densenet161_4xb256_in1k.py b/configs/densenet/densenet161_4xb256_in1k.py new file mode 100644 index 0000000..4581d1d --- /dev/null +++ b/configs/densenet/densenet161_4xb256_in1k.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/densenet/densenet161.py', + '../_base_/datasets/imagenet_bs64.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=256) + +runner = dict(type='EpochBasedRunner', max_epochs=90) diff --git a/configs/densenet/densenet169_4xb256_in1k.py b/configs/densenet/densenet169_4xb256_in1k.py new file mode 100644 index 0000000..6179293 --- /dev/null +++ b/configs/densenet/densenet169_4xb256_in1k.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/densenet/densenet169.py', + '../_base_/datasets/imagenet_bs64.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=256) + +runner = dict(type='EpochBasedRunner', max_epochs=90) diff --git a/configs/densenet/densenet201_4xb256_in1k.py b/configs/densenet/densenet201_4xb256_in1k.py new file mode 100644 index 0000000..897a141 --- /dev/null +++ b/configs/densenet/densenet201_4xb256_in1k.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/densenet/densenet201.py', + '../_base_/datasets/imagenet_bs64.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=256) + +runner = dict(type='EpochBasedRunner', max_epochs=90) diff --git a/configs/densenet/metafile.yml b/configs/densenet/metafile.yml new file mode 100644 index 0000000..84366b2 --- /dev/null +++ b/configs/densenet/metafile.yml @@ -0,0 +1,76 @@ +Collections: + - Name: DenseNet + Metadata: + Training Data: ImageNet-1k + Architecture: + - DenseBlock + Paper: + URL: https://arxiv.org/abs/1608.06993 + Title: Densely Connected Convolutional Networks + README: configs/densenet/README.md + +Models: + - Name: densenet121_4xb256_in1k + Metadata: + FLOPs: 2881695488 + Parameters: 7978856 + In Collections: DenseNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 74.96 + Top 5 Accuracy: 92.21 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/densenet/densenet121_4xb256_in1k_20220426-07450f99.pth + Config: configs/densenet/densenet121_4xb256_in1k.py + Converted From: + Weights: https://download.pytorch.org/models/densenet121-a639ec97.pth + Code: https://github.com/pytorch/vision/blob/main/torchvision/models/densenet.py + - Name: densenet169_4xb256_in1k + Metadata: + FLOPs: 3416860160 + Parameters: 14149480 + In Collections: DenseNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 76.08 + Top 5 Accuracy: 93.11 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/densenet/densenet169_4xb256_in1k_20220426-a2889902.pth + Config: configs/densenet/densenet169_4xb256_in1k.py + Converted From: + Weights: https://download.pytorch.org/models/densenet169-b2777c0a.pth + Code: https://github.com/pytorch/vision/blob/main/torchvision/models/densenet.py + - Name: densenet201_4xb256_in1k + Metadata: + FLOPs: 4365236736 + Parameters: 20013928 + In Collections: DenseNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.32 + Top 5 Accuracy: 93.64 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/densenet/densenet201_4xb256_in1k_20220426-05cae4ef.pth + Config: configs/densenet/densenet201_4xb256_in1k.py + Converted From: + Weights: https://download.pytorch.org/models/densenet201-c1103571.pth + Code: https://github.com/pytorch/vision/blob/main/torchvision/models/densenet.py + - Name: densenet161_4xb256_in1k + Metadata: + FLOPs: 7816363968 + Parameters: 28681000 + In Collections: DenseNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.61 + Top 5 Accuracy: 93.83 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/densenet/densenet161_4xb256_in1k_20220426-ee6a80a9.pth + Config: configs/densenet/densenet161_4xb256_in1k.py + Converted From: + Weights: https://download.pytorch.org/models/densenet161-8d451a50.pth + Code: https://github.com/pytorch/vision/blob/main/torchvision/models/densenet.py diff --git a/configs/efficientformer/README.md b/configs/efficientformer/README.md new file mode 100644 index 0000000..ecd6b49 --- /dev/null +++ b/configs/efficientformer/README.md @@ -0,0 +1,47 @@ +# EfficientFormer + +> [EfficientFormer: Vision Transformers at MobileNet Speed](https://arxiv.org/abs/2206.01191) + + + +## Abstract + +Vision Transformers (ViT) have shown rapid progress in computer vision tasks, achieving promising results on various benchmarks. However, due to the massive number of parameters and model design, e.g., attention mechanism, ViT-based models are generally times slower than lightweight convolutional networks. Therefore, the deployment of ViT for real-time applications is particularly challenging, especially on resource-constrained hardware such as mobile devices. Recent efforts try to reduce the computation complexity of ViT through network architecture search or hybrid design with MobileNet block, yet the inference speed is still unsatisfactory. This leads to an important question: can transformers run as fast as MobileNet while obtaining high performance? To answer this, we first revisit the network architecture and operators used in ViT-based models and identify inefficient designs. Then we introduce a dimension-consistent pure transformer (without MobileNet blocks) as a design paradigm. Finally, we perform latency-driven slimming to get a series of final models dubbed EfficientFormer. Extensive experiments show the superiority of EfficientFormer in performance and speed on mobile devices. Our fastest model, EfficientFormer-L1, achieves 79.2% top-1 accuracy on ImageNet-1K with only 1.6 ms inference latency on iPhone 12 (compiled with CoreML), which runs as fast as MobileNetV2×1.4 (1.6 ms, 74.7% top-1), and our largest model, EfficientFormer-L7, obtains 83.3% accuracy with only 7.0 ms latency. Our work proves that properly designed transformers can reach extremely low latency on mobile devices while maintaining high performance. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :------------------: | :-------: | :------: | :-------: | :-------: | :---------------------------------------------------------------------: | :------------------------------------------------------------------------: | +| EfficientFormer-l1\* | 12.19 | 1.30 | 80.46 | 94.99 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientformer/efficientformer-l1_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientformer/efficientformer-l1_3rdparty_in1k_20220803-d66e61df.pth) | +| EfficientFormer-l3\* | 31.41 | 3.93 | 82.45 | 96.18 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientformer/efficientformer-l3_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientformer/efficientformer-l3_3rdparty_in1k_20220803-dde1c8c5.pth) | +| EfficientFormer-l7\* | 82.23 | 10.16 | 83.40 | 96.60 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientformer/efficientformer-l7_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientformer/efficientformer-l7_3rdparty_in1k_20220803-41a552bb.pth) | + +*Models with * are converted from the [official repo](https://github.com/snap-research/EfficientFormer). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +```bibtex +@misc{https://doi.org/10.48550/arxiv.2206.01191, + doi = {10.48550/ARXIV.2206.01191}, + + url = {https://arxiv.org/abs/2206.01191}, + + author = {Li, Yanyu and Yuan, Geng and Wen, Yang and Hu, Eric and Evangelidis, Georgios and Tulyakov, Sergey and Wang, Yanzhi and Ren, Jian}, + + keywords = {Computer Vision and Pattern Recognition (cs.CV), FOS: Computer and information sciences, FOS: Computer and information sciences}, + + title = {EfficientFormer: Vision Transformers at MobileNet Speed}, + + publisher = {arXiv}, + + year = {2022}, + + copyright = {Creative Commons Attribution 4.0 International} +} +``` diff --git a/configs/efficientformer/efficientformer-l1_8xb128_in1k.py b/configs/efficientformer/efficientformer-l1_8xb128_in1k.py new file mode 100644 index 0000000..f5db2bf --- /dev/null +++ b/configs/efficientformer/efficientformer-l1_8xb128_in1k.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/datasets/imagenet_bs128_poolformer_small_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +model = dict( + type='ImageClassifier', + backbone=dict( + type='EfficientFormer', + arch='l1', + drop_path_rate=0, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-5) + ]), + neck=dict(type='GlobalAveragePooling', dim=1), + head=dict( + type='EfficientFormerClsHead', in_channels=448, num_classes=1000)) diff --git a/configs/efficientformer/efficientformer-l3_8xb128_in1k.py b/configs/efficientformer/efficientformer-l3_8xb128_in1k.py new file mode 100644 index 0000000..e920f78 --- /dev/null +++ b/configs/efficientformer/efficientformer-l3_8xb128_in1k.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/datasets/imagenet_bs128_poolformer_small_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +model = dict( + type='ImageClassifier', + backbone=dict( + type='EfficientFormer', + arch='l3', + drop_path_rate=0, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-5) + ]), + neck=dict(type='GlobalAveragePooling', dim=1), + head=dict( + type='EfficientFormerClsHead', in_channels=512, num_classes=1000)) diff --git a/configs/efficientformer/efficientformer-l7_8xb128_in1k.py b/configs/efficientformer/efficientformer-l7_8xb128_in1k.py new file mode 100644 index 0000000..a59e3a7 --- /dev/null +++ b/configs/efficientformer/efficientformer-l7_8xb128_in1k.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/datasets/imagenet_bs128_poolformer_small_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +model = dict( + type='ImageClassifier', + backbone=dict( + type='EfficientFormer', + arch='l7', + drop_path_rate=0, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-5) + ]), + neck=dict(type='GlobalAveragePooling', dim=1), + head=dict( + type='EfficientFormerClsHead', in_channels=768, num_classes=1000)) diff --git a/configs/efficientformer/metafile.yml b/configs/efficientformer/metafile.yml new file mode 100644 index 0000000..33c4786 --- /dev/null +++ b/configs/efficientformer/metafile.yml @@ -0,0 +1,67 @@ +Collections: + - Name: EfficientFormer + Metadata: + Training Data: ImageNet-1k + Architecture: + - Pooling + - 1x1 Convolution + - LayerScale + - MetaFormer + Paper: + URL: https://arxiv.org/pdf/2206.01191.pdf + Title: "EfficientFormer: Vision Transformers at MobileNet Speed" + README: configs/efficientformer/README.md + Code: + Version: v0.24.0 + URL: https://github.com/open-mmlab/mmclassification/blob/v0.24.0/mmcls/models/backbones/efficientformer.py + +Models: + - Name: efficientformer-l1_3rdparty_8xb128_in1k + Metadata: + FLOPs: 1304601088 # 1.3G + Parameters: 12278696 # 12M + In Collections: EfficientFormer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 80.46 + Top 5 Accuracy: 94.99 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientformer/efficientformer-l1_3rdparty_in1k_20220803-d66e61df.pth + Config: configs/efficientformer/efficientformer-l1_8xb128_in1k.py + Converted From: + Weights: https://drive.google.com/file/d/11SbX-3cfqTOc247xKYubrAjBiUmr818y/view?usp=sharing + Code: https://github.com/snap-research/EfficientFormer + - Name: efficientformer-l3_3rdparty_8xb128_in1k + Metadata: + Training Data: ImageNet-1k + FLOPs: 3737045760 # 3.7G + Parameters: 31406000 # 31M + In Collections: EfficientFormer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.45 + Top 5 Accuracy: 96.18 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientformer/efficientformer-l3_3rdparty_in1k_20220803-dde1c8c5.pth + Config: configs/efficientformer/efficientformer-l3_8xb128_in1k.py + Converted From: + Weights: https://drive.google.com/file/d/1OyyjKKxDyMj-BcfInp4GlDdwLu3hc30m/view?usp=sharing + Code: https://github.com/snap-research/EfficientFormer + - Name: efficientformer-l7_3rdparty_8xb128_in1k + Metadata: + FLOPs: 10163951616 # 10.2G + Parameters: 82229328 # 82M + In Collections: EfficientFormer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.40 + Top 5 Accuracy: 96.60 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientformer/efficientformer-l7_3rdparty_in1k_20220803-41a552bb.pth + Config: configs/efficientformer/efficientformer-l7_8xb128_in1k.py + Converted From: + Weights: https://drive.google.com/file/d/1cVw-pctJwgvGafeouynqWWCwgkcoFMM5/view?usp=sharing + Code: https://github.com/snap-research/EfficientFormer diff --git a/configs/efficientnet/README.md b/configs/efficientnet/README.md new file mode 100644 index 0000000..832f5c6 --- /dev/null +++ b/configs/efficientnet/README.md @@ -0,0 +1,62 @@ +# EfficientNet + +> [Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946v5) + + + +## Abstract + +Convolutional Neural Networks (ConvNets) are commonly developed at a fixed resource budget, and then scaled up for better accuracy if more resources are available. In this paper, we systematically study model scaling and identify that carefully balancing network depth, width, and resolution can lead to better performance. Based on this observation, we propose a new scaling method that uniformly scales all dimensions of depth/width/resolution using a simple yet highly effective compound coefficient. We demonstrate the effectiveness of this method on scaling up MobileNets and ResNet. To go even further, we use neural architecture search to design a new baseline network and scale it up to obtain a family of models, called EfficientNets, which achieve much better accuracy and efficiency than previous ConvNets. In particular, our EfficientNet-B7 achieves state-of-the-art 84.3% top-1 accuracy on ImageNet, while being 8.4x smaller and 6.1x faster on inference than the best existing ConvNet. Our EfficientNets also transfer well and achieve state-of-the-art accuracy on CIFAR-100 (91.7%), Flowers (98.8%), and 3 other transfer learning datasets, with an order of magnitude fewer parameters. + +
+ +
+ +## Results and models + +### ImageNet-1k + +In the result table, AA means trained with AutoAugment pre-processing, more details can be found in the [paper](https://arxiv.org/abs/1805.09501), and AdvProp is a method to train with adversarial examples, more details can be found in the [paper](https://arxiv.org/abs/1911.09665). + +Note: In MMClassification, we support training with AutoAugment, don't support AdvProp by now. + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :------------------------------: | :-------: | :------: | :-------: | :-------: | :---------------------------------------------------------------: | :------------------------------------------------------------------: | +| EfficientNet-B0\* | 5.29 | 0.02 | 76.74 | 93.17 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b0_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32_in1k_20220119-a7e2a0b1.pth) | +| EfficientNet-B0 (AA)\* | 5.29 | 0.02 | 77.26 | 93.41 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b0_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa_in1k_20220119-8d939117.pth) | +| EfficientNet-B0 (AA + AdvProp)\* | 5.29 | 0.02 | 77.53 | 93.61 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b0_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth) | +| EfficientNet-B1\* | 7.79 | 0.03 | 78.68 | 94.28 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b1_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b1_3rdparty_8xb32_in1k_20220119-002556d9.pth) | +| EfficientNet-B1 (AA)\* | 7.79 | 0.03 | 79.20 | 94.42 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b1_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b1_3rdparty_8xb32-aa_in1k_20220119-619d8ae3.pth) | +| EfficientNet-B1 (AA + AdvProp)\* | 7.79 | 0.03 | 79.52 | 94.43 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b1_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b1_3rdparty_8xb32-aa-advprop_in1k_20220119-5715267d.pth) | +| EfficientNet-B2\* | 9.11 | 0.03 | 79.64 | 94.80 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b2_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b2_3rdparty_8xb32_in1k_20220119-ea374a30.pth) | +| EfficientNet-B2 (AA)\* | 9.11 | 0.03 | 80.21 | 94.96 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b2_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b2_3rdparty_8xb32-aa_in1k_20220119-dd61e80b.pth) | +| EfficientNet-B2 (AA + AdvProp)\* | 9.11 | 0.03 | 80.45 | 95.07 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b2_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b2_3rdparty_8xb32-aa-advprop_in1k_20220119-1655338a.pth) | +| EfficientNet-B3\* | 12.23 | 0.06 | 81.01 | 95.34 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b3_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32_in1k_20220119-4b4d7487.pth) | +| EfficientNet-B3 (AA)\* | 12.23 | 0.06 | 81.58 | 95.67 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b3_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa_in1k_20220119-5b4887a0.pth) | +| EfficientNet-B3 (AA + AdvProp)\* | 12.23 | 0.06 | 81.81 | 95.69 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b3_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa-advprop_in1k_20220119-53b41118.pth) | +| EfficientNet-B4\* | 19.34 | 0.12 | 82.57 | 96.09 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b4_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b4_3rdparty_8xb32_in1k_20220119-81fd4077.pth) | +| EfficientNet-B4 (AA)\* | 19.34 | 0.12 | 82.95 | 96.26 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b4_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b4_3rdparty_8xb32-aa_in1k_20220119-45b8bd2b.pth) | +| EfficientNet-B4 (AA + AdvProp)\* | 19.34 | 0.12 | 83.25 | 96.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b4_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b4_3rdparty_8xb32-aa-advprop_in1k_20220119-38c2238c.pth) | +| EfficientNet-B5\* | 30.39 | 0.24 | 83.18 | 96.47 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b5_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b5_3rdparty_8xb32_in1k_20220119-e9814430.pth) | +| EfficientNet-B5 (AA)\* | 30.39 | 0.24 | 83.82 | 96.76 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b5_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b5_3rdparty_8xb32-aa_in1k_20220119-2cab8b78.pth) | +| EfficientNet-B5 (AA + AdvProp)\* | 30.39 | 0.24 | 84.21 | 96.98 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b5_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b5_3rdparty_8xb32-aa-advprop_in1k_20220119-f57a895a.pth) | +| EfficientNet-B6 (AA)\* | 43.04 | 0.41 | 84.05 | 96.82 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b6_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b6_3rdparty_8xb32-aa_in1k_20220119-45b03310.pth) | +| EfficientNet-B6 (AA + AdvProp)\* | 43.04 | 0.41 | 84.74 | 97.14 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b6_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b6_3rdparty_8xb32-aa-advprop_in1k_20220119-bfe3485e.pth) | +| EfficientNet-B7 (AA)\* | 66.35 | 0.72 | 84.38 | 96.88 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b7_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b7_3rdparty_8xb32-aa_in1k_20220119-bf03951c.pth) | +| EfficientNet-B7 (AA + AdvProp)\* | 66.35 | 0.72 | 85.14 | 97.23 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b7_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b7_3rdparty_8xb32-aa-advprop_in1k_20220119-c6dbff10.pth) | +| EfficientNet-B8 (AA + AdvProp)\* | 87.41 | 1.09 | 85.38 | 97.28 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b8_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b8_3rdparty_8xb32-aa-advprop_in1k_20220119-297ce1b7.pth) | + +*Models with * are converted from the [official repo](https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +``` +@inproceedings{tan2019efficientnet, + title={Efficientnet: Rethinking model scaling for convolutional neural networks}, + author={Tan, Mingxing and Le, Quoc}, + booktitle={International Conference on Machine Learning}, + pages={6105--6114}, + year={2019}, + organization={PMLR} +} +``` diff --git a/configs/efficientnet/efficientnet-b0_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-b0_8xb32-01norm_in1k.py new file mode 100644 index 0000000..fbb490d --- /dev/null +++ b/configs/efficientnet/efficientnet-b0_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b0.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=224, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b0_8xb32_in1k.py b/configs/efficientnet/efficientnet-b0_8xb32_in1k.py new file mode 100644 index 0000000..33931e5 --- /dev/null +++ b/configs/efficientnet/efficientnet-b0_8xb32_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b0.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=224, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b1_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-b1_8xb32-01norm_in1k.py new file mode 100644 index 0000000..6b66395 --- /dev/null +++ b/configs/efficientnet/efficientnet-b1_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b1.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=240, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=240, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b1_8xb32_in1k.py b/configs/efficientnet/efficientnet-b1_8xb32_in1k.py new file mode 100644 index 0000000..d702a15 --- /dev/null +++ b/configs/efficientnet/efficientnet-b1_8xb32_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b1.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=240, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=240, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b2_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-b2_8xb32-01norm_in1k.py new file mode 100644 index 0000000..ae8cda8 --- /dev/null +++ b/configs/efficientnet/efficientnet-b2_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b2.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=260, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=260, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b2_8xb32_in1k.py b/configs/efficientnet/efficientnet-b2_8xb32_in1k.py new file mode 100644 index 0000000..53f7c84 --- /dev/null +++ b/configs/efficientnet/efficientnet-b2_8xb32_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b2.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=260, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=260, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b3_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-b3_8xb32-01norm_in1k.py new file mode 100644 index 0000000..dfd3f92 --- /dev/null +++ b/configs/efficientnet/efficientnet-b3_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b3.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=300, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=300, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b3_8xb32_in1k.py b/configs/efficientnet/efficientnet-b3_8xb32_in1k.py new file mode 100644 index 0000000..2838713 --- /dev/null +++ b/configs/efficientnet/efficientnet-b3_8xb32_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b3.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=300, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=300, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b4_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-b4_8xb32-01norm_in1k.py new file mode 100644 index 0000000..333a19a --- /dev/null +++ b/configs/efficientnet/efficientnet-b4_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b4.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=380, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=380, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b4_8xb32_in1k.py b/configs/efficientnet/efficientnet-b4_8xb32_in1k.py new file mode 100644 index 0000000..82f06cd --- /dev/null +++ b/configs/efficientnet/efficientnet-b4_8xb32_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b4.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=380, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=380, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b5_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-b5_8xb32-01norm_in1k.py new file mode 100644 index 0000000..f66855c --- /dev/null +++ b/configs/efficientnet/efficientnet-b5_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b5.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=456, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=456, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b5_8xb32_in1k.py b/configs/efficientnet/efficientnet-b5_8xb32_in1k.py new file mode 100644 index 0000000..9b0eaab --- /dev/null +++ b/configs/efficientnet/efficientnet-b5_8xb32_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b5.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=456, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=456, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b6_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-b6_8xb32-01norm_in1k.py new file mode 100644 index 0000000..da64e0e --- /dev/null +++ b/configs/efficientnet/efficientnet-b6_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b6.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=528, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=528, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b6_8xb32_in1k.py b/configs/efficientnet/efficientnet-b6_8xb32_in1k.py new file mode 100644 index 0000000..6e03bb4 --- /dev/null +++ b/configs/efficientnet/efficientnet-b6_8xb32_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b6.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=528, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=528, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b7_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-b7_8xb32-01norm_in1k.py new file mode 100644 index 0000000..27c19fc --- /dev/null +++ b/configs/efficientnet/efficientnet-b7_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b7.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=600, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=600, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b7_8xb32_in1k.py b/configs/efficientnet/efficientnet-b7_8xb32_in1k.py new file mode 100644 index 0000000..5146383 --- /dev/null +++ b/configs/efficientnet/efficientnet-b7_8xb32_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b7.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=600, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=600, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b8_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-b8_8xb32-01norm_in1k.py new file mode 100644 index 0000000..25540a1 --- /dev/null +++ b/configs/efficientnet/efficientnet-b8_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b8.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=672, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=672, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-b8_8xb32_in1k.py b/configs/efficientnet/efficientnet-b8_8xb32_in1k.py new file mode 100644 index 0000000..4ff28c0 --- /dev/null +++ b/configs/efficientnet/efficientnet-b8_8xb32_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_b8.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=672, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=672, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-em_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-em_8xb32-01norm_in1k.py new file mode 100644 index 0000000..faa5386 --- /dev/null +++ b/configs/efficientnet/efficientnet-em_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_em.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=240, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=240, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/efficientnet-es_8xb32-01norm_in1k.py b/configs/efficientnet/efficientnet-es_8xb32-01norm_in1k.py new file mode 100644 index 0000000..5f11746 --- /dev/null +++ b/configs/efficientnet/efficientnet-es_8xb32-01norm_in1k.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/efficientnet_es.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=224, + efficientnet_style=True, + interpolation='bicubic'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/efficientnet/metafile.yml b/configs/efficientnet/metafile.yml new file mode 100644 index 0000000..c8bbf0d --- /dev/null +++ b/configs/efficientnet/metafile.yml @@ -0,0 +1,391 @@ +Collections: + - Name: EfficientNet + Metadata: + Training Data: ImageNet-1k + Architecture: + - 1x1 Convolution + - Average Pooling + - Convolution + - Dense Connections + - Dropout + - Inverted Residual Block + - RMSProp + - Squeeze-and-Excitation Block + - Swish + Paper: + URL: https://arxiv.org/abs/1905.11946v5 + Title: "EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks" + README: configs/efficientnet/README.md + Code: + Version: v0.20.1 + URL: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/efficientnet.py + +Models: + - Name: efficientnet-b0_3rdparty_8xb32_in1k + Metadata: + FLOPs: 16481180 + Parameters: 5288548 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 76.74 + Top 5 Accuracy: 93.17 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32_in1k_20220119-a7e2a0b1.pth + Config: configs/efficientnet/efficientnet-b0_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckpts/efficientnet-b0.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b0_3rdparty_8xb32-aa_in1k + Metadata: + FLOPs: 16481180 + Parameters: 5288548 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.26 + Top 5 Accuracy: 93.41 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa_in1k_20220119-8d939117.pth + Config: configs/efficientnet/efficientnet-b0_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckptsaug/efficientnet-b0.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k + Metadata: + FLOPs: 16481180 + Parameters: 5288548 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.53 + Top 5 Accuracy: 93.61 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth + Config: configs/efficientnet/efficientnet-b0_8xb32-01norm_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/advprop/efficientnet-b0.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b1_3rdparty_8xb32_in1k + Metadata: + FLOPs: 27052224 + Parameters: 7794184 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.68 + Top 5 Accuracy: 94.28 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b1_3rdparty_8xb32_in1k_20220119-002556d9.pth + Config: configs/efficientnet/efficientnet-b1_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckpts/efficientnet-b1.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b1_3rdparty_8xb32-aa_in1k + Metadata: + FLOPs: 27052224 + Parameters: 7794184 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.20 + Top 5 Accuracy: 94.42 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b1_3rdparty_8xb32-aa_in1k_20220119-619d8ae3.pth + Config: configs/efficientnet/efficientnet-b1_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckptsaug/efficientnet-b1.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b1_3rdparty_8xb32-aa-advprop_in1k + Metadata: + FLOPs: 27052224 + Parameters: 7794184 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.52 + Top 5 Accuracy: 94.43 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b1_3rdparty_8xb32-aa-advprop_in1k_20220119-5715267d.pth + Config: configs/efficientnet/efficientnet-b1_8xb32-01norm_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/advprop/efficientnet-b1.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b2_3rdparty_8xb32_in1k + Metadata: + FLOPs: 34346386 + Parameters: 9109994 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.64 + Top 5 Accuracy: 94.80 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b2_3rdparty_8xb32_in1k_20220119-ea374a30.pth + Config: configs/efficientnet/efficientnet-b2_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckpts/efficientnet-b2.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b2_3rdparty_8xb32-aa_in1k + Metadata: + FLOPs: 34346386 + Parameters: 9109994 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 80.21 + Top 5 Accuracy: 94.96 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b2_3rdparty_8xb32-aa_in1k_20220119-dd61e80b.pth + Config: configs/efficientnet/efficientnet-b2_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckptsaug/efficientnet-b2.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b2_3rdparty_8xb32-aa-advprop_in1k + Metadata: + FLOPs: 34346386 + Parameters: 9109994 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 80.45 + Top 5 Accuracy: 95.07 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b2_3rdparty_8xb32-aa-advprop_in1k_20220119-1655338a.pth + Config: configs/efficientnet/efficientnet-b2_8xb32-01norm_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/advprop/efficientnet-b2.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b3_3rdparty_8xb32_in1k + Metadata: + FLOPs: 58641904 + Parameters: 12233232 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.01 + Top 5 Accuracy: 95.34 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32_in1k_20220119-4b4d7487.pth + Config: configs/efficientnet/efficientnet-b3_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckpts/efficientnet-b3.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b3_3rdparty_8xb32-aa_in1k + Metadata: + FLOPs: 58641904 + Parameters: 12233232 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.58 + Top 5 Accuracy: 95.67 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa_in1k_20220119-5b4887a0.pth + Config: configs/efficientnet/efficientnet-b3_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckptsaug/efficientnet-b3.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b3_3rdparty_8xb32-aa-advprop_in1k + Metadata: + FLOPs: 58641904 + Parameters: 12233232 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.81 + Top 5 Accuracy: 95.69 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa-advprop_in1k_20220119-53b41118.pth + Config: configs/efficientnet/efficientnet-b3_8xb32-01norm_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/advprop/efficientnet-b3.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b4_3rdparty_8xb32_in1k + Metadata: + FLOPs: 121870624 + Parameters: 19341616 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.57 + Top 5 Accuracy: 96.09 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b4_3rdparty_8xb32_in1k_20220119-81fd4077.pth + Config: configs/efficientnet/efficientnet-b4_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckpts/efficientnet-b4.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b4_3rdparty_8xb32-aa_in1k + Metadata: + FLOPs: 121870624 + Parameters: 19341616 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.95 + Top 5 Accuracy: 96.26 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b4_3rdparty_8xb32-aa_in1k_20220119-45b8bd2b.pth + Config: configs/efficientnet/efficientnet-b4_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckptsaug/efficientnet-b4.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b4_3rdparty_8xb32-aa-advprop_in1k + Metadata: + FLOPs: 121870624 + Parameters: 19341616 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.25 + Top 5 Accuracy: 96.44 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b4_3rdparty_8xb32-aa-advprop_in1k_20220119-38c2238c.pth + Config: configs/efficientnet/efficientnet-b4_8xb32-01norm_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/advprop/efficientnet-b4.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b5_3rdparty_8xb32_in1k + Metadata: + FLOPs: 243879440 + Parameters: 30389784 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.18 + Top 5 Accuracy: 96.47 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b5_3rdparty_8xb32_in1k_20220119-e9814430.pth + Config: configs/efficientnet/efficientnet-b5_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckpts/efficientnet-b5.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b5_3rdparty_8xb32-aa_in1k + Metadata: + FLOPs: 243879440 + Parameters: 30389784 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.82 + Top 5 Accuracy: 96.76 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b5_3rdparty_8xb32-aa_in1k_20220119-2cab8b78.pth + Config: configs/efficientnet/efficientnet-b5_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckptsaug/efficientnet-b5.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b5_3rdparty_8xb32-aa-advprop_in1k + Metadata: + FLOPs: 243879440 + Parameters: 30389784 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.21 + Top 5 Accuracy: 96.98 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b5_3rdparty_8xb32-aa-advprop_in1k_20220119-f57a895a.pth + Config: configs/efficientnet/efficientnet-b5_8xb32-01norm_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/advprop/efficientnet-b5.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b6_3rdparty_8xb32-aa_in1k + Metadata: + FLOPs: 412002408 + Parameters: 43040704 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.05 + Top 5 Accuracy: 96.82 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b6_3rdparty_8xb32-aa_in1k_20220119-45b03310.pth + Config: configs/efficientnet/efficientnet-b6_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckptsaug/efficientnet-b6.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b6_3rdparty_8xb32-aa-advprop_in1k + Metadata: + FLOPs: 412002408 + Parameters: 43040704 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.74 + Top 5 Accuracy: 97.14 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b6_3rdparty_8xb32-aa-advprop_in1k_20220119-bfe3485e.pth + Config: configs/efficientnet/efficientnet-b6_8xb32-01norm_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/advprop/efficientnet-b6.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b7_3rdparty_8xb32-aa_in1k + Metadata: + FLOPs: 715526512 + Parameters: 66347960 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.38 + Top 5 Accuracy: 96.88 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b7_3rdparty_8xb32-aa_in1k_20220119-bf03951c.pth + Config: configs/efficientnet/efficientnet-b7_8xb32_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/ckptsaug/efficientnet-b7.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b7_3rdparty_8xb32-aa-advprop_in1k + Metadata: + FLOPs: 715526512 + Parameters: 66347960 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 85.14 + Top 5 Accuracy: 97.23 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b7_3rdparty_8xb32-aa-advprop_in1k_20220119-c6dbff10.pth + Config: configs/efficientnet/efficientnet-b7_8xb32-01norm_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/advprop/efficientnet-b7.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet + - Name: efficientnet-b8_3rdparty_8xb32-aa-advprop_in1k + Metadata: + FLOPs: 1092755326 + Parameters: 87413142 + In Collections: EfficientNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 85.38 + Top 5 Accuracy: 97.28 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b8_3rdparty_8xb32-aa-advprop_in1k_20220119-297ce1b7.pth + Config: configs/efficientnet/efficientnet-b8_8xb32-01norm_in1k.py + Converted From: + Weights: https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/advprop/efficientnet-b8.tar.gz + Code: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet diff --git a/configs/fp16/resnet50_b32x8_fp16_dynamic_imagenet.py b/configs/fp16/resnet50_b32x8_fp16_dynamic_imagenet.py new file mode 100644 index 0000000..9075a89 --- /dev/null +++ b/configs/fp16/resnet50_b32x8_fp16_dynamic_imagenet.py @@ -0,0 +1,6 @@ +_base_ = '../resnet/resnet50_8xb32-fp16-dynamic_in1k.py' + +_deprecation_ = dict( + expected='../resnet/resnet50_8xb32-fp16-dynamic_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/fp16/resnet50_b32x8_fp16_imagenet.py b/configs/fp16/resnet50_b32x8_fp16_imagenet.py new file mode 100644 index 0000000..a73a409 --- /dev/null +++ b/configs/fp16/resnet50_b32x8_fp16_imagenet.py @@ -0,0 +1,6 @@ +_base_ = '../resnet/resnet50_8xb32-fp16_in1k.py' + +_deprecation_ = dict( + expected='../resnet/resnet50_8xb32-fp16_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/gpvit/gpvit_l1.py b/configs/gpvit/gpvit_l1.py new file mode 100644 index 0000000..56a4874 --- /dev/null +++ b/configs/gpvit/gpvit_l1.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/datasets/imagenet_bs64_swin_224_lmdb.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='GPViT', + arch='L1', + img_size=224, + drop_path_rate=-1, # dpr is in arch config + att_with_cp=False, + group_with_cp=False), + neck=dict(type='GroupNeck', embed_dims=216), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=216, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + topk=(1, 5)), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) + +# data settings +samples_per_gpu=128 +data = dict(samples_per_gpu=samples_per_gpu, workers_per_gpu=4) + +# opt settings +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + }) +world_size = 16 +optimizer = dict( + lr=5e-4 * samples_per_gpu * world_size / 512, + paramwise_cfg=paramwise_cfg) +lr_config = dict(warmup_iters=15) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# other running settings +checkpoint_config = dict(interval=5, max_keep_ckpts=5) +evaluation = dict(interval=5, metric='accuracy') +fp16 = None # make sure fp16 (mm version) is None when using AMP optimizer +runner = dict(type='AmpEpochBasedRunner') +work_dir = 'work_dirs/gpvit_l1' diff --git a/configs/gpvit/gpvit_l2.py b/configs/gpvit/gpvit_l2.py new file mode 100644 index 0000000..5261395 --- /dev/null +++ b/configs/gpvit/gpvit_l2.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/datasets/imagenet_bs64_swin_224_lmdb.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='GPViT', + arch='L2', + img_size=224, + drop_path_rate=-1, # dpr is in arch config + att_with_cp=False, + group_with_cp=False), + neck=dict(type='GroupNeck', embed_dims=348), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=348, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + topk=(1, 5)), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) + +# data settings +samples_per_gpu=128 +data = dict(samples_per_gpu=samples_per_gpu, workers_per_gpu=4) + +# opt settings +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + }) +world_size = 16 +optimizer = dict( + lr=5e-4 * samples_per_gpu * world_size / 512, + paramwise_cfg=paramwise_cfg) +lr_config = dict(warmup_iters=15) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# other running settings +checkpoint_config = dict(interval=5, max_keep_ckpts=5) +evaluation = dict(interval=5, metric='accuracy') +fp16 = None # make sure fp16 (mm version) is None when using AMP optimizer +runner = dict(type='AmpEpochBasedRunner') +work_dir = 'work_dirs/gpvit_l2' diff --git a/configs/gpvit/gpvit_l3.py b/configs/gpvit/gpvit_l3.py new file mode 100644 index 0000000..0fb1868 --- /dev/null +++ b/configs/gpvit/gpvit_l3.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/datasets/imagenet_bs64_swin_224_lmdb.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='GPViT', + arch='L3', + img_size=224, + drop_path_rate=-1, # dpr is in arch config + att_with_cp=False, + group_with_cp=False), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=432, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + topk=(1, 5)), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) + +# data settings +samples_per_gpu=128 +data = dict(samples_per_gpu=samples_per_gpu, workers_per_gpu=4) + +# opt settings +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + }) +world_size = 16 +optimizer = dict( + lr=5e-4 * samples_per_gpu * world_size / 512, + paramwise_cfg=paramwise_cfg) +lr_config = dict(warmup_iters=15) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# other running settings +checkpoint_config = dict(interval=5, max_keep_ckpts=5) +evaluation = dict(interval=5, metric='accuracy') +fp16 = None # make sure fp16 (mm version) is None when using AMP optimizer +runner = dict(type='AmpEpochBasedRunner') +work_dir = 'work_dirs/gpvit_l3' diff --git a/configs/gpvit/gpvit_l4.py b/configs/gpvit/gpvit_l4.py new file mode 100644 index 0000000..9bddb42 --- /dev/null +++ b/configs/gpvit/gpvit_l4.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/datasets/imagenet_bs64_swin_224_lmdb.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='GPViT', + arch='L4', + img_size=224, + drop_path_rate=-1, # dpr is in arch config + att_with_cp=False, + group_with_cp=False), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=624, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + topk=(1, 5)), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) + +# data settings +samples_per_gpu=128 +data = dict(samples_per_gpu=samples_per_gpu, workers_per_gpu=4) + +# opt settings +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + }) +world_size = 16 +optimizer = dict( + lr=5e-4 * samples_per_gpu * world_size / 512, + paramwise_cfg=paramwise_cfg) +lr_config = dict(warmup_iters=15) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# other running settings +checkpoint_config = dict(interval=5, max_keep_ckpts=5) +evaluation = dict(interval=5, metric='accuracy') +fp16 = None # make sure fp16 (mm version) is None when using AMP optimizer +runner = dict(type='AmpEpochBasedRunner') +work_dir = 'work_dirs/gpvit_l4' diff --git a/configs/hornet/README.md b/configs/hornet/README.md new file mode 100644 index 0000000..7c1b9a9 --- /dev/null +++ b/configs/hornet/README.md @@ -0,0 +1,51 @@ +# HorNet + +> [HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions](https://arxiv.org/pdf/2207.14284v2.pdf) + + + +## Abstract + +Recent progress in vision Transformers exhibits great success in various tasks driven by the new spatial modeling mechanism based on dot-product self-attention. In this paper, we show that the key ingredients behind the vision Transformers, namely input-adaptive, long-range and high-order spatial interactions, can also be efficiently implemented with a convolution-based framework. We present the Recursive Gated Convolution (g nConv) that performs high-order spatial interactions with gated convolutions and recursive designs. The new operation is highly flexible and customizable, which is compatible with various variants of convolution and extends the two-order interactions in self-attention to arbitrary orders without introducing significant extra computation. g nConv can serve as a plug-and-play module to improve various vision Transformers and convolution-based models. Based on the operation, we construct a new family of generic vision backbones named HorNet. Extensive experiments on ImageNet classification, COCO object detection and ADE20K semantic segmentation show HorNet outperform Swin Transformers and ConvNeXt by a significant margin with similar overall architecture and training configurations. HorNet also shows favorable scalability to more training data and a larger model size. Apart from the effectiveness in visual encoders, we also show g nConv can be applied to task-specific decoders and consistently improve dense prediction performance with less computation. Our results demonstrate that g nConv can be a new basic module for visual modeling that effectively combines the merits of both vision Transformers and CNNs. Code is available at https://github.com/raoyongming/HorNet. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Pretrain | resolution | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------: | :----------: | :--------: | :-------: | :------: | :-------: | :-------: | :--------------------------------------------------------------: | :----------------------------------------------------------------: | +| HorNet-T\* | From scratch | 224x224 | 22.41 | 3.98 | 82.84 | 96.24 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hornet/hornet-tiny_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hornet/hornet-tiny_3rdparty_in1k_20220915-0e8eedff.pth) | +| HorNet-T-GF\* | From scratch | 224x224 | 22.99 | 3.9 | 82.98 | 96.38 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hornet/hornet-tiny-gf_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hornet/hornet-tiny-gf_3rdparty_in1k_20220915-4c35a66b.pth) | +| HorNet-S\* | From scratch | 224x224 | 49.53 | 8.83 | 83.79 | 96.75 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hornet/hornet-small_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hornet/hornet-small_3rdparty_in1k_20220915-5935f60f.pth) | +| HorNet-S-GF\* | From scratch | 224x224 | 50.4 | 8.71 | 83.98 | 96.77 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hornet/hornet-small-gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hornet/hornet-small-gf_3rdparty_in1k_20220915-649ca492.pth) | +| HorNet-B\* | From scratch | 224x224 | 87.26 | 15.59 | 84.24 | 96.94 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hornet/hornet-base_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hornet/hornet-base_3rdparty_in1k_20220915-a06176bb.pth) | +| HorNet-B-GF\* | From scratch | 224x224 | 88.42 | 15.42 | 84.32 | 96.95 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hornet/hornet-base-gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hornet/hornet-base-gf_3rdparty_in1k_20220915-82c06fa7.pth) | + +\*Models with * are converted from [the official repo](https://github.com/raoyongming/HorNet). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results. + +### Pre-trained Models + +The pre-trained models on ImageNet-21k are used to fine-tune on the downstream tasks. + +| Model | Pretrain | resolution | Params(M) | Flops(G) | Download | +| :--------------: | :----------: | :--------: | :-------: | :------: | :------------------------------------------------------------------------------------------------------------------------: | +| HorNet-L\* | ImageNet-21k | 224x224 | 194.54 | 34.83 | [model](https://download.openmmlab.com/mmclassification/v0/hornet/hornet-large_3rdparty_in21k_20220909-9ccef421.pth) | +| HorNet-L-GF\* | ImageNet-21k | 224x224 | 196.29 | 34.58 | [model](https://download.openmmlab.com/mmclassification/v0/hornet/hornet-large-gf_3rdparty_in21k_20220909-3aea3b61.pth) | +| HorNet-L-GF384\* | ImageNet-21k | 384x384 | 201.23 | 101.63 | [model](https://download.openmmlab.com/mmclassification/v0/hornet/hornet-large-gf384_3rdparty_in21k_20220909-80894290.pth) | + +\*Models with * are converted from [the official repo](https://github.com/raoyongming/HorNet). + +## Citation + +``` +@article{rao2022hornet, + title={HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions}, + author={Rao, Yongming and Zhao, Wenliang and Tang, Yansong and Zhou, Jie and Lim, Ser-Lam and Lu, Jiwen}, + journal={arXiv preprint arXiv:2207.14284}, + year={2022} +} +``` diff --git a/configs/hornet/hornet-base-gf_8xb64_in1k.py b/configs/hornet/hornet-base-gf_8xb64_in1k.py new file mode 100644 index 0000000..6c29de6 --- /dev/null +++ b/configs/hornet/hornet-base-gf_8xb64_in1k.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/hornet/hornet-base-gf.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=64) + +optimizer = dict(lr=4e-3) +optimizer_config = dict(grad_clip=dict(max_norm=1.0), _delete_=True) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/hornet/hornet-base_8xb64_in1k.py b/configs/hornet/hornet-base_8xb64_in1k.py new file mode 100644 index 0000000..969d8b9 --- /dev/null +++ b/configs/hornet/hornet-base_8xb64_in1k.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/hornet/hornet-base.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=64) + +optimizer = dict(lr=4e-3) +optimizer_config = dict(grad_clip=dict(max_norm=5.0), _delete_=True) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/hornet/hornet-small-gf_8xb64_in1k.py b/configs/hornet/hornet-small-gf_8xb64_in1k.py new file mode 100644 index 0000000..deb570e --- /dev/null +++ b/configs/hornet/hornet-small-gf_8xb64_in1k.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/hornet/hornet-small-gf.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=64) + +optimizer = dict(lr=4e-3) +optimizer_config = dict(grad_clip=dict(max_norm=1.0), _delete_=True) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/hornet/hornet-small_8xb64_in1k.py b/configs/hornet/hornet-small_8xb64_in1k.py new file mode 100644 index 0000000..c07fa60 --- /dev/null +++ b/configs/hornet/hornet-small_8xb64_in1k.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/hornet/hornet-small.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=64) + +optimizer = dict(lr=4e-3) +optimizer_config = dict(grad_clip=dict(max_norm=5.0), _delete_=True) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/hornet/hornet-tiny-gf_8xb128_in1k.py b/configs/hornet/hornet-tiny-gf_8xb128_in1k.py new file mode 100644 index 0000000..3a1d1a7 --- /dev/null +++ b/configs/hornet/hornet-tiny-gf_8xb128_in1k.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/hornet/hornet-tiny-gf.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=128) + +optimizer = dict(lr=4e-3) +optimizer_config = dict(grad_clip=dict(max_norm=1.0), _delete_=True) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/hornet/hornet-tiny_8xb128_in1k.py b/configs/hornet/hornet-tiny_8xb128_in1k.py new file mode 100644 index 0000000..69a7cdf --- /dev/null +++ b/configs/hornet/hornet-tiny_8xb128_in1k.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/hornet/hornet-tiny.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +data = dict(samples_per_gpu=128) + +optimizer = dict(lr=4e-3) +optimizer_config = dict(grad_clip=dict(max_norm=100.0), _delete_=True) + +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] diff --git a/configs/hornet/metafile.yml b/configs/hornet/metafile.yml new file mode 100644 index 0000000..7120772 --- /dev/null +++ b/configs/hornet/metafile.yml @@ -0,0 +1,97 @@ +Collections: + - Name: HorNet + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - AdamW + - Weight Decay + Architecture: + - HorNet + - gnConv + Paper: + URL: https://arxiv.org/pdf/2207.14284v2.pdf + Title: "HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions" + README: configs/hornet/README.md + Code: + Version: v0.24.0 + URL: https://github.com/open-mmlab/mmclassification/blob/v0.24.0/mmcls/models/backbones/hornet.py + +Models: + - Name: hornet-tiny_3rdparty_in1k + Metadata: + FLOPs: 3980000000 # 3.98G + Parameters: 22410000 # 22.41M + In Collection: HorNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.84 + Top 5 Accuracy: 96.24 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hornet/hornet-tiny_3rdparty_in1k_20220915-0e8eedff.pth + Config: configs/hornet/hornet-tiny_8xb128_in1k.py + - Name: hornet-tiny-gf_3rdparty_in1k + Metadata: + FLOPs: 3900000000 # 3.9G + Parameters: 22990000 # 22.99M + In Collection: HorNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.98 + Top 5 Accuracy: 96.38 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hornet/hornet-tiny-gf_3rdparty_in1k_20220915-4c35a66b.pth + Config: configs/hornet/hornet-tiny-gf_8xb128_in1k.py + - Name: hornet-small_3rdparty_in1k + Metadata: + FLOPs: 8830000000 # 8.83G + Parameters: 49530000 # 49.53M + In Collection: HorNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.79 + Top 5 Accuracy: 96.75 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hornet/hornet-small_3rdparty_in1k_20220915-5935f60f.pth + Config: configs/hornet/hornet-small_8xb64_in1k.py + - Name: hornet-small-gf_3rdparty_in1k + Metadata: + FLOPs: 8710000000 # 8.71G + Parameters: 50400000 # 50.4M + In Collection: HorNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.98 + Top 5 Accuracy: 96.77 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hornet/hornet-small-gf_3rdparty_in1k_20220915-649ca492.pth + Config: configs/hornet/hornet-small-gf_8xb64_in1k.py + - Name: hornet-base_3rdparty_in1k + Metadata: + FLOPs: 15590000000 # 15.59G + Parameters: 87260000 # 87.26M + In Collection: HorNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.24 + Top 5 Accuracy: 96.94 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hornet/hornet-base_3rdparty_in1k_20220915-a06176bb.pth + Config: configs/hornet/hornet-base_8xb64_in1k.py + - Name: hornet-base-gf_3rdparty_in1k + Metadata: + FLOPs: 15420000000 # 15.42G + Parameters: 88420000 # 88.42M + In Collection: HorNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.32 + Top 5 Accuracy: 96.95 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hornet/hornet-base-gf_3rdparty_in1k_20220915-82c06fa7.pth + Config: configs/hornet/hornet-base-gf_8xb64_in1k.py diff --git a/configs/hrnet/README.md b/configs/hrnet/README.md new file mode 100644 index 0000000..0a30ccd --- /dev/null +++ b/configs/hrnet/README.md @@ -0,0 +1,44 @@ +# HRNet + +> [Deep High-Resolution Representation Learning for Visual Recognition](https://arxiv.org/abs/1908.07919v2) + + + +## Abstract + +High-resolution representations are essential for position-sensitive vision problems, such as human pose estimation, semantic segmentation, and object detection. Existing state-of-the-art frameworks first encode the input image as a low-resolution representation through a subnetwork that is formed by connecting high-to-low resolution convolutions *in series* (e.g., ResNet, VGGNet), and then recover the high-resolution representation from the encoded low-resolution representation. Instead, our proposed network, named as High-Resolution Network (HRNet), maintains high-resolution representations through the whole process. There are two key characteristics: (i) Connect the high-to-low resolution convolution streams *in parallel*; (ii) Repeatedly exchange the information across resolutions. The benefit is that the resulting representation is semantically richer and spatially more precise. We show the superiority of the proposed HRNet in a wide range of applications, including human pose estimation, semantic segmentation, and object detection, suggesting that the HRNet is a stronger backbone for computer vision problems. + +
+ +
+ +## Results and models + +## ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :----------------: | :-------: | :------: | :-------: | :-------: | :----------------------------------------------------------------------: | :-------------------------------------------------------------------------: | +| HRNet-W18\* | 21.30 | 4.33 | 76.75 | 93.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w18_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w18_3rdparty_8xb32_in1k_20220120-0c10b180.pth) | +| HRNet-W30\* | 37.71 | 8.17 | 78.19 | 94.22 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w30_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w30_3rdparty_8xb32_in1k_20220120-8aa3832f.pth) | +| HRNet-W32\* | 41.23 | 8.99 | 78.44 | 94.19 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w32_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w32_3rdparty_8xb32_in1k_20220120-c394f1ab.pth) | +| HRNet-W40\* | 57.55 | 12.77 | 78.94 | 94.47 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w40_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w40_3rdparty_8xb32_in1k_20220120-9a2dbfc5.pth) | +| HRNet-W44\* | 67.06 | 14.96 | 78.88 | 94.37 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w44_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w44_3rdparty_8xb32_in1k_20220120-35d07f73.pth) | +| HRNet-W48\* | 77.47 | 17.36 | 79.32 | 94.52 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w48_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w48_3rdparty_8xb32_in1k_20220120-e555ef50.pth) | +| HRNet-W64\* | 128.06 | 29.00 | 79.46 | 94.65 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w64_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w64_3rdparty_8xb32_in1k_20220120-19126642.pth) | +| HRNet-W18 (ssld)\* | 21.30 | 4.33 | 81.06 | 95.70 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w18_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w18_3rdparty_8xb32-ssld_in1k_20220120-455f69ea.pth) | +| HRNet-W48 (ssld)\* | 77.47 | 17.36 | 83.63 | 96.79 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w48_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w48_3rdparty_8xb32-ssld_in1k_20220120-d0459c38.pth) | + +*Models with * are converted from the [official repo](https://github.com/HRNet/HRNet-Image-Classification). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +``` +@article{WangSCJDZLMTWLX19, + title={Deep High-Resolution Representation Learning for Visual Recognition}, + author={Jingdong Wang and Ke Sun and Tianheng Cheng and + Borui Jiang and Chaorui Deng and Yang Zhao and Dong Liu and Yadong Mu and + Mingkui Tan and Xinggang Wang and Wenyu Liu and Bin Xiao}, + journal = {TPAMI} + year={2019} +} +``` diff --git a/configs/hrnet/hrnet-w18_4xb32_in1k.py b/configs/hrnet/hrnet-w18_4xb32_in1k.py new file mode 100644 index 0000000..a84fe67 --- /dev/null +++ b/configs/hrnet/hrnet-w18_4xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/hrnet/hrnet-w18.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256_coslr.py', + '../_base_/default_runtime.py' +] diff --git a/configs/hrnet/hrnet-w30_4xb32_in1k.py b/configs/hrnet/hrnet-w30_4xb32_in1k.py new file mode 100644 index 0000000..d2a9c0d --- /dev/null +++ b/configs/hrnet/hrnet-w30_4xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/hrnet/hrnet-w30.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256_coslr.py', + '../_base_/default_runtime.py' +] diff --git a/configs/hrnet/hrnet-w32_4xb32_in1k.py b/configs/hrnet/hrnet-w32_4xb32_in1k.py new file mode 100644 index 0000000..91380a9 --- /dev/null +++ b/configs/hrnet/hrnet-w32_4xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/hrnet/hrnet-w32.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256_coslr.py', + '../_base_/default_runtime.py' +] diff --git a/configs/hrnet/hrnet-w40_4xb32_in1k.py b/configs/hrnet/hrnet-w40_4xb32_in1k.py new file mode 100644 index 0000000..5d35cec --- /dev/null +++ b/configs/hrnet/hrnet-w40_4xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/hrnet/hrnet-w40.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256_coslr.py', + '../_base_/default_runtime.py' +] diff --git a/configs/hrnet/hrnet-w44_4xb32_in1k.py b/configs/hrnet/hrnet-w44_4xb32_in1k.py new file mode 100644 index 0000000..ce6bb41 --- /dev/null +++ b/configs/hrnet/hrnet-w44_4xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/hrnet/hrnet-w44.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256_coslr.py', + '../_base_/default_runtime.py' +] diff --git a/configs/hrnet/hrnet-w48_4xb32_in1k.py b/configs/hrnet/hrnet-w48_4xb32_in1k.py new file mode 100644 index 0000000..6943892 --- /dev/null +++ b/configs/hrnet/hrnet-w48_4xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/hrnet/hrnet-w48.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256_coslr.py', + '../_base_/default_runtime.py' +] diff --git a/configs/hrnet/hrnet-w64_4xb32_in1k.py b/configs/hrnet/hrnet-w64_4xb32_in1k.py new file mode 100644 index 0000000..0009bc6 --- /dev/null +++ b/configs/hrnet/hrnet-w64_4xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/hrnet/hrnet-w64.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256_coslr.py', + '../_base_/default_runtime.py' +] diff --git a/configs/hrnet/metafile.yml b/configs/hrnet/metafile.yml new file mode 100644 index 0000000..64fe142 --- /dev/null +++ b/configs/hrnet/metafile.yml @@ -0,0 +1,162 @@ +Collections: + - Name: HRNet + Metadata: + Training Data: ImageNet-1k + Architecture: + - Batch Normalization + - Convolution + - ReLU + - Residual Connection + Paper: + URL: https://arxiv.org/abs/1908.07919v2 + Title: "Deep High-Resolution Representation Learning for Visual Recognition" + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/hrnet.py + Version: v0.20.1 + +Models: + - Name: hrnet-w18_3rdparty_8xb32_in1k + Metadata: + FLOPs: 4330397932 + Parameters: 21295164 + In Collection: HRNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 76.75 + Top 5 Accuracy: 93.44 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w18_3rdparty_8xb32_in1k_20220120-0c10b180.pth + Config: configs/hrnet/hrnet-w18_4xb32_in1k.py + Converted From: + Weights: https://1drv.ms/u/s!Aus8VCZ_C_33cMkPimlmClRvmpw + Code: https://github.com/HRNet/HRNet-Image-Classification + - Name: hrnet-w30_3rdparty_8xb32_in1k + Metadata: + FLOPs: 8168305684 + Parameters: 37708380 + In Collection: HRNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.19 + Top 5 Accuracy: 94.22 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w30_3rdparty_8xb32_in1k_20220120-8aa3832f.pth + Config: configs/hrnet/hrnet-w30_4xb32_in1k.py + Converted From: + Weights: https://1drv.ms/u/s!Aus8VCZ_C_33cQoACCEfrzcSaVI + Code: https://github.com/HRNet/HRNet-Image-Classification + - Name: hrnet-w32_3rdparty_8xb32_in1k + Metadata: + FLOPs: 8986267584 + Parameters: 41228840 + In Collection: HRNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.44 + Top 5 Accuracy: 94.19 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w32_3rdparty_8xb32_in1k_20220120-c394f1ab.pth + Config: configs/hrnet/hrnet-w32_4xb32_in1k.py + Converted From: + Weights: https://1drv.ms/u/s!Aus8VCZ_C_33dYBMemi9xOUFR0w + Code: https://github.com/HRNet/HRNet-Image-Classification + - Name: hrnet-w40_3rdparty_8xb32_in1k + Metadata: + FLOPs: 12767574064 + Parameters: 57553320 + In Collection: HRNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.94 + Top 5 Accuracy: 94.47 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w40_3rdparty_8xb32_in1k_20220120-9a2dbfc5.pth + Config: configs/hrnet/hrnet-w40_4xb32_in1k.py + Converted From: + Weights: https://1drv.ms/u/s!Aus8VCZ_C_33ck0gvo5jfoWBOPo + Code: https://github.com/HRNet/HRNet-Image-Classification + - Name: hrnet-w44_3rdparty_8xb32_in1k + Metadata: + FLOPs: 14963902632 + Parameters: 67061144 + In Collection: HRNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.88 + Top 5 Accuracy: 94.37 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w44_3rdparty_8xb32_in1k_20220120-35d07f73.pth + Config: configs/hrnet/hrnet-w44_4xb32_in1k.py + Converted From: + Weights: https://1drv.ms/u/s!Aus8VCZ_C_33czZQ0woUb980gRs + Code: https://github.com/HRNet/HRNet-Image-Classification + - Name: hrnet-w48_3rdparty_8xb32_in1k + Metadata: + FLOPs: 17364014752 + Parameters: 77466024 + In Collection: HRNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.32 + Top 5 Accuracy: 94.52 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w48_3rdparty_8xb32_in1k_20220120-e555ef50.pth + Config: configs/hrnet/hrnet-w48_4xb32_in1k.py + Converted From: + Weights: https://1drv.ms/u/s!Aus8VCZ_C_33dKvqI6pBZlifgJk + Code: https://github.com/HRNet/HRNet-Image-Classification + - Name: hrnet-w64_3rdparty_8xb32_in1k + Metadata: + FLOPs: 29002298752 + Parameters: 128056104 + In Collection: HRNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.46 + Top 5 Accuracy: 94.65 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w64_3rdparty_8xb32_in1k_20220120-19126642.pth + Config: configs/hrnet/hrnet-w64_4xb32_in1k.py + Converted From: + Weights: https://1drv.ms/u/s!Aus8VCZ_C_33gQbJsUPTIj3rQu99 + Code: https://github.com/HRNet/HRNet-Image-Classification + - Name: hrnet-w18_3rdparty_8xb32-ssld_in1k + Metadata: + FLOPs: 4330397932 + Parameters: 21295164 + In Collection: HRNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.06 + Top 5 Accuracy: 95.7 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w18_3rdparty_8xb32-ssld_in1k_20220120-455f69ea.pth + Config: configs/hrnet/hrnet-w18_4xb32_in1k.py + Converted From: + Weights: https://github.com/HRNet/HRNet-Image-Classification/releases/download/PretrainedWeights/HRNet_W18_C_ssld_pretrained.pth + Code: https://github.com/HRNet/HRNet-Image-Classification + - Name: hrnet-w48_3rdparty_8xb32-ssld_in1k + Metadata: + FLOPs: 17364014752 + Parameters: 77466024 + In Collection: HRNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.63 + Top 5 Accuracy: 96.79 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w48_3rdparty_8xb32-ssld_in1k_20220120-d0459c38.pth + Config: configs/hrnet/hrnet-w48_4xb32_in1k.py + Converted From: + Weights: https://github.com/HRNet/HRNet-Image-Classification/releases/download/PretrainedWeights/HRNet_W48_C_ssld_pretrained.pth + Code: https://github.com/HRNet/HRNet-Image-Classification diff --git a/configs/lenet/README.md b/configs/lenet/README.md new file mode 100644 index 0000000..2cd68ea --- /dev/null +++ b/configs/lenet/README.md @@ -0,0 +1,28 @@ +# LeNet + +> [Backpropagation Applied to Handwritten Zip Code Recognition](https://ieeexplore.ieee.org/document/6795724) + + + +## Abstract + +The ability of learning networks to generalize can be greatly enhanced by providing constraints from the task domain. This paper demonstrates how such constraints can be integrated into a backpropagation network through the architecture of the network. This approach has been successfully applied to the recognition of handwritten zip code digits provided by the U.S. Postal Service. A single network learns the entire recognition operation, going from the normalized image of the character to the final classification. + +
+ +
+ +## Citation + +``` +@ARTICLE{6795724, + author={Y. {LeCun} and B. {Boser} and J. S. {Denker} and D. {Henderson} and R. E. {Howard} and W. {Hubbard} and L. D. {Jackel}}, + journal={Neural Computation}, + title={Backpropagation Applied to Handwritten Zip Code Recognition}, + year={1989}, + volume={1}, + number={4}, + pages={541-551}, + doi={10.1162/neco.1989.1.4.541}} +} +``` diff --git a/configs/lenet/lenet5_mnist.py b/configs/lenet/lenet5_mnist.py new file mode 100644 index 0000000..7286b79 --- /dev/null +++ b/configs/lenet/lenet5_mnist.py @@ -0,0 +1,59 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='LeNet5', num_classes=10), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) +# dataset settings +dataset_type = 'MNIST' +img_norm_cfg = dict(mean=[33.46], std=[78.87], to_rgb=True) +train_pipeline = [ + dict(type='Resize', size=32), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']), +] +test_pipeline = [ + dict(type='Resize', size=32), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), +] +data = dict( + samples_per_gpu=128, + workers_per_gpu=2, + train=dict( + type=dataset_type, data_prefix='data/mnist', pipeline=train_pipeline), + val=dict( + type=dataset_type, data_prefix='data/mnist', pipeline=test_pipeline), + test=dict( + type=dataset_type, data_prefix='data/mnist', pipeline=test_pipeline)) +evaluation = dict( + interval=5, metric='accuracy', metric_options={'topk': (1, )}) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=[15]) +# checkpoint saving +checkpoint_config = dict(interval=1) +# yapf:disable +log_config = dict( + interval=150, + hooks=[ + dict(type='TextLoggerHook'), + # dict(type='TensorboardLoggerHook') + ]) +# yapf:enable +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=5) +dist_params = dict(backend='nccl') +log_level = 'INFO' +work_dir = './work_dirs/mnist/' +load_from = None +resume_from = None +workflow = [('train', 1)] diff --git a/configs/mlp_mixer/README.md b/configs/mlp_mixer/README.md new file mode 100644 index 0000000..5ec9887 --- /dev/null +++ b/configs/mlp_mixer/README.md @@ -0,0 +1,37 @@ +# Mlp-Mixer + +> [MLP-Mixer: An all-MLP Architecture for Vision](https://arxiv.org/abs/2105.01601) + + + +## Abstract + +Convolutional Neural Networks (CNNs) are the go-to model for computer vision. Recently, attention-based networks, such as the Vision Transformer, have also become popular. In this paper we show that while convolutions and attention are both sufficient for good performance, neither of them are necessary. We present MLP-Mixer, an architecture based exclusively on multi-layer perceptrons (MLPs). MLP-Mixer contains two types of layers: one with MLPs applied independently to image patches (i.e. "mixing" the per-location features), and one with MLPs applied across patches (i.e. "mixing" spatial information). When trained on large datasets, or with modern regularization schemes, MLP-Mixer attains competitive scores on image classification benchmarks, with pre-training and inference cost comparable to state-of-the-art models. We hope that these results spark further research beyond the realms of well established CNNs and Transformers. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :----------: | :-------: | :------: | :-------: | :-------: | :-------------------------------------------------------------------------: | :----------------------------------------------------------------------------: | +| Mixer-B/16\* | 59.88 | 12.61 | 76.68 | 92.25 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mlp_mixer/mlp-mixer-base-p16_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mlp-mixer/mixer-base-p16_3rdparty_64xb64_in1k_20211124-1377e3e0.pth) | +| Mixer-L/16\* | 208.2 | 44.57 | 72.34 | 88.02 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mlp_mixer/mlp-mixer-large-p16_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mlp-mixer/mixer-large-p16_3rdparty_64xb64_in1k_20211124-5a2519d2.pth) | + +*Models with * are converted from [timm](https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/mlp_mixer.py). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +``` +@misc{tolstikhin2021mlpmixer, + title={MLP-Mixer: An all-MLP Architecture for Vision}, + author={Ilya Tolstikhin and Neil Houlsby and Alexander Kolesnikov and Lucas Beyer and Xiaohua Zhai and Thomas Unterthiner and Jessica Yung and Andreas Steiner and Daniel Keysers and Jakob Uszkoreit and Mario Lucic and Alexey Dosovitskiy}, + year={2021}, + eprint={2105.01601}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/mlp_mixer/metafile.yml b/configs/mlp_mixer/metafile.yml new file mode 100644 index 0000000..e8efa08 --- /dev/null +++ b/configs/mlp_mixer/metafile.yml @@ -0,0 +1,50 @@ +Collections: + - Name: MLP-Mixer + Metadata: + Training Data: ImageNet-1k + Architecture: + - MLP + - Layer Normalization + - Dropout + Paper: + URL: https://arxiv.org/abs/2105.01601 + Title: "MLP-Mixer: An all-MLP Architecture for Vision" + README: configs/mlp_mixer/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.18.0/mmcls/models/backbones/mlp_mixer.py + Version: v0.18.0 + +Models: + - Name: mlp-mixer-base-p16_3rdparty_64xb64_in1k + In Collection: MLP-Mixer + Config: configs/mlp_mixer/mlp-mixer-base-p16_64xb64_in1k.py + Metadata: + FLOPs: 12610000000 # 12.61 G + Parameters: 59880000 # 59.88 M + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 76.68 + Top 5 Accuracy: 92.25 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/mlp-mixer/mixer-base-p16_3rdparty_64xb64_in1k_20211124-1377e3e0.pth + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_b16_224-76587d61.pth + Code: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/mlp_mixer.py#L70 + + - Name: mlp-mixer-large-p16_3rdparty_64xb64_in1k + In Collection: MLP-Mixer + Config: configs/mlp_mixer/mlp-mixer-large-p16_64xb64_in1k.py + Metadata: + FLOPs: 44570000000 # 44.57 G + Parameters: 208200000 # 208.2 M + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 72.34 + Top 5 Accuracy: 88.02 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/mlp-mixer/mixer-large-p16_3rdparty_64xb64_in1k_20211124-5a2519d2.pth + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_b16_224_in21k-617b3de2.pth + Code: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/mlp_mixer.py#L73 diff --git a/configs/mlp_mixer/mlp-mixer-base-p16_64xb64_in1k.py b/configs/mlp_mixer/mlp-mixer-base-p16_64xb64_in1k.py new file mode 100644 index 0000000..e35dae5 --- /dev/null +++ b/configs/mlp_mixer/mlp-mixer-base-p16_64xb64_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/mlp_mixer_base_patch16.py', + '../_base_/datasets/imagenet_bs64_mixer_224.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py', +] diff --git a/configs/mlp_mixer/mlp-mixer-large-p16_64xb64_in1k.py b/configs/mlp_mixer/mlp-mixer-large-p16_64xb64_in1k.py new file mode 100644 index 0000000..459563c --- /dev/null +++ b/configs/mlp_mixer/mlp-mixer-large-p16_64xb64_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/mlp_mixer_large_patch16.py', + '../_base_/datasets/imagenet_bs64_mixer_224.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py', +] diff --git a/configs/mobilenet_v2/README.md b/configs/mobilenet_v2/README.md new file mode 100644 index 0000000..675c8dd --- /dev/null +++ b/configs/mobilenet_v2/README.md @@ -0,0 +1,38 @@ +# MobileNet V2 + +> [MobileNetV2: Inverted Residuals and Linear Bottlenecks](https://arxiv.org/abs/1801.04381) + + + +## Abstract + +In this paper we describe a new mobile architecture, MobileNetV2, that improves the state of the art performance of mobile models on multiple tasks and benchmarks as well as across a spectrum of different model sizes. We also describe efficient ways of applying these mobile models to object detection in a novel framework we call SSDLite. Additionally, we demonstrate how to build mobile semantic segmentation models through a reduced form of DeepLabv3 which we call Mobile DeepLabv3. + +The MobileNetV2 architecture is based on an inverted residual structure where the input and output of the residual block are thin bottleneck layers opposite to traditional residual models which use expanded representations in the input an MobileNetV2 uses lightweight depthwise convolutions to filter features in the intermediate expansion layer. Additionally, we find that it is important to remove non-linearities in the narrow layers in order to maintain representational power. We demonstrate that this improves performance and provide an intuition that led to this design. Finally, our approach allows decoupling of the input/output domains from the expressiveness of the transformation, which provides a convenient framework for further analysis. We measure our performance on Imagenet classification, COCO object detection, VOC image segmentation. We evaluate the trade-offs between accuracy, and number of operations measured by multiply-adds (MAdd), as well as the number of parameters + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :----------: | :-------: | :------: | :-------: | :-------: | :-------------------------------------------------------------------------: | :----------------------------------------------------------------------------: | +| MobileNet V2 | 3.5 | 0.319 | 71.86 | 90.42 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.log.json) | + +## Citation + +``` +@INPROCEEDINGS{8578572, + author={M. {Sandler} and A. {Howard} and M. {Zhu} and A. {Zhmoginov} and L. {Chen}}, + booktitle={2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + title={MobileNetV2: Inverted Residuals and Linear Bottlenecks}, + year={2018}, + volume={}, + number={}, + pages={4510-4520}, + doi={10.1109/CVPR.2018.00474}} +} +``` diff --git a/configs/mobilenet_v2/metafile.yml b/configs/mobilenet_v2/metafile.yml new file mode 100644 index 0000000..e16557f --- /dev/null +++ b/configs/mobilenet_v2/metafile.yml @@ -0,0 +1,34 @@ +Collections: + - Name: MobileNet V2 + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Epochs: 300 + Batch Size: 256 + Architecture: + - MobileNet V2 + Paper: + URL: https://arxiv.org/abs/1801.04381 + Title: "MobileNetV2: Inverted Residuals and Linear Bottlenecks" + README: configs/mobilenet_v2/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/mobilenet_v2.py#L101 + Version: v0.15.0 + +Models: + - Name: mobilenet-v2_8xb32_in1k + Metadata: + FLOPs: 319000000 + Parameters: 3500000 + In Collection: MobileNet V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 71.86 + Top 5 Accuracy: 90.42 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth + Config: configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py diff --git a/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py b/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py new file mode 100644 index 0000000..afd2d97 --- /dev/null +++ b/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/mobilenet_v2_1x.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256_epochstep.py', + '../_base_/default_runtime.py' +] diff --git a/configs/mobilenet_v2/mobilenet_v2_b32x8_imagenet.py b/configs/mobilenet_v2/mobilenet_v2_b32x8_imagenet.py new file mode 100644 index 0000000..26c2b6d --- /dev/null +++ b/configs/mobilenet_v2/mobilenet_v2_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'mobilenet-v2_8xb32_in1k.py' + +_deprecation_ = dict( + expected='mobilenet-v2_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/mobilenet_v3/README.md b/configs/mobilenet_v3/README.md new file mode 100644 index 0000000..737c4d3 --- /dev/null +++ b/configs/mobilenet_v3/README.md @@ -0,0 +1,36 @@ +# MobileNet V3 + +> [Searching for MobileNetV3](https://arxiv.org/abs/1905.02244) + + + +## Abstract + +We present the next generation of MobileNets based on a combination of complementary search techniques as well as a novel architecture design. MobileNetV3 is tuned to mobile phone CPUs through a combination of hardware-aware network architecture search (NAS) complemented by the NetAdapt algorithm and then subsequently improved through novel architecture advances. This paper starts the exploration of how automated search algorithms and network design can work together to harness complementary approaches improving the overall state of the art. Through this process we create two new MobileNet models for release: MobileNetV3-Large and MobileNetV3-Small which are targeted for high and low resource use cases. These models are then adapted and applied to the tasks of object detection and semantic segmentation. For the task of semantic segmentation (or any dense pixel prediction), we propose a new efficient segmentation decoder Lite Reduced Atrous Spatial Pyramid Pooling (LR-ASPP). We achieve new state of the art results for mobile classification, detection and segmentation. MobileNetV3-Large is 3.2% more accurate on ImageNet classification while reducing latency by 15% compared to MobileNetV2. MobileNetV3-Small is 4.6% more accurate while reducing latency by 5% compared to MobileNetV2. MobileNetV3-Large detection is 25% faster at roughly the same accuracy as MobileNetV2 on COCO detection. MobileNetV3-Large LR-ASPP is 30% faster than MobileNetV2 R-ASPP at similar accuracy for Cityscapes segmentation. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------------: | :-------: | :------: | :-------: | :-------: | :----------------------------------------------------------------------: | :------------------------------------------------------------------------: | +| MobileNetV3-Small\* | 2.54 | 0.06 | 67.66 | 87.41 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mobilenet_v3/mobilenet-v3-small_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_small-8427ecf0.pth) | +| MobileNetV3-Large\* | 5.48 | 0.23 | 74.04 | 91.34 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_large-3ea3c186.pth) | + +*Models with * are converted from [torchvision](https://pytorch.org/vision/stable/_modules/torchvision/models/mobilenetv3.html). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +``` +@inproceedings{Howard_2019_ICCV, + author = {Howard, Andrew and Sandler, Mark and Chu, Grace and Chen, Liang-Chieh and Chen, Bo and Tan, Mingxing and Wang, Weijun and Zhu, Yukun and Pang, Ruoming and Vasudevan, Vijay and Le, Quoc V. and Adam, Hartwig}, + title = {Searching for MobileNetV3}, + booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, + month = {October}, + year = {2019} +} +``` diff --git a/configs/mobilenet_v3/metafile.yml b/configs/mobilenet_v3/metafile.yml new file mode 100644 index 0000000..09c4732 --- /dev/null +++ b/configs/mobilenet_v3/metafile.yml @@ -0,0 +1,47 @@ +Collections: + - Name: MobileNet V3 + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - RMSprop with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Epochs: 600 + Batch Size: 1024 + Architecture: + - MobileNet V3 + Paper: + URL: https://arxiv.org/abs/1905.02244 + Title: Searching for MobileNetV3 + README: configs/mobilenet_v3/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/mobilenet_v3.py + Version: v0.15.0 + +Models: + - Name: mobilenet_v3_small_imagenet + Metadata: + FLOPs: 60000000 + Parameters: 2540000 + In Collection: MobileNet V3 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 67.66 + Top 5 Accuracy: 87.41 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_small-8427ecf0.pth + Config: configs/mobilenet_v3/mobilenet-v3-small_8xb32_in1k.py + - Name: mobilenet_v3_large_imagenet + Metadata: + FLOPs: 230000000 + Parameters: 5480000 + In Collection: MobileNet V3 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 74.04 + Top 5 Accuracy: 91.34 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_large-3ea3c186.pth + Config: configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py diff --git a/configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py b/configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py new file mode 100644 index 0000000..985ef52 --- /dev/null +++ b/configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py @@ -0,0 +1,158 @@ +# Refer to https://pytorch.org/blog/ml-models-torchvision-v0.9/#classification +# ---------------------------- +# -[x] auto_augment='imagenet' +# -[x] batch_size=128 (per gpu) +# -[x] epochs=600 +# -[x] opt='rmsprop' +# -[x] lr=0.064 +# -[x] eps=0.0316 +# -[x] alpha=0.9 +# -[x] weight_decay=1e-05 +# -[x] momentum=0.9 +# -[x] lr_gamma=0.973 +# -[x] lr_step_size=2 +# -[x] nproc_per_node=8 +# -[x] random_erase=0.2 +# -[x] workers=16 (workers_per_gpu) +# - modify: RandomErasing use RE-M instead of RE-0 + +_base_ = [ + '../_base_/models/mobilenet_v3_large_imagenet.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/default_runtime.py' +] + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +policies = [ + [ + dict(type='Posterize', bits=4, prob=0.4), + dict(type='Rotate', angle=30., prob=0.6) + ], + [ + dict(type='Solarize', thr=256 / 9 * 4, prob=0.6), + dict(type='AutoContrast', prob=0.6) + ], + [dict(type='Equalize', prob=0.8), + dict(type='Equalize', prob=0.6)], + [ + dict(type='Posterize', bits=5, prob=0.6), + dict(type='Posterize', bits=5, prob=0.6) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Solarize', thr=256 / 9 * 5, prob=0.2) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8) + ], + [ + dict(type='Solarize', thr=256 / 9 * 6, prob=0.6), + dict(type='Equalize', prob=0.6) + ], + [dict(type='Posterize', bits=6, prob=0.8), + dict(type='Equalize', prob=1.)], + [ + dict(type='Rotate', angle=10., prob=0.2), + dict(type='Solarize', thr=256 / 9, prob=0.6) + ], + [ + dict(type='Equalize', prob=0.6), + dict(type='Posterize', bits=5, prob=0.4) + ], + [ + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8), + dict(type='ColorTransform', magnitude=0., prob=0.4) + ], + [ + dict(type='Rotate', angle=30., prob=0.4), + dict(type='Equalize', prob=0.6) + ], + [dict(type='Equalize', prob=0.0), + dict(type='Equalize', prob=0.8)], + [dict(type='Invert', prob=0.6), + dict(type='Equalize', prob=1.)], + [ + dict(type='ColorTransform', magnitude=0.4, prob=0.6), + dict(type='Contrast', magnitude=0.8, prob=1.) + ], + [ + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8), + dict(type='ColorTransform', magnitude=0.2, prob=1.) + ], + [ + dict(type='ColorTransform', magnitude=0.8, prob=0.8), + dict(type='Solarize', thr=256 / 9 * 2, prob=0.8) + ], + [ + dict(type='Sharpness', magnitude=0.7, prob=0.4), + dict(type='Invert', prob=0.6) + ], + [ + dict( + type='Shear', + magnitude=0.3 / 9 * 5, + prob=0.6, + direction='horizontal'), + dict(type='Equalize', prob=1.) + ], + [ + dict(type='ColorTransform', magnitude=0., prob=0.4), + dict(type='Equalize', prob=0.6) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Solarize', thr=256 / 9 * 5, prob=0.2) + ], + [ + dict(type='Solarize', thr=256 / 9 * 4, prob=0.6), + dict(type='AutoContrast', prob=0.6) + ], + [dict(type='Invert', prob=0.6), + dict(type='Equalize', prob=1.)], + [ + dict(type='ColorTransform', magnitude=0.4, prob=0.6), + dict(type='Contrast', magnitude=0.8, prob=1.) + ], + [dict(type='Equalize', prob=0.8), + dict(type='Equalize', prob=0.6)], +] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224, backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='AutoAugment', policies=policies), + dict( + type='RandomErasing', + erase_prob=0.2, + mode='const', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean']), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +data = dict( + samples_per_gpu=128, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline)) +evaluation = dict(interval=10, metric='accuracy') + +# optimizer +optimizer = dict( + type='RMSprop', + lr=0.064, + alpha=0.9, + momentum=0.9, + eps=0.0316, + weight_decay=1e-5) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=2, gamma=0.973, by_epoch=True) +runner = dict(type='EpochBasedRunner', max_epochs=600) diff --git a/configs/mobilenet_v3/mobilenet-v3-small_8xb16_cifar10.py b/configs/mobilenet_v3/mobilenet-v3-small_8xb16_cifar10.py new file mode 100644 index 0000000..06e63da --- /dev/null +++ b/configs/mobilenet_v3/mobilenet-v3-small_8xb16_cifar10.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/mobilenet-v3-small_cifar.py', + '../_base_/datasets/cifar10_bs16.py', + '../_base_/schedules/cifar10_bs128.py', '../_base_/default_runtime.py' +] + +lr_config = dict(policy='step', step=[120, 170]) +runner = dict(type='EpochBasedRunner', max_epochs=200) diff --git a/configs/mobilenet_v3/mobilenet-v3-small_8xb32_in1k.py b/configs/mobilenet_v3/mobilenet-v3-small_8xb32_in1k.py new file mode 100644 index 0000000..2612166 --- /dev/null +++ b/configs/mobilenet_v3/mobilenet-v3-small_8xb32_in1k.py @@ -0,0 +1,158 @@ +# Refer to https://pytorch.org/blog/ml-models-torchvision-v0.9/#classification +# ---------------------------- +# -[x] auto_augment='imagenet' +# -[x] batch_size=128 (per gpu) +# -[x] epochs=600 +# -[x] opt='rmsprop' +# -[x] lr=0.064 +# -[x] eps=0.0316 +# -[x] alpha=0.9 +# -[x] weight_decay=1e-05 +# -[x] momentum=0.9 +# -[x] lr_gamma=0.973 +# -[x] lr_step_size=2 +# -[x] nproc_per_node=8 +# -[x] random_erase=0.2 +# -[x] workers=16 (workers_per_gpu) +# - modify: RandomErasing use RE-M instead of RE-0 + +_base_ = [ + '../_base_/models/mobilenet_v3_small_imagenet.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/default_runtime.py' +] + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +policies = [ + [ + dict(type='Posterize', bits=4, prob=0.4), + dict(type='Rotate', angle=30., prob=0.6) + ], + [ + dict(type='Solarize', thr=256 / 9 * 4, prob=0.6), + dict(type='AutoContrast', prob=0.6) + ], + [dict(type='Equalize', prob=0.8), + dict(type='Equalize', prob=0.6)], + [ + dict(type='Posterize', bits=5, prob=0.6), + dict(type='Posterize', bits=5, prob=0.6) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Solarize', thr=256 / 9 * 5, prob=0.2) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8) + ], + [ + dict(type='Solarize', thr=256 / 9 * 6, prob=0.6), + dict(type='Equalize', prob=0.6) + ], + [dict(type='Posterize', bits=6, prob=0.8), + dict(type='Equalize', prob=1.)], + [ + dict(type='Rotate', angle=10., prob=0.2), + dict(type='Solarize', thr=256 / 9, prob=0.6) + ], + [ + dict(type='Equalize', prob=0.6), + dict(type='Posterize', bits=5, prob=0.4) + ], + [ + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8), + dict(type='ColorTransform', magnitude=0., prob=0.4) + ], + [ + dict(type='Rotate', angle=30., prob=0.4), + dict(type='Equalize', prob=0.6) + ], + [dict(type='Equalize', prob=0.0), + dict(type='Equalize', prob=0.8)], + [dict(type='Invert', prob=0.6), + dict(type='Equalize', prob=1.)], + [ + dict(type='ColorTransform', magnitude=0.4, prob=0.6), + dict(type='Contrast', magnitude=0.8, prob=1.) + ], + [ + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8), + dict(type='ColorTransform', magnitude=0.2, prob=1.) + ], + [ + dict(type='ColorTransform', magnitude=0.8, prob=0.8), + dict(type='Solarize', thr=256 / 9 * 2, prob=0.8) + ], + [ + dict(type='Sharpness', magnitude=0.7, prob=0.4), + dict(type='Invert', prob=0.6) + ], + [ + dict( + type='Shear', + magnitude=0.3 / 9 * 5, + prob=0.6, + direction='horizontal'), + dict(type='Equalize', prob=1.) + ], + [ + dict(type='ColorTransform', magnitude=0., prob=0.4), + dict(type='Equalize', prob=0.6) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Solarize', thr=256 / 9 * 5, prob=0.2) + ], + [ + dict(type='Solarize', thr=256 / 9 * 4, prob=0.6), + dict(type='AutoContrast', prob=0.6) + ], + [dict(type='Invert', prob=0.6), + dict(type='Equalize', prob=1.)], + [ + dict(type='ColorTransform', magnitude=0.4, prob=0.6), + dict(type='Contrast', magnitude=0.8, prob=1.) + ], + [dict(type='Equalize', prob=0.8), + dict(type='Equalize', prob=0.6)], +] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224, backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='AutoAugment', policies=policies), + dict( + type='RandomErasing', + erase_prob=0.2, + mode='const', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean']), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +data = dict( + samples_per_gpu=128, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline)) +evaluation = dict(interval=10, metric='accuracy') + +# optimizer +optimizer = dict( + type='RMSprop', + lr=0.064, + alpha=0.9, + momentum=0.9, + eps=0.0316, + weight_decay=1e-5) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=2, gamma=0.973, by_epoch=True) +runner = dict(type='EpochBasedRunner', max_epochs=600) diff --git a/configs/mobilenet_v3/mobilenet_v3_large_imagenet.py b/configs/mobilenet_v3/mobilenet_v3_large_imagenet.py new file mode 100644 index 0000000..93e89a4 --- /dev/null +++ b/configs/mobilenet_v3/mobilenet_v3_large_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'mobilenet-v3-large_8xb32_in1k.py' + +_deprecation_ = dict( + expected='mobilenet-v3-large_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/mobilenet_v3/mobilenet_v3_small_cifar.py b/configs/mobilenet_v3/mobilenet_v3_small_cifar.py new file mode 100644 index 0000000..c09bd1c --- /dev/null +++ b/configs/mobilenet_v3/mobilenet_v3_small_cifar.py @@ -0,0 +1,6 @@ +_base_ = 'mobilenet-v3-small_8xb16_cifar10.py' + +_deprecation_ = dict( + expected='mobilenet-v3-small_8xb16_cifar10.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/mobilenet_v3/mobilenet_v3_small_imagenet.py b/configs/mobilenet_v3/mobilenet_v3_small_imagenet.py new file mode 100644 index 0000000..15debd0 --- /dev/null +++ b/configs/mobilenet_v3/mobilenet_v3_small_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'mobilenet-v3-small_8xb32_in1k.py' + +_deprecation_ = dict( + expected='mobilenet-v3-small_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/mvit/README.md b/configs/mvit/README.md new file mode 100644 index 0000000..6f5c560 --- /dev/null +++ b/configs/mvit/README.md @@ -0,0 +1,44 @@ +# MViT V2 + +> [MViTv2: Improved Multiscale Vision Transformers for Classification and Detection](http://openaccess.thecvf.com//content/CVPR2022/papers/Li_MViTv2_Improved_Multiscale_Vision_Transformers_for_Classification_and_Detection_CVPR_2022_paper.pdf) + + + +## Abstract + +In this paper, we study Multiscale Vision Transformers (MViTv2) as a unified architecture for image and video +classification, as well as object detection. We present an improved version of MViT that incorporates +decomposed relative positional embeddings and residual pooling connections. We instantiate this architecture +in five sizes and evaluate it for ImageNet classification, COCO detection and Kinetics video recognition where +it outperforms prior work. We further compare MViTv2s' pooling attention to window attention mechanisms where +it outperforms the latter in accuracy/compute. Without bells-and-whistles, MViTv2 has state-of-the-art +performance in 3 domains: 88.8% accuracy on ImageNet classification, 58.7 boxAP on COCO object detection as +well as 86.1% on Kinetics-400 video classification. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Pretrain | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :------------: | :----------: | :-------: | :------: | :-------: | :-------: | :------------------------------------------------------------------: | :---------------------------------------------------------------------: | +| MViTv2-tiny\* | From scratch | 24.17 | 4.70 | 82.33 | 96.15 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mvit/mvitv2-tiny_8xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-tiny_3rdparty_in1k_20220722-db7beeef.pth) | +| MViTv2-small\* | From scratch | 34.87 | 7.00 | 83.63 | 96.51 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mvit/mvitv2-small_8xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-small_3rdparty_in1k_20220722-986bd741.pth) | +| MViTv2-base\* | From scratch | 51.47 | 10.20 | 84.34 | 96.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mvit/mvitv2-base_8xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-base_3rdparty_in1k_20220722-9c4f0a17.pth) | +| MViTv2-large\* | From scratch | 217.99 | 42.10 | 85.25 | 97.14 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mvit/mvitv2-large_8xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-large_3rdparty_in1k_20220722-2b57b983.pth) | + +*Models with * are converted from the [official repo](https://github.com/facebookresearch/mvit). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +```bibtex +@inproceedings{li2021improved, + title={MViTv2: Improved multiscale vision transformers for classification and detection}, + author={Li, Yanghao and Wu, Chao-Yuan and Fan, Haoqi and Mangalam, Karttikeya and Xiong, Bo and Malik, Jitendra and Feichtenhofer, Christoph}, + booktitle={CVPR}, + year={2022} +} +``` diff --git a/configs/mvit/metafile.yml b/configs/mvit/metafile.yml new file mode 100644 index 0000000..8d46a0c --- /dev/null +++ b/configs/mvit/metafile.yml @@ -0,0 +1,95 @@ +Collections: + - Name: MViT V2 + Metadata: + Architecture: + - Attention Dropout + - Convolution + - Dense Connections + - GELU + - Layer Normalization + - Scaled Dot-Product Attention + - Attention Pooling + Paper: + URL: http://openaccess.thecvf.com//content/CVPR2022/papers/Li_MViTv2_Improved_Multiscale_Vision_Transformers_for_Classification_and_Detection_CVPR_2022_paper.pdf + Title: 'MViTv2: Improved Multiscale Vision Transformers for Classification and Detection' + README: configs/mvit/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.24.0/mmcls/models/backbones/mvit.py + Version: v0.24.0 + +Models: + - Name: mvitv2-tiny_3rdparty_in1k + In Collection: MViT V2 + Metadata: + FLOPs: 4700000000 + Parameters: 24173320 + Training Data: + - ImageNet-1k + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 82.33 + Top 5 Accuracy: 96.15 + Weights: https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-tiny_3rdparty_in1k_20220722-db7beeef.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/mvit/mvitv2_models/MViTv2_T_in1k.pyth + Code: https://github.com/facebookresearch/mvit + Config: configs/mvit/mvitv2-tiny_8xb256_in1k.py + + - Name: mvitv2-small_3rdparty_in1k + In Collection: MViT V2 + Metadata: + FLOPs: 7000000000 + Parameters: 34870216 + Training Data: + - ImageNet-1k + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 83.63 + Top 5 Accuracy: 96.51 + Weights: https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-small_3rdparty_in1k_20220722-986bd741.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/mvit/mvitv2_models/MViTv2_S_in1k.pyth + Code: https://github.com/facebookresearch/mvit + Config: configs/mvit/mvitv2-small_8xb256_in1k.py + + - Name: mvitv2-base_3rdparty_in1k + In Collection: MViT V2 + Metadata: + FLOPs: 10200000000 + Parameters: 51472744 + Training Data: + - ImageNet-1k + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 84.34 + Top 5 Accuracy: 96.86 + Weights: https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-base_3rdparty_in1k_20220722-9c4f0a17.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/mvit/mvitv2_models/MViTv2_B_in1k.pyth + Code: https://github.com/facebookresearch/mvit + Config: configs/mvit/mvitv2-base_8xb256_in1k.py + + - Name: mvitv2-large_3rdparty_in1k + In Collection: MViT V2 + Metadata: + FLOPs: 42100000000 + Parameters: 217992952 + Training Data: + - ImageNet-1k + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 85.25 + Top 5 Accuracy: 97.14 + Weights: https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-large_3rdparty_in1k_20220722-2b57b983.pth + Converted From: + Weights: https://dl.fbaipublicfiles.com/mvit/mvitv2_models/MViTv2_L_in1k.pyth + Code: https://github.com/facebookresearch/mvit + Config: configs/mvit/mvitv2-large_8xb256_in1k.py diff --git a/configs/mvit/mvitv2-base_8xb256_in1k.py b/configs/mvit/mvitv2-base_8xb256_in1k.py new file mode 100644 index 0000000..ea92cf4 --- /dev/null +++ b/configs/mvit/mvitv2-base_8xb256_in1k.py @@ -0,0 +1,29 @@ +_base_ = [ + '../_base_/models/mvit/mvitv2-base.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# dataset settings +data = dict(samples_per_gpu=256) + +# schedule settings +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.pos_embed': dict(decay_mult=0.0), + '.rel_pos_h': dict(decay_mult=0.0), + '.rel_pos_w': dict(decay_mult=0.0) + }) + +optimizer = dict(lr=0.00025, paramwise_cfg=paramwise_cfg) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=70, + warmup_by_epoch=True) diff --git a/configs/mvit/mvitv2-large_8xb256_in1k.py b/configs/mvit/mvitv2-large_8xb256_in1k.py new file mode 100644 index 0000000..fbb81d6 --- /dev/null +++ b/configs/mvit/mvitv2-large_8xb256_in1k.py @@ -0,0 +1,29 @@ +_base_ = [ + '../_base_/models/mvit/mvitv2-large.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs2048_AdamW.py', + '../_base_/default_runtime.py' +] + +# dataset settings +data = dict(samples_per_gpu=256) + +# schedule settings +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.pos_embed': dict(decay_mult=0.0), + '.rel_pos_h': dict(decay_mult=0.0), + '.rel_pos_w': dict(decay_mult=0.0) + }) + +optimizer = dict(lr=0.00025, paramwise_cfg=paramwise_cfg) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=70, + warmup_by_epoch=True) diff --git a/configs/mvit/mvitv2-small_8xb256_in1k.py b/configs/mvit/mvitv2-small_8xb256_in1k.py new file mode 100644 index 0000000..1803859 --- /dev/null +++ b/configs/mvit/mvitv2-small_8xb256_in1k.py @@ -0,0 +1,29 @@ +_base_ = [ + '../_base_/models/mvit/mvitv2-small.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs2048_AdamW.py', + '../_base_/default_runtime.py' +] + +# dataset settings +data = dict(samples_per_gpu=256) + +# schedule settings +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.pos_embed': dict(decay_mult=0.0), + '.rel_pos_h': dict(decay_mult=0.0), + '.rel_pos_w': dict(decay_mult=0.0) + }) + +optimizer = dict(lr=0.00025, paramwise_cfg=paramwise_cfg) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=70, + warmup_by_epoch=True) diff --git a/configs/mvit/mvitv2-tiny_8xb256_in1k.py b/configs/mvit/mvitv2-tiny_8xb256_in1k.py new file mode 100644 index 0000000..f4b9bc4 --- /dev/null +++ b/configs/mvit/mvitv2-tiny_8xb256_in1k.py @@ -0,0 +1,29 @@ +_base_ = [ + '../_base_/models/mvit/mvitv2-tiny.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs2048_AdamW.py', + '../_base_/default_runtime.py' +] + +# dataset settings +data = dict(samples_per_gpu=256) + +# schedule settings +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.pos_embed': dict(decay_mult=0.0), + '.rel_pos_h': dict(decay_mult=0.0), + '.rel_pos_w': dict(decay_mult=0.0) + }) + +optimizer = dict(lr=0.00025, paramwise_cfg=paramwise_cfg) +optimizer_config = dict(grad_clip=dict(max_norm=1.0)) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=70, + warmup_by_epoch=True) diff --git a/configs/poolformer/README.md b/configs/poolformer/README.md new file mode 100644 index 0000000..cc557e1 --- /dev/null +++ b/configs/poolformer/README.md @@ -0,0 +1,38 @@ +# PoolFormer + +> [MetaFormer is Actually What You Need for Vision](https://arxiv.org/abs/2111.11418) + + + +## Abstract + +Transformers have shown great potential in computer vision tasks. A common belief is their attention-based token mixer module contributes most to their competence. However, recent works show the attention-based module in transformers can be replaced by spatial MLPs and the resulted models still perform quite well. Based on this observation, we hypothesize that the general architecture of the transformers, instead of the specific token mixer module, is more essential to the model's performance. To verify this, we deliberately replace the attention module in transformers with an embarrassingly simple spatial pooling operator to conduct only basic token mixing. Surprisingly, we observe that the derived model, termed as PoolFormer, achieves competitive performance on multiple computer vision tasks. For example, on ImageNet-1K, PoolFormer achieves 82.1% top-1 accuracy, surpassing well-tuned vision transformer/MLP-like baselines DeiT-B/ResMLP-B24 by 0.3%/1.1% accuracy with 35%/52% fewer parameters and 49%/61% fewer MACs. The effectiveness of PoolFormer verifies our hypothesis and urges us to initiate the concept of "MetaFormer", a general architecture abstracted from transformers without specifying the token mixer. Based on the extensive experiments, we argue that MetaFormer is the key player in achieving superior results for recent transformer and MLP-like models on vision tasks. This work calls for more future research dedicated to improving MetaFormer instead of focusing on the token mixer modules. Additionally, our proposed PoolFormer could serve as a starting baseline for future MetaFormer architecture design. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :--------------: | :-------: | :------: | :-------: | :-------: | :-----------------------------------------------------------------------: | :--------------------------------------------------------------------------: | +| PoolFormer-S12\* | 11.92 | 1.87 | 77.24 | 93.51 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/poolformer/poolformer-s12_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s12_3rdparty_32xb128_in1k_20220414-f8d83051.pth) | +| PoolFormer-S24\* | 21.39 | 3.51 | 80.33 | 95.05 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/poolformer/poolformer-s24_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s24_3rdparty_32xb128_in1k_20220414-d7055904.pth) | +| PoolFormer-S36\* | 30.86 | 5.15 | 81.43 | 95.45 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/poolformer/poolformer-s36_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s36_3rdparty_32xb128_in1k_20220414-d78ff3e8.pth) | +| PoolFormer-M36\* | 56.17 | 8.96 | 82.14 | 95.71 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/poolformer/poolformer-m36_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-m36_3rdparty_32xb128_in1k_20220414-c55e0949.pth) | +| PoolFormer-M48\* | 73.47 | 11.80 | 82.51 | 95.95 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/poolformer/poolformer-m48_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-m48_3rdparty_32xb128_in1k_20220414-9378f3eb.pth) | + +*Models with * are converted from the [official repo](https://github.com/sail-sg/poolformer). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +```bibtex +@article{yu2021metaformer, + title={MetaFormer is Actually What You Need for Vision}, + author={Yu, Weihao and Luo, Mi and Zhou, Pan and Si, Chenyang and Zhou, Yichen and Wang, Xinchao and Feng, Jiashi and Yan, Shuicheng}, + journal={arXiv preprint arXiv:2111.11418}, + year={2021} +} +``` diff --git a/configs/poolformer/metafile.yml b/configs/poolformer/metafile.yml new file mode 100644 index 0000000..d94219d --- /dev/null +++ b/configs/poolformer/metafile.yml @@ -0,0 +1,99 @@ +Collections: + - Name: PoolFormer + Metadata: + Training Data: ImageNet-1k + Architecture: + - Pooling + - 1x1 Convolution + - LayerScale + Paper: + URL: https://arxiv.org/abs/2111.11418 + Title: MetaFormer is Actually What You Need for Vision + README: configs/poolformer/README.md + Code: + Version: v0.22.1 + URL: https://github.com/open-mmlab/mmclassification/blob/v0.22.1/mmcls/models/backbones/poolformer.py + +Models: + - Name: poolformer-s12_3rdparty_32xb128_in1k + Metadata: + FLOPs: 1871399424 + Parameters: 11915176 + In Collections: PoolFormer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.24 + Top 5 Accuracy: 93.51 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s12_3rdparty_32xb128_in1k_20220414-f8d83051.pth + Config: configs/poolformer/poolformer-s12_32xb128_in1k.py + Converted From: + Weights: https://github.com/sail-sg/poolformer/releases/download/v1.0/poolformer_s12.pth.tar + Code: https://github.com/sail-sg/poolformer + - Name: poolformer-s24_3rdparty_32xb128_in1k + Metadata: + Training Data: ImageNet-1k + FLOPs: 3510411008 + Parameters: 21388968 + In Collections: PoolFormer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 80.33 + Top 5 Accuracy: 95.05 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s24_3rdparty_32xb128_in1k_20220414-d7055904.pth + Config: configs/poolformer/poolformer-s24_32xb128_in1k.py + Converted From: + Weights: https://github.com/sail-sg/poolformer/releases/download/v1.0/poolformer_s24.pth.tar + Code: https://github.com/sail-sg/poolformer + - Name: poolformer-s36_3rdparty_32xb128_in1k + Metadata: + FLOPs: 5149422592 + Parameters: 30862760 + In Collections: PoolFormer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.43 + Top 5 Accuracy: 95.45 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-s36_3rdparty_32xb128_in1k_20220414-d78ff3e8.pth + Config: configs/poolformer/poolformer-s36_32xb128_in1k.py + Converted From: + Weights: https://github.com/sail-sg/poolformer/releases/download/v1.0/poolformer_s36.pth.tar + Code: https://github.com/sail-sg/poolformer + - Name: poolformer-m36_3rdparty_32xb128_in1k + Metadata: + Training Data: ImageNet-1k + FLOPs: 8960175744 + Parameters: 56172520 + In Collections: PoolFormer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.14 + Top 5 Accuracy: 95.71 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-m36_3rdparty_32xb128_in1k_20220414-c55e0949.pth + Config: configs/poolformer/poolformer-m36_32xb128_in1k.py + Converted From: + Weights: https://github.com/sail-sg/poolformer/releases/download/v1.0/poolformer_m36.pth.tar + Code: https://github.com/sail-sg/poolformer + - Name: poolformer-m48_3rdparty_32xb128_in1k + Metadata: + FLOPs: 11801805696 + Parameters: 73473448 + In Collections: PoolFormer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.51 + Top 5 Accuracy: 95.95 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-m48_3rdparty_32xb128_in1k_20220414-9378f3eb.pth + Config: configs/poolformer/poolformer-m48_32xb128_in1k.py + Converted From: + Weights: https://github.com/sail-sg/poolformer/releases/download/v1.0/poolformer_m48.pth.tar + Code: https://github.com/sail-sg/poolformer diff --git a/configs/poolformer/poolformer-m36_32xb128_in1k.py b/configs/poolformer/poolformer-m36_32xb128_in1k.py new file mode 100644 index 0000000..1937a78 --- /dev/null +++ b/configs/poolformer/poolformer-m36_32xb128_in1k.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/poolformer/poolformer_m36.py', + '../_base_/datasets/imagenet_bs128_poolformer_medium_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +optimizer = dict(lr=4e-3) diff --git a/configs/poolformer/poolformer-m48_32xb128_in1k.py b/configs/poolformer/poolformer-m48_32xb128_in1k.py new file mode 100644 index 0000000..a65b76a --- /dev/null +++ b/configs/poolformer/poolformer-m48_32xb128_in1k.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/poolformer/poolformer_m48.py', + '../_base_/datasets/imagenet_bs128_poolformer_medium_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +optimizer = dict(lr=4e-3) diff --git a/configs/poolformer/poolformer-s12_32xb128_in1k.py b/configs/poolformer/poolformer-s12_32xb128_in1k.py new file mode 100644 index 0000000..98027c0 --- /dev/null +++ b/configs/poolformer/poolformer-s12_32xb128_in1k.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/poolformer/poolformer_s12.py', + '../_base_/datasets/imagenet_bs128_poolformer_small_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +optimizer = dict(lr=4e-3) diff --git a/configs/poolformer/poolformer-s24_32xb128_in1k.py b/configs/poolformer/poolformer-s24_32xb128_in1k.py new file mode 100644 index 0000000..9774259 --- /dev/null +++ b/configs/poolformer/poolformer-s24_32xb128_in1k.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/poolformer/poolformer_s24.py', + '../_base_/datasets/imagenet_bs128_poolformer_small_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +optimizer = dict(lr=4e-3) diff --git a/configs/poolformer/poolformer-s36_32xb128_in1k.py b/configs/poolformer/poolformer-s36_32xb128_in1k.py new file mode 100644 index 0000000..4d742d3 --- /dev/null +++ b/configs/poolformer/poolformer-s36_32xb128_in1k.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/poolformer/poolformer_s36.py', + '../_base_/datasets/imagenet_bs128_poolformer_small_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py', +] + +optimizer = dict(lr=4e-3) diff --git a/configs/regnet/README.md b/configs/regnet/README.md new file mode 100644 index 0000000..1ae074d --- /dev/null +++ b/configs/regnet/README.md @@ -0,0 +1,51 @@ +# RegNet + +> [Designing Network Design Spaces](https://arxiv.org/abs/2003.13678) + + + +## Abstract + +In this work, we present a new network design paradigm. Our goal is to help advance the understanding of network design and discover design principles that generalize across settings. Instead of focusing on designing individual network instances, we design network design spaces that parametrize populations of networks. The overall process is analogous to classic manual design of networks, but elevated to the design space level. Using our methodology we explore the structure aspect of network design and arrive at a low-dimensional design space consisting of simple, regular networks that we call RegNet. The core insight of the RegNet parametrization is surprisingly simple: widths and depths of good networks can be explained by a quantized linear function. We analyze the RegNet design space and arrive at interesting findings that do not match the current practice of network design. The RegNet design space provides simple and fast networks that work well across a wide range of flop regimes. Under comparable training settings and flops, the RegNet models outperform the popular EfficientNet models while being up to 5x faster on GPUs. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-------------: | :-------: | :------: | :-------: | :-------: | :------------------------------------------------------------------------: | :--------------------------------------------------------------------------: | +| RegNetX-400MF | 5.16 | 0.41 | 72.56 | 90.78 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-400mf_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-400mf_8xb128_in1k_20211213-89bfc226.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-400mf_8xb128_in1k_20211208_143316.log.json) | +| RegNetX-800MF | 7.26 | 0.81 | 74.76 | 92.32 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-800mf_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-800mf_8xb128_in1k_20211213-222b0f11.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-800mf_8xb128_in1k_20211207_143037.log.json) | +| RegNetX-1.6GF | 9.19 | 1.63 | 76.84 | 93.31 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-1.6gf_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-1.6gf_8xb128_in1k_20211213-d1b89758.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-1.6gf_8xb128_in1k_20211208_143018.log.json) | +| RegNetX-3.2GF | 15.3 | 3.21 | 78.09 | 94.08 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-3.2gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-3.2gf_8xb64_in1k_20211213-1fdd82ae.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-3.2gf_8xb64_in1k_20211208_142720.log.json) | +| RegNetX-4.0GF | 22.12 | 4.0 | 78.60 | 94.17 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-4.0gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-4.0gf_8xb64_in1k_20211213-efed675c.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-4.0gf_8xb64_in1k_20211207_150431.log.json) | +| RegNetX-6.4GF | 26.21 | 6.51 | 79.38 | 94.65 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-6.4gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-6.4gf_8xb64_in1k_20211215-5c6089da.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-6.4gf_8xb64_in1k_20211213_172748.log.json) | +| RegNetX-8.0GF | 39.57 | 8.03 | 79.12 | 94.51 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-8.0gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-8.0gf_8xb64_in1k_20211213-9a9fcc76.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-8.0gf_8xb64_in1k_20211208_103250.log.json) | +| RegNetX-12GF | 46.11 | 12.15 | 79.67 | 95.03 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-12gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-12gf_8xb64_in1k_20211213-5df8c2f8.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-12gf_8xb64_in1k_20211208_143713.log.json) | +| RegNetX-400MF\* | 5.16 | 0.41 | 72.55 | 90.91 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-400mf_8xb128_in1k) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/convert/RegNetX-400MF-0db9f35c.pth) | +| RegNetX-800MF\* | 7.26 | 0.81 | 75.21 | 92.37 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-800mf_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/convert/RegNetX-800MF-4f9d1e8a.pth) | +| RegNetX-1.6GF\* | 9.19 | 1.63 | 77.04 | 93.51 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-1.6gf_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/convert/RegNetX-1.6GF-cfb32375.pth) | +| RegNetX-3.2GF\* | 15.3 | 3.21 | 78.26 | 94.20 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-3.2gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/convert/RegNetX-3.2GF-82c43fd5.pth) | +| RegNetX-4.0GF\* | 22.12 | 4.0 | 78.72 | 94.22 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-4.0gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/convert/RegNetX-4.0GF-ef8bb32c.pth) | +| RegNetX-6.4GF\* | 26.21 | 6.51 | 79.22 | 94.61 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-6.4gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/convert/RegNetX-6.4GF-6888c0ea.pth) | +| RegNetX-8.0GF\* | 39.57 | 8.03 | 79.31 | 94.57 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-8.0gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/convert/RegNetX-8.0GF-cb4c77ec.pth) | +| RegNetX-12GF\* | 46.11 | 12.15 | 79.91 | 94.78 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-12gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/convert/RegNetX-12GF-0574538f.pth) | + +*Models with * are converted from [pycls](https://github.com/facebookresearch/pycls/blob/master/MODEL_ZOO.md). The config files of these models are only for validation.* + +## Citation + +``` +@article{radosavovic2020designing, + title={Designing Network Design Spaces}, + author={Ilija Radosavovic and Raj Prateek Kosaraju and Ross Girshick and Kaiming He and Piotr Dollár}, + year={2020}, + eprint={2003.13678}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/regnet/metafile.yml b/configs/regnet/metafile.yml new file mode 100644 index 0000000..6b301ab --- /dev/null +++ b/configs/regnet/metafile.yml @@ -0,0 +1,122 @@ +Collections: + - Name: RegNet + Metadata: + Training Data: ImageNet-1k + Architecture: + - Neural Architecture Search + - Design Space Design + - Precise BN + - SGD with nesterov + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: Designing Network Design Spaces + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.18.0/mmcls/models/backbones/regnet.py + Version: v0.18.0 + +Models: + - Name: regnetx-400mf_8xb128_in1k + In Collection: RegNet + Config: configs/regnet/regnetx-400mf_8xb128_in1k.py + Metadata: + FLOPs: 410000000 # 0.41G + Parameters: 5160000 # 5.16M + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 72.56 + Top 5 Accuracy: 90.78 + Weights: https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-400mf_8xb128_in1k_20211213-89bfc226.pth + - Name: regnetx-800mf_8xb128_in1k + In Collection: RegNet + Config: configs/regnet/regnetx-800mf_8xb128_in1k.py + Metadata: + FLOPs: 810000000 # 0.81G + Parameters: 7260000 # 7.26M + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 74.76 + Top 5 Accuracy: 92.32 + Weights: https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-800mf_8xb128_in1k_20211213-222b0f11.pth + - Name: regnetx-1.6gf_8xb128_in1k + In Collection: RegNet + Config: configs/regnet/regnetx-1.6gf_8xb128_in1k.py + Metadata: + FLOPs: 1630000000 # 1.63G + Parameters: 9190000 # 9.19M + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 76.84 + Top 5 Accuracy: 93.31 + Weights: https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-1.6gf_8xb128_in1k_20211213-d1b89758.pth + - Name: regnetx-3.2gf_8xb64_in1k + In Collection: RegNet + Config: configs/regnet/regnetx-3.2gf_8xb64_in1k.py + Metadata: + FLOPs: 1530000000 # 1.53G + Parameters: 3210000 # 32.1M + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 78.09 + Top 5 Accuracy: 94.08 + Weights: https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-3.2gf_8xb64_in1k_20211213-1fdd82ae.pth + - Name: regnetx-4.0gf_8xb64_in1k + In Collection: RegNet + Config: configs/regnet/regnetx-4.0gf_8xb64_in1k.py + Metadata: + FLOPs: 4000000000 # 4G + Parameters: 22120000 # 22.12M + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 78.60 + Top 5 Accuracy: 94.17 + Weights: https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-4.0gf_8xb64_in1k_20211213-efed675c.pth + - Name: regnetx-6.4gf_8xb64_in1k + In Collection: RegNet + Config: configs/regnet/regnetx-6.4gf_8xb64_in1k.py + Metadata: + FLOPs: 6510000000 # 6.51G + Parameters: 26210000 # 26.21M + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 79.38 + Top 5 Accuracy: 94.65 + Weights: https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-6.4gf_8xb64_in1k_20211215-5c6089da.pth + - Name: regnetx-8.0gf_8xb64_in1k + In Collection: RegNet + Config: configs/regnet/regnetx-8.0gf_8xb64_in1k.py + Metadata: + FLOPs: 8030000000 # 8.03G + Parameters: 39570000 # 39.57M + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 79.12 + Top 5 Accuracy: 94.51 + Weights: https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-8.0gf_8xb64_in1k_20211213-9a9fcc76.pth + - Name: regnetx-12gf_8xb64_in1k + In Collection: RegNet + Config: configs/regnet/regnetx-12gf_8xb64_in1k.py + Metadata: + FLOPs: 12150000000 # 12.15G + Parameters: 46110000 # 46.11M + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 79.67 + Top 5 Accuracy: 95.03 + Weights: https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-12gf_8xb64_in1k_20211213-5df8c2f8.pth diff --git a/configs/regnet/regnetx-1.6gf_8xb128_in1k.py b/configs/regnet/regnetx-1.6gf_8xb128_in1k.py new file mode 100644 index 0000000..d3e9e93 --- /dev/null +++ b/configs/regnet/regnetx-1.6gf_8xb128_in1k.py @@ -0,0 +1,6 @@ +_base_ = ['./regnetx-400mf_8xb128_in1k.py'] + +# model settings +model = dict( + backbone=dict(type='RegNet', arch='regnetx_1.6gf'), + head=dict(in_channels=912, )) diff --git a/configs/regnet/regnetx-12gf_8xb64_in1k.py b/configs/regnet/regnetx-12gf_8xb64_in1k.py new file mode 100644 index 0000000..5da0ebe --- /dev/null +++ b/configs/regnet/regnetx-12gf_8xb64_in1k.py @@ -0,0 +1,11 @@ +_base_ = ['./regnetx-400mf_8xb128_in1k.py'] + +# model settings +model = dict( + backbone=dict(type='RegNet', arch='regnetx_12gf'), + head=dict(in_channels=2240, )) + +# for batch_size 512, use lr = 0.4 +optimizer = dict(lr=0.4) + +data = dict(samples_per_gpu=64, ) diff --git a/configs/regnet/regnetx-3.2gf_8xb64_in1k.py b/configs/regnet/regnetx-3.2gf_8xb64_in1k.py new file mode 100644 index 0000000..98c4a0b --- /dev/null +++ b/configs/regnet/regnetx-3.2gf_8xb64_in1k.py @@ -0,0 +1,11 @@ +_base_ = ['./regnetx-400mf_8xb128_in1k.py'] + +# model settings +model = dict( + backbone=dict(type='RegNet', arch='regnetx_3.2gf'), + head=dict(in_channels=1008, )) + +# for batch_size 512, use lr = 0.4 +optimizer = dict(lr=0.4) + +data = dict(samples_per_gpu=64, ) diff --git a/configs/regnet/regnetx-4.0gf_8xb64_in1k.py b/configs/regnet/regnetx-4.0gf_8xb64_in1k.py new file mode 100644 index 0000000..87bc847 --- /dev/null +++ b/configs/regnet/regnetx-4.0gf_8xb64_in1k.py @@ -0,0 +1,11 @@ +_base_ = ['./regnetx-400mf_8xb128_in1k.py'] + +# model settings +model = dict( + backbone=dict(type='RegNet', arch='regnetx_4.0gf'), + head=dict(in_channels=1360, )) + +# for batch_size 512, use lr = 0.4 +optimizer = dict(lr=0.4) + +data = dict(samples_per_gpu=64, ) diff --git a/configs/regnet/regnetx-400mf_8xb128_in1k.py b/configs/regnet/regnetx-400mf_8xb128_in1k.py new file mode 100644 index 0000000..86fee90 --- /dev/null +++ b/configs/regnet/regnetx-400mf_8xb128_in1k.py @@ -0,0 +1,77 @@ +_base_ = [ + '../_base_/models/regnet/regnetx_400mf.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs1024_coslr.py', + '../_base_/default_runtime.py' +] + +# Precise BN hook will update the bn stats, so this hook should be executed +# before CheckpointHook, which has priority of 'NORMAL'. So set the +# priority of PreciseBNHook to 'ABOVE_NORMAL' here. +custom_hooks = [ + dict( + type='PreciseBNHook', + num_samples=8192, + interval=1, + priority='ABOVE_NORMAL') +] + +# sgd with nesterov, base ls is 0.8 for batch_size 1024, +# 0.4 for batch_size 512 and 0.2 for batch_size 256 when training ImageNet1k +optimizer = dict(lr=0.8, nesterov=True) + +# dataset settings +dataset_type = 'ImageNet' + +# normalization params, in order of BGR +NORM_MEAN = [103.53, 116.28, 123.675] +NORM_STD = [57.375, 57.12, 58.395] + +# lighting params, in order of RGB, from repo. pycls +EIGVAL = [0.2175, 0.0188, 0.0045] +EIGVEC = [[-0.5675, 0.7192, 0.4009], [-0.5808, -0.0045, -0.814], + [-0.5836, -0.6948, 0.4203]] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='Lighting', + eigval=EIGVAL, + eigvec=EIGVEC, + alphastd=25.5, # because the value range of images is [0,255] + to_rgb=True + ), # BGR image from cv2 in LoadImageFromFile, convert to RGB here + dict(type='Normalize', mean=NORM_MEAN, std=NORM_STD, + to_rgb=True), # RGB2BGR + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', mean=NORM_MEAN, std=NORM_STD, to_rgb=False), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=128, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) diff --git a/configs/regnet/regnetx-6.4gf_8xb64_in1k.py b/configs/regnet/regnetx-6.4gf_8xb64_in1k.py new file mode 100644 index 0000000..02ee424 --- /dev/null +++ b/configs/regnet/regnetx-6.4gf_8xb64_in1k.py @@ -0,0 +1,11 @@ +_base_ = ['./regnetx-400mf_8xb128_in1k.py'] + +# model settings +model = dict( + backbone=dict(type='RegNet', arch='regnetx_6.4gf'), + head=dict(in_channels=1624, )) + +# for batch_size 512, use lr = 0.4 +optimizer = dict(lr=0.4) + +data = dict(samples_per_gpu=64, ) diff --git a/configs/regnet/regnetx-8.0gf_8xb64_in1k.py b/configs/regnet/regnetx-8.0gf_8xb64_in1k.py new file mode 100644 index 0000000..84ab811 --- /dev/null +++ b/configs/regnet/regnetx-8.0gf_8xb64_in1k.py @@ -0,0 +1,11 @@ +_base_ = ['./regnetx-400mf_8xb128_in1k.py'] + +# model settings +model = dict( + backbone=dict(type='RegNet', arch='regnetx_8.0gf'), + head=dict(in_channels=1920, )) + +# for batch_size 512, use lr = 0.4 +optimizer = dict(lr=0.4) + +data = dict(samples_per_gpu=64, ) diff --git a/configs/regnet/regnetx-800mf_8xb128_in1k.py b/configs/regnet/regnetx-800mf_8xb128_in1k.py new file mode 100644 index 0000000..9cd7137 --- /dev/null +++ b/configs/regnet/regnetx-800mf_8xb128_in1k.py @@ -0,0 +1,6 @@ +_base_ = ['./regnetx-400mf_8xb128_in1k.py'] + +# model settings +model = dict( + backbone=dict(type='RegNet', arch='regnetx_800mf'), + head=dict(in_channels=672, )) diff --git a/configs/repmlp/README.md b/configs/repmlp/README.md new file mode 100644 index 0000000..4533463 --- /dev/null +++ b/configs/repmlp/README.md @@ -0,0 +1,93 @@ +# RepMLP + +> [RepMLP: Re-parameterizing Convolutions into Fully-connected Layers forImage Recognition](https://arxiv.org/abs/2105.01883) + + + +## Abstract + +We propose RepMLP, a multi-layer-perceptron-style neural network building block for image recognition, which is composed of a series of fully-connected (FC) layers. Compared to convolutional layers, FC layers are more efficient, better at modeling the long-range dependencies and positional patterns, but worse at capturing the local structures, hence usually less favored for image recognition. We propose a structural re-parameterization technique that adds local prior into an FC to make it powerful for image recognition. Specifically, we construct convolutional layers inside a RepMLP during training and merge them into the FC for inference. On CIFAR, a simple pure-MLP model shows performance very close to CNN. By inserting RepMLP in traditional CNN, we improve ResNets by 1.8% accuracy on ImageNet, 2.9% for face recognition, and 2.3% mIoU on Cityscapes with lower FLOPs. Our intriguing findings highlight that combining the global representational capacity and positional perception of FC with the local prior of convolution can improve the performance of neural network with faster speed on both the tasks with translation invariance (e.g., semantic segmentation) and those with aligned images and positional patterns (e.g., face recognition). + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------: | :-------: | :------: | :-------: | :-------: | :-------------------------------------------------------------------------: | :---------------------------------------------------------------------------: | +| RepMLP-B224\* | 68.24 | 6.71 | 80.41 | 95.12 | [train_cfg](https://github.com/open-mmlab/mmclassification/blob/master/configs/repmlp/repmlp-base_8xb64_in1k.py) \| [deploy_cfg](https://github.com/open-mmlab/mmclassification/blob/master/configs/repmlp/repmlp-base_delopy_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repmlp/repmlp-base_3rdparty_8xb64_in1k_20220330-1cb1f11b.pth) | +| RepMLP-B256\* | 96.45 | 9.69 | 81.11 | 95.5 | [train_cfg](https://github.com/open-mmlab/mmclassification/blob/master/configs/repmlp/repmlp-base_8xb64_in1k-256px.py) \| [deploy_cfg](https://github.com/open-mmlab/mmclassification/blob/master/configs/repmlp/repmlp-b256_deploy_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repmlp/repmlp-base_3rdparty_8xb64_in1k-256px_20220330-7c5a91ce.pth) | + +*Models with * are converted from [the official repo.](https://github.com/DingXiaoH/RepMLP). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## How to use + +The checkpoints provided are all `training-time` models. Use the reparameterize tool to switch them to more efficient `inference-time` architecture, which not only has fewer parameters but also less calculations. + +### Use tool + +Use provided tool to reparameterize the given model and save the checkpoint: + +```bash +python tools/convert_models/reparameterize_model.py ${CFG_PATH} ${SRC_CKPT_PATH} ${TARGET_CKPT_PATH} +``` + +`${CFG_PATH}` is the config file, `${SRC_CKPT_PATH}` is the source chenpoint file, `${TARGET_CKPT_PATH}` is the target deploy weight file path. + +To use reparameterized weights, the config file must switch to the deploy config files. + +```bash +python tools/test.py ${Deploy_CFG} ${Deploy_Checkpoint} --metrics accuracy +``` + +### In the code + +Use `backbone.switch_to_deploy()` or `classificer.backbone.switch_to_deploy()` to switch to the deploy mode. For example: + +```python +from mmcls.models import build_backbone + +backbone_cfg=dict(type='RepMLPNet', arch='B', img_size=224, reparam_conv_kernels=(1, 3), deploy=False) +backbone = build_backbone(backbone_cfg) +backbone.switch_to_deploy() +``` + +or + +```python +from mmcls.models import build_classifier + +cfg = dict( + type='ImageClassifier', + backbone=dict( + type='RepMLPNet', + arch='B', + img_size=224, + reparam_conv_kernels=(1, 3), + deploy=False), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) + +classifier = build_classifier(cfg) +classifier.backbone.switch_to_deploy() +``` + +## Citation + +``` +@article{ding2021repmlp, + title={Repmlp: Re-parameterizing convolutions into fully-connected layers for image recognition}, + author={Ding, Xiaohan and Xia, Chunlong and Zhang, Xiangyu and Chu, Xiaojie and Han, Jungong and Ding, Guiguang}, + journal={arXiv preprint arXiv:2105.01883}, + year={2021} +} +``` diff --git a/configs/repmlp/metafile.yml b/configs/repmlp/metafile.yml new file mode 100644 index 0000000..19caecb --- /dev/null +++ b/configs/repmlp/metafile.yml @@ -0,0 +1,48 @@ +Collections: + - Name: RepMLP + Metadata: + Training Data: ImageNet-1k + Architecture: + - Multi-layer Perceptron + - Re-parameterization Convolution + Paper: + URL: https://arxiv.org/abs/2105.01883 + Title: 'RepMLP: Re-parameterizing Convolutions into Fully-connected Layers for Image Recognition' + README: configs/repmlp/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.21.0/mmcls/models/backbones/repmlp.py + Version: v0.21.0 + +Models: + - Name: repmlp-base_3rdparty_8xb64_in1k + In Collection: RepMLP + Config: configs/repmlp/repmlp-base_8xb64_in1k.py + Metadata: + FLOPs: 6710000000 # 6.71 G + Parameters: 68240000 # 68.24 M + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 80.41 + Top 5 Accuracy: 95.14 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/repmlp/repmlp-base_3rdparty_8xb64_in1k_20220330-1cb1f11b.pth + Converted From: + Weights: https://github.com/DingXiaoH/RepMLP + Code: https://github.com/DingXiaoH/RepMLP/blob/072d8516beba83d75dfe6ebb12f625abad4b53d5/repmlpnet.py#L274 + - Name: repmlp-base_3rdparty_8xb64_in1k-256px.py + In Collection: RepMLP + Config: configs/repmlp/repmlp-base_8xb64_in1k-256px.py + Metadata: + FLOPs: 9690000000 # 9.69 G + Parameters: 96450000 # 96.45M + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.11 + Top 5 Accuracy: 95.50 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/repmlp/repmlp-base_3rdparty_8xb64_in1k-256px_20220330-7c5a91ce.pth + Converted From: + Weights: https://github.com/DingXiaoH/RepMLP + Code: https://github.com/DingXiaoH/RepMLP/blob/072d8516beba83d75dfe6ebb12f625abad4b53d5/repmlpnet.py#L278 diff --git a/configs/repmlp/repmlp-base_8xb64_in1k-256px.py b/configs/repmlp/repmlp-base_8xb64_in1k-256px.py new file mode 100644 index 0000000..ff03c6f --- /dev/null +++ b/configs/repmlp/repmlp-base_8xb64_in1k-256px.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/repmlp-base_224.py', + '../_base_/datasets/imagenet_bs64_mixer_224.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(img_size=256)) + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256 * 256 // 224, -1), backend='pillow'), + dict(type='CenterCrop', crop_size=256), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + val=dict(pipeline=test_pipeline), test=dict(pipeline=test_pipeline)) diff --git a/configs/repmlp/repmlp-base_8xb64_in1k.py b/configs/repmlp/repmlp-base_8xb64_in1k.py new file mode 100644 index 0000000..430cdc0 --- /dev/null +++ b/configs/repmlp/repmlp-base_8xb64_in1k.py @@ -0,0 +1,20 @@ +_base_ = [ + '../_base_/models/repmlp-base_224.py', + '../_base_/datasets/imagenet_bs64_pil_resize.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +test_pipeline = [ + dict(type='LoadImageFromFile'), + # resizing to (256, 256) here, different with resizing shorter edge to 256 + dict(type='Resize', size=(256, 256), backend='pillow'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + val=dict(pipeline=test_pipeline), test=dict(pipeline=test_pipeline)) diff --git a/configs/repmlp/repmlp-base_delopy_8xb64_in1k.py b/configs/repmlp/repmlp-base_delopy_8xb64_in1k.py new file mode 100644 index 0000000..b5b2c88 --- /dev/null +++ b/configs/repmlp/repmlp-base_delopy_8xb64_in1k.py @@ -0,0 +1,3 @@ +_base_ = ['./repmlp-base_8xb64_in1k.py'] + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repmlp/repmlp-base_deploy_8xb64_in1k-256px.py b/configs/repmlp/repmlp-base_deploy_8xb64_in1k-256px.py new file mode 100644 index 0000000..27ff50a --- /dev/null +++ b/configs/repmlp/repmlp-base_deploy_8xb64_in1k-256px.py @@ -0,0 +1,3 @@ +_base_ = ['./repmlp-base_8xb64_in1k-256px.py'] + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/README.md b/configs/repvgg/README.md new file mode 100644 index 0000000..b934132 --- /dev/null +++ b/configs/repvgg/README.md @@ -0,0 +1,101 @@ +# RepVGG + +> [Repvgg: Making vgg-style convnets great again](https://arxiv.org/abs/2101.03697) + + + +## Abstract + +We present a simple but powerful architecture of convolutional neural network, which has a VGG-like inference-time body composed of nothing but a stack of 3x3 convolution and ReLU, while the training-time model has a multi-branch topology. Such decoupling of the training-time and inference-time architecture is realized by a structural re-parameterization technique so that the model is named RepVGG. On ImageNet, RepVGG reaches over 80% top-1 accuracy, which is the first time for a plain model, to the best of our knowledge. On NVIDIA 1080Ti GPU, RepVGG models run 83% faster than ResNet-50 or 101% faster than ResNet-101 with higher accuracy and show favorable accuracy-speed trade-off compared to the state-of-the-art models like EfficientNet and RegNet. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Epochs | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------: | :----: | :-------------------------------: | :-----------------------------: | :-------: | :-------: | :----------------------------------------------: | :-------------------------------------------------: | +| RepVGG-A0\* | 120 | 9.11(train) \| 8.31 (deploy) | 1.52 (train) \| 1.36 (deploy) | 72.41 | 90.50 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-A0_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-A0_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-A0_3rdparty_4xb64-coslr-120e_in1k_20210909-883ab98c.pth) | +| RepVGG-A1\* | 120 | 14.09 (train) \| 12.79 (deploy) | 2.64 (train) \| 2.37 (deploy) | 74.47 | 91.85 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-A1_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-A1_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-A1_3rdparty_4xb64-coslr-120e_in1k_20210909-24003a24.pth) | +| RepVGG-A2\* | 120 | 28.21 (train) \| 25.5 (deploy) | 5.7 (train) \| 5.12 (deploy) | 76.48 | 93.01 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-A2_4xb64-coslr-120e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-A2_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-A2_3rdparty_4xb64-coslr-120e_in1k_20210909-97d7695a.pth) | +| RepVGG-B0\* | 120 | 15.82 (train) \| 14.34 (deploy) | 3.42 (train) \| 3.06 (deploy) | 75.14 | 92.42 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B0_4xb64-coslr-120e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B0_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B0_3rdparty_4xb64-coslr-120e_in1k_20210909-446375f4.pth) | +| RepVGG-B1\* | 120 | 57.42 (train) \| 51.83 (deploy) | 13.16 (train) \| 11.82 (deploy) | 78.37 | 94.11 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B1_4xb64-coslr-120e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B1_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B1_3rdparty_4xb64-coslr-120e_in1k_20210909-750cdf67.pth) | +| RepVGG-B1g2\* | 120 | 45.78 (train) \| 41.36 (deploy) | 9.82 (train) \| 8.82 (deploy) | 77.79 | 93.88 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B1g2_4xb64-coslr-120e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B1g2_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B1g2_3rdparty_4xb64-coslr-120e_in1k_20210909-344f6422.pth) | +| RepVGG-B1g4\* | 120 | 39.97 (train) \| 36.13 (deploy) | 8.15 (train) \| 7.32 (deploy) | 77.58 | 93.84 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B1g4_4xb64-coslr-120e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B1g4_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B1g4_3rdparty_4xb64-coslr-120e_in1k_20210909-d4c1a642.pth) | +| RepVGG-B2\* | 120 | 89.02 (train) \| 80.32 (deploy) | 20.46 (train) \| 18.39 (deploy) | 78.78 | 94.42 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B2_4xb64-coslr-120e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B2_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B2_3rdparty_4xb64-coslr-120e_in1k_20210909-bd6b937c.pth) | +| RepVGG-B2g4\* | 200 | 61.76 (train) \| 55.78 (deploy) | 12.63 (train) \| 11.34 (deploy) | 79.38 | 94.68 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B2g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B2g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B2g4_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-7b7955f0.pth) | +| RepVGG-B3\* | 200 | 123.09 (train) \| 110.96 (deploy) | 29.17 (train) \| 26.22 (deploy) | 80.52 | 95.26 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B3_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B3_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-dda968bf.pth) | +| RepVGG-B3g4\* | 200 | 83.83 (train) \| 75.63 (deploy) | 17.9 (train) \| 16.08 (deploy) | 80.22 | 95.10 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B3g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B3g4_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-4e54846a.pth) | +| RepVGG-D2se\* | 200 | 133.33 (train) \| 120.39 (deploy) | 36.56 (train) \| 32.85 (deploy) | 81.81 | 95.94 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-D2se_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) \|[config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-D2se_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-D2se_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-cf3139b7.pth) | + +*Models with * are converted from the [official repo](https://github.com/DingXiaoH/RepVGG). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## How to use + +The checkpoints provided are all `training-time` models. Use the reparameterize tool to switch them to more efficient `inference-time` architecture, which not only has fewer parameters but also less calculations. + +### Use tool + +Use provided tool to reparameterize the given model and save the checkpoint: + +```bash +python tools/convert_models/reparameterize_model.py ${CFG_PATH} ${SRC_CKPT_PATH} ${TARGET_CKPT_PATH} +``` + +`${CFG_PATH}` is the config file, `${SRC_CKPT_PATH}` is the source chenpoint file, `${TARGET_CKPT_PATH}` is the target deploy weight file path. + +To use reparameterized weights, the config file must switch to the deploy config files. + +```bash +python tools/test.py ${Deploy_CFG} ${Deploy_Checkpoint} --metrics accuracy +``` + +### In the code + +Use `backbone.switch_to_deploy()` or `classificer.backbone.switch_to_deploy()` to switch to the deploy mode. For example: + +```python +from mmcls.models import build_backbone + +backbone_cfg=dict(type='RepVGG',arch='A0'), +backbone = build_backbone(backbone_cfg) +backbone.switch_to_deploy() +``` + +or + +```python +from mmcls.models import build_classifier + +cfg = dict( + type='ImageClassifier', + backbone=dict( + type='RepVGG', + arch='A0'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) + +classifier = build_classifier(cfg) +classifier.backbone.switch_to_deploy() +``` + +## Citation + +``` +@inproceedings{ding2021repvgg, + title={Repvgg: Making vgg-style convnets great again}, + author={Ding, Xiaohan and Zhang, Xiangyu and Ma, Ningning and Han, Jungong and Ding, Guiguang and Sun, Jian}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={13733--13742}, + year={2021} +} +``` diff --git a/configs/repvgg/deploy/repvgg-A0_deploy_4xb64-coslr-120e_in1k.py b/configs/repvgg/deploy/repvgg-A0_deploy_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..20787f2 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-A0_deploy_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-A0_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-A1_deploy_4xb64-coslr-120e_in1k.py b/configs/repvgg/deploy/repvgg-A1_deploy_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..eea0da9 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-A1_deploy_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-A1_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-A2_deploy_4xb64-coslr-120e_in1k.py b/configs/repvgg/deploy/repvgg-A2_deploy_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..7b0cea7 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-A2_deploy_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-A2_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-B0_deploy_4xb64-coslr-120e_in1k.py b/configs/repvgg/deploy/repvgg-B0_deploy_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..23a2898 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-B0_deploy_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-B0_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-B1_deploy_4xb64-coslr-120e_in1k.py b/configs/repvgg/deploy/repvgg-B1_deploy_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..24355ed --- /dev/null +++ b/configs/repvgg/deploy/repvgg-B1_deploy_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-B1_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-B1g2_deploy_4xb64-coslr-120e_in1k.py b/configs/repvgg/deploy/repvgg-B1g2_deploy_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..579fcc4 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-B1g2_deploy_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-B1g2_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-B1g4_deploy_4xb64-coslr-120e_in1k.py b/configs/repvgg/deploy/repvgg-B1g4_deploy_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..eab5d44 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-B1g4_deploy_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-B1g4_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-B2_deploy_4xb64-coslr-120e_in1k.py b/configs/repvgg/deploy/repvgg-B2_deploy_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..0681f14 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-B2_deploy_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-B2_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-B2g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py b/configs/repvgg/deploy/repvgg-B2g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py new file mode 100644 index 0000000..8f18401 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-B2g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-B2g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-B3_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py b/configs/repvgg/deploy/repvgg-B3_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py new file mode 100644 index 0000000..e60b067 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-B3_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-B3g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py b/configs/repvgg/deploy/repvgg-B3g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py new file mode 100644 index 0000000..46f1877 --- /dev/null +++ b/configs/repvgg/deploy/repvgg-B3g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/deploy/repvgg-D2se_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py b/configs/repvgg/deploy/repvgg-D2se_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py new file mode 100644 index 0000000..66dff3b --- /dev/null +++ b/configs/repvgg/deploy/repvgg-D2se_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py @@ -0,0 +1,3 @@ +_base_ = '../repvgg-D2se_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py' + +model = dict(backbone=dict(deploy=True)) diff --git a/configs/repvgg/metafile.yml b/configs/repvgg/metafile.yml new file mode 100644 index 0000000..84fee59 --- /dev/null +++ b/configs/repvgg/metafile.yml @@ -0,0 +1,208 @@ +Collections: + - Name: RepVGG + Metadata: + Training Data: ImageNet-1k + Architecture: + - re-parameterization Convolution + - VGG-style Neural Network + Paper: + URL: https://arxiv.org/abs/2101.03697 + Title: 'RepVGG: Making VGG-style ConvNets Great Again' + README: configs/repvgg/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.16.0/mmcls/models/backbones/repvgg.py#L257 + Version: v0.16.0 + +Models: + - Name: repvgg-A0_3rdparty_4xb64-coslr-120e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-A0_4xb64-coslr-120e_in1k.py + Metadata: + FLOPs: 1520000000 + Parameters: 9110000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 72.41 + Top 5 Accuracy: 90.50 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-A0_3rdparty_4xb64-coslr-120e_in1k_20210909-883ab98c.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L196 + - Name: repvgg-A1_3rdparty_4xb64-coslr-120e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-A1_4xb64-coslr-120e_in1k.py + Metadata: + FLOPs: 2640000000 + Parameters: 14090000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 74.47 + Top 5 Accuracy: 91.85 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-A1_3rdparty_4xb64-coslr-120e_in1k_20210909-24003a24.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L200 + - Name: repvgg-A2_3rdparty_4xb64-coslr-120e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-A2_4xb64-coslr-120e_in1k.py + Metadata: + FLOPs: 28210000000 + Parameters: 5700000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 76.48 + Top 5 Accuracy: 93.01 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-A2_3rdparty_4xb64-coslr-120e_in1k_20210909-97d7695a.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L204 + - Name: repvgg-B0_3rdparty_4xb64-coslr-120e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-B0_4xb64-coslr-120e_in1k.py + Metadata: + FLOPs: 15820000000 + Parameters: 3420000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 75.14 + Top 5 Accuracy: 92.42 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B0_3rdparty_4xb64-coslr-120e_in1k_20210909-446375f4.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L208 + - Name: repvgg-B1_3rdparty_4xb64-coslr-120e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-B1_4xb64-coslr-120e_in1k.py + Metadata: + FLOPs: 57420000000 + Parameters: 13160000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 78.37 + Top 5 Accuracy: 94.11 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B1_3rdparty_4xb64-coslr-120e_in1k_20210909-750cdf67.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L212 + - Name: repvgg-B1g2_3rdparty_4xb64-coslr-120e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-B1g2_4xb64-coslr-120e_in1k.py + Metadata: + FLOPs: 45780000000 + Parameters: 9820000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 77.79 + Top 5 Accuracy: 93.88 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B1g2_3rdparty_4xb64-coslr-120e_in1k_20210909-344f6422.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L216 + - Name: repvgg-B1g4_3rdparty_4xb64-coslr-120e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-B1g4_4xb64-coslr-120e_in1k.py + Metadata: + FLOPs: 39970000000 + Parameters: 8150000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 77.58 + Top 5 Accuracy: 93.84 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B1g4_3rdparty_4xb64-coslr-120e_in1k_20210909-d4c1a642.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L220 + - Name: repvgg-B2_3rdparty_4xb64-coslr-120e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-B2_4xb64-coslr-120e_in1k.py + Metadata: + FLOPs: 89020000000 + Parameters: 20420000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 78.78 + Top 5 Accuracy: 94.42 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B2_3rdparty_4xb64-coslr-120e_in1k_20210909-bd6b937c.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L225 + - Name: repvgg-B2g4_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-B2g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py + Metadata: + FLOPs: 61760000000 + Parameters: 12630000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 79.38 + Top 5 Accuracy: 94.68 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B2g4_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-7b7955f0.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L229 + - Name: repvgg-B3_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py + Metadata: + FLOPs: 123090000000 + Parameters: 29170000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 80.52 + Top 5 Accuracy: 95.26 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B3_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-dda968bf.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L238 + - Name: repvgg-B3g4_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py + Metadata: + FLOPs: 83830000000 + Parameters: 17900000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 80.22 + Top 5 Accuracy: 95.10 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B3g4_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-4e54846a.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L238 + - Name: repvgg-D2se_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k + In Collection: RepVGG + Config: configs/repvgg/repvgg-D2se_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py + Metadata: + FLOPs: 133330000000 + Parameters: 36560000 + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 81.81 + Top 5 Accuracy: 95.94 + Weights: https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-D2se_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-cf3139b7.pth + Converted From: + Weights: https://drive.google.com/drive/folders/1Avome4KvNp0Lqh2QwhXO6L5URQjzCjUq + Code: https://github.com/DingXiaoH/RepVGG/blob/9f272318abfc47a2b702cd0e916fca8d25d683e7/repvgg.py#L250 diff --git a/configs/repvgg/repvgg-A0_4xb64-coslr-120e_in1k.py b/configs/repvgg/repvgg-A0_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..a7fd3bb --- /dev/null +++ b/configs/repvgg/repvgg-A0_4xb64-coslr-120e_in1k.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/repvgg-A0_in1k.py', + '../_base_/datasets/imagenet_bs64_pil_resize.py', + '../_base_/schedules/imagenet_bs256_coslr.py', + '../_base_/default_runtime.py' +] + +runner = dict(max_epochs=120) diff --git a/configs/repvgg/repvgg-A1_4xb64-coslr-120e_in1k.py b/configs/repvgg/repvgg-A1_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..649020f --- /dev/null +++ b/configs/repvgg/repvgg-A1_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-A0_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(arch='A1')) diff --git a/configs/repvgg/repvgg-A2_4xb64-coslr-120e_in1k.py b/configs/repvgg/repvgg-A2_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..eedaf2d --- /dev/null +++ b/configs/repvgg/repvgg-A2_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-A0_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(arch='A2'), head=dict(in_channels=1408)) diff --git a/configs/repvgg/repvgg-B0_4xb64-coslr-120e_in1k.py b/configs/repvgg/repvgg-B0_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..b3ce7ea --- /dev/null +++ b/configs/repvgg/repvgg-B0_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-A0_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(arch='B0'), head=dict(in_channels=1280)) diff --git a/configs/repvgg/repvgg-B1_4xb64-coslr-120e_in1k.py b/configs/repvgg/repvgg-B1_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..30adea3 --- /dev/null +++ b/configs/repvgg/repvgg-B1_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-A0_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(arch='B1'), head=dict(in_channels=2048)) diff --git a/configs/repvgg/repvgg-B1g2_4xb64-coslr-120e_in1k.py b/configs/repvgg/repvgg-B1g2_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..2749db8 --- /dev/null +++ b/configs/repvgg/repvgg-B1g2_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-A0_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(arch='B1g2'), head=dict(in_channels=2048)) diff --git a/configs/repvgg/repvgg-B1g4_4xb64-coslr-120e_in1k.py b/configs/repvgg/repvgg-B1g4_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..2647690 --- /dev/null +++ b/configs/repvgg/repvgg-B1g4_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-A0_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(arch='B1g4'), head=dict(in_channels=2048)) diff --git a/configs/repvgg/repvgg-B2_4xb64-coslr-120e_in1k.py b/configs/repvgg/repvgg-B2_4xb64-coslr-120e_in1k.py new file mode 100644 index 0000000..4d21556 --- /dev/null +++ b/configs/repvgg/repvgg-B2_4xb64-coslr-120e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-A0_4xb64-coslr-120e_in1k.py' + +model = dict(backbone=dict(arch='B2'), head=dict(in_channels=2560)) diff --git a/configs/repvgg/repvgg-B2g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py b/configs/repvgg/repvgg-B2g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py new file mode 100644 index 0000000..11331cf --- /dev/null +++ b/configs/repvgg/repvgg-B2g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py' + +model = dict(backbone=dict(arch='B2g4')) diff --git a/configs/repvgg/repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py b/configs/repvgg/repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py new file mode 100644 index 0000000..7b6dc50 --- /dev/null +++ b/configs/repvgg/repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/repvgg-B3_lbs-mixup_in1k.py', + '../_base_/datasets/imagenet_bs64_pil_resize.py', + '../_base_/schedules/imagenet_bs256_200e_coslr_warmup.py', + '../_base_/default_runtime.py' +] diff --git a/configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py b/configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py new file mode 100644 index 0000000..67e3688 --- /dev/null +++ b/configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py' + +model = dict(backbone=dict(arch='B3g4')) diff --git a/configs/repvgg/repvgg-D2se_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py b/configs/repvgg/repvgg-D2se_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py new file mode 100644 index 0000000..d235610 --- /dev/null +++ b/configs/repvgg/repvgg-D2se_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py @@ -0,0 +1,3 @@ +_base_ = './repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py' + +model = dict(backbone=dict(arch='D2se')) diff --git a/configs/res2net/README.md b/configs/res2net/README.md new file mode 100644 index 0000000..6119009 --- /dev/null +++ b/configs/res2net/README.md @@ -0,0 +1,37 @@ +# Res2Net + +> [Res2Net: A New Multi-scale Backbone Architecture](https://arxiv.org/pdf/1904.01169.pdf) + + + +## Abstract + +Representing features at multiple scales is of great importance for numerous vision tasks. Recent advances in backbone convolutional neural networks (CNNs) continually demonstrate stronger multi-scale representation ability, leading to consistent performance gains on a wide range of applications. However, most existing methods represent the multi-scale features in a layer-wise manner. In this paper, we propose a novel building block for CNNs, namely Res2Net, by constructing hierarchical residual-like connections within one single residual block. The Res2Net represents multi-scale features at a granular level and increases the range of receptive fields for each network layer. The proposed Res2Net block can be plugged into the state-of-the-art backbone CNN models, e.g., ResNet, ResNeXt, and DLA. We evaluate the Res2Net block on all these models and demonstrate consistent performance gains over baseline models on widely-used datasets, e.g., CIFAR-100 and ImageNet. Further ablation studies and experimental results on representative computer vision tasks, i.e., object detection, class activation mapping, and salient object detection, further verify the superiority of the Res2Net over the state-of-the-art baseline methods. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | resolution | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :------------------: | :--------: | :-------: | :------: | :-------: | :-------: | :----------------------------------------------------------------: | :-------------------------------------------------------------------: | +| Res2Net-50-14w-8s\* | 224x224 | 25.06 | 4.22 | 78.14 | 93.85 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/res2net/res2net50-w14-s8_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/res2net/res2net50-w14-s8_3rdparty_8xb32_in1k_20210927-bc967bf1.pth) \| [log](<>) | +| Res2Net-50-26w-8s\* | 224x224 | 48.40 | 8.39 | 79.20 | 94.36 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/res2net/res2net50-w26-s8_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/res2net/res2net50-w26-s8_3rdparty_8xb32_in1k_20210927-f547a94b.pth) \| [log](<>) | +| Res2Net-101-26w-4s\* | 224x224 | 45.21 | 8.12 | 79.19 | 94.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/res2net/res2net101-w26-s4_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/res2net/res2net101-w26-s4_3rdparty_8xb32_in1k_20210927-870b6c36.pth) \| [log](<>) | + +*Models with * are converted from the [official repo](https://github.com/Res2Net/Res2Net-PretrainedModels). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +``` +@article{gao2019res2net, + title={Res2Net: A New Multi-scale Backbone Architecture}, + author={Gao, Shang-Hua and Cheng, Ming-Ming and Zhao, Kai and Zhang, Xin-Yu and Yang, Ming-Hsuan and Torr, Philip}, + journal={IEEE TPAMI}, + year={2021}, + doi={10.1109/TPAMI.2019.2938758}, +} +``` diff --git a/configs/res2net/metafile.yml b/configs/res2net/metafile.yml new file mode 100644 index 0000000..d76f898 --- /dev/null +++ b/configs/res2net/metafile.yml @@ -0,0 +1,70 @@ +Collections: + - Name: Res2Net + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - Batch Normalization + - Convolution + - Global Average Pooling + - ReLU + - Res2Net Block + Paper: + Title: 'Res2Net: A New Multi-scale Backbone Architecture' + URL: https://arxiv.org/pdf/1904.01169.pdf + README: configs/res2net/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.17.0/mmcls/models/backbones/res2net.py + Version: v0.17.0 + +Models: + - Name: res2net50-w14-s8_3rdparty_8xb32_in1k + Metadata: + FLOPs: 4220000000 + Parameters: 25060000 + In Collection: Res2Net + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.14 + Top 5 Accuracy: 93.85 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/res2net/res2net50-w14-s8_3rdparty_8xb32_in1k_20210927-bc967bf1.pth + Converted From: + Weights: https://1drv.ms/u/s!AkxDDnOtroRPdOTqhF8ne_aakDI?e=EVb8Ri + Code: https://github.com/Res2Net/Res2Net-PretrainedModels/blob/master/res2net.py#L221 + Config: configs/res2net/res2net50-w14-s8_8xb32_in1k.py + - Name: res2net50-w26-s8_3rdparty_8xb32_in1k + Metadata: + FLOPs: 8390000000 + Parameters: 48400000 + In Collection: Res2Net + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.20 + Top 5 Accuracy: 94.36 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/res2net/res2net50-w26-s8_3rdparty_8xb32_in1k_20210927-f547a94b.pth + Converted From: + Weights: https://1drv.ms/u/s!AkxDDnOtroRPdTrAd_Afzc26Z7Q?e=slYqsR + Code: https://github.com/Res2Net/Res2Net-PretrainedModels/blob/master/res2net.py#L201 + Config: configs/res2net/res2net50-w26-s8_8xb32_in1k.py + - Name: res2net101-w26-s4_3rdparty_8xb32_in1k + Metadata: + FLOPs: 8120000000 + Parameters: 45210000 + In Collection: Res2Net + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.19 + Top 5 Accuracy: 94.44 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/res2net/res2net101-w26-s4_3rdparty_8xb32_in1k_20210927-870b6c36.pth + Converted From: + Weights: https://1drv.ms/u/s!AkxDDnOtroRPcJRgTLkahL0cFYw?e=nwbnic + Code: https://github.com/Res2Net/Res2Net-PretrainedModels/blob/master/res2net.py#L181 + Config: configs/res2net/res2net101-w26-s4_8xb32_in1k.py diff --git a/configs/res2net/res2net101-w26-s4_8xb32_in1k.py b/configs/res2net/res2net101-w26-s4_8xb32_in1k.py new file mode 100644 index 0000000..7ebe9e9 --- /dev/null +++ b/configs/res2net/res2net101-w26-s4_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/res2net101-w26-s4.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/res2net/res2net50-w14-s8_8xb32_in1k.py b/configs/res2net/res2net50-w14-s8_8xb32_in1k.py new file mode 100644 index 0000000..56cc02e --- /dev/null +++ b/configs/res2net/res2net50-w14-s8_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/res2net50-w14-s8.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/res2net/res2net50-w26-s8_8xb32_in1k.py b/configs/res2net/res2net50-w26-s8_8xb32_in1k.py new file mode 100644 index 0000000..d7dcbeb --- /dev/null +++ b/configs/res2net/res2net50-w26-s8_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/res2net50-w26-s8.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnest/README.md b/configs/resnest/README.md new file mode 100644 index 0000000..eb6c5fd --- /dev/null +++ b/configs/resnest/README.md @@ -0,0 +1,26 @@ +# ResNeSt + +> [ResNeSt: Split-Attention Networks](https://arxiv.org/abs/2004.08955) + + + +## Abstract + +It is well known that featuremap attention and multi-path representation are important for visual recognition. In this paper, we present a modularized architecture, which applies the channel-wise attention on different network branches to leverage their success in capturing cross-feature interactions and learning diverse representations. Our design results in a simple and unified computation block, which can be parameterized using only a few variables. Our model, named ResNeSt, outperforms EfficientNet in accuracy and latency trade-off on image classification. In addition, ResNeSt has achieved superior transfer learning results on several public benchmarks serving as the backbone, and has been adopted by the winning entries of COCO-LVIS challenge. The source code for complete system and pretrained models are publicly available. + +
+ +
+ +## Citation + +``` +@misc{zhang2020resnest, + title={ResNeSt: Split-Attention Networks}, + author={Hang Zhang and Chongruo Wu and Zhongyue Zhang and Yi Zhu and Haibin Lin and Zhi Zhang and Yue Sun and Tong He and Jonas Mueller and R. Manmatha and Mu Li and Alexander Smola}, + year={2020}, + eprint={2004.08955}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/resnest/resnest101_32xb64_in1k.py b/configs/resnest/resnest101_32xb64_in1k.py new file mode 100644 index 0000000..27b1882 --- /dev/null +++ b/configs/resnest/resnest101_32xb64_in1k.py @@ -0,0 +1,181 @@ +_base_ = ['../_base_/models/resnest101.py', '../_base_/default_runtime.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_lighting_cfg = dict( + eigval=[55.4625, 4.7940, 1.1475], + eigvec=[[-0.5675, 0.7192, 0.4009], [-0.5808, -0.0045, -0.8140], + [-0.5836, -0.6948, 0.4203]], + alphastd=0.1, + to_rgb=True) +policies = [ + dict(type='AutoContrast', prob=0.5), + dict(type='Equalize', prob=0.5), + dict(type='Invert', prob=0.5), + dict( + type='Rotate', + magnitude_key='angle', + magnitude_range=(0, 30), + pad_val=0, + prob=0.5, + random_negative_prob=0.5), + dict( + type='Posterize', + magnitude_key='bits', + magnitude_range=(0, 4), + prob=0.5), + dict( + type='Solarize', + magnitude_key='thr', + magnitude_range=(0, 256), + prob=0.5), + dict( + type='SolarizeAdd', + magnitude_key='magnitude', + magnitude_range=(0, 110), + thr=128, + prob=0.5), + dict( + type='ColorTransform', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Contrast', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Brightness', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Sharpness', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='horizontal', + random_negative_prob=0.5), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='vertical', + random_negative_prob=0.5), + dict( + type='Cutout', + magnitude_key='shape', + magnitude_range=(1, 41), + pad_val=0, + prob=0.5), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='horizontal', + random_negative_prob=0.5, + interpolation='bicubic'), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='vertical', + random_negative_prob=0.5, + interpolation='bicubic') +] +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandAugment', + policies=policies, + num_policies=2, + magnitude_level=12), + dict( + type='RandomResizedCrop', + size=256, + efficientnet_style=True, + interpolation='bicubic', + backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict(type='Lighting', **img_lighting_cfg), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=False), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=256, + efficientnet_style=True, + interpolation='bicubic', + backend='pillow'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') + +# optimizer +optimizer = dict( + type='SGD', + lr=0.8, + momentum=0.9, + weight_decay=1e-4, + paramwise_cfg=dict(bias_decay_mult=0., norm_decay_mult=0.)) +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=5, + warmup_ratio=1e-6, + warmup_by_epoch=True) +runner = dict(type='EpochBasedRunner', max_epochs=270) diff --git a/configs/resnest/resnest101_b64x32_imagenet.py b/configs/resnest/resnest101_b64x32_imagenet.py new file mode 100644 index 0000000..31c3647 --- /dev/null +++ b/configs/resnest/resnest101_b64x32_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnest101_32xb64_in1k.py' + +_deprecation_ = dict( + expected='resnest101_32xb64_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnest/resnest200_64xb32_in1k.py b/configs/resnest/resnest200_64xb32_in1k.py new file mode 100644 index 0000000..3b166a2 --- /dev/null +++ b/configs/resnest/resnest200_64xb32_in1k.py @@ -0,0 +1,181 @@ +_base_ = ['../_base_/models/resnest200.py', '../_base_/default_runtime.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_lighting_cfg = dict( + eigval=[55.4625, 4.7940, 1.1475], + eigvec=[[-0.5675, 0.7192, 0.4009], [-0.5808, -0.0045, -0.8140], + [-0.5836, -0.6948, 0.4203]], + alphastd=0.1, + to_rgb=True) +policies = [ + dict(type='AutoContrast', prob=0.5), + dict(type='Equalize', prob=0.5), + dict(type='Invert', prob=0.5), + dict( + type='Rotate', + magnitude_key='angle', + magnitude_range=(0, 30), + pad_val=0, + prob=0.5, + random_negative_prob=0.5), + dict( + type='Posterize', + magnitude_key='bits', + magnitude_range=(0, 4), + prob=0.5), + dict( + type='Solarize', + magnitude_key='thr', + magnitude_range=(0, 256), + prob=0.5), + dict( + type='SolarizeAdd', + magnitude_key='magnitude', + magnitude_range=(0, 110), + thr=128, + prob=0.5), + dict( + type='ColorTransform', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Contrast', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Brightness', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Sharpness', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='horizontal', + random_negative_prob=0.5), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='vertical', + random_negative_prob=0.5), + dict( + type='Cutout', + magnitude_key='shape', + magnitude_range=(1, 41), + pad_val=0, + prob=0.5), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='horizontal', + random_negative_prob=0.5, + interpolation='bicubic'), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='vertical', + random_negative_prob=0.5, + interpolation='bicubic') +] +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandAugment', + policies=policies, + num_policies=2, + magnitude_level=12), + dict( + type='RandomResizedCrop', + size=320, + efficientnet_style=True, + interpolation='bicubic', + backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict(type='Lighting', **img_lighting_cfg), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=False), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=320, + efficientnet_style=True, + interpolation='bicubic', + backend='pillow'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=32, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') + +# optimizer +optimizer = dict( + type='SGD', + lr=0.8, + momentum=0.9, + weight_decay=1e-4, + paramwise_cfg=dict(bias_decay_mult=0., norm_decay_mult=0.)) +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=5, + warmup_ratio=1e-6, + warmup_by_epoch=True) +runner = dict(type='EpochBasedRunner', max_epochs=270) diff --git a/configs/resnest/resnest200_b32x64_imagenet.py b/configs/resnest/resnest200_b32x64_imagenet.py new file mode 100644 index 0000000..8e62865 --- /dev/null +++ b/configs/resnest/resnest200_b32x64_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnest200_64xb32_in1k.py' + +_deprecation_ = dict( + expected='resnest200_64xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnest/resnest269_64xb32_in1k.py b/configs/resnest/resnest269_64xb32_in1k.py new file mode 100644 index 0000000..7a4db09 --- /dev/null +++ b/configs/resnest/resnest269_64xb32_in1k.py @@ -0,0 +1,181 @@ +_base_ = ['../_base_/models/resnest269.py', '../_base_/default_runtime.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_lighting_cfg = dict( + eigval=[55.4625, 4.7940, 1.1475], + eigvec=[[-0.5675, 0.7192, 0.4009], [-0.5808, -0.0045, -0.8140], + [-0.5836, -0.6948, 0.4203]], + alphastd=0.1, + to_rgb=True) +policies = [ + dict(type='AutoContrast', prob=0.5), + dict(type='Equalize', prob=0.5), + dict(type='Invert', prob=0.5), + dict( + type='Rotate', + magnitude_key='angle', + magnitude_range=(0, 30), + pad_val=0, + prob=0.5, + random_negative_prob=0.5), + dict( + type='Posterize', + magnitude_key='bits', + magnitude_range=(0, 4), + prob=0.5), + dict( + type='Solarize', + magnitude_key='thr', + magnitude_range=(0, 256), + prob=0.5), + dict( + type='SolarizeAdd', + magnitude_key='magnitude', + magnitude_range=(0, 110), + thr=128, + prob=0.5), + dict( + type='ColorTransform', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Contrast', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Brightness', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Sharpness', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='horizontal', + random_negative_prob=0.5), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='vertical', + random_negative_prob=0.5), + dict( + type='Cutout', + magnitude_key='shape', + magnitude_range=(1, 41), + pad_val=0, + prob=0.5), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='horizontal', + random_negative_prob=0.5, + interpolation='bicubic'), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='vertical', + random_negative_prob=0.5, + interpolation='bicubic') +] +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandAugment', + policies=policies, + num_policies=2, + magnitude_level=12), + dict( + type='RandomResizedCrop', + size=416, + efficientnet_style=True, + interpolation='bicubic', + backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict(type='Lighting', **img_lighting_cfg), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=False), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=416, + efficientnet_style=True, + interpolation='bicubic', + backend='pillow'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=32, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') + +# optimizer +optimizer = dict( + type='SGD', + lr=0.8, + momentum=0.9, + weight_decay=1e-4, + paramwise_cfg=dict(bias_decay_mult=0., norm_decay_mult=0.)) +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=5, + warmup_ratio=1e-6, + warmup_by_epoch=True) +runner = dict(type='EpochBasedRunner', max_epochs=270) diff --git a/configs/resnest/resnest269_b32x64_imagenet.py b/configs/resnest/resnest269_b32x64_imagenet.py new file mode 100644 index 0000000..0f8b76c --- /dev/null +++ b/configs/resnest/resnest269_b32x64_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnest269_64xb32_in1k.py' + +_deprecation_ = dict( + expected='resnest269_64xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnest/resnest50_32xb64_in1k.py b/configs/resnest/resnest50_32xb64_in1k.py new file mode 100644 index 0000000..812a3be --- /dev/null +++ b/configs/resnest/resnest50_32xb64_in1k.py @@ -0,0 +1,181 @@ +_base_ = ['../_base_/models/resnest50.py', '../_base_/default_runtime.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_lighting_cfg = dict( + eigval=[55.4625, 4.7940, 1.1475], + eigvec=[[-0.5675, 0.7192, 0.4009], [-0.5808, -0.0045, -0.8140], + [-0.5836, -0.6948, 0.4203]], + alphastd=0.1, + to_rgb=True) +policies = [ + dict(type='AutoContrast', prob=0.5), + dict(type='Equalize', prob=0.5), + dict(type='Invert', prob=0.5), + dict( + type='Rotate', + magnitude_key='angle', + magnitude_range=(0, 30), + pad_val=0, + prob=0.5, + random_negative_prob=0.5), + dict( + type='Posterize', + magnitude_key='bits', + magnitude_range=(0, 4), + prob=0.5), + dict( + type='Solarize', + magnitude_key='thr', + magnitude_range=(0, 256), + prob=0.5), + dict( + type='SolarizeAdd', + magnitude_key='magnitude', + magnitude_range=(0, 110), + thr=128, + prob=0.5), + dict( + type='ColorTransform', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Contrast', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Brightness', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Sharpness', + magnitude_key='magnitude', + magnitude_range=(-0.9, 0.9), + prob=0.5, + random_negative_prob=0.), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='horizontal', + random_negative_prob=0.5), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='vertical', + random_negative_prob=0.5), + dict( + type='Cutout', + magnitude_key='shape', + magnitude_range=(1, 41), + pad_val=0, + prob=0.5), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='horizontal', + random_negative_prob=0.5, + interpolation='bicubic'), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + pad_val=0, + prob=0.5, + direction='vertical', + random_negative_prob=0.5, + interpolation='bicubic') +] +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandAugment', + policies=policies, + num_policies=2, + magnitude_level=12), + dict( + type='RandomResizedCrop', + size=224, + efficientnet_style=True, + interpolation='bicubic', + backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict(type='Lighting', **img_lighting_cfg), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=False), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='CenterCrop', + crop_size=224, + efficientnet_style=True, + interpolation='bicubic', + backend='pillow'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=2, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') + +# optimizer +optimizer = dict( + type='SGD', + lr=0.8, + momentum=0.9, + weight_decay=1e-4, + paramwise_cfg=dict(bias_decay_mult=0., norm_decay_mult=0.)) +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=5, + warmup_ratio=1e-6, + warmup_by_epoch=True) +runner = dict(type='EpochBasedRunner', max_epochs=270) diff --git a/configs/resnest/resnest50_b64x32_imagenet.py b/configs/resnest/resnest50_b64x32_imagenet.py new file mode 100644 index 0000000..c0da422 --- /dev/null +++ b/configs/resnest/resnest50_b64x32_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnest50_32xb64_in1k.py' + +_deprecation_ = dict( + expected='resnest50_32xb64_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/README.md b/configs/resnet/README.md new file mode 100644 index 0000000..d32fcd6 --- /dev/null +++ b/configs/resnet/README.md @@ -0,0 +1,91 @@ +# ResNet + +> [Deep Residual Learning for Image Recognition](https://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html) + + + +## Abstract + +Deeper neural networks are more difficult to train. We present a residual learning framework to ease the training of networks that are substantially deeper than those used previously. We explicitly reformulate the layers as learning residual functions with reference to the layer inputs, instead of learning unreferenced functions. We provide comprehensive empirical evidence showing that these residual networks are easier to optimize, and can gain accuracy from considerably increased depth. On the ImageNet dataset we evaluate residual nets with a depth of up to 152 layers---8x deeper than VGG nets but still having lower complexity. An ensemble of these residual nets achieves 3.57% error on the ImageNet test set. This result won the 1st place on the ILSVRC 2015 classification task. We also present analysis on CIFAR-10 with 100 and 1000 layers. + +The depth of representations is of central importance for many visual recognition tasks. Solely due to our extremely deep representations, we obtain a 28% relative improvement on the COCO object detection dataset. Deep residual nets are foundations of our submissions to ILSVRC & COCO 2015 competitions, where we also won the 1st places on the tasks of ImageNet detection, ImageNet localization, COCO detection, and COCO segmentation. + +
+ +
+ +## Results and models + +The pre-trained models on ImageNet-21k are used to fine-tune, and therefore don't have evaluation results. + +| Model | resolution | Params(M) | Flops(G) | Download | +| :------------: | :--------: | :-------: | :------: | :-------------------------------------------------------------------------------------------------------------------: | +| ResNet-50-mill | 224x224 | 86.74 | 15.14 | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_3rdparty-mill_in21k_20220331-faac000b.pth) | + +*The "mill" means using the mutil-label pretrain weight from [ImageNet-21K Pretraining for the Masses](https://github.com/Alibaba-MIIL/ImageNet21K).* + +### Cifar10 + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :--------: | :-------: | :------: | :-------: | :-------: | :--------------------------------------------------------------------------: | :-----------------------------------------------------------------------------: | +| ResNet-18 | 11.17 | 0.56 | 94.82 | 99.87 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet18_8xb16_cifar10.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_b16x8_cifar10_20210528-bd6371c8.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_b16x8_cifar10_20210528-bd6371c8.log.json) | +| ResNet-34 | 21.28 | 1.16 | 95.34 | 99.87 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet34_8xb16_cifar10.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet34_b16x8_cifar10_20210528-a8aa36a6.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet34_b16x8_cifar10_20210528-a8aa36a6.log.json) | +| ResNet-50 | 23.52 | 1.31 | 95.55 | 99.91 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb16_cifar10.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_b16x8_cifar10_20210528-f54bfad9.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_b16x8_cifar10_20210528-f54bfad9.log.json) | +| ResNet-101 | 42.51 | 2.52 | 95.58 | 99.87 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet101_8xb16_cifar10.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_b16x8_cifar10_20210528-2d29e936.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_b16x8_cifar10_20210528-2d29e936.log.json) | +| ResNet-152 | 58.16 | 3.74 | 95.76 | 99.89 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet152_8xb16_cifar10.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet152_b16x8_cifar10_20210528-3e8e9178.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet152_b16x8_cifar10_20210528-3e8e9178.log.json) | + +### Cifar100 + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-------: | :-------: | :------: | :-------: | :-------: | :---------------------------------------------------------------------------: | :-----------------------------------------------------------------------------: | +| ResNet-50 | 23.71 | 1.31 | 79.90 | 95.19 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb16_cifar100.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_b16x8_cifar100_20210528-67b58a1b.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_b16x8_cifar100_20210528-67b58a1b.log.json) | + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :----------------: | :-------: | :------: | :-------: | :-------: | :----------------------------------------------------------------------: | :-------------------------------------------------------------------------: | +| ResNet-18 | 11.69 | 1.82 | 69.90 | 89.43 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet18_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_8xb32_in1k_20210831-fbbb1da6.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_8xb32_in1k_20210831-fbbb1da6.log.json) | +| ResNet-34 | 21.8 | 3.68 | 73.62 | 91.59 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet34_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet34_8xb32_in1k_20210831-f257d4e6.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet34_8xb32_in1k_20210831-f257d4e6.log.json) | +| ResNet-50 | 25.56 | 4.12 | 76.55 | 93.06 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.log.json) | +| ResNet-101 | 44.55 | 7.85 | 77.97 | 94.06 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_8xb32_in1k_20210831-539c63f8.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_8xb32_in1k_20210831-539c63f8.log.json) | +| ResNet-152 | 60.19 | 11.58 | 78.48 | 94.13 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet152_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet152_8xb32_in1k_20210901-4d7582fa.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet152_8xb32_in1k_20210901-4d7582fa.log.json) | +| ResNetV1C-50 | 25.58 | 4.36 | 77.01 | 93.58 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1c50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1c50_8xb32_in1k_20220214-3343eccd.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1c50_8xb32_in1k_20220214-3343eccd.log.json) | +| ResNetV1C-101 | 44.57 | 8.09 | 78.30 | 94.27 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1c101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1c101_8xb32_in1k_20220214-434fe45f.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1c101_8xb32_in1k_20220214-434fe45f.log.json) | +| ResNetV1C-152 | 60.21 | 11.82 | 78.76 | 94.41 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1c152_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1c152_8xb32_in1k_20220214-c013291f.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1c152_8xb32_in1k_20220214-c013291f.log.json) | +| ResNetV1D-50 | 25.58 | 4.36 | 77.54 | 93.57 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1d50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d50_b32x8_imagenet_20210531-db14775a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d50_b32x8_imagenet_20210531-db14775a.log.json) | +| ResNetV1D-101 | 44.57 | 8.09 | 78.93 | 94.48 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1d101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d101_b32x8_imagenet_20210531-6e13bcd3.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d101_b32x8_imagenet_20210531-6e13bcd3.log.json) | +| ResNetV1D-152 | 60.21 | 11.82 | 79.41 | 94.70 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1d152_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d152_b32x8_imagenet_20210531-278cf22a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d152_b32x8_imagenet_20210531-278cf22a.log.json) | +| ResNet-50 (fp16) | 25.56 | 4.12 | 76.30 | 93.07 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb32-fp16_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/fp16/resnet50_batch256_fp16_imagenet_20210320-b3964210.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/fp16/resnet50_batch256_fp16_imagenet_20210320-b3964210.log.json) | +| Wide-ResNet-50\* | 68.88 | 11.44 | 78.48 | 94.08 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/wide-resnet50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/wide-resnet50_3rdparty_8xb32_in1k_20220304-66678344.pth) | +| Wide-ResNet-101\* | 126.89 | 22.81 | 78.84 | 94.28 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/wide-resnet101_3rdparty_8xb32_in1k_20220304-8d5f9d61.pth) | +| ResNet-50 (rsb-a1) | 25.56 | 4.12 | 80.12 | 94.78 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb256-rsb-a1-600e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.log.json) | +| ResNet-50 (rsb-a2) | 25.56 | 4.12 | 79.55 | 94.37 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb256-rsb-a2-300e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a2-300e_in1k_20211228-0fd8be6e.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a2-300e_in1k_20211228-0fd8be6e.log.json) | +| ResNet-50 (rsb-a3) | 25.56 | 4.12 | 78.30 | 93.80 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb256-rsb-a3-100e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a3-100e_in1k_20211228-3493673c.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a3-100e_in1k_20211228-3493673c.log.json) | + +*The "rsb" means using the training settings from [ResNet strikes back: An improved training procedure in timm](https://arxiv.org/abs/2110.00476).* + +*Models with * are converted from the [official repo](https://github.com/pytorch/vision). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +### CUB-200-2011 + +| Model | Pretrain | resolution | Params(M) | Flops(G) | Top-1 (%) | Config | Download | +| :-------: | :--------------------------------------------------: | :--------: | :-------: | :------: | :-------: | :------------------------------------------------: | :---------------------------------------------------: | +| ResNet-50 | [ImageNet-21k-mill](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_3rdparty-mill_in21k_20220331-faac000b.pth) | 448x448 | 23.92 | 16.48 | 88.45 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb8_cub.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb8_cub_20220307-57840e60.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb8_cub_20220307-57840e60.log.json) | + +### Stanford-Cars + +| Model | Pretrain | resolution | Params(M) | Flops(G) | Top-1 (%) | Config | Download | +| :-------: | :--------------------------------------------------: | :--------: | :-------: | :------: | :-------: | :------------------------------------------------: | :---------------------------------------------------: | +| ResNet-50 | [ImageNet-21k-mill](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_3rdparty-mill_in21k_20220331-faac000b.pth) | 448x448 | 23.92 | 16.48 | 92.82 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb8_cars.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb8_cars_20220812-9d85901a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb8_cars_20220812-9d85901a.log.json) | + +## Citation + +``` +@inproceedings{he2016deep, + title={Deep residual learning for image recognition}, + author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={770--778}, + year={2016} +} +``` diff --git a/configs/resnet/metafile.yml b/configs/resnet/metafile.yml new file mode 100644 index 0000000..4be4bf9 --- /dev/null +++ b/configs/resnet/metafile.yml @@ -0,0 +1,365 @@ +Collections: + - Name: ResNet + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Epochs: 100 + Batch Size: 256 + Architecture: + - ResNet + Paper: + URL: https://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html + Title: "Deep Residual Learning for Image Recognition" + README: configs/resnet/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/resnet.py#L383 + Version: v0.15.0 + +Models: + - Name: resnet18_8xb16_cifar10 + Metadata: + Training Data: CIFAR-10 + Epochs: 200 + Batch Size: 128 + FLOPs: 560000000 + Parameters: 11170000 + In Collection: ResNet + Results: + - Dataset: CIFAR-10 + Metrics: + Top 1 Accuracy: 94.82 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_b16x8_cifar10_20210528-bd6371c8.pth + Config: configs/resnet/resnet18_8xb16_cifar10.py + - Name: resnet34_8xb16_cifar10 + Metadata: + Training Data: CIFAR-10 + Epochs: 200 + Batch Size: 128 + FLOPs: 1160000000 + Parameters: 21280000 + In Collection: ResNet + Results: + - Dataset: CIFAR-10 + Metrics: + Top 1 Accuracy: 95.34 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet34_b16x8_cifar10_20210528-a8aa36a6.pth + Config: configs/resnet/resnet34_8xb16_cifar10.py + - Name: resnet50_8xb16_cifar10 + Metadata: + Training Data: CIFAR-10 + Epochs: 200 + Batch Size: 128 + FLOPs: 1310000000 + Parameters: 23520000 + In Collection: ResNet + Results: + - Dataset: CIFAR-10 + Metrics: + Top 1 Accuracy: 95.55 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_b16x8_cifar10_20210528-f54bfad9.pth + Config: configs/resnet/resnet50_8xb16_cifar10.py + - Name: resnet101_8xb16_cifar10 + Metadata: + Training Data: CIFAR-10 + Epochs: 200 + Batch Size: 128 + FLOPs: 2520000000 + Parameters: 42510000 + In Collection: ResNet + Results: + - Dataset: CIFAR-10 + Metrics: + Top 1 Accuracy: 95.58 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_b16x8_cifar10_20210528-2d29e936.pth + Config: configs/resnet/resnet101_8xb16_cifar10.py + - Name: resnet152_8xb16_cifar10 + Metadata: + Training Data: CIFAR-10 + Epochs: 200 + Batch Size: 128 + FLOPs: 3740000000 + Parameters: 58160000 + In Collection: ResNet + Results: + - Dataset: CIFAR-10 + Metrics: + Top 1 Accuracy: 95.76 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet152_b16x8_cifar10_20210528-3e8e9178.pth + Config: configs/resnet/resnet152_8xb16_cifar10.py + - Name: resnet50_8xb16_cifar100 + Metadata: + Training Data: CIFAR-100 + Epochs: 200 + Batch Size: 128 + FLOPs: 1310000000 + Parameters: 23710000 + In Collection: ResNet + Results: + - Dataset: CIFAR-100 + Metrics: + Top 1 Accuracy: 79.90 + Top 5 Accuracy: 95.19 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_b16x8_cifar100_20210528-67b58a1b.pth + Config: configs/resnet/resnet50_8xb16_cifar100.py + - Name: resnet18_8xb32_in1k + Metadata: + FLOPs: 1820000000 + Parameters: 11690000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 69.90 + Top 5 Accuracy: 89.43 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_8xb32_in1k_20210831-fbbb1da6.pth + Config: configs/resnet/resnet18_8xb32_in1k.py + - Name: resnet34_8xb32_in1k + Metadata: + FLOPs: 3680000000 + Parameters: 2180000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 73.62 + Top 5 Accuracy: 91.59 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet34_8xb32_in1k_20210831-f257d4e6.pth + Config: configs/resnet/resnet34_8xb32_in1k.py + - Name: resnet50_8xb32_in1k + Metadata: + FLOPs: 4120000000 + Parameters: 25560000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 76.55 + Top 5 Accuracy: 93.06 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth + Config: configs/resnet/resnet50_8xb32_in1k.py + - Name: resnet101_8xb32_in1k + Metadata: + FLOPs: 7850000000 + Parameters: 44550000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.97 + Top 5 Accuracy: 94.06 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_8xb32_in1k_20210831-539c63f8.pth + Config: configs/resnet/resnet101_8xb32_in1k.py + - Name: resnet152_8xb32_in1k + Metadata: + FLOPs: 11580000000 + Parameters: 60190000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.48 + Top 5 Accuracy: 94.13 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet152_8xb32_in1k_20210901-4d7582fa.pth + Config: configs/resnet/resnet152_8xb32_in1k.py + - Name: resnetv1d50_8xb32_in1k + Metadata: + FLOPs: 4360000000 + Parameters: 25580000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.54 + Top 5 Accuracy: 93.57 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d50_b32x8_imagenet_20210531-db14775a.pth + Config: configs/resnet/resnetv1d50_8xb32_in1k.py + - Name: resnetv1d101_8xb32_in1k + Metadata: + FLOPs: 8090000000 + Parameters: 44570000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.93 + Top 5 Accuracy: 94.48 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d101_b32x8_imagenet_20210531-6e13bcd3.pth + Config: configs/resnet/resnetv1d101_8xb32_in1k.py + - Name: resnetv1d152_8xb32_in1k + Metadata: + FLOPs: 11820000000 + Parameters: 60210000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.41 + Top 5 Accuracy: 94.70 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d152_b32x8_imagenet_20210531-278cf22a.pth + Config: configs/resnet/resnetv1d152_8xb32_in1k.py + - Name: resnet50_8xb32-fp16_in1k + Metadata: + FLOPs: 4120000000 + Parameters: 25560000 + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + In Collection: ResNet + Results: + - Task: Image Classification + Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 76.30 + Top 5 Accuracy: 93.07 + Weights: https://download.openmmlab.com/mmclassification/v0/fp16/resnet50_batch256_fp16_imagenet_20210320-b3964210.pth + Config: configs/resnet/resnet50_8xb32-fp16_in1k.py + - Name: resnet50_8xb256-rsb-a1-600e_in1k + Metadata: + FLOPs: 4120000000 + Parameters: 25560000 + Training Techniques: + - LAMB + - Weight Decay + - Cosine Annealing + - Mixup + - CutMix + - RepeatAugSampler + - RandAugment + Epochs: 600 + Batch Size: 2048 + In Collection: ResNet + Results: + - Task: Image Classification + Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 80.12 + Top 5 Accuracy: 94.78 + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth + Config: configs/resnet/resnet50_8xb256-rsb-a1-600e_in1k.py + - Name: resnet50_8xb256-rsb-a2-300e_in1k + Metadata: + FLOPs: 4120000000 + Parameters: 25560000 + Training Techniques: + - LAMB + - Weight Decay + - Cosine Annealing + - Mixup + - CutMix + - RepeatAugSampler + - RandAugment + Epochs: 300 + Batch Size: 2048 + In Collection: ResNet + Results: + - Task: Image Classification + Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.55 + Top 5 Accuracy: 94.37 + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a2-300e_in1k_20211228-0fd8be6e.pth + Config: configs/resnet/resnet50_8xb256-rsb-a2-300e_in1k.py + - Name: resnet50_8xb256-rsb-a3-100e_in1k + Metadata: + FLOPs: 4120000000 + Parameters: 25560000 + Training Techniques: + - LAMB + - Weight Decay + - Cosine Annealing + - Mixup + - CutMix + - RandAugment + Batch Size: 2048 + In Collection: ResNet + Results: + - Task: Image Classification + Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.30 + Top 5 Accuracy: 93.80 + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a3-100e_in1k_20211228-3493673c.pth + Config: configs/resnet/resnet50_8xb256-rsb-a3-100e_in1k.py + - Name: resnetv1c50_8xb32_in1k + Metadata: + FLOPs: 4360000000 + Parameters: 25580000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.01 + Top 5 Accuracy: 93.58 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1c50_8xb32_in1k_20220214-3343eccd.pth + Config: configs/resnet/resnetv1c50_8xb32_in1k.py + - Name: resnetv1c101_8xb32_in1k + Metadata: + FLOPs: 8090000000 + Parameters: 44570000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.30 + Top 5 Accuracy: 94.27 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1c101_8xb32_in1k_20220214-434fe45f.pth + Config: configs/resnet/resnetv1c101_8xb32_in1k.py + - Name: resnetv1c152_8xb32_in1k + Metadata: + FLOPs: 11820000000 + Parameters: 60210000 + In Collection: ResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.76 + Top 5 Accuracy: 94.41 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1c152_8xb32_in1k_20220214-c013291f.pth + Config: configs/resnet/resnetv1c152_8xb32_in1k.py + - Name: resnet50_8xb8_cub + Metadata: + FLOPs: 16480000000 + Parameters: 23920000 + In Collection: ResNet + Results: + - Dataset: CUB-200-2011 + Metrics: + Top 1 Accuracy: 88.45 + Task: Image Classification + Pretrain: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_3rdparty-mill_in21k_20220331-faac000b.pth + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb8_cub_20220307-57840e60.pth + Config: configs/resnet/resnet50_8xb8_cub.py + - Name: resnet50_8xb8_cars + Metadata: + FLOPs: 16480000000 + Parameters: 23920000 + In Collection: ResNet + Results: + - Dataset: StanfordCars + Metrics: + Top 1 Accuracy: 92.82 + Task: Image Classification + Pretrain: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_3rdparty-mill_in21k_20220331-faac000b.pth + Weights: https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb8_cars_20220812-9d85901a.pth + Config: configs/resnet/resnet50_8xb8_cars.py diff --git a/configs/resnet/resnet101_8xb16_cifar10.py b/configs/resnet/resnet101_8xb16_cifar10.py new file mode 100644 index 0000000..166a174 --- /dev/null +++ b/configs/resnet/resnet101_8xb16_cifar10.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnet101_cifar.py', + '../_base_/datasets/cifar10_bs16.py', + '../_base_/schedules/cifar10_bs128.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet101_8xb32_in1k.py b/configs/resnet/resnet101_8xb32_in1k.py new file mode 100644 index 0000000..388d2cd --- /dev/null +++ b/configs/resnet/resnet101_8xb32_in1k.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/resnet101.py', '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet101_b16x8_cifar10.py b/configs/resnet/resnet101_b16x8_cifar10.py new file mode 100644 index 0000000..57758f2 --- /dev/null +++ b/configs/resnet/resnet101_b16x8_cifar10.py @@ -0,0 +1,6 @@ +_base_ = 'resnet101_8xb16_cifar10.py' + +_deprecation_ = dict( + expected='resnet101_8xb16_cifar10.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet101_b32x8_imagenet.py b/configs/resnet/resnet101_b32x8_imagenet.py new file mode 100644 index 0000000..8d45adc --- /dev/null +++ b/configs/resnet/resnet101_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet101_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnet101_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet152_8xb16_cifar10.py b/configs/resnet/resnet152_8xb16_cifar10.py new file mode 100644 index 0000000..3f307b6 --- /dev/null +++ b/configs/resnet/resnet152_8xb16_cifar10.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnet152_cifar.py', + '../_base_/datasets/cifar10_bs16.py', + '../_base_/schedules/cifar10_bs128.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet152_8xb32_in1k.py b/configs/resnet/resnet152_8xb32_in1k.py new file mode 100644 index 0000000..cc9dc2c --- /dev/null +++ b/configs/resnet/resnet152_8xb32_in1k.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/resnet152.py', '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet152_b16x8_cifar10.py b/configs/resnet/resnet152_b16x8_cifar10.py new file mode 100644 index 0000000..5c76cac --- /dev/null +++ b/configs/resnet/resnet152_b16x8_cifar10.py @@ -0,0 +1,6 @@ +_base_ = 'resnet152_8xb16_cifar10.py' + +_deprecation_ = dict( + expected='resnet152_8xb16_cifar10.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet152_b32x8_imagenet.py b/configs/resnet/resnet152_b32x8_imagenet.py new file mode 100644 index 0000000..133638a --- /dev/null +++ b/configs/resnet/resnet152_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet152_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnet152_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet18_8xb16_cifar10.py b/configs/resnet/resnet18_8xb16_cifar10.py new file mode 100644 index 0000000..c7afa39 --- /dev/null +++ b/configs/resnet/resnet18_8xb16_cifar10.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/resnet18_cifar.py', '../_base_/datasets/cifar10_bs16.py', + '../_base_/schedules/cifar10_bs128.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet18_8xb32_in1k.py b/configs/resnet/resnet18_8xb32_in1k.py new file mode 100644 index 0000000..ac452ff --- /dev/null +++ b/configs/resnet/resnet18_8xb32_in1k.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/resnet18.py', '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet18_b16x8_cifar10.py b/configs/resnet/resnet18_b16x8_cifar10.py new file mode 100644 index 0000000..5a25a0e --- /dev/null +++ b/configs/resnet/resnet18_b16x8_cifar10.py @@ -0,0 +1,6 @@ +_base_ = 'resnet18_8xb16_cifar10.py' + +_deprecation_ = dict( + expected='resnet18_8xb16_cifar10.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet18_b32x8_imagenet.py b/configs/resnet/resnet18_b32x8_imagenet.py new file mode 100644 index 0000000..e6d08f6 --- /dev/null +++ b/configs/resnet/resnet18_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet18_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnet18_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet34_8xb16_cifar10.py b/configs/resnet/resnet34_8xb16_cifar10.py new file mode 100644 index 0000000..7f5cd51 --- /dev/null +++ b/configs/resnet/resnet34_8xb16_cifar10.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/resnet34_cifar.py', '../_base_/datasets/cifar10_bs16.py', + '../_base_/schedules/cifar10_bs128.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet34_8xb32_in1k.py b/configs/resnet/resnet34_8xb32_in1k.py new file mode 100644 index 0000000..7749261 --- /dev/null +++ b/configs/resnet/resnet34_8xb32_in1k.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/resnet34.py', '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet34_b16x8_cifar10.py b/configs/resnet/resnet34_b16x8_cifar10.py new file mode 100644 index 0000000..eec98b2 --- /dev/null +++ b/configs/resnet/resnet34_b16x8_cifar10.py @@ -0,0 +1,6 @@ +_base_ = 'resnet34_8xb16_cifar10.py' + +_deprecation_ = dict( + expected='resnet34_8xb16_cifar10.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet34_b32x8_imagenet.py b/configs/resnet/resnet34_b32x8_imagenet.py new file mode 100644 index 0000000..144613a --- /dev/null +++ b/configs/resnet/resnet34_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet34_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnet34_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_32xb64-warmup-coslr_in1k.py b/configs/resnet/resnet50_32xb64-warmup-coslr_in1k.py new file mode 100644 index 0000000..c26245e --- /dev/null +++ b/configs/resnet/resnet50_32xb64-warmup-coslr_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnet50.py', '../_base_/datasets/imagenet_bs64.py', + '../_base_/schedules/imagenet_bs2048_coslr.py', + '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet50_32xb64-warmup-lbs_in1k.py b/configs/resnet/resnet50_32xb64-warmup-lbs_in1k.py new file mode 100644 index 0000000..2f24f9a --- /dev/null +++ b/configs/resnet/resnet50_32xb64-warmup-lbs_in1k.py @@ -0,0 +1,12 @@ +_base_ = ['./resnet50_32xb64-warmup_in1k.py'] +model = dict( + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + loss_weight=1.0, + label_smooth_val=0.1, + num_classes=1000), + )) diff --git a/configs/resnet/resnet50_32xb64-warmup_in1k.py b/configs/resnet/resnet50_32xb64-warmup_in1k.py new file mode 100644 index 0000000..34d5288 --- /dev/null +++ b/configs/resnet/resnet50_32xb64-warmup_in1k.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/resnet50.py', '../_base_/datasets/imagenet_bs64.py', + '../_base_/schedules/imagenet_bs2048.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet50_8xb128_coslr-90e_in21k.py b/configs/resnet/resnet50_8xb128_coslr-90e_in21k.py new file mode 100644 index 0000000..8cc7921 --- /dev/null +++ b/configs/resnet/resnet50_8xb128_coslr-90e_in21k.py @@ -0,0 +1,11 @@ +_base_ = [ + '../_base_/models/resnet50.py', '../_base_/datasets/imagenet21k_bs128.py', + '../_base_/schedules/imagenet_bs1024_coslr.py', + '../_base_/default_runtime.py' +] + +# model settings +model = dict(head=dict(num_classes=21843)) + +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=90) diff --git a/configs/resnet/resnet50_8xb16-mixup_cifar10.py b/configs/resnet/resnet50_8xb16-mixup_cifar10.py new file mode 100644 index 0000000..2420ebf --- /dev/null +++ b/configs/resnet/resnet50_8xb16-mixup_cifar10.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnet50_cifar_mixup.py', + '../_base_/datasets/cifar10_bs16.py', + '../_base_/schedules/cifar10_bs128.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet50_8xb16_cifar10.py b/configs/resnet/resnet50_8xb16_cifar10.py new file mode 100644 index 0000000..669e5de --- /dev/null +++ b/configs/resnet/resnet50_8xb16_cifar10.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/resnet50_cifar.py', '../_base_/datasets/cifar10_bs16.py', + '../_base_/schedules/cifar10_bs128.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet50_8xb16_cifar100.py b/configs/resnet/resnet50_8xb16_cifar100.py new file mode 100644 index 0000000..39bd90f --- /dev/null +++ b/configs/resnet/resnet50_8xb16_cifar100.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/resnet50_cifar.py', + '../_base_/datasets/cifar100_bs16.py', + '../_base_/schedules/cifar10_bs128.py', '../_base_/default_runtime.py' +] + +model = dict(head=dict(num_classes=100)) + +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0005) +lr_config = dict(policy='step', step=[60, 120, 160], gamma=0.2) diff --git a/configs/resnet/resnet50_8xb256-rsb-a1-600e_in1k.py b/configs/resnet/resnet50_8xb256-rsb-a1-600e_in1k.py new file mode 100644 index 0000000..192776f --- /dev/null +++ b/configs/resnet/resnet50_8xb256-rsb-a1-600e_in1k.py @@ -0,0 +1,33 @@ +_base_ = [ + '../_base_/models/resnet50.py', + '../_base_/datasets/imagenet_bs256_rsb_a12.py', + '../_base_/schedules/imagenet_bs2048_rsb.py', + '../_base_/default_runtime.py' +] + +# Model settings +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + drop_path_rate=0.05, + ), + head=dict( + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + )), + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.2, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) + +# Dataset settings +sampler = dict(type='RepeatAugSampler') + +# Schedule settings +runner = dict(max_epochs=600) +optimizer = dict( + weight_decay=0.01, + paramwise_cfg=dict(bias_decay_mult=0., norm_decay_mult=0.), +) diff --git a/configs/resnet/resnet50_8xb256-rsb-a2-300e_in1k.py b/configs/resnet/resnet50_8xb256-rsb-a2-300e_in1k.py new file mode 100644 index 0000000..fcdc880 --- /dev/null +++ b/configs/resnet/resnet50_8xb256-rsb-a2-300e_in1k.py @@ -0,0 +1,25 @@ +_base_ = [ + '../_base_/models/resnet50.py', + '../_base_/datasets/imagenet_bs256_rsb_a12.py', + '../_base_/schedules/imagenet_bs2048_rsb.py', + '../_base_/default_runtime.py' +] + +# Model settings +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + drop_path_rate=0.05, + ), + head=dict(loss=dict(use_sigmoid=True)), + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.1, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) + +# Dataset settings +sampler = dict(type='RepeatAugSampler') + +# Schedule settings +runner = dict(max_epochs=300) +optimizer = dict(paramwise_cfg=dict(bias_decay_mult=0., norm_decay_mult=0.)) diff --git a/configs/resnet/resnet50_8xb256-rsb-a3-100e_in1k.py b/configs/resnet/resnet50_8xb256-rsb-a3-100e_in1k.py new file mode 100644 index 0000000..4ff52ac --- /dev/null +++ b/configs/resnet/resnet50_8xb256-rsb-a3-100e_in1k.py @@ -0,0 +1,19 @@ +_base_ = [ + '../_base_/models/resnet50.py', + '../_base_/datasets/imagenet_bs256_rsb_a3.py', + '../_base_/schedules/imagenet_bs2048_rsb.py', + '../_base_/default_runtime.py' +] + +# Model settings +model = dict( + backbone=dict(norm_cfg=dict(type='SyncBN', requires_grad=True)), + head=dict(loss=dict(use_sigmoid=True)), + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.1, num_classes=1000, prob=0.5), + dict(type='BatchCutMix', alpha=1.0, num_classes=1000, prob=0.5) + ])) + +# Schedule settings +optimizer = dict( + lr=0.008, paramwise_cfg=dict(bias_decay_mult=0., norm_decay_mult=0.)) diff --git a/configs/resnet/resnet50_8xb32-coslr-preciseBN_in1k.py b/configs/resnet/resnet50_8xb32-coslr-preciseBN_in1k.py new file mode 100644 index 0000000..dab82c6 --- /dev/null +++ b/configs/resnet/resnet50_8xb32-coslr-preciseBN_in1k.py @@ -0,0 +1,12 @@ +_base_ = 'resnet50_8xb32-coslr_in1k.py' + +# Precise BN hook will update the bn stats, so this hook should be executed +# before CheckpointHook, which has priority of 'NORMAL'. So set the +# priority of PreciseBNHook to 'ABOVE_NORMAL' here. +custom_hooks = [ + dict( + type='PreciseBNHook', + num_samples=8192, + interval=1, + priority='ABOVE_NORMAL') +] diff --git a/configs/resnet/resnet50_8xb32-coslr_in1k.py b/configs/resnet/resnet50_8xb32-coslr_in1k.py new file mode 100644 index 0000000..938a114 --- /dev/null +++ b/configs/resnet/resnet50_8xb32-coslr_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnet50.py', '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256_coslr.py', + '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet50_8xb32-cutmix_in1k.py b/configs/resnet/resnet50_8xb32-cutmix_in1k.py new file mode 100644 index 0000000..2f8d0ca --- /dev/null +++ b/configs/resnet/resnet50_8xb32-cutmix_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnet50_cutmix.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet50_8xb32-fp16-dynamic_in1k.py b/configs/resnet/resnet50_8xb32-fp16-dynamic_in1k.py new file mode 100644 index 0000000..7a6c93c --- /dev/null +++ b/configs/resnet/resnet50_8xb32-fp16-dynamic_in1k.py @@ -0,0 +1,4 @@ +_base_ = ['./resnet50_8xb32_in1k.py'] + +# fp16 settings +fp16 = dict(loss_scale='dynamic') diff --git a/configs/resnet/resnet50_8xb32-fp16_in1k.py b/configs/resnet/resnet50_8xb32-fp16_in1k.py new file mode 100644 index 0000000..4245d19 --- /dev/null +++ b/configs/resnet/resnet50_8xb32-fp16_in1k.py @@ -0,0 +1,4 @@ +_base_ = ['./resnet50_8xb32_in1k.py'] + +# fp16 settings +fp16 = dict(loss_scale=512.) diff --git a/configs/resnet/resnet50_8xb32-lbs_in1k.py b/configs/resnet/resnet50_8xb32-lbs_in1k.py new file mode 100644 index 0000000..1c1aa5a --- /dev/null +++ b/configs/resnet/resnet50_8xb32-lbs_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnet50_label_smooth.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet50_8xb32-mixup_in1k.py b/configs/resnet/resnet50_8xb32-mixup_in1k.py new file mode 100644 index 0000000..2a153d0 --- /dev/null +++ b/configs/resnet/resnet50_8xb32-mixup_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnet50_mixup.py', + '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet50_8xb32_in1k.py b/configs/resnet/resnet50_8xb32_in1k.py new file mode 100644 index 0000000..c32f333 --- /dev/null +++ b/configs/resnet/resnet50_8xb32_in1k.py @@ -0,0 +1,4 @@ +_base_ = [ + '../_base_/models/resnet50.py', '../_base_/datasets/imagenet_bs32.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnet50_8xb8_cars.py b/configs/resnet/resnet50_8xb8_cars.py new file mode 100644 index 0000000..2d2db45 --- /dev/null +++ b/configs/resnet/resnet50_8xb8_cars.py @@ -0,0 +1,19 @@ +_base_ = [ + '../_base_/models/resnet50.py', + '../_base_/datasets/stanford_cars_bs8_448.py', + '../_base_/schedules/stanford_cars_bs8.py', '../_base_/default_runtime.py' +] + +# use pre-train weight converted from https://github.com/Alibaba-MIIL/ImageNet21K # noqa +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_3rdparty-mill_in21k_20220331-faac000b.pth' # noqa + +model = dict( + type='ImageClassifier', + backbone=dict( + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint, prefix='backbone')), + head=dict(num_classes=196, )) + +log_config = dict(interval=50) +checkpoint_config = dict( + interval=1, max_keep_ckpts=3) # save last three checkpoints diff --git a/configs/resnet/resnet50_8xb8_cub.py b/configs/resnet/resnet50_8xb8_cub.py new file mode 100644 index 0000000..dffb076 --- /dev/null +++ b/configs/resnet/resnet50_8xb8_cub.py @@ -0,0 +1,19 @@ +_base_ = [ + '../_base_/models/resnet50.py', '../_base_/datasets/cub_bs8_448.py', + '../_base_/schedules/cub_bs64.py', '../_base_/default_runtime.py' +] + +# use pre-train weight converted from https://github.com/Alibaba-MIIL/ImageNet21K # noqa +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_3rdparty-mill_in21k_20220331-faac000b.pth' # noqa + +model = dict( + type='ImageClassifier', + backbone=dict( + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint, prefix='backbone')), + head=dict(num_classes=200, )) + +log_config = dict(interval=20) # log every 20 intervals + +checkpoint_config = dict( + interval=1, max_keep_ckpts=3) # save last three checkpoints diff --git a/configs/resnet/resnet50_b16x8_cifar10.py b/configs/resnet/resnet50_b16x8_cifar10.py new file mode 100644 index 0000000..e40d1ee --- /dev/null +++ b/configs/resnet/resnet50_b16x8_cifar10.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_8xb16_cifar10.py' + +_deprecation_ = dict( + expected='resnet50_8xb16_cifar10.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b16x8_cifar100.py b/configs/resnet/resnet50_b16x8_cifar100.py new file mode 100644 index 0000000..b49b6f4 --- /dev/null +++ b/configs/resnet/resnet50_b16x8_cifar100.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_8xb16_cifar100.py' + +_deprecation_ = dict( + expected='resnet50_8xb16_cifar100.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b16x8_cifar10_mixup.py b/configs/resnet/resnet50_b16x8_cifar10_mixup.py new file mode 100644 index 0000000..409a40e --- /dev/null +++ b/configs/resnet/resnet50_b16x8_cifar10_mixup.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_8xb16-mixup_cifar10.py' + +_deprecation_ = dict( + expected='resnet50_8xb16-mixup_cifar10.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b32x8_coslr_imagenet.py b/configs/resnet/resnet50_b32x8_coslr_imagenet.py new file mode 100644 index 0000000..647153b --- /dev/null +++ b/configs/resnet/resnet50_b32x8_coslr_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_8xb32-coslr_in1k.py' + +_deprecation_ = dict( + expected='resnet50_8xb32-coslr_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b32x8_cutmix_imagenet.py b/configs/resnet/resnet50_b32x8_cutmix_imagenet.py new file mode 100644 index 0000000..87b27d5 --- /dev/null +++ b/configs/resnet/resnet50_b32x8_cutmix_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_8xb32-cutmix_in1k.py' + +_deprecation_ = dict( + expected='resnet50_8xb32-cutmix_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b32x8_imagenet.py b/configs/resnet/resnet50_b32x8_imagenet.py new file mode 100644 index 0000000..7d7f69e --- /dev/null +++ b/configs/resnet/resnet50_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnet50_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b32x8_label_smooth_imagenet.py b/configs/resnet/resnet50_b32x8_label_smooth_imagenet.py new file mode 100644 index 0000000..6e87415 --- /dev/null +++ b/configs/resnet/resnet50_b32x8_label_smooth_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_8xb32-lbs_in1k.py' + +_deprecation_ = dict( + expected='resnet50_8xb32-lbs_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b32x8_mixup_imagenet.py b/configs/resnet/resnet50_b32x8_mixup_imagenet.py new file mode 100644 index 0000000..3405319 --- /dev/null +++ b/configs/resnet/resnet50_b32x8_mixup_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_8xb32-mixup_in1k.py' + +_deprecation_ = dict( + expected='resnet50_8xb32-mixup_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b64x32_warmup_coslr_imagenet.py b/configs/resnet/resnet50_b64x32_warmup_coslr_imagenet.py new file mode 100644 index 0000000..4724616 --- /dev/null +++ b/configs/resnet/resnet50_b64x32_warmup_coslr_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_32xb64-warmup-coslr_in1k.py' + +_deprecation_ = dict( + expected='resnet50_32xb64-warmup-coslr_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b64x32_warmup_imagenet.py b/configs/resnet/resnet50_b64x32_warmup_imagenet.py new file mode 100644 index 0000000..3e35054 --- /dev/null +++ b/configs/resnet/resnet50_b64x32_warmup_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_32xb64-warmup_in1k.py' + +_deprecation_ = dict( + expected='resnet50_32xb64-warmup_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnet50_b64x32_warmup_label_smooth_imagenet.py b/configs/resnet/resnet50_b64x32_warmup_label_smooth_imagenet.py new file mode 100644 index 0000000..2544e33 --- /dev/null +++ b/configs/resnet/resnet50_b64x32_warmup_label_smooth_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnet50_32xb64-warmup-lbs_in1k.py' + +_deprecation_ = dict( + expected='resnet50_32xb64-warmup-lbs_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnetv1c101_8xb32_in1k.py b/configs/resnet/resnetv1c101_8xb32_in1k.py new file mode 100644 index 0000000..441aff5 --- /dev/null +++ b/configs/resnet/resnetv1c101_8xb32_in1k.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/resnetv1c50.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(depth=101)) diff --git a/configs/resnet/resnetv1c152_8xb32_in1k.py b/configs/resnet/resnetv1c152_8xb32_in1k.py new file mode 100644 index 0000000..b9f466f --- /dev/null +++ b/configs/resnet/resnetv1c152_8xb32_in1k.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/resnetv1c50.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(depth=152)) diff --git a/configs/resnet/resnetv1c50_8xb32_in1k.py b/configs/resnet/resnetv1c50_8xb32_in1k.py new file mode 100644 index 0000000..aa1c8b6 --- /dev/null +++ b/configs/resnet/resnetv1c50_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnetv1c50.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnetv1d101_8xb32_in1k.py b/configs/resnet/resnetv1d101_8xb32_in1k.py new file mode 100644 index 0000000..b16ca86 --- /dev/null +++ b/configs/resnet/resnetv1d101_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnetv1d101.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnetv1d101_b32x8_imagenet.py b/configs/resnet/resnetv1d101_b32x8_imagenet.py new file mode 100644 index 0000000..e736937 --- /dev/null +++ b/configs/resnet/resnetv1d101_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnetv1d101_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnetv1d101_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnetv1d152_8xb32_in1k.py b/configs/resnet/resnetv1d152_8xb32_in1k.py new file mode 100644 index 0000000..76926dd --- /dev/null +++ b/configs/resnet/resnetv1d152_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnetv1d152.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnetv1d152_b32x8_imagenet.py b/configs/resnet/resnetv1d152_b32x8_imagenet.py new file mode 100644 index 0000000..88e5b9f --- /dev/null +++ b/configs/resnet/resnetv1d152_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnetv1d152_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnetv1d152_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnet/resnetv1d50_8xb32_in1k.py b/configs/resnet/resnetv1d50_8xb32_in1k.py new file mode 100644 index 0000000..208bde4 --- /dev/null +++ b/configs/resnet/resnetv1d50_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnetv1d50.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnet/resnetv1d50_b32x8_imagenet.py b/configs/resnet/resnetv1d50_b32x8_imagenet.py new file mode 100644 index 0000000..5455e05 --- /dev/null +++ b/configs/resnet/resnetv1d50_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnetv1d50_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnetv1d50_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnext/README.md b/configs/resnext/README.md new file mode 100644 index 0000000..56df277 --- /dev/null +++ b/configs/resnext/README.md @@ -0,0 +1,36 @@ +# ResNeXt + +> [Aggregated Residual Transformations for Deep Neural Networks](https://openaccess.thecvf.com/content_cvpr_2017/html/Xie_Aggregated_Residual_Transformations_CVPR_2017_paper.html) + + + +## Abstract + +We present a simple, highly modularized network architecture for image classification. Our network is constructed by repeating a building block that aggregates a set of transformations with the same topology. Our simple design results in a homogeneous, multi-branch architecture that has only a few hyper-parameters to set. This strategy exposes a new dimension, which we call "cardinality" (the size of the set of transformations), as an essential factor in addition to the dimensions of depth and width. On the ImageNet-1K dataset, we empirically show that even under the restricted condition of maintaining complexity, increasing cardinality is able to improve classification accuracy. Moreover, increasing cardinality is more effective than going deeper or wider when we increase the capacity. Our models, named ResNeXt, are the foundations of our entry to the ILSVRC 2016 classification task in which we secured 2nd place. We further investigate ResNeXt on an ImageNet-5K set and the COCO detection set, also showing better results than its ResNet counterpart. The code and models are publicly available online. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :---------------: | :-------: | :------: | :-------: | :-------: | :-----------------------------------------------------------------------: | :-------------------------------------------------------------------------: | +| ResNeXt-32x4d-50 | 25.03 | 4.27 | 77.90 | 93.66 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext50-32x4d_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnext/resnext50_32x4d_b32x8_imagenet_20210429-56066e27.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnext/resnext50_32x4d_b32x8_imagenet_20210429-56066e27.log.json) | +| ResNeXt-32x4d-101 | 44.18 | 8.03 | 78.61 | 94.17 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext101-32x4d_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x4d_b32x8_imagenet_20210506-e0fa3dd5.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x4d_b32x8_imagenet_20210506-e0fa3dd5.log.json) | +| ResNeXt-32x8d-101 | 88.79 | 16.5 | 79.27 | 94.58 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext101-32x8d_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x8d_b32x8_imagenet_20210506-23a247d5.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x8d_b32x8_imagenet_20210506-23a247d5.log.json) | +| ResNeXt-32x4d-152 | 59.95 | 11.8 | 78.88 | 94.33 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext152-32x4d_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnext/resnext152_32x4d_b32x8_imagenet_20210524-927787be.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnext/resnext152_32x4d_b32x8_imagenet_20210524-927787be.log.json) | + +## Citation + +``` +@inproceedings{xie2017aggregated, + title={Aggregated residual transformations for deep neural networks}, + author={Xie, Saining and Girshick, Ross and Doll{\'a}r, Piotr and Tu, Zhuowen and He, Kaiming}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={1492--1500}, + year={2017} +} +``` diff --git a/configs/resnext/metafile.yml b/configs/resnext/metafile.yml new file mode 100644 index 0000000..c68e7f9 --- /dev/null +++ b/configs/resnext/metafile.yml @@ -0,0 +1,73 @@ +Collections: + - Name: ResNeXt + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Epochs: 100 + Batch Size: 256 + Architecture: + - ResNeXt + Paper: + URL: https://openaccess.thecvf.com/content_cvpr_2017/html/Xie_Aggregated_Residual_Transformations_CVPR_2017_paper.html + Title: "Aggregated Residual Transformations for Deep Neural Networks" + README: configs/resnext/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/resnext.py#L90 + Version: v0.15.0 + +Models: + - Name: resnext50-32x4d_8xb32_in1k + Metadata: + FLOPs: 4270000000 + Parameters: 25030000 + In Collection: ResNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.90 + Top 5 Accuracy: 93.66 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnext/resnext50_32x4d_b32x8_imagenet_20210429-56066e27.pth + Config: configs/resnext/resnext50-32x4d_8xb32_in1k.py + - Name: resnext101-32x4d_8xb32_in1k + Metadata: + FLOPs: 8030000000 + Parameters: 44180000 + In Collection: ResNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.61 + Top 5 Accuracy: 94.17 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x4d_b32x8_imagenet_20210506-e0fa3dd5.pth + Config: configs/resnext/resnext101-32x4d_8xb32_in1k.py + - Name: resnext101-32x8d_8xb32_in1k + Metadata: + FLOPs: 16500000000 + Parameters: 88790000 + In Collection: ResNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 79.27 + Top 5 Accuracy: 94.58 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x8d_b32x8_imagenet_20210506-23a247d5.pth + Config: configs/resnext/resnext101-32x8d_8xb32_in1k.py + - Name: resnext152-32x4d_8xb32_in1k + Metadata: + FLOPs: 11800000000 + Parameters: 59950000 + In Collection: ResNeXt + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.88 + Top 5 Accuracy: 94.33 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/resnext/resnext152_32x4d_b32x8_imagenet_20210524-927787be.pth + Config: configs/resnext/resnext152-32x4d_8xb32_in1k.py diff --git a/configs/resnext/resnext101-32x4d_8xb32_in1k.py b/configs/resnext/resnext101-32x4d_8xb32_in1k.py new file mode 100644 index 0000000..970aa60 --- /dev/null +++ b/configs/resnext/resnext101-32x4d_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnext101_32x4d.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnext/resnext101-32x8d_8xb32_in1k.py b/configs/resnext/resnext101-32x8d_8xb32_in1k.py new file mode 100644 index 0000000..315d05f --- /dev/null +++ b/configs/resnext/resnext101-32x8d_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnext101_32x8d.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnext/resnext101_32x4d_b32x8_imagenet.py b/configs/resnext/resnext101_32x4d_b32x8_imagenet.py new file mode 100644 index 0000000..07d66c3 --- /dev/null +++ b/configs/resnext/resnext101_32x4d_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnext101-32x4d_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnext101-32x4d_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnext/resnext101_32x8d_b32x8_imagenet.py b/configs/resnext/resnext101_32x8d_b32x8_imagenet.py new file mode 100644 index 0000000..071ca60 --- /dev/null +++ b/configs/resnext/resnext101_32x8d_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnext101-32x8d_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnext101-32x8d_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnext/resnext152-32x4d_8xb32_in1k.py b/configs/resnext/resnext152-32x4d_8xb32_in1k.py new file mode 100644 index 0000000..9c13731 --- /dev/null +++ b/configs/resnext/resnext152-32x4d_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnext152_32x4d.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnext/resnext152_32x4d_b32x8_imagenet.py b/configs/resnext/resnext152_32x4d_b32x8_imagenet.py new file mode 100644 index 0000000..6d05c8b --- /dev/null +++ b/configs/resnext/resnext152_32x4d_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnext152-32x4d_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnext152-32x4d_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/resnext/resnext50-32x4d_8xb32_in1k.py b/configs/resnext/resnext50-32x4d_8xb32_in1k.py new file mode 100644 index 0000000..bd9c9fc --- /dev/null +++ b/configs/resnext/resnext50-32x4d_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/resnext50_32x4d.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/resnext/resnext50_32x4d_b32x8_imagenet.py b/configs/resnext/resnext50_32x4d_b32x8_imagenet.py new file mode 100644 index 0000000..92ae063 --- /dev/null +++ b/configs/resnext/resnext50_32x4d_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'resnext50-32x4d_8xb32_in1k.py' + +_deprecation_ = dict( + expected='resnext50-32x4d_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/seresnet/README.md b/configs/seresnet/README.md new file mode 100644 index 0000000..ccfd1d1 --- /dev/null +++ b/configs/seresnet/README.md @@ -0,0 +1,34 @@ +# SE-ResNet + +> [Squeeze-and-Excitation Networks](https://openaccess.thecvf.com/content_cvpr_2018/html/Hu_Squeeze-and-Excitation_Networks_CVPR_2018_paper.html) + + + +## Abstract + +The central building block of convolutional neural networks (CNNs) is the convolution operator, which enables networks to construct informative features by fusing both spatial and channel-wise information within local receptive fields at each layer. A broad range of prior research has investigated the spatial component of this relationship, seeking to strengthen the representational power of a CNN by enhancing the quality of spatial encodings throughout its feature hierarchy. In this work, we focus instead on the channel relationship and propose a novel architectural unit, which we term the "Squeeze-and-Excitation" (SE) block, that adaptively recalibrates channel-wise feature responses by explicitly modelling interdependencies between channels. We show that these blocks can be stacked together to form SENet architectures that generalise extremely effectively across different datasets. We further demonstrate that SE blocks bring significant improvements in performance for existing state-of-the-art CNNs at slight additional computational cost. Squeeze-and-Excitation Networks formed the foundation of our ILSVRC 2017 classification submission which won first place and reduced the top-5 error to 2.251%, surpassing the winning entry of 2016 by a relative improvement of ~25%. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------: | :-------: | :------: | :-------: | :-------: | :-------------------------------------------------------------------------: | :---------------------------------------------------------------------------: | +| SE-ResNet-50 | 28.09 | 4.13 | 77.74 | 93.84 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/seresnet/seresnet50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet50_batch256_imagenet_20200804-ae206104.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet50_batch256_imagenet_20200708-657b3c36.log.json) | +| SE-ResNet-101 | 49.33 | 7.86 | 78.26 | 94.07 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/seresnet/seresnet101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet101_batch256_imagenet_20200804-ba5b51d4.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet101_batch256_imagenet_20200708-038a4d04.log.json) | + +## Citation + +``` +@inproceedings{hu2018squeeze, + title={Squeeze-and-excitation networks}, + author={Hu, Jie and Shen, Li and Sun, Gang}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={7132--7141}, + year={2018} +} +``` diff --git a/configs/seresnet/metafile.yml b/configs/seresnet/metafile.yml new file mode 100644 index 0000000..7d2a381 --- /dev/null +++ b/configs/seresnet/metafile.yml @@ -0,0 +1,47 @@ +Collections: + - Name: SEResNet + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Epochs: 140 + Batch Size: 256 + Architecture: + - ResNet + Paper: + URL: https://openaccess.thecvf.com/content_cvpr_2018/html/Hu_Squeeze-and-Excitation_Networks_CVPR_2018_paper.html + Title: "Squeeze-and-Excitation Networks" + README: configs/seresnet/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/seresnet.py#L58 + Version: v0.15.0 + +Models: + - Name: seresnet50_8xb32_in1k + Metadata: + FLOPs: 4130000000 + Parameters: 28090000 + In Collection: SEResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 77.74 + Top 5 Accuracy: 93.84 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet50_batch256_imagenet_20200804-ae206104.pth + Config: configs/seresnet/seresnet50_8xb32_in1k.py + - Name: seresnet101_8xb32_in1k + Metadata: + FLOPs: 7860000000 + Parameters: 49330000 + In Collection: SEResNet + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.26 + Top 5 Accuracy: 94.07 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet101_batch256_imagenet_20200804-ba5b51d4.pth + Config: configs/seresnet/seresnet101_8xb32_in1k.py diff --git a/configs/seresnet/seresnet101_8xb32_in1k.py b/configs/seresnet/seresnet101_8xb32_in1k.py new file mode 100644 index 0000000..8be39e7 --- /dev/null +++ b/configs/seresnet/seresnet101_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/seresnet101.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/seresnet/seresnet101_b32x8_imagenet.py b/configs/seresnet/seresnet101_b32x8_imagenet.py new file mode 100644 index 0000000..46daa09 --- /dev/null +++ b/configs/seresnet/seresnet101_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'seresnet101_8xb32_in1k.py' + +_deprecation_ = dict( + expected='seresnet101_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/seresnet/seresnet50_8xb32_in1k.py b/configs/seresnet/seresnet50_8xb32_in1k.py new file mode 100644 index 0000000..19082bd --- /dev/null +++ b/configs/seresnet/seresnet50_8xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/seresnet50.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256_140e.py', + '../_base_/default_runtime.py' +] diff --git a/configs/seresnet/seresnet50_b32x8_imagenet.py b/configs/seresnet/seresnet50_b32x8_imagenet.py new file mode 100644 index 0000000..0fb9df3 --- /dev/null +++ b/configs/seresnet/seresnet50_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'seresnet50_8xb32_in1k.py' + +_deprecation_ = dict( + expected='seresnet50_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/seresnet/seresnext101-32x4d_8xb32_in1k.py b/configs/seresnet/seresnext101-32x4d_8xb32_in1k.py new file mode 100644 index 0000000..0177830 --- /dev/null +++ b/configs/seresnet/seresnext101-32x4d_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/seresnext101_32x4d.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/seresnet/seresnext101_32x4d_b32x8_imagenet.py b/configs/seresnet/seresnext101_32x4d_b32x8_imagenet.py new file mode 100644 index 0000000..cb99ec6 --- /dev/null +++ b/configs/seresnet/seresnext101_32x4d_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'seresnext101-32x4d_8xb32_in1k.py' + +_deprecation_ = dict( + expected='seresnext101-32x4d_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/seresnet/seresnext50-32x4d_8xb32_in1k.py b/configs/seresnet/seresnext50-32x4d_8xb32_in1k.py new file mode 100644 index 0000000..4d593e4 --- /dev/null +++ b/configs/seresnet/seresnext50-32x4d_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/seresnext50_32x4d.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/seresnet/seresnext50_32x4d_b32x8_imagenet.py b/configs/seresnet/seresnext50_32x4d_b32x8_imagenet.py new file mode 100644 index 0000000..4922960 --- /dev/null +++ b/configs/seresnet/seresnext50_32x4d_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'seresnext50-32x4d_8xb32_in1k.py' + +_deprecation_ = dict( + expected='seresnext50-32x4d_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/shufflenet_v1/README.md b/configs/shufflenet_v1/README.md new file mode 100644 index 0000000..fd13127 --- /dev/null +++ b/configs/shufflenet_v1/README.md @@ -0,0 +1,33 @@ +# ShuffleNet V1 + +> [ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices](https://openaccess.thecvf.com/content_cvpr_2018/html/Zhang_ShuffleNet_An_Extremely_CVPR_2018_paper.html) + + + +## Abstract + +We introduce an extremely computation-efficient CNN architecture named ShuffleNet, which is designed specially for mobile devices with very limited computing power (e.g., 10-150 MFLOPs). The new architecture utilizes two new operations, pointwise group convolution and channel shuffle, to greatly reduce computation cost while maintaining accuracy. Experiments on ImageNet classification and MS COCO object detection demonstrate the superior performance of ShuffleNet over other structures, e.g. lower top-1 error (absolute 7.8%) than recent MobileNet on ImageNet classification task, under the computation budget of 40 MFLOPs. On an ARM-based mobile device, ShuffleNet achieves ~13x actual speedup over AlexNet while maintaining comparable accuracy. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-------------------------: | :-------: | :------: | :-------: | :-------: | :------------------------------------------------------------------: | :--------------------------------------------------------------------: | +| ShuffleNetV1 1.0x (group=3) | 1.87 | 0.146 | 68.13 | 87.81 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/shufflenet_v1/shufflenet_v1_batch1024_imagenet_20200804-5d6cec73.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/shufflenet_v1/shufflenet_v1_batch1024_imagenet_20200804-5d6cec73.log.json) | + +## Citation + +``` +@inproceedings{zhang2018shufflenet, + title={Shufflenet: An extremely efficient convolutional neural network for mobile devices}, + author={Zhang, Xiangyu and Zhou, Xinyu and Lin, Mengxiao and Sun, Jian}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={6848--6856}, + year={2018} +} +``` diff --git a/configs/shufflenet_v1/metafile.yml b/configs/shufflenet_v1/metafile.yml new file mode 100644 index 0000000..2cfffa1 --- /dev/null +++ b/configs/shufflenet_v1/metafile.yml @@ -0,0 +1,35 @@ +Collections: + - Name: Shufflenet V1 + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - SGD with Momentum + - Weight Decay + - No BN decay + Training Resources: 8x 1080 GPUs + Epochs: 300 + Batch Size: 1024 + Architecture: + - Shufflenet V1 + Paper: + URL: https://openaccess.thecvf.com/content_cvpr_2018/html/Zhang_ShuffleNet_An_Extremely_CVPR_2018_paper.html + Title: "ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices" + README: configs/shufflenet_v1/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/shufflenet_v1.py#L152 + Version: v0.15.0 + +Models: + - Name: shufflenet-v1-1x_16xb64_in1k + Metadata: + FLOPs: 146000000 + Parameters: 1870000 + In Collection: Shufflenet V1 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 68.13 + Top 5 Accuracy: 87.81 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/shufflenet_v1/shufflenet_v1_batch1024_imagenet_20200804-5d6cec73.pth + Config: configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py diff --git a/configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py b/configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py new file mode 100644 index 0000000..58e45f1 --- /dev/null +++ b/configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/shufflenet_v1_1x.py', + '../_base_/datasets/imagenet_bs64_pil_resize.py', + '../_base_/schedules/imagenet_bs1024_linearlr_bn_nowd.py', + '../_base_/default_runtime.py' +] diff --git a/configs/shufflenet_v1/shufflenet_v1_1x_b64x16_linearlr_bn_nowd_imagenet.py b/configs/shufflenet_v1/shufflenet_v1_1x_b64x16_linearlr_bn_nowd_imagenet.py new file mode 100644 index 0000000..0312197 --- /dev/null +++ b/configs/shufflenet_v1/shufflenet_v1_1x_b64x16_linearlr_bn_nowd_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'shufflenet-v1-1x_16xb64_in1k.py' + +_deprecation_ = dict( + expected='shufflenet-v1-1x_16xb64_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/shufflenet_v2/README.md b/configs/shufflenet_v2/README.md new file mode 100644 index 0000000..7827154 --- /dev/null +++ b/configs/shufflenet_v2/README.md @@ -0,0 +1,33 @@ +# ShuffleNet V2 + +> [Shufflenet v2: Practical guidelines for efficient cnn architecture design](https://openaccess.thecvf.com/content_ECCV_2018/papers/Ningning_Light-weight_CNN_Architecture_ECCV_2018_paper.pdf) + + + +## Abstract + +Currently, the neural network architecture design is mostly guided by the *indirect* metric of computation complexity, i.e., FLOPs. However, the *direct* metric, e.g., speed, also depends on the other factors such as memory access cost and platform characterics. Thus, this work proposes to evaluate the direct metric on the target platform, beyond only considering FLOPs. Based on a series of controlled experiments, this work derives several practical *guidelines* for efficient network design. Accordingly, a new architecture is presented, called *ShuffleNet V2*. Comprehensive ablation experiments verify that our model is the state-of-the-art in terms of speed and accuracy tradeoff. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :---------------: | :-------: | :------: | :-------: | :-------: | :-----------------------------------------------------------------------: | :-------------------------------------------------------------------------: | +| ShuffleNetV2 1.0x | 2.28 | 0.149 | 69.55 | 88.92 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/shufflenet_v2/shufflenet_v2_batch1024_imagenet_20200812-5bf4721e.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/shufflenet_v2/shufflenet_v2_batch1024_imagenet_20200804-8860eec9.log.json) | + +## Citation + +``` +@inproceedings{ma2018shufflenet, + title={Shufflenet v2: Practical guidelines for efficient cnn architecture design}, + author={Ma, Ningning and Zhang, Xiangyu and Zheng, Hai-Tao and Sun, Jian}, + booktitle={Proceedings of the European conference on computer vision (ECCV)}, + pages={116--131}, + year={2018} +} +``` diff --git a/configs/shufflenet_v2/metafile.yml b/configs/shufflenet_v2/metafile.yml new file mode 100644 index 0000000..a06322d --- /dev/null +++ b/configs/shufflenet_v2/metafile.yml @@ -0,0 +1,35 @@ +Collections: + - Name: Shufflenet V2 + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - SGD with Momentum + - Weight Decay + - No BN decay + Training Resources: 8x 1080 GPUs + Epochs: 300 + Batch Size: 1024 + Architecture: + - Shufflenet V2 + Paper: + URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Ningning_Light-weight_CNN_Architecture_ECCV_2018_paper.pdf + Title: "ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + README: configs/shufflenet_v2/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/shufflenet_v2.py#L134 + Version: v0.15.0 + +Models: + - Name: shufflenet-v2-1x_16xb64_in1k + Metadata: + FLOPs: 149000000 + Parameters: 2280000 + In Collection: Shufflenet V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 69.55 + Top 5 Accuracy: 88.92 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/shufflenet_v2/shufflenet_v2_batch1024_imagenet_20200812-5bf4721e.pth + Config: configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py diff --git a/configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py b/configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py new file mode 100644 index 0000000..a106ab8 --- /dev/null +++ b/configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/shufflenet_v2_1x.py', + '../_base_/datasets/imagenet_bs64_pil_resize.py', + '../_base_/schedules/imagenet_bs1024_linearlr_bn_nowd.py', + '../_base_/default_runtime.py' +] diff --git a/configs/shufflenet_v2/shufflenet_v2_1x_b64x16_linearlr_bn_nowd_imagenet.py b/configs/shufflenet_v2/shufflenet_v2_1x_b64x16_linearlr_bn_nowd_imagenet.py new file mode 100644 index 0000000..c0938b0 --- /dev/null +++ b/configs/shufflenet_v2/shufflenet_v2_1x_b64x16_linearlr_bn_nowd_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'shufflenet-v2-1x_16xb64_in1k.py' + +_deprecation_ = dict( + expected='shufflenet-v2-1x_16xb64_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/swin_transformer/README.md b/configs/swin_transformer/README.md new file mode 100644 index 0000000..86975ec --- /dev/null +++ b/configs/swin_transformer/README.md @@ -0,0 +1,60 @@ +# Swin Transformer + +> [Swin Transformer: Hierarchical Vision Transformer using Shifted Windows](https://arxiv.org/pdf/2103.14030.pdf) + + + +## Abstract + +This paper presents a new vision Transformer, called Swin Transformer, that capably serves as a general-purpose backbone for computer vision. Challenges in adapting Transformer from language to vision arise from differences between the two domains, such as large variations in the scale of visual entities and the high resolution of pixels in images compared to words in text. To address these differences, we propose a hierarchical Transformer whose representation is computed with **S**hifted **win**dows. The shifted windowing scheme brings greater efficiency by limiting self-attention computation to non-overlapping local windows while also allowing for cross-window connection. This hierarchical architecture has the flexibility to model at various scales and has linear computational complexity with respect to image size. These qualities of Swin Transformer make it compatible with a broad range of vision tasks, including image classification (87.3 top-1 accuracy on ImageNet-1K) and dense prediction tasks such as object detection (58.7 box AP and 51.1 mask AP on COCO test-dev) and semantic segmentation (53.5 mIoU on ADE20K val). Its performance surpasses the previous state-of-the-art by a large margin of +2.7 box AP and +2.6 mask AP on COCO, and +3.2 mIoU on ADE20K, demonstrating the potential of Transformer-based models as vision backbones. The hierarchical design and the shifted window approach also prove beneficial for all-MLP architectures. + +
+ +
+ +## Results and models + +### ImageNet-21k + +The pre-trained models on ImageNet-21k are used to fine-tune, and therefore don't have evaluation results. + +| Model | resolution | Params(M) | Flops(G) | Download | +| :----: | :--------: | :-------: | :------: | :---------------------------------------------------------------------------------------------------------------------: | +| Swin-B | 224x224 | 86.74 | 15.14 | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-base_3rdparty_in21k.pth) | +| Swin-B | 384x384 | 86.88 | 44.49 | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-base_3rdparty_in21k-384px.pth) | +| Swin-L | 224x224 | 195.00 | 34.04 | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-large_3rdparty_in21k.pth) | +| Swin-L | 384x384 | 195.20 | 100.04 | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-base_3rdparty_in21k-384px.pth) | + +### ImageNet-1k + +| Model | Pretrain | resolution | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :------: | :----------: | :--------: | :-------: | :------: | :-------: | :-------: | :----------------------------------------------------------------: | :-------------------------------------------------------------------: | +| Swin-T | From scratch | 224x224 | 28.29 | 4.36 | 81.18 | 95.61 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-tiny_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_tiny_224_b16x64_300e_imagenet_20210616_090925-66df6be6.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_tiny_224_b16x64_300e_imagenet_20210616_090925.log.json) | +| Swin-S | From scratch | 224x224 | 49.61 | 8.52 | 83.02 | 96.29 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-small_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_small_224_b16x64_300e_imagenet_20210615_110219-7f9d988b.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_small_224_b16x64_300e_imagenet_20210615_110219.log.json) | +| Swin-B | From scratch | 224x224 | 87.77 | 15.14 | 83.36 | 96.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_base_224_b16x64_300e_imagenet_20210616_190742-93230b0d.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_base_224_b16x64_300e_imagenet_20210616_190742.log.json) | +| Swin-S\* | From scratch | 224x224 | 49.61 | 8.52 | 83.21 | 96.25 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-small_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_small_patch4_window7_224-cc7a01c9.pth) | +| Swin-B\* | From scratch | 224x224 | 87.77 | 15.14 | 83.42 | 96.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-base_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_base_patch4_window7_224-4670dd19.pth) | +| Swin-B\* | From scratch | 384x384 | 87.90 | 44.49 | 84.49 | 96.95 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-base_16xb64_in1k-384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_base_patch4_window12_384-02c598a4.pth) | +| Swin-B\* | ImageNet-21k | 224x224 | 87.77 | 15.14 | 85.16 | 97.50 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-base_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_base_patch4_window7_224_22kto1k-f967f799.pth) | +| Swin-B\* | ImageNet-21k | 384x384 | 87.90 | 44.49 | 86.44 | 98.05 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-base_16xb64_in1k-384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_base_patch4_window12_384_22kto1k-d59b0d1d.pth) | +| Swin-L\* | ImageNet-21k | 224x224 | 196.53 | 34.04 | 86.24 | 97.88 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-large_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_large_patch4_window7_224_22kto1k-5f0996db.pth) | +| Swin-L\* | ImageNet-21k | 384x384 | 196.74 | 100.04 | 87.25 | 98.25 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-large_16xb64_in1k-384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_large_patch4_window12_384_22kto1k-0a40944b.pth) | + +*Models with * are converted from the [official repo](https://github.com/microsoft/Swin-Transformer#main-results-on-imagenet-with-pretrained-models). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +### CUB-200-2011 + +| Model | Pretrain | resolution | Params(M) | Flops(G) | Top-1 (%) | Config | Download | +| :----: | :---------------------------------------------------: | :--------: | :-------: | :------: | :-------: | :-------------------------------------------------: | :----------------------------------------------------: | +| Swin-L | [ImageNet-21k](https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-base_3rdparty_in21k-384px.pth) | 384x384 | 195.51 | 100.04 | 91.87 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-large_8xb8_cub_384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin-large_8xb8_cub_384px_20220307-1bbaee6a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin-large_8xb8_cub_384px_20220307-1bbaee6a.log.json) | + +## Citation + +``` +@article{liu2021Swin, + title={Swin Transformer: Hierarchical Vision Transformer using Shifted Windows}, + author={Liu, Ze and Lin, Yutong and Cao, Yue and Hu, Han and Wei, Yixuan and Zhang, Zheng and Lin, Stephen and Guo, Baining}, + journal={arXiv preprint arXiv:2103.14030}, + year={2021} +} +``` diff --git a/configs/swin_transformer/metafile.yml b/configs/swin_transformer/metafile.yml new file mode 100644 index 0000000..b44c1ba --- /dev/null +++ b/configs/swin_transformer/metafile.yml @@ -0,0 +1,201 @@ +Collections: + - Name: Swin-Transformer + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - AdamW + - Weight Decay + Training Resources: 16x V100 GPUs + Epochs: 300 + Batch Size: 1024 + Architecture: + - Shift Window Multihead Self Attention + Paper: + URL: https://arxiv.org/pdf/2103.14030.pdf + Title: "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows" + README: configs/swin_transformer/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/swin_transformer.py#L176 + Version: v0.15.0 + +Models: + - Name: swin-tiny_16xb64_in1k + Metadata: + FLOPs: 4360000000 + Parameters: 28290000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.18 + Top 5 Accuracy: 95.61 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_tiny_224_b16x64_300e_imagenet_20210616_090925-66df6be6.pth + Config: configs/swin_transformer/swin-tiny_16xb64_in1k.py + - Name: swin-small_16xb64_in1k + Metadata: + FLOPs: 8520000000 + Parameters: 49610000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.02 + Top 5 Accuracy: 96.29 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_small_224_b16x64_300e_imagenet_20210615_110219-7f9d988b.pth + Config: configs/swin_transformer/swin-small_16xb64_in1k.py + - Name: swin-base_16xb64_in1k + Metadata: + FLOPs: 15140000000 + Parameters: 87770000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.36 + Top 5 Accuracy: 96.44 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_base_224_b16x64_300e_imagenet_20210616_190742-93230b0d.pth + Config: configs/swin_transformer/swin-base_16xb64_in1k.py + - Name: swin-tiny_3rdparty_in1k + Metadata: + FLOPs: 4360000000 + Parameters: 28290000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.18 + Top 5 Accuracy: 95.52 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_tiny_patch4_window7_224-160bb0a5.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth + Code: https://github.com/microsoft/Swin-Transformer/blob/777f6c66604bb5579086c4447efe3620344d95a9/models/swin_transformer.py#L458 + Config: configs/swin_transformer/swin-tiny_16xb64_in1k.py + - Name: swin-small_3rdparty_in1k + Metadata: + FLOPs: 8520000000 + Parameters: 49610000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.21 + Top 5 Accuracy: 96.25 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_small_patch4_window7_224-cc7a01c9.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_small_patch4_window7_224.pth + Code: https://github.com/microsoft/Swin-Transformer/blob/777f6c66604bb5579086c4447efe3620344d95a9/models/swin_transformer.py#L458 + Config: configs/swin_transformer/swin-small_16xb64_in1k.py + - Name: swin-base_3rdparty_in1k + Metadata: + FLOPs: 15140000000 + Parameters: 87770000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.42 + Top 5 Accuracy: 96.44 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_base_patch4_window7_224-4670dd19.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224.pth + Code: https://github.com/microsoft/Swin-Transformer/blob/777f6c66604bb5579086c4447efe3620344d95a9/models/swin_transformer.py#L458 + Config: configs/swin_transformer/swin-base_16xb64_in1k.py + - Name: swin-base_3rdparty_in1k-384 + Metadata: + FLOPs: 44490000000 + Parameters: 87900000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.49 + Top 5 Accuracy: 96.95 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_base_patch4_window12_384-02c598a4.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384.pth + Code: https://github.com/microsoft/Swin-Transformer/blob/777f6c66604bb5579086c4447efe3620344d95a9/models/swin_transformer.py#L458 + Config: configs/swin_transformer/swin-base_16xb64_in1k-384px.py + - Name: swin-base_in21k-pre-3rdparty_in1k + Metadata: + FLOPs: 15140000000 + Parameters: 87770000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 85.16 + Top 5 Accuracy: 97.50 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_base_patch4_window7_224_22kto1k-f967f799.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224_22kto1k.pth + Code: https://github.com/microsoft/Swin-Transformer/blob/777f6c66604bb5579086c4447efe3620344d95a9/models/swin_transformer.py#L458 + Config: configs/swin_transformer/swin-base_16xb64_in1k.py + - Name: swin-base_in21k-pre-3rdparty_in1k-384 + Metadata: + FLOPs: 44490000000 + Parameters: 87900000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 86.44 + Top 5 Accuracy: 98.05 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_base_patch4_window12_384_22kto1k-d59b0d1d.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384_22kto1k.pth + Code: https://github.com/microsoft/Swin-Transformer/blob/777f6c66604bb5579086c4447efe3620344d95a9/models/swin_transformer.py#L458 + Config: configs/swin_transformer/swin-base_16xb64_in1k-384px.py + - Name: swin-large_in21k-pre-3rdparty_in1k + Metadata: + FLOPs: 34040000000 + Parameters: 196530000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 86.24 + Top 5 Accuracy: 97.88 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_large_patch4_window7_224_22kto1k-5f0996db.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window7_224_22kto1k.pth + Code: https://github.com/microsoft/Swin-Transformer/blob/777f6c66604bb5579086c4447efe3620344d95a9/models/swin_transformer.py#L458 + Config: configs/swin_transformer/swin-large_16xb64_in1k.py + - Name: swin-large_in21k-pre-3rdparty_in1k-384 + Metadata: + FLOPs: 100040000000 + Parameters: 196740000 + In Collection: Swin-Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 87.25 + Top 5 Accuracy: 98.25 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin_large_patch4_window12_384_22kto1k-0a40944b.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22kto1k.pth + Code: https://github.com/microsoft/Swin-Transformer/blob/777f6c66604bb5579086c4447efe3620344d95a9/models/swin_transformer.py#L458 + Config: configs/swin_transformer/swin-large_16xb64_in1k-384px.py + - Name: swin-large_8xb8_cub_384px + Metadata: + FLOPs: 100040000000 + Parameters: 195510000 + In Collection: Swin-Transformer + Results: + - Dataset: CUB-200-2011 + Metrics: + Top 1 Accuracy: 91.87 + Task: Image Classification + Pretrain: https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-large_3rdparty_in21k-384px.pth + Weights: https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin-large_8xb8_cub_384px_20220307-1bbaee6a.pth + Config: configs/swin_transformer/swin-large_8xb8_cub_384px.py diff --git a/configs/swin_transformer/swin-base_16xb64_in1k-384px.py b/configs/swin_transformer/swin-base_16xb64_in1k-384px.py new file mode 100644 index 0000000..711a0d6 --- /dev/null +++ b/configs/swin_transformer/swin-base_16xb64_in1k-384px.py @@ -0,0 +1,7 @@ +# Only for evaluation +_base_ = [ + '../_base_/models/swin_transformer/base_384.py', + '../_base_/datasets/imagenet_bs64_swin_384.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] diff --git a/configs/swin_transformer/swin-base_16xb64_in1k.py b/configs/swin_transformer/swin-base_16xb64_in1k.py new file mode 100644 index 0000000..2a4548a --- /dev/null +++ b/configs/swin_transformer/swin-base_16xb64_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/swin_transformer/base_224.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] diff --git a/configs/swin_transformer/swin-large_16xb64_in1k-384px.py b/configs/swin_transformer/swin-large_16xb64_in1k-384px.py new file mode 100644 index 0000000..a7f0ad2 --- /dev/null +++ b/configs/swin_transformer/swin-large_16xb64_in1k-384px.py @@ -0,0 +1,7 @@ +# Only for evaluation +_base_ = [ + '../_base_/models/swin_transformer/large_384.py', + '../_base_/datasets/imagenet_bs64_swin_384.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] diff --git a/configs/swin_transformer/swin-large_16xb64_in1k.py b/configs/swin_transformer/swin-large_16xb64_in1k.py new file mode 100644 index 0000000..4e875c5 --- /dev/null +++ b/configs/swin_transformer/swin-large_16xb64_in1k.py @@ -0,0 +1,7 @@ +# Only for evaluation +_base_ = [ + '../_base_/models/swin_transformer/large_224.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] diff --git a/configs/swin_transformer/swin-large_8xb8_cub_384px.py b/configs/swin_transformer/swin-large_8xb8_cub_384px.py new file mode 100644 index 0000000..d113716 --- /dev/null +++ b/configs/swin_transformer/swin-large_8xb8_cub_384px.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/models/swin_transformer/large_384.py', + '../_base_/datasets/cub_bs8_384.py', '../_base_/schedules/cub_bs64.py', + '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-large_3rdparty_in21k-384px.pth' # noqa +model = dict( + type='ImageClassifier', + backbone=dict( + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint, prefix='backbone')), + head=dict(num_classes=200, )) + +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0) + }) + +optimizer = dict( + _delete_=True, + type='AdamW', + lr=5e-6, + weight_decay=0.0005, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=paramwise_cfg) +optimizer_config = dict(grad_clip=dict(max_norm=5.0), _delete_=True) + +log_config = dict(interval=20) # log every 20 intervals + +checkpoint_config = dict( + interval=1, max_keep_ckpts=3) # save last three checkpoints diff --git a/configs/swin_transformer/swin-small_16xb64_in1k.py b/configs/swin_transformer/swin-small_16xb64_in1k.py new file mode 100644 index 0000000..aa1fa21 --- /dev/null +++ b/configs/swin_transformer/swin-small_16xb64_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/swin_transformer/small_224.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] diff --git a/configs/swin_transformer/swin-tiny_16xb64_in1k.py b/configs/swin_transformer/swin-tiny_16xb64_in1k.py new file mode 100644 index 0000000..e1ed022 --- /dev/null +++ b/configs/swin_transformer/swin-tiny_16xb64_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/swin_transformer/tiny_224.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] diff --git a/configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py b/configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py new file mode 100644 index 0000000..912c379 --- /dev/null +++ b/configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'swin-base_16xb64_in1k.py' + +_deprecation_ = dict( + expected='swin-base_16xb64_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/swin_transformer/swin_base_384_evalonly_imagenet.py b/configs/swin_transformer/swin_base_384_evalonly_imagenet.py new file mode 100644 index 0000000..9ed5888 --- /dev/null +++ b/configs/swin_transformer/swin_base_384_evalonly_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'swin-base_16xb64_in1k-384px.py' + +_deprecation_ = dict( + expected='swin-base_16xb64_in1k-384px.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/swin_transformer/swin_large_224_evalonly_imagenet.py b/configs/swin_transformer/swin_large_224_evalonly_imagenet.py new file mode 100644 index 0000000..5ebb54a --- /dev/null +++ b/configs/swin_transformer/swin_large_224_evalonly_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'swin-large_16xb64_in1k.py' + +_deprecation_ = dict( + expected='swin-large_16xb64_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/swin_transformer/swin_large_384_evalonly_imagenet.py b/configs/swin_transformer/swin_large_384_evalonly_imagenet.py new file mode 100644 index 0000000..9a59f5b --- /dev/null +++ b/configs/swin_transformer/swin_large_384_evalonly_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'swin-large_16xb64_in1k-384px.py' + +_deprecation_ = dict( + expected='swin-large_16xb64_in1k-384px.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/swin_transformer/swin_small_224_b16x64_300e_imagenet.py b/configs/swin_transformer/swin_small_224_b16x64_300e_imagenet.py new file mode 100644 index 0000000..a747aa4 --- /dev/null +++ b/configs/swin_transformer/swin_small_224_b16x64_300e_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'swin-small_16xb64_in1k.py' + +_deprecation_ = dict( + expected='swin-small_16xb64_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/swin_transformer/swin_tiny_224_b16x64_300e_imagenet.py b/configs/swin_transformer/swin_tiny_224_b16x64_300e_imagenet.py new file mode 100644 index 0000000..2160eb9 --- /dev/null +++ b/configs/swin_transformer/swin_tiny_224_b16x64_300e_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'swin-tiny_16xb64_in1k.py' + +_deprecation_ = dict( + expected='swin-tiny_16xb64_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/swin_transformer_v2/README.md b/configs/swin_transformer_v2/README.md new file mode 100644 index 0000000..31d1aff --- /dev/null +++ b/configs/swin_transformer_v2/README.md @@ -0,0 +1,58 @@ +# Swin Transformer V2 + +> [Swin Transformer V2: Scaling Up Capacity and Resolution](https://arxiv.org/abs/2111.09883.pdf) + + + +## Abstract + +Large-scale NLP models have been shown to significantly improve the performance on language tasks with no signs of saturation. They also demonstrate amazing few-shot capabilities like that of human beings. This paper aims to explore large-scale models in computer vision. We tackle three major issues in training and application of large vision models, including training instability, resolution gaps between pre-training and fine-tuning, and hunger on labelled data. Three main techniques are proposed: 1) a residual-post-norm method combined with cosine attention to improve training stability; 2) A log-spaced continuous position bias method to effectively transfer models pre-trained using low-resolution images to downstream tasks with high-resolution inputs; 3) A self-supervised pre-training method, SimMIM, to reduce the needs of vast labeled images. Through these techniques, this paper successfully trained a 3 billion-parameter Swin Transformer V2 model, which is the largest dense vision model to date, and makes it capable of training with images of up to 1,536×1,536 resolution. It set new performance records on 4 representative vision tasks, including ImageNet-V2 image classification, COCO object detection, ADE20K semantic segmentation, and Kinetics-400 video action classification. Also note our training is much more efficient than that in Google's billion-level visual models, which consumes 40 times less labelled data and 40 times less training time. + +
+ +
+ +## Results and models + +### ImageNet-21k + +The pre-trained models on ImageNet-21k are used to fine-tune, and therefore don't have evaluation results. + +| Model | resolution | Params(M) | Flops(G) | Download | +| :------: | :--------: | :-------: | :------: | :--------------------------------------------------------------------------------------------------------------------------------------: | +| Swin-B\* | 192x192 | 87.92 | 8.51 | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-base-w12_3rdparty_in21k-192px_20220803-f7dc9763.pth) | +| Swin-L\* | 192x192 | 196.74 | 19.04 | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-large-w12_3rdparty_in21k-192px_20220803-d9073fee.pth) | + +### ImageNet-1k + +| Model | Pretrain | resolution | window | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :------: | :----------: | :--------: | :----: | :-------: | :------: | :-------: | :-------: | :-------------------------------------------------------------: | :----------------------------------------------------------------: | +| Swin-T\* | From scratch | 256x256 | 8x8 | 28.35 | 4.35 | 81.76 | 95.87 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-tiny-w8_16xb64_in1k-256px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-tiny-w8_3rdparty_in1k-256px_20220803-e318968f.pth) | +| Swin-T\* | From scratch | 256x256 | 16x16 | 28.35 | 4.4 | 82.81 | 96.23 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-tiny-w16_16xb64_in1k-256px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-tiny-w16_3rdparty_in1k-256px_20220803-9651cdd7.pth) | +| Swin-S\* | From scratch | 256x256 | 8x8 | 49.73 | 8.45 | 83.74 | 96.6 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-small-w8_16xb64_in1k-256px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-small-w8_3rdparty_in1k-256px_20220803-b01a4332.pth) | +| Swin-S\* | From scratch | 256x256 | 16x16 | 49.73 | 8.57 | 84.13 | 96.83 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-small-w16_16xb64_in1k-256px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-small-w16_3rdparty_in1k-256px_20220803-b707d206.pth) | +| Swin-B\* | From scratch | 256x256 | 8x8 | 87.92 | 14.99 | 84.2 | 96.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-base-w8_16xb64_in1k-256px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-base-w8_3rdparty_in1k-256px_20220803-8ff28f2b.pth) | +| Swin-B\* | From scratch | 256x256 | 16x16 | 87.92 | 15.14 | 84.6 | 97.05 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-base-w16_16xb64_in1k-256px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-base-w16_3rdparty_in1k-256px_20220803-5a1886b7.pth) | +| Swin-B\* | ImageNet-21k | 256x256 | 16x16 | 87.92 | 15.14 | 86.17 | 97.88 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-base-w16_in21k-pre_16xb64_in1k-256px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-base-w16_in21k-pre_3rdparty_in1k-256px_20220803-8d7aa8ad.pth) | +| Swin-B\* | ImageNet-21k | 384x384 | 24x24 | 87.92 | 34.07 | 87.14 | 98.23 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-base-w24_in21k-pre_16xb64_in1k-384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-base-w24_in21k-pre_3rdparty_in1k-384px_20220803-44eb70f8.pth) | +| Swin-L\* | ImageNet-21k | 256X256 | 16x16 | 196.75 | 33.86 | 86.93 | 98.06 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-large-w16_in21k-pre_16xb64_in1k-256px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-large-w16_in21k-pre_3rdparty_in1k-256px_20220803-c40cbed7.pth) | +| Swin-L\* | ImageNet-21k | 384x384 | 24x24 | 196.75 | 76.2 | 87.59 | 98.27 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer_v2/swinv2-large-w24_in21k-pre_16xb64_in1k-384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-large-w24_in21k-pre_3rdparty_in1k-384px_20220803-3b36c165.pth) | + +*Models with * are converted from the [official repo](https://github.com/microsoft/Swin-Transformer#main-results-on-imagenet-with-pretrained-models). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +*ImageNet-21k pretrained models with input resolution of 256x256 and 384x384 both fine-tuned from the same pre-training model using a smaller input resolution of 192x192.* + +## Citation + +``` +@article{https://doi.org/10.48550/arxiv.2111.09883, + doi = {10.48550/ARXIV.2111.09883}, + url = {https://arxiv.org/abs/2111.09883}, + author = {Liu, Ze and Hu, Han and Lin, Yutong and Yao, Zhuliang and Xie, Zhenda and Wei, Yixuan and Ning, Jia and Cao, Yue and Zhang, Zheng and Dong, Li and Wei, Furu and Guo, Baining}, + keywords = {Computer Vision and Pattern Recognition (cs.CV), FOS: Computer and information sciences, FOS: Computer and information sciences}, + title = {Swin Transformer V2: Scaling Up Capacity and Resolution}, + publisher = {arXiv}, + year = {2021}, + copyright = {Creative Commons Attribution 4.0 International} +} +``` diff --git a/configs/swin_transformer_v2/metafile.yml b/configs/swin_transformer_v2/metafile.yml new file mode 100644 index 0000000..cef8392 --- /dev/null +++ b/configs/swin_transformer_v2/metafile.yml @@ -0,0 +1,204 @@ +Collections: + - Name: Swin-Transformer-V2 + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - AdamW + - Weight Decay + Training Resources: 16x V100 GPUs + Epochs: 300 + Batch Size: 1024 + Architecture: + - Shift Window Multihead Self Attention + Paper: + URL: https://arxiv.org/abs/2111.09883.pdf + Title: "Swin Transformer V2: Scaling Up Capacity and Resolution" + README: configs/swin_transformer_v2/README.md + +Models: + - Name: swinv2-tiny-w8_3rdparty_in1k-256px + Metadata: + FLOPs: 4350000000 + Parameters: 28350000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.76 + Top 5 Accuracy: 95.87 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-tiny-w8_3rdparty_in1k-256px_20220803-e318968f.pth + Config: configs/swin_transformer_v2/swinv2-tiny-w8_16xb64_in1k-256px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_tiny_patch4_window8_256.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-tiny-w16_3rdparty_in1k-256px + Metadata: + FLOPs: 4400000000 + Parameters: 28350000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.81 + Top 5 Accuracy: 96.23 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-tiny-w16_3rdparty_in1k-256px_20220803-9651cdd7.pth + Config: configs/swin_transformer_v2/swinv2-tiny-w16_16xb64_in1k-256px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_tiny_patch4_window16_256.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-small-w8_3rdparty_in1k-256px + Metadata: + FLOPs: 8450000000 + Parameters: 49730000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.74 + Top 5 Accuracy: 96.6 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-small-w8_3rdparty_in1k-256px_20220803-b01a4332.pth + Config: configs/swin_transformer_v2/swinv2-small-w8_16xb64_in1k-256px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_small_patch4_window8_256.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-small-w16_3rdparty_in1k-256px + Metadata: + FLOPs: 8570000000 + Parameters: 49730000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.13 + Top 5 Accuracy: 96.83 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-small-w16_3rdparty_in1k-256px_20220803-b707d206.pth + Config: configs/swin_transformer_v2/swinv2-small-w16_16xb64_in1k-256px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_small_patch4_window16_256.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-base-w8_3rdparty_in1k-256px + Metadata: + FLOPs: 14990000000 + Parameters: 87920000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.2 + Top 5 Accuracy: 96.86 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-base-w8_3rdparty_in1k-256px_20220803-8ff28f2b.pth + Config: configs/swin_transformer_v2/swinv2-base-w8_16xb64_in1k-256px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window8_256.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-base-w16_3rdparty_in1k-256px + Metadata: + FLOPs: 15140000000 + Parameters: 87920000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.6 + Top 5 Accuracy: 97.05 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-base-w16_3rdparty_in1k-256px_20220803-5a1886b7.pth + Config: configs/swin_transformer_v2/swinv2-base-w16_16xb64_in1k-256px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window16_256.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-base-w16_in21k-pre_3rdparty_in1k-256px + Metadata: + Training Data: ImageNet-21k + FLOPs: 15140000000 + Parameters: 87920000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 86.17 + Top 5 Accuracy: 97.88 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-base-w16_in21k-pre_3rdparty_in1k-256px_20220803-8d7aa8ad.pth + Config: configs/swin_transformer_v2/swinv2-base-w16_in21k-pre_16xb64_in1k-256px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window12to16_192to256_22kto1k_ft.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-base-w24_in21k-pre_3rdparty_in1k-384px + Metadata: + Training Data: ImageNet-21k + FLOPs: 34070000000 + Parameters: 87920000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 87.14 + Top 5 Accuracy: 98.23 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-base-w24_in21k-pre_3rdparty_in1k-384px_20220803-44eb70f8.pth + Config: configs/swin_transformer_v2/swinv2-base-w24_in21k-pre_16xb64_in1k-384px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window12to24_192to384_22kto1k_ft.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-large-w16_in21k-pre_3rdparty_in1k-256px + Metadata: + Training Data: ImageNet-21k + FLOPs: 33860000000 + Parameters: 196750000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 86.93 + Top 5 Accuracy: 98.06 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-large-w16_in21k-pre_3rdparty_in1k-256px_20220803-c40cbed7.pth + Config: configs/swin_transformer_v2/swinv2-large-w16_in21k-pre_16xb64_in1k-256px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_large_patch4_window12to16_192to256_22kto1k_ft.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-large-w24_in21k-pre_3rdparty_in1k-384px + Metadata: + Training Data: ImageNet-21k + FLOPs: 76200000000 + Parameters: 196750000 + In Collection: Swin-Transformer-V2 + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 87.59 + Top 5 Accuracy: 98.27 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/swinv2-large-w24_in21k-pre_3rdparty_in1k-384px_20220803-3b36c165.pth + Config: configs/swin_transformer_v2/swinv2-large-w24_in21k-pre_16xb64_in1k-384px.py + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_large_patch4_window12to24_192to384_22kto1k_ft.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-base-w12_3rdparty_in21k-192px + Metadata: + Training Data: ImageNet-21k + FLOPs: 8510000000 + Parameters: 87920000 + In Collections: Swin-Transformer-V2 + Results: null + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-base-w12_3rdparty_in21k-192px_20220803-f7dc9763.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window12_192_22k.pth + Code: https://github.com/microsoft/Swin-Transformer + - Name: swinv2-large-w12_3rdparty_in21k-192px + Metadata: + Training Data: ImageNet-21k + FLOPs: 19040000000 + Parameters: 196740000 + In Collections: Swin-Transformer-V2 + Results: null + Weights: https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-large-w12_3rdparty_in21k-192px_20220803-d9073fee.pth + Converted From: + Weights: https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_large_patch4_window12_192_22k.pth + Code: https://github.com/microsoft/Swin-Transformer diff --git a/configs/swin_transformer_v2/swinv2-base-w16_16xb64_in1k-256px.py b/configs/swin_transformer_v2/swinv2-base-w16_16xb64_in1k-256px.py new file mode 100644 index 0000000..5f375ee --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-base-w16_16xb64_in1k-256px.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_256.py', + '../_base_/datasets/imagenet_bs64_swin_256.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(window_size=[16, 16, 16, 8])) diff --git a/configs/swin_transformer_v2/swinv2-base-w16_in21k-pre_16xb64_in1k-256px.py b/configs/swin_transformer_v2/swinv2-base-w16_in21k-pre_16xb64_in1k-256px.py new file mode 100644 index 0000000..0725f9e --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-base-w16_in21k-pre_16xb64_in1k-256px.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_256.py', + '../_base_/datasets/imagenet_bs64_swin_256.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +model = dict( + type='ImageClassifier', + backbone=dict( + window_size=[16, 16, 16, 8], + drop_path_rate=0.2, + pretrained_window_sizes=[12, 12, 12, 6])) diff --git a/configs/swin_transformer_v2/swinv2-base-w24_in21k-pre_16xb64_in1k-384px.py b/configs/swin_transformer_v2/swinv2-base-w24_in21k-pre_16xb64_in1k-384px.py new file mode 100644 index 0000000..3dd4e5f --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-base-w24_in21k-pre_16xb64_in1k-384px.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_384.py', + '../_base_/datasets/imagenet_bs64_swin_384.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +model = dict( + type='ImageClassifier', + backbone=dict( + img_size=384, + window_size=[24, 24, 24, 12], + drop_path_rate=0.2, + pretrained_window_sizes=[12, 12, 12, 6])) diff --git a/configs/swin_transformer_v2/swinv2-base-w8_16xb64_in1k-256px.py b/configs/swin_transformer_v2/swinv2-base-w8_16xb64_in1k-256px.py new file mode 100644 index 0000000..23fc407 --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-base-w8_16xb64_in1k-256px.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_256.py', + '../_base_/datasets/imagenet_bs64_swin_256.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] diff --git a/configs/swin_transformer_v2/swinv2-large-w16_in21k-pre_16xb64_in1k-256px.py b/configs/swin_transformer_v2/swinv2-large-w16_in21k-pre_16xb64_in1k-256px.py new file mode 100644 index 0000000..62a2a29 --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-large-w16_in21k-pre_16xb64_in1k-256px.py @@ -0,0 +1,13 @@ +# Only for evaluation +_base_ = [ + '../_base_/models/swin_transformer_v2/large_256.py', + '../_base_/datasets/imagenet_bs64_swin_256.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +model = dict( + type='ImageClassifier', + backbone=dict( + window_size=[16, 16, 16, 8], pretrained_window_sizes=[12, 12, 12, 6]), +) diff --git a/configs/swin_transformer_v2/swinv2-large-w24_in21k-pre_16xb64_in1k-384px.py b/configs/swin_transformer_v2/swinv2-large-w24_in21k-pre_16xb64_in1k-384px.py new file mode 100644 index 0000000..d97d9b2 --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-large-w24_in21k-pre_16xb64_in1k-384px.py @@ -0,0 +1,15 @@ +# Only for evaluation +_base_ = [ + '../_base_/models/swin_transformer_v2/large_384.py', + '../_base_/datasets/imagenet_bs64_swin_384.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +model = dict( + type='ImageClassifier', + backbone=dict( + img_size=384, + window_size=[24, 24, 24, 12], + pretrained_window_sizes=[12, 12, 12, 6]), +) diff --git a/configs/swin_transformer_v2/swinv2-small-w16_16xb64_in1k-256px.py b/configs/swin_transformer_v2/swinv2-small-w16_16xb64_in1k-256px.py new file mode 100644 index 0000000..f87265d --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-small-w16_16xb64_in1k-256px.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/small_256.py', + '../_base_/datasets/imagenet_bs64_swin_256.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(window_size=[16, 16, 16, 8])) diff --git a/configs/swin_transformer_v2/swinv2-small-w8_16xb64_in1k-256px.py b/configs/swin_transformer_v2/swinv2-small-w8_16xb64_in1k-256px.py new file mode 100644 index 0000000..f1001f1 --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-small-w8_16xb64_in1k-256px.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/small_256.py', + '../_base_/datasets/imagenet_bs64_swin_256.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] diff --git a/configs/swin_transformer_v2/swinv2-tiny-w16_16xb64_in1k-256px.py b/configs/swin_transformer_v2/swinv2-tiny-w16_16xb64_in1k-256px.py new file mode 100644 index 0000000..7e1f290 --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-tiny-w16_16xb64_in1k-256px.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/tiny_256.py', + '../_base_/datasets/imagenet_bs64_swin_256.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(window_size=[16, 16, 16, 8])) diff --git a/configs/swin_transformer_v2/swinv2-tiny-w8_16xb64_in1k-256px.py b/configs/swin_transformer_v2/swinv2-tiny-w8_16xb64_in1k-256px.py new file mode 100644 index 0000000..2cdc9a2 --- /dev/null +++ b/configs/swin_transformer_v2/swinv2-tiny-w8_16xb64_in1k-256px.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/tiny_256.py', + '../_base_/datasets/imagenet_bs64_swin_256.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] diff --git a/configs/t2t_vit/README.md b/configs/t2t_vit/README.md new file mode 100644 index 0000000..1f80c25 --- /dev/null +++ b/configs/t2t_vit/README.md @@ -0,0 +1,36 @@ +# Tokens-to-Token ViT + +> [Tokens-to-Token ViT: Training Vision Transformers from Scratch on ImageNet](https://arxiv.org/abs/2101.11986) + + + +## Abstract + +Transformers, which are popular for language modeling, have been explored for solving vision tasks recently, e.g., the Vision Transformer (ViT) for image classification. The ViT model splits each image into a sequence of tokens with fixed length and then applies multiple Transformer layers to model their global relation for classification. However, ViT achieves inferior performance to CNNs when trained from scratch on a midsize dataset like ImageNet. We find it is because: 1) the simple tokenization of input images fails to model the important local structure such as edges and lines among neighboring pixels, leading to low training sample efficiency; 2) the redundant attention backbone design of ViT leads to limited feature richness for fixed computation budgets and limited training samples. To overcome such limitations, we propose a new Tokens-To-Token Vision Transformer (T2T-ViT), which incorporates 1) a layer-wise Tokens-to-Token (T2T) transformation to progressively structurize the image to tokens by recursively aggregating neighboring Tokens into one Token (Tokens-to-Token), such that local structure represented by surrounding tokens can be modeled and tokens length can be reduced; 2) an efficient backbone with a deep-narrow structure for vision transformer motivated by CNN architecture design after empirical study. Notably, T2T-ViT reduces the parameter count and MACs of vanilla ViT by half, while achieving more than 3.0% improvement when trained from scratch on ImageNet. It also outperforms ResNets and achieves comparable performance with MobileNets by directly training on ImageNet. For example, T2T-ViT with comparable size to ResNet50 (21.5M parameters) can achieve 83.3% top1 accuracy in image resolution 384×384 on ImageNet. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :----------: | :-------: | :------: | :-------: | :-------: | :-------------------------------------------------------------------------: | :----------------------------------------------------------------------------: | +| T2T-ViT_t-14 | 21.47 | 4.34 | 81.83 | 95.84 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-14_8xb64_in1k_20211220-f7378dd5.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-14_8xb64_in1k_20211220-f7378dd5.log.json) | +| T2T-ViT_t-19 | 39.08 | 7.80 | 82.63 | 96.18 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/t2t_vit/t2t-vit-t-19_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-19_8xb64_in1k_20211214-7f5e3aaf.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-19_8xb64_in1k_20211214-7f5e3aaf.log.json) | +| T2T-ViT_t-24 | 64.00 | 12.69 | 82.71 | 96.09 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/t2t_vit/t2t-vit-t-24_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-24_8xb64_in1k_20211214-b2a68ae3.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-24_8xb64_in1k_20211214-b2a68ae3.log.json) | + +*In consistent with the [official repo](https://github.com/yitu-opensource/T2T-ViT), we adopt the best checkpoints during training.* + +## Citation + +``` +@article{yuan2021tokens, + title={Tokens-to-token vit: Training vision transformers from scratch on imagenet}, + author={Yuan, Li and Chen, Yunpeng and Wang, Tao and Yu, Weihao and Shi, Yujun and Tay, Francis EH and Feng, Jiashi and Yan, Shuicheng}, + journal={arXiv preprint arXiv:2101.11986}, + year={2021} +} +``` diff --git a/configs/t2t_vit/metafile.yml b/configs/t2t_vit/metafile.yml new file mode 100644 index 0000000..f212542 --- /dev/null +++ b/configs/t2t_vit/metafile.yml @@ -0,0 +1,58 @@ +Collections: + - Name: Tokens-to-Token ViT + Metadata: + Training Data: ImageNet-1k + Architecture: + - Layer Normalization + - Scaled Dot-Product Attention + - Attention Dropout + - Dropout + - Tokens to Token + Paper: + URL: https://arxiv.org/abs/2101.11986 + Title: "Tokens-to-Token ViT: Training Vision Transformers from Scratch on ImageNet" + README: configs/t2t_vit/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.17.0/mmcls/models/backbones/t2t_vit.py + Version: v0.17.0 + +Models: + - Name: t2t-vit-t-14_8xb64_in1k + Metadata: + FLOPs: 4340000000 + Parameters: 21470000 + In Collection: Tokens-to-Token ViT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.83 + Top 5 Accuracy: 95.84 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-14_8xb64_in1k_20211220-f7378dd5.pth + Config: configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py + - Name: t2t-vit-t-19_8xb64_in1k + Metadata: + FLOPs: 7800000000 + Parameters: 39080000 + In Collection: Tokens-to-Token ViT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.63 + Top 5 Accuracy: 96.18 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-19_8xb64_in1k_20211214-7f5e3aaf.pth + Config: configs/t2t_vit/t2t-vit-t-19_8xb64_in1k.py + - Name: t2t-vit-t-24_8xb64_in1k + Metadata: + FLOPs: 12690000000 + Parameters: 64000000 + In Collection: Tokens-to-Token ViT + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.71 + Top 5 Accuracy: 96.09 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-24_8xb64_in1k_20211214-b2a68ae3.pth + Config: configs/t2t_vit/t2t-vit-t-24_8xb64_in1k.py diff --git a/configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py b/configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py new file mode 100644 index 0000000..a391df4 --- /dev/null +++ b/configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/t2t-vit-t-14.py', + '../_base_/datasets/imagenet_bs64_t2t_224.py', + '../_base_/default_runtime.py', +] + +# optimizer +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={'cls_token': dict(decay_mult=0.0)}, +) +optimizer = dict( + type='AdamW', + lr=5e-4, + weight_decay=0.05, + paramwise_cfg=paramwise_cfg, +) +optimizer_config = dict(grad_clip=None) + +# learning policy +# FIXME: lr in the first 300 epochs conforms to the CosineAnnealing and +# the lr in the last 10 epoch equals to min_lr +lr_config = dict( + policy='CosineAnnealingCooldown', + min_lr=1e-5, + cool_down_time=10, + cool_down_ratio=0.1, + by_epoch=True, + warmup_by_epoch=True, + warmup='linear', + warmup_iters=10, + warmup_ratio=1e-6) +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] +runner = dict(type='EpochBasedRunner', max_epochs=310) diff --git a/configs/t2t_vit/t2t-vit-t-19_8xb64_in1k.py b/configs/t2t_vit/t2t-vit-t-19_8xb64_in1k.py new file mode 100644 index 0000000..e1157f8 --- /dev/null +++ b/configs/t2t_vit/t2t-vit-t-19_8xb64_in1k.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/t2t-vit-t-19.py', + '../_base_/datasets/imagenet_bs64_t2t_224.py', + '../_base_/default_runtime.py', +] + +# optimizer +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={'cls_token': dict(decay_mult=0.0)}, +) +optimizer = dict( + type='AdamW', + lr=5e-4, + weight_decay=0.065, + paramwise_cfg=paramwise_cfg, +) +optimizer_config = dict(grad_clip=None) + +# learning policy +# FIXME: lr in the first 300 epochs conforms to the CosineAnnealing and +# the lr in the last 10 epoch equals to min_lr +lr_config = dict( + policy='CosineAnnealingCooldown', + min_lr=1e-5, + cool_down_time=10, + cool_down_ratio=0.1, + by_epoch=True, + warmup_by_epoch=True, + warmup='linear', + warmup_iters=10, + warmup_ratio=1e-6) +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] +runner = dict(type='EpochBasedRunner', max_epochs=310) diff --git a/configs/t2t_vit/t2t-vit-t-24_8xb64_in1k.py b/configs/t2t_vit/t2t-vit-t-24_8xb64_in1k.py new file mode 100644 index 0000000..815f2f1 --- /dev/null +++ b/configs/t2t_vit/t2t-vit-t-24_8xb64_in1k.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/t2t-vit-t-24.py', + '../_base_/datasets/imagenet_bs64_t2t_224.py', + '../_base_/default_runtime.py', +] + +# optimizer +paramwise_cfg = dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={'cls_token': dict(decay_mult=0.0)}, +) +optimizer = dict( + type='AdamW', + lr=5e-4, + weight_decay=0.065, + paramwise_cfg=paramwise_cfg, +) +optimizer_config = dict(grad_clip=None) + +# learning policy +# FIXME: lr in the first 300 epochs conforms to the CosineAnnealing and +# the lr in the last 10 epoch equals to min_lr +lr_config = dict( + policy='CosineAnnealingCooldown', + min_lr=1e-5, + cool_down_time=10, + cool_down_ratio=0.1, + by_epoch=True, + warmup_by_epoch=True, + warmup='linear', + warmup_iters=10, + warmup_ratio=1e-6) +custom_hooks = [dict(type='EMAHook', momentum=4e-5, priority='ABOVE_NORMAL')] +runner = dict(type='EpochBasedRunner', max_epochs=310) diff --git a/configs/tnt/README.md b/configs/tnt/README.md new file mode 100644 index 0000000..948eef7 --- /dev/null +++ b/configs/tnt/README.md @@ -0,0 +1,36 @@ +# TNT + +> [Transformer in Transformer](https://arxiv.org/abs/2103.00112) + + + +## Abstract + +Transformer is a new kind of neural architecture which encodes the input data as powerful features via the attention mechanism. Basically, the visual transformers first divide the input images into several local patches and then calculate both representations and their relationship. Since natural images are of high complexity with abundant detail and color information, the granularity of the patch dividing is not fine enough for excavating features of objects in different scales and locations. In this paper, we point out that the attention inside these local patches are also essential for building visual transformers with high performance and we explore a new architecture, namely, Transformer iN Transformer (TNT). Specifically, we regard the local patches (e.g., 16×16) as "visual sentences" and present to further divide them into smaller patches (e.g., 4×4) as "visual words". The attention of each word will be calculated with other words in the given visual sentence with negligible computational costs. Features of both words and sentences will be aggregated to enhance the representation ability. Experiments on several benchmarks demonstrate the effectiveness of the proposed TNT architecture, e.g., we achieve an 81.5% top-1 accuracy on the ImageNet, which is about 1.7% higher than that of the state-of-the-art visual transformer with similar computational cost. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :---------: | :-------: | :------: | :-------: | :-------: | :--------------------------------------------------------------------------: | :----------------------------------------------------------------------------: | +| TNT-small\* | 23.76 | 3.36 | 81.52 | 95.73 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/tnt/tnt-s-p16_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/tnt/tnt-small-p16_3rdparty_in1k_20210903-c56ee7df.pth) | + +*Models with * are converted from [timm](https://github.com/rwightman/pytorch-image-models/). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +``` +@misc{han2021transformer, + title={Transformer in Transformer}, + author={Kai Han and An Xiao and Enhua Wu and Jianyuan Guo and Chunjing Xu and Yunhe Wang}, + year={2021}, + eprint={2103.00112}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/tnt/metafile.yml b/configs/tnt/metafile.yml new file mode 100644 index 0000000..67f3c78 --- /dev/null +++ b/configs/tnt/metafile.yml @@ -0,0 +1,29 @@ +Collections: + - Name: Transformer in Transformer + Metadata: + Training Data: ImageNet-1k + Paper: + URL: https://arxiv.org/abs/2103.00112 + Title: "Transformer in Transformer" + README: configs/tnt/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/tnt.py#L203 + Version: v0.15.0 + +Models: + - Name: tnt-small-p16_3rdparty_in1k + Metadata: + FLOPs: 3360000000 + Parameters: 23760000 + In Collection: Transformer in Transformer + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.52 + Top 5 Accuracy: 95.73 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/tnt/tnt-small-p16_3rdparty_in1k_20210903-c56ee7df.pth + Config: configs/tnt/tnt-s-p16_16xb64_in1k.py + Converted From: + Weights: https://github.com/contrastive/pytorch-image-models/releases/download/TNT/tnt_s_patch16_224.pth.tar + Code: https://github.com/contrastive/pytorch-image-models/blob/809271b0f3e5d9be4e11c0c5cec1dbba8b5e2c60/timm/models/tnt.py#L144 diff --git a/configs/tnt/tnt-s-p16_16xb64_in1k.py b/configs/tnt/tnt-s-p16_16xb64_in1k.py new file mode 100644 index 0000000..3669368 --- /dev/null +++ b/configs/tnt/tnt-s-p16_16xb64_in1k.py @@ -0,0 +1,39 @@ +# accuracy_top-1 : 81.52 accuracy_top-5 : 95.73 +_base_ = [ + '../_base_/models/tnt_s_patch16_224.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/default_runtime.py' +] + +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(248, -1), + interpolation='bicubic', + backend='pillow'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +dataset_type = 'ImageNet' +data = dict( + samples_per_gpu=64, workers_per_gpu=4, test=dict(pipeline=test_pipeline)) + +# optimizer +optimizer = dict(type='AdamW', lr=1e-3, weight_decay=0.05) +optimizer_config = dict(grad_clip=None) + +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup_by_epoch=True, + warmup='linear', + warmup_iters=5, + warmup_ratio=1e-3) +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/configs/tnt/tnt_s_patch16_224_evalonly_imagenet.py b/configs/tnt/tnt_s_patch16_224_evalonly_imagenet.py new file mode 100644 index 0000000..3c054d4 --- /dev/null +++ b/configs/tnt/tnt_s_patch16_224_evalonly_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'tnt-s-p16_16xb64_in1k.py' + +_deprecation_ = dict( + expected='tnt-s-p16_16xb64_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/twins/README.md b/configs/twins/README.md new file mode 100644 index 0000000..87e7294 --- /dev/null +++ b/configs/twins/README.md @@ -0,0 +1,39 @@ +# Twins + +> [Twins: Revisiting the Design of Spatial Attention in Vision Transformers](http://arxiv-export-lb.library.cornell.edu/abs/2104.13840) + + + +## Abstract + +Very recently, a variety of vision transformer architectures for dense prediction tasks have been proposed and they show that the design of spatial attention is critical to their success in these tasks. In this work, we revisit the design of the spatial attention and demonstrate that a carefully-devised yet simple spatial attention mechanism performs favourably against the state-of-the-art schemes. As a result, we propose two vision transformer architectures, namely, Twins-PCPVT and Twins-SVT. Our proposed architectures are highly-efficient and easy to implement, only involving matrix multiplications that are highly optimized in modern deep learning frameworks. More importantly, the proposed architectures achieve excellent performance on a wide range of visual tasks, including image level classification as well as dense detection and segmentation. The simplicity and strong performance suggest that our proposed architectures may serve as stronger backbones for many vision tasks. Our code is released at [this https URL](https://github.com/Meituan-AutoML/Twins). + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------: | :-------: | :------: | :-------: | :-------: | :-------------------------------------------------------------------------: | :---------------------------------------------------------------------------: | +| PCPVT-small\* | 24.11 | 3.67 | 81.14 | 95.69 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-pcpvt-small_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-pcpvt-small_3rdparty_8xb128_in1k_20220126-ef23c132.pth) | +| PCPVT-base\* | 43.83 | 6.45 | 82.66 | 96.26 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-pcpvt-base_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-pcpvt-base_3rdparty_8xb128_in1k_20220126-f8c4b0d5.pth) | +| PCPVT-large\* | 60.99 | 9.51 | 83.09 | 96.59 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-pcpvt-large_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-pcpvt-large_3rdparty_16xb64_in1k_20220126-c1ef8d80.pth) | +| SVT-small\* | 24.06 | 2.82 | 81.77 | 95.57 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-svt-small_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-svt-small_3rdparty_8xb128_in1k_20220126-8fe5205b.pth) | +| SVT-base\* | 56.07 | 8.35 | 83.13 | 96.29 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-svt-base_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-svt-base_3rdparty_8xb128_in1k_20220126-e31cc8e9.pth) | +| SVT-large\* | 99.27 | 14.82 | 83.60 | 96.50 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-svt-large_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-svt-large_3rdparty_16xb64_in1k_20220126-4817645f.pth) | + +*Models with * are converted from [the official repo](https://github.com/Meituan-AutoML/Twins). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results. The validation accuracy is a little different from the official paper because of the PyTorch version. This result is get in PyTorch=1.9 while the official result is get in PyTorch=1.7* + +## Citation + +``` +@article{chu2021twins, + title={Twins: Revisiting spatial attention design in vision transformers}, + author={Chu, Xiangxiang and Tian, Zhi and Wang, Yuqing and Zhang, Bo and Ren, Haibing and Wei, Xiaolin and Xia, Huaxia and Shen, Chunhua}, + journal={arXiv preprint arXiv:2104.13840}, + year={2021}altgvt +} +``` diff --git a/configs/twins/metafile.yml b/configs/twins/metafile.yml new file mode 100644 index 0000000..f8a7d81 --- /dev/null +++ b/configs/twins/metafile.yml @@ -0,0 +1,114 @@ +Collections: + - Name: Twins + Metadata: + Training Data: ImageNet-1k + Architecture: + - Global Subsampled Attention + - Locally Grouped SelfAttention + - Conditional Position Encoding + - Pyramid Vision Transformer + Paper: + URL: http://arxiv-export-lb.library.cornell.edu/abs/2104.13840 + Title: "Twins: Revisiting the Design of Spatial Attention in Vision Transformers" + README: configs/twins/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/twins.py + Version: v0.20.1 + +Models: + - Name: twins-pcpvt-small_3rdparty_8xb128_in1k + Metadata: + FLOPs: 3670000000 # 3.67G + Parameters: 24110000 # 24.11M + In Collection: Twins + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.14 + Top 5 Accuracy: 95.69 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/twins/twins-pcpvt-small_3rdparty_8xb128_in1k_20220126-ef23c132.pth + Config: configs/twins/twins-pcpvt-small_8xb128_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vt3p-weights/twins_pcpvt_small-e70e7e7a.pth + Code: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/twins.py + - Name: twins-pcpvt-base_3rdparty_8xb128_in1k + Metadata: + FLOPs: 6450000000 # 6.45G + Parameters: 43830000 # 43.83M + In Collection: Twins + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.66 + Top 5 Accuracy: 96.26 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/twins/twins-pcpvt-base_3rdparty_8xb128_in1k_20220126-f8c4b0d5.pth + Config: configs/twins/twins-pcpvt-base_8xb128_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vt3p-weights/twins_pcpvt_small-e70e7e7a.pth + Code: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/twins.py + - Name: twins-pcpvt-large_3rdparty_16xb64_in1k + Metadata: + FLOPs: 9510000000 # 9.51G + Parameters: 60990000 # 60.99M + In Collection: Twins + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.09 + Top 5 Accuracy: 96.59 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/twins/twins-pcpvt-large_3rdparty_16xb64_in1k_20220126-c1ef8d80.pth + Config: configs/twins/twins-pcpvt-large_16xb64_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vt3p-weights/twins_pcpvt_small-e70e7e7a.pth + Code: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/twins.py + - Name: twins-svt-small_3rdparty_8xb128_in1k + Metadata: + FLOPs: 2820000000 # 2.82G + Parameters: 24060000 # 24.06M + In Collection: Twins + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.77 + Top 5 Accuracy: 95.57 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/twins/twins-svt-small_3rdparty_8xb128_in1k_20220126-8fe5205b.pth + Config: configs/twins/twins-svt-small_8xb128_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vt3p-weights/twins_pcpvt_small-e70e7e7a.pth + Code: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/twins.py + - Name: twins-svt-base_8xb128_3rdparty_in1k + Metadata: + FLOPs: 8350000000 # 8.35G + Parameters: 56070000 # 56.07M + In Collection: Twins + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.13 + Top 5 Accuracy: 96.29 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/twins/twins-svt-base_3rdparty_8xb128_in1k_20220126-e31cc8e9.pth + Config: configs/twins/twins-svt-base_8xb128_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vt3p-weights/twins_pcpvt_small-e70e7e7a.pth + Code: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/twins.py + - Name: twins-svt-large_3rdparty_16xb64_in1k + Metadata: + FLOPs: 14820000000 # 14.82G + Parameters: 99270000 # 99.27M + In Collection: Twins + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.60 + Top 5 Accuracy: 96.50 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/twins/twins-svt-large_3rdparty_16xb64_in1k_20220126-4817645f.pth + Config: configs/twins/twins-svt-large_16xb64_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vt3p-weights/twins_pcpvt_small-e70e7e7a.pth + Code: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/twins.py diff --git a/configs/twins/twins-pcpvt-base_8xb128_in1k.py b/configs/twins/twins-pcpvt-base_8xb128_in1k.py new file mode 100644 index 0000000..8ea9adc --- /dev/null +++ b/configs/twins/twins-pcpvt-base_8xb128_in1k.py @@ -0,0 +1,33 @@ +_base_ = [ + '../_base_/models/twins_pcpvt_base.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +data = dict(samples_per_gpu=128) + +paramwise_cfg = dict(_delete=True, norm_decay_mult=0.0, bias_decay_mult=0.0) + +# for batch in each gpu is 128, 8 gpu +# lr = 5e-4 * 128 * 8 / 512 = 0.001 +optimizer = dict( + type='AdamW', + lr=5e-4 * 128 * 8 / 512, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=paramwise_cfg) +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=5.0)) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + by_epoch=True, + min_lr_ratio=1e-2, + warmup='linear', + warmup_ratio=1e-3, + warmup_iters=5, + warmup_by_epoch=True) + +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/twins/twins-pcpvt-large_16xb64_in1k.py b/configs/twins/twins-pcpvt-large_16xb64_in1k.py new file mode 100644 index 0000000..e9c9a35 --- /dev/null +++ b/configs/twins/twins-pcpvt-large_16xb64_in1k.py @@ -0,0 +1,5 @@ +_base_ = ['twins-pcpvt-base_8xb128_in1k.py'] + +model = dict(backbone=dict(arch='large'), head=dict(in_channels=512)) + +data = dict(samples_per_gpu=64) diff --git a/configs/twins/twins-pcpvt-small_8xb128_in1k.py b/configs/twins/twins-pcpvt-small_8xb128_in1k.py new file mode 100644 index 0000000..cb8bdc3 --- /dev/null +++ b/configs/twins/twins-pcpvt-small_8xb128_in1k.py @@ -0,0 +1,3 @@ +_base_ = ['twins-pcpvt-base_8xb128_in1k.py'] + +model = dict(backbone=dict(arch='small'), head=dict(in_channels=512)) diff --git a/configs/twins/twins-svt-base_8xb128_in1k.py b/configs/twins/twins-svt-base_8xb128_in1k.py new file mode 100644 index 0000000..e2db230 --- /dev/null +++ b/configs/twins/twins-svt-base_8xb128_in1k.py @@ -0,0 +1,33 @@ +_base_ = [ + '../_base_/models/twins_svt_base.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +data = dict(samples_per_gpu=128) + +paramwise_cfg = dict(_delete=True, norm_decay_mult=0.0, bias_decay_mult=0.0) + +# for batch in each gpu is 128, 8 gpu +# lr = 5e-4 * 128 * 8 / 512 = 0.001 +optimizer = dict( + type='AdamW', + lr=5e-4 * 128 * 8 / 512, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=paramwise_cfg) +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=5.0)) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + by_epoch=True, + min_lr_ratio=1e-2, + warmup='linear', + warmup_ratio=1e-3, + warmup_iters=5, + warmup_by_epoch=True) + +evaluation = dict(interval=1, metric='accuracy') diff --git a/configs/twins/twins-svt-large_16xb64_in1k.py b/configs/twins/twins-svt-large_16xb64_in1k.py new file mode 100644 index 0000000..9288a70 --- /dev/null +++ b/configs/twins/twins-svt-large_16xb64_in1k.py @@ -0,0 +1,5 @@ +_base_ = ['twins-svt-base_8xb128_in1k.py'] + +data = dict(samples_per_gpu=64) + +model = dict(backbone=dict(arch='large'), head=dict(in_channels=1024)) diff --git a/configs/twins/twins-svt-small_8xb128_in1k.py b/configs/twins/twins-svt-small_8xb128_in1k.py new file mode 100644 index 0000000..b92f1d3 --- /dev/null +++ b/configs/twins/twins-svt-small_8xb128_in1k.py @@ -0,0 +1,3 @@ +_base_ = ['twins-svt-base_8xb128_in1k.py'] + +model = dict(backbone=dict(arch='small'), head=dict(in_channels=512)) diff --git a/configs/van/README.md b/configs/van/README.md new file mode 100644 index 0000000..a84cf32 --- /dev/null +++ b/configs/van/README.md @@ -0,0 +1,50 @@ +# Visual Attention Network + +> [Visual Attention Network](https://arxiv.org/pdf/2202.09741v2.pdf) + + + +## Abstract + +While originally designed for natural language processing (NLP) tasks, the self-attention mechanism has recently taken various computer vision areas by storm. However, the 2D nature of images brings three challenges for applying self-attention in computer vision. (1) Treating images as 1D sequences neglects their 2D structures. (2) The quadratic complexity is too expensive for high-resolution images. (3) It only captures spatial adaptability but ignores channel adaptability. In this paper, we propose a novel large kernel attention (LKA) module to enable self-adaptive and long-range correlations in self-attention while avoiding the above issues. We further introduce a novel neural network based on LKA, namely Visual Attention Network (VAN). While extremely simple and efficient, VAN outperforms the state-of-the-art vision transformers and convolutional neural networks with a large margin in extensive experiments, including image classification, object detection, semantic segmentation, instance segmentation, etc. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Pretrain | resolution | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :------: | :----------: | :--------: | :-------: | :------: | :-------: | :-------: | :----------------------------------------------------------------: | :-------------------------------------------------------------------: | +| VAN-B0\* | From scratch | 224x224 | 4.11 | 0.88 | 75.41 | 93.02 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/van/van-b0_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/van/van-tiny_8xb128_in1k_20220501-385941af.pth) | +| VAN-B1\* | From scratch | 224x224 | 13.86 | 2.52 | 81.01 | 95.63 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/van/van-b1_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/van/van-small_8xb128_in1k_20220501-17bc91aa.pth) | +| VAN-B2\* | From scratch | 224x224 | 26.58 | 5.03 | 82.80 | 96.21 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/van/van-b2_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/van/van-base_8xb128_in1k_20220501-6a4cc31b.pth) | +| VAN-B3\* | From scratch | 224x224 | 44.77 | 8.99 | 83.86 | 96.73 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/van/van-b3_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/van/van-large_8xb128_in1k_20220501-f212ba21.pth) | +| VAN-B4\* | From scratch | 224x224 | 60.28 | 12.22 | 84.13 | 96.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/van/van-b4_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/van/van-b4_3rdparty_in1k_20220909-f4665b92.pth) | + +\*Models with * are converted from [the official repo](https://github.com/Visual-Attention-Network/VAN-Classification). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results. + +### Pre-trained Models + +The pre-trained models on ImageNet-21k are used to fine-tune on the downstream tasks. + +| Model | Pretrain | resolution | Params(M) | Flops(G) | Download | +| :------: | :----------: | :--------: | :-------: | :------: | :---------------------------------------------------------------------------------------------------------: | +| VAN-B4\* | ImageNet-21k | 224x224 | 60.28 | 12.22 | [model](https://download.openmmlab.com/mmclassification/v0/van/van-b4_3rdparty_in21k_20220909-db926b18.pth) | +| VAN-B5\* | ImageNet-21k | 224x224 | 89.97 | 17.21 | [model](https://download.openmmlab.com/mmclassification/v0/van/van-b5_3rdparty_in21k_20220909-18e904e3.pth) | +| VAN-B6\* | ImageNet-21k | 224x224 | 283.9 | 55.28 | [model](https://download.openmmlab.com/mmclassification/v0/van/van-b6_3rdparty_in21k_20220909-96c2cb3a.pth) | + +\*Models with * are converted from [the official repo](https://github.com/Visual-Attention-Network/VAN-Classification). + +## Citation + +``` +@article{guo2022visual, + title={Visual Attention Network}, + author={Guo, Meng-Hao and Lu, Cheng-Ze and Liu, Zheng-Ning and Cheng, Ming-Ming and Hu, Shi-Min}, + journal={arXiv preprint arXiv:2202.09741}, + year={2022} +} +``` diff --git a/configs/van/metafile.yml b/configs/van/metafile.yml new file mode 100644 index 0000000..c32df84 --- /dev/null +++ b/configs/van/metafile.yml @@ -0,0 +1,84 @@ +Collections: + - Name: Visual-Attention-Network + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - AdamW + - Weight Decay + Architecture: + - Visual Attention Network + - LKA + Paper: + URL: https://arxiv.org/pdf/2202.09741v2.pdf + Title: "Visual Attention Network" + README: configs/van/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.23.0/mmcls/models/backbones/van.py + Version: v0.23.0 + +Models: + - Name: van-b0_3rdparty_in1k + Metadata: + FLOPs: 880000000 # 0.88G + Parameters: 4110000 # 4.11M + In Collection: Visual-Attention-Network + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 75.41 + Top 5 Accuracy: 93.02 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/van/van-tiny_8xb128_in1k_20220501-385941af.pth + Config: configs/van/van-b0_8xb128_in1k.py + - Name: van-b1_3rdparty_in1k + Metadata: + FLOPs: 2520000000 # 2.52G + Parameters: 13860000 # 13.86M + In Collection: Visual-Attention-Network + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.01 + Top 5 Accuracy: 95.63 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/van/van-small_8xb128_in1k_20220501-17bc91aa.pth + Config: configs/van/van-b1_8xb128_in1k.py + - Name: van-b2_3rdparty_in1k + Metadata: + FLOPs: 5030000000 # 5.03G + Parameters: 26580000 # 26.58M + In Collection: Visual-Attention-Network + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 82.80 + Top 5 Accuracy: 96.21 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/van/van-base_8xb128_in1k_20220501-6a4cc31b.pth + Config: configs/van/van-b2_8xb128_in1k.py + - Name: van-b3_3rdparty_in1k + Metadata: + FLOPs: 8990000000 # 8.99G + Parameters: 44770000 # 44.77M + In Collection: Visual-Attention-Network + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 83.86 + Top 5 Accuracy: 96.73 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/van/van-large_8xb128_in1k_20220501-f212ba21.pth + Config: configs/van/van-b3_8xb128_in1k.py + - Name: van-b4_3rdparty_in1k + Metadata: + FLOPs: 12220000000 # 12.22G + Parameters: 60280000 # 60.28M + In Collection: Visual-Attention-Network + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 84.13 + Top 5 Accuracy: 96.86 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/van/van-b4_3rdparty_in1k_20220909-f4665b92.pth + Config: configs/van/van-b4_8xb128_in1k.py diff --git a/configs/van/van-b0_8xb128_in1k.py b/configs/van/van-b0_8xb128_in1k.py new file mode 100644 index 0000000..1acb7af --- /dev/null +++ b/configs/van/van-b0_8xb128_in1k.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/models/van/van_b0.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# Note that the mean and variance used here are different from other configs +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(248, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + samples_per_gpu=128, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/van/van-b1_8xb128_in1k.py b/configs/van/van-b1_8xb128_in1k.py new file mode 100644 index 0000000..64483db --- /dev/null +++ b/configs/van/van-b1_8xb128_in1k.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/models/van/van_b1.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# Note that the mean and variance used here are different from other configs +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(248, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + samples_per_gpu=128, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/van/van-b2_8xb128_in1k.py b/configs/van/van-b2_8xb128_in1k.py new file mode 100644 index 0000000..88493dc --- /dev/null +++ b/configs/van/van-b2_8xb128_in1k.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/models/van/van_b2.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# Note that the mean and variance used here are different from other configs +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(248, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + samples_per_gpu=128, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/van/van-b3_8xb128_in1k.py b/configs/van/van-b3_8xb128_in1k.py new file mode 100644 index 0000000..6b415f6 --- /dev/null +++ b/configs/van/van-b3_8xb128_in1k.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/models/van/van_b3.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# Note that the mean and variance used here are different from other configs +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(248, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + samples_per_gpu=128, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/van/van-b4_8xb128_in1k.py b/configs/van/van-b4_8xb128_in1k.py new file mode 100644 index 0000000..ba8914f --- /dev/null +++ b/configs/van/van-b4_8xb128_in1k.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/models/van/van_b4.py', + '../_base_/datasets/imagenet_bs64_swin_224.py', + '../_base_/schedules/imagenet_bs1024_adamw_swin.py', + '../_base_/default_runtime.py' +] + +# Note that the mean and variance used here are different from other configs +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies={{_base_.rand_increasing_policies}}, + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + interpolation='bicubic')), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(248, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + samples_per_gpu=128, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/van/van-base_8xb128_in1k.py b/configs/van/van-base_8xb128_in1k.py new file mode 100644 index 0000000..e331980 --- /dev/null +++ b/configs/van/van-base_8xb128_in1k.py @@ -0,0 +1,6 @@ +_base_ = ['./van-b2_8xb128_in1k.py'] + +_deprecation_ = dict( + expected='van-b2_8xb128_in1k.p', + reference='https://github.com/open-mmlab/mmclassification/pull/1017', +) diff --git a/configs/van/van-large_8xb128_in1k.py b/configs/van/van-large_8xb128_in1k.py new file mode 100644 index 0000000..84f8c7e --- /dev/null +++ b/configs/van/van-large_8xb128_in1k.py @@ -0,0 +1,6 @@ +_base_ = ['./van-b3_8xb128_in1k.py'] + +_deprecation_ = dict( + expected='van-b3_8xb128_in1k.p', + reference='https://github.com/open-mmlab/mmclassification/pull/1017', +) diff --git a/configs/van/van-small_8xb128_in1k.py b/configs/van/van-small_8xb128_in1k.py new file mode 100644 index 0000000..75d3220 --- /dev/null +++ b/configs/van/van-small_8xb128_in1k.py @@ -0,0 +1,6 @@ +_base_ = ['./van-b1_8xb128_in1k.py'] + +_deprecation_ = dict( + expected='van-b1_8xb128_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/1017', +) diff --git a/configs/van/van-tiny_8xb128_in1k.py b/configs/van/van-tiny_8xb128_in1k.py new file mode 100644 index 0000000..9f83e77 --- /dev/null +++ b/configs/van/van-tiny_8xb128_in1k.py @@ -0,0 +1,6 @@ +_base_ = ['./van-b0_8xb128_in1k.py'] + +_deprecation_ = dict( + expected='van-b0_8xb128_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/1017', +) diff --git a/configs/vgg/README.md b/configs/vgg/README.md new file mode 100644 index 0000000..454489f --- /dev/null +++ b/configs/vgg/README.md @@ -0,0 +1,39 @@ +# VGG + +> [Very Deep Convolutional Networks for Large-Scale Image Recognition](https://arxiv.org/abs/1409.1556) + + + +## Abstract + +In this work we investigate the effect of the convolutional network depth on its accuracy in the large-scale image recognition setting. Our main contribution is a thorough evaluation of networks of increasing depth using an architecture with very small (3x3) convolution filters, which shows that a significant improvement on the prior-art configurations can be achieved by pushing the depth to 16-19 weight layers. These findings were the basis of our ImageNet Challenge 2014 submission, where our team secured the first and the second places in the localisation and classification tracks respectively. We also show that our representations generalise well to other datasets, where they achieve state-of-the-art results. We have made our two best-performing ConvNet models publicly available to facilitate further research on the use of deep visual representations in computer vision. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-------: | :-------: | :------: | :-------: | :-------: | :---------------------------------------------------------------------------: | :-----------------------------------------------------------------------------: | +| VGG-11 | 132.86 | 7.63 | 68.75 | 88.87 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg11_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_batch256_imagenet_20210208-4271cd6c.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_batch256_imagenet_20210208-4271cd6c.log.json) | +| VGG-13 | 133.05 | 11.34 | 70.02 | 89.46 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg13_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_batch256_imagenet_20210208-4d1d6080.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_batch256_imagenet_20210208-4d1d6080.log.json) | +| VGG-16 | 138.36 | 15.5 | 71.62 | 90.49 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg16_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_batch256_imagenet_20210208-db26f1a5.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_batch256_imagenet_20210208-db26f1a5.log.json) | +| VGG-19 | 143.67 | 19.67 | 72.41 | 90.80 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg19_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_batch256_imagenet_20210208-e6920e4a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_batch256_imagenet_20210208-e6920e4a.log.json) | +| VGG-11-BN | 132.87 | 7.64 | 70.67 | 90.16 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg11bn_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_bn_batch256_imagenet_20210207-f244902c.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_bn_batch256_imagenet_20210207-f244902c.log.json) | +| VGG-13-BN | 133.05 | 11.36 | 72.12 | 90.66 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg13bn_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_bn_batch256_imagenet_20210207-1a8b7864.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_bn_batch256_imagenet_20210207-1a8b7864.log.json) | +| VGG-16-BN | 138.37 | 15.53 | 73.74 | 91.66 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg16_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_bn_batch256_imagenet_20210208-7e55cd29.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_bn_batch256_imagenet_20210208-7e55cd29.log.json) | +| VGG-19-BN | 143.68 | 19.7 | 74.68 | 92.27 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg19bn_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_bn_batch256_imagenet_20210208-da620c4f.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_bn_batch256_imagenet_20210208-da620c4f.log.json) | + +## Citation + +``` +@article{simonyan2014very, + title={Very deep convolutional networks for large-scale image recognition}, + author={Simonyan, Karen and Zisserman, Andrew}, + journal={arXiv preprint arXiv:1409.1556}, + year={2014} +} +``` diff --git a/configs/vgg/metafile.yml b/configs/vgg/metafile.yml new file mode 100644 index 0000000..4410c95 --- /dev/null +++ b/configs/vgg/metafile.yml @@ -0,0 +1,125 @@ +Collections: + - Name: VGG + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x Xp GPUs + Epochs: 100 + Batch Size: 256 + Architecture: + - VGG + Paper: + URL: https://arxiv.org/abs/1409.1556 + Title: "Very Deep Convolutional Networks for Large-Scale Image" + README: configs/vgg/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.15.0/mmcls/models/backbones/vgg.py#L39 + Version: v0.15.0 + +Models: + - Name: vgg11_8xb32_in1k + Metadata: + FLOPs: 7630000000 + Parameters: 132860000 + In Collection: VGG + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 68.75 + Top 5 Accuracy: 88.87 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_batch256_imagenet_20210208-4271cd6c.pth + Config: configs/vgg/vgg11_8xb32_in1k.py + - Name: vgg13_8xb32_in1k + Metadata: + FLOPs: 11340000000 + Parameters: 133050000 + In Collection: VGG + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 70.02 + Top 5 Accuracy: 89.46 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_batch256_imagenet_20210208-4d1d6080.pth + Config: configs/vgg/vgg13_8xb32_in1k.py + - Name: vgg16_8xb32_in1k + Metadata: + FLOPs: 15500000000 + Parameters: 138360000 + In Collection: VGG + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 71.62 + Top 5 Accuracy: 90.49 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_batch256_imagenet_20210208-db26f1a5.pth + Config: configs/vgg/vgg16_8xb32_in1k.py + - Name: vgg19_8xb32_in1k + Metadata: + FLOPs: 19670000000 + Parameters: 143670000 + In Collection: VGG + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 72.41 + Top 5 Accuracy: 90.8 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_batch256_imagenet_20210208-e6920e4a.pth + Config: configs/vgg/vgg19_8xb32_in1k.py + - Name: vgg11bn_8xb32_in1k + Metadata: + FLOPs: 7640000000 + Parameters: 132870000 + In Collection: VGG + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 70.67 + Top 5 Accuracy: 90.16 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_bn_batch256_imagenet_20210207-f244902c.pth + Config: configs/vgg/vgg11bn_8xb32_in1k.py + - Name: vgg13bn_8xb32_in1k + Metadata: + FLOPs: 11360000000 + Parameters: 133050000 + In Collection: VGG + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 72.12 + Top 5 Accuracy: 90.66 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_bn_batch256_imagenet_20210207-1a8b7864.pth + Config: configs/vgg/vgg13bn_8xb32_in1k.py + - Name: vgg16bn_8xb32_in1k + Metadata: + FLOPs: 15530000000 + Parameters: 138370000 + In Collection: VGG + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 73.74 + Top 5 Accuracy: 91.66 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_bn_batch256_imagenet_20210208-7e55cd29.pth + Config: configs/vgg/vgg16bn_8xb32_in1k.py + - Name: vgg19bn_8xb32_in1k + Metadata: + FLOPs: 19700000000 + Parameters: 143680000 + In Collection: VGG + Results: + - Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 74.68 + Top 5 Accuracy: 92.27 + Task: Image Classification + Weights: https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_bn_batch256_imagenet_20210208-da620c4f.pth + Config: configs/vgg/vgg19bn_8xb32_in1k.py diff --git a/configs/vgg/vgg11_8xb32_in1k.py b/configs/vgg/vgg11_8xb32_in1k.py new file mode 100644 index 0000000..c5742bc --- /dev/null +++ b/configs/vgg/vgg11_8xb32_in1k.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/vgg11.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', + '../_base_/default_runtime.py', +] +optimizer = dict(lr=0.01) diff --git a/configs/vgg/vgg11_b32x8_imagenet.py b/configs/vgg/vgg11_b32x8_imagenet.py new file mode 100644 index 0000000..b15396b --- /dev/null +++ b/configs/vgg/vgg11_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'vgg11_8xb32_in1k.py' + +_deprecation_ = dict( + expected='vgg11_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/vgg/vgg11bn_8xb32_in1k.py b/configs/vgg/vgg11bn_8xb32_in1k.py new file mode 100644 index 0000000..4ead074 --- /dev/null +++ b/configs/vgg/vgg11bn_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/vgg11bn.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/vgg/vgg11bn_b32x8_imagenet.py b/configs/vgg/vgg11bn_b32x8_imagenet.py new file mode 100644 index 0000000..350c9be --- /dev/null +++ b/configs/vgg/vgg11bn_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'vgg11bn_8xb32_in1k.py' + +_deprecation_ = dict( + expected='vgg11bn_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/vgg/vgg13_8xb32_in1k.py b/configs/vgg/vgg13_8xb32_in1k.py new file mode 100644 index 0000000..50d26f3 --- /dev/null +++ b/configs/vgg/vgg13_8xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/vgg13.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] +optimizer = dict(lr=0.01) diff --git a/configs/vgg/vgg13_b32x8_imagenet.py b/configs/vgg/vgg13_b32x8_imagenet.py new file mode 100644 index 0000000..6198ca2 --- /dev/null +++ b/configs/vgg/vgg13_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'vgg13_8xb32_in1k.py' + +_deprecation_ = dict( + expected='vgg13_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/vgg/vgg13bn_8xb32_in1k.py b/configs/vgg/vgg13bn_8xb32_in1k.py new file mode 100644 index 0000000..8d22a81 --- /dev/null +++ b/configs/vgg/vgg13bn_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/vgg13bn.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/vgg/vgg13bn_b32x8_imagenet.py b/configs/vgg/vgg13bn_b32x8_imagenet.py new file mode 100644 index 0000000..0a715d7 --- /dev/null +++ b/configs/vgg/vgg13bn_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'vgg13bn_8xb32_in1k.py' + +_deprecation_ = dict( + expected='vgg13bn_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/vgg/vgg16_8xb16_voc.py b/configs/vgg/vgg16_8xb16_voc.py new file mode 100644 index 0000000..d096959 --- /dev/null +++ b/configs/vgg/vgg16_8xb16_voc.py @@ -0,0 +1,25 @@ +_base_ = ['../_base_/datasets/voc_bs16.py', '../_base_/default_runtime.py'] + +# use different head for multilabel task +model = dict( + type='ImageClassifier', + backbone=dict(type='VGG', depth=16, num_classes=20), + neck=None, + head=dict( + type='MultiLabelClsHead', + loss=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0))) + +# load model pretrained on imagenet +load_from = 'https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_batch256_imagenet_20210208-db26f1a5.pth' # noqa + +# optimizer +optimizer = dict( + type='SGD', + lr=0.001, + momentum=0.9, + weight_decay=0, + paramwise_cfg=dict(custom_keys={'.backbone.classifier': dict(lr_mult=10)})) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=20, gamma=0.1) +runner = dict(type='EpochBasedRunner', max_epochs=40) diff --git a/configs/vgg/vgg16_8xb32_in1k.py b/configs/vgg/vgg16_8xb32_in1k.py new file mode 100644 index 0000000..55cd9fc --- /dev/null +++ b/configs/vgg/vgg16_8xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/vgg16.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] +optimizer = dict(lr=0.01) diff --git a/configs/vgg/vgg16_b16x8_voc.py b/configs/vgg/vgg16_b16x8_voc.py new file mode 100644 index 0000000..06225e7 --- /dev/null +++ b/configs/vgg/vgg16_b16x8_voc.py @@ -0,0 +1,6 @@ +_base_ = 'vgg16_8xb16_voc.py' + +_deprecation_ = dict( + expected='vgg16_8xb16_voc.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/vgg/vgg16_b32x8_imagenet.py b/configs/vgg/vgg16_b32x8_imagenet.py new file mode 100644 index 0000000..2fefb94 --- /dev/null +++ b/configs/vgg/vgg16_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'vgg16_8xb32_in1k.py' + +_deprecation_ = dict( + expected='vgg16_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/vgg/vgg16bn_8xb32_in1k.py b/configs/vgg/vgg16bn_8xb32_in1k.py new file mode 100644 index 0000000..60674c7 --- /dev/null +++ b/configs/vgg/vgg16bn_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/vgg16bn.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/vgg/vgg16bn_b32x8_imagenet.py b/configs/vgg/vgg16bn_b32x8_imagenet.py new file mode 100644 index 0000000..cb21917 --- /dev/null +++ b/configs/vgg/vgg16bn_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'vgg16bn_8xb32_in1k.py' + +_deprecation_ = dict( + expected='vgg16bn_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/vgg/vgg19_8xb32_in1k.py b/configs/vgg/vgg19_8xb32_in1k.py new file mode 100644 index 0000000..6b033c9 --- /dev/null +++ b/configs/vgg/vgg19_8xb32_in1k.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/vgg19.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] +optimizer = dict(lr=0.01) diff --git a/configs/vgg/vgg19_b32x8_imagenet.py b/configs/vgg/vgg19_b32x8_imagenet.py new file mode 100644 index 0000000..e8b8b25 --- /dev/null +++ b/configs/vgg/vgg19_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'vgg19_8xb32_in1k.py' + +_deprecation_ = dict( + expected='vgg19_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/vgg/vgg19bn_8xb32_in1k.py b/configs/vgg/vgg19bn_8xb32_in1k.py new file mode 100644 index 0000000..18a1897 --- /dev/null +++ b/configs/vgg/vgg19bn_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/vgg19bn.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/vgg/vgg19bn_b32x8_imagenet.py b/configs/vgg/vgg19bn_b32x8_imagenet.py new file mode 100644 index 0000000..f615496 --- /dev/null +++ b/configs/vgg/vgg19bn_b32x8_imagenet.py @@ -0,0 +1,6 @@ +_base_ = 'vgg19bn_8xb32_in1k.py' + +_deprecation_ = dict( + expected='vgg19bn_8xb32_in1k.py', + reference='https://github.com/open-mmlab/mmclassification/pull/508', +) diff --git a/configs/vision_transformer/README.md b/configs/vision_transformer/README.md new file mode 100644 index 0000000..c35c242 --- /dev/null +++ b/configs/vision_transformer/README.md @@ -0,0 +1,57 @@ +# Vision Transformer + +> [An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale](https://arxiv.org/pdf/2010.11929.pdf) + + + +## Abstract + +While the Transformer architecture has become the de-facto standard for natural language processing tasks, its applications to computer vision remain limited. In vision, attention is either applied in conjunction with convolutional networks, or used to replace certain components of convolutional networks while keeping their overall structure in place. We show that this reliance on CNNs is not necessary and a pure transformer applied directly to sequences of image patches can perform very well on image classification tasks. When pre-trained on large amounts of data and transferred to multiple mid-sized or small image recognition benchmarks (ImageNet, CIFAR-100, VTAB, etc.), Vision Transformer (ViT) attains excellent results compared to state-of-the-art convolutional networks while requiring substantially fewer computational resources to train. + +
+ +
+ +## Results and models + +The training step of Vision Transformers is divided into two steps. The first +step is training the model on a large dataset, like ImageNet-21k, and get the +pre-trained model. And the second step is training the model on the target +dataset, like ImageNet-1k, and get the fine-tuned model. Here, we provide both +pre-trained models and fine-tuned models. + +### ImageNet-21k + +The pre-trained models on ImageNet-21k are used to fine-tune, and therefore don't have evaluation results. + +| Model | resolution | Params(M) | Flops(G) | Download | +| :-------: | :--------: | :-------: | :------: | :--------------------------------------------------------------------------------------------------------------------------------------: | +| ViT-B16\* | 224x224 | 86.86 | 33.03 | [model](https://download.openmmlab.com/mmclassification/v0/vit/pretrain/vit-base-p16_3rdparty_pt-64xb64_in1k-224_20210928-02284250.pth) | +| ViT-B32\* | 224x224 | 88.30 | 8.56 | [model](https://download.openmmlab.com/mmclassification/v0/vit/pretrain/vit-base-p32_3rdparty_pt-64xb64_in1k-224_20210928-eee25dd4.pth) | +| ViT-L16\* | 224x224 | 304.72 | 116.68 | [model](https://download.openmmlab.com/mmclassification/v0/vit/pretrain/vit-large-p16_3rdparty_pt-64xb64_in1k-224_20210928-0001f9a1.pth) | + +*Models with * are converted from the [official repo](https://github.com/google-research/vision_transformer#available-vit-models).* + +### ImageNet-1k + +| Model | Pretrain | resolution | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-----------: | :----------: | :--------: | :-------: | :------: | :-------: | :-------: | :--------------------------------------------------------------: | :----------------------------------------------------------------: | +| ViT-B16\* | ImageNet-21k | 384x384 | 86.86 | 33.03 | 85.43 | 97.77 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vision_transformer/vit-base-p16_ft-64xb64_in1k-384.py) | [model](https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-base-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-98e8652b.pth) | +| ViT-B32\* | ImageNet-21k | 384x384 | 88.30 | 8.56 | 84.01 | 97.08 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vision_transformer/vit-base-p32_ft-64xb64_in1k-384.py) | [model](https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-base-p32_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-9cea8599.pth) | +| ViT-L16\* | ImageNet-21k | 384x384 | 304.72 | 116.68 | 85.63 | 97.63 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vision_transformer/vit-large-p16_ft-64xb64_in1k-384.py) | [model](https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-large-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-b20ba619.pth) | +| ViT-B16 (IPU) | ImageNet-21k | 224x224 | 86.86 | 33.03 | 81.22 | 95.56 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vision_transformer/vit-base-p16_ft-4xb544-ipu_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vit/vit-base-p16_ft-4xb544-ipu_in1k_20220603-c215811a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vit/vit-base-p16_ft-4xb544-ipu_in1k.log) | + +*Models with * are converted from the [official repo](https://github.com/google-research/vision_transformer#available-vit-models). The config files of these models are only for validation. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +``` +@inproceedings{ + dosovitskiy2021an, + title={An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale}, + author={Alexey Dosovitskiy and Lucas Beyer and Alexander Kolesnikov and Dirk Weissenborn and Xiaohua Zhai and Thomas Unterthiner and Mostafa Dehghani and Matthias Minderer and Georg Heigold and Sylvain Gelly and Jakob Uszkoreit and Neil Houlsby}, + booktitle={International Conference on Learning Representations}, + year={2021}, + url={https://openreview.net/forum?id=YicbFdNTTy} +} +``` diff --git a/configs/vision_transformer/metafile.yml b/configs/vision_transformer/metafile.yml new file mode 100644 index 0000000..9ac8046 --- /dev/null +++ b/configs/vision_transformer/metafile.yml @@ -0,0 +1,79 @@ +Collections: + - Name: Vision Transformer + Metadata: + Architecture: + - Attention Dropout + - Convolution + - Dense Connections + - Dropout + - GELU + - Layer Normalization + - Multi-Head Attention + - Scaled Dot-Product Attention + - Tanh Activation + Paper: + URL: https://arxiv.org/pdf/2010.11929.pdf + Title: 'An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale' + README: configs/vision_transformer/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.17.0/mmcls/models/backbones/vision_transformer.py + Version: v0.17.0 + +Models: + - Name: vit-base-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384 + In Collection: Vision Transformer + Metadata: + FLOPs: 33030000000 + Parameters: 86860000 + Training Data: + - ImageNet-21k + - ImageNet-1k + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 85.43 + Top 5 Accuracy: 97.77 + Weights: https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-base-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-98e8652b.pth + Converted From: + Weights: https://console.cloud.google.com/storage/browser/_details/vit_models/augreg/B_16-i21k-300ep-lr_0.001-aug_medium1-wd_0.1-do_0.0-sd_0.0--imagenet2012-steps_20k-lr_0.03-res_384.npz + Code: https://github.com/google-research/vision_transformer/blob/88a52f8892c80c10de99194990a517b4d80485fd/vit_jax/models.py#L208 + Config: configs/vision_transformer/vit-base-p16_ft-64xb64_in1k-384.py + - Name: vit-base-p32_in21k-pre-3rdparty_ft-64xb64_in1k-384 + In Collection: Vision Transformer + Metadata: + FLOPs: 8560000000 + Parameters: 88300000 + Training Data: + - ImageNet-21k + - ImageNet-1k + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 84.01 + Top 5 Accuracy: 97.08 + Weights: https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-base-p32_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-9cea8599.pth + Converted From: + Weights: https://console.cloud.google.com/storage/browser/_details/vit_models/augreg/B_32-i21k-300ep-lr_0.001-aug_light1-wd_0.1-do_0.0-sd_0.0--imagenet2012-steps_20k-lr_0.01-res_384.npz + Code: https://github.com/google-research/vision_transformer/blob/88a52f8892c80c10de99194990a517b4d80485fd/vit_jax/models.py#L208 + Config: configs/vision_transformer/vit-base-p32_ft-64xb64_in1k-384.py + - Name: vit-large-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384 + In Collection: Vision Transformer + Metadata: + FLOPs: 116680000000 + Parameters: 304720000 + Training Data: + - ImageNet-21k + - ImageNet-1k + Results: + - Dataset: ImageNet-1k + Task: Image Classification + Metrics: + Top 1 Accuracy: 85.63 + Top 5 Accuracy: 97.63 + Weights: https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-large-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-b20ba619.pth + Converted From: + Weights: https://console.cloud.google.com/storage/browser/_details/vit_models/augreg/L_16-i21k-300ep-lr_0.001-aug_strong1-wd_0.1-do_0.0-sd_0.0--imagenet2012-steps_20k-lr_0.01-res_384.npz + Code: https://github.com/google-research/vision_transformer/blob/88a52f8892c80c10de99194990a517b4d80485fd/vit_jax/models.py#L208 + Config: configs/vision_transformer/vit-large-p16_ft-64xb64_in1k-384.py diff --git a/configs/vision_transformer/vit-base-p16_ft-4xb544-ipu_in1k.py b/configs/vision_transformer/vit-base-p16_ft-4xb544-ipu_in1k.py new file mode 100644 index 0000000..097d8d6 --- /dev/null +++ b/configs/vision_transformer/vit-base-p16_ft-4xb544-ipu_in1k.py @@ -0,0 +1,115 @@ +_base_ = [ + '../_base_/models/vit-base-p16.py', + '../_base_/datasets/imagenet_bs64_pil_resize_autoaug.py', + '../_base_/default_runtime.py' +] + +# specific to vit pretrain +paramwise_cfg = dict(custom_keys={ + '.cls_token': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0) +}) + +pretrained = 'https://download.openmmlab.com/mmclassification/v0/vit/pretrain/vit-base-p16_3rdparty_pt-64xb64_in1k-224_20210928-02284250.pth' # noqa + +model = dict( + head=dict( + loss=dict(type='CrossEntropyLoss', loss_weight=1.0, _delete_=True), ), + backbone=dict( + img_size=224, + init_cfg=dict( + type='Pretrained', + checkpoint=pretrained, + _delete_=True, + prefix='backbone'))) + +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224, backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='ToHalf', keys=['img']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(224, -1), backend='pillow'), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToHalf', keys=['img']), + dict(type='Collect', keys=['img']) +] + +# change batch size +data = dict( + samples_per_gpu=17, + workers_per_gpu=16, + drop_last=True, + train=dict(pipeline=train_pipeline), + train_dataloader=dict(mode='async'), + val=dict(pipeline=test_pipeline, ), + val_dataloader=dict(samples_per_gpu=4, workers_per_gpu=1), + test=dict(pipeline=test_pipeline), + test_dataloader=dict(samples_per_gpu=4, workers_per_gpu=1)) + +# remove clip-norm +optimizer_config = dict() + +# optimizer +optimizer = dict( + type='SGD', + lr=0.08, + weight_decay=1e-5, + momentum=0.9, + paramwise_cfg=paramwise_cfg, +) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + warmup_iters=800, + warmup_ratio=0.02, +) + +# ipu cfg +# model partition config +ipu_model_cfg = dict( + train_split_edges=[ + dict(layer_to_call='backbone.patch_embed', ipu_id=0), + dict(layer_to_call='backbone.layers.3', ipu_id=1), + dict(layer_to_call='backbone.layers.6', ipu_id=2), + dict(layer_to_call='backbone.layers.9', ipu_id=3) + ], + train_ckpt_nodes=['backbone.layers.{}'.format(i) for i in range(12)]) + +# device config +options_cfg = dict( + randomSeed=42, + partialsType='half', + train_cfg=dict( + executionStrategy='SameAsIpu', + Training=dict(gradientAccumulation=32), + availableMemoryProportion=[0.3, 0.3, 0.3, 0.3], + ), + eval_cfg=dict(deviceIterations=1, ), +) + +# add model partition config and device config to runner +runner = dict( + type='IterBasedRunner', + ipu_model_cfg=ipu_model_cfg, + options_cfg=options_cfg, + max_iters=5000) + +checkpoint_config = dict(interval=1000) + +fp16 = dict(loss_scale=256.0, velocity_accum_type='half', accum_type='half') diff --git a/configs/vision_transformer/vit-base-p16_ft-64xb64_in1k-384.py b/configs/vision_transformer/vit-base-p16_ft-64xb64_in1k-384.py new file mode 100644 index 0000000..cb42d0d --- /dev/null +++ b/configs/vision_transformer/vit-base-p16_ft-64xb64_in1k-384.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/vit-base-p16.py', + '../_base_/datasets/imagenet_bs64_pil_resize_autoaug.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(img_size=384)) + +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=384, backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(384, -1), backend='pillow'), + dict(type='CenterCrop', crop_size=384), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) diff --git a/configs/vision_transformer/vit-base-p16_pt-64xb64_in1k-224.py b/configs/vision_transformer/vit-base-p16_pt-64xb64_in1k-224.py new file mode 100644 index 0000000..79c323b --- /dev/null +++ b/configs/vision_transformer/vit-base-p16_pt-64xb64_in1k-224.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/vit-base-p16.py', + '../_base_/datasets/imagenet_bs64_pil_resize_autoaug.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +model = dict( + head=dict(hidden_dim=3072), + train_cfg=dict( + augments=dict(type='BatchMixup', alpha=0.2, num_classes=1000, + prob=1.))) diff --git a/configs/vision_transformer/vit-base-p32_ft-64xb64_in1k-384.py b/configs/vision_transformer/vit-base-p32_ft-64xb64_in1k-384.py new file mode 100644 index 0000000..0386fef --- /dev/null +++ b/configs/vision_transformer/vit-base-p32_ft-64xb64_in1k-384.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/vit-base-p32.py', + '../_base_/datasets/imagenet_bs64_pil_resize_autoaug.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(img_size=384)) + +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=384, backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(384, -1), backend='pillow'), + dict(type='CenterCrop', crop_size=384), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) diff --git a/configs/vision_transformer/vit-base-p32_pt-64xb64_in1k-224.py b/configs/vision_transformer/vit-base-p32_pt-64xb64_in1k-224.py new file mode 100644 index 0000000..a477e21 --- /dev/null +++ b/configs/vision_transformer/vit-base-p32_pt-64xb64_in1k-224.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/vit-base-p32.py', + '../_base_/datasets/imagenet_bs64_pil_resize_autoaug.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +model = dict( + head=dict(hidden_dim=3072), + train_cfg=dict( + augments=dict(type='BatchMixup', alpha=0.2, num_classes=1000, + prob=1.))) diff --git a/configs/vision_transformer/vit-large-p16_ft-64xb64_in1k-384.py b/configs/vision_transformer/vit-large-p16_ft-64xb64_in1k-384.py new file mode 100644 index 0000000..5be9918 --- /dev/null +++ b/configs/vision_transformer/vit-large-p16_ft-64xb64_in1k-384.py @@ -0,0 +1,36 @@ +_base_ = [ + '../_base_/models/vit-large-p16.py', + '../_base_/datasets/imagenet_bs64_pil_resize_autoaug.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(img_size=384)) + +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=384, backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(384, -1), backend='pillow'), + dict(type='CenterCrop', crop_size=384), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) diff --git a/configs/vision_transformer/vit-large-p16_pt-64xb64_in1k-224.py b/configs/vision_transformer/vit-large-p16_pt-64xb64_in1k-224.py new file mode 100644 index 0000000..5cf7a7d --- /dev/null +++ b/configs/vision_transformer/vit-large-p16_pt-64xb64_in1k-224.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/vit-large-p16.py', + '../_base_/datasets/imagenet_bs64_pil_resize_autoaug.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +model = dict( + head=dict(hidden_dim=3072), + train_cfg=dict( + augments=dict(type='BatchMixup', alpha=0.2, num_classes=1000, + prob=1.))) diff --git a/configs/vision_transformer/vit-large-p32_ft-64xb64_in1k-384.py b/configs/vision_transformer/vit-large-p32_ft-64xb64_in1k-384.py new file mode 100644 index 0000000..60506b0 --- /dev/null +++ b/configs/vision_transformer/vit-large-p32_ft-64xb64_in1k-384.py @@ -0,0 +1,37 @@ +# Refer to pytorch-image-models +_base_ = [ + '../_base_/models/vit-large-p32.py', + '../_base_/datasets/imagenet_bs64_pil_resize_autoaug.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(img_size=384)) + +img_norm_cfg = dict( + mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=384, backend='pillow'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(384, -1), backend='pillow'), + dict(type='CenterCrop', crop_size=384), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) diff --git a/configs/vision_transformer/vit-large-p32_pt-64xb64_in1k-224.py b/configs/vision_transformer/vit-large-p32_pt-64xb64_in1k-224.py new file mode 100644 index 0000000..773ade8 --- /dev/null +++ b/configs/vision_transformer/vit-large-p32_pt-64xb64_in1k-224.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/vit-large-p32.py', + '../_base_/datasets/imagenet_bs64_pil_resize_autoaug.py', + '../_base_/schedules/imagenet_bs4096_AdamW.py', + '../_base_/default_runtime.py' +] + +model = dict( + head=dict(hidden_dim=3072), + train_cfg=dict( + augments=dict(type='BatchMixup', alpha=0.2, num_classes=1000, + prob=1.))) diff --git a/configs/wrn/README.md b/configs/wrn/README.md new file mode 100644 index 0000000..b036caa --- /dev/null +++ b/configs/wrn/README.md @@ -0,0 +1,35 @@ +# Wide-ResNet + +> [Wide Residual Networks](https://arxiv.org/abs/1605.07146) + + + +## Abstract + +Deep residual networks were shown to be able to scale up to thousands of layers and still have improving performance. However, each fraction of a percent of improved accuracy costs nearly doubling the number of layers, and so training very deep residual networks has a problem of diminishing feature reuse, which makes these networks very slow to train. To tackle these problems, in this paper we conduct a detailed experimental study on the architecture of ResNet blocks, based on which we propose a novel architecture where we decrease depth and increase width of residual networks. We call the resulting network structures wide residual networks (WRNs) and show that these are far superior over their commonly used thin and very deep counterparts. For example, we demonstrate that even a simple 16-layer-deep wide residual network outperforms in accuracy and efficiency all previous deep residual networks, including thousand-layer-deep networks, achieving new state-of-the-art results on CIFAR, SVHN, COCO, and significant improvements on ImageNet. + +
+ +
+ +## Results and models + +### ImageNet-1k + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :-------------: | :-------: | :------: | :-------: | :-------: | :------------------------------------------------------------------------: | :--------------------------------------------------------------------------: | +| WRN-50\* | 68.88 | 11.44 | 78.48 | 94.08 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/wrn/wide-resnet50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/wrn/wide-resnet50_3rdparty_8xb32_in1k_20220304-66678344.pth) | +| WRN-101\* | 126.89 | 22.81 | 78.84 | 94.28 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/wrn/wide-resnet101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/wrn/wide-resnet101_3rdparty_8xb32_in1k_20220304-8d5f9d61.pth) | +| WRN-50 (timm)\* | 68.88 | 11.44 | 81.45 | 95.53 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/wrn/wide-resnet50_timm_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/wrn/wide-resnet50_3rdparty-timm_8xb32_in1k_20220304-83ae4399.pth) | + +*Models with * are converted from the [TorchVision](https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py) and [TIMM](https://github.com/rwightman/pytorch-image-models/blob/master). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +## Citation + +```bibtex +@INPROCEEDINGS{Zagoruyko2016WRN, + author = {Sergey Zagoruyko and Nikos Komodakis}, + title = {Wide Residual Networks}, + booktitle = {BMVC}, + year = {2016}} +``` diff --git a/configs/wrn/metafile.yml b/configs/wrn/metafile.yml new file mode 100644 index 0000000..cc37eef --- /dev/null +++ b/configs/wrn/metafile.yml @@ -0,0 +1,77 @@ +Collections: + - Name: Wide-ResNet + Metadata: + Training Data: ImageNet-1k + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Epochs: 100 + Batch Size: 256 + Architecture: + - 1x1 Convolution + - Batch Normalization + - Convolution + - Global Average Pooling + - Max Pooling + - ReLU + - Residual Connection + - Softmax + - Wide Residual Block + Paper: + URL: https://arxiv.org/abs/1605.07146 + Title: "Wide Residual Networks" + README: configs/wrn/README.md + Code: + URL: https://github.com/open-mmlab/mmclassification/blob/v0.20.1/mmcls/models/backbones/resnet.py#L383 + Version: v0.20.1 + +Models: + - Name: wide-resnet50_3rdparty_8xb32_in1k + Metadata: + FLOPs: 11440000000 # 11.44G + Parameters: 68880000 # 68.88M + In Collection: Wide-ResNet + Results: + - Task: Image Classification + Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.48 + Top 5 Accuracy: 94.08 + Weights: https://download.openmmlab.com/mmclassification/v0/wrn/wide-resnet50_3rdparty_8xb32_in1k_20220304-66678344.pth + Config: configs/wrn/wide-resnet50_8xb32_in1k.py + Converted From: + Weights: https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth + Code: https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py + - Name: wide-resnet101_3rdparty_8xb32_in1k + Metadata: + FLOPs: 22810000000 # 22.81G + Parameters: 126890000 # 126.89M + In Collection: Wide-ResNet + Results: + - Task: Image Classification + Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 78.84 + Top 5 Accuracy: 94.28 + Weights: https://download.openmmlab.com/mmclassification/v0/wrn/wide-resnet101_3rdparty_8xb32_in1k_20220304-8d5f9d61.pth + Config: configs/wrn/wide-resnet101_8xb32_in1k.py + Converted From: + Weights: https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth + Code: https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py + - Name: wide-resnet50_3rdparty-timm_8xb32_in1k + Metadata: + FLOPs: 11440000000 # 11.44G + Parameters: 68880000 # 68.88M + In Collection: Wide-ResNet + Results: + - Task: Image Classification + Dataset: ImageNet-1k + Metrics: + Top 1 Accuracy: 81.45 + Top 5 Accuracy: 95.53 + Weights: https://download.openmmlab.com/mmclassification/v0/wrn/wide-resnet50_3rdparty-timm_8xb32_in1k_20220304-83ae4399.pth + Config: configs/wrn/wide-resnet50_timm_8xb32_in1k.py + Converted From: + Weights: https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/wide_resnet50_racm-8234f177.pth + Code: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/resnet.py diff --git a/configs/wrn/wide-resnet101_8xb32_in1k.py b/configs/wrn/wide-resnet101_8xb32_in1k.py new file mode 100644 index 0000000..d1bf5e5 --- /dev/null +++ b/configs/wrn/wide-resnet101_8xb32_in1k.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/wide-resnet50.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] + +model = dict(backbone=dict(depth=101)) diff --git a/configs/wrn/wide-resnet50_8xb32_in1k.py b/configs/wrn/wide-resnet50_8xb32_in1k.py new file mode 100644 index 0000000..edf6a05 --- /dev/null +++ b/configs/wrn/wide-resnet50_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/wide-resnet50.py', + '../_base_/datasets/imagenet_bs32_pil_resize.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/configs/wrn/wide-resnet50_timm_8xb32_in1k.py b/configs/wrn/wide-resnet50_timm_8xb32_in1k.py new file mode 100644 index 0000000..8dca8f3 --- /dev/null +++ b/configs/wrn/wide-resnet50_timm_8xb32_in1k.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/wide-resnet50.py', + '../_base_/datasets/imagenet_bs32_pil_bicubic.py', + '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py' +] diff --git a/docs/en/Makefile b/docs/en/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/docs/en/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/en/_static/css/readthedocs.css b/docs/en/_static/css/readthedocs.css new file mode 100644 index 0000000..577a67a --- /dev/null +++ b/docs/en/_static/css/readthedocs.css @@ -0,0 +1,27 @@ +.header-logo { + background-image: url("../image/mmcls-logo.png"); + background-size: 204px 40px; + height: 40px; + width: 204px; +} + +pre { + white-space: pre; +} + +article.pytorch-article section code { + padding: .2em .4em; + background-color: #f3f4f7; + border-radius: 5px; +} + +/* Disable the change in tables */ +article.pytorch-article section table code { + padding: unset; + background-color: unset; + border-radius: unset; +} + +table.autosummary td { + width: 50% +} diff --git a/docs/en/_static/image/mmcls-logo.png b/docs/en/_static/image/mmcls-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6e65420ab9b63bc8080d1156372e6822e0efe15a GIT binary patch literal 33009 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

qg0|u#M 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 literal 0 HcmV?d00001 diff --git a/docs/en/_static/image/tools/visualization/lr_schedule1.png b/docs/en/_static/image/tools/visualization/lr_schedule1.png new file mode 100644 index 0000000000000000000000000000000000000000..31fca35bb525280af6f83b755aef3f2495f07ed2 GIT binary patch literal 30065 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 JE;56U{Rxs2h5P^j literal 0 HcmV?d00001 diff --git a/docs/en/_static/js/custom.js b/docs/en/_static/js/custom.js new file mode 100644 index 0000000..44a4057 --- /dev/null +++ b/docs/en/_static/js/custom.js @@ -0,0 +1 @@ +var collapsedSections = ['Model zoo']; diff --git a/docs/en/_templates/classtemplate.rst b/docs/en/_templates/classtemplate.rst new file mode 100644 index 0000000..4f74842 --- /dev/null +++ b/docs/en/_templates/classtemplate.rst @@ -0,0 +1,14 @@ +.. role:: hidden + :class: hidden-section +.. currentmodule:: {{ module }} + + +{{ name | underline}} + +.. autoclass:: {{ name }} + :members: + + +.. + autogenerated from source/_templates/classtemplate.rst + note it does not have :inherited-members: diff --git a/docs/en/api/apis.rst b/docs/en/api/apis.rst new file mode 100644 index 0000000..67e05b9 --- /dev/null +++ b/docs/en/api/apis.rst @@ -0,0 +1,45 @@ +.. role:: hidden + :class: hidden-section + +mmcls.apis +=================================== + +These are some high-level APIs for classification tasks. + +.. contents:: mmcls.apis + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcls.apis + +Train +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + + init_random_seed + set_random_seed + train_model + +Test +------------------ +.. autosummary:: + :toctree: generated + :nosignatures: + + single_gpu_test + multi_gpu_test + +Inference +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + + init_model + inference_model + show_result_pyplot diff --git a/docs/en/api/core.rst b/docs/en/api/core.rst new file mode 100644 index 0000000..83e1dbf --- /dev/null +++ b/docs/en/api/core.rst @@ -0,0 +1,62 @@ +.. role:: hidden + :class: hidden-section + +mmcls.core +=================================== + +This package includes some runtime components. These components are useful in +classification tasks but not supported by MMCV yet. + +.. note:: + + Some components may be moved to MMCV in the future. + +.. contents:: mmcls.core + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcls.core + +Evaluation +------------------ + +Evaluation metrics calculation functions + +.. autosummary:: + :toctree: generated + :nosignatures: + + precision + recall + f1_score + precision_recall_f1 + average_precision + mAP + support + average_performance + calculate_confusion_matrix + +Hook +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + ClassNumCheckHook + PreciseBNHook + CosineAnnealingCooldownLrUpdaterHook + MMClsWandbHook + + +Optimizers +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + Lamb diff --git a/docs/en/api/datasets.rst b/docs/en/api/datasets.rst new file mode 100644 index 0000000..640ce1a --- /dev/null +++ b/docs/en/api/datasets.rst @@ -0,0 +1,61 @@ +.. role:: hidden + :class: hidden-section + +mmcls.datasets +=================================== + +The ``datasets`` package contains several usual datasets for image classification tasks and some dataset wrappers. + +.. currentmodule:: mmcls.datasets + +Custom Dataset +-------------- + +.. autoclass:: CustomDataset + +ImageNet +-------- + +.. autoclass:: ImageNet + +.. autoclass:: ImageNet21k + +CIFAR +----- + +.. autoclass:: CIFAR10 + +.. autoclass:: CIFAR100 + +MNIST +----- + +.. autoclass:: MNIST + +.. autoclass:: FashionMNIST + +VOC +--- + +.. autoclass:: VOC + +StanfordCars Cars +----------------- + +.. autoclass:: StanfordCars + +Base classes +------------ + +.. autoclass:: BaseDataset + +.. autoclass:: MultiLabelDataset + +Dataset Wrappers +---------------- + +.. autoclass:: ConcatDataset + +.. autoclass:: RepeatDataset + +.. autoclass:: ClassBalancedDataset diff --git a/docs/en/api/models.rst b/docs/en/api/models.rst new file mode 100644 index 0000000..0c31791 --- /dev/null +++ b/docs/en/api/models.rst @@ -0,0 +1,141 @@ +.. role:: hidden + :class: hidden-section + +mmcls.models +=================================== + +The ``models`` package contains several sub-packages for addressing the different components of a model. + +- :ref:`classifiers`: The top-level module which defines the whole process of a classification model. +- :ref:`backbones`: Usually a feature extraction network, e.g., ResNet, MobileNet. +- :ref:`necks`: The component between backbones and heads, e.g., GlobalAveragePooling. +- :ref:`heads`: The component for specific tasks. In MMClassification, we provides heads for classification. +- :ref:`losses`: Loss functions. + +.. currentmodule:: mmcls.models + +.. autosummary:: + :toctree: generated + :nosignatures: + + build_classifier + build_backbone + build_neck + build_head + build_loss + +.. _classifiers: + +Classifier +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + BaseClassifier + ImageClassifier + +.. _backbones: + +Backbones +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + AlexNet + CSPDarkNet + CSPNet + CSPResNeXt + CSPResNet + Conformer + ConvMixer + ConvNeXt + DenseNet + DistilledVisionTransformer + EfficientNet + HRNet + LeNet5 + MlpMixer + MobileNetV2 + MobileNetV3 + PCPVT + PoolFormer + RegNet + RepMLPNet + RepVGG + Res2Net + ResNeSt + ResNeXt + ResNet + ResNetV1c + ResNetV1d + ResNet_CIFAR + SEResNeXt + SEResNet + SVT + ShuffleNetV1 + ShuffleNetV2 + SwinTransformer + T2T_ViT + TIMMBackbone + TNT + VAN + VGG + VisionTransformer + EfficientFormer + HorNet + +.. _necks: + +Necks +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + GlobalAveragePooling + GeneralizedMeanPooling + HRFuseScales + +.. _heads: + +Heads +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + ClsHead + LinearClsHead + StackedLinearClsHead + MultiLabelClsHead + MultiLabelLinearClsHead + VisionTransformerClsHead + DeiTClsHead + ConformerHead + +.. _losses: + +Losses +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + Accuracy + AsymmetricLoss + CrossEntropyLoss + LabelSmoothLoss + FocalLoss + SeesawLoss diff --git a/docs/en/api/models.utils.augment.rst b/docs/en/api/models.utils.augment.rst new file mode 100644 index 0000000..54442f7 --- /dev/null +++ b/docs/en/api/models.utils.augment.rst @@ -0,0 +1,35 @@ +.. role:: hidden + :class: hidden-section + +Batch Augmentation +=================================== + +Batch augmentation is the augmentation which involve multiple samples, such as Mixup and CutMix. + +In MMClassification, these batch augmentation is used as a part of :ref:`classifiers`. A typical usage is as below: + +.. code-block:: python + + model = dict( + backbone = ..., + neck = ..., + head = ..., + train_cfg=dict(augments=[ + dict(type='BatchMixup', alpha=0.8, prob=0.5, num_classes=num_classes), + dict(type='BatchCutMix', alpha=1.0, prob=0.5, num_classes=num_classes), + ])) + ) + +.. currentmodule:: mmcls.models.utils.augment + +Mixup +----- +.. autoclass:: BatchMixupLayer + +CutMix +------ +.. autoclass:: BatchCutMixLayer + +ResizeMix +--------- +.. autoclass:: BatchResizeMixLayer diff --git a/docs/en/api/models.utils.rst b/docs/en/api/models.utils.rst new file mode 100644 index 0000000..c9687a7 --- /dev/null +++ b/docs/en/api/models.utils.rst @@ -0,0 +1,50 @@ +.. role:: hidden + :class: hidden-section + +mmcls.models.utils +=================================== + +This package includes some helper functions and common components used in various networks. + +.. contents:: mmcls.models.utils + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcls.models.utils + +Common Components +------------------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + InvertedResidual + SELayer + ShiftWindowMSA + MultiheadAttention + ConditionalPositionEncoding + +Helper Functions +------------------ + +channel_shuffle +^^^^^^^^^^^^^^^ +.. autofunction:: channel_shuffle + +make_divisible +^^^^^^^^^^^^^^ +.. autofunction:: make_divisible + +to_ntuple +^^^^^^^^^^^^^^ +.. autofunction:: to_ntuple +.. autofunction:: to_2tuple +.. autofunction:: to_3tuple +.. autofunction:: to_4tuple + +is_tracing +^^^^^^^^^^^^^^ +.. autofunction:: is_tracing diff --git a/docs/en/api/transforms.rst b/docs/en/api/transforms.rst new file mode 100644 index 0000000..4a39f08 --- /dev/null +++ b/docs/en/api/transforms.rst @@ -0,0 +1,171 @@ +.. role:: hidden + :class: hidden-section + +Data Transformations +*********************************** + +In MMClassification, the data preparation and the dataset is decomposed. The +datasets only define how to get samples' basic information from the file +system. These basic information includes the ground-truth label and raw images +data / the paths of images. + +To prepare the inputs data, we need to do some transformations on these basic +information. These transformations includes loading, preprocessing and +formatting. And a series of data transformations makes up a data pipeline. +Therefore, you can find the a ``pipeline`` argument in the configs of dataset, +for example: + +.. code:: python + + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) + ] + test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=256), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ] + + data = dict( + train=dict(..., pipeline=train_pipeline), + val=dict(..., pipeline=test_pipeline), + test=dict(..., pipeline=test_pipeline), + ) + +Every item of a pipeline list is one of the following data transformations class. And if you want to add a custom data transformation class, the tutorial :doc:`Custom Data Pipelines ` will help you. + +.. contents:: mmcls.datasets.pipelines + :depth: 2 + :local: + :backlinks: top + +.. currentmodule:: mmcls.datasets.pipelines + +Loading +======= + +LoadImageFromFile +--------------------- +.. autoclass:: LoadImageFromFile + +Preprocessing and Augmentation +============================== + +CenterCrop +--------------------- +.. autoclass:: CenterCrop + +Lighting +--------------------- +.. autoclass:: Lighting + +Normalize +--------------------- +.. autoclass:: Normalize + +Pad +--------------------- +.. autoclass:: Pad + +Resize +--------------------- +.. autoclass:: Resize + +RandomCrop +--------------------- +.. autoclass:: RandomCrop + +RandomErasing +--------------------- +.. autoclass:: RandomErasing + +RandomFlip +--------------------- +.. autoclass:: RandomFlip + +RandomGrayscale +--------------------- +.. autoclass:: RandomGrayscale + +RandomResizedCrop +--------------------- +.. autoclass:: RandomResizedCrop + +ColorJitter +--------------------- +.. autoclass:: ColorJitter + + +Composed Augmentation +--------------------- +Composed augmentation is a kind of methods which compose a series of data +augmentation transformations, such as ``AutoAugment`` and ``RandAugment``. + +.. autoclass:: AutoAugment + +.. autoclass:: RandAugment + +In composed augmentation, we need to specify several data transformations or +several groups of data transformations (The ``policies`` argument) as the +random sampling space. These data transformations are chosen from the below +table. In addition, we provide some preset policies in `this folder`_. + +.. _this folder: https://github.com/open-mmlab/mmclassification/tree/master/configs/_base_/datasets/pipelines + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: classtemplate.rst + + AutoContrast + Brightness + ColorTransform + Contrast + Cutout + Equalize + Invert + Posterize + Rotate + Sharpness + Shear + Solarize + SolarizeAdd + Translate + +Formatting +========== + +Collect +--------------------- +.. autoclass:: Collect + +ImageToTensor +--------------------- +.. autoclass:: ImageToTensor + +ToNumpy +--------------------- +.. autoclass:: ToNumpy + +ToPIL +--------------------- +.. autoclass:: ToPIL + +ToTensor +--------------------- +.. autoclass:: ToTensor + +Transpose +--------------------- +.. autoclass:: Transpose diff --git a/docs/en/api/utils.rst b/docs/en/api/utils.rst new file mode 100644 index 0000000..206fc82 --- /dev/null +++ b/docs/en/api/utils.rst @@ -0,0 +1,23 @@ +.. role:: hidden + :class: hidden-section + +mmcls.utils +=================================== + +These are some useful help function in the ``utils`` package. + +.. contents:: mmcls.utils + :depth: 1 + :local: + :backlinks: top + +.. currentmodule:: mmcls.utils + +.. autosummary:: + :toctree: generated + :nosignatures: + + collect_env + get_root_logger + load_json_log + setup_multi_processes diff --git a/docs/en/changelog.md b/docs/en/changelog.md new file mode 100644 index 0000000..7928a13 --- /dev/null +++ b/docs/en/changelog.md @@ -0,0 +1,746 @@ +# Changelog + +## v0.25.0(06/12/2022) + +### Highlights + +- Support MLU backend. + +### New Features + +- Support MLU backend. ([#1159](https://github.com/open-mmlab/mmclassification/pull/1159)) +- Support Activation Checkpointing for ConvNeXt. ([#1152](https://github.com/open-mmlab/mmclassification/pull/1152)) + +### Improvements + +- Add `dist_train_arm.sh` for ARM device and update NPU results. ([#1218](https://github.com/open-mmlab/mmclassification/pull/1218)) + +### Bug Fixes + +- Fix a bug caused `MMClsWandbHook` stuck. ([#1242](https://github.com/open-mmlab/mmclassification/pull/1242)) +- Fix the redundant `device_ids` in `tools/test.py`. ([#1215](https://github.com/open-mmlab/mmclassification/pull/1215)) + +### Docs Update + +- Add version banner and version warning in master docs. ([#1216](https://github.com/open-mmlab/mmclassification/pull/1216)) +- Update NPU support doc. ([#1198](https://github.com/open-mmlab/mmclassification/pull/1198)) +- Fixed typo in `pytorch2torchscript.md`. ([#1173](https://github.com/open-mmlab/mmclassification/pull/1173)) +- Fix typo in `miscellaneous.md`. ([#1137](https://github.com/open-mmlab/mmclassification/pull/1137)) +- further detail for the doc for `ClassBalancedDataset`. ([#901](https://github.com/open-mmlab/mmclassification/pull/901)) + +## v0.24.1(31/10/2022) + +### New Features + +- Support mmcls with NPU backend. ([#1072](https://github.com/open-mmlab/mmclassification/pull/1072)) + +### Bug Fixes + +- Fix performance issue in convnext DDP train. ([#1098](https://github.com/open-mmlab/mmclassification/pull/1098)) + +## v0.24.0(30/9/2022) + +### Highlights + +- Support HorNet, EfficientFormerm, SwinTransformer V2 and MViT backbones. +- Support Standford Cars dataset. + +### New Features + +- Support HorNet Backbone. ([#1013](https://github.com/open-mmlab/mmclassification/pull/1013)) +- Support EfficientFormer. ([#954](https://github.com/open-mmlab/mmclassification/pull/954)) +- Support Stanford Cars dataset. ([#893](https://github.com/open-mmlab/mmclassification/pull/893)) +- Support CSRA head. ([#881](https://github.com/open-mmlab/mmclassification/pull/881)) +- Support Swin Transform V2. ([#799](https://github.com/open-mmlab/mmclassification/pull/799)) +- Support MViT and add checkpoints. ([#924](https://github.com/open-mmlab/mmclassification/pull/924)) + +### Improvements + +- [Improve] replace loop of progressbar in api/test. ([#878](https://github.com/open-mmlab/mmclassification/pull/878)) +- [Enhance] RepVGG for YOLOX-PAI. ([#1025](https://github.com/open-mmlab/mmclassification/pull/1025)) +- [Enhancement] Update VAN. ([#1017](https://github.com/open-mmlab/mmclassification/pull/1017)) +- [Refactor] Re-write `get_sinusoid_encoding` from third-party implementation. ([#965](https://github.com/open-mmlab/mmclassification/pull/965)) +- [Improve] Upgrade onnxsim to v0.4.0. ([#915](https://github.com/open-mmlab/mmclassification/pull/915)) +- [Improve] Fixed typo in `RepVGG`. ([#985](https://github.com/open-mmlab/mmclassification/pull/985)) +- [Improve] Using `train_step` instead of `forward` in PreciseBNHook ([#964](https://github.com/open-mmlab/mmclassification/pull/964)) +- [Improve] Use `forward_dummy` to calculate FLOPS. ([#953](https://github.com/open-mmlab/mmclassification/pull/953)) + +### Bug Fixes + +- Fix warning with `torch.meshgrid`. ([#860](https://github.com/open-mmlab/mmclassification/pull/860)) +- Add matplotlib minimum version requriments. ([#909](https://github.com/open-mmlab/mmclassification/pull/909)) +- val loader should not drop last by default. ([#857](https://github.com/open-mmlab/mmclassification/pull/857)) +- Fix config.device bug in toturial. ([#1059](https://github.com/open-mmlab/mmclassification/pull/1059)) +- Fix attenstion clamp max params ([#1034](https://github.com/open-mmlab/mmclassification/pull/1034)) +- Fix device mismatch in Swin-v2. ([#976](https://github.com/open-mmlab/mmclassification/pull/976)) +- Fix the output position of Swin-Transformer. ([#947](https://github.com/open-mmlab/mmclassification/pull/947)) + +### Docs Update + +- Fix typo in config.md. ([#827](https://github.com/open-mmlab/mmclassification/pull/827)) +- Add version for torchvision to avoide error. ([#903](https://github.com/open-mmlab/mmclassification/pull/903)) +- Fixed typo for `--out-dir` option of analyze_results.py. ([#898](https://github.com/open-mmlab/mmclassification/pull/898)) +- Refine the docstring of RegNet ([#935](https://github.com/open-mmlab/mmclassification/pull/935)) + +## v0.23.2(28/7/2022) + +### New Features + +- Support MPS device. ([#894](https://github.com/open-mmlab/mmclassification/pull/894)) + +### Bug Fixes + +- Fix a bug in Albu which caused crashing. ([#918](https://github.com/open-mmlab/mmclassification/pull/918)) + +## v0.23.1(2/6/2022) + +### New Features + +- Dedicated MMClsWandbHook for MMClassification (Weights and Biases Integration) ([#764](https://github.com/open-mmlab/mmclassification/pull/764)) + +### Improvements + +- Use mdformat instead of markdownlint to format markdown. ([#844](https://github.com/open-mmlab/mmclassification/pull/844)) + +### Bug Fixes + +- Fix wrong `--local_rank`. + +### Docs Update + +- Update install tutorials. ([#854](https://github.com/open-mmlab/mmclassification/pull/854)) +- Fix wrong link in README. ([#835](https://github.com/open-mmlab/mmclassification/pull/835)) + +## v0.23.0(1/5/2022) + +### New Features + +- Support DenseNet. ([#750](https://github.com/open-mmlab/mmclassification/pull/750)) +- Support VAN. ([#739](https://github.com/open-mmlab/mmclassification/pull/739)) + +### Improvements + +- Support training on IPU and add fine-tuning configs of ViT. ([#723](https://github.com/open-mmlab/mmclassification/pull/723)) + +### Docs Update + +- New style API reference, and easier to use! Welcome [view it](https://mmclassification.readthedocs.io/en/master/api/models.html). ([#774](https://github.com/open-mmlab/mmclassification/pull/774)) + +## v0.22.1(15/4/2022) + +### New Features + +- [Feature] Support resize relative position embedding in `SwinTransformer`. ([#749](https://github.com/open-mmlab/mmclassification/pull/749)) +- [Feature] Add PoolFormer backbone and checkpoints. ([#746](https://github.com/open-mmlab/mmclassification/pull/746)) + +### Improvements + +- [Enhance] Improve CPE performance by reduce memory copy. ([#762](https://github.com/open-mmlab/mmclassification/pull/762)) +- [Enhance] Add extra dataloader settings in configs. ([#752](https://github.com/open-mmlab/mmclassification/pull/752)) + +## v0.22.0(30/3/2022) + +### Highlights + +- Support a series of CSP Network, such as CSP-ResNet, CSP-ResNeXt and CSP-DarkNet. +- A new `CustomDataset` class to help you build dataset of yourself! +- Support ConvMixer, RepMLP and new dataset - CUB dataset. + +### New Features + +- [Feature] Add CSPNet and backbone and checkpoints ([#735](https://github.com/open-mmlab/mmclassification/pull/735)) +- [Feature] Add `CustomDataset`. ([#738](https://github.com/open-mmlab/mmclassification/pull/738)) +- [Feature] Add diff seeds to diff ranks. ([#744](https://github.com/open-mmlab/mmclassification/pull/744)) +- [Feature] Support ConvMixer. ([#716](https://github.com/open-mmlab/mmclassification/pull/716)) +- [Feature] Our `dist_train` & `dist_test` tools support distributed training on multiple machines. ([#734](https://github.com/open-mmlab/mmclassification/pull/734)) +- [Feature] Add RepMLP backbone and checkpoints. ([#709](https://github.com/open-mmlab/mmclassification/pull/709)) +- [Feature] Support CUB dataset. ([#703](https://github.com/open-mmlab/mmclassification/pull/703)) +- [Feature] Support ResizeMix. ([#676](https://github.com/open-mmlab/mmclassification/pull/676)) + +### Improvements + +- [Enhance] Use `--a-b` instead of `--a_b` in arguments. ([#754](https://github.com/open-mmlab/mmclassification/pull/754)) +- [Enhance] Add `get_cat_ids` and `get_gt_labels` to KFoldDataset. ([#721](https://github.com/open-mmlab/mmclassification/pull/721)) +- [Enhance] Set torch seed in `worker_init_fn`. ([#733](https://github.com/open-mmlab/mmclassification/pull/733)) + +### Bug Fixes + +- [Fix] Fix the discontiguous output feature map of ConvNeXt. ([#743](https://github.com/open-mmlab/mmclassification/pull/743)) + +### Docs Update + +- [Docs] Add brief installation steps in README for copy&paste. ([#755](https://github.com/open-mmlab/mmclassification/pull/755)) +- [Docs] fix logo url link from mmocr to mmcls. ([#732](https://github.com/open-mmlab/mmclassification/pull/732)) + +## v0.21.0(04/03/2022) + +### Highlights + +- Support ResNetV1c and Wide-ResNet, and provide pre-trained models. +- Support dynamic input shape for ViT-based algorithms. Now our ViT, DeiT, Swin-Transformer and T2T-ViT support forwarding with any input shape. +- Reproduce training results of DeiT. And our DeiT-T and DeiT-S have higher accuracy comparing with the official weights. + +### New Features + +- Add ResNetV1c. ([#692](https://github.com/open-mmlab/mmclassification/pull/692)) +- Support Wide-ResNet. ([#715](https://github.com/open-mmlab/mmclassification/pull/715)) +- Support gem pooling ([#677](https://github.com/open-mmlab/mmclassification/pull/677)) + +### Improvements + +- Reproduce training results of DeiT. ([#711](https://github.com/open-mmlab/mmclassification/pull/711)) +- Add ConvNeXt pretrain models on ImageNet-1k. ([#707](https://github.com/open-mmlab/mmclassification/pull/707)) +- Support dynamic input shape for ViT-based algorithms. ([#706](https://github.com/open-mmlab/mmclassification/pull/706)) +- Add `evaluate` function for ConcatDataset. ([#650](https://github.com/open-mmlab/mmclassification/pull/650)) +- Enhance vis-pipeline tool. ([#604](https://github.com/open-mmlab/mmclassification/pull/604)) +- Return code 1 if scripts runs failed. ([#694](https://github.com/open-mmlab/mmclassification/pull/694)) +- Use PyTorch official `one_hot` to implement `convert_to_one_hot`. ([#696](https://github.com/open-mmlab/mmclassification/pull/696)) +- Add a new pre-commit-hook to automatically add a copyright. ([#710](https://github.com/open-mmlab/mmclassification/pull/710)) +- Add deprecation message for deploy tools. ([#697](https://github.com/open-mmlab/mmclassification/pull/697)) +- Upgrade isort pre-commit hooks. ([#687](https://github.com/open-mmlab/mmclassification/pull/687)) +- Use `--gpu-id` instead of `--gpu-ids` in non-distributed multi-gpu training/testing. ([#688](https://github.com/open-mmlab/mmclassification/pull/688)) +- Remove deprecation. ([#633](https://github.com/open-mmlab/mmclassification/pull/633)) + +### Bug Fixes + +- Fix Conformer forward with irregular input size. ([#686](https://github.com/open-mmlab/mmclassification/pull/686)) +- Add `dist.barrier` to fix a bug in directory checking. ([#666](https://github.com/open-mmlab/mmclassification/pull/666)) + +## v0.20.1(07/02/2022) + +### Bug Fixes + +- Fix the MMCV dependency version. + +## v0.20.0(30/01/2022) + +### Highlights + +- Support K-fold cross-validation. The tutorial will be released later. +- Support HRNet, ConvNeXt, Twins and EfficientNet. +- Support model conversion from PyTorch to Core-ML by a tool. + +### New Features + +- Support K-fold cross-validation. ([#563](https://github.com/open-mmlab/mmclassification/pull/563)) +- Support HRNet and add pre-trained models. ([#660](https://github.com/open-mmlab/mmclassification/pull/660)) +- Support ConvNeXt and add pre-trained models. ([#670](https://github.com/open-mmlab/mmclassification/pull/670)) +- Support Twins and add pre-trained models. ([#642](https://github.com/open-mmlab/mmclassification/pull/642)) +- Support EfficientNet and add pre-trained models.([#649](https://github.com/open-mmlab/mmclassification/pull/649)) +- Support `features_only` option in `TIMMBackbone`. ([#668](https://github.com/open-mmlab/mmclassification/pull/668)) +- Add conversion script from pytorch to Core-ML model. ([#597](https://github.com/open-mmlab/mmclassification/pull/597)) + +### Improvements + +- New-style CPU training and inference. ([#674](https://github.com/open-mmlab/mmclassification/pull/674)) +- Add setup multi-processing both in train and test. ([#671](https://github.com/open-mmlab/mmclassification/pull/671)) +- Rewrite channel split operation in ShufflenetV2. ([#632](https://github.com/open-mmlab/mmclassification/pull/632)) +- Deprecate the support for "python setup.py test". ([#646](https://github.com/open-mmlab/mmclassification/pull/646)) +- Support single-label, softmax, custom eps by asymmetric loss. ([#609](https://github.com/open-mmlab/mmclassification/pull/609)) +- Save class names in best checkpoint created by evaluation hook. ([#641](https://github.com/open-mmlab/mmclassification/pull/641)) + +### Bug Fixes + +- Fix potential unexcepted behaviors if `metric_options` is not specified in multi-label evaluation. ([#647](https://github.com/open-mmlab/mmclassification/pull/647)) +- Fix API changes in `pytorch-grad-cam>=1.3.7`. ([#656](https://github.com/open-mmlab/mmclassification/pull/656)) +- Fix bug which breaks `cal_train_time` in `analyze_logs.py`. ([#662](https://github.com/open-mmlab/mmclassification/pull/662)) + +### Docs Update + +- Update README in configs according to OpenMMLab standard. ([#672](https://github.com/open-mmlab/mmclassification/pull/672)) +- Update installation guide and README. ([#624](https://github.com/open-mmlab/mmclassification/pull/624)) + +## v0.19.0(31/12/2021) + +### Highlights + +- The feature extraction function has been enhanced. See [#593](https://github.com/open-mmlab/mmclassification/pull/593) for more details. +- Provide the high-acc ResNet-50 training settings from [*ResNet strikes back*](https://arxiv.org/abs/2110.00476). +- Reproduce the training accuracy of T2T-ViT & RegNetX, and provide self-training checkpoints. +- Support DeiT & Conformer backbone and checkpoints. +- Provide a CAM visualization tool based on [pytorch-grad-cam](https://github.com/jacobgil/pytorch-grad-cam), and detailed [user guide](https://mmclassification.readthedocs.io/en/latest/tools/visualization.html#class-activation-map-visualization)! + +### New Features + +- Support Precise BN. ([#401](https://github.com/open-mmlab/mmclassification/pull/401)) +- Add CAM visualization tool. ([#577](https://github.com/open-mmlab/mmclassification/pull/577)) +- Repeated Aug and Sampler Registry. ([#588](https://github.com/open-mmlab/mmclassification/pull/588)) +- Add DeiT backbone and checkpoints. ([#576](https://github.com/open-mmlab/mmclassification/pull/576)) +- Support LAMB optimizer. ([#591](https://github.com/open-mmlab/mmclassification/pull/591)) +- Implement the conformer backbone. ([#494](https://github.com/open-mmlab/mmclassification/pull/494)) +- Add the frozen function for Swin Transformer model. ([#574](https://github.com/open-mmlab/mmclassification/pull/574)) +- Support using checkpoint in Swin Transformer to save memory. ([#557](https://github.com/open-mmlab/mmclassification/pull/557)) + +### Improvements + +- [Reproduction] Reproduce RegNetX training accuracy. ([#587](https://github.com/open-mmlab/mmclassification/pull/587)) +- [Reproduction] Reproduce training results of T2T-ViT. ([#610](https://github.com/open-mmlab/mmclassification/pull/610)) +- [Enhance] Provide high-acc training settings of ResNet. ([#572](https://github.com/open-mmlab/mmclassification/pull/572)) +- [Enhance] Set a random seed when the user does not set a seed. ([#554](https://github.com/open-mmlab/mmclassification/pull/554)) +- [Enhance] Added `NumClassCheckHook` and unit tests. ([#559](https://github.com/open-mmlab/mmclassification/pull/559)) +- [Enhance] Enhance feature extraction function. ([#593](https://github.com/open-mmlab/mmclassification/pull/593)) +- [Enhance] Improve efficiency of precision, recall, f1_score and support. ([#595](https://github.com/open-mmlab/mmclassification/pull/595)) +- [Enhance] Improve accuracy calculation performance. ([#592](https://github.com/open-mmlab/mmclassification/pull/592)) +- [Refactor] Refactor `analysis_log.py`. ([#529](https://github.com/open-mmlab/mmclassification/pull/529)) +- [Refactor] Use new API of matplotlib to handle blocking input in visualization. ([#568](https://github.com/open-mmlab/mmclassification/pull/568)) +- [CI] Cancel previous runs that are not completed. ([#583](https://github.com/open-mmlab/mmclassification/pull/583)) +- [CI] Skip build CI if only configs or docs modification. ([#575](https://github.com/open-mmlab/mmclassification/pull/575)) + +### Bug Fixes + +- Fix test sampler bug. ([#611](https://github.com/open-mmlab/mmclassification/pull/611)) +- Try to create a symbolic link, otherwise copy. ([#580](https://github.com/open-mmlab/mmclassification/pull/580)) +- Fix a bug for multiple output in swin transformer. ([#571](https://github.com/open-mmlab/mmclassification/pull/571)) + +### Docs Update + +- Update mmcv, torch, cuda version in Dockerfile and docs. ([#594](https://github.com/open-mmlab/mmclassification/pull/594)) +- Add analysis&misc docs. ([#525](https://github.com/open-mmlab/mmclassification/pull/525)) +- Fix docs build dependency. ([#584](https://github.com/open-mmlab/mmclassification/pull/584)) + +## v0.18.0(30/11/2021) + +### Highlights + +- Support MLP-Mixer backbone and provide pre-trained checkpoints. +- Add a tool to visualize the learning rate curve of the training phase. Welcome to use with the [tutorial](https://mmclassification.readthedocs.io/en/latest/tools/visualization.html#learning-rate-schedule-visualization)! + +### New Features + +- Add MLP Mixer Backbone. ([#528](https://github.com/open-mmlab/mmclassification/pull/528), [#539](https://github.com/open-mmlab/mmclassification/pull/539)) +- Support positive weights in BCE. ([#516](https://github.com/open-mmlab/mmclassification/pull/516)) +- Add a tool to visualize learning rate in each iterations. ([#498](https://github.com/open-mmlab/mmclassification/pull/498)) + +### Improvements + +- Use CircleCI to do unit tests. ([#567](https://github.com/open-mmlab/mmclassification/pull/567)) +- Focal loss for single label tasks. ([#548](https://github.com/open-mmlab/mmclassification/pull/548)) +- Remove useless `import_modules_from_string`. ([#544](https://github.com/open-mmlab/mmclassification/pull/544)) +- Rename config files according to the config name standard. ([#508](https://github.com/open-mmlab/mmclassification/pull/508)) +- Use `reset_classifier` to remove head of timm backbones. ([#534](https://github.com/open-mmlab/mmclassification/pull/534)) +- Support passing arguments to loss from head. ([#523](https://github.com/open-mmlab/mmclassification/pull/523)) +- Refactor `Resize` transform and add `Pad` transform. ([#506](https://github.com/open-mmlab/mmclassification/pull/506)) +- Update mmcv dependency version. ([#509](https://github.com/open-mmlab/mmclassification/pull/509)) + +### Bug Fixes + +- Fix bug when using `ClassBalancedDataset`. ([#555](https://github.com/open-mmlab/mmclassification/pull/555)) +- Fix a bug when using iter-based runner with 'val' workflow. ([#542](https://github.com/open-mmlab/mmclassification/pull/542)) +- Fix interpolation method checking in `Resize`. ([#547](https://github.com/open-mmlab/mmclassification/pull/547)) +- Fix a bug when load checkpoints in mulit-GPUs environment. ([#527](https://github.com/open-mmlab/mmclassification/pull/527)) +- Fix an error on indexing scalar metrics in `analyze_result.py`. ([#518](https://github.com/open-mmlab/mmclassification/pull/518)) +- Fix wrong condition judgment in `analyze_logs.py` and prevent empty curve. ([#510](https://github.com/open-mmlab/mmclassification/pull/510)) + +### Docs Update + +- Fix vit config and model broken links. ([#564](https://github.com/open-mmlab/mmclassification/pull/564)) +- Add abstract and image for every paper. ([#546](https://github.com/open-mmlab/mmclassification/pull/546)) +- Add mmflow and mim in banner and readme. ([#543](https://github.com/open-mmlab/mmclassification/pull/543)) +- Add schedule and runtime tutorial docs. ([#499](https://github.com/open-mmlab/mmclassification/pull/499)) +- Add the top-5 acc in ResNet-CIFAR README. ([#531](https://github.com/open-mmlab/mmclassification/pull/531)) +- Fix TOC of `visualization.md` and add example images. ([#513](https://github.com/open-mmlab/mmclassification/pull/513)) +- Use docs link of other projects and add MMCV docs. ([#511](https://github.com/open-mmlab/mmclassification/pull/511)) + +## v0.17.0(29/10/2021) + +### Highlights + +- Support Tokens-to-Token ViT backbone and Res2Net backbone. Welcome to use! +- Support ImageNet21k dataset. +- Add a pipeline visualization tool. Try it with the [tutorials](https://mmclassification.readthedocs.io/en/latest/tools/visualization.html#pipeline-visualization)! + +### New Features + +- Add Tokens-to-Token ViT backbone and converted checkpoints. ([#467](https://github.com/open-mmlab/mmclassification/pull/467)) +- Add Res2Net backbone and converted weights. ([#465](https://github.com/open-mmlab/mmclassification/pull/465)) +- Support ImageNet21k dataset. ([#461](https://github.com/open-mmlab/mmclassification/pull/461)) +- Support seesaw loss. ([#500](https://github.com/open-mmlab/mmclassification/pull/500)) +- Add a pipeline visualization tool. ([#406](https://github.com/open-mmlab/mmclassification/pull/406)) +- Add a tool to find broken files. ([#482](https://github.com/open-mmlab/mmclassification/pull/482)) +- Add a tool to test TorchServe. ([#468](https://github.com/open-mmlab/mmclassification/pull/468)) + +### Improvements + +- Refator Vision Transformer. ([#395](https://github.com/open-mmlab/mmclassification/pull/395)) +- Use context manager to reuse matplotlib figures. ([#432](https://github.com/open-mmlab/mmclassification/pull/432)) + +### Bug Fixes + +- Remove `DistSamplerSeedHook` if use `IterBasedRunner`. ([#501](https://github.com/open-mmlab/mmclassification/pull/501)) +- Set the priority of `EvalHook` to "LOW" to avoid a bug when using `IterBasedRunner`. ([#488](https://github.com/open-mmlab/mmclassification/pull/488)) +- Fix a wrong parameter of `get_root_logger` in `apis/train.py`. ([#486](https://github.com/open-mmlab/mmclassification/pull/486)) +- Fix version check in dataset builder. ([#474](https://github.com/open-mmlab/mmclassification/pull/474)) + +### Docs Update + +- Add English Colab tutorials and update Chinese Colab tutorials. ([#483](https://github.com/open-mmlab/mmclassification/pull/483), [#497](https://github.com/open-mmlab/mmclassification/pull/497)) +- Add tutuorial for config files. ([#487](https://github.com/open-mmlab/mmclassification/pull/487)) +- Add model-pages in Model Zoo. ([#480](https://github.com/open-mmlab/mmclassification/pull/480)) +- Add code-spell pre-commit hook and fix a large mount of typos. ([#470](https://github.com/open-mmlab/mmclassification/pull/470)) + +## v0.16.0(30/9/2021) + +### Highlights + +- We have improved compatibility with downstream repositories like MMDetection and MMSegmentation. We will add some examples about how to use our backbones in MMDetection. +- Add RepVGG backbone and checkpoints. Welcome to use it! +- Add timm backbones wrapper, now you can simply use backbones of pytorch-image-models in MMClassification! + +### New Features + +- Add RepVGG backbone and checkpoints. ([#414](https://github.com/open-mmlab/mmclassification/pull/414)) +- Add timm backbones wrapper. ([#427](https://github.com/open-mmlab/mmclassification/pull/427)) + +### Improvements + +- Fix TnT compatibility and verbose warning. ([#436](https://github.com/open-mmlab/mmclassification/pull/436)) +- Support setting `--out-items` in `tools/test.py`. ([#437](https://github.com/open-mmlab/mmclassification/pull/437)) +- Add datetime info and saving model using torch\<1.6 format. ([#439](https://github.com/open-mmlab/mmclassification/pull/439)) +- Improve downstream repositories compatibility. ([#421](https://github.com/open-mmlab/mmclassification/pull/421)) +- Rename the option `--options` to `--cfg-options` in some tools. ([#425](https://github.com/open-mmlab/mmclassification/pull/425)) +- Add PyTorch 1.9 and Python 3.9 build workflow, and remove some CI. ([#422](https://github.com/open-mmlab/mmclassification/pull/422)) + +### Bug Fixes + +- Fix format error in `test.py` when metric returns `np.ndarray`. ([#441](https://github.com/open-mmlab/mmclassification/pull/441)) +- Fix `publish_model` bug if no parent of `out_file`. ([#463](https://github.com/open-mmlab/mmclassification/pull/463)) +- Fix num_classes bug in pytorch2onnx.py. ([#458](https://github.com/open-mmlab/mmclassification/pull/458)) +- Fix missing runtime requirement `packaging`. ([#459](https://github.com/open-mmlab/mmclassification/pull/459)) +- Fix saving simplified model bug in ONNX export tool. ([#438](https://github.com/open-mmlab/mmclassification/pull/438)) + +### Docs Update + +- Update `getting_started.md` and `install.md`. And rewrite `finetune.md`. ([#466](https://github.com/open-mmlab/mmclassification/pull/466)) +- Use PyTorch style docs theme. ([#457](https://github.com/open-mmlab/mmclassification/pull/457)) +- Update metafile and Readme. ([#435](https://github.com/open-mmlab/mmclassification/pull/435)) +- Add `CITATION.cff`. ([#428](https://github.com/open-mmlab/mmclassification/pull/428)) + +## v0.15.0(31/8/2021) + +### Highlights + +- Support `hparams` argument in `AutoAugment` and `RandAugment` to provide hyperparameters for sub-policies. +- Support custom squeeze channels in `SELayer`. +- Support classwise weight in losses. + +### New Features + +- Add `hparams` argument in `AutoAugment` and `RandAugment` and some other improvement. ([#398](https://github.com/open-mmlab/mmclassification/pull/398)) +- Support classwise weight in losses. ([#388](https://github.com/open-mmlab/mmclassification/pull/388)) +- Enhance `SELayer` to support custom squeeze channels. ([#417](https://github.com/open-mmlab/mmclassification/pull/417)) + +### Code Refactor + +- Better result visualization. ([#419](https://github.com/open-mmlab/mmclassification/pull/419)) +- Use `post_process` function to handle pred result processing. ([#390](https://github.com/open-mmlab/mmclassification/pull/390)) +- Update `digit_version` function. ([#402](https://github.com/open-mmlab/mmclassification/pull/402)) +- Avoid albumentations to install both opencv and opencv-headless. ([#397](https://github.com/open-mmlab/mmclassification/pull/397)) +- Avoid unnecessary listdir when building ImageNet. ([#396](https://github.com/open-mmlab/mmclassification/pull/396)) +- Use dynamic mmcv download link in TorchServe dockerfile. ([#387](https://github.com/open-mmlab/mmclassification/pull/387)) + +### Docs Improvement + +- Add readme of some algorithms and update meta yml. ([#418](https://github.com/open-mmlab/mmclassification/pull/418)) +- Add Copyright information. ([#413](https://github.com/open-mmlab/mmclassification/pull/413)) +- Fix typo 'metirc'. ([#411](https://github.com/open-mmlab/mmclassification/pull/411)) +- Update QQ group QR code. ([#393](https://github.com/open-mmlab/mmclassification/pull/393)) +- Add PR template and modify issue template. ([#380](https://github.com/open-mmlab/mmclassification/pull/380)) + +## v0.14.0(4/8/2021) + +### Highlights + +- Add transformer-in-transformer backbone and pretrain checkpoints, refers to [the paper](https://arxiv.org/abs/2103.00112). +- Add Chinese colab tutorial. +- Provide dockerfile to build mmcls dev docker image. + +### New Features + +- Add transformer in transformer backbone and pretrain checkpoints. ([#339](https://github.com/open-mmlab/mmclassification/pull/339)) +- Support mim, welcome to use mim to manage your mmcls project. ([#376](https://github.com/open-mmlab/mmclassification/pull/376)) +- Add Dockerfile. ([#365](https://github.com/open-mmlab/mmclassification/pull/365)) +- Add ResNeSt configs. ([#332](https://github.com/open-mmlab/mmclassification/pull/332)) + +### Improvements + +- Use the `presistent_works` option if available, to accelerate training. ([#349](https://github.com/open-mmlab/mmclassification/pull/349)) +- Add Chinese ipynb tutorial. ([#306](https://github.com/open-mmlab/mmclassification/pull/306)) +- Refactor unit tests. ([#321](https://github.com/open-mmlab/mmclassification/pull/321)) +- Support to test mmdet inference with mmcls backbone. ([#343](https://github.com/open-mmlab/mmclassification/pull/343)) +- Use zero as default value of `thrs` in metrics. ([#341](https://github.com/open-mmlab/mmclassification/pull/341)) + +### Bug Fixes + +- Fix ImageNet dataset annotation file parse bug. ([#370](https://github.com/open-mmlab/mmclassification/pull/370)) +- Fix docstring typo and init bug in ShuffleNetV1. ([#374](https://github.com/open-mmlab/mmclassification/pull/374)) +- Use local ATTENTION registry to avoid conflict with other repositories. ([#376](https://github.com/open-mmlab/mmclassification/pull/375)) +- Fix swin transformer config bug. ([#355](https://github.com/open-mmlab/mmclassification/pull/355)) +- Fix `patch_cfg` argument bug in SwinTransformer. ([#368](https://github.com/open-mmlab/mmclassification/pull/368)) +- Fix duplicate `init_weights` call in ViT init function. ([#373](https://github.com/open-mmlab/mmclassification/pull/373)) +- Fix broken `_base_` link in a resnet config. ([#361](https://github.com/open-mmlab/mmclassification/pull/361)) +- Fix vgg-19 model link missing. ([#363](https://github.com/open-mmlab/mmclassification/pull/363)) + +## v0.13.0(3/7/2021) + +- Support Swin-Transformer backbone and add training configs for Swin-Transformer on ImageNet. + +### New Features + +- Support Swin-Transformer backbone and add training configs for Swin-Transformer on ImageNet. (#271) +- Add pretained model of RegNetX. (#269) +- Support adding custom hooks in config file. (#305) +- Improve and add Chinese translation of `CONTRIBUTING.md` and all tools tutorials. (#320) +- Dump config before training. (#282) +- Add torchscript and torchserve deployment tools. (#279, #284) + +### Improvements + +- Improve test tools and add some new tools. (#322) +- Correct MobilenetV3 backbone structure and add pretained models. (#291) +- Refactor `PatchEmbed` and `HybridEmbed` as independent components. (#330) +- Refactor mixup and cutmix as `Augments` to support more functions. (#278) +- Refactor weights initialization method. (#270, #318, #319) +- Refactor `LabelSmoothLoss` to support multiple calculation formulas. (#285) + +### Bug Fixes + +- Fix bug for CPU training. (#286) +- Fix missing test data when `num_imgs` can not be evenly divided by `num_gpus`. (#299) +- Fix build compatible with pytorch v1.3-1.5. (#301) +- Fix `magnitude_std` bug in `RandAugment`. (#309) +- Fix bug when `samples_per_gpu` is 1. (#311) + +## v0.12.0(3/6/2021) + +- Finish adding Chinese tutorials and build Chinese documentation on readthedocs. +- Update ResNeXt checkpoints and ResNet checkpoints on CIFAR. + +### New Features + +- Improve and add Chinese translation of `data_pipeline.md` and `new_modules.md`. (#265) +- Build Chinese translation on readthedocs. (#267) +- Add an argument efficientnet_style to `RandomResizedCrop` and `CenterCrop`. (#268) + +### Improvements + +- Only allow directory operation when rank==0 when testing. (#258) +- Fix typo in `base_head`. (#274) +- Update ResNeXt checkpoints. (#283) + +### Bug Fixes + +- Add attribute `data.test` in MNIST configs. (#264) +- Download CIFAR/MNIST dataset only on rank 0. (#273) +- Fix MMCV version compatibility. (#276) +- Fix CIFAR color channels bug and update checkpoints in model zoo. (#280) + +## v0.11.1(21/5/2021) + +- Refine `new_dataset.md` and add Chinese translation of `finture.md`, `new_dataset.md`. + +### New Features + +- Add `dim` argument for `GlobalAveragePooling`. (#236) +- Add random noise to `RandAugment` magnitude. (#240) +- Refine `new_dataset.md` and add Chinese translation of `finture.md`, `new_dataset.md`. (#243) + +### Improvements + +- Refactor arguments passing for Heads. (#239) +- Allow more flexible `magnitude_range` in `RandAugment`. (#249) +- Inherits MMCV registry so that in the future OpenMMLab repos like MMDet and MMSeg could directly use the backbones supported in MMCls. (#252) + +### Bug Fixes + +- Fix typo in `analyze_results.py`. (#237) +- Fix typo in unittests. (#238) +- Check if specified tmpdir exists when testing to avoid deleting existing data. (#242 & #258) +- Add missing config files in `MANIFEST.in`. (#250 & #255) +- Use temporary directory under shared directory to collect results to avoid unavailability of temporary directory for multi-node testing. (#251) + +## v0.11.0(1/5/2021) + +- Support cutmix trick. +- Support random augmentation. +- Add `tools/deployment/test.py` as a ONNX runtime test tool. +- Support ViT backbone and add training configs for ViT on ImageNet. +- Add Chinese `README.md` and some Chinese tutorials. + +### New Features + +- Support cutmix trick. (#198) +- Add `simplify` option in `pytorch2onnx.py`. (#200) +- Support random augmentation. (#201) +- Add config and checkpoint for training ResNet on CIFAR-100. (#208) +- Add `tools/deployment/test.py` as a ONNX runtime test tool. (#212) +- Support ViT backbone and add training configs for ViT on ImageNet. (#214) +- Add finetuning configs for ViT on ImageNet. (#217) +- Add `device` option to support training on CPU. (#219) +- Add Chinese `README.md` and some Chinese tutorials. (#221) +- Add `metafile.yml` in configs to support interaction with paper with code(PWC) and MMCLI. (#225) +- Upload configs and converted checkpoints for ViT fintuning on ImageNet. (#230) + +### Improvements + +- Fix `LabelSmoothLoss` so that label smoothing and mixup could be enabled at the same time. (#203) +- Add `cal_acc` option in `ClsHead`. (#206) +- Check `CLASSES` in checkpoint to avoid unexpected key error. (#207) +- Check mmcv version when importing mmcls to ensure compatibility. (#209) +- Update `CONTRIBUTING.md` to align with that in MMCV. (#210) +- Change tags to html comments in configs README.md. (#226) +- Clean codes in ViT backbone. (#227) +- Reformat `pytorch2onnx.md` tutorial. (#229) +- Update `setup.py` to support MMCLI. (#232) + +### Bug Fixes + +- Fix missing `cutmix_prob` in ViT configs. (#220) +- Fix backend for resize in ResNeXt configs. (#222) + +## v0.10.0(1/4/2021) + +- Support AutoAugmentation +- Add tutorials for installation and usage. + +### New Features + +- Add `Rotate` pipeline for data augmentation. (#167) +- Add `Invert` pipeline for data augmentation. (#168) +- Add `Color` pipeline for data augmentation. (#171) +- Add `Solarize` and `Posterize` pipeline for data augmentation. (#172) +- Support fp16 training. (#178) +- Add tutorials for installation and basic usage of MMClassification.(#176) +- Support `AutoAugmentation`, `AutoContrast`, `Equalize`, `Contrast`, `Brightness` and `Sharpness` pipelines for data augmentation. (#179) + +### Improvements + +- Support dynamic shape export to onnx. (#175) +- Release training configs and update model zoo for fp16 (#184) +- Use MMCV's EvalHook in MMClassification (#182) + +### Bug Fixes + +- Fix wrong naming in vgg config (#181) + +## v0.9.0(1/3/2021) + +- Implement mixup trick. +- Add a new tool to create TensorRT engine from ONNX, run inference and verify outputs in Python. + +### New Features + +- Implement mixup and provide configs of training ResNet50 using mixup. (#160) +- Add `Shear` pipeline for data augmentation. (#163) +- Add `Translate` pipeline for data augmentation. (#165) +- Add `tools/onnx2tensorrt.py` as a tool to create TensorRT engine from ONNX, run inference and verify outputs in Python. (#153) + +### Improvements + +- Add `--eval-options` in `tools/test.py` to support eval options override, matching the behavior of other open-mmlab projects. (#158) +- Support showing and saving painted results in `mmcls.apis.test` and `tools/test.py`, matching the behavior of other open-mmlab projects. (#162) + +### Bug Fixes + +- Fix configs for VGG, replace checkpoints converted from other repos with the ones trained by ourselves and upload the missing logs in the model zoo. (#161) + +## v0.8.0(31/1/2021) + +- Support multi-label task. +- Support more flexible metrics settings. +- Fix bugs. + +### New Features + +- Add evaluation metrics: mAP, CP, CR, CF1, OP, OR, OF1 for multi-label task. (#123) +- Add BCE loss for multi-label task. (#130) +- Add focal loss for multi-label task. (#131) +- Support PASCAL VOC 2007 dataset for multi-label task. (#134) +- Add asymmetric loss for multi-label task. (#132) +- Add analyze_results.py to select images for success/fail demonstration. (#142) +- Support new metric that calculates the total number of occurrences of each label. (#143) +- Support class-wise evaluation results. (#143) +- Add thresholds in eval_metrics. (#146) +- Add heads and a baseline config for multilabel task. (#145) + +### Improvements + +- Remove the models with 0 checkpoint and ignore the repeated papers when counting papers to gain more accurate model statistics. (#135) +- Add tags in README.md. (#137) +- Fix optional issues in docstring. (#138) +- Update stat.py to classify papers. (#139) +- Fix mismatched columns in README.md. (#150) +- Fix test.py to support more evaluation metrics. (#155) + +### Bug Fixes + +- Fix bug in VGG weight_init. (#140) +- Fix bug in 2 ResNet configs in which outdated heads were used. (#147) +- Fix bug of misordered height and width in `RandomCrop` and `RandomResizedCrop`. (#151) +- Fix missing `meta_keys` in `Collect`. (#149 & #152) + +## v0.7.0(31/12/2020) + +- Add more evaluation metrics. +- Fix bugs. + +### New Features + +- Remove installation of MMCV from requirements. (#90) +- Add 3 evaluation metrics: precision, recall and F-1 score. (#93) +- Allow config override during testing and inference with `--options`. (#91 & #96) + +### Improvements + +- Use `build_runner` to make runners more flexible. (#54) +- Support to get category ids in `BaseDataset`. (#72) +- Allow `CLASSES` override during `BaseDateset` initialization. (#85) +- Allow input image as ndarray during inference. (#87) +- Optimize MNIST config. (#98) +- Add config links in model zoo documentation. (#99) +- Use functions from MMCV to collect environment. (#103) +- Refactor config files so that they are now categorized by methods. (#116) +- Add README in config directory. (#117) +- Add model statistics. (#119) +- Refactor documentation in consistency with other MM repositories. (#126) + +### Bug Fixes + +- Add missing `CLASSES` argument to dataset wrappers. (#66) +- Fix slurm evaluation error during training. (#69) +- Resolve error caused by shape in `Accuracy`. (#104) +- Fix bug caused by extremely insufficient data in distributed sampler.(#108) +- Fix bug in `gpu_ids` in distributed training. (#107) +- Fix bug caused by extremely insufficient data in collect results during testing (#114) + +## v0.6.0(11/10/2020) + +- Support new method: ResNeSt and VGG. +- Support new dataset: CIFAR10. +- Provide new tools to do model inference, model conversion from pytorch to onnx. + +### New Features + +- Add model inference. (#16) +- Add pytorch2onnx. (#20) +- Add PIL backend for transform `Resize`. (#21) +- Add ResNeSt. (#25) +- Add VGG and its pretained models. (#27) +- Add CIFAR10 configs and models. (#38) +- Add albumentations transforms. (#45) +- Visualize results on image demo. (#58) + +### Improvements + +- Replace urlretrieve with urlopen in dataset.utils. (#13) +- Resize image according to its short edge. (#22) +- Update ShuffleNet config. (#31) +- Update pre-trained models for shufflenet_v2, shufflenet_v1, se-resnet50, se-resnet101. (#33) + +### Bug Fixes + +- Fix init_weights in `shufflenet_v2.py`. (#29) +- Fix the parameter `size` in test_pipeline. (#30) +- Fix the parameter in cosine lr schedule. (#32) +- Fix the convert tools for mobilenet_v2. (#34) +- Fix crash in CenterCrop transform when image is greyscale (#40) +- Fix outdated configs. (#53) diff --git a/docs/en/community/CONTRIBUTING.md b/docs/en/community/CONTRIBUTING.md new file mode 120000 index 0000000..c97564d --- /dev/null +++ b/docs/en/community/CONTRIBUTING.md @@ -0,0 +1 @@ +../../../CONTRIBUTING.md \ No newline at end of file diff --git a/docs/en/compatibility.md b/docs/en/compatibility.md new file mode 100644 index 0000000..1affb8e --- /dev/null +++ b/docs/en/compatibility.md @@ -0,0 +1,8 @@ +# Compatibility of MMClassification 0.x + +## MMClassification 0.20.1 + +### MMCV compatibility + +In Twins backbone, we use the `PatchEmbed` module of MMCV, and this module is added after MMCV 1.4.2. +Therefore, we need to update the mmcv version to 1.4.2. diff --git a/docs/en/conf.py b/docs/en/conf.py new file mode 100644 index 0000000..aa1d9f4 --- /dev/null +++ b/docs/en/conf.py @@ -0,0 +1,256 @@ +# flake8: noqa +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import subprocess +import sys + +import pytorch_sphinx_theme +from sphinx.builders.html import StandaloneHTMLBuilder + +sys.path.insert(0, os.path.abspath('../../')) + +# -- Project information ----------------------------------------------------- + +project = 'MMClassification' +copyright = '2020, OpenMMLab' +author = 'MMClassification Authors' + +# The full version, including alpha/beta/rc tags +version_file = '../../mmcls/version.py' + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +release = get_version() + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'myst_parser', + 'sphinx_copybutton', +] + +autodoc_mock_imports = ['mmcv._ext', 'matplotlib'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} + +language = 'en' + +# The master toctree document. +master_doc = 'index' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'pytorch_sphinx_theme' +html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# yapf: disable +html_theme_options = { + 'logo_url': 'https://mmclassification.readthedocs.io/en/latest/', + 'menu': [ + { + 'name': 'GitHub', + 'url': 'https://github.com/open-mmlab/mmclassification' + }, + { + 'name': 'Colab Tutorials', + 'children': [ + { + 'name': 'Train and inference with shell commands', + 'url': 'https://colab.research.google.com/github/open-mmlab/mmclassification/blob/master/docs/en/tutorials/MMClassification_tools.ipynb', + }, + { + 'name': 'Train and inference with Python APIs', + 'url': 'https://colab.research.google.com/github/open-mmlab/mmclassification/blob/master/docs/en/tutorials/MMClassification_python.ipynb', + }, + ] + }, + { + 'name': 'Version', + 'children': [ + { + 'name': 'MMClassification 0.x', + 'url': 'https://mmclassification.readthedocs.io/en/latest/', + 'description': 'master branch' + }, + { + 'name': 'MMClassification 1.x', + 'url': 'https://mmclassification.readthedocs.io/en/dev-1.x/', + 'description': '1.x branch' + }, + ], + } + ], + # Specify the language of shared menu + 'menu_lang': 'en', + 'header_note': { + 'content': + 'You are reading the documentation for MMClassification 0.x, which ' + 'will soon be deprecated at the end of 2022. We recommend you upgrade ' + 'to MMClassification 1.0 to enjoy fruitful new features and better ' + 'performance brought by OpenMMLab 2.0. Check the ' + 'installation tutorial, ' + 'migration tutorial ' + 'and changelog ' + 'for more details.', + } +} +# yapf: enable + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files = ['css/readthedocs.css'] +html_js_files = ['js/custom.js'] + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'mmclsdoc' + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + 'preamble': + r''' +\hypersetup{unicode=true} +\usepackage{CJKutf8} +\DeclareUnicodeCharacter{00A0}{\nobreakspace} +\DeclareUnicodeCharacter{2203}{\ensuremath{\exists}} +\DeclareUnicodeCharacter{2200}{\ensuremath{\forall}} +\DeclareUnicodeCharacter{2286}{\ensuremath{\subseteq}} +\DeclareUnicodeCharacter{2713}{x} +\DeclareUnicodeCharacter{27FA}{\ensuremath{\Longleftrightarrow}} +\DeclareUnicodeCharacter{221A}{\ensuremath{\sqrt{}}} +\DeclareUnicodeCharacter{221B}{\ensuremath{\sqrt[3]{}}} +\DeclareUnicodeCharacter{2295}{\ensuremath{\oplus}} +\DeclareUnicodeCharacter{2297}{\ensuremath{\otimes}} +\begin{CJK}{UTF8}{gbsn} +\AtEndDocument{\end{CJK}} +''', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'mmcls.tex', 'MMClassification Documentation', author, + 'manual'), +] + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [(master_doc, 'mmcls', 'MMClassification Documentation', [author], + 1)] + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'mmcls', 'MMClassification Documentation', author, 'mmcls', + 'OpenMMLab image classification toolbox and benchmark.', 'Miscellaneous'), +] + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# set priority when building html +StandaloneHTMLBuilder.supported_image_types = [ + 'image/svg+xml', 'image/gif', 'image/png', 'image/jpeg' +] + +# -- Extension configuration ------------------------------------------------- +# Ignore >>> when copying code +copybutton_prompt_text = r'>>> |\.\.\. ' +copybutton_prompt_is_regexp = True +# Auto-generated header anchors +myst_heading_anchors = 3 +# Configuration for intersphinx +intersphinx_mapping = { + 'python': ('https://docs.python.org/3', None), + 'numpy': ('https://numpy.org/doc/stable', None), + 'torch': ('https://pytorch.org/docs/stable/', None), + 'mmcv': ('https://mmcv.readthedocs.io/en/master/', None), +} + + +def builder_inited_handler(app): + subprocess.run(['./stat.py']) + + +def setup(app): + app.connect('builder-inited', builder_inited_handler) diff --git a/docs/en/device/npu.md b/docs/en/device/npu.md new file mode 100644 index 0000000..857a3a4 --- /dev/null +++ b/docs/en/device/npu.md @@ -0,0 +1,64 @@ +# NPU (HUAWEI Ascend) + +## Usage + +### General Usage + +Please install MMCV with NPU device support according to {external+mmcv:doc}`the tutorial `. + +Here we use 8 NPUs on your computer to train the model with the following command: + +```shell +bash ./tools/dist_train.sh configs/resnet/resnet50_8xb32_in1k.py 8 --device npu +``` + +Also, you can use only one NPU to train the model with the following command: + +```shell +python ./tools/train.py configs/resnet/resnet50_8xb32_in1k.py --device npu +``` + +### High-performance Usage on ARM server + +Since the scheduling ability of ARM CPUs when processing resource preemption is not as good as that of X86 CPUs during multi-card training, we provide a high-performance startup script to accelerate training with the following command: + +```shell +# The script under the 8 cards of a single machine is shown here +bash tools/dist_train_arm.sh configs/resnet/resnet50_8xb32_in1k.py 8 --device npu --cfg-options data.workers_per_gpu=$(($(nproc)/8)) +``` + +For resnet50 8 NPUs training with batch_size(data.samples_per_gpu)=512, the performance data is shown below: + +| CPU | Start Script | IterTime(s) | +| :------------------ | :------------------------ | :--------------: | +| ARM(Kunpeng920 \*4) | ./tools/dist_train.sh | ~0.9(0.85-1.0) | +| ARM(Kunpeng920 \*4) | ./tools/dist_train_arm.sh | ~0.8(0.78s-0.85) | + +## Models Results + +| Model | Top-1 (%) | Top-5 (%) | Config | Download | +| :---------------------------------------------------------: | :-------: | :-------: | :----------------------------------------------------------: | :-------------------------------------------------------------: | +| [ResNet-50](../papers/resnet.md) | 76.38 | 93.22 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/resnet50_8xb32_in1k.log) | +| [ResNetXt-32x4d-50](../papers/resnext.md) | 77.55 | 93.75 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext50-32x4d_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/resnext50-32x4d_8xb32_in1k.log.json) | +| [HRNet-W18](../papers/hrnet.md) | 77.01 | 93.46 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w18_4xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/hrnet-w18_4xb32_in1k.log.json) | +| [ResNetV1D-152](../papers/resnet.md) | 79.11 | 94.54 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1d152_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/resnetv1d152_8xb32_in1k.log.json) | +| [SE-ResNet-50](../papers/seresnet.md) | 77.64 | 93.76 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/seresnet/seresnet50_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/seresnet50_8xb32_in1k.log.json) | +| [VGG-11](../papers/vgg.md) | 68.92 | 88.83 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg11_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/vgg11_8xb32_in1k.log.json) | +| [ShuffleNetV2 1.0x](../papers/shufflenet_v2.md) | 69.53 | 88.82 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/shufflenet-v2-1x_16xb64_in1k.json) | +| [MobileNetV2](../papers/mobilenet_v2.md) | 71.758 | 90.394 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/mobilenet-v2_8xb32_in1k.json) | +| [MobileNetV3-Small](../papers/mobilenet_v3.md) | 67.522 | 87.316 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mobilenet_v3/mobilenet-v3-small_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/mobilenet-v3-small_8xb32_in1k.json) | +| [\*CSPResNeXt50](../papers/cspnet.md) | 77.10 | 93.55 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/cspnet/cspresnext50_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/cspresnext50_8xb32_in1k.log.json) | +| [\*EfficientNet-B4(AA + AdvProp)](../papers/efficientnet.md) | 75.55 | 92.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b4_8xb32-01norm_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/efficientnet-b4_8xb32-01norm_in1k.log.json) | +| [\*\*DenseNet121](../papers/densenet.md) | 72.62 | 91.04 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet121_4xb256_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/densenet121_4xb256_in1k.log.json) | + +**Notes:** + +- If not specially marked, the results are almost same between results on the NPU and results on the GPU with FP32. +- (\*) The training results of these models are lower than the results on the readme in the corresponding model, mainly + because the results on the readme are directly the weight of the timm of the eval, and the results on this side are + retrained according to the config with mmcls. The results of the config training on the GPU are consistent with the + results of the NPU. +- (\*\*) The accuracy of this model is slightly lower because config is a 4-card config, we use 8 cards to run, and users + can adjust hyperparameters to get the best accuracy results. + +**All above models are provided by Huawei Ascend group.** diff --git a/docs/en/docutils.conf b/docs/en/docutils.conf new file mode 100644 index 0000000..0c00c84 --- /dev/null +++ b/docs/en/docutils.conf @@ -0,0 +1,2 @@ +[html writers] +table_style: colwidths-auto diff --git a/docs/en/faq.md b/docs/en/faq.md new file mode 100644 index 0000000..6bd9822 --- /dev/null +++ b/docs/en/faq.md @@ -0,0 +1,84 @@ +# Frequently Asked Questions + +We list some common troubles faced by many users and their corresponding +solutions here. Feel free to enrich the list if you find any frequent issues +and have ways to help others to solve them. If the contents here do not cover +your issue, please create an issue using the +[provided templates](https://github.com/open-mmlab/mmclassification/issues/new/choose) +and make sure you fill in all required information in the template. + +## Installation + +- Compatibility issue between MMCV and MMClassification; "AssertionError: + MMCV==xxx is used but incompatible. Please install mmcv>=xxx, \<=xxx." + + Compatible MMClassification and MMCV versions are shown as below. Please + choose the correct version of MMCV to avoid installation issues. + + | MMClassification version | MMCV version | + | :----------------------: | :--------------------: | + | dev | mmcv>=1.7.0, \<1.9.0 | + | 0.25.0 (master) | mmcv>=1.4.2, \<1.9.0 | + | 0.24.1 | mmcv>=1.4.2, \<1.9.0 | + | 0.23.2 | mmcv>=1.4.2, \<1.7.0 | + | 0.22.1 | mmcv>=1.4.2, \<1.6.0 | + | 0.21.0 | mmcv>=1.4.2, \<=1.5.0 | + | 0.20.1 | mmcv>=1.4.2, \<=1.5.0 | + | 0.19.0 | mmcv>=1.3.16, \<=1.5.0 | + | 0.18.0 | mmcv>=1.3.16, \<=1.5.0 | + | 0.17.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.16.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.15.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.15.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.14.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.13.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.12.0 | mmcv>=1.3.1, \<=1.5.0 | + | 0.11.1 | mmcv>=1.3.1, \<=1.5.0 | + | 0.11.0 | mmcv>=1.3.0 | + | 0.10.0 | mmcv>=1.3.0 | + | 0.9.0 | mmcv>=1.1.4 | + | 0.8.0 | mmcv>=1.1.4 | + | 0.7.0 | mmcv>=1.1.4 | + | 0.6.0 | mmcv>=1.1.4 | + + ```{note} + Since the `dev` branch is under frequent development, the MMCV + version dependency may be inaccurate. If you encounter problems when using + the `dev` branch, please try to update MMCV to the latest version. + ``` + +- Using Albumentations + + If you would like to use `albumentations`, we suggest using `pip install -r requirements/albu.txt` or + `pip install -U albumentations --no-binary qudida,albumentations`. + + If you simply use `pip install albumentations>=0.3.2`, it will install `opencv-python-headless` simultaneously + (even though you have already installed `opencv-python`). Please refer to the + [official documentation](https://albumentations.ai/docs/getting_started/installation/#note-on-opencv-dependencies) + for details. + +## Coding + +- Do I need to reinstall mmcls after some code modifications? + + If you follow [the best practice](install.md) and install mmcls from source, + any local modifications made to the code will take effect without + reinstallation. + +- How to develop with multiple MMClassification versions? + + Generally speaking, we recommend to use different virtual environments to + manage MMClassification in different working directories. However, you + can also use the same environment to develop MMClassification in different + folders, like mmcls-0.21, mmcls-0.23. When you run the train or test shell script, + it will adopt the mmcls package in the current folder. And when you run other Python + script, you can also add `` PYTHONPATH=`pwd` `` at the beginning of your command + to use the package in the current folder. + + Conversely, to use the default MMClassification installed in the environment + rather than the one you are working with, you can remove the following line + in those shell scripts: + + ```shell + PYTHONPATH="$(dirname $0)/..":$PYTHONPATH + ``` diff --git a/docs/en/getting_started.md b/docs/en/getting_started.md new file mode 100644 index 0000000..4e8a9fc --- /dev/null +++ b/docs/en/getting_started.md @@ -0,0 +1,275 @@ +# Getting Started + +This page provides basic tutorials about the usage of MMClassification. + +## Prepare datasets + +It is recommended to symlink the dataset root to `$MMCLASSIFICATION/data`. +If your folder structure is different, you may need to change the corresponding paths in config files. + +``` +mmclassification +├── mmcls +├── tools +├── configs +├── docs +├── data +│ ├── imagenet +│ │ ├── meta +│ │ ├── train +│ │ ├── val +│ ├── cifar +│ │ ├── cifar-10-batches-py +│ ├── mnist +│ │ ├── train-images-idx3-ubyte +│ │ ├── train-labels-idx1-ubyte +│ │ ├── t10k-images-idx3-ubyte +│ │ ├── t10k-labels-idx1-ubyte + +``` + +For ImageNet, it has multiple versions, but the most commonly used one is [ILSVRC 2012](http://www.image-net.org/challenges/LSVRC/2012/). It can be accessed with the following steps. + +1. Register an account and login to the [download page](http://www.image-net.org/download-images). +2. Find download links for ILSVRC2012 and download the following two files + - ILSVRC2012_img_train.tar (~138GB) + - ILSVRC2012_img_val.tar (~6.3GB) +3. Untar the downloaded files +4. Download meta data using this [script](https://github.com/BVLC/caffe/blob/master/data/ilsvrc12/get_ilsvrc_aux.sh) + +For MNIST, CIFAR10 and CIFAR100, the datasets will be downloaded and unzipped automatically if they are not found. + +For using custom datasets, please refer to [Tutorial 3: Customize Dataset](tutorials/new_dataset.md). + +## Inference with pretrained models + +We provide scripts to inference a single image, inference a dataset and test a dataset (e.g., ImageNet). + +### Inference a single image + +```shell +python demo/image_demo.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} + +# Example +python demo/image_demo.py demo/demo.JPEG configs/resnet/resnet50_8xb32_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth +``` + +### Inference and test a dataset + +- single GPU +- CPU +- single node multiple GPU +- multiple node + +You can use the following commands to infer a dataset. + +```shell +# single-gpu +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--metrics ${METRICS}] [--out ${RESULT_FILE}] + +# CPU: disable GPUs and run single-gpu testing script +export CUDA_VISIBLE_DEVICES=-1 +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--metrics ${METRICS}] [--out ${RESULT_FILE}] + +# multi-gpu +./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--metrics ${METRICS}] [--out ${RESULT_FILE}] + +# multi-node in slurm environment +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--metrics ${METRICS}] [--out ${RESULT_FILE}] --launcher slurm +``` + +Optional arguments: + +- `RESULT_FILE`: Filename of the output results. If not specified, the results will not be saved to a file. Support formats include json, yaml and pickle. +- `METRICS`:Items to be evaluated on the results, like accuracy, precision, recall, etc. + +Examples: + +Infer ResNet-50 on ImageNet validation set to get predicted labels and their corresponding predicted scores. + +```shell +python tools/test.py configs/resnet/resnet50_8xb16_cifar10.py \ + https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_b16x8_cifar10_20210528-f54bfad9.pth \ + --out result.pkl +``` + +## Train a model + +MMClassification implements distributed training and non-distributed training, +which uses `MMDistributedDataParallel` and `MMDataParallel` respectively. + +All outputs (log files and checkpoints) will be saved to the working directory, +which is specified by `work_dir` in the config file. + +By default we evaluate the model on the validation set after each epoch, you can change the evaluation interval by adding the interval argument in the training config. + +```python +evaluation = dict(interval=12) # Evaluate the model per 12 epochs. +``` + +### Train with a single GPU + +```shell +python tools/train.py ${CONFIG_FILE} [optional arguments] +``` + +If you want to specify the working directory in the command, you can add an argument `--work_dir ${YOUR_WORK_DIR}`. + +### Train with CPU + +The process of training on the CPU is consistent with single GPU training. We just need to disable GPUs before the training process. + +```shell +export CUDA_VISIBLE_DEVICES=-1 +``` + +And then run the script [above](#train-with-a-single-gpu). + +```{warning} +The process of training on the CPU is consistent with single GPU training. We just need to disable GPUs before the training process. +``` + +### Train with multiple GPUs in single machine + +```shell +./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments] +``` + +Optional arguments are: + +- `--no-validate` (**not suggested**): By default, the codebase will perform evaluation at every k (default value is 1) epochs during the training. To disable this behavior, use `--no-validate`. +- `--work-dir ${WORK_DIR}`: Override the working directory specified in the config file. +- `--resume-from ${CHECKPOINT_FILE}`: Resume from a previous checkpoint file. + +Difference between `resume-from` and `load-from`: +`resume-from` loads both the model weights and optimizer status, and the epoch is also inherited from the specified checkpoint. It is usually used for resuming the training process that is interrupted accidentally. +`load-from` only loads the model weights and the training epoch starts from 0. It is usually used for finetuning. + +### Train with multiple machines + +If you launch with multiple machines simply connected with ethernet, you can simply run following commands: + +On the first machine: + +```shell +NNODES=2 NODE_RANK=0 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS +``` + +On the second machine: + +```shell +NNODES=2 NODE_RANK=1 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS +``` + +Usually it is slow if you do not have high speed networking like InfiniBand. + +If you run MMClassification on a cluster managed with [slurm](https://slurm.schedmd.com/), you can use the script `slurm_train.sh`. (This script also supports single machine training.) + +```shell +[GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR} +``` + +You can check [slurm_train.sh](https://github.com/open-mmlab/mmclassification/blob/master/tools/slurm_train.sh) for full arguments and environment variables. + +If you have just multiple machines connected with ethernet, you can refer to +PyTorch [launch utility](https://pytorch.org/docs/stable/distributed_deprecated.html#launch-utility). +Usually it is slow if you do not have high speed networking like InfiniBand. + +### Launch multiple jobs on a single machine + +If you launch multiple jobs on a single machine, e.g., 2 jobs of 4-GPU training on a machine with 8 GPUs, +you need to specify different ports (29500 by default) for each job to avoid communication conflict. + +If you use `dist_train.sh` to launch training jobs, you can set the port in commands. + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 +CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4 +``` + +If you use launch training jobs with Slurm, you need to modify the config files (usually the 6th line from the bottom in config files) to set different communication ports. + +In `config1.py`, + +```python +dist_params = dict(backend='nccl', port=29500) +``` + +In `config2.py`, + +```python +dist_params = dict(backend='nccl', port=29501) +``` + +Then you can launch two jobs with `config1.py` ang `config2.py`. + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} +CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} +``` + +### Train with IPU + +The process of training on the IPU is consistent with single GPU training. We just need to have IPU machine and environment +and add an extra argument `--ipu-replicas ${IPU_NUM}` + +## Useful tools + +We provide lots of useful tools under `tools/` directory. + +### Get the FLOPs and params (experimental) + +We provide a script adapted from [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) to compute the FLOPs and params of a given model. + +```shell +python tools/analysis_tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +You will get the result like this. + +``` +============================== +Input shape: (3, 224, 224) +Flops: 4.12 GFLOPs +Params: 25.56 M +============================== +``` + +```{warning} +This tool is still experimental and we do not guarantee that the number is correct. You may well use the result for simple comparisons, but double check it before you adopt it in technical reports or papers. +- FLOPs are related to the input shape while parameters are not. The default input shape is (1, 3, 224, 224). +- Some operators are not counted into FLOPs like GN and custom operators. Refer to [`mmcv.cnn.get_model_complexity_info()`](https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/utils/flops_counter.py) for details. +``` + +### Publish a model + +Before you publish a model, you may want to + +1. Convert model weights to CPU tensors. +2. Delete the optimizer states. +3. Compute the hash of the checkpoint file and append the hash id to the filename. + +```shell +python tools/convert_models/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME} +``` + +E.g., + +```shell +python tools/convert_models/publish_model.py work_dirs/resnet50/latest.pth imagenet_resnet50.pth +``` + +The final output filename will be `imagenet_resnet50_{date}-{hash id}.pth`. + +## Tutorials + +Currently, we provide five tutorials for users. + +- [learn about config](tutorials/config.md) +- [finetune models](tutorials/finetune.md) +- [add new dataset](tutorials/new_dataset.md) +- [design data pipeline](tutorials/data_pipeline.md) +- [add new modules](tutorials/new_modules.md) +- [customize schedule](tutorials/schedule.md) +- [customize runtime settings](tutorials/runtime.md). diff --git a/docs/en/index.rst b/docs/en/index.rst new file mode 100644 index 0000000..d0a15b1 --- /dev/null +++ b/docs/en/index.rst @@ -0,0 +1,99 @@ +Welcome to MMClassification's documentation! +============================================ + +You can switch between Chinese and English documentation in the lower-left corner of the layout. + +您可以在页面左下角切换中英文文档。 + +.. toctree:: + :maxdepth: 1 + :caption: Get Started + + install.md + getting_started.md + + +.. toctree:: + :maxdepth: 1 + :caption: Tutorials + + tutorials/config.md + tutorials/finetune.md + tutorials/new_dataset.md + tutorials/data_pipeline.md + tutorials/new_modules.md + tutorials/schedule.md + tutorials/runtime.md + + +.. toctree:: + :maxdepth: 1 + :caption: Model zoo + :glob: + + modelzoo_statistics.md + model_zoo.md + papers/* + + +.. toctree:: + :maxdepth: 1 + :caption: Useful Tools and Scripts + + tools/pytorch2onnx.md + tools/onnx2tensorrt.md + tools/pytorch2torchscript.md + tools/model_serving.md + tools/visualization.md + tools/analysis.md + tools/miscellaneous.md + + +.. toctree:: + :maxdepth: 1 + :caption: Community + + community/CONTRIBUTING.md + + +.. toctree:: + :maxdepth: 1 + :caption: API Reference + + mmcls.apis + mmcls.core + mmcls.models + mmcls.models.utils + mmcls.datasets + Data Transformations + Batch Augmentation + mmcls.utils + + +.. toctree:: + :maxdepth: 1 + :caption: Notes + + changelog.md + compatibility.md + faq.md + + +.. toctree:: + :maxdepth: 1 + :caption: Device Support + + device/npu.md + +.. toctree:: + :caption: Language Switch + + English + 简体中文 + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/docs/en/install.md b/docs/en/install.md new file mode 100644 index 0000000..bde1a81 --- /dev/null +++ b/docs/en/install.md @@ -0,0 +1,219 @@ +# Prerequisites + +In this section we demonstrate how to prepare an environment with PyTorch. + +MMClassification works on Linux, Windows and macOS. It requires Python 3.6+, CUDA 9.2+ and PyTorch 1.5+. + +```{note} +If you are experienced with PyTorch and have already installed it, just skip this part and jump to the [next section](#installation). Otherwise, you can follow these steps for the preparation. +``` + +**Step 1.** Download and install Miniconda from the [official website](https://docs.conda.io/en/latest/miniconda.html). + +**Step 2.** Create a conda environment and activate it. + +```shell +conda create --name openmmlab python=3.8 -y +conda activate openmmlab +``` + +**Step 3.** Install PyTorch following [official instructions](https://pytorch.org/get-started/locally/), e.g. + +On GPU platforms: + +```shell +conda install pytorch torchvision -c pytorch +``` + +```{warning} +This command will automatically install the latest version PyTorch and cudatoolkit, please check whether they matches your environment. +``` + +On CPU platforms: + +```shell +conda install pytorch torchvision cpuonly -c pytorch +``` + +# Installation + +We recommend that users follow our best practices to install MMClassification. However, the whole process is highly customizable. See [Customize Installation](#customize-installation) section for more information. + +## Best Practices + +**Step 0.** Install [MMCV](https://github.com/open-mmlab/mmcv) using [MIM](https://github.com/open-mmlab/mim). + +```shell +pip install -U openmim +mim install mmcv-full +``` + +**Step 1.** Install MMClassification. + +According to your needs, we support two install modes: + +- [Install from source (Recommended)](#install-from-source): You want to develop your own image classification task or new features based on MMClassification framework. For example, you want to add new dataset or new models. And you can use all tools we provided. +- [Install as a Python package](#install-as-a-python-package): You just want to call MMClassification's APIs or import MMClassification's modules in your project. + +### Install from source + +In this case, install mmcls from source: + +```shell +git clone https://github.com/open-mmlab/mmclassification.git +cd mmclassification +pip install -v -e . +# "-v" means verbose, or more output +# "-e" means installing a project in editable mode, +# thus any local modifications made to the code will take effect without reinstallation. +``` + +Optionally, if you want to contribute to MMClassification or experience experimental functions, please checkout to the dev branch: + +```shell +git checkout dev +``` + +### Install as a Python package + +Just install with pip. + +```shell +pip install mmcls +``` + +## Verify the installation + +To verify whether MMClassification is installed correctly, we provide some sample codes to run an inference demo. + +**Step 1.** We need to download config and checkpoint files. + +```shell +mim download mmcls --config resnet50_8xb32_in1k --dest . +``` + +**Step 2.** Verify the inference demo. + +Option (a). If you install mmcls from source, just run the following command: + +```shell +python demo/image_demo.py demo/demo.JPEG resnet50_8xb32_in1k.py resnet50_8xb32_in1k_20210831-ea4938fc.pth --device cpu +``` + +You will see the output result dict including `pred_label`, `pred_score` and `pred_class` in your terminal. +And if you have graphical interface (instead of remote terminal etc.), you can enable `--show` option to show +the demo image with these predictions in a window. + +Option (b). If you install mmcls as a python package, open you python interpreter and copy&paste the following codes. + +```python +from mmcls.apis import init_model, inference_model + +config_file = 'resnet50_8xb32_in1k.py' +checkpoint_file = 'resnet50_8xb32_in1k_20210831-ea4938fc.pth' +model = init_model(config_file, checkpoint_file, device='cpu') # or device='cuda:0' +inference_model(model, 'demo/demo.JPEG') +``` + +You will see a dict printed, including the predicted label, score and category name. + +## Customize Installation + +### CUDA versions + +When installing PyTorch, you need to specify the version of CUDA. If you are +not clear on which to choose, follow our recommendations: + +- For Ampere-based NVIDIA GPUs, such as GeForce 30 series and NVIDIA A100, CUDA 11 is a must. +- For older NVIDIA GPUs, CUDA 11 is backward compatible, but CUDA 10.2 offers better compatibility and is more lightweight. + +Please make sure the GPU driver satisfies the minimum version requirements. See [this table](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions) for more information. + +```{note} +Installing CUDA runtime libraries is enough if you follow our best practices, +because no CUDA code will be compiled locally. However if you hope to compile +MMCV from source or develop other CUDA operators, you need to install the +complete CUDA toolkit from NVIDIA's [website](https://developer.nvidia.com/cuda-downloads), +and its version should match the CUDA version of PyTorch. i.e., the specified +version of cudatoolkit in `conda install` command. +``` + +### Install MMCV without MIM + +MMCV contains C++ and CUDA extensions, thus depending on PyTorch in a complex +way. MIM solves such dependencies automatically and makes the installation +easier. However, it is not a must. + +To install MMCV with pip instead of MIM, please follow +[MMCV installation guides](https://mmcv.readthedocs.io/en/latest/get_started/installation.html). +This requires manually specifying a find-url based on PyTorch version and its CUDA version. + +For example, the following command install mmcv-full built for PyTorch 1.10.x and CUDA 11.3. + +```shell +pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.10/index.html +``` + +### Install on CPU-only platforms + +MMClassification can be built for CPU only environment. In CPU mode you can +train (requires MMCV version >= 1.4.4), test or inference a model. + +Some functionalities are gone in this mode, usually GPU-compiled ops. But don't +worry, almost all models in MMClassification don't depends on these ops. + +### Install on Google Colab + +[Google Colab](https://research.google.com/) usually has PyTorch installed, +thus we only need to install MMCV and MMClassification with the following +commands. + +**Step 1.** Install [MMCV](https://github.com/open-mmlab/mmcv) using [MIM](https://github.com/open-mmlab/mim). + +```shell +!pip3 install openmim +!mim install mmcv-full +``` + +**Step 2.** Install MMClassification from the source. + +```shell +!git clone https://github.com/open-mmlab/mmclassification.git +%cd mmclassification +!pip install -e . +``` + +**Step 3.** Verification. + +```python +import mmcls +print(mmcls.__version__) +# Example output: 0.23.0 or newer +``` + +```{note} +Within Jupyter, the exclamation mark `!` is used to call external executables and `%cd` is a [magic command](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-cd) to change the current working directory of Python. +``` + +### Using MMClassification with Docker + +We provide a [Dockerfile](https://github.com/open-mmlab/mmclassification/blob/master/docker/Dockerfile) +to build an image. Ensure that your [docker version](https://docs.docker.com/engine/install/) >=19.03. + +```shell +# build an image with PyTorch 1.8.1, CUDA 10.2 +# If you prefer other versions, just modified the Dockerfile +docker build -t mmclassification docker/ +``` + +Run it with + +```shell +docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmclassification/data mmclassification +``` + +## Trouble shooting + +If you have some issues during the installation, please first view the [FAQ](faq.md) page. +You may [open an issue](https://github.com/open-mmlab/mmclassification/issues/new/choose) +on GitHub if no solution is found. diff --git a/docs/en/model_zoo.md b/docs/en/model_zoo.md new file mode 100644 index 0000000..46b42a9 --- /dev/null +++ b/docs/en/model_zoo.md @@ -0,0 +1,162 @@ +# Model Zoo + +## ImageNet + +ImageNet has multiple versions, but the most commonly used one is [ILSVRC 2012](http://www.image-net.org/challenges/LSVRC/2012/). +The ResNet family models below are trained by standard data augmentations, i.e., RandomResizedCrop, RandomHorizontalFlip and Normalize. + +| Model | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) | Config | Download | +| :--------------------------------: | :-------------------------------: | :-----------------------------: | :-------: | :-------: | :---------------------------------------: | :-----------------------------------------: | +| VGG-11 | 132.86 | 7.63 | 68.75 | 88.87 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg11_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_batch256_imagenet_20210208-4271cd6c.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_batch256_imagenet_20210208-4271cd6c.log.json) | +| VGG-13 | 133.05 | 11.34 | 70.02 | 89.46 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg13_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_batch256_imagenet_20210208-4d1d6080.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_batch256_imagenet_20210208-4d1d6080.log.json) | +| VGG-16 | 138.36 | 15.5 | 71.62 | 90.49 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg16_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_batch256_imagenet_20210208-db26f1a5.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_batch256_imagenet_20210208-db26f1a5.log.json) | +| VGG-19 | 143.67 | 19.67 | 72.41 | 90.80 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg19_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_batch256_imagenet_20210208-e6920e4a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_batch256_imagenet_20210208-e6920e4a.log.json) | +| VGG-11-BN | 132.87 | 7.64 | 70.75 | 90.12 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg11bn_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_bn_batch256_imagenet_20210207-f244902c.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg11_bn_batch256_imagenet_20210207-f244902c.log.json) | +| VGG-13-BN | 133.05 | 11.36 | 72.15 | 90.71 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg13bn_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_bn_batch256_imagenet_20210207-1a8b7864.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg13_bn_batch256_imagenet_20210207-1a8b7864.log.json) | +| VGG-16-BN | 138.37 | 15.53 | 73.72 | 91.68 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg16_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_bn_batch256_imagenet_20210208-7e55cd29.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg16_bn_batch256_imagenet_20210208-7e55cd29.log.json) | +| VGG-19-BN | 143.68 | 19.7 | 74.70 | 92.24 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg19bn_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_bn_batch256_imagenet_20210208-da620c4f.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/vgg/vgg19_bn_batch256_imagenet_20210208-da620c4f.log.json) | +| RepVGG-A0\* | 9.11(train) \| 8.31 (deploy) | 1.52 (train) \| 1.36 (deploy) | 72.41 | 90.50 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-A0_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-A0_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-A0_3rdparty_4xb64-coslr-120e_in1k_20210909-883ab98c.pth) | +| RepVGG-A1\* | 14.09 (train) \| 12.79 (deploy) | 2.64 (train) \| 2.37 (deploy) | 74.47 | 91.85 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-A1_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-A1_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-A1_3rdparty_4xb64-coslr-120e_in1k_20210909-24003a24.pth) | +| RepVGG-A2\* | 28.21 (train) \| 25.5 (deploy) | 5.7 (train) \| 5.12 (deploy) | 76.48 | 93.01 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-A2_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-A2_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-A2_3rdparty_4xb64-coslr-120e_in1k_20210909-97d7695a.pth) | +| RepVGG-B0\* | 15.82 (train) \| 14.34 (deploy) | 3.42 (train) \| 3.06 (deploy) | 75.14 | 92.42 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B0_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B0_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B0_3rdparty_4xb64-coslr-120e_in1k_20210909-446375f4.pth) | +| RepVGG-B1\* | 57.42 (train) \| 51.83 (deploy) | 13.16 (train) \| 11.82 (deploy) | 78.37 | 94.11 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B1_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B1_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B1_3rdparty_4xb64-coslr-120e_in1k_20210909-750cdf67.pth) | +| RepVGG-B1g2\* | 45.78 (train) \| 41.36 (deploy) | 9.82 (train) \| 8.82 (deploy) | 77.79 | 93.88 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B1g2_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B1g2_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B1g2_3rdparty_4xb64-coslr-120e_in1k_20210909-344f6422.pth) | +| RepVGG-B1g4\* | 39.97 (train) \| 36.13 (deploy) | 8.15 (train) \| 7.32 (deploy) | 77.58 | 93.84 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B1g4_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B1g4_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B1g4_3rdparty_4xb64-coslr-120e_in1k_20210909-d4c1a642.pth) | +| RepVGG-B2\* | 89.02 (train) \| 80.32 (deploy) | 20.46 (train) \| 18.39 (deploy) | 78.78 | 94.42 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B2_4xb64-coslr-120e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B2_deploy_4xb64-coslr-120e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B2_3rdparty_4xb64-coslr-120e_in1k_20210909-bd6b937c.pth) | +| RepVGG-B2g4\* | 61.76 (train) \| 55.78 (deploy) | 12.63 (train) \| 11.34 (deploy) | 79.38 | 94.68 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B2g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B2g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B2g4_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-7b7955f0.pth) | +| RepVGG-B3\* | 123.09 (train) \| 110.96 (deploy) | 29.17 (train) \| 26.22 (deploy) | 80.52 | 95.26 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B3_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B3_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B3_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-dda968bf.pth) | +| RepVGG-B3g4\* | 83.83 (train) \| 75.63 (deploy) | 17.9 (train) \| 16.08 (deploy) | 80.22 | 95.10 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-B3g4_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-B3g4_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-4e54846a.pth) | +| RepVGG-D2se\* | 133.33 (train) \| 120.39 (deploy) | 36.56 (train) \| 32.85 (deploy) | 81.81 | 95.94 | [config (train)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/repvgg-D2se_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) \| [config (deploy)](https://github.com/open-mmlab/mmclassification/blob/master/configs/repvgg/deploy/repvgg-D2se_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/repvgg/repvgg-D2se_3rdparty_4xb64-autoaug-lbs-mixup-coslr-200e_in1k_20210909-cf3139b7.pth) | +| ResNet-18 | 11.69 | 1.82 | 70.07 | 89.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet18_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_batch256_imagenet_20200708-34ab8f90.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_batch256_imagenet_20200708-34ab8f90.log.json) | +| ResNet-34 | 21.8 | 3.68 | 73.85 | 91.53 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet34_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet34_batch256_imagenet_20200708-32ffb4f7.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet34_batch256_imagenet_20200708-32ffb4f7.log.json) | +| ResNet-50 (rsb-a1) | 25.56 | 4.12 | 80.12 | 94.78 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb256-rsb-a1-600e_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.log.json) | +| ResNet-101 | 44.55 | 7.85 | 78.18 | 94.03 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_batch256_imagenet_20200708-753f3608.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet101_batch256_imagenet_20200708-753f3608.log.json) | +| ResNet-152 | 60.19 | 11.58 | 78.63 | 94.16 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet152_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnet152_batch256_imagenet_20200708-ec25b1f9.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnet152_batch256_imagenet_20200708-ec25b1f9.log.json) | +| Res2Net-50-14w-8s\* | 25.06 | 4.22 | 78.14 | 93.85 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/res2net/res2net50-w14-s8_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/res2net/res2net50-w14-s8_3rdparty_8xb32_in1k_20210927-bc967bf1.pth) | +| Res2Net-50-26w-8s\* | 48.40 | 8.39 | 79.20 | 94.36 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/res2net/res2net50-w26-s8_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/res2net/res2net50-w26-s8_3rdparty_8xb32_in1k_20210927-f547a94b.pth) | +| Res2Net-101-26w-4s\* | 45.21 | 8.12 | 79.19 | 94.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/res2net/res2net101-w26-s4_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/res2net/res2net101-w26-s4_3rdparty_8xb32_in1k_20210927-870b6c36.pth) | +| ResNeSt-50\* | 27.48 | 5.41 | 81.13 | 95.59 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnest/resnest50_32xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnest/resnest50_imagenet_converted-1ebf0afe.pth) | +| ResNeSt-101\* | 48.28 | 10.27 | 82.32 | 96.24 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnest/resnest101_32xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnest/resnest101_imagenet_converted-032caa52.pth) | +| ResNeSt-200\* | 70.2 | 17.53 | 82.41 | 96.22 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnest/resnest200_64xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnest/resnest200_imagenet_converted-581a60f2.pth) | +| ResNeSt-269\* | 110.93 | 22.58 | 82.70 | 96.28 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnest/resnest269_64xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnest/resnest269_imagenet_converted-59930960.pth) | +| ResNetV1D-50 | 25.58 | 4.36 | 77.54 | 93.57 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1d50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d50_b32x8_imagenet_20210531-db14775a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d50_b32x8_imagenet_20210531-db14775a.log.json) | +| ResNetV1D-101 | 44.57 | 8.09 | 78.93 | 94.48 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1d101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d101_b32x8_imagenet_20210531-6e13bcd3.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d101_b32x8_imagenet_20210531-6e13bcd3.log.json) | +| ResNetV1D-152 | 60.21 | 11.82 | 79.41 | 94.7 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1d152_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d152_b32x8_imagenet_20210531-278cf22a.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnet/resnetv1d152_b32x8_imagenet_20210531-278cf22a.log.json) | +| ResNeXt-32x4d-50 | 25.03 | 4.27 | 77.90 | 93.66 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext50-32x4d_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnext/resnext50_32x4d_b32x8_imagenet_20210429-56066e27.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnext/resnext50_32x4d_b32x8_imagenet_20210429-56066e27.log.json) | +| ResNeXt-32x4d-101 | 44.18 | 8.03 | 78.71 | 94.12 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext101-32x4d_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x4d_b32x8_imagenet_20210506-e0fa3dd5.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x4d_b32x8_imagenet_20210506-e0fa3dd5.log.json) | +| ResNeXt-32x8d-101 | 88.79 | 16.5 | 79.23 | 94.58 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext101-32x8d_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x8d_b32x8_imagenet_20210506-23a247d5.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnext/resnext101_32x8d_b32x8_imagenet_20210506-23a247d5.log.json) | +| ResNeXt-32x4d-152 | 59.95 | 11.8 | 78.93 | 94.41 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext152-32x4d_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/resnext/resnext152_32x4d_b32x8_imagenet_20210524-927787be.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/resnext/resnext152_32x4d_b32x8_imagenet_20210524-927787be.log.json) | +| SE-ResNet-50 | 28.09 | 4.13 | 77.74 | 93.84 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/seresnet/seresnet50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet50_batch256_imagenet_20200804-ae206104.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet50_batch256_imagenet_20200708-657b3c36.log.json) | +| SE-ResNet-101 | 49.33 | 7.86 | 78.26 | 94.07 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/seresnet/seresnet101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet101_batch256_imagenet_20200804-ba5b51d4.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/se-resnet/se-resnet101_batch256_imagenet_20200708-038a4d04.log.json) | +| RegNetX-400MF | 5.16 | 0.41 | 72.56 | 90.78 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-400mf_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-400mf_8xb128_in1k_20211213-89bfc226.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-400mf_8xb128_in1k_20211208_143316.log.json) | +| RegNetX-800MF | 7.26 | 0.81 | 74.76 | 92.32 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-800mf_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-800mf_8xb128_in1k_20211213-222b0f11.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-800mf_8xb128_in1k_20211207_143037.log.json) | +| RegNetX-1.6GF | 9.19 | 1.63 | 76.84 | 93.31 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-1.6gf_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-1.6gf_8xb128_in1k_20211213-d1b89758.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-1.6gf_8xb128_in1k_20211208_143018.log.json) | +| RegNetX-3.2GF | 15.3 | 3.21 | 78.09 | 94.08 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-3.2gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-3.2gf_8xb64_in1k_20211213-1fdd82ae.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-3.2gf_8xb64_in1k_20211208_142720.log.json) | +| RegNetX-4.0GF | 22.12 | 4.0 | 78.60 | 94.17 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-4.0gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-4.0gf_8xb64_in1k_20211213-efed675c.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-4.0gf_8xb64_in1k_20211207_150431.log.json) | +| RegNetX-6.4GF | 26.21 | 6.51 | 79.38 | 94.65 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-6.4gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-6.4gf_8xb64_in1k_20211215-5c6089da.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-6.4gf_8xb64_in1k_20211213_172748.log.json) | +| RegNetX-8.0GF | 39.57 | 8.03 | 79.12 | 94.51 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-8.0gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-8.0gf_8xb64_in1k_20211213-9a9fcc76.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-8.0gf_8xb64_in1k_20211208_103250.log.json) | +| RegNetX-12GF | 46.11 | 12.15 | 79.67 | 95.03 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/regnet/regnetx-12gf_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-12gf_8xb64_in1k_20211213-5df8c2f8.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/regnet/regnetx-12gf_8xb64_in1k_20211208_143713.log.json) | +| ShuffleNetV1 1.0x (group=3) | 1.87 | 0.146 | 68.13 | 87.81 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/shufflenet_v1/shufflenet_v1_batch1024_imagenet_20200804-5d6cec73.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/shufflenet_v1/shufflenet_v1_batch1024_imagenet_20200804-5d6cec73.log.json) | +| ShuffleNetV2 1.0x | 2.28 | 0.149 | 69.55 | 88.92 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/shufflenet_v2/shufflenet_v2_batch1024_imagenet_20200812-5bf4721e.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/shufflenet_v2/shufflenet_v2_batch1024_imagenet_20200804-8860eec9.log.json) | +| MobileNet V2 | 3.5 | 0.319 | 71.86 | 90.42 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.log.json) | +| ViT-B/16\* | 86.86 | 33.03 | 85.43 | 97.77 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vision_transformer/vit-base-p16_ft-64xb64_in1k-384.py) | [model](https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-base-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-98e8652b.pth) | +| ViT-B/32\* | 88.3 | 8.56 | 84.01 | 97.08 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vision_transformer/vit-base-p32_ft-64xb64_in1k-384.py) | [model](https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-base-p32_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-9cea8599.pth) | +| ViT-L/16\* | 304.72 | 116.68 | 85.63 | 97.63 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vision_transformer/vit-large-p16_ft-64xb64_in1k-384.py) | [model](https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-large-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-b20ba619.pth) | +| Swin-Transformer tiny | 28.29 | 4.36 | 81.18 | 95.61 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-tiny_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_tiny_224_b16x64_300e_imagenet_20210616_090925-66df6be6.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_tiny_224_b16x64_300e_imagenet_20210616_090925.log.json) | +| Swin-Transformer small | 49.61 | 8.52 | 83.02 | 96.29 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin-small_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_small_224_b16x64_300e_imagenet_20210615_110219-7f9d988b.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_small_224_b16x64_300e_imagenet_20210615_110219.log.json) | +| Swin-Transformer base | 87.77 | 15.14 | 83.36 | 96.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py) | [model](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_base_224_b16x64_300e_imagenet_20210616_190742-93230b0d.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_base_224_b16x64_300e_imagenet_20210616_190742.log.json) | +| Transformer in Transformer small\* | 23.76 | 3.36 | 81.52 | 95.73 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/tnt/tnt-s-p16_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/tnt/tnt-small-p16_3rdparty_in1k_20210903-c56ee7df.pth) | +| T2T-ViT_t-14 | 21.47 | 4.34 | 81.83 | 95.84 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-14_8xb64_in1k_20211220-f7378dd5.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-14_8xb64_in1k_20211220-f7378dd5.log.json) | +| T2T-ViT_t-19 | 39.08 | 7.80 | 82.63 | 96.18 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/t2t_vit/t2t-vit-t-19_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-19_8xb64_in1k_20211214-7f5e3aaf.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-19_8xb64_in1k_20211214-7f5e3aaf.log.json) | +| T2T-ViT_t-24 | 64.00 | 12.69 | 82.71 | 96.09 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/t2t_vit/t2t-vit-t-24_8xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-24_8xb64_in1k_20211214-b2a68ae3.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-24_8xb64_in1k_20211214-b2a68ae3.log.json) | +| Mixer-B/16\* | 59.88 | 12.61 | 76.68 | 92.25 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mlp_mixer/mlp-mixer-base-p16_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mlp-mixer/mixer-base-p16_3rdparty_64xb64_in1k_20211124-1377e3e0.pth) | +| Mixer-L/16\* | 208.2 | 44.57 | 72.34 | 88.02 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mlp_mixer/mlp-mixer-large-p16_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mlp-mixer/mixer-large-p16_3rdparty_64xb64_in1k_20211124-5a2519d2.pth) | +| DeiT-tiny | 5.72 | 1.08 | 74.50 | 92.24 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-tiny_pt-4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-tiny_pt-4xb256_in1k_20220218-13b382a0.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/deit/deit-tiny_pt-4xb256_in1k_20220218-13b382a0.log.json) | +| DeiT-tiny distilled\* | 5.72 | 1.08 | 74.51 | 91.90 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-tiny-distilled_pt-4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-tiny-distilled_3rdparty_pt-4xb256_in1k_20211216-c429839a.pth) | +| DeiT-small | 22.05 | 4.24 | 80.69 | 95.06 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-small_pt-4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-small_pt-4xb256_in1k_20220218-9425b9bb.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/deit/deit-small_pt-4xb256_in1k_20220218-9425b9bb.log.json) | +| DeiT-small distilled\* | 22.05 | 4.24 | 81.17 | 95.40 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-small-distilled_pt-4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-small-distilled_3rdparty_pt-4xb256_in1k_20211216-4de1d725.pth) | +| DeiT-base | 86.57 | 16.86 | 81.76 | 95.81 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-base_pt-16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-base_pt-16xb64_in1k_20220216-db63c16c.pth) \| [log](https://download.openmmlab.com/mmclassification/v0/deit/deit-base_pt-16xb64_in1k_20220216-db63c16c.log.json) | +| DeiT-base distilled\* | 86.57 | 16.86 | 83.33 | 96.49 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-base-distilled_pt-16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-base-distilled_3rdparty_pt-16xb64_in1k_20211216-42891296.pth) | +| DeiT-base 384px\* | 86.86 | 49.37 | 83.04 | 96.31 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-base_ft-16xb32_in1k-384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-base_3rdparty_ft-16xb32_in1k-384px_20211124-822d02f2.pth) | +| DeiT-base distilled 384px\* | 86.86 | 49.37 | 85.55 | 97.35 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/deit/deit-base-distilled_ft-16xb32_in1k-384px.py) | [model](https://download.openmmlab.com/mmclassification/v0/deit/deit-base-distilled_3rdparty_ft-16xb32_in1k-384px_20211216-e48d6000.pth) | +| Conformer-tiny-p16\* | 23.52 | 4.90 | 81.31 | 95.60 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/conformer/conformer-tiny-p16_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/conformer/conformer-tiny-p16_3rdparty_8xb128_in1k_20211206-f6860372.pth) | +| Conformer-small-p32\* | 38.85 | 7.09 | 81.96 | 96.02 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/conformer/conformer-small-p32_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/conformer/conformer-small-p32_8xb128_in1k_20211206-947a0816.pth) | +| Conformer-small-p16\* | 37.67 | 10.31 | 83.32 | 96.46 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/conformer/conformer-small-p16_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/conformer/conformer-small-p16_3rdparty_8xb128_in1k_20211206-3065dcf5.pth) | +| Conformer-base-p16\* | 83.29 | 22.89 | 83.82 | 96.59 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/conformer/conformer-base-p16_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/conformer/conformer-base-p16_3rdparty_8xb128_in1k_20211206-bfdf8637.pth) | +| PCPVT-small\* | 24.11 | 3.67 | 81.14 | 95.69 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-pcpvt-small_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-pcpvt-small_3rdparty_8xb128_in1k_20220126-ef23c132.pth) | +| PCPVT-base\* | 43.83 | 6.45 | 82.66 | 96.26 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-pcpvt-base_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-pcpvt-base_3rdparty_8xb128_in1k_20220126-f8c4b0d5.pth) | +| PCPVT-large\* | 60.99 | 9.51 | 83.09 | 96.59 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-pcpvt-large_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-pcpvt-large_3rdparty_16xb64_in1k_20220126-c1ef8d80.pth) | +| SVT-small\* | 24.06 | 2.82 | 81.77 | 95.57 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-svt-small_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-svt-small_3rdparty_8xb128_in1k_20220126-8fe5205b.pth) | +| SVT-base\* | 56.07 | 8.35 | 83.13 | 96.29 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-svt-base_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-svt-base_3rdparty_8xb128_in1k_20220126-e31cc8e9.pth) | +| SVT-large\* | 99.27 | 14.82 | 83.60 | 96.50 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/twins/twins-svt-large_16xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/twins/twins-svt-large_3rdparty_16xb64_in1k_20220126-4817645f.pth) | +| EfficientNet-B0\* | 5.29 | 0.02 | 76.74 | 93.17 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b0_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32_in1k_20220119-a7e2a0b1.pth) | +| EfficientNet-B0 (AA)\* | 5.29 | 0.02 | 77.26 | 93.41 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b0_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa_in1k_20220119-8d939117.pth) | +| EfficientNet-B0 (AA + AdvProp)\* | 5.29 | 0.02 | 77.53 | 93.61 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b0_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b0_3rdparty_8xb32-aa-advprop_in1k_20220119-26434485.pth) | +| EfficientNet-B1\* | 7.79 | 0.03 | 78.68 | 94.28 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b1_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b1_3rdparty_8xb32_in1k_20220119-002556d9.pth) | +| EfficientNet-B1 (AA)\* | 7.79 | 0.03 | 79.20 | 94.42 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b1_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b1_3rdparty_8xb32-aa_in1k_20220119-619d8ae3.pth) | +| EfficientNet-B1 (AA + AdvProp)\* | 7.79 | 0.03 | 79.52 | 94.43 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b1_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b1_3rdparty_8xb32-aa-advprop_in1k_20220119-5715267d.pth) | +| EfficientNet-B2\* | 9.11 | 0.03 | 79.64 | 94.80 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b2_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b2_3rdparty_8xb32_in1k_20220119-ea374a30.pth) | +| EfficientNet-B2 (AA)\* | 9.11 | 0.03 | 80.21 | 94.96 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b2_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b2_3rdparty_8xb32-aa_in1k_20220119-dd61e80b.pth) | +| EfficientNet-B2 (AA + AdvProp)\* | 9.11 | 0.03 | 80.45 | 95.07 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b2_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b2_3rdparty_8xb32-aa-advprop_in1k_20220119-1655338a.pth) | +| EfficientNet-B3\* | 12.23 | 0.06 | 81.01 | 95.34 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b3_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32_in1k_20220119-4b4d7487.pth) | +| EfficientNet-B3 (AA)\* | 12.23 | 0.06 | 81.58 | 95.67 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b3_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa_in1k_20220119-5b4887a0.pth) | +| EfficientNet-B3 (AA + AdvProp)\* | 12.23 | 0.06 | 81.81 | 95.69 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b3_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa-advprop_in1k_20220119-53b41118.pth) | +| EfficientNet-B4\* | 19.34 | 0.12 | 82.57 | 96.09 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b4_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b4_3rdparty_8xb32_in1k_20220119-81fd4077.pth) | +| EfficientNet-B4 (AA)\* | 19.34 | 0.12 | 82.95 | 96.26 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b4_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b4_3rdparty_8xb32-aa_in1k_20220119-45b8bd2b.pth) | +| EfficientNet-B4 (AA + AdvProp)\* | 19.34 | 0.12 | 83.25 | 96.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b4_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b4_3rdparty_8xb32-aa-advprop_in1k_20220119-38c2238c.pth) | +| EfficientNet-B5\* | 30.39 | 0.24 | 83.18 | 96.47 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b5_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b5_3rdparty_8xb32_in1k_20220119-e9814430.pth) | +| EfficientNet-B5 (AA)\* | 30.39 | 0.24 | 83.82 | 96.76 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b5_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b5_3rdparty_8xb32-aa_in1k_20220119-2cab8b78.pth) | +| EfficientNet-B5 (AA + AdvProp)\* | 30.39 | 0.24 | 84.21 | 96.98 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b5_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b5_3rdparty_8xb32-aa-advprop_in1k_20220119-f57a895a.pth) | +| EfficientNet-B6 (AA)\* | 43.04 | 0.41 | 84.05 | 96.82 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b6_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b6_3rdparty_8xb32-aa_in1k_20220119-45b03310.pth) | +| EfficientNet-B6 (AA + AdvProp)\* | 43.04 | 0.41 | 84.74 | 97.14 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b6_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b6_3rdparty_8xb32-aa-advprop_in1k_20220119-bfe3485e.pth) | +| EfficientNet-B7 (AA)\* | 66.35 | 0.72 | 84.38 | 96.88 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b7_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b7_3rdparty_8xb32-aa_in1k_20220119-bf03951c.pth) | +| EfficientNet-B7 (AA + AdvProp)\* | 66.35 | 0.72 | 85.14 | 97.23 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b7_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b7_3rdparty_8xb32-aa-advprop_in1k_20220119-c6dbff10.pth) | +| EfficientNet-B8 (AA + AdvProp)\* | 87.41 | 1.09 | 85.38 | 97.28 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b8_8xb32-01norm_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b8_3rdparty_8xb32-aa-advprop_in1k_20220119-297ce1b7.pth) | +| ConvNeXt-T\* | 28.59 | 4.46 | 82.05 | 95.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-tiny_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-tiny_3rdparty_32xb128_in1k_20220124-18abde00.pth) | +| ConvNeXt-S\* | 50.22 | 8.69 | 83.13 | 96.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-small_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-small_3rdparty_32xb128_in1k_20220124-d39b5192.pth) | +| ConvNeXt-B\* | 88.59 | 15.36 | 83.85 | 96.74 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-base_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_3rdparty_32xb128_in1k_20220124-d0915162.pth) | +| ConvNeXt-B\* | 88.59 | 15.36 | 85.81 | 97.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-base_32xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-base_in21k-pre-3rdparty_32xb128_in1k_20220124-eb2d6ada.pth) | +| ConvNeXt-L\* | 197.77 | 34.37 | 84.30 | 96.89 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-large_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-large_3rdparty_64xb64_in1k_20220124-f8a0ded0.pth) | +| ConvNeXt-L\* | 197.77 | 34.37 | 86.61 | 98.04 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-large_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-large_in21k-pre-3rdparty_64xb64_in1k_20220124-2412403d.pth) | +| ConvNeXt-XL\* | 350.20 | 60.93 | 86.97 | 98.20 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/convnext/convnext-xlarge_64xb64_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/convnext/convnext-xlarge_in21k-pre-3rdparty_64xb64_in1k_20220124-76b6863d.pth) | +| HRNet-W18\* | 21.30 | 4.33 | 76.75 | 93.44 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w18_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w18_3rdparty_8xb32_in1k_20220120-0c10b180.pth) | +| HRNet-W30\* | 37.71 | 8.17 | 78.19 | 94.22 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w30_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w30_3rdparty_8xb32_in1k_20220120-8aa3832f.pth) | +| HRNet-W32\* | 41.23 | 8.99 | 78.44 | 94.19 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w32_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w32_3rdparty_8xb32_in1k_20220120-c394f1ab.pth) | +| HRNet-W40\* | 57.55 | 12.77 | 78.94 | 94.47 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w40_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w40_3rdparty_8xb32_in1k_20220120-9a2dbfc5.pth) | +| HRNet-W44\* | 67.06 | 14.96 | 78.88 | 94.37 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w44_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w44_3rdparty_8xb32_in1k_20220120-35d07f73.pth) | +| HRNet-W48\* | 77.47 | 17.36 | 79.32 | 94.52 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w48_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w48_3rdparty_8xb32_in1k_20220120-e555ef50.pth) | +| HRNet-W64\* | 128.06 | 29.00 | 79.46 | 94.65 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w64_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w64_3rdparty_8xb32_in1k_20220120-19126642.pth) | +| HRNet-W18 (ssld)\* | 21.30 | 4.33 | 81.06 | 95.70 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w18_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w18_3rdparty_8xb32-ssld_in1k_20220120-455f69ea.pth) | +| HRNet-W48 (ssld)\* | 77.47 | 17.36 | 83.63 | 96.79 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w48_4xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/hrnet/hrnet-w48_3rdparty_8xb32-ssld_in1k_20220120-d0459c38.pth) | +| WRN-50\* | 68.88 | 11.44 | 81.45 | 95.53 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/wrn/wide-resnet50_timm_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/wrn/wide-resnet50_3rdparty-timm_8xb32_in1k_20220304-83ae4399.pth) | +| WRN-101\* | 126.89 | 22.81 | 78.84 | 94.28 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/wrn/wide-resnet101_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/wrn/wide-resnet101_3rdparty_8xb32_in1k_20220304-8d5f9d61.pth) | +| CSPDarkNet50\* | 27.64 | 5.04 | 80.05 | 95.07 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/cspnet/cspdarknet50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/cspnet/cspdarknet50_3rdparty_8xb32_in1k_20220329-bd275287.pth) | +| CSPResNet50\* | 21.62 | 3.48 | 79.55 | 94.68 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/cspnet/cspresnet50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/cspnet/cspresnet50_3rdparty_8xb32_in1k_20220329-dd6dddfb.pth) | +| CSPResNeXt50\* | 20.57 | 3.11 | 79.96 | 94.96 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/cspnet/cspresnext50_8xb32_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/cspnet/cspresnext50_3rdparty_8xb32_in1k_20220329-2cc84d21.pth) | +| DenseNet121\* | 7.98 | 2.88 | 74.96 | 92.21 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet121_4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/densenet/densenet121_4xb256_in1k_20220426-07450f99.pth) | +| DenseNet169\* | 14.15 | 3.42 | 76.08 | 93.11 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet169_4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/densenet/densenet169_4xb256_in1k_20220426-a2889902.pth) | +| DenseNet201\* | 20.01 | 4.37 | 77.32 | 93.64 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet201_4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/densenet/densenet201_4xb256_in1k_20220426-05cae4ef.pth) | +| DenseNet161\* | 28.68 | 7.82 | 77.61 | 93.83 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet161_4xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/densenet/densenet161_4xb256_in1k_20220426-ee6a80a9.pth) | +| VAN-T\* | 4.11 | 0.88 | 75.41 | 93.02 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/van/van-tiny_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/van/van-tiny_8xb128_in1k_20220501-385941af.pth) | +| VAN-S\* | 13.86 | 2.52 | 81.01 | 95.63 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/van/van-small_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/van/van-small_8xb128_in1k_20220501-17bc91aa.pth) | +| VAN-B\* | 26.58 | 5.03 | 82.80 | 96.21 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/van/van-base_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/van/van-base_8xb128_in1k_20220501-6a4cc31b.pth) | +| VAN-L\* | 44.77 | 8.99 | 83.86 | 96.73 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/van/van-large_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/van/van-large_8xb128_in1k_20220501-f212ba21.pth) | +| MViTv2-tiny\* | 24.17 | 4.70 | 82.33 | 96.15 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mvit/mvitv2-tiny_8xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-tiny_3rdparty_in1k_20220722-db7beeef.pth) | +| MViTv2-small\* | 34.87 | 7.00 | 83.63 | 96.51 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mvit/mvitv2-small_8xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-small_3rdparty_in1k_20220722-986bd741.pth) | +| MViTv2-base\* | 51.47 | 10.20 | 84.34 | 96.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mvit/mvitv2-base_8xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-base_3rdparty_in1k_20220722-9c4f0a17.pth) | +| MViTv2-large\* | 217.99 | 42.10 | 85.25 | 97.14 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/mvit/mvitv2-large_8xb256_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/mvit/mvitv2-large_3rdparty_in1k_20220722-2b57b983.pth) | +| EfficientFormer-l1\* | 12.19 | 1.30 | 80.46 | 94.99 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientformer/efficientformer-l1_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientformer/efficientformer-l1_3rdparty_in1k_20220803-d66e61df.pth) | +| EfficientFormer-l3\* | 31.41 | 3.93 | 82.45 | 96.18 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientformer/efficientformer-l3_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientformer/efficientformer-l3_3rdparty_in1k_20220803-dde1c8c5.pth) | +| EfficientFormer-l7\* | 82.23 | 10.16 | 83.40 | 96.60 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientformer/efficientformer-l7_8xb128_in1k.py) | [model](https://download.openmmlab.com/mmclassification/v0/efficientformer/efficientformer-l7_3rdparty_in1k_20220803-41a552bb.pth) | + +*Models with * are converted from other repos, others are trained by ourselves.* + +## CIFAR10 + +| Model | Params(M) | Flops(G) | Top-1 (%) | Config | Download | +| :--------------: | :-------: | :------: | :-------: | :----: | :------------------------------------------------------------------------------------------------------------: | +| ResNet-18-b16x8 | 11.17 | 0.56 | 94.82 | | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet18_8xb16_cifar10.py) | +| ResNet-34-b16x8 | 21.28 | 1.16 | 95.34 | | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet34_8xb16_cifar10.py) | +| ResNet-50-b16x8 | 23.52 | 1.31 | 95.55 | | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb16_cifar10.py) | +| ResNet-101-b16x8 | 42.51 | 2.52 | 95.58 | | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet101_8xb16_cifar10.py) | +| ResNet-152-b16x8 | 58.16 | 3.74 | 95.76 | | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet152_8xb16_cifar10.py) | diff --git a/docs/en/stat.py b/docs/en/stat.py new file mode 100755 index 0000000..8f1e5b2 --- /dev/null +++ b/docs/en/stat.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python +import functools as func +import glob +import os +import re +from pathlib import Path + +import numpy as np + +MMCLS_ROOT = Path(__file__).absolute().parents[1] +url_prefix = 'https://github.com/open-mmlab/mmclassification/blob/master/' + +papers_root = Path('papers') +papers_root.mkdir(exist_ok=True) +files = [Path(f) for f in sorted(glob.glob('../../configs/*/README.md'))] + +stats = [] +titles = [] +num_ckpts = 0 +num_configs = 0 + +for f in files: + with open(f, 'r') as content_file: + content = content_file.read() + + # Extract checkpoints + ckpts = set(x.lower().strip() + for x in re.findall(r'\[model\]\((https?.*)\)', content)) + if len(ckpts) == 0: + continue + num_ckpts += len(ckpts) + + # Extract paper title + match_res = list(re.finditer(r'> \[(.*)\]\((.*)\)', content)) + if len(match_res) > 0: + title, paperlink = match_res[0].groups() + else: + title = content.split('\n')[0].replace('# ', '').strip() + paperlink = None + titles.append(title) + + # Replace paper link to a button + if paperlink is not None: + start = match_res[0].start() + end = match_res[0].end() + # link_button = f'{title}' + link_button = f'[{title}]({paperlink})' + content = content[:start] + link_button + content[end:] + + # Extract paper type + _papertype = [x for x in re.findall(r'\[([A-Z]+)\]', content)] + assert len(_papertype) > 0 + papertype = _papertype[0] + paper = set([(papertype, title)]) + + # Write a copy of README + copy = papers_root / (f.parent.name + '.md') + if copy.exists(): + os.remove(copy) + + def replace_link(matchobj): + # Replace relative link to GitHub link. + name = matchobj.group(1) + link = matchobj.group(2) + if not link.startswith('http') and (f.parent / link).exists(): + rel_link = (f.parent / link).absolute().relative_to(MMCLS_ROOT) + link = url_prefix + str(rel_link) + return f'[{name}]({link})' + + content = re.sub(r'\[([^\]]+)\]\(([^)]+)\)', replace_link, content) + + with open(copy, 'w') as copy_file: + copy_file.write(content) + + statsmsg = f""" +\t* [{papertype}] [{title}]({copy}) ({len(ckpts)} ckpts) +""" + stats.append(dict(paper=paper, ckpts=ckpts, statsmsg=statsmsg, copy=copy)) + +allpapers = func.reduce(lambda a, b: a.union(b), + [stat['paper'] for stat in stats]) +msglist = '\n'.join(stat['statsmsg'] for stat in stats) + +papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) +countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + +modelzoo = f""" +# Model Zoo Summary + +* Number of papers: {len(set(titles))} +{countstr} + +* Number of checkpoints: {num_ckpts} +{msglist} +""" + +with open('modelzoo_statistics.md', 'w') as f: + f.write(modelzoo) diff --git a/docs/en/tools/analysis.md b/docs/en/tools/analysis.md new file mode 100644 index 0000000..0e583b0 --- /dev/null +++ b/docs/en/tools/analysis.md @@ -0,0 +1,211 @@ +# Analysis + + + +- [Log Analysis](#log-analysis) + - [Plot Curves](#plot-curves) + - [Calculate Training Time](#calculate-training-time) +- [Result Analysis](#result-analysis) + - [Evaluate Results](#evaluate-results) + - [View Typical Results](#view-typical-results) +- [Model Complexity](#model-complexity) +- [FAQs](#faqs) + + + +## Log Analysis + +### Plot Curves + +`tools/analysis_tools/analyze_logs.py` plots curves of given keys according to the log files. + +

+ +```shell +python tools/analysis_tools/analyze_logs.py plot_curve \ + ${JSON_LOGS} \ + [--keys ${KEYS}] \ + [--title ${TITLE}] \ + [--legend ${LEGEND}] \ + [--backend ${BACKEND}] \ + [--style ${STYLE}] \ + [--out ${OUT_FILE}] \ + [--window-size ${WINDOW_SIZE}] +``` + +**Description of all arguments**: + +- `json_logs` : The paths of the log files, separate multiple files by spaces. +- `--keys` : The fields of the logs to analyze, separate multiple keys by spaces. Defaults to 'loss'. +- `--title` : The title of the figure. Defaults to use the filename. +- `--legend` : The names of legend, the number of which must be equal to `len(${JSON_LOGS}) * len(${KEYS})`. Defaults to use `"${JSON_LOG}-${KEYS}"`. +- `--backend` : The backend of matplotlib. Defaults to auto selected by matplotlib. +- `--style` : The style of the figure. Default to `whitegrid`. +- `--out` : The path of the output picture. If not set, the figure won't be saved. +- `--window-size`: The shape of the display window. The format should be `'W*H'`. Defaults to `'12*7'`. + +```{note} +The `--style` option depends on `seaborn` package, please install it before setting it. +``` + +Examples: + +- Plot the loss curve in training. + + ```shell + python tools/analysis_tools/analyze_logs.py plot_curve your_log_json --keys loss --legend loss + ``` + +- Plot the top-1 accuracy and top-5 accuracy curves, and save the figure to results.jpg. + + ```shell + python tools/analysis_tools/analyze_logs.py plot_curve your_log_json --keys accuracy_top-1 accuracy_top-5 --legend top1 top5 --out results.jpg + ``` + +- Compare the top-1 accuracy of two log files in the same figure. + + ```shell + python tools/analysis_tools/analyze_logs.py plot_curve log1.json log2.json --keys accuracy_top-1 --legend exp1 exp2 + ``` + +```{note} +The tool will automatically select to find keys in training logs or validation logs according to the keys. +Therefore, if you add a custom evaluation metric, please also add the key to `TEST_METRICS` in this tool. +``` + +### Calculate Training Time + +`tools/analysis_tools/analyze_logs.py` can also calculate the training time according to the log files. + +```shell +python tools/analysis_tools/analyze_logs.py cal_train_time \ + ${JSON_LOGS} + [--include-outliers] +``` + +**Description of all arguments**: + +- `json_logs` : The paths of the log files, separate multiple files by spaces. +- `--include-outliers` : If set, include the first iteration in each epoch (Sometimes the time of first iterations is longer). + +Example: + +```shell +python tools/analysis_tools/analyze_logs.py cal_train_time work_dirs/some_exp/20200422_153324.log.json +``` + +The output is expected to be like the below. + +```text +-----Analyze train time of work_dirs/some_exp/20200422_153324.log.json----- +slowest epoch 68, average time is 0.3818 +fastest epoch 1, average time is 0.3694 +time std over epochs is 0.0020 +average iter time: 0.3777 s/iter +``` + +## Result Analysis + +With the `--out` argument in `tools/test.py`, we can save the inference results of all samples as a file. +And with this result file, we can do further analysis. + +### Evaluate Results + +`tools/analysis_tools/eval_metric.py` can evaluate metrics again. + +```shell +python tools/analysis_tools/eval_metric.py \ + ${CONFIG} \ + ${RESULT} \ + [--metrics ${METRICS}] \ + [--cfg-options ${CFG_OPTIONS}] \ + [--metric-options ${METRIC_OPTIONS}] +``` + +Description of all arguments: + +- `config` : The path of the model config file. +- `result`: The Output result file in json/pickle format from `tools/test.py`. +- `--metrics` : Evaluation metrics, the acceptable values depend on the dataset. +- `--cfg-options`: If specified, the key-value pair config will be merged into the config file, for more details please refer to [Tutorial 1: Learn about Configs](../tutorials/config.md) +- `--metric-options`: If specified, the key-value pair arguments will be passed to the `metric_options` argument of dataset's `evaluate` function. + +```{note} +In `tools/test.py`, we support using `--out-items` option to select which kind of results will be saved. Please ensure the result file includes "class_scores" to use this tool. +``` + +**Examples**: + +```shell +python tools/analysis_tools/eval_metric.py configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py your_result.pkl --metrics accuracy --metric-options "topk=(1,5)" +``` + +### View Typical Results + +`tools/analysis_tools/analyze_results.py` can save the images with the highest scores in successful or failed prediction. + +```shell +python tools/analysis_tools/analyze_results.py \ + ${CONFIG} \ + ${RESULT} \ + [--out-dir ${OUT_DIR}] \ + [--topk ${TOPK}] \ + [--cfg-options ${CFG_OPTIONS}] +``` + +**Description of all arguments**: + +- `config` : The path of the model config file. +- `result`: Output result file in json/pickle format from `tools/test.py`. +- `--out-dir`: Directory to store output files. +- `--topk`: The number of images in successful or failed prediction with the highest `topk` scores to save. If not specified, it will be set to 20. +- `--cfg-options`: If specified, the key-value pair config will be merged into the config file, for more details please refer to [Tutorial 1: Learn about Configs](../tutorials/config.md) + +```{note} +In `tools/test.py`, we support using `--out-items` option to select which kind of results will be saved. Please ensure the result file includes "pred_score", "pred_label" and "pred_class" to use this tool. +``` + +**Examples**: + +```shell +python tools/analysis_tools/analyze_results.py \ + configs/resnet/resnet50_b32x8_imagenet.py \ + result.pkl \ + --out-dir results \ + --topk 50 +``` + +## Model Complexity + +### Get the FLOPs and params (experimental) + +We provide a script adapted from [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) to compute the FLOPs and params of a given model. + +```shell +python tools/analysis_tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +Description of all arguments: + +- `config` : The path of the model config file. +- `--shape`: Input size, support single value or double value parameter, such as `--shape 256` or `--shape 224 256`. If not set, default to be `224 224`. + +You will get a result like this. + +```text +============================== +Input shape: (3, 224, 224) +Flops: 4.12 GFLOPs +Params: 25.56 M +============================== +``` + +```{warning} +This tool is still experimental and we do not guarantee that the number is correct. You may well use the result for simple comparisons, but double-check it before you adopt it in technical reports or papers. +- FLOPs are related to the input shape while parameters are not. The default input shape is (1, 3, 224, 224). +- Some operators are not counted into FLOPs like GN and custom operators. Refer to [`mmcv.cnn.get_model_complexity_info()`](https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/utils/flops_counter.py) for details. +``` + +## FAQs + +- None diff --git a/docs/en/tools/miscellaneous.md b/docs/en/tools/miscellaneous.md new file mode 100644 index 0000000..4e2d5d6 --- /dev/null +++ b/docs/en/tools/miscellaneous.md @@ -0,0 +1,59 @@ +# Miscellaneous + + + +- [Print the entire config](#print-the-entire-config) +- [Verify Dataset](#verify-dataset) +- [FAQs](#faqs) + + + +## Print the entire config + +`tools/misc/print_config.py` prints the whole config verbatim, expanding all its imports. + +```shell +python tools/misc/print_config.py ${CONFIG} [--cfg-options ${CFG_OPTIONS}] +``` + +Description of all arguments: + +- `config` : The path of the model config file. +- `--cfg-options`: If specified, the key-value pair config will be merged into the config file, for more details please refer to [Tutorial 1: Learn about Configs](../tutorials/config.md) + +**Examples**: + +```shell +python tools/misc/print_config.py configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py +``` + +## Verify Dataset + +`tools/misc/verify_dataset.py` can verify dataset, check whether there are broken pictures in the given dataset. + +```shell +python tools/misc/verify_dataset.py \ + ${CONFIG} \ + [--out-path ${OUT-PATH}] \ + [--phase ${PHASE}] \ + [--num-process ${NUM-PROCESS}] + [--cfg-options ${CFG_OPTIONS}] +``` + +**Description of all arguments**: + +- `config` : The path of the model config file. +- `--out-path` : The path to save the verification result, if not set, defaults to 'brokenfiles.log'. +- `--phase` : Phase of dataset to verify, accept "train" "test" and "val", if not set, defaults to "train". +- `--num-process` : number of process to use, if not set, defaults to 1. +- `--cfg-options`: If specified, the key-value pair config will be merged into the config file, for more details please refer to [Tutorial 1: Learn about Configs](../tutorials/config.md) + +**Examples**: + +```shell +python tools/misc/verify_dataset.py configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py --out-path broken_imgs.log --phase val --num-process 8 +``` + +## FAQs + +- None diff --git a/docs/en/tools/model_serving.md b/docs/en/tools/model_serving.md new file mode 100644 index 0000000..d633a0f --- /dev/null +++ b/docs/en/tools/model_serving.md @@ -0,0 +1,87 @@ +# Model Serving + +In order to serve an `MMClassification` model with [`TorchServe`](https://pytorch.org/serve/), you can follow the steps: + +## 1. Convert model from MMClassification to TorchServe + +```shell +python tools/deployment/mmcls2torchserve.py ${CONFIG_FILE} ${CHECKPOINT_FILE} \ +--output-folder ${MODEL_STORE} \ +--model-name ${MODEL_NAME} +``` + +```{note} +${MODEL_STORE} needs to be an absolute path to a folder. +``` + +Example: + +```shell +python tools/deployment/mmcls2torchserve.py \ + configs/resnet/resnet18_8xb32_in1k.py \ + checkpoints/resnet18_8xb32_in1k_20210831-fbbb1da6.pth \ + --output-folder ./checkpoints \ + --model-name resnet18_in1k +``` + +## 2. Build `mmcls-serve` docker image + +```shell +docker build -t mmcls-serve:latest docker/serve/ +``` + +## 3. Run `mmcls-serve` + +Check the official docs for [running TorchServe with docker](https://github.com/pytorch/serve/blob/master/docker/README.md#running-torchserve-in-a-production-docker-environment). + +In order to run in GPU, you need to install [nvidia-docker](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html). You can omit the `--gpus` argument in order to run in GPU. + +Example: + +```shell +docker run --rm \ +--cpus 8 \ +--gpus device=0 \ +-p8080:8080 -p8081:8081 -p8082:8082 \ +--mount type=bind,source=`realpath ./checkpoints`,target=/home/model-server/model-store \ +mmcls-serve:latest +``` + +```{note} +`realpath ./checkpoints` points to the absolute path of "./checkpoints", and you can replace it with the absolute path where you store torchserve models. +``` + +[Read the docs](https://github.com/pytorch/serve/blob/master/docs/rest_api.md) about the Inference (8080), Management (8081) and Metrics (8082) APis + +## 4. Test deployment + +```shell +curl http://127.0.0.1:8080/predictions/${MODEL_NAME} -T demo/demo.JPEG +``` + +You should obtain a response similar to: + +```json +{ + "pred_label": 58, + "pred_score": 0.38102269172668457, + "pred_class": "water snake" +} +``` + +And you can use `test_torchserver.py` to compare result of TorchServe and PyTorch, and visualize them. + +```shell +python tools/deployment/test_torchserver.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} ${MODEL_NAME} +[--inference-addr ${INFERENCE_ADDR}] [--device ${DEVICE}] +``` + +Example: + +```shell +python tools/deployment/test_torchserver.py \ + demo/demo.JPEG \ + configs/resnet/resnet18_8xb32_in1k.py \ + checkpoints/resnet18_8xb32_in1k_20210831-fbbb1da6.pth \ + resnet18_in1k +``` diff --git a/docs/en/tools/onnx2tensorrt.md b/docs/en/tools/onnx2tensorrt.md new file mode 100644 index 0000000..ea0f148 --- /dev/null +++ b/docs/en/tools/onnx2tensorrt.md @@ -0,0 +1,80 @@ +# ONNX to TensorRT (Experimental) + + + +- [ONNX to TensorRT (Experimental)](#onnx-to-tensorrt-experimental) + - [How to convert models from ONNX to TensorRT](#how-to-convert-models-from-onnx-to-tensorrt) + - [Prerequisite](#prerequisite) + - [Usage](#usage) + - [List of supported models convertible to TensorRT](#list-of-supported-models-convertible-to-tensorrt) + - [Reminders](#reminders) + - [FAQs](#faqs) + + + +## How to convert models from ONNX to TensorRT + +### Prerequisite + +1. Please refer to [install.md](https://mmclassification.readthedocs.io/en/latest/install.html#install-mmclassification) for installation of MMClassification from source. +2. Use our tool [pytorch2onnx.md](./pytorch2onnx.md) to convert the model from PyTorch to ONNX. + +### Usage + +```bash +python tools/deployment/onnx2tensorrt.py \ + ${MODEL} \ + --trt-file ${TRT_FILE} \ + --shape ${IMAGE_SHAPE} \ + --max-batch-size ${MAX_BATCH_SIZE} \ + --workspace-size ${WORKSPACE_SIZE} \ + --fp16 \ + --show \ + --verify \ +``` + +Description of all arguments: + +- `model` : The path of an ONNX model file. +- `--trt-file`: The Path of output TensorRT engine file. If not specified, it will be set to `tmp.trt`. +- `--shape`: The height and width of model input. If not specified, it will be set to `224 224`. +- `--max-batch-size`: The max batch size of TensorRT model, should not be less than 1. +- `--fp16`: Enable fp16 mode. +- `--workspace-size` : The required GPU workspace size in GiB to build TensorRT engine. If not specified, it will be set to `1` GiB. +- `--show`: Determines whether to show the outputs of the model. If not specified, it will be set to `False`. +- `--verify`: Determines whether to verify the correctness of models between ONNXRuntime and TensorRT. If not specified, it will be set to `False`. + +Example: + +```bash +python tools/deployment/onnx2tensorrt.py \ + checkpoints/resnet/resnet18_b16x8_cifar10.onnx \ + --trt-file checkpoints/resnet/resnet18_b16x8_cifar10.trt \ + --shape 224 224 \ + --show \ + --verify \ +``` + +## List of supported models convertible to TensorRT + +The table below lists the models that are guaranteed to be convertible to TensorRT. + +| Model | Config | Status | +| :----------: | :-----------------------------------------------------: | :----: | +| MobileNetV2 | `configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py` | Y | +| ResNet | `configs/resnet/resnet18_8xb16_cifar10.py` | Y | +| ResNeXt | `configs/resnext/resnext50-32x4d_8xb32_in1k.py` | Y | +| ShuffleNetV1 | `configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py` | Y | +| ShuffleNetV2 | `configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py` | Y | + +Notes: + +- *All models above are tested with Pytorch==1.6.0 and TensorRT-7.2.1.6.Ubuntu-16.04.x86_64-gnu.cuda-10.2.cudnn8.0* + +## Reminders + +- If you meet any problem with the listed models above, please create an issue and it would be taken care of soon. For models not included in the list, we may not provide much help here due to the limited resources. Please try to dig a little deeper and debug by yourself. + +## FAQs + +- None diff --git a/docs/en/tools/pytorch2onnx.md b/docs/en/tools/pytorch2onnx.md new file mode 100644 index 0000000..7352d45 --- /dev/null +++ b/docs/en/tools/pytorch2onnx.md @@ -0,0 +1,204 @@ +# Pytorch to ONNX (Experimental) + + + +- [Pytorch to ONNX (Experimental)](#pytorch-to-onnx-experimental) + - [How to convert models from Pytorch to ONNX](#how-to-convert-models-from-pytorch-to-onnx) + - [Prerequisite](#prerequisite) + - [Usage](#usage) + - [Description of all arguments:](#description-of-all-arguments) + - [How to evaluate ONNX models with ONNX Runtime](#how-to-evaluate-onnx-models-with-onnx-runtime) + - [Prerequisite](#prerequisite-1) + - [Usage](#usage-1) + - [Description of all arguments](#description-of-all-arguments-1) + - [Results and Models](#results-and-models) + - [List of supported models exportable to ONNX](#list-of-supported-models-exportable-to-onnx) + - [Reminders](#reminders) + - [FAQs](#faqs) + + + +## How to convert models from Pytorch to ONNX + +### Prerequisite + +1. Please refer to [install](https://mmclassification.readthedocs.io/en/latest/install.html#install-mmclassification) for installation of MMClassification. +2. Install onnx and onnxruntime + +```shell +pip install onnx onnxruntime==1.5.1 +``` + +### Usage + +```bash +python tools/deployment/pytorch2onnx.py \ + ${CONFIG_FILE} \ + --checkpoint ${CHECKPOINT_FILE} \ + --output-file ${OUTPUT_FILE} \ + --shape ${IMAGE_SHAPE} \ + --opset-version ${OPSET_VERSION} \ + --dynamic-export \ + --show \ + --simplify \ + --verify \ +``` + +### Description of all arguments: + +- `config` : The path of a model config file. +- `--checkpoint` : The path of a model checkpoint file. +- `--output-file`: The path of output ONNX model. If not specified, it will be set to `tmp.onnx`. +- `--shape`: The height and width of input tensor to the model. If not specified, it will be set to `224 224`. +- `--opset-version` : The opset version of ONNX. If not specified, it will be set to `11`. +- `--dynamic-export` : Determines whether to export ONNX with dynamic input shape and output shapes. If not specified, it will be set to `False`. +- `--show`: Determines whether to print the architecture of the exported model. If not specified, it will be set to `False`. +- `--simplify`: Determines whether to simplify the exported ONNX model. If not specified, it will be set to `False`. +- `--verify`: Determines whether to verify the correctness of an exported model. If not specified, it will be set to `False`. + +Example: + +```bash +python tools/deployment/pytorch2onnx.py \ + configs/resnet/resnet18_8xb16_cifar10.py \ + --checkpoint checkpoints/resnet/resnet18_8xb16_cifar10.pth \ + --output-file checkpoints/resnet/resnet18_8xb16_cifar10.onnx \ + --dynamic-export \ + --show \ + --simplify \ + --verify \ +``` + +## How to evaluate ONNX models with ONNX Runtime + +We prepare a tool `tools/deployment/test.py` to evaluate ONNX models with ONNXRuntime or TensorRT. + +### Prerequisite + +- Install onnx and onnxruntime-gpu + + ```shell + pip install onnx onnxruntime-gpu + ``` + +### Usage + +```bash +python tools/deployment/test.py \ + ${CONFIG_FILE} \ + ${ONNX_FILE} \ + --backend ${BACKEND} \ + --out ${OUTPUT_FILE} \ + --metrics ${EVALUATION_METRICS} \ + --metric-options ${EVALUATION_OPTIONS} \ + --show + --show-dir ${SHOW_DIRECTORY} \ + --cfg-options ${CFG_OPTIONS} \ +``` + +### Description of all arguments + +- `config`: The path of a model config file. +- `model`: The path of a ONNX model file. +- `--backend`: Backend for input model to run and should be `onnxruntime` or `tensorrt`. +- `--out`: The path of output result file in pickle format. +- `--metrics`: Evaluation metrics, which depends on the dataset, e.g., "accuracy", "precision", "recall", "f1_score", "support" for single label dataset, and "mAP", "CP", "CR", "CF1", "OP", "OR", "OF1" for multi-label dataset. +- `--show`: Determines whether to show classifier outputs. If not specified, it will be set to `False`. +- `--show-dir`: Directory where painted images will be saved +- `--metrics-options`: Custom options for evaluation, the key-value pair in `xxx=yyy` format will be kwargs for `dataset.evaluate()` function +- `--cfg-options`: Override some settings in the used config file, the key-value pair in `xxx=yyy` format will be merged into config file. + +### Results and Models + +This part selects ImageNet for onnxruntime verification. ImageNet has multiple versions, but the most commonly used one is [ILSVRC 2012](http://www.image-net.org/challenges/LSVRC/2012/). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModelConfigMetricPyTorchONNXRuntimeTensorRT-fp32TensorRT-fp16
ResNetresnet50_8xb32_in1k.pyTop 1 / 576.55 / 93.1576.49 / 93.2276.49 / 93.2276.50 / 93.20
ResNeXtresnext50-32x4d_8xb32_in1k.pyTop 1 / 577.90 / 93.6677.90 / 93.6677.90 / 93.6677.89 / 93.65
SE-ResNetseresnet50_8xb32_in1k.pyTop 1 / 577.74 / 93.8477.74 / 93.8477.74 / 93.8477.74 / 93.85
ShuffleNetV1shufflenet-v1-1x_16xb64_in1k.pyTop 1 / 568.13 / 87.8168.13 / 87.8168.13 / 87.8168.10 / 87.80
ShuffleNetV2shufflenet-v2-1x_16xb64_in1k.pyTop 1 / 569.55 / 88.9269.55 / 88.9269.55 / 88.9269.55 / 88.92
MobileNetV2mobilenet-v2_8xb32_in1k.pyTop 1 / 571.86 / 90.4271.86 / 90.4271.86 / 90.4271.88 / 90.40
+ +## List of supported models exportable to ONNX + +The table below lists the models that are guaranteed to be exportable to ONNX and runnable in ONNX Runtime. + +| Model | Config | Batch Inference | Dynamic Shape | Note | +| :----------: | :-------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------: | :-----------: | ---- | +| MobileNetV2 | [mobilenet-v2_8xb32_in1k.py](https://github.com/open-mmlab/mmclassification/tree/master/configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py) | Y | Y | | +| ResNet | [resnet18_8xb16_cifar10.py](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnet/resnet18_8xb16_cifar10.py) | Y | Y | | +| ResNeXt | [resnext50-32x4d_8xb32_in1k.py](https://github.com/open-mmlab/mmclassification/tree/master/configs/resnext/resnext50-32x4d_8xb32_in1k.py) | Y | Y | | +| SE-ResNet | [seresnet50_8xb32_in1k.py](https://github.com/open-mmlab/mmclassification/tree/master/configs/seresnet/seresnet50_8xb32_in1k.py) | Y | Y | | +| ShuffleNetV1 | [shufflenet-v1-1x_16xb64_in1k.py](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py) | Y | Y | | +| ShuffleNetV2 | [shufflenet-v2-1x_16xb64_in1k.py](https://github.com/open-mmlab/mmclassification/tree/master/configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py) | Y | Y | | + +Notes: + +- *All models above are tested with Pytorch==1.6.0* + +## Reminders + +- If you meet any problem with the listed models above, please create an issue and it would be taken care of soon. For models not included in the list, please try to dig a little deeper and debug a little bit more and hopefully solve them by yourself. + +## FAQs + +- None diff --git a/docs/en/tools/pytorch2torchscript.md b/docs/en/tools/pytorch2torchscript.md new file mode 100644 index 0000000..fca0856 --- /dev/null +++ b/docs/en/tools/pytorch2torchscript.md @@ -0,0 +1,56 @@ +# Pytorch to TorchScript (Experimental) + + + +- [Pytorch to TorchScript (Experimental)](#pytorch-to-torchscript-experimental) + - [How to convert models from Pytorch to TorchScript](#how-to-convert-models-from-pytorch-to-torchscript) + - [Usage](#usage) + - [Description of all arguments](#description-of-all-arguments) + - [Reminders](#reminders) + - [FAQs](#faqs) + + + +## How to convert models from Pytorch to TorchScript + +### Usage + +```bash +python tools/deployment/pytorch2torchscript.py \ + ${CONFIG_FILE} \ + --checkpoint ${CHECKPOINT_FILE} \ + --output-file ${OUTPUT_FILE} \ + --shape ${IMAGE_SHAPE} \ + --verify \ +``` + +### Description of all arguments + +- `config` : The path of a model config file. +- `--checkpoint` : The path of a model checkpoint file. +- `--output-file`: The path of output TorchScript model. If not specified, it will be set to `tmp.pt`. +- `--shape`: The height and width of input tensor to the model. If not specified, it will be set to `224 224`. +- `--verify`: Determines whether to verify the correctness of an exported model. If not specified, it will be set to `False`. + +Example: + +```bash +python tools/deployment/pytorch2torchscript.py \ + configs/resnet/resnet18_8xb16_cifar10.py \ + --checkpoint checkpoints/resnet/resnet18_8xb16_cifar10.pth \ + --output-file checkpoints/resnet/resnet18_8xb16_cifar10.pt \ + --verify \ +``` + +Notes: + +- *All models are tested with Pytorch==1.8.1* + +## Reminders + +- For torch.jit.is_tracing() is only supported after v1.6. For users with pytorch v1.3-v1.5, we suggest early returning tensors manually. +- If you meet any problem with the models in this repo, please create an issue and it would be taken care of soon. + +## FAQs + +- None diff --git a/docs/en/tools/visualization.md b/docs/en/tools/visualization.md new file mode 100644 index 0000000..0128245 --- /dev/null +++ b/docs/en/tools/visualization.md @@ -0,0 +1,302 @@ +# Visualization + + + +- [Pipeline Visualization](#pipeline-visualization) +- [Learning Rate Schedule Visualization](#learning-rate-schedule-visualization) +- [Class Activation Map Visualization](#class-activation-map-visualization) +- [FAQs](#faqs) + + + +## Pipeline Visualization + +```bash +python tools/visualizations/vis_pipeline.py \ + ${CONFIG_FILE} \ + [--output-dir ${OUTPUT_DIR}] \ + [--phase ${DATASET_PHASE}] \ + [--number ${BUNBER_IMAGES_DISPLAY}] \ + [--skip-type ${SKIP_TRANSFORM_TYPE}] \ + [--mode ${DISPLAY_MODE}] \ + [--show] \ + [--adaptive] \ + [--min-edge-length ${MIN_EDGE_LENGTH}] \ + [--max-edge-length ${MAX_EDGE_LENGTH}] \ + [--bgr2rgb] \ + [--window-size ${WINDOW_SIZE}] \ + [--cfg-options ${CFG_OPTIONS}] +``` + +**Description of all arguments**: + +- `config` : The path of a model config file. +- `--output-dir`: The output path for visualized images. If not specified, it will be set to `''`, which means not to save. +- `--phase`: Phase of visualizing dataset,must be one of `[train, val, test]`. If not specified, it will be set to `train`. +- `--number`: The number of samples to visualized. If not specified, display all images in the dataset. +- `--skip-type`: The pipelines to be skipped. If not specified, it will be set to `['ToTensor', 'Normalize', 'ImageToTensor', 'Collect']`. +- `--mode`: The display mode, can be one of `[original, pipeline, concat]`. If not specified, it will be set to `concat`. +- `--show`: If set, display pictures in pop-up windows. +- `--adaptive`: If set, adaptively resize images for better visualization. +- `--min-edge-length`: The minimum edge length, used when `--adaptive` is set. When any side of the picture is smaller than `${MIN_EDGE_LENGTH}`, the picture will be enlarged while keeping the aspect ratio unchanged, and the short side will be aligned to `${MIN_EDGE_LENGTH}`. If not specified, it will be set to 200. +- `--max-edge-length`: The maximum edge length, used when `--adaptive` is set. When any side of the picture is larger than `${MAX_EDGE_LENGTH}`, the picture will be reduced while keeping the aspect ratio unchanged, and the long side will be aligned to `${MAX_EDGE_LENGTH}`. If not specified, it will be set to 1000. +- `--bgr2rgb`: If set, flip the color channel order of images. +- `--window-size`: The shape of the display window. If not specified, it will be set to `12*7`. If used, it must be in the format `'W*H'`. +- `--cfg-options` : Modifications to the configuration file, refer to [Tutorial 1: Learn about Configs](https://mmclassification.readthedocs.io/en/latest/tutorials/config.html). + +```{note} + +1. If the `--mode` is not specified, it will be set to `concat` as default, get the pictures stitched together by original pictures and transformed pictures; if the `--mode` is set to `original`, get the original pictures; if the `--mode` is set to `transformed`, get the transformed pictures; if the `--mode` is set to `pipeline`, get all the intermediate images through the pipeline. + +2. When `--adaptive` option is set, images that are too large or too small will be automatically adjusted, you can use `--min-edge-length` and `--max-edge-length` to set the adjust size. +``` + +**Examples**: + +1. In **'original'** mode, visualize 100 original pictures in the `CIFAR100` validation set, then display and save them in the `./tmp` folder: + +```shell +python ./tools/visualizations/vis_pipeline.py configs/resnet/resnet50_8xb16_cifar100.py --phase val --output-dir tmp --mode original --number 100 --show --adaptive --bgr2rgb +``` + +
+ +2. In **'transformed'** mode, visualize all the transformed pictures of the `ImageNet` training set and display them in pop-up windows: + +```shell +python ./tools/visualizations/vis_pipeline.py ./configs/resnet/resnet50_8xb32_in1k.py --show --mode transformed +``` + +
+ +3. In **'concat'** mode, visualize 10 pairs of origin and transformed images for comparison in the `ImageNet` train set and save them in the `./tmp` folder: + +```shell +python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --output-dir tmp --number 10 --adaptive +``` + +
+ +4. In **'pipeline'** mode, visualize all the intermediate pictures in the `ImageNet` train set through the pipeline: + +```shell +python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --adaptive --mode pipeline --show +``` + +
+ +## Learning Rate Schedule Visualization + +```bash +python tools/visualizations/vis_lr.py \ + ${CONFIG_FILE} \ + --dataset-size ${DATASET_SIZE} \ + --ngpus ${NUM_GPUs} + --save-path ${SAVE_PATH} \ + --title ${TITLE} \ + --style ${STYLE} \ + --window-size ${WINDOW_SIZE} + --cfg-options +``` + +**Description of all arguments**: + +- `config` : The path of a model config file. +- `dataset-size` : The size of the datasets. If set,`build_dataset` will be skipped and `${DATASET_SIZE}` will be used as the size. Default to use the function `build_dataset`. +- `ngpus` : The number of GPUs used in training, default to be 1. +- `save-path` : The learning rate curve plot save path, default not to save. +- `title` : Title of figure. If not set, default to be config file name. +- `style` : Style of plt. If not set, default to be `whitegrid`. +- `window-size`: The shape of the display window. If not specified, it will be set to `12*7`. If used, it must be in the format `'W*H'`. +- `cfg-options` : Modifications to the configuration file, refer to [Tutorial 1: Learn about Configs](https://mmclassification.readthedocs.io/en/latest/tutorials/config.html). + +```{note} +Loading annotations maybe consume much time, you can directly specify the size of the dataset with `dataset-size` to save time. +``` + +**Examples**: + +```bash +python tools/visualizations/vis_lr.py configs/resnet/resnet50_b16x8_cifar100.py +``` + +
+ +When using ImageNet, directly specify the size of ImageNet, as below: + +```bash +python tools/visualizations/vis_lr.py configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py --dataset-size 1281167 --ngpus 4 --save-path ./repvgg-B3g4_4xb64-lr.jpg +``` + +
+ +## Class Activation Map Visualization + +MMClassification provides `tools\visualizations\vis_cam.py` tool to visualize class activation map. Please use `pip install "grad-cam>=1.3.6"` command to install [pytorch-grad-cam](https://github.com/jacobgil/pytorch-grad-cam). + +The supported methods are as follows: + +| Method | What it does | +| ------------ | ---------------------------------------------------------------------------------------------------------------------------- | +| GradCAM | Weight the 2D activations by the average gradient | +| GradCAM++ | Like GradCAM but uses second order gradients | +| XGradCAM | Like GradCAM but scale the gradients by the normalized activations | +| EigenCAM | Takes the first principle component of the 2D Activations (no class discrimination, but seems to give great results) | +| EigenGradCAM | Like EigenCAM but with class discrimination: First principle component of Activations\*Grad. Looks like GradCAM, but cleaner | +| LayerCAM | Spatially weight the activations by positive gradients. Works better especially in lower layers | + +**Command**: + +```bash +python tools/visualizations/vis_cam.py \ + ${IMG} \ + ${CONFIG_FILE} \ + ${CHECKPOINT} \ + [--target-layers ${TARGET-LAYERS}] \ + [--preview-model] \ + [--method ${METHOD}] \ + [--target-category ${TARGET-CATEGORY}] \ + [--save-path ${SAVE_PATH}] \ + [--vit-like] \ + [--num-extra-tokens ${NUM-EXTRA-TOKENS}] + [--aug_smooth] \ + [--eigen_smooth] \ + [--device ${DEVICE}] \ + [--cfg-options ${CFG-OPTIONS}] +``` + +**Description of all arguments**: + +- `img` : The target picture path. +- `config` : The path of the model config file. +- `checkpoint` : The path of the checkpoint. +- `--target-layers` : The target layers to get activation maps, one or more network layers can be specified. If not set, use the norm layer of the last block. +- `--preview-model` : Whether to print all network layer names in the model. +- `--method` : Visualization method, supports `GradCAM`, `GradCAM++`, `XGradCAM`, `EigenCAM`, `EigenGradCAM`, `LayerCAM`, which is case insensitive. Defaults to `GradCAM`. +- `--target-category` : Target category, if not set, use the category detected by the given model. +- `--save-path` : The path to save the CAM visualization image. If not set, the CAM image will not be saved. +- `--vit-like` : Whether the network is ViT-like network. +- `--num-extra-tokens` : The number of extra tokens in ViT-like backbones. If not set, use num_extra_tokens the backbone. +- `--aug_smooth` : Whether to use TTA(Test Time Augment) to get CAM. +- `--eigen_smooth` : Whether to use the principal component to reduce noise. +- `--device` : The computing device used. Default to 'cpu'. +- `--cfg-options` : Modifications to the configuration file, refer to [Tutorial 1: Learn about Configs](https://mmclassification.readthedocs.io/en/latest/tutorials/config.html). + +```{note} +The argument `--preview-model` can view all network layers names in the given model. It will be helpful if you know nothing about the model layers when setting `--target-layers`. +``` + +**Examples(CNN)**: + +Here are some examples of `target-layers` in ResNet-50, which can be any module or layer: + +- `'backbone.layer4'` means the output of the forth ResLayer. +- `'backbone.layer4.2'` means the output of the third BottleNeck block in the forth ResLayer. +- `'backbone.layer4.2.conv1'` means the output of the `conv1` layer in above BottleNeck block. + +```{note} +For `ModuleList` or `Sequential`, you can also use the index to specify which sub-module is the target layer. + +For example, the `backbone.layer4[-1]` is the same as `backbone.layer4.2` since `layer4` is a `Sequential` with three sub-modules. +``` + +1. Use different methods to visualize CAM for `ResNet50`, the `target-category` is the predicted result by the given checkpoint, using the default `target-layers`. + + ```shell + python tools/visualizations/vis_cam.py \ + demo/bird.JPEG \ + configs/resnet/resnet50_8xb32_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_batch256_imagenet_20200708-cfb998bf.pth \ + --method GradCAM + # GradCAM++, XGradCAM, EigenCAM, EigenGradCAM, LayerCAM + ``` + + | Image | GradCAM | GradCAM++ | EigenGradCAM | LayerCAM | + | ------------------------------------ | --------------------------------------- | ----------------------------------------- | -------------------------------------------- | ---------------------------------------- | + |
|
|
|
|
| + +2. Use different `target-category` to get CAM from the same picture. In `ImageNet` dataset, the category 238 is 'Greater Swiss Mountain dog', the category 281 is 'tabby, tabby cat'. + + ```shell + python tools/visualizations/vis_cam.py \ + demo/cat-dog.png configs/resnet/resnet50_8xb32_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_batch256_imagenet_20200708-cfb998bf.pth \ + --target-layers 'backbone.layer4.2' \ + --method GradCAM \ + --target-category 238 + # --target-category 281 + ``` + + | Category | Image | GradCAM | XGradCAM | LayerCAM | + | -------- | ---------------------------------------------- | ------------------------------------------------ | ------------------------------------------------- | ------------------------------------------------- | + | Dog |
|
|
|
| + | Cat |
|
|
|
| + +3. Use `--eigen-smooth` and `--aug-smooth` to improve visual effects. + + ```shell + python tools/visualizations/vis_cam.py \ + demo/dog.jpg \ + configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_large-3ea3c186.pth \ + --target-layers 'backbone.layer16' \ + --method LayerCAM \ + --eigen-smooth --aug-smooth + ``` + + | Image | LayerCAM | eigen-smooth | aug-smooth | eigen&aug | + | ------------------------------------ | --------------------------------------- | ------------------------------------------- | ----------------------------------------- | ----------------------------------------- | + |
|
|
|
|
| + +**Examples(Transformer)**: + +Here are some examples: + +- `'backbone.norm3'` for Swin-Transformer; +- `'backbone.layers[-1].ln1'` for ViT; + +For ViT-like networks, such as ViT, T2T-ViT and Swin-Transformer, the features are flattened. And for drawing the CAM, we need to specify the `--vit-like` argument to reshape the features into square feature maps. + +Besides the flattened features, some ViT-like networks also add extra tokens like the class token in ViT and T2T-ViT, and the distillation token in DeiT. In these networks, the final classification is done on the tokens computed in the last attention block, and therefore, the classification score will not be affected by other features and the gradient of the classification score with respect to them, will be zero. Therefore, you shouldn't use the output of the last attention block as the target layer in these networks. + +To exclude these extra tokens, we need know the number of extra tokens. Almost all transformer-based backbones in MMClassification have the `num_extra_tokens` attribute. If you want to use this tool in a new or third-party network that don't have the `num_extra_tokens` attribute, please specify it the `--num-extra-tokens` argument. + +1. Visualize CAM for `Swin Transformer`, using default `target-layers`: + + ```shell + python tools/visualizations/vis_cam.py \ + demo/bird.JPEG \ + configs/swin_transformer/swin-tiny_16xb64_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_tiny_224_b16x64_300e_imagenet_20210616_090925-66df6be6.pth \ + --vit-like + ``` + +2. Visualize CAM for `Vision Transformer(ViT)`: + + ```shell + python tools/visualizations/vis_cam.py \ + demo/bird.JPEG \ + configs/vision_transformer/vit-base-p16_ft-64xb64_in1k-384.py \ + https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-base-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-98e8652b.pth \ + --vit-like \ + --target-layers 'backbone.layers[-1].ln1' + ``` + +3. Visualize CAM for `T2T-ViT`: + + ```shell + python tools/visualizations/vis_cam.py \ + demo/bird.JPEG \ + configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-14_3rdparty_8xb64_in1k_20210928-b7c09b62.pth \ + --vit-like \ + --target-layers 'backbone.encoder[-1].ln1' + ``` + +| Image | ResNet50 | ViT | Swin | T2T-ViT | +| --------------------------------------- | ------------------------------------------ | -------------------------------------- | --------------------------------------- | ------------------------------------------ | +|
|
|
|
|
| + +## FAQs + +- None diff --git a/docs/en/tutorials/MMClassification_python.ipynb b/docs/en/tutorials/MMClassification_python.ipynb new file mode 100755 index 0000000..e046666 --- /dev/null +++ b/docs/en/tutorials/MMClassification_python.ipynb @@ -0,0 +1,2040 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "XjQxmm04iTx4" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UdMfIsMpiODD" + }, + "source": [ + "# MMClassification Python API tutorial on Colab\n", + "\n", + "In this tutorial, we will introduce the following content:\n", + "\n", + "* How to install MMCls\n", + "* Inference a model with Python API\n", + "* Fine-tune a model with Python API" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iOl0X9UEiRvE" + }, + "source": [ + "## Install MMClassification\n", + "\n", + "Before using MMClassification, we need to prepare the environment with the following steps:\n", + "\n", + "1. Install Python, CUDA, C/C++ compiler and git\n", + "2. Install PyTorch (CUDA version)\n", + "3. Install mmcv\n", + "4. Clone mmcls source code from GitHub and install it\n", + "\n", + "Because this tutorial is on Google Colab, and the basic environment has been completed, we can skip the first two steps." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_i7cjqS_LtoP" + }, + "source": [ + "### Check environment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "c6MbAw10iUJI", + "outputId": "dd37cdf5-7bcf-4a03-f5b5-4b17c3ca16de" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/content\n" + ] + } + ], + "source": [ + "%cd /content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4IyFL3MaiYRu", + "outputId": "5008efdf-0356-4d93-ba9d-e51787036213" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/content\n" + ] + } + ], + "source": [ + "!pwd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DMw7QwvpiiUO", + "outputId": "33fa5eb8-d083-4a1f-d094-ab0f59e2818e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nvcc: NVIDIA (R) Cuda compiler driver\n", + "Copyright (c) 2005-2020 NVIDIA Corporation\n", + "Built on Mon_Oct_12_20:09:46_PDT_2020\n", + "Cuda compilation tools, release 11.1, V11.1.105\n", + "Build cuda_11.1.TC455_06.29190527_0\n" + ] + } + ], + "source": [ + "# Check nvcc version\n", + "!nvcc -V" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4VIBU7Fain4D", + "outputId": "ec20652d-ca24-4b82-b407-e90354d728f8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "Copyright (C) 2017 Free Software Foundation, Inc.\n", + "This is free software; see the source for copying conditions. There is NO\n", + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", + "\n" + ] + } + ], + "source": [ + "# Check GCC version\n", + "!gcc --version" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "24lDLCqFisZ9", + "outputId": "30ec9a1c-cdb3-436c-cdc8-f2a22afe254f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.9.0+cu111\n", + "True\n" + ] + } + ], + "source": [ + "# Check PyTorch installation\n", + "import torch, torchvision\n", + "print(torch.__version__)\n", + "print(torch.cuda.is_available())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "R2aZNLUwizBs" + }, + "source": [ + "### Install MMCV\n", + "\n", + "MMCV is the basic package of all OpenMMLab packages. We have pre-built wheels on Linux, so we can download and install them directly.\n", + "\n", + "Please pay attention to PyTorch and CUDA versions to match the wheel.\n", + "\n", + "In the above steps, we have checked the version of PyTorch and CUDA, and they are 1.9.0 and 11.1 respectively, so we need to choose the corresponding wheel.\n", + "\n", + "In addition, we can also install the full version of mmcv (mmcv-full). It includes full features and various CUDA ops out of the box, but needs a longer time to build." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nla40LrLi7oo", + "outputId": "162bf14d-0d3e-4540-e85e-a46084a786b1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in links: https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "Collecting mmcv\n", + " Downloading mmcv-1.3.15.tar.gz (352 kB)\n", + "\u001b[K |████████████████████████████████| 352 kB 5.2 MB/s \n", + "\u001b[?25hCollecting addict\n", + " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv) (1.19.5)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcv) (21.0)\n", + "Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv) (7.1.2)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv) (3.13)\n", + "Collecting yapf\n", + " Downloading yapf-0.31.0-py2.py3-none-any.whl (185 kB)\n", + "\u001b[K |████████████████████████████████| 185 kB 49.9 MB/s \n", + "\u001b[?25hRequirement already satisfied: pyparsing>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->mmcv) (2.4.7)\n", + "Building wheels for collected packages: mmcv\n", + " Building wheel for mmcv (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for mmcv: filename=mmcv-1.3.15-py2.py3-none-any.whl size=509835 sha256=793fe3796421336ca7a7740a1397a54016ba71ce95fd80cb80a116644adb4070\n", + " Stored in directory: /root/.cache/pip/wheels/b2/f4/4e/8f6d2dd2bef6b7eb8c89aa0e5d61acd7bff60aaf3d4d4b29b0\n", + "Successfully built mmcv\n", + "Installing collected packages: yapf, addict, mmcv\n", + "Successfully installed addict-2.4.0 mmcv-1.3.15 yapf-0.31.0\n" + ] + } + ], + "source": [ + "# Install mmcv\n", + "!pip install mmcv -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "# !pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.9.0/index.html" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GDTUrYvXjlRb" + }, + "source": [ + "### Clone and install MMClassification\n", + "\n", + "Next, we clone the latest mmcls repository from GitHub and install it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Bwme6tWHjl5s", + "outputId": "eae20624-4695-4cd9-c3e5-9c59596d150a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cloning into 'mmclassification'...\n", + "remote: Enumerating objects: 4152, done.\u001b[K\n", + "remote: Counting objects: 100% (994/994), done.\u001b[K\n", + "remote: Compressing objects: 100% (576/576), done.\u001b[K\n", + "remote: Total 4152 (delta 476), reused 765 (delta 401), pack-reused 3158\u001b[K\n", + "Receiving objects: 100% (4152/4152), 8.20 MiB | 21.00 MiB/s, done.\n", + "Resolving deltas: 100% (2524/2524), done.\n" + ] + } + ], + "source": [ + "# Clone mmcls repository\n", + "!git clone https://github.com/open-mmlab/mmclassification.git\n", + "%cd mmclassification/\n", + "\n", + "# Install MMClassification from source\n", + "!pip install -e . " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hFg_oSG4j3zB", + "outputId": "05a91f9b-d41c-4ae7-d4fe-c30a30d3f639" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.16.0\n" + ] + } + ], + "source": [ + "# Check MMClassification installation\n", + "import mmcls\n", + "print(mmcls.__version__)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4Mi3g6yzj96L" + }, + "source": [ + "## Inference a model with Python API\n", + "\n", + "MMClassification provides many pre-trained models, and you can check them by the link of [model zoo](https://mmclassification.readthedocs.io/en/latest/model_zoo.html). Almost all models can reproduce the results in original papers or reach higher metrics. And we can use these models directly.\n", + "\n", + "To use the pre-trained model, we need to do the following steps:\n", + "\n", + "- Prepare the model\n", + " - Prepare the config file\n", + " - Prepare the checkpoint file\n", + "- Build the model\n", + "- Inference with the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nDQchz8CkJaT", + "outputId": "9805bd7d-cc2a-4269-b43d-257412f1df93" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2021-10-21 03:52:36-- https://www.dropbox.com/s/k5fsqi6qha09l1v/banana.png?dl=0\n", + "Resolving www.dropbox.com (www.dropbox.com)... 162.125.3.18, 2620:100:601b:18::a27d:812\n", + "Connecting to www.dropbox.com (www.dropbox.com)|162.125.3.18|:443... connected.\n", + "HTTP request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/raw/k5fsqi6qha09l1v/banana.png [following]\n", + "--2021-10-21 03:52:36-- https://www.dropbox.com/s/raw/k5fsqi6qha09l1v/banana.png\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com/cd/0/inline/BYYklQk6LNPXNm7o5xE_fxE2GA9reePyNajQgoe9roPlSrtsJd4WN6RVww7zrtNZWFq8iZv349MNQJlm7vVaqRBxTcd0ufxkqbcJYJvOrORpxOPV7mHmhMjKYUncez8YNqELGwDd-aeZqLGKBC8spSnx/file# [following]\n", + "--2021-10-21 03:52:36-- https://uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com/cd/0/inline/BYYklQk6LNPXNm7o5xE_fxE2GA9reePyNajQgoe9roPlSrtsJd4WN6RVww7zrtNZWFq8iZv349MNQJlm7vVaqRBxTcd0ufxkqbcJYJvOrORpxOPV7mHmhMjKYUncez8YNqELGwDd-aeZqLGKBC8spSnx/file\n", + "Resolving uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com (uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com)... 162.125.3.15, 2620:100:601b:15::a27d:80f\n", + "Connecting to uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com (uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com)|162.125.3.15|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 297299 (290K) [image/png]\n", + "Saving to: ‘demo/banana.png’\n", + "\n", + "demo/banana.png 100%[===================>] 290.33K --.-KB/s in 0.08s \n", + "\n", + "2021-10-21 03:52:36 (3.47 MB/s) - ‘demo/banana.png’ saved [297299/297299]\n", + "\n" + ] + } + ], + "source": [ + "# Get the demo image\n", + "!wget https://www.dropbox.com/s/k5fsqi6qha09l1v/banana.png?dl=0 -O demo/banana.png" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 420 + }, + "id": "o2eiitWnkQq_", + "outputId": "192b3ebb-202b-4d6e-e178-561223024318" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAGTCAYAAADdkO5AAAABd2lDQ1BJQ0MgUHJvZmlsZQAAeJx1kc0rRFEYxn8zaDA0CxaTqLsYsqAmSpaMhc0kDcpgM3PdmVF3Zm733kmTrbKxUBZi42vhP2CrbCmlSEkW/gJfG+l6j6tG4tzOfX895zxv5zwHgklTLzr1cSiWXDs1ntBm03Na6JEwUZroojmjO9bo5GSSf8fbNQFVr/pVr//3/TnCi4ajQ6BReEi3bFd4RDi57FqK14Xb9UJmUXhPuM+WAwqfKz3r84PivM8viu3p1BgEVU8t/4OzP1gv2EXhXuFY0azo3+dRN2kxSjNTUjtkduKQYpwEGlkqLGHi0i+1JJn97Yt/+SYoi0eXv0UVWxx5CuLtE7UiXQ2pOdEN+UyqKvffeTq5wQG/e0sCGu4977kbQpvwseF57/ue93EAdXdwWqr5y5LT8KvoGzUttguRVTg+q2nZLThZg+itlbEzX1KdzGAuB09H0JqGtktonvez+l7n8AamV+SJLmB7B3pkf2ThE7z6Z+tvc+SlAAEAAElEQVR4nLz9S6ws25aeh31jPiIiM9dae+/zuHWqWHy4YViCDD1sqCfZXUvuGLDbBqG2AUN9wbYoWDbctiULBGSxRcA2BJMQIIsPyZRokiWbpkULIGmKZJGsB+s+zjl7r7UyI2I+hhtjzMi1q27de9lxAvfuc85eKzMyYs4xx/jH//9D/jf/xr+hqkpKiQCoKACqQMf+WUDU/mOIgS7Cy7YSEHJKQEPVfi+lhKrSWiOmBEDvnVYrMQZEAhICqoqqMsWJLopqp/d+/PecM/teuF2fmeYTKUYQEASAnDO9d2rvpBgRkeMaemt24SLUUvFvgYggQYgx0fZKRzlfztRaj2vf953q12r3QUHv/zzPma56/HsIgVorH58/Mk0zT49P3K43WqucTjMxZlQ727bbJSHEmBEBbY2YJ0IM7PuKANu2Mc9nUk60WgkxECSw7zv7euPp/XtEOkqA1thrI4To96OiQK2V1hopJfseChICQkCCECTY8xUopYAqIoHeO3my+xpCIIRIErvq0hoShPM8232UYD8TE7V3tHVOy4k4TYjA+Xzi6emJx8cHPnz5FX/gV/8AMUZ+kdfLyws//OEP+fjtt3z/7Sdu2yu9d24vK6VvtNYQVVTEn2xn3wt9b4QYEHv09CC0pkgMBIRt3UDU/q53YhRyTrTW6N3eqew7L88vnE4nnh4utNrRCEFhb50kgZgSVZSgQkqzr/8GCAElxsS+7dz2wnle2PaNT8/P/PKv/AohCrVX1utKq0rKiXmaeb4+Q+vMy4k8Z6RDKZWQo312Kcwpk1Km9krviiSh10qtnXma7P6KEHx9AlRRtm1HBKaY6QLSlZQzYl8aiYkQ7vtnmiZCsDXfWiP6/sohoCH4v0NtHREhpYiqEkNkmjJVO1o7RHvPJJE8TYgIKASUbz9+ZF1XHh8fOJ8eUNrxmfu2IyIsp4uvNaH3SmudEKB3ECBPEzEkgtj6jjEiQWi+n0O0ddpRtFZASFMmIKgIOWdCgADUrrTWOU0TIWcC2PX4GhP/c7yCx7DeGhJsL4x7FWOk+71trR2/O2KUqvp36mhrNBS6stdCKYWy7fz4xz+m0ZnzBAp9L7R+fxbX2xVBOJ1OlFKP+LauKwpHTOwiKIB2QIgx0Hujq1LKTlCIOUFXeu+klECh9QaqpJhI+HpSVZq/mQQBxA4HEQsi/iWbKoIwe5DOObGu5biZtd0ftmCbcUSk1pQYleSBtTelR+zvVQkiEGyT11oRgdP5kRiE1hVRqN0OgJSz/emHx7j5IxD11izYRVs8tTZUO9SOhk6jMeXpeHghhCM4igRyTpTS6K2Rc0aCHThiEcYCRa120E0TX3/1tR8oSi0bwb9vSoLfPcS/ateGNqXWjTkKMU7HwpvnxT67FnpT2/QRTqcz0zSjKvSuxASSM4lAFLGg6QtYxD6rtUYIgiBI78QY0K4Q/XF1u167Z4Jqp1U7DLR3tCuaMzEEcgwExTdDp/dCnjKIIBIJMYAnByEEAtC126NHWdeVy+Xy+x4Mb1/zPJOmTMoTec6UNrOuK1vbLUV4s05UlUAgp0xtSggRkW5rTUFipGoHDwqt24bKORGzBTchEIOfmjGxLDMxRvbWqa0yS7aNJ4GYImoLGySi2u3AR2z9KpRW+fj8id6V05Rp2ii90nslhUQvtra72MZWIBDpMTDlcU8tNwlqz3PKmTBltlJopZCiHSSEyDRFJAWkC006SMBCXyeMRdGgS7cgE4M9X18nQe4JzzRN94TPA5+qkv0AEt/bdj+TPWsRamsQLQaklOihUWtjSokQoq89SzgrcDmfuTxejmRDgiAKEoR0udi+ShEloCgpzah2SinkHEgpEmMiSLDEIIgnNoERzlOKdJSMIPNClICI0rvSaYjfj94VEWXOCUmRI3r5ATViytsgf+yzEMgeiwA6SgxCwOLJ+J0RY1qzmDIS6AYEAk06np8TUuR0PlNKsaghEKbE9z/8no+fPpJy5osPX7CcFkiJFAPURmsdBcq2sXVlOp8s6LdGo5FiomsjihDBf14JmmiiMBKDbrEzxUjrjYRXCdKVLrahA4Hu2SVd7QEKiAqtFWKyLxzxgBmD3TAFDQLaUcQybhFbaKidbiHQ+ng4FvBH4vP2xA3BFnKIdi0528kYWgDtnu1Hu/G9WUDzhzEWPP6nVUqRsnfLpFq3xRWCZR1iQbG2RoqWDanagdE9EARJLMtC1+pZOV5FQfPDJYZIa42cZ6aUaKgdhl1JMdimUyXEiPaOyIygKN2Cut8XO1ACKVmWFrBDwLI9UKzyWm83luVCTMk2/V4s4IRAmCZSjHRt9m4x2e+OHeQxMQW7v6qdrkqyiGEb5E01NaVkvwBe8XkV0hp5ORE1oNIptxshRup5prXOuq2s68qnlxeWZfmFq4kUoh1wggcEYZkXRJR9345n7Q8A1YaqBdXeGnutlgSIoq2xdft3W/gV6bboguLr3tZvj5GH0wUJQhdlSQmNYs/AK5KO0iVTS6XrTkqJ2pU5+d/XwjTPjFiTc+KyLERVmidMp2lBZCdmC3Q5JcSfd0OprSAdJNoKERG0Nsq2U1qzA4lAium4B10gqPgeVjqdqp0lT4gq120jq11Po5M12GGrSsz5ntyJJSIShRCjrXM/mHNKxx7r3RLKFCIpRCQmJDia0DM59iOIxxgtadRKa/D4/j2N7vtlonvFP00JkWjLUwK9dVpvVi1IYmTMy3Lye2CVW0qRkKPVcqlZYA2Rpt0qJrH9CZ3elYb4+hFLgPLs+0g9CbOKQN/EkLfVxPjvIwapWsWaQ7DqXSCKUN/8zqiKYkpH8hxHzOuWbEwp00OEp0e2dePj80dondO0MJ9O9O+/Y982QxhipvRqh4uv52VeALhdb0zR9tBeO1EC6/XK7bbyxRcfrIqaJiJehXUhJqErdI9HXazCSSEE1m0jiHA6LfSuHoTUHogHHXonADkm9t6JKYJ2WnW4B8sCqnZqV6IHectqhRADeZqOzAQRew8gBL84r1haa3S1Babw5jSGoMpWu5W4Djd1L6VSjJ+Vd+PU772RUmaaJ3qzDMc+0wLv2yqiqxIk0NWuK6ZALQZvpCURiKgotTXaXphO9lD2fSPniSSB0zwRQ2TvhVobMQRSytAbI08JDsuV0uhajmxERCyb9w1gSaEvQvW9KoHrdeO7n3zLV19HnvIDm9o15ZT84LRyN4gQgm1yBVopiESmnGxdxUjbi8cz8ViQoFtFYRvbNlaM90xKVdn2SoiRNC8QFNFITEKKgmL3rU/Ktq7k65Wy7cTz6ecfENEO5NNy4iW9UEolxkzOndY2C8p1VHXNn2MgCKz7yt52kMgpBnqzZCZKQAKUplxfrrxcX/ilH3xFSonmGzQS7CBuDUKi1U5R5ZwSEgy2sIDQvXy3QJZiIkhHgx0mOcBTzlZpdlub87IQUoLxXEJgipMd3L2ybiuP+QGRCLWgfr/lgFjF4JYUueRpFO50UQIGdFntYBUC2gkhEVs9Mt7JD4LeOzkYbCxA6Z0k932WQiAkgRjIqszz7BVTcCgqojT228Y0zUdWPIqMECIxRxhZt1dGy3IyeLYUJEVLMkWskol2AASHSSwNC/TQkCqAVfQp2T45LzNIIHgShUNDqkqYAoFgCQbYwdybVRGj4vN92HtDYyREO5xitHuasiVrY0+mYIlwcYRCRJgGtK5qVbMIIcgR0wiRqYfjZ94msaOCxO9rCImYLeluTTiFGVFo7cEOhRD54sN7Hh8fqMWSwarVYCLtBI+zMUYWvGoKgmo7Kr5aNl6uL1wuJ4ttMu4FhBTo1XC8HDK1FyIBjUqqpXB7feZ0efAtahh2SpFe+5F59m6ZpgSDNyzbhBgiXaycF/vO9lch3P9lHDQWuUE7pTRiTEiw95Sux8ZDBC0dmQdWagF/3yu1Fuq+kx8eCDFSym6YoNh1xxD8vxdbbCKU2lEt1neJkQSWTbRGKUpKhukqoP493/ZYUGUrBfZ43PDWGqU3Umsotve1dwqdFCKlVvZSqLXy8PBAQFj3yrTM1FZR7xncq4fR/7j3OUTswEzcD1Ar960KujycOV1Odpt7I4dAjpEeggW63tFwPyzVv3OwB+yboDNny2xUOLJ39fK/velR9W7XMOVx2Nv9CdrpPdJD47ScyTmRg22Y0ivrujHNmwfMn/8SEYecJuurpPuGHuV/792zsXHf/FnZfzqCYaVbIiCZ3gybrnWH3undAsi+WzWQpkSojYKQuvccciTESG/NqrUkaG+ELqTJqgXxZyb4vvB6IwTL1BOQzmfL0GNkFktGOh2RRMyZuVcQ2/giQpwSSaJlc63TRd/8ncNkDjeNwwECMQTW9cbr7cZ5WZjydGDNOUaaZ68qQn8DDZatcDp5gPZqQSSg2bLf6bSQQj76ir110uN8oAjBM2RBUa9WrHq1NT0OqZQiJRoMFFOyICVCcJhOBKKMiiYgkln3nRwNhj2uy9GG5FV0V4XoyV7TI1hLsN5d9aAcJdBohI4fUJEo8cjyQ7T7KcESrO4Zuvj3zsEODLVsjd4s9sUQ7ZD0RK4riCd5QkBKPeDgEVvsn20PjiSlRTF4h0iblQdgS4lSiiVd3SClrRSHwTHYs7Tjs3NO3NYb+213WDVRe4UY+eabXyKExF4NEdGuqIBWq9iSGJQnRCREunZSE+V0ufD4cLZyneCnnEDwikCtCdV7t8Uv0BS7SdipiogfIkJyPK73Tm92KuecraEshtWXfQd2YkxcLraBRsas3TZFUGVbCylF8pStwijVm1QDk7asI4aAvb3QarfDIliTPE/5gK9G1imOByPdMwE9fgaBnO4N3JgseIjo0f/IKaHz7LCckFOE3imt0aIHMAnMy3LAQXursFvVlLycXbwR3Honhng08EeFE0SovVP2nSlntFuJPuXMw/lrw8CxzZUGxKFq2LZ1rO0o8GavOJ7uy4A9FLrafUr+swNuatI9g4yePacDP48pEJPjrr2z6RXJsx2Yas3SGDNkC7ABKLXy8+sIQGBZFqYpH/cp5EjYE1vZkdoc/rSAFIJQHV+tQQkhkaM1/hWFZLj2vu2U3nn37on3H54QojWmu9Kb0ppt5Bytgg05MCcjKoyDR1WptbHVxqNDDejI5i3wiDXziIED1+5YFaytoTFRW/UDG1QS8zyh1Rq+PUAekK9nobU1ylb9uYI2g/xEO9agAggksYrj9dOLPed3iRDtugnBoJdgcIgkIXRQPzRQmOYJkUBrlek8M+XZ+ndxZnpDWlDttGaJWM4TMSeDN5sdfskDfQiGIKQUDb4Odi/avntVInZ4q5L0nkQ0VWKAlCPnMFt/NFhAD8GCuTWMxdZvs30bnEgzDqaRnOY3GTxdaMGIBuIxIvh7iUPuMSXL8H2/xRAJUVANSPakqXU0KAQhBEtMrbKLoA26oSv9aOPIcT2DpDPy7fFKiCV5qkhXgxa979F6h97Z6+5wl1dER2/rXuXv206I0Ei2T7q1FdI0HfA6CLtWJzp4TxKgG4yGKq+vL6Tzsjie75miw09TyqQ82EnqG8C+YK2NEOWAMMRPRxll7ujuK2grhDkflUjv/cgoxyYZmfvYZCklW+i3m512tdN6Z8qZIvbz67ozLzPRM4au40oM20/JN1mrRM8qx7MYgX2aJgZdorZGrZXr9Xo/uEI4mFIhWqAZ2fxokneHz3rvlHWltEYKgdPDA4I12NU/+3w+27X4qhjQWGuNIJ6hOcsghHAE3BQj5My+74QYWW9XNoX3X35pC0siGo1ooKqErvQQrEfUoQdjNIgKOWYIRlwTUTITt+2Vqta3STl7o8oyIBzuKL15tmx9lQFPgFBrNShyiUiEvTb2fSVOiVgTeyho71yvV87nM2m6N/p+v9c4QFXxewOosq+7B4FA2VZv5nfLsrRBM2bc2AQpeFZGp7ZCr5VdApMkuozGojXrWhdySBbMwx2y7KgnDxZo9loP7HoElYHj23LqR0CwnlQ3OHFg/r7egx8y3dlhju1ZhRBtu2mz75+SIJPdl15sjWkQrtuN3BtTnq0n1IVlnvnqq68OzH8wYoxZZNskSDDoNIxr9XWIJTzx4cyyzICtncvpRIjZiQGW/cKCKsTRcI+2fgMe/Lp6cA2U3okoSayiCctyMGmInVYLrfXj2ccoft3RkiyxIDd6BaMCGgE2J2PZAajHn+N7w8GEExGoFbodNsch7s8sJgFJR9VSq/UpoyTvZVvFBtZ8ziGhYveoNIgSPR4o2Q/FgKDxDr+9va7m6xSPTm2UA77WXl9fOJ/O9ll+sMx9ggyESFlXQJlSZrCtFEvMY57IS0Zro2k70AEVS4p7qwbqxUjtBk927HAKCtu+8Xp9JUkXz+67n07GXqqt+QkZjv7EnUEUrEkWBh9N0FZBHL8PnZwiGgOtW+9iPEztdhOW0+loZo1sedwYgFo2vv/4iV/5lV9h34stxpSQnHn59luWU2VK8WBbaL8fEjFYf2LbN1pTLueTMXK0H80o8QfUS/HKwk7SEK0RPlhd6lnkwZDqG9M0ee/CKGaMrCAlYu+G83sGUEuxDN4bgOpZ54C2DJYzVljO4aDdNe+bWHZj5fy+7zy9e0fZi7W7/cDtfv2JADFQuxJ6h2gHbCCQstEy991KyhDjEQiv2856faH2ztPTOx4fLsySkSWyroVGJ2C9qEkM52zqkFspTFNmztkxVHvOp9NC8sDZamPdC9O2Ukr5hQ4J8MZjN4qgJSGdecrUHdZ15SfffcuHp3cs59OxjohWJY5g07VRtdG7sdB6MvaTiNgB6usq+j2049zgq7H2W7dGaIwBrY2H08myYg+gloU1S448WZFgScVtL2zryod374n+LFElh4jFRLEGtdzfK/halJGCeg9hrEERIeVMqZVeO2tpxJyIGqiqRAmcl5l13djWnSTWI1BsjQ4aOaiTFcKxBzpKfrhwmpcjgZnyhOTMnCeSRAjWYLe9Zz3IFAzKQpxG6dBbBLoI0aGyEISUJnIU77VaDzCmmaBWURs19V4xjAR0HLx3XN8+f3K4tjkaEKJwu66Gu8dIK8bcHL/bWnN6rByBNcVIygEJ3gQPd+ZaFEFptK7kmAle+YPBTN0roCkZYrHvzkpylmhXX1VvvsfBeDoSTe9BqvehRFguF77wJKX37msUtnUj5MgkVs0LQrNsmxpsLYVkkHDcxp6we7W3SiJ5cqJoq0iMiOrRqFbtNE/Wf/Dl16Te+9H86ePi5plt349D4bOXY8KibzImEfamBGm2kVTZSyWnRFwWyr6TspeGAqgcVLWDAuhle/XsOqWJy/lMb40ppwPmuTg9rtXCVgrLshzZgPaxscWDMNSyU9vENE9HVtdaG2Ga1jzjCIFt3YkhkdP9sAohUJs1n3volFqZ59ngBV+0XZV5Muy3O8e8FGsGl1rZ1pV5njmdTgwNScrJMnU17UnzhTAyDCslFQnxWGDzYht3nqfjgFBVaim2gFIituAHTiZJoGfL/lWNyQSQnQEh3eCkOWWYTmytEETY9sLz9sqjPqF0gkRELDmwzDCDVmO0CAf7pamibafWxum0sLeGlpU8XSjF9Cf3eu7nv86XMz/4+mt++KMfcXu5Yedvgmjsi4fLA8vZmnRMmX3fXN8ix6EiDGamYckldIPBmmVUg5F2u61c5gUm78WM3kKwzwxq+pIafKPja+xI/GyzjnWjXhFOMZNOVhmLWI8miUMlop4Kd3vWg6EXgwfMdlA7x1pUGjHYZ+eUmXLj+fkTAKflRNXGHCIyZZbzibbCx0+fmOeZd09PR4Ay2Mx7HDG6TkoorRJximmwClZCIIVkxIxpclgaVDqBTKIanBYE7XcqKs2g3JwS3fU+A+I9EiThoA4nJrLg72UQy1tdwcFaxAI3QRAiMdgVJOmEEE1vMs/WjxGrynPXo9JI3nMZdNSUM6dlAcFYiDFbfw5jbVlSKUg3VEJRZ0p55S4mtsgOK9r6sGerYJXhQFr8d8ZeH6QCg4Q7te5GdMmZqMpyPtFr47atlFqppR19GFolJaMsN20QAlOI7NvOtq2GVJzPzDmxbSvX1yspBx4eHi0O5IgmO6SaVxVlK4jCcj6hpaLRemr02ggpMomw+uGQp+xwhfUgxpdPIjQ1HDckR2JFSE5VHSCbdmXbNvI0gQu1Suks80QYpSAOE+nbKiUeYrand+8wFs2GSOR0shPwcrmwrptlXmPRd6PCqZ1jni0Epnk+WE+j5xBDoLbOXqzzL+EerI2UYAsgiVDeLMxpmphyfpONRFKMVP8eBhPZ7+Zk13J7vfLy8on3794fGzJP2Wh/rTn9NRCSCelatyw2RhOzjYXWdbBMPt80YFTU+WRof3WmA34fomON9I6kRNZOb9U2cgoEDSwxsTw8oGrsqOfnZ7btxlJm5sWYELV6U5/mWYlhotO82Gks4nwRWxLaoJfO8+1q8OFyYlvX4/D8RV4pJR6f3vHy8sp2MTHhuhd7rsvM6bwYfu4Mp3XbySkdTDH1rL43tT5a6CRr23vGbYya9Xbj+nplXhZOMdoGb+pVZ0ebNUWrtuNUsObtvdIMTku26+kEsQqk1so8T9zWjVqtitEpWnbq7LHmiENMyTZscWjADx7rBdoznb0CVGc6PZxOBvO4gCzGaHRWsQx3niek8xnEEWJgva3c1psJIF0AZnCT9fCmPFnPIEVyiKiKJTbWibXv6mywpoGgltBEF/UZKc8q6PEsjqRTHcdPFtAtWFq7P6T4Rq8kx4HQWjMYOQTSlI/+BmAMx95Jeba9L8I0KOfVnrs2+13UhITVEyx1yrut4SEQdU0I3lju3SG/uzgY8X15kCccTcD6pYqxGa2qhKRQBmzvz+ltZSEi9NCptaAeb4aGQoISEGot7G1HW2M6zRgl2H4yKGg3mnbOE2cnSsQpOXtRWE4z8zSBCoqJVox9FpinhQCkkIwB2RqfXl9poiRr90FSW5Qp2Mly0NByQkUJtZJECJL4eH1lW2+keeHx8cHhGWPUhGQshxA6ezEsep5MPW2BzzZpc673wPfhzoA6egjjxku0Q6j3Qx19WuZDuNdb8yDtWKjfuiF0k+OBW8C3nkX0stFKveQPbS+VcnvmdDpzOp9s8cdotDM//Uutd7YW0JupQYfCeQBfXTuXhwvzshyNu2mayDEdfZge7KCVbtTTKNYDUh3NdHGWhanWU84HldJUx7DMM92DtMFTTs0zigWgaARp9juW+tp/dzkNGUGjZVg5RE7z6WjeG0XPmsPSBaEZ+613wLJdeqchJFWSZFSMLrhtm6nF952pTNxuK09Pd/bJz3x51RS9gd0dRurNnh/q2h6HLc7LfMB122bVYvR1k3NCW6NqJYdIEoHYCQ3XbwhTtqDVdTQxbQMN2irN2HptHAZOh7R7lEkxIZ6NWifH1PAxJlKsCMbvb310t0w1Li7kGwdBVSVLPKDqwSZSuolInYnW/Nmc55mWEnurTkiwbLdVO5DneTLlrXIkflGE87zc9RweuB4v1jdDcbZbRIN9L7hDJUP7MJ5TlEBwcaKqa08cZRh6hjvIhWlP5K7HCk4NuvdqDKox6DiTUCbrBJOT9Sq6r15Vu3dW2QaidG//GPSkVdGUTHPS7JDKclw6IP4cXITYlZD9kFJxkTF3jdHoMyguPDb6t8USO4wqto4ihhIoSqIZPA2fwU4jVokI58vFCT+mbWimpuR8vgBCfn3huq5GdZehLjdtTQmmF2o067dGMV1NqcwxI8tCadY/RMOxb5PH5V6rISI5U0rh4eFCB1IX8SxAqHVHxaTee6tUGqma/F9iQNShpH3nuu08Omd5NL5NJNbog5oGBxsHlOTNleDQRGumyLQMFdv0R6bm9DKE8/l0NPgAWi3sLocfi7v3Qq3FP8MWyaCqjswf7BpHXDHoZ/DRrSIq643btrEsJ0zU04xO+qZUHBDbeI9SGj/+4e/w7t07vvj6K/Ztp/ZG2SuXy5lpcgl8tABWHXsEq+KsErKDM/s9jTGiLvyRiDfz2wEzjewvSqB2u0Z1YRZYD6iPDSSjYdUNTxZTeAaNILaxREwfsO2VmCdO2Q6yXgoi04GTjo3cu0Wcrp2g4TgUt2pK1rZ3cg6cTiagK90Oitv1xsvLK4+PlyNT/FmvkBLZA9mgJI6mZNN24OiqJggbOKMx8gJrKfRSmNOD0V23QovK6WQwZcqRBxGuYVQD4sHQsshRHaC4PqPYgS0W9HI2PUWQCCi16rH2UkqkbIlIzumAOUTfUncHpCsW2ERIKRw9kNHjCDG4a4BDGKpo8P6ZCrd19UNopgBl36BXCCYYnWL05qmvfg8MyXU11luakClxva3kaWIZ1UdvdlhGjr1pZ/EbaIk7gQXFdAdeNGj0JFCC63Zci0OnihgJRo3wkFNAgt3L2A2zTxIsyfHMWSR6I9v2Tc6JpsGtKAKlWkUfvacVAv58oIXqNjIQ/dCptVp1HxKtKQRlfpNtDoErzjwcFGL8u+poY417i0ODokaFbS5Ow6BPO7DvgsSRvL6Fmu2WG11/9MgeHw0WnJL1D32loq2zq0ItTtUFiUJp3Xtxhgr12hwxMaaWBzQTT7fG3it0Yz2KAMEqxBRQWu+UVlm33U5ub0IO7UFpDdFOCFbmPT09kWcT1Rz6CcExf4MsJFuDB1cX1tYIrRGHyMiDwKDFjhvU3UrCmjVKSv4Q/X1arcZv7405JVo1Gl5MCWn3UtCqDznsOVo3LUQ7msWjGeQHkkNdT+/f8+AVw1CED0hslKCj6R0cg0w5QYzWE3C8uWw7ilJcGV5qJ3TzScqj8R2CWY40y/innDzQFLoTCkIQL78BDY5NeC9HhKLOypgmK9cB1UCnOZyFfzcjFaBKyAYBNjWBpKQI3ZgVrVVSNuWp+IJtqkR1+wO3BRHpIEaPRewzgt/vFIIlFhKNlWMniOHg+8627VzOp0NM+bNeMUamZOK6h8dHWmus/sxTjHQR2yDjUAlC78a2ad2sM0oyb7LelCUbfCYdO+TENynBoRGBNlDT7n5BgwJrf59SRD37jCESpjutkUEh90NAvboVZwVZPNFDW9G9ATqe53AQGLipqB5iv+R7YFfbF/RK26tpILI134m24bfban2sKXGeZiQ6scChQenG4HoLedRa2dcNFhOgRocVtavpmQb99Ahod7uJOxowMmUPkq4zSP79hyeYCJZpx8qw7ZBQ3QlB/L6oPw49LCuis/MEYV2NjDJlE8oO5lVInRCTZfyCOQc4bASBFHBRXUCk8nq7mrNDVmrrTMt0PM9xb1D1/pZXHaoHaxEdVFYL5hKcPBEEulfo2ghqgky5L9fPNFL3pCkgoY+8FLPisUQ7pIjEaKiNkxkanb7t7Fs59DUaTHsyLROhKbUY5dqQm8ZeICVT229lNdYYgdt6QwSW5UwPHaypn9y3BqYYicnsMlqtEBw6UgCh1B1VIeTM+XyhNbOcQO/4bfdDBjgyfWtEJwbVbKgwYZTMQ9lrN2rfh+GeZd4jyLdm/iQpJ7JYL2HdCyJwWqaDWithYOZuctWs/Eo507ftoKAOM0Lt/a5qZjCZ6iGyesuqsOZRsZ6DQ1Q5Jb755htSSiYIwhlV3bxmeu+cTjOofcfmwqwwWZ4QHQJTZ0FIMN3HYJf15sEqRqJCCkJVUzKP37+cT8QQ2PZq/lZvKp1g8ZAIB6vJgRtah9Bc05EyYL4uRbo3s4Q5W4amOhgiVqr6bXOIobPX5o3lyOTfbfydJVlCce8h86/5+YfEkamGQAfm8wJYZUbrB7tO/L2MtttJ04TUikgjqrGOijYTG3arIA1VsUagBN6sH6PHgjUdjdpqmPABE3gCoypmfTIybPewuh8w3r/onWEaKYzKNfj9e/OFFdatkGM31XIIiFuOIEZzzt7r7r0dnkpJTK8wBJPLMtFbZ5qNoqm9oMEqTzOFDKQ38NH1euX55Zlv5Bu+uXwD6uZ+IVnS4N8tffbMPLHrw+jPVLtjzVVHO1N4myWHo2+n2tm7kV1SMlM9BltR7dn0bnoJkWTBPtwx/GmaqK2608Ew+bSGvrNi/LT3prqOaxh2FTuqgdP5bCZ3yLG+7VFYPKi1gTq7yKucUdGOmGUJRqfUdpiAhuA+WbXTesUdi4x0EINX+xwoB9xhqJzzm/9uqUWHu20OFqeSBF72ld46p/PZDgNnKdHufk4jflU6dKsuhWQtBDdCbNL49OkTl/OZdAn0DpoCScXk2d0z7AP/9KZnaY2qhRTspOmifjgE8Cw2RNi21Rq7KVH2nbLvRwMxiDfpPONPwah6dqH329CcRTRPRu9rHaOF+kKOIRAmyxCtWciRdXQdknJTQ7ZeEW8ugwXS9fXV4JY8Hb2NUe4bf/x+cA2LC3XMmRCOhvDwoOq9OVVOj7+rZWfdyhG0d1X22w2dZubTcmQkVs3YtRs+bu9T/Z6IQwDDX2pdNx7OZz+ALUMam7O1xlaqPehaTE2MElMmwiGWCtkM04wLXa3k96wOx4jLeuN53zhfFub5RGvVLByaspZCnObD20oEGqZNkBgprRPj6Cnd3VZVgabsZaPWhb3sZtQ2T/y818DpBzRSigm+eq1srbCN/pA646Yb5/4tKy96/6LsGyEnpmk+nDdBPMOygNIV0OYWKHEYANuzrY15nmlqFWKKE3FAgjJgAqNTuiuZVVpYQLT3dgxa5CAQjKBjMCacnR7etVP24nRToQVlkmgnF9AlEByGlBCdBu4sNMXWlAREO7s2skZ6UKD5Ur+7la7bZvonTwZqa+z7zilGmijZ7//vxtHHP1uPL6G5uX+UkLyhKw7FWbKVjn6DVSbxSNbE+wO2rg3iCiJOXXcIW0e0EFLKpjr2w2GcC4wK6c2elhAY/kYAGuz3RSqkYQUSSFM4MvgYouuLumXv3Hub4769XaNWKXoPT5s3oMVdC6yyGvRrxLJ4OSqwNwuNO5T3lgkVVGkxcn54YNo3R2g80csjSRBK2Swj9MR6ULynmKFUggpxnhEXLKPWc5pS4t3jI8vpfFwj2knqZnxmn2vl6J0903l+fuG2vjJNiS8/fE3o4g2cfhzU23XlN//Rb/P+3RNffvX13UobjgqhNSVicFGeJmLvhy3AaNIeeL9nj4PlgB8o0T10BpVzKJNh/GwkpOyB3YUqYhTG2hpbKfSuXILZB3SHjMYXCXBULDGaSrz6aa7d6HxBzLZAe6dshZD1MPqLIfB6Wym3K7iKfCiqa61M3CGDsYDtAP1danDupevwKaplp/aZJU4YOmXOoAMSaK1Ry8YyZTQlo7vVxnlZzOy1N+ND+3cJGkiSiY5NajMLj9fbjdv1hXmeeHqY2DdxkzX8nlsTTkIwAVgzLcB8Dq6fubPBRlN33906JVgw2NfV7Y1//kuCsCwLy3JiSq9cR5DwhCY6ESKKJSOldfPLivcAeByowZqQSjfKt3ajtwbr/xzJR0heNYzGt5u+RWvo1WAeZritRkp4v8Az4GQpoyn+xWE7UykfVUQ3NwJDQrxJDhaI3rRqilPJh3jMOyeWbIQ4mmsH2WPg1yIGPRlcBBPJ4VJjv4gaE048AL1/9453T08s00SpO/un1RKYKSO9kePJIEO5wyIHDdX3hCEsxtyyPpdl7HpssaHW1oO0kvPbvexsMt8Hg020joo5xuNg0qM6GIFfxoI57uXbnpeqkRxyikcGj9jYgN7NKl6lERWrxkYC7BXsuHYjjODN63AII0Wt5xrjOMjupqcpBJpYVyISPPFQaGb9EiV8Rg0fse+uyrbKvzfbw+fTiT0It9tKDEbikd2ucZqNEvvd9z8xn69puR/kIdGCU+nEKNgRT678c/JpYSi3gyhNIY3SGb/xEu+Zey0bIQUuD49kLwd7GA/J4IWHy5mb2BfI0XyOQgj2PqOx7MFwXY27+/D4YP0OXyja3Lvcm93Da+ZtpjJKptEb0G6aBdTpon6oaTf77pgS+7ZRN6OHBomY5b99t20rzHMmpvwZS2WoYwcL63CaHeK4Wg8hXdVuKkhfcJ+en83XZ5qopRyZ1+QeRLUafjyqjre6iO6w1/gsVT2smkWwHlA0P396BQ3EaDbenY7um0EBfhDMKdrhEwJhNN7FNoCtE2OMDZiltIo05f3lzMNp5jSdqdWOeUUIQVnidLCKrDRPhAAvtyu9mmCr1srL6wsPl0dUI63tlNLJWam1U+qOzQaoDP45b4LiT3udlxMvp/l+H5sdPD/57lsupxNxMjaVdv1dDcuI6IA34ewN8FEZer/RAvFkvl5DTGdJktkxvO1PIdGqM7+2VgvP643H09lddzsegj6DUYepnoEYuH2Nd7jcoNKSpX7oCXrtJkrMbtDYB+zgFYMfEEE5RHYWUBRUSBJpA7axzINkvIbPhFN0x9lFKL0ztcanTx9BhafHR1977rfEyHLNiiKo4ftDaZyC+H50ybjI+MP38mAxec/zqBRHxSXAbu/tENLpdEbld1O/FY4nIWZmJyOr/9yxdTyLGBMaut8zeybt+FmDtmgN0YbEZP2CAY8N2NQhqEBkEA7Qu2kpYkLY6Kyn1ivGfLM4V4PZ+wz4UIKptMUFvHpHk45E5/gu3ZKbkfClFNn3zrQsnxkPBpTb9cbj5eJWPnqs1+waEOvz2Loe6xTt5JAodQfJtiyNBCTHDRzVRHDP/Jwnnh4feXx4YJ6nQ5UN1ogadM+Hy4U/8kf+CE/v3zMG4LRmlYJVf0OBaq9t3U3t7Jleyu4v0+0BjoPi7WMeGfZdj3AfMjJ6HbjNx3CSlBAozXoL4pAXYtjqaZ7Yi1E0g2+QON7zuGm2MILcPeWt12GrPud8WHMI+GClzOV8Pr7DEOwwtoPfPwl39ae6YtM+365hyvmg5dbayWnifL54Kf/5S4djqx8qAGlZyCnRaqNLpEs0TxmJaDDTulJtY3RVmliDNKfMw/nC1iu3bT3gEIMHBl48AqFtmvP5RMwTEGml8Pr6erBAkpMdLFhXtnXzwSob6/X6cw8IsAPyvJyIOXFeTtYo7x1pelSHIURKN4+rQRsWlMHcMlVvQoP1vLT1z+YAHPeyOVQXA9ftxvcvr3c81+dAxBgPv6fX9canb7/zZ/pGE9BtENJ126ilGq5tmNRxL0O04F+HHcVhGHfvXR2Dug7G1b36VWcs7XvldrNs25qs9/0jfg51+pGEWLC39UuHzQknI1krpTDNp4OOmd2OvLXGertZEheNrdXFBKPm0Wb+TbZLBr36noVbLyC4u7Me1/r2ZT/rzL141y2MhPNzurz/sv8hP2UxfQ7b3IejHdYeb3okIMYN8YBrFbzdmz7k+eP5eqUxTLvGAS2MpNWeWQjpfmDoPeaNOS+OzB39Fnv23ezLw10JP2LCMDyNEsnJ4k8Q4bQsLLNRwEPOnM6n+/Axj68jFoMcz0SQI+aWarDeNA2PLqtI0zHFLYA4z9myZtCmXkKPrENtETuLImo4MuZlWZy3bw9zv5qP0bwsXC4XUjC1dG/NKoDxUFQIIRN8ENDb13GKjrLvzQIZi+/tQJDb7cpt301IguGk58uFXipl23m4PFjDUyHOMyNEjMqAEKyp2g2DrLWaUV0Qszmv1RXaBjcJo9pX6J3lZLoKO818etxYPGLNrQGtJQZeb/CA9g5T9qV+b8C3spNiOIR0XTuo6VmqmjJYCQwHXSurrTJs3YDE7llmdby598GcEMRjVxJBQ7Ln6/e51YLMJ0KwASWtVVAnN7gNi80qSY7hC2FeOJ+sz1FaQcTZbR2iY/n7vrPVwl4rp4FJ/oxXCIHT6cTjwyPbtrqISnl4erSg5FqIXq1CGRtrrB2Oj1AznnNbkFoL6H2qYWcwWIxhdLuuxBTY5xPDUTZhsIUG6O6k+fT+/ZEEiZimJsZIija9rWsnRfE+1qgWbNaB1mrJxZThjbpXtTPl5FToASF5pRACrm50KKy9mfPQjwCXUmQthdfrjfk0MTucM0RlUQIrjb0WgswmFrzdUDWK8LatlGVhr+UQhzbvHYRoVFaD4yBPni178FQxrt1Igu+Zvficis8x+Lcv6xVgJASEOKqGn7ZO1CtkfXvafP7ew2frSPC4wytTSJTuDEknEoQQjTlYdjrlOEhiSt6Q78d3064H5DauIHjVLghRldG+yDEda1O1IjGYCnzcM1W02vPpXr2O7zVi3YjFIhBy4iTCtm9ugChHXHy4PLBtK/Hkc2TQu6NztypOusUOo1X7vBr/ffUYEWMgfcbVjSY+6b3ZhZhdKREbgzjFSO1yt5DwG15KYV6sKdubYYuSswVcP81idGGNy/zBWT210Utxap59gxQdAnKsdcBfnz141btK1KuGIJHX12ezmfZsL0jkddv4+P1H/uCv/gFrWrZC6Hd78EENa9Vk94gcn9n2jZ4SKWeen5+ptfA+fnGMBxwqbsPF7aCKbh98TjZlrLdm1h5+6h/F8vj9ENBaKet6jI7U1pEY2F5fqb0flhwGVQSU4eRowc+CiWGmrQ67lLsGwnx+zEojyBuGCYaJ1ybUspvjLsKcJ/ohprOs4uV6ZZpnLunE67qSfe7DgGJyPhHELUcEa8ppgW7jJ1UT+7by3XfK48MD23KiP3aHHX72y4SKkeg9pvP5jGY74YrajJDz6UzLlb14Y1ctkA6IEXG7h2A00bUUQoA5mlI3BVPPW4YoXB4fjEXnh0LsgSDJNr0b752mBLNl6qNh3rsa4SJGpNqzz9Nky9uhxDFiU+AQM4UQmLyZH5BjUJQBRhBVII4ZLIFOIEjj9HA5MkywYBFyoqrS1SrV02S6kN7vNiUiwsmHU6maSZyImPK/VVShXCqtFMo0k1PkspyPiY6W4EWWZXK3aKzvFWzt3Xfsz8gEftd/dhTGq4z7wfL7JhJy/8WjOhn/yQ8CCeLqeg8xR2VsYOrofdDvIs/Wqjtiu9jP9yp9wErBzVQ8mVOsvzOMIYe2xG/CgXAgrlcwi5VB3hn0asn3PhPcD9fxXQaEDSCtUZMwOSxfFTRawvv49I5TPSGoTb3zQ0u8r2SMQ6OR79uOBDMSteVmIt3WzG0jHQwZv5Dof+KOkL014jSR3ZpYtVkJExKEwLZtn52iBrF0zqcTp+WNMbSfTkNAFDxDqq2bEChEa+KhTNPMvu+WhR8P3FgSNjSo3oOpv19rjdP5ZJvM8UFbaGYwV0vh0+urqVO1kYKg2Tx/h6IZv2m12XecvXwbjbaBiQt3C4WjucSYB5w5X85HRjX6HH7zjsMIQHxxamt8/Pgd19vGF+8/8Pj0aJll60hOpMF8gbvoMNxZD1FAQ6CsPtrSKxJVZZlPEIzt9baROgJnFwtIij2TKWXPDo3MIGKKcgmYG6VY8xqBlAUT7ok3Sa35vddiVD+1DZRdiDmw7xSSqUZvt+NZ/rzXAaNNM1PK7CGhk83+Hsyg6PRT2Xa6RCMWRJ/21k1rMkRIDU96qtKjwS8hBCZvGkYJJij0BZgkQA506ezFqOBTtD5Gq83pm0Nopk5/DQdk0sWamBLNftoEnxFCtKYvdm1BoTZT1h9VqtuqaDIPqS4myMKpxeL/PkbYHu/dO/O8IG1U3G8SLXENjHuX1ZFETNNBU75cHhAxeG6eiqn6nbppzWXTiViGOw6IN5+hnzfhf9HX7+4n/EK/83MU/G/f0yAW/MTwJnlMIM3kFIcbrbP0kM/6EtEPiAEfNhTtzdaQWCDueLNZjUQjMTgNXCEEo5nv1SpJQMRcBBJmnmoH1pgrc4fMxj+PVwJKSkR/5iL3GeEpRY8194PGWBxqBxWgIdO0Y6XA/XAbQmYEUsAcX5fTyW5CLcZOSJnn11euz5/4pW++sWagG+SJCDEbR3lMXTN/nGEeZlhWjOL8f3U0JNwhGr8JoSvLMqOtU8ob2qxXCQPDK7UyTa7b8Aen7nM0mFGDJltKobnGYZpmHh4vpBzpZecmhv0+X68s82yb0QN4HA1qMT7/qFb2fSPmiXfv3lE9ExTu2HMIkXWzkZrn08k2B5Ha7DAYwjsJY/azKZnRTsoTn56f+fjpmSSBeTbcMapgjis2FrS3doxCVITkgjnEqJBaG4g6nh69f4TBQTg9Dr1bUqv5GZmIrpo9dExIV2tqHRi4UrQzkciuW5EonHQmYYs4iAmXSimmkg12bVEs87df62x1NUV8gm3bKdvGz68h8A1rMNeUffCNO7IO6ERFDvU6QWitcisruSVncClFgWYGf0G7DzNqQEUY80PkWK+1qvnuzHeNyOvrldt24/L44H0oa5AP0eBdHBfQEBkFci/lGAcro1JlVN73QwTPoC1PK9RSWZaZHs1l9dPthSlmmy+OBYScbU8Mq/iX68rTwwWi0dan8+xBwg5SVfOwMqjZKPASI7d9J4s5LqQ8kdLE86fno7vwxYcvvMeu1G772/odhgrAnWgywvE/7uuzvsI/5q9bEB3NcQ4I56ceOnL/h1EpIzjMMhiGzq4Uh9n6EBbeg676/iIYSiCqdB14vyVeY360rUKbyCkKeTItSduMzhrdXsPih73eUvMPVtmbhnaI0SxGeuJabrbncyR1E+Q2DfSyoU0d7nRrHd8/te521okxMFUVCd5DFSilEQ6RW2uUbeX1dkO9BCr7xo+//55ahrgtWgYfo1Uab3FSx0HHZuq9GY2wNzzBO/5OFW43C6opBfKUELFDZgTqGKNTffsRbEdjaPQnRkY7HCPBsxnfhDYEpSJBOJ1PxHmykxIxocmAUsBP/XvP48AOvTIa2f84GFTNFyomL9XzzGU50zsHPj7e235uKGLt59dt47bufPftt0xT5pe/+WV+6ZtvOC1nRM0tVJs9xNv1lb0U+85Oo2zO3QaO6kr8gBg7wA4vY5QljLcu48vC4S0fsIwE70GNHxARiHiW7eVwNFbXddtY992yJDoxmhf/2xgh2JCqVquJ3mq1TF9Hc7Ad9/XnvaZp4vHx0WGnxLzYcBxxexJR87/fy34cUjISkZhAhlo6I64EVjXNS8zZ8eXOtu1v1oCPq/Rgoao8v77wel3NWwlzGbjTuA12NHFeul/8myrnCKLhLhTd29ALOeSbIvu20ltjnm1ITG2V2srBfe/g68MzRbHnLSnZ6E2vGofP1Pg++HPea6F4UDiuS01UZwe/MxxrY7+tZrfje8HM5zG68dAeCEf1PijDg5Dxj//yiP2P8TpEm3r/91LKZ0K1n/5RdiiPflEYcCwcDCtjwjlINRIlGcLIIc4zZGQkyPfDx50KBBCDv8WhsRDHWl54fHgixGhjEVqj++jatEwu2vzcDPBtjGq9+z62dRaDmRaaj5XceyxroayFkcQMT7acvO+FJRI2VsE+7/r6QmhqtroRm0OACDfvI7x7euJXvvnGpsp1cxGVGA9f85CTwS6uLl3XzWAWF8sohqHlNNF7hQONV2KyByFhNFP1jVgHg1QYugIX6+h9cHgtxRlUd1weOMQpt9uVj999x77vx5S6lAzLPp9PPL5/dzf/e1POdYvyxwjU55dXwObZggWFOnyjfPPXZhTKmBOqJr65enYwHm58ExSmPPP48EDZN/7hb/yG8djnCQmBve4UF8S1WpjnE+/evSeEwMePH7m9XI9Gewzymd3zuu303lmmfASEmJOJv9RYO12VHJPNFwaHsJStNYcxbKEc1Ny9U3UInZS2V+pebAzoXvj+00c+vbxAU1JMNqkLjE8urkjulonGtxbNpVJrPVyHf5HXsizkPLPMC+ZAagnFd58+8un6SgObrRECUzjxcHokxUSrBjk2VdcB3ZXGrTWnhBqvPwabtzCo0K1Wnl9fjwpjnmfev3t36CvAFfRvglXplabGoDJqZT0q4l48MHtPKYZo8yRCOMZ5fvr4Pb/xD3+D19dXUvTRst10OkvO1jRW0ya8f/+O2SmqIua7czlfPEEJ3h8YQdT7jzh89ybYDGjjtq62pty3KqbI+fGJoW8YvcLarfJvpdn3fPMIjaF3p8D//+Ol3exs7GCyGDPcj+9xZ/ww7jfnh6Pj9TbeOHwWjEX0s3vnoL2jFtHtve/C3PEyW5J4mDmKN/LH2Teo39OUjbHnB0yMiZDMWiP5kKforLDo1xQdeh6fJmoswuVsc9RDNE3S+A45ZlPmYz5O3pRCUmA4KRxITJL7PfJEOIhjaK/rFVDyPPnsVGFOmS/efzh4+2OiTArBmjLOBrETy77wwJfVqwwNwm29sa4bY/xnzpHTaTEzqjceQTAYP/3QJQzfIVXl+Xrl0+sVcFMv7x20vRwZANjBcrutfHx5sQaxawdO02QNRBGurzf2fTv6CoMyaKeyY7giSLdsTsbAoCCHXXhvDdR6FWZbrnZYTJllyb7xyqGtGOVcFKMcL6cTv/LNN+NWAjb2c9t3wy3nmdNp4XQ6Wd+k2VxtE95x2B37ZA6WeeI0zzaop5lHvDo2GmPwGQmjMWhQ3fCuak6DtCzDDrbaGhULFHaAWIYYVDjNM3memOeFZV5Q7dz2jfW60cVmIgzRl6mg62FBUNabkx8seP+is6+TN6xv68r1ej2MIj89v/I7P/ydQ4ugauybvMxOFjDGTA4Gw5nq3sdThuizr+/zsz0/NKy+Vcq+MTxMH85nHs6n4z6OvoE4XjG8ABrukwTH/WwNMxzsg1ptVcM0JRNFKpTaIEbSPEGMlFYdn3bngGl2q/t6bGxD2NyVVsd0M99Tas1q1e6cfTlgqewzp2MwwkMX5csvP3BeFmez4cygyvV2ZV1XI6LUgrZOFFMkX33WwRBh/aKH/j/Wz7350VrrEZjH3wWHvQfDS8RiRJrMD+2z96PTvbd6XIMFIRgN7dGzG4eDP1/7cQv2io0XHfPoh3vt0Vge6IkMyZoch8M4mAZJQkRIkjidToY8HNdhl5fC/d9VMF0Ldp15yua9JIkppcNeacpjdjcESUiysbRtrz5/2n4/xXjE3/GK0YSCNmskBG7bxrauSE48PZysUSP2heJeSSnbwvPyxppm5pgpwWiQMk2Gizpe37s1t0Uy6/bKvm9cHi7HiWzPw7xNktvz1mKl0Gd+Tr27WVtzCqpRXE/ziRwbL9dX9taRm/Hj99bIIfCDr74iTZlSKmXbSJPN4W21sa6rNQclu73CGO+ovL68cAuBDx8+ICLM5/NBL2ytUWtH8htH2taORWHQg71P9gW7NrURxP77giA5oSinaeH0g5NBLiKGFQrH592tUoxi+P7piRCCGS46q8oO9Ihuxcy/ghFop3m2aqwWiIkkEyEOGMCgkaadoObf0oMQsR7CVjsxdceZxSdbWZajdGqpRqOLwvvHRwjCrs2DmS9qsQDbgEikbp1JvaF3urD4Oti21SqjXyBYSBDmZWaa5oOSGOPG5Xxi31YfqxttgwXvMyX3DWqN1gNTNH8jMza3XScYrGKld7JJas4AOS9362yrfIpZqZ8sS1/mxTJxwedDDAorR4+IbodxCNhaplszORlzKgYTAw4I7vF84csPX5iTq1pVK73TS8fM/QFtZgwZrfpQ/3zUR+H6Iff9x4+oKu+e3jEsQqKYLUMQ60tc3Yzy8XxhWU6g8PLywqKVvDzZnOUSeH55IeeJaVnQ5j5dEmw0bO82Z5oxC+JnP0uDbR3fl9/7d+PPO2XU+jfPz8/85b/8l2lt51/4F/47vH//4b4+xp+/C8P3d+UOo97V2sc+E7mvBwlEFw132+QGMbdOD5Gc3d9JcVuQ+6GiISDdYyRGQf/sIPLLGH0NUYGuRwySZmyqLpHgvYEa7u+hXTkUW2/RDzBvLc2+rzshTMxTp1SraLfvdz59/MT79+84LzPFPcGs+LLEYlRIe6vW5wSSID7IY6LuhbLtNv9AovPIrTQ+6JdvHmR3ZoT5q1gnfwh2cp78ZxrneeZ8mjlcL1VRDfRmGXaeklNWzTMJtYZPTve5C9I702xzcZMPksdVn6UU1uKnbG20GHj3/okcAttuE+zenU4ECdReUDh0B2P5yICFotsK+CIa/PBeq8+RsEx7TJs7fGfG+2APLfkDzJOpogUXFXqTSDB2lQY7rbd1Zd+N225VTKC3wpiaJxKIkxkBjqZ8KaY5eHx6JC+zZbzBlJ0pJiREeozmCuk9nIaSvNlf9p2ebDDNnKcDT04SDutyDYLWxmvfmfPEknxm7rDfcMgC7xuZl1CnxvtGH+NWb9uNnBemaTINQgw8PT1S/fv8Iq8UAl98+IAofPr4PRIij4+PPqzFFntD6GV3GxIL9mvZaV1NdS2C9MDByROD54LxFK1i9mBxOtkhcH195cfff0dvjQ9ffsnZRZRmeBdRrB9XvZqxz/CBOQ4l9GaDsFrr9NDYrzspZVP++/q/bRtBDVpbTiertFCE7qaJ4m4FlpsOBo4FsQbD8dRhkuW8ENTHjY6AiB1WCqzbzrfffsvT0yOP758Mhgree0TppRFyQCVwvV6Z0sTJB1zl2WixQrBMd0TgX+BluiE5BF9gCeH333/P7XazirPsfPnlV1wuF377t3+Lv/t3/w5/+k//B/yF/9t/wnq78q/9a/8z/ui/8q98Vsn97qrhZ36+Q9vHAeGv9qZHM6oUs2zpxtLzWDdgZGUkvp7mC4f7r9l0eP9Uh8fXXRiMV6OBQAzYLGoU4v2agio9Ru9z2jWqRXT7e8/Mqiebycoac4KUGdWNVhvn04k5JXfwFkLpR98ohEjZrmzbzuPjk40gYEwJTZkYM999/MQPf/g7/OHljzAnpUXLrlqrJHHvmN7N9kEGNdIOie72hgNO0tEgHdjdNIErPv0JHVkCaspVQnDaZ6Q437z6kJ3VJ5rNDhd1bcfJe17mY/F37UyXBQnC6+vrMUYzRRtQEnqwMkxNGBdiZJ4mdp+WFmPk6enJRgfK3dAM1aO6STGyrsYjz9mtStSsiXuzKiUEGxIiISCD7hqCCdZUaYzGIJ51KikHUrsPd+nNsPOybbYZY/DegDBNia6NPDm1VJsPgXGascMeCV8wvoirurXIqCR6Ix72Aka9ExWINuWtbJvh8qMpLDfk8mhVTMADD9RiGbAQkQDX5xfqvHO6nLHSvJn5G52cfSobhbrt3G5X1u3Gcj7/QpvbkX3SZHTUFCM1RvZSWbyJXWtxwaeYFQvW+A1esquPLu1iumCJBsds+0aowZp+KdIb9BjQLmwol4cH5tPCspijr4ZAi9wPSElEh9E0NGOPRRs7U8vdQiY52aHVesxYsQmQypwiyWeK9K5uBW8W2TlA7daQh7vVuE3D82a7GESlzeCky3K+V2mq3F6v1H3ji69/QHS34fcf3vN4udDbCHZq8+NTdOKCVZiSEiEFPxyT4/iR2qtx71FT9XubdxzCjsoD4eg3IvD9x2/5T/7sn+dv/1d/h47yt//2f8Xf+lt/k+fnZxcE7vzgm1/ii/df8Fv/4O/zW//oh/RaeP/0hLTCX/krf5H/8R/9o3eoRA6S+M95jQPlp5xpI9n1DL13q5gG6cR2k6/1o52NV2lywFCIQcJxzHOxGaa2BvFDBhyTOmoco46L9c6sT9p8rDQuWDWoydzG7lWXiJJjoCGg5oJrtuRujhgzDw+RbTcyEVGIXWh99ycmRt8/Z787xpxq2n3GdQi8f3pi3XYTjXDHqI9gnZLNS8BPVpQ8DLdq9cAO0zTTmzct/a5bECmHhfg4AbsO2T5Hcw6RI3sX/9kYgnHEnRabojlH0pQabVPfbjc72d1b6Pr6zA9/+CP+8B/5r5FTYrutlBg5Lwua7v0M4NBGqK8awyGrV0j2+dlX06gOMtkx64YndoQgrLdXyl55WM6MOfZvG18hiDVTW0dpBGx+d4yJ0xJ9mpwP+0iRvVcb+RncNRKO4U45ZtIlmVuA/16tlTicaeP9gOhik7tQWPeNHM18MKZsow+jZVQhyjFzYPKMUfZimHdv7K2wxOUYjtR7p3SHbqLRAT++PCMv8Acm61l0bwom1fvgnmtjyhO3deXl9ZWnh/eE/POtw3NMLPPM6+vV5hGnREzRx8Pi1WA+BtmUZgnHaVlQtYGQjDI7A47XE82e4vWjjZo9v3tEg6KlU3o3WqiIZXidw/NHmx24MWQfYm8CrBSgBev3ldKc8n3PV1vrdgC0wiTJIKicuMwTISSr+lR9IJg5p9bW2OrGKVjfTw4DP/cgcprs6/Vq410dwhqkDO3Wc0xviA05Z6Z5JqRkOg1vkBp0haELfechXqyPiE3Ok2aHakyRMCC9N0H489j7BoNQg5j+wd//B/yv/s0/xn/2f//LvLx8ZNuMDWmeW5ZF11r57d/+HcZsi5wS79490nplLYX/4r/46/yNv/Ff8k/+k//NN/f2bUv387pCPvu33+cleFV7twO/T8gc7rJ3e23GMeGB3nOyo1IZX9uqP3dFOCpYTxLtF4gBStWjd2j29F6RSEB9CJXAMXtE1cwFG+owo/mNISDdPfBqIsZqTfReEXW3DCqvL69M08QyT8zzTC3WQ22YuDIqhC6WBU7LzB/65W/M0iJFajV/pWUwgDzrb93oUepTjg6qWfUgr3ZTuzbPZzu9W6Y+rCx+95yJnNNh1TVGhA6V8sD8Y7Tg3wZtr43MBcA47wZvWnY4z2c+vP9wKJxbM1O/2g0CizE69DBWkx6H15imN1xZwX2VvA8wfKPw61pvG9999y2vrzdOpwvny+W4X9nhKDBl+vX1xu6KVpwuKx2D30TsIZWKSjB9g9Nnmw9qssTYDsNBb5TWzIKjqxuJDdaX0dkaA8dUmjRiEiQ5e6Iblh09N+oe/E7TzJJn5jQ4+X5/XMGdkgWkfR9wgV1vR/nw7j3v3n8w3YUObPguAmpqJITqszmuzy+8vD4zBtT8rNe0zJwfHpinbD0tr/Smyaq6gTfTlG1bqcMXy9lft+1GyhP5zVyEoPYcz6eFp3dPVFF6q2jtvLy88PLx+W4U2O7Y9vcfP/Ldd9/RBm2xd2PggdlSdJvieCsbt7L5EhsZqr3HHL1qlUQgOH5swSVaCWHfsXeu1yv7zRKGkIaIzSbfSbeq6vX1hd/6zd+klHIEtaZ6kDHmaXaigV3bEfx6P7RBGu70SFqnbHbtpRRu68p2vdHVKbHVZhbImOfg0dLElMNG5k3mHoRvv/0J/+b/8o/x5//8n6XuG7Va8tR7P9hCrTd3iU3M82xOyyLUvdKcIfYP/t7f41//n/8v+Jt/42+w7/uhq2pt3F9587+f/hqN73GIHlRT7g3wEYxr2Xl5eeHT8yfW2+2A4kcS+LYnMijHgmX5ZnL4+XWMXkJM0RnR3pOMuIbnPhWvdqsI7n4N3goX60EO88fjs936P/kzz9PsIw4ikqCJjTmdzzOzIxO92UFiCWVyUouSerASJwZzDW1lp9ad1+sVUeV0OjG7eMOU1uGYt2DNuHBYfw9KYivGzjmdzzY6MmejJzpuqv57iDgne0JSJBTLhoaflA7cSvUI9iG4h749DpoaJBYdXqjNvFbmeWJevj5QyhA9QxqNHrHGYUfuzU15owrHDPvUq5aOWRbvpXA+n83V9nYjxsDr6yderytffviC919+xbreaM7QkhCOmRbGSjJ9BqrWwFbjvNshq4cgR0QM+vHvPu5DG6V+iCZYU6N9RrFmWRbYujFiWqvsdbf7czE/q1DtHge1EaaKEntEQ6eqaSK6KNWGKDP44LU1+r7boTFYE9UbXb74DXOPPJ7PtrFwUzUZG+5+UFwWw/pv+458emY+feR8uRDC7zXd+92vGALz+Ww9plaPsZ5VMbFcCLyuVz59euZyuRCmidI7z5+eEQnkkMmTVaJbtV6LdDO0nFL2menQ6Oz7RqvWzCPa4aPBqomy76z7Tp4mTnk2UCUmOq6Qxkr+KU8sg4ygLtAjcA5CzNHHWipl2/jxtz/h6cFsu03vYx9b1e5ZyzYAp1UlpOymcGMKXGPJE199/RVLno4E621jdrBv7k3hYPRRzJAxev9Pezdrj9bIs9mWtFZpLbKVjYUTZrXSAbeS8MMNcVU++sajyddIb/zxf+d/z5/7c3/mgKQBo9MOTcMRB/VIKMf77L3T6OSYKVL5f/7ar/Gv/k//J/z3/qV/mX/un/tv8YNf+oaf/PhHvHv3jv/6f+OfOEw4Re4Hwlt19r0vqUcVHtPdgPDt//bd6f36phE9gKK37CAZ/6fcx9DdeybjsBhmh6O/gZiVecP6EHZgBWLEbHrEIM2m1foUvvc69wPoaJKrkILQuwklU1TWAfsJhG7sLxEhEWilUnrzuSDisdkOXYObVOwE6crr7ZVPHz9xu93IKfHoGP2glmlIzmwwJ9ERxJrjqgLs1YRgOWdz3vQvTQi8vr4SQuTycDFY6PmZW0q8f//eYZR+VA7Jg0q1b2+K3hih22yIEdBLbSxO/dy3nWGHMGicEoIxFILZlS/zfFc+94bhmOE4CBV1ha9x1EvZiSHy/OkjikEXVZW9FJJmHh7ecT4/cbmcjXbaG70a46T5NWvvdlh6kzGmxMuLQyY58/Hj9zw8PHLKkw1rLwXJyawscEjkTTbeUbP1xawZuq/Jqt2eF3e47+XlhTxl5pT54bffotWarylPIM3YTd0cVdu+c7lcKHVDPMNuXTktJ+LlgRTdB6kZb99mSEDXdjTotXfv4QQkm9NkG+K15GNbsw0uohTi5eIDWH724TBeIUZSCLx7/47b7WrQmEMo48DYNmuGn5bFmrnrjXmerf/la7WL+/YEOeZpqGf4DaNFv//iA63YNatYf2VUgF999ZUFW1UkZkKwYXl134x5lbPLztzArZgwdF4mgijb7vRfx7rNULJwyxtnH9kbvbMZxUbUDq5+KbtX0mJrSGyWRsyZH/zgBwfce4dJzHByzGEOMma2+LjcZv5gIdpIYIAeIgRhdq1NEJyK3dFW6c2mu10WY9KpwyIiweZa6+/Nnv/f/6+/xv/5//R/dKJAcvGeVTCD1g4+dc4dHgaFXRXkjYXELInLZeG3fuc3+eP/zr9l0GmceH35SEoT/+J/91/kX/6X/vv80//sP8Mv//Ivk9L8e5x/x34SfeOL5OswSDiC/6DYnp2KnCRRd2MU4r+jMnovv9/rDT32zYF6oHHdEjhaPZLC+3Xa79ZQCRW3Y5GjGjFfKe7VHGBDxTqBxtr3Aw8r+2YaCb+eoTXL2ckjagmmyd0CqXczYdhWa1ROeWJazLv/cFh1nvvuc1JTyuZUiH3o7x6iIyFQ9h1RY9C03pkmYzst8+xlqqtMY2SZJ/OsOXoUZn5lDW7xjNEW7pQz1+vK9dUC37vHR5scFcwrPTm7ZkwJG46xpXcCkWnyhzrwRREQW5y17HS1HoU1Ga2CWtedecqcLjYHY86Z0prpF96IkcBEfvtekTkQ3U65+IE2T5PNn9C711BwGGs8ME0BOSZlCTSzSVm3HQ3mBkuwkZk9GLbYxQJsR+2AEUWCu83mzOO7J2QIe0rjd378Y5bzmS/mieKNEztkjF1zOp8ZYxoVw5DP+UTpjXXfXeQz1rZl1YplU9nFX93FeUGE4XIpEg9NSnB6bcHuR2uVvWycpp9fSeRsxolTziAWXIZjaGvjMI2UUp3pFVmWE6dpoddmg6lasWDjGXaPSi/VMv8QmaxRZNVO2+h1N+jKGXX3DDPasCrxuQ77yrYXJuCUs01yHMyWCNknsVVVaOYia2NvG9M88wd/9Vcts3e4c54mfw7W+Iop2SHh6uJ1XRERJofQNm3Gqoq+2XEYQ++K68H/9yhuMKbYEKYuED2QNpS6bjRg6Z1pPrGx24S+00SMBoPu+048nQ8sfGDt9zbEHdL6k3/yT/KT775lnmdutytNOznPEBpl2yzeePERR7NP7/CbiPWZUgikOTPPJ2KE19ahNl6v3xOAl+dv+dP//r/Pn/5T/xf+0B/5w/yz/8w/zT//3/7n+R/8D/9H/OAHv/J5MeDXPHRW5qTbGDTXEYwHxVoQ9lIoZeO0nAjD7cHBbjkCvL5BuuTzP8c9wphFeBKNmp79rc06GJRea6E6A9J6Q3fXCPXYeRw6iCvHA92hrGmKtCZcrzupmxYnqfUgSy0m5hz9qzrQZSElsWEi8zxB70xTZp4/HHYDOZqkO+aM7oXvv/+er7/8yszphvHYgePZQfHw8ICezxZkS7HBON4YjimRvK/RVbmcz8zTbErYoQsAbq9GkYxpYk6ZHoz5kVNij2IHWcxICuS4UIrBAstyQmKgd2umj6zk3pswvcXpfEZH2efQUWud0/lEzmaZLcA8sgsRm/3qXk8phCPTEXvSBnk0m908qhDAh81YL2aKkd1pvvM8Hw30d+/eWbYi0WGBeDTyNQRODw+sbuOcMJ+da7lxPp9JYQy7ET8M+nFoqSoxDspe4pd+6ZeP7Kg1PWAqaWYt8u6DewLtKwKkaSIRbd54VdZS2fYr8zRxWmZsYpu4O2ozR2evBLtyiBWXaT6sjgcZYt93Uk+eLQbGsPefhSED7hdmM4+X5cK+F/ZtZ7vdHNqCh8sD05R8AzvUIp0evHEtgjRx5oiQVGBMDZRgfZrR70iJ19uVjx8/0bTzcLnw+PBEU4OJCGK9l5CYltlzEDkCTPBAl6Y3A2B6t/nR02SkhN4hZlIQ9nXld370Y07zzNdff8WYnVCVY4rY4RDQGtteSO8m5ni3eh8ahBFAbHiMWTWYEE0PamfMNuZ2ePvg8xD2bTMjxr0wfXhn66JVUlfW65WgENOTsaK0kxjsvM9f44n++q//Pf7if/afGoW97Kx+KFgvweEVZ6CBeyLFMV+9EodpZBcISt0a15dP5HlBdwvqS7J4tixnptxZ68o//Pt/n9/+zd/kP/sL/wm//ut/l3/9j/2v7Xd+n8r1QGzeNKsHRO1dBusd5Pv8EBzOulcS3iP4PT2R32dtjy+t4gO0+rFfAkZ0GPBPUCM6hGCHf/FkOATby+roUMd6ZN3JFDkb9VV8r/Vug+ViCPQYHa0IHLRY10cFExp1Uog8XB6MhRIsWw4hWJPMs/HTlPnw7j15aAzEGqDWi+jsnjEzhvGJMWjGyM4xQU5SIubINNuks05jTGvbt80cS92nHjAMPZg6tmrjfHngqw9fslzODjl1G7zy+kp540rbOwcmmXNmypmcrBF2UHJ9Aezryu324gdAPOT54/tv28anTx8tUPvBqA611aNhZpjqMs+HSeC6rubymYzFFKbM7PoP4e5DNZgRIyNorbF3U7fWUsyXxd+ztIpgthyWLar3Bg1uwZv3SKNR2VazbN/3naKND+8/8PD4YAEyjcVlCduYFpZiIM/Z7EEMMGSeJ/bbyrc/+hEvz5+O3lH3/sdggQDW/IxDCOVZqZMOBnXTkJ3Evlf2vVBKO0r9n/kK4bBJmabsdhI3tjeOmVNKnE8XFyaq4/o++GVsSAGiWxz0dpTwikHJtSsaIq+rNVfPlwsKPH965ttvv7Wmda3HBEAVm9EwzTPiIiuDPu1AG81Q1LJHmxVu905UiThkm7NZbYTPmTpH+BlkDhHyPPNwubDME6+3Gy8vL9bk9KbpSFzG5LmXlxf+4W/+Js/PttYHnv02qUA5hh6hyuXxwZCArujeKFvh9fXGXiu9GlW17eWz5/95/LMr/9N/6k/xO7/1W9RWeX5+sQ3aga7MebL7ge2pFCBmo1SLVgNPkzlFSxh2GsqrD0Fq2qi9MBroNnVRyHE59Bj72vhzf/bP8tf/+l/97H6O17GngzHkYkzekwuuZzERp6g5tuY8MXAwe9aWxt+tQf4xXjoOpXuSdTCkHG2IITCfZqMDDX8s/5nD9qXfe6H+tqQYWJaTOVccMTkfsUY9vtdqCE8pBvkZ4tMJUSGrEIoboqldFME8cJLPJaY10jxzfng0Ob5L2rMkQopH88X6FD60uzWa+7/Mp4VpmiFA9WldWaJn5mLlN1Y+rzfDk1OK5geEewep2nsjR5A1AZ+V5cv5Ql6839Ca002tNBs2yvds1ktvD/jnx0fO50df7LgVuv1MDIH1drOZstEy9eYmaGmMOvXriW8221Dwii+eoELE+Nba7VAdrrPPnz7y6dOLDX5Rs8Bo+8667sbcoJPmmSnbnOWcI4+Xp6PRLwSjCUYrWWstKDbDeHLZfg5meKgxuFe+ZWvi9EzVzr5txCBM88wcTQm83lY+vXwy8V4tLA8XLk/v/AC9L9DkCl7tnar9mOWbszVzB6V6BJLeLIju+86PfvRjPn38xHbbjr7A7/sSV5c61bfshV7qceCrKsVJEvTuRoa2gW7OglFLkexaQiBkm8wo9vBwHt7BQppOZ75494EvP3zJ07t3xyhSEev5vL6+mkBRu/X3nI02sBPzO7M12J01kxxC0WZeSBaYO1OM/MrXP+DD+/cmanQmYQS01KOxue8+QCslC+C9G3XVe3bFE4aczPbDKrhCAG7rar/vgeVtktNaQ2tlWRYeHi5Go/R7VXvhtl/NaypEijsl7Ptu4tjef098FOD54/f8mf/wP2TbC7eXVyNpqBCDuy+rkuNElnjcW+iE3gi92r3rK+bMagLgIMHt+zMpRKOCajvYYtqt6Z/jRIqJdTU/t7/8l/7SEUDfnhR3Ud3n/7Ng7dPmDP05etY2EXI0jO8eZ+P97nfgZ7/ulibwtrkNeHNbj+TG5sjf13r0Ht1IwAYT1H45UL0Ca70jwQ634HbgrTVC77ZGnGYtosRk7td7K2b+OQ4EO8nivSPfG1XNN0ajU/e0MeeJlDO1m7dPkGi9Br2zb4KIszaiPWB17LrD62qW0XmayX7ym5d95v17Cz51L0Zp104tZq/Qy36fInecoPYzQYR5cZW3BDuUittdRLGGu08SG02h0SQH63WklHh5eWEvO6fzQqhm043Au/fvKLtTeR0qG9XP0FlEr8DWvdCaHTaSB53QGEJ4OZj9d5IIecncfufK7WZCvIfHd0YMyJlLDDZ+kEDp9fi8HDIpR0SFrRV6q8Q0ISnQVzuYY0i0Xgz/FGN4pGRiRPPydBdZb9i21thLMWuLmFjLjehGeqo2R/np6R0xiA1s8mxuWCdYE9u22Rg5Y86a6k25fGSsOSZEK70XejO8dVtXtn0jL5Nt1t8HeRI3ogz+We8eH5nm2UdrmgbC5i6YiE4Qogb2sh+DnmwT25rS4cVFt6ytmX/X0ICclpMFihh5PJ15FSBmHi5nSil8+v57G8a0LFZBaT9GgUpwvbTa/R6MlgFbD8h9qPAlCGXdmHI+HH/xKtIcWGFy80ntnby4zUhXzucHTh22fafXRp4DtXVSwE04lYeHBx4uDyY89aFbe737QE3J5sSUUsghMM2LkUB68IBkVjshJJ6fX7nebnz5xZdMk7Gpop3gv+eZ/ad/4S/w1/7aXztcmePYw4iN163FWDtO8xRgDom9rwYpTxPVp0qCHt5GMQllv5LnmdQNRrGJjkqeM7VUUhdKgN4r63bjb/6X/x/KdiXPP0XA+TPj+bCdMZq5OgHAYkKndzmC9tHz+Gn420953X/ufsLe3wOg2wwcdTPKEMm9Hupws0eyX4gx2gROJ0WEYMPeFjDvN7XBYIOgg1cuum3s+269vgjTZLqYpMEzKhGCT1hRhKDutF8KKVmQK8UywRJtiM/eqg/7OR89CROgVhiuqb35UB+fNAdczifDq2uliQ/TiZGoQo8m7rqVK6fTidbNM/92q3StBhnlfDRokrNvgljWfl03Srnx7vGRnk2UpG2wmAx3TepMnm4znU1jIWgzltTwUAlBTFupgTDbPemtEXz+dMA4/+NEVzg8W9pgGvROWVdjh/jmCzEyzTOpNeKUSHHil3/ll/n06cUyT+1Ejey1kaZ0wHnVrbZjSuzaiN11rDHTW6FjvlUsi2WOCEnUhI40NESHqcx5dN93wuLiLUwDA8YHF2B9Xbk8PXFxWETDWLiWWWmvB6Q38Ns22tlyF/4AxJCMHRPeeNk4ZRlRkmRu25V1vZm453z6fTds7x3xTHotG9PlYve8Vl5edl5eX7lcLjYcxisFFZhPJ6aYqPvO7urz4JqgGAP4WtU3cx8mjKAxrE1ijFyWkw2ZSYbjPjw93ecptGZ23Z7EhH5notjcouB7Nx7mhqb7k2MK49qcJi3iVWtzuqJVJFspfPz4iUueCOdI18qwuam+boeYcN838hieE8Q1HCboHOr7Y7CWH/ZDHxSwLL9779FcAjrzcgKEveywK/XJoKbWqh2yvMXmYdtW/sSf+BO8Xq9cTpM3aJWgNm0bn4LHYGuFRI5GMonMSBQkKr0aYUM8NrXWCZtZ0HQ1dk4XqzBj7MbGyJ19rQiRHBNTFn7rt3+D7777CT/45hdT+d+D9oC57DAfB+cI6N3t1Ad89wueD8dr6InS0RuzyqLUSi0NDVb5BxdpWtWIrRO9Vy/Wd23GgCR6zOu0lNAulNJIMfP09EArjdu6sd9uNkM7OuGjt+P607iwUvY3o/FsHmqUQb9UujqvF29grjt7c7opHIs6T5M5QnYrC1upiDcPtTdknjilia1sB+bWeqeVguRMb1b6Tim502ED6cQkzHE5sngLgkqIM+LS9dqFKdpwpFp2swPRyrbvzC5qK/vOPE3M3gs4nCAl2aZwRtPWK0ncIbOaD7zGhM4m6ClqNro43TNGm21cSmFZFjuZPaA9X8259v379yYSErMBN6dFjKM/Lbx7F9ncYnynULaVEE8oRt0dzffq9Mha+8EkUlX2XpA8Gb7pAk+VSMomvAtiWUXzPo6ESG0KWthuK8u8GM4KhN54eveOOWd6ELRamZvFxDkovK439n3ni/fvSdn1Ba2RpjHAJxA9AVEwlk8xHUuhEnpkrzuCsG03vv8E75/esbiLLj4C09akwxhdUTcYnOeJ948PXK8rL3txA8bCdz/5lhAiX3/1JW2PxyE+BdfcxoD4OqNb03VyOaGKsNdKKRvTtJBygn2nJ7PcGGIzg/QaGiPv3z0yTjRt3YW17qkkd/pir/2ogE2E2m1tH/0KO9CmKbO33WdHGITTjiCtbK83czQe1FPjulCqjRqNeSJKMOKGm0oGMShkb/Y+OSZvYCf3WTOybu0NejAVdTKRlTbQUAh5YrjRtlrNlfdyIqVM2So52twQTWKmk9ih8+f+o/8rf/bP/EdW6XuQo5vfm5tU4FPJbBAOOw/vHwElL27HrjZ7plb3wQIOV/rW6FFBMqE3Wt3RLkiv9NZtMmKr1Ai0wE9+8hP+3t/9O/zgmz/4cw+Ft/qD1se8OV+TDoE3tUqwdVM4300Jx7Pmpx8Yvy9HwxmH3SDLUipoQDr0MCApbNSu6r2akLuwD8RnYqhDSDYxERciShJinxBpxFrJp9kq9Np4fXlB5tlgTFVCQOjVGpvj8porYVV8JrUYpbX3TkiJHowxdD5feHz3SA+BbTfsvA5GDkAwyET94IkxEtS41WPqU9B7c617id57J04TrRReXl9Zb1cre/yks6D4ZpUMHnVvxMnGh4acvQw3vC3lTJgyKSc31rLlmUMkR4dOQjTfdRFaHY0gpfXKx48f+fjyQq+dPE9ErMmuendwzJNNTRvskYHzGhNoobvHTymecYR4zDGWIG41bLbrrexenVmzdeg2sjuHhhSpVJ9F2/j+u+/40Q//EaW6tYoO/YJlskkicWCWwWChGBPreuNHP/wRP/n2J+7tZJYstcOUE3QTToYpeHaXETG88uX1yrc/+ZZ9N8V9a5112/j46ZmXlxfzRvImdSm7wX0Cwwq+lGI06VJIEnk4n63BeLtxe35hsEMO/Ypan8aUwuYObCNybVZGa43z+cwf+NU/xNPju+OgelvJCwZFmQjQXIin7KNwHYrsqqyl8PzyyRp5u+lHjG0WKD5zoTUb+am1sr6+Wn8siNmxjOCCNYKN1lqprbKXwrpu1gsZQss3wWKMyIwxscwnltN5FM4IcHq8EFPk9eWVUos9k2Bq/Y+vV9bbDbOC75zOFxNIeTUaZNhOGD/+dV0ppR+sKVWrulLKnrHer+uoxv0Z7mVn8/7i3gqvry9cr1dzHvZrXa83/u3/3b9F6+a2HFI8YDWJ9wAMEESJooh01q0A1ouopTrUOwYC2TwN/H3ynCh7t56IQK+d3nYkR85zZp6dNBKEbd/Z1sKv//qv/9SgfTSAm1Vw4/oGnPr20BCRgyE5tAmjrzOC9V3c9ns/DqCWu8Hh29ddtW0D1ZZl9mFvFvbUAzrclddv53dM82SQkrr+SDgU2NOY2zOa3GI2/DmZb5Mp77nD6R3rkOd5tkHwfTT7HD7wjZ1jNO90b0xaSRvcT8sCMdwbwWZl3XyD9AOzv5Yb1+dn8rwwT8aSatXGZ1a/WbVWNz8zJtIuwbDyEKxB4xlWdlhgK4VtW608jba5tm3jJz/+ESLwg1/6JdzswMVC7qYo7lEzHkz0FNw56l3EewlWMscQKLWaaCdneimHvxNqDA0y7KVwvV7J00QSMcdZgefnV/IUWeaE4iV3CK6OtvsQnBWU1B9aShYUvbGZpswy+XwJd6QMySaSSdt5fb3y9G4iuddZC+YDZbCCMLnupGg9qsfHhwcTP8bktLhyuNuqWCYTCRAivVRiMCXol+/fcz4ZXl96pe/F7AqA5XJhu2303KheGRIjvRreb46mBn1s6+riqcbz6yvTNDNpJ+/FqNfVcNSmhikb5VK9HwU0oYsx0HLMXC4Xz8LN9CxopLVywChVjSIoQcg6OOm2njtONvB+gIh767u7Wq2FtVQup4nsDJHrtvL8/MLX88Rt2wkE5tPZoJ3e6U7rFIk0GnXb6V14eLShMmYhb8G390rV5oNkAqtXA2FaLAj5vazA6+1K6Z33qpyceTM5Ht475GmypG40PWN406ztlFYot8Lj+QRd2faNFIO5vhLRbjBG3TZzM/VZMUkn9l5YXy15uy03G3QzTYh2kGjZSRT+4z/75/m1/8d/bs6xI8MVGxhrC9TNDbFGvkE5CXEGTwgGuwjCPGWuL/tnMVfGTJLWXZUckRRQSQS1fqJg9h5lN/fd55dP/K2/+f89KPfjdWgcRtBXt+rgbtUxLPr7EfwH3GSsJhF7njHGQ87qV/p7Kwfx5PDNNXx+SNi8jtGQD4bXWk9RlOjiN2OkNXozK5aUbRjS0fASzNEXDldp7R3NpoWLqly3zSp9bMzA5O8dREjDAGywH7oqIUciZt2w7qtNTUuJSQSqUQaaeYMz7DVSznbTx4IcJ9jIlt70LOI0mbpS7QGkaSJL4OV2RdWtlhWmlG0DTVBb8MlRbtvRGj05pVA6t9sz339fEOCXvvkG7Z0pZTv8/H1KqYRg9DVrjym1dar4A1MxHDs21m0n1uI9i8y7Lz4QJPpci3JknGPB9lZpOfuozwASbDiR08sEmMb86piozRZVCqaULWVj31aWaSGFRAv1yEYPN9Fog9JbtwNtmMnV1tjWG1VBgmkauiguW7Cpc62yzMuxCMd41cvpREcppdKb9YzmZXHrDQuggvVw5tmsTw4+O4HzcrKqqCl7t7W0nM7knFjXlSGgzDmzb4Xv1xspCA+XBx4eHu7ZvirX1xeur8+c5kzMibpXluXsrqmdWna2Uh26aT7WViCKqd33wr6WQ+MDDTS5BiOaornsaDDoTHpHYzRXYcQN0qzH8+HpHT0GMoGGTUFMWdhuG0ueWJaTKY8xiOHp3SMxJnpdKTRyrWY2KYNnr+6ya5tQwnDfdQtqnMGCkkKilI0ike169arT1OPNK6tlWfjywwf2befl+YUYEzlnHh4f+fT997z0zvsv3hvM9wavVocn9t0Os/PDgojy/PxCKRuXy8n7GsF0I63xcruRU+bdPBNjouyV5+dnY8QFofqUwTRlZ9B1eoT99ZV/+4//b6m1cDnP4FPQmveqGt0SEDHdUSAQcvSJlRaAt7WQfYAO3Wa6m9NxoNdCZCKGwM5ujMkcPTNvxroEQlRmjPGjmvj+40f+6l/9z/n48SPvP3z4LDCP14hrIy589uqWcnbBNTJ6HMwpGYX8OIBGCTgqSu5ViDCGXN1f6geT/XNj6ACCtwWIaiaIGghNLXYB27bRWrd55248aIJioxn3cej551iCY4aCIU/odaXWnc2HpFW6oRGoqV9M2OZNuz7m9Aq1t4PSeASqYJh/q5U4peNUAhf6jFOqd8KUDJd78wBCCDxcLtYg2XdXlWZq8OHwEpliOg6g3ho5RGYffHS9XkkinB4u4PhmnGfm+UytzwwrjpwSv/zL31gGrbbqzEURd+sUn45mPQ9Ddc0HKcdMTWYSVnojE5jSdDThRY2yOLlVuIqwlkopz7x7ekeINocAEdR59CLCw+lCw7LiAYNsjq+nnNhWW1HmH+/3C0HS5GZ+TrGsFWEiZMsUYgx88eWX5k+VMrX2I3FpHT5++y2gnL5ejoyn1saUzAJZVMFL0yHYaS0QFlN69l0Ooz6R0Twzv/kxq2CYxT08PrLkzFoKOWfmaSZOBqnNOUE8G9aq94EvMdqQE7aVy+WBUhtl39HajNSQTddSy+5NS6PqdhdhSbfAerk88f33v8leNp4e3zEsCrqKsbd6d4ze4MHS2t1zzLU6IsYAIZioqHL32NnKxt4bT9Nke98WvA0hmhZa7zw8XFhv27HmLfFyFl3rEKyfum83kmSmefLJgu4u6pm2sYjgdD5zfb2y3Vbm0dtTywhtIpn778TItt748Xff8/LyzIcvv/jsYLhDJsZeLLWg3SbtNU8yYrLhVmPGs6oFnXdPT8f1DGFZAOZlIsd4n97WbdTtbd14dzrzH/+5/4C/9mu/xmnJ4IaBQ1QLw7LGnk3EGEwW39rhs2aCNfHGvFHdr9tKUJjmha6Nve4kH6gkarFqr4V5TjZxMARj/W1WzYU88xv/8Lf5R7/1W58dEp9Haz84RobngV613yGmt3ASeDJzh+P8hPpMcDz6MOrY5++28RBL+y2x1OB73VaGWavY/rNjsB8V85QjLUaDNbvVaeLIB920X+rPtJZC9GFVyX8nT4mCMnvPsrklFyGQpPfDIhinTqUQwSer5Wm2silEpx4qkgNLXuzOqR5BELewHvBIiDaXuoHNLhhwTTDbX0nJSv94dznNbrqHKHXfYdDlYiA4j7+IsFweTO3qJniXhwvn8+nNw1D2ZiKq0u3PEBO0RlUbvTg20WAEdO1ID7QsFuB7o+3GCoopmSpWLYMP3eCaeV7MjGtgzm51HPw9r9crj48PnjnZnDYDoK3hLNrNJoLA5fEBuuHrs5hOY8eYCibvjagzF2pSTjGitbHkmZoyIY5JVXpkExJtTkcSoWhnUsvmsltalF4JvgAHH7zWFWLgHCK9NnQoOr1Fani0LTS8fxdj4hQikgOFZtVMC0gSQhM6jS6Bc5pQJoOzmmsa3J44icGd274T1xsP5wfqvpuqW8xQ71ars3h8WhgdSULfK6qVaYrkuHC7vTobbqE7nGnuxOJsKusd7dU0Ja8vr3z95VfkxSCV5vYWtvTs8A0tkM+RKZmHUgqRl/VKa8pjXjxZige2W9Ura99f3ZOM15cr33/8SAiRd49PvHv/CNqdbTdxzEVQYZ4S0zRTazdvpmAisRgjrUVKXVmW09FTu5xOvH96ZDmdrCoSMRuX7ti1R7GHy8NRTQL84Ksvue43xkCcuhdzW5iMbRMlsN5WalZOpwsPT0+k7C60rR3Dg4onB6/Pn/h3/w//LnvrTPPwR7JkDe2uY0pAJ4sQp2hxJ7SjOd5rR5MN44nuYKqtMe2JJoYISIhoPwhTdiBkiBqp7gSr3ouKwWj5qQU+PX/H3/s7f5t/4p/6p+4nwpuAbbdF7v/yBjkKmCur/dV9SqVddKETCQoFo6Uba9a9tJxl9nt71vrm/4dEy3zdenWmUbckvmNz6guKVH+/OEGr5lzRfB5Fd7seMfis++jjkSiMpC8lE+k1lxtMy0zd92O8dJIYD36tiDClREjZOuIIOdpwDVqjhQDBKV5iAjorlT1Ta9XsHELkdDkjXdAo1K2YO+s0HU3eqpatTWIWwARrqrRW7ca/PTXVYJAYEl+8f09pDe2NKoodQeGzEz0ka7iWfaMPtXdKRrENxqBoqneXTFcoLnm2TU23sjGYiVfvHXGNhXRztuxNaHsjzta8eni80N1iwzzg5RC2hJBs5gAG4RQRG/Ua4qFPaXXM6bZAvZdKqRvpvGBeQe7jL8GGQV1fWBazmS6ho7VDcwsIwbIx7LD64v0Hamvs24pOk1Vm2dStpTTmJL7ZbeM9nC6oez+9bCu1FM6XCzEIu1abpidejYupcweGWnsxyA6s39PUs3QTnhXUPIswewBVtVK5G5W6bIVr3kgxUVImTDOhNRisLKddj9nPAKUYa01EeLycaArrT35iB3+sxsLLJ9zNwXRBBJZ8ooWdUirremOrOxMLYD2L4AcgYZTvwYWjd2vo7LMg7LRMiCp5Wszk0cwTrOTo9eDwp8nMCaMGn9FgPSJwNkw3HN16FNZwzUc/QbzBamt3ni1Z0642E8C9r2zegf1sUIs+Yz0OVKWLsG6bHQJzZvaKevQIGP0/oEnn0+uVxwchxAdLVEo3eMkFlXutxJyYp8Rf/It/gb/0a3/FPODEFPdNjWHVqlVzASFqJy2ZOYhrSrq5sbsHV8cMPGcRQq/0bhVJCDOgtGL9w2nOoJXWC7oZlbbv1Qz4wOHfiJZK6ZG6N7777rvPAvTbsD1mSL/966MZ7XHJfxCV4NBQc4puo6oQg1NZo40Vtl6u7YND9X98gB5V2kjWRr9j2PIPxGa4Lku/Izdl23GzBP8mPsws2rx1/MCUQdVGQaweETHyzZQNAk290qLYdwpKOmheTrPLeabTkdqQnK3doaDR80hV+pusaFBoxxfFiyORaHvDVbY2HOZudpfEsoiODVzHH8C6Fcfto/nJeLDV3qnBdBHRP9c8+7s3y4Tg79/b3eYD9YUvBhHdbps1cJ2yqtpN2Cdy9CkgMHpJMQZ67UeDWUZAz5FTWDxwG9yhMZmhYbWpdahNB+vNZ0GESJZAEqUar8yzECGmzKhVA3DbV9ay83iazdabjrTGEMW1qpStOjtGyCFTtJJ0eM4Ht/61DYMY+cCMFLtv0YF1KkmE6myzHqE3C7wpRArGSW+9mwjOg08pY0CMJQzGYirsarBASGn0Kg+Yi2Z4eHeIramJLxN272KMtLJR6mSQSDO6bsqTsaIc6w3VmrghBoPZpslswvNEL8V0Eq6uTzmzrRu1VS4Xs+rovbuNxsTlDPC1ky/MK2eIAlUg+MQ909uMasq2Wp4nNLpyNRmRIziUWbXRyw5ETvPEFCM5RU6L6Yp2n1YnwQ6bYRw4fIIsTtv+GhV4iNaCNK8j85kq1Vhus4Y3exJn95meI3BvrA6Qo1YbaJWTrdGUkmeqbiTI+KKdEBKPDxdyNqit90II2arGZlz+XI0Ce1s3/sS/9+9Rt41pnp2t5b27EY4jNhp1csZSDEbRdDfm6hB4YkJ7Z7ttQLTEyDUjvVmCMk2JHCJr7UhoxDmh1cgzrSkhiU1jc4hXgkHpv/Wbv8Hv9/ppA4q6NoJa9aCix3exHLofyXZv6nqhxnTsF3V/L6tm0I5qcHiNt+fTm4twBbiadsl6HhFD9tqxDwcMWIsNHBp9jlorpevheD3I0uM5qN4dBUQsBmVV9t2NQt2FIR1D6HMiB+shBIQwB/O58WZa2YqV9U3tdFacjunq0a6moJ5MKWqD6Y03khxOYp498BpfX2uDnJFWWbeNacpMTlGdckaiKa9VjCoWYnRjQX9Ao3EsYk6U46SN4Ritaqwpa8JogOj2FZISsVbWokxTcOO3fnwX8UZ+DImQXRQm0D0z6QPjdighBDUVdBhmWXqwaYoztVKSOz4dbAFoaZ49WrktEUpT4pRZpnhg8CEkWrDvPc0Tz5+eUW1oMOPkFCMUe/+mTp/TxkhyUwjUaDKnVqvNnhiDXKqSfFyC0ZE7Hz9+IkWbJ12nmXZHzI0dVSuvtyu9m3HY5XQmdGvAju0jVTFXtuHPb5tkShMh2oQ602U0xA//7fXK66dPpF9JzNNCj90D+ljQFuxKs94ODVN/98bqtOFt22z+eDDzs967W3/XI3k4+gVeIZwfTuSQvDyXw1xRBPdKSoYStkbIBnGoqt+RjoqJyErdWUu1jDgEylbQtvFwWkzE6BYOyhhoZeLG1ryZ6wNzBLONdsDErF1G3vOGWCNiJIQQjdpsTfvo0OPRe3V24B1LR6y/eD6dmCYjdgw34hgi1efPz856VLG58CFOTke2fd92c+8dbsdNO3/rb/4Nfu3Xfo3Jx7xar9O+QyvFrq13klimaySJe78jpuDQWCBJIObZlPNdaBWWbHRemul2emswZxYSezVb/3Sa0FbYuw9Hs4DhqvBASJnf+e3foLdiMPRnh4KtMzPvvOtaRhxv2iyh7N0SpFpAC+qjgI3qbpqbrp2g7o4b7oOM7k14ORycj2fjf4q7BzeUmIwUI9qPymXAVqHZDAyaz4Px9Y0ovRR6Chb/xgHRmrH9PEFtzhZlECwc1gRoXUhjzsMUTLVoD8upfwRKNwpeAq6rqZQf8+VwmARvBMc7vh96ZKc6Fcx4vnmyLKXVSppny2iSeB9ioqbG7bZxvpwP3nAiIDHy/Hqlaz+Uvcm9j45HqsrryzMg5quTM6/7lfXlhaf37y2oqwni5tMJsCwjL0bBLbWSgeD+/01NJxIHwwHDUyVGbrdX4xs791x7p+wGWVwuZ9MyeDYYxGZMv3pTd8k2XB5x1oyf8ohtni4JTeZgK9G8lpqadTVR6N2Gg8zLQjsVktgB0dvod1jWmYIxHPbQaXVH5ox0e0ZBsT4DplSfspW219UcOU+urj6d5mNjXJbzPTB1uxnVK4daKznbzPC1FE6LZaAWsHysZ/B0eTS/p2zN/1Jt4HpvhGZZ0KfnTzx//MQyzzw8PTpUpz6H3CxipDu+rInWO6VWugo5ZvrUjgpiiIymaeJJBpx2d+d1/hODrWUB4E31KmJ+VD5zOMdEFdvURbsN4HJAXIKpl2upHhAhdrO+mJL3BzxxsMBvtEwcRrB72e8iTLVBUtaAFLJ441L1YP4oIE6FNJsUOzgGtIncsfU8ZYcgrHnbWyfF2asSPyCcVSjRIR3vV+KiT0tDK7VaD8oyVqWF7kG10UrhN//BP2Rdb1hFHg3WEIN5tTcbbiWBnANLtvnz2q2fEJ3Wnrz3koIN/Oqt0gPkDPMye+JaUW3croX9trKcTgRNbOtGPNveCTlQ9nr06sAprK3x7Xffsm+vLOf398NhrHNcPKdDV2L9HPUeVa9KKaYL02YHYaQdMxii2AC2vTV0VpvdgiMR6mLabH3OQTUPITp71GBtHWk/ckCEJn4fVF1FmjoDMZCiG2e6xk2bHl566mrw4d81UIDRgxLJtPZqAjxXcYuXaykM+ww1f/rg/ic41TkEIYp56VSHmmK0DHdQQKt2Zz/IMVY0xsg8m/6it34Yni3TxLbv5Kx3m+zHR/NN+vSJ4nOLDUqwZu28TIew5Ri649jdsH6Y58VOVl8MKUXDXG83W8zTREY9kxOb3ZoynF18M7jPx1jGelQtdCXPCylFPtXGbX0lTTMpm2dVjPNhId6bzS/o/s/dFZgxBG7bSsyZxbnrTW2u8YjAP/zR7/DyeuXLX/qKx4cLY2pYQcnuWjssgc+XB7RDLQ2cuqle+c0p0VDzssnZ6Oi4kVozoWIi0lz2L2LeSYLQc0a0M2fLAm+7Cd2iz+Vey4Zq5zRNnBebMdFqIyyR+vrCqxYezxdKaXYNx+q2g6W8bpzPwbI3TWyt0rbt2ETn04mcs8++fuHp6R2mbu7gLgAR88MaGd8QOkFA55nLw4Xb9XaskcEwCsPQD6sOdjWlf3B/foBGIWIzH6T3IZuxvkhMpBgpvdFLYfdwH+eZIFCqjQG2eca2DqNz/msDCf1wLiBwaIpqrWa54K6+wfs7rRaDfiWwzDO12vcN4hVSa3TuBAwQsvtQIRzVNP7sTT07/JLsGo997AfECEwhWF+p1Wqwb57Q1ijenD6fTzYGl8Diyu/WO+u6cXl6Yp5PbNvq38n6DU2hbxUJmZjtoJdgxpB3tpvSa3M9UiJdJkK1+DJFg1qeX66IdGd0Fbp0+g7xIXFOma2udmChlHV3G/1IKwa0aDOHhhiG07R6D8QOCXXqaorJtV5ewYoca6h7vJRuwVRQp3eKU2bd4hvxyZnRk1PbCylNFvhHPwNoPnwpeoU56K/R78uoQPHzulTrnY0qXb1S2vbdRMN4pew7ZUCZBv9HhhvzqOKMDWi6q1aqV0RKsIrGFzRuYRDkyDZ6geq8f1E4pWzZcLQb0VszRWptRDtLaU57bb0ZgwLDjm2QvLs1lkKpBjOtpbBtO+tW2Url5XY7LB6025zt5XSyyVm+2IeFyPjfu8d3PD4+kUS43W5cX69MKR12xyZqcmVpb5TebJ6AT5BTEWdYWZN8ydma9c5Wqhge/v7pHZenJ0IUWlNeXq4299sDkvNSjmxl6FDCARcYVlmaCfqiepMqwHVbkWiLc99tbjWtc7u+ot3gvSlm799A7ZWi0MT+pyjff/yel+srL8/PlG4iuObXArDfbqyvr0ZfDWI2F6qc5zPVg0B3iKv2Sq2FGDFRU1B627ldX2lYSVpLZV9vxCCkKZnHDKCeBYpYhl3UWGVr3VjLjgZFo7Fu4nyyqi4E8rLw+PDA7IZ9NinQg2cwlo01NMWnoNms7pyNLx8cIhg+OgOffbm+uuWJ/ffaO8EnctGU4GNJc5gOqNE0CT55LpjTpsiwfims20prxXpFHYLTtsU1ppaR2xM3lNLfL0SEUaWaEWEgWoAEkgiq1Te/bdjWPCghXgXYAKqmoyE8Aq2tMcGoySJwt4nweSq9UMqV6/WF1stB3rBRwP0IJKpmxEgyLYnZvRcLMDn5XOlqPbNS2beddV351V/9Vf7gH/7DltTRUalG/e6NKJFTDqQczLCumx113cxCw9apMuVE6Mp+XYk5mnnhfCIK9H1HFfZitiqZ6I7jnWlKPJ4v9j33apC368okcFRyQY3qXF1FjmCTB4Ng4r2OSCeINdNVu0FMDftfb8a6Cjb+OE3ZHRO8CsVYReKuEKWaY4WxzMJR0fdej/sNHOt1DHnzO2hrttnPQ2Mv5jpRGY7Wgd7d8DRYcilqDXafeOOVqNkCSbCe3l7svcq+0ponjdHsdF7X1YaMjbnEVlbjY+1cXt47pVXCrkjOTMGaz80zQzGy0zGAZzUA14KEl/q9VuKUiSGhwXBeg3wgtmb+R1gz6MMXX5hferXJU8MrvfbREBr2cUCwLFpEjqHvc7JmaX195dOnj3z99dc+bSlSt411bZzOJ4MWVKh+8pa2k7Phsss02bhUcf92MZx2LRsajfY4HvaUI9N8pvfG7eWFd198AO+PjMNhGKelPBm7CscYY0TVFOw5JOI08wf+4K+gHbbb5rbfmRohYV5a0i0bk62hXv93kXumgWH61MrThw/kmI1hpBbY4v+PsT/9tW5d0/ug39ONMWazmrfZ/alTVedUle2yXa4q23EIRHwJihAgIJAPCBQQ4l9CQiD4iISIAhKBhCDAkYhDEgsFiBxX1fFp6jS7dvu+q5lzjjGejg/XPebaFRxXLfmots9Ze601x3ia+77uq3GOMo08vH/Ap8TNfsdcK2P0pCEyFNmQjwa7ZawSt/rFBc84TXrv3rPY83/96p7WKsdxR5t2MqErhcXyreVNFLicHlmXzP3dSAiJmmXf4IO+Z2Obla2qtPnCNI4qMkIw8ZK/GtV5NKPprbMuEp2dn0+qaI8HbbhaWC4zfehmN4Ha6RhJPcg+O70w7za40zmpumVXD5d1EeTZGvvjXgd273TLjvUxmL7AUgW3rsHpOdYiq/VrtW9fyQ6GVlGYz34vh4Om0y2YpxlO/le1VUGx1qH20lTMOH+txpd1JoVoHa51mU2QZIqBWhuff/EFr+/vePXqtaptw82v1vfuJVsDm4vIl8z/Oey7A610XFnx3nG7v+N7n32PP/nH/xjoBBfpvbGWheNOyYpjDDinuVKv2yW3XWiqpXItlLLSCgyj6LrLvNKcwsBk/V7YeEjzecY7z+EwqUDMM2OKLLbOeqs2c/K0Xnj/8I68Xq7vQd3AhvG4K6R3HRLb2Pe7TEp1srrAW6uinTqxKEvJnM8zN8cbfWfshB5tnTjt4YbR/P2V/OGtO47BXA/allOnr5Irl8sFj7chvjkW55WSq5hwXV1RtYF5a82cazUvK2bsF3ykd+vcQgQk1HMpsZ8mFQUgWbtPYgq1JhuB4ALNK5d5IyHHYbRB7KyqL0RqFATg1sLz0zPOdQ7HvS6DIeEtznJZZpLBSFvO7LXy3qpwrwFXjIkNRqB31svFksi2oXEjn2cuZgERYmS331HQjbzbj9R6xzQqaGOthfOy0HJhSAP7aWIpDUrGOfntl5ztRofoA4tRKnPYhkD6T+mVp8dHai0cP/qYwzSx5oy7k+DIN1jJNtR3Zgqm6nCtitMc4iSzLjzOWwg9CjYpOdPgGnDjjNHhu2Pd7MeDJ7mIi86U26owg4MPP/sUR2cIEh+K6x/ovrPaAP3+9StSDKyl8fTwRLy/Jw6BMY5c1ouookG4eS+Vy5o5jJoFjMYEqwiHnQbx+muT06b3wv5Fp96U7dpeT4/PdghnetW68shTZpsXXDfsNjQ2GCPGdA0xor0oVVvwYENw5/bQHKfTmcfTE69evaZWVZPTfmee+5XeI3Fzeu2NYOv6u7+b9rLxBc0YPNzFU3fdbDys8t0cCFbv8KXy/nwmOs/+sGe/m6CLwkx3PD4+sdvtiPElh7o7peGpE9047P56CJdaroPljYVF73bhmH1CDNapSFNSfOHG9tx3Owofo4XL5OsBowMKhrjljIhsoBFUv1pObxAvVZeStFEFhycE7dvWOsOkQlAHqqfmzBSjoOOccU4iWe89/QVxVbezygK7mIdVqQVXIETpblxpXC5nUQa2i5jGkHTxOO+ZhonLZTazSa6FZje4MtfM5XRmXcr1WfaNJnqNShB822vFB09F+dDeB3OJjriouVzrVSu9uyuUDLY/msSxvus88M0CuTA9Do7OBp8bCcL0F9XcWNUBVzsXRc7pXVCUyBmVXBprXhgZkTVqo+byncvNBMK58PR8xgdJGXIu9NKpvVCzkTzEzLgSDFRA4OQx04WNXRaZqB12e1rwLOcLl1x49eoe34OGdIbXxWGAYWCsTUEVa7aMbMUUgpnFGbNmC8UoGxSE4aJNxmLOO1VGFXoIDOYPVDYTQu/JNivwXpYMCkdqtCADsJvDntLNv8fJmK6FqAqWzuXyzDwvTNPEuNmD22YcYrqKg7ouesEmXjYUr1+/wofIGCPnZWEIgTGNYpE0Ybg+eLk3upcoT7xiPnvt5JpNGS7GUXMa3E67iTTKSt07NLD0QHVGw9Ql6VOn1xfmhS43R2riRbemxeeivFkUNt+IiDFC7SQvVkS16igEx2Sbm+3wpticyRTIa2FtRlu1eYqCXsKVPeO9ujrbl9bqe95+8KH5bjVK25wp3TUwZRMN5Vo5HA9XIz7AoBMjRoRguP92gVdimGygB3ev7jkcdozjwLLCbrdjGIZryM52YC5lIbDZdmyRr8Jwl23IWDWfi2hWtxblqayl0uo2yNel4oLHlcLj6cy3X39Fd/A6v2I/fWS/NxJ9o5jxZKsqPHoXLDHGSDwcrkLM7e/srVGdp1pHMIRgM5ktvyDyXY79spgZp81hQ1CRt3XmtVRCSnzw9g23t7dsVhAhKHwp4OldthMtZ5qXojd4MdF607pIScVLa5YlQqfnRlkzN4eDXU6m5F9XPnj7mlYzoKjT6AXvdJwGta2zrMWelcSzci/211lA73rO3jlaroI5cTqDepeIzrRNJTe803NMwdGIVxdZajOTQLucbI/bZFgzjSZIVR5K0NqiQxpT76G5zyZIfWHOGfUfzIiz46vjSox1G0FIsKDr5qJta925TnfVYOtqqXum4LY5g/Nac0uW2LS3SnTQg2jlzinzQned5pk5yzRR4mlnEOaMQ5fW8+OjzljXeX5+UgIpjajq7Dtybu9ppfD8rEO0vu5M+z0eR+6ddckQPd51g386gxPTcT9N7KaRp9MT8+XCfpquopzgA6WrM9nUstFU3r1W3KD0KLV7zXz4lfHQ7WLYIlCdU3Tn/ZtXGgrjqfZSkg+GBysvoZTCcj7x9HzmzQdvdbA0o1N24YpUtXi1a6MUTDjlPSFGTs/PtF64OR5prjOmkefLmW+++ophGnnz5g0AtRh1LAVVVU4vAmPBeKf/62isqyCuGBKX+Swuu4+4BjG4K1OlUnE9WDeSWMmcns+ku3vDT0WblOjJUvgc5gEErRfWi/yKhpAI3ZG7VK0peO6Odwovcg6fIkPrVy8nMYNGcEEsN2TkN19m0jCSqzlKovyC71bjrYsvDhIfug67K0uqm/keJK/NvSGnGqRvUI3EhZtqODqJgZwTRBSHUUy3asIhByVEduOeJQSck7Cr5E6t6/Wi2dhNAaUffverlM06Xv9/WccXvn58pJaVYRx4fffaDhQItt560N/p08D9feRw3FPWIoioVnufBZ8iB7NSr6ZXqTQioqT29iLU2yCpUo2w4LylIyqCstYXl9v5MrMN8+WZBWGImqflzHmeub29FU21ypl4GtO1y2utKgkSz+n0zLJUpmmkGsXZC9CnWyoabGpr/e0daLnhBvm6/d7v/wH/+//dv07vnprP3Bz3pAkuT5oxyIdNJUSzn+u8FOa1d7Px11oR7GeMNP9CMoijyBUhRnwUvFN6IRZRjceUmOcV8AxjNJGs/u28wrzMslPfKhmaLgkrXloz/YOTNsd5oQzbTLBXrWPnvPzmTLui4bWKHQPldJHjSTjNgZrOxU0Hg7kKgyjYOEd1jrVkG+xrTujoFmm8UrIK9asXlDHgauv0milNgtNqxXstK2kIUPtV9zOv0iKRK8u6MFrUQ0qD5lG9E4Ph2tncBsuysOTC/rDn7evXrFWV8Xg4cHM8UHKlGAzkzNzr3bsHWkP2Ew72e2s1XcehX/R0ema/30MIkPM1FQswVpJar+hkTd6CNuGWi9yqgldSSuR1ZV31QUL484EbuRaSk0vm5mnzfl7orWr46wLNdW5ubuBGYTXzaSElsSdciCyrLMC3YHjvAxETGHVnL8bYNlZhyx9/Cx/akrdkM9DtMo1JB6LvXpdC8HJD9QfmeYbueXh+AuCDN2+u3lY+cR0u9t71HD0vlsFNF5AYLI2A8j/WUvF4iJFesyrnoECX6Bx0WVpAt2pJh846z6x5tYGwnFHX3AlBGQ4xCvdf50rf7ZgsVL50FCRjVQohWKaFKuBas/QeLePdYJREa6NttrJBIhhEGWIiJqxzGex/NyV7lHCo2sVYWiO1xOsPXvP09CwiQq+k5MmLdbAbddq566XRO5b528wXp8siRNMpSi1yX52mK/MuxeHKcFEms55f7gXXRLuVKebGT9fMItvcxTt1Jj36K5tqO6CuHUTfOjwzA+yN/X6P9/0aQrVRRrsTMWKjhh+OB1KIvH//nufLhcNuj3Oe2dLdNgdmDM4zxEWzxXlRXswyE2Jg2u/pvV2JEC2qW3RGUGk0idecp5bKPJ/5O3/4h/zdP/y7/Af//r/HOAZevbrhcnmmlcK0S6TJ8hGMVeScVfN0yrwhBhgkYw6vwZPsAO2I5eVTpOXMPIsIklejhveA9wlaNpeTRgjC/lezI1HBIOr3dbotFot1YFHF5wa9dAn8erc9Z0mDQYcX1VhK9G1YrqCyUhvV5p7OOzyeteRrEaqLQfNG6FeIK9u7XOvmBNsN1lLKZa3mcjGrQIgxcJmXK0llG3udTid67Qxj4HRalIgZPZdloRc92z/7sy94fH7it37wm6QUda7WylILsdLJl4uqhZSEURUJNeI4MrmdbKDt4AlJQ+7n84nn06NuKzz7/Q2udeZ15nhzIOAUcGK45pRGkk+sZVHlHi3O08uoK6+L+MytsptGulMgzWZCVb9Dsw0xsT/sCCmqBd8KAZQRUGgsl4ustWPk7QcfiMeeld7muvV7xvN1UV0DhnOHDtW9mM/t97vrpm214GPk7uaGw+EovLY5LWR7K61WRUK2RgyDHEdtwQCULr+lih3kXjhpKYX9/nDlzK+tiqaYG/N64XyZmaaBaTqo6KERcBSnxDGCBlKhO8uGkEq+LCvzfDHPn4zb650mywzItUEveO9Yyso3777l9PzMNO346OOPGFMkuPhii+5h3I2qoJyEVkutrJcZ5xrDMBJSoBuFLvQkG5bWOSRhoC7oUqlmR91sVhXsACVEQpg2WR6eQIoDPgZSivTujemxuao6Ts8nqoPDzYHaK/N8YV0bbtVFVEqz9D0J8ATPJPNBWtmS2Dy6pGptVBSi9Pbta6v+TSroOs6SHIXdyhY/uECjsiyqasO0s/cuxlWZV/wQcYMxnDoyseud87zQa2W07IB5XvBebsK1VZY1M5ieQfCQZVH0wJCM7+6D/MScY15XHh+fmKaJ+7tb8roqQ9ps2h3KMi6li05ZteZ3uwPTtCfnFecjKdlQ2SYmrncCCe80CC9Zrrtp2KvIKCuH/ZF/9b/73+Mf/kf/HnevJtLoeD6ruvVJe6Hb7Evdlqjoyo0XZLSfJkpr8hECxhA4HA7MeWFdMsMxCV4KDmaxKXtrLKXgvZTYl+du3cYofN+LTNPo+NBZL7NdsuDaJhJ0VrObiby3C31tNK8OuTuHdxL0tQ3DZ5vBYJqRynktDMHjgqNSaWHAuSYDQ+dwJbOpnreTbF1X0eV9EIm0dQpwmS/W2cPju/f03jgeDvQOOS88Pa9WtGhGuFmNPzw+0mrjcHtHKyu5rvhsXX/Vur27u2VIgwWZFRtDd5JLxOgDficDuGrii/00cbmcqZbu1hFVEwe5NcaoKsw7xzQdiCmR4oALgXEaxXxwEsBgopgwJHsI4K0yckAMidA7Lgqe6aXKk9+q+GizjOgVVN9NxZ2SqIo5L5RSrvz0arf8vCzsdztarczLwu3hQDNxWuzKM/bOUXtlHOXg6exS8MOAL4WlZA04zXBsq9J6a6xdJnFZfaeKENNWBLsonHNXmEn/3NnZ4bTaPObpfGJIw9V2YvDxmidelpV5XYhJbq273cQ0jGohiny1aq0y9moN4qCKw8y7Nl55jZGb2xt6r8zzbPRhiXJKETyxhnAdgsY4cHf3Sg6dNrzC7AR6FUwYx5Hgo6qk68xjYw850UuD/K8ckHyE2mjOicrcO8WsUpxX1ZKGgS0fuBnU0Eu3oby/doYxqtuMfrwOCINz9L0+d84r5/OF3SjzwK/eP7KcT4zjyDiOJO+t+3A4Jw799qUuplOs8nBscwO1875VOpVWzXLEKswe5KabzbIZL/v86DxLNRZX64yHHdEcVefWWOYz0e3xw0CrhafzmVuHwRM2bPaiXp6eT9Rp4Pb2BqJjY2/qDxWe3ukWDKV39/aDDxgN3tr0E9shdrnMDEMimP4jhC3gqRDCwPF4IzZj1TDcO3WurUJ3Ta5tzuHjILcAwzpLUa7J7/7eX+cPf//3+NUXf4JzK9F1Ztp3Ln5Pc9vhasWbMeGm3cB+t+Ph6b2e4zBwfzgYldy6LbOyXucZ5zXjCElwpFTrzpTikVbl3NC9lwDOZgCrMZ+cLH3VkfamYbxTl12KZlGxaShf6bguHUIvVsjx8lVqZb5cOJ1nWmm445HYnc5jN2vdGUzYbbbasThW73h6euLd+3d88OFHnJ9P9CYGqgvqFnIufPn1l7RccZ99SkR+bsu84r0kHxFwo2Zq3inThmZD+qaLjdZ5//W37G727Hc79vudyEfesd/vqFV/Z/z63bfspj2H6YAPxsGOif3tDRiuJjK7vZBlxrmRED23r1/jWuNig6KOPGg27/zNmmLogerEY+61Xi08NhO5ajjsGBOrc0qhilJ0phB1kDgZfT0/P+Nw3L+6JwDZNsMW8dGz/t2bmxuJx5q50aZIcJnT6STX0XXl7v4Vu0kZC83gJQfX8J/j7kDrL7hfLoXFDNGmcVS4un1vCIGaknQh9nO2wYI3Op0PYrCUKgFVjFvSW7cA+UhuRRYjzjHsdvikDmMTHC5lZV3lXFp7JGDzixDw1S5hE+5ofuOZXCBEx5JXbg+DHRI25ymCyGop1snseP36Xi125Wot0HO/HjxaX6pA9N8Jz57Gidoy6yqGVgqBaTTuuPM071jywsO370nTyKvbOzac4Rp12jeGiSCrIZpaOGw5A9IHbDOj7au3TS/guFyER59zJqXIcTcyescwjex2k6pmgxx65+q5s4nN1lp5//jANI2C41YBRnmr+mon3EjV/vD4RO2Nu9sbnPf88osvub+/5+54kLlk18DRHHu+YwynKvZs1eFYG/v9QYmKWfh0ii9mfBseVKtyNJTD4Jh2extAvmQU6J81cB38CyMwpURr/voevWVf9y7WW7Bn2ns3JqhgLRUH4KLZR1QVSd7JpHGzdxF12Jl62PP5z/+U9+f3pEHi1DR5ppyoudBDArOQ0d0SlFTXwbVO2gVqL8Q0EpJnP07EcaQXaRcqMvCMyTIjWiFOIwnZqYcYqa1wuDkKPkbJls1JTyB368wvfvwj/vrf/AMup2xhYNWep7GNamctmVb79RJUfoTWvwSNFde6YCHnrmtxSok+2rPByAo6bJT+59XR1c33bFlkINmUs3F6euKbL79kGCdOp2fmnPmN3/hNQnAiFMVCXlZ15OsCpdBTJJ/P+N0EK+ReSFOScr1VFcc2h/POcbi7FYW+yz32NF8IeMGRSMcSay22OcSCWBHzJDh/zZdwxrVuRsdaLzM+RSVYOceUErXD5aIg++PhcGWMRKD4ZjxvDUd9aVYBCquNGPSAFrfzXpGWMZLbNtD0tJo5Pz8RU+J8lhXEtNsxxGj88wGM3iesVgswoIFTHIxpMc+6mXsjm1FhN4z+/dOZdV24ub2h+aBqwTbExj0GsRFazvLAR3j4Zl4YwovJFnBVzepzbP/clZsREw9PT7gpKTPDDj6fBiKOkJLmN11V8VZ1OEzJGRJP5xN5Wbh7fUdKAzF4vv3mW25vbhnSaN3AFofoNGAM8uh3oDClqorId1lRrE1ZxR5Hrvrvu3cMXnYea6lMgw5AsdlGrZ9s7XbOPDw+sv/0Uwt9KjgPZS5m2QCP7ondpIuwVzGn4qBBZggWAxk7Qxrorm8hW4QQRHKw9eOcgwBj2yjQE6XcUkpmXQJ3d/e43rksC7V20TeRvmct1dh9OgCCD7T1xOX5mZv9nuYh15UhJMFaBkVhqu8pJdYiMWnzjbvjkcMmDMRxns8s68px3BGHgY5mC6UpzfHu5oZkxnrOOdGz3eW6H3tvCldynVev7xiGxBdff0XLjbv7OzYBneqR/sKs+Q78oZhcVdcpJlOfe3Xarb9oeszaxdsQWQeh8PFKp1dV20NMMl8MkSFGWi8GR9l8q4u48Wdf/Bnn0wNjMlg5JMLNwPO3J9Ye5ILsIPhtJqbDFa/zqLvGfj+KbpxEc14vM0sVNF0btCLtzFoqzAsMHecTSz4LYrZ2K1pHVGumEhicEhZ//NN/DHWWzf+50hOsreGbqLBCGPpLyiAyFqVZXGqRMLc2zR6bIQetdXMV6KyrzCW970QiW6KGi+bKgDrx0jqjXbA3xyPn84mf/vRn3N7c8ObNGz7/+kvu399xf3cv9CNkyjxfC1n9fGhjpJZVc1mD0nNVp19rtWJBtOgxRouO1tp5ff9K55idMblX4oeffIKrXIfDU4qczmdyExTkLYWuGbyylMJaKqlXhjCBU6CHM1ZIW1fafqRmBAmZXcUyX4hpYD9M9GQNpxMvXNWvuw7PWmtistiwNsYgUU3vvH77AfO88O7bb0QZnUZ8StR1peSVTbw2xkE2EFmMFIm6HCM74ptxK6WFPXcdvCkFDjcH0hIZhomOXW6q44QN13q9ADZ6ogvh6s0fh0FdQpeJOg610V04Zu+QPMRxJ1lLrQYLFeiJwQfCOBFCYCkrzqmzm/MKzjEYRhyiMWRaYz9O9GFgTCM+imP99PTIsq58+OGHBBfF0KC/YMGIa1+xYHoL4nFR+GutmgFtZofeOU7zhcU5pjgopIadeePogq61ksYkbyXLsZA4ruh3+0hKkbcffYTvjvPlTKWS0GfelKW6ZQqtZcqiVrpXKe/31lHRNVCWJYfNkmJk5z25eM7hjAvB6L1ip8QYWLMgwdYblM12RlBNLiu1CmL95JNPbfgMa9Ql7TtyNu4YBNWZ9jtGdtQq5ezd/b1Wi3WwwXlG03jkvIqBErTGQ4xs8Zm5ZoITSyj4eB3O5izzPlF/VUCNaSDskx18m1XLy0WxHQbdzNjSlULaMBPwK5wrF+R4pS875wnjYPtQRoPi6HcoC805ptvxOtfbBvmtVcuVb+A783kWicJJLb5lqAQGqiu8Pz2pOwjRHB7cy9yuQ62ZFMz1gEa/FBMu6mAuy0LpsLqgYKsgq8UOrJcTtWsGGWJSVIHvZGCujdAaIcIUHX/8n/7HvH/3Fbv9h6xrpWdRX3M2LG/zUGoKM+o46oawGNyoVEkNwLNd/sE5StXPOZ9P6rhSxJGvHZuYdI1lXfn5L37JlBIfffqx8rVbI4bI/fGWGAOv7u7xMRBdZF4Wvd8izdblcubtm9d6F73y9PRI753bm1ua88znM+uyMB32xnbaVOa61K8mrYYMjOP4otHwEGMVheDh4R3fPrzjs+99T4dnzpQOu2FkXmdyzhz3e4bdRHKiI5a+8TYgxcA0HNkfJgu82WAPZRivaza78EBrtmANWuidq/pQ5leFOA4GI2nhPj098/T4wKeffsZhr3jN3W6v8BgaaRhkER4kzHo6nTjuj6Yi1CYpxSL9cmU2Cip2EW3Ve4iqJpOXoV7DjLGcupJkvksOxbxuA+Qt57qWQskradhTc+H8fBEOHgcmJxfcGnTzz7OGZuM0EjGdh4gm1FrNQG6j4YlxgI/W7tow3Hn2h4NmJ87skYVv8Pj8wAcffEhIjrUUHh8e2B+PjCFQuiqLUosSxuwCFBFEQ9HQzPHXDARLXpnnhfD6NdNur1nPcMPr12I3NXNndV0Fxm6KNCfak87VRnSeaCpRH5zmMT6YYaTWTQhRM48wmN5kpbQRvtNB4Phz3dp28Plgvjtx4Hi4oayFx1aEq6eR0AAqLet9BbMGaV1mlLX360AfGvNSNOjtUlwPVR3q4AVFnC8nns6zwYGyTC+5XA0tow/C3qsu5GRkgh5MqVwLPo7Q45UF5Rz03Khe1m3O+ZfOqcHN3b3WURbG3NrGZhGdMsQIpZBbFqTRG84n60L7lZ1TSzXRp+A6kWuUKw7dTBQ1szrs98T9npJ1UTjnWeaLiSn1M2qp0BzjAPO68ObDt+x3R5blRO2wlIWeV6YxEpcGNGorBBKmqrxi+yVX8qpsGeVEdeKgeRUEMl0iyXEgjpHduGNeF+ZlUQ3sG34I4DwrneUyqyBJg4rfvpLGxuef/5Q/+pM/4W//4cfMdaHmhZLbFVoe0kCISQmVziJmjcCyoQNrziwl060LL6Wx1EpeFhqQSyYx0C16tIDRXSVYXNeFaT8S8FzOF8XeCoTjg08/wtXGSiMO6uB8g/WieSXBc7w50KNnMUiToEiCFmWBJD1SlP1M3GJzRTGupjV7oYa/RDPI/j4SK43kI2uprJeF80kDvjhOanW7FuHj83vWvPLB69daoF18aaWaiefcXCP4cK24XNOiL1U3Xuud2+ON+R6pyl6KGAnDkMilsswz005BO5fLhbiboHU+//xXvH//ns8++x5DHBinSVbQxubZZOvBR07Pj/ziF7/ihz/8oS4aE6bUvOLGCRcDg2GXOJmidXRBherlD9Nefp4PXf5U9hCTzUtat7qsyfK4lWreOAi3b5VlPkNtDHfjtcupNjhrrTGNo+iW5oK6WSBsecglZ8Y0koZoeCd0+7w+BJ6fn3h89y1vP/6Yw04VQGmV+/tX1NYVntQr3kNKkVayvF0QDFfRMLq5ojbZwl5wcM6ZUOShNcbE7d0NN4eba+U5X2Zh3UFWzn2biThlFW+V6Kao7r0IF66VZkNohcw4QndXxbViVQWBxeKvFybdXS/Hl0Pxz3/13ulV7qvLODLudvjzM7VaFW+FSV0zPkUSjsuawejDDnBBFglrLmIoVW1Yj5L8qI2lSFDobavHLc+6KtY2pUir6iacDzSnofJLQp2RIdxmUOjYfLS2joC2UYK1ZkqW1bkfBXGmlGT73jYhIAaZialXzfL5kjOTfX/vzqjpL88LpAaey0qphZ3h6nGQa7H3gTjIBj8MkwqtLu+p8zozxB0hqYP03iktDkeMicPuQMmaqw/TyHQYmcYjX3/9DeslgxME5HvHtShWpSnH6Vz3NV7FZbPK/rg78r4/k2vhbpjASw1d1kK1LsfFwLrMXBYzzjNWV61n7t7uUcsC61nfU1Z5e+VaWRehEjiLAEUzh1KrYC9zdk5DopTMfDkzTXtq8BTLHXfOSYQYIsGhyF0DcsqyEsxx2fvA7VGixjlnJgfguCyLnktMtLzy5Zdf8fT0yCs7g+fLzIcfvpUJZamseSWNA4ebG8qyyqliHJQXb5/Be09ZV3KuV8SGrvXukEVOMSFuySLuxIAGV6/fvOLu9S1lXnj3+MgHr9/o4Mwr027HYb0BXpwaN4+abNnYEW/trV0Q5gUVXeD2cOQ0TSyXE+d1ZfBBIpEUKetqN5k0BDGaEhO5NPrumNeF4+HI8XB8qbaagk4qUhe2Kpy9mqX4Jx9+aD8XGxZnqY8DeB+JBHLPdpFxzVjoKRB5oXs212XrHYJt8iSL6zgIpgsB7zuBjo+R0DupNmvpPLv9jVmOY+GlwgKdd0SDEdx3FLGbG20KgtiKJbHdpVt8CAopr6oAdRYEnk4X7uYZpsGouHB7d0d3ZmFSJUKc9ntdMsHjS6MHx2AY9VKKrMy9swuqc3p8ppSV+7t74jhYrK0EZ+tartXz5XJhiMr7nkzLUErVOsAU8q1Q7GAVxz8zhChoxb7nOoy2A7u1Sh/Ebuttg43+/y+G735tiuzdbkdeMyfvzWHWCbqx95p2IyXLkn3c7QRtlczGn+9d8OJA1GXRMs55yjLzeHom4Li7vWGaJoa9VNIlZ81MkrqCDTLoTu6vvXQYNphVVNrN/n7jvKcQ5E6K4Be5E3xnHlgKrjd2ux3F8o+vGo+NhdctwtZ7llxoOZNxpDRQjGkVY5RvWt/iVR3DMFDOmcvlQqmFo7thHEdubm6MVmlr16ChkjPrspKHytgmhmEyZ1Vx+JdFkBM94nwlRVEzh9Hz/U8+4umy8P7hiVrgzasPcR2++Oorcm82R3HXQb/qAROrOQ8RBW2tK+fziWk3yYV3TNRZsxTXX1h3KXq5FtD4te/d8WufHkjec8maJS7rzGXR0HbNhW/ff6vZQJVNxqZez7VwPl+4OrfWTDdvMEUmJM5Pj+RSubm5Ba855OPpwp/80Z/w0Scf8+btGzIdv5FqvKeUDF2+qUvOLItQhqDIHZrT+9rtd6QUSHHkeLgRVNcrzSOTQbR3a5PxKkFw0y8//5y74y0ffPwhea1XvYf3SeaNRXbuu2FHWTLn0xPLmtl5TzyvC7thED+9y1o69G74qQ07neP2Tgulobb7+Xzm7v5WEaFVfF3XnQWzdIi6IYNhwXevX3E+XcjrwjmLAXN7c0MaBwYva21nFVHpEHGMgw69OCQ+++zTKw7sujNrc93KQwwsrW1gO8M0Mk47epMR1uF4wMdBeGfjym12BOWUOyXlrWsmXwrTzjGmQbd4VyUhKllgXfI1Q8HHQLDhr+EYuNZZqtpVMaccD+/ekZeZm7tb5hAZfcC5QBh31M02IEpclC3bexgUa8lSeT6dWXPhzf0dazXn3VYZQmI/jtzdHolDAmcCO6My0l/a995V5fXgzMJY39ucuP1Yd7N5+tdamKYB7ycO+734/7VxmhcLUpfXU22CkHozVTGdtarriigzgw69VPKycsFxGEcGAu+fnggh8Ob1a4ZBMw2ZJ24mah3n9hJ4LQvruly1K//0G4IrayciaNM7zzROLNa+y5p7oeVOzSuPj8+ydYkvl5UsWTQj0HB6oGStSzdMTGtRGtooC/1gl0qIQZGxxqXHyaWTpiSzmF7+btGGZW2xERNak0uAd86Eottl2e2daIZQi6wjTqdnWm3c3d4ypkRzmxW04NwQHB2Pd3pPy3JhnhfGaeJqF21QbPeeXivfvHtHa0rzG4fRLGu4msy1ZkNtOrvdJMX1ONgz2CKBIYSRcdxZ3Wz1s5Oj77tvvyClHbvpyN3NnlY9p/MDx8M9h+NO4q/S6DXQvMV1mg6yG7Oo1BdhW62KQ01eF+pumpiXhc3KYxhsBlkrx5uJN68OlLLi48j93Ye8evuWh3fveX56JIXBfJ483ifmbB12N5vLUmit2MVs5pE5K7nTO+q68ng+kVxAXDBpPnLOxo6wbrWLrRn6d8KmnEgCa1Hx6lMgGKmh1CIK9zSQUqBVWf+oyNbRl7ziEdZ5xgHTYUdeVkJIvLl/Jbp6FquyY3OuJnsYFwO+O1n816JsoSDlevzm22/59ONP8F2+Q+Mw8PrtW06nE8HLq8g5R+j+equXvLKcnnGv7tnv92Zi5yiukZfMfJkZx4HDdAAfWNfCbrB8gsvMu3ffykvpsGcIgyiQveNiFA+9VlbqVX2bYqC7cDUbK3xHUdglSJOISX4sUR6+gLjFAaeHjuVPOAQRNQ1qO47oHSuy8UhOgsEetnkAlhGh7OsUBpZ1kUHZKDuR0qt1JdqoUxKcVUtR/q7zXOaFYWiQBp4fH7m9vVUamlOV2YPCWLzvtNIIAXbHPQ9Pz6yPT9zc3KIQ9s5XX/0ZzgU+/uQjDrdHnHeq6lqlZ0EOYQgKGNKatzAcwTelV3wT1LZ5OTXXoVdCUTez+TiV1qBLjLYuCzEmxmmCgMUjNtoq8ZLvsJqWAsQ5b6UT8RymSdnoTgfrkCzJz/DPYJ2ShrFq0c/nZ9IQaW1PXjOt1P/8S8I6CbrsMvbTjt1+x7IunM/n6yXQDTaY1wKtUivE2NkcYM/LhfPDMz4GXpm3UW0Ku8o4bu9u1VU1MaOaQUbNLjaa5zSfuJxXbm+OkAZCEyc/l5X9fk+jczqf8V7v4DjtiD4q46I2xiiYdpszNBuUrksmJl1+YxpZ6/ISqdn7n6Nv9q51272chEtVBemjGFolV/bjZO9IuSQfvX17hUCmabyypNjmHeaE4HH4NJISxDSpWzJ4WaZ7WNdnlT/FDE/VXq7zSl2fxOn3MvY4P3/LOO5I8ZbH9w+0nuVk4Bwb3H41TgX2447HeoLuGH0gp4F5XdntBi7zQl6KdSCVshZuj4FPPh6gn+k9knvnh3/1r7A/3PN0nundMa+Z1l+Chi6XmeAdqUu/9Pj0KNX4NOHM2VrK/aT3HwN3r9/gihlE1sJclW/+m7/1A8Y4WNFZDI70xCimZkyRec08Pjzw+vUbRbqWZjPKwtdff83p9MTHn3zC4XCg2HqKQ7zuK1cq56dnmnPsDztBv7FzvLkhDtGU4Zt3U6WbWaarigZY5wsxBG5ubkgx0Gon3h4PJPMKSk5slOgcw5Be8nLbJklXC3t3vGV32OvKqF3sHNfxLVDrhWAh7GurdngkCTOc8Ma7myPDNLEbd9TciGMywzRZdV+WxQbQVXTWwx5lYW9eNfIC8s5RUABMT9HYB1aFdrnTjoa/z1nhOZv7ZzB6K51rW5vnla+//pL9bgfB4YqM5YrzKBwu4oKThP5yoSHL7t47rkLz4LoyhbGNe9gduL25oVLMWmRgmVd+8tOf8v1f+zXevnmDy4Ypd7GC3DApstQJfnnz9jV0R2uFNUu3cjgcqVlGbjEE1lXzlhAia17pzpE6EO1/c4lvv/mG3W7icDwwBrGjPDJTXHJRXkJQoA3owupd3VH3qmZvDjfEEChUZSw4qKtM27zXYDGaIrg2DdDjdlHbbKJmXfOH3c6GoCo+NtaF3rFMztZ1oWVZLSt8KJPG4T/3ktBJossijYPgoGG4FhzK19b62I0jPSWWsgB2WffOftzBXrOylJK0Netq4jL5kLnWTJAnP/9KNXdTWZCfzxf+9Cd/yoeffMynH3+s9+FFGV+WCykOHKaJ6pUAWaq8tsKQ8L2Tu7Qz3myfSxUuuttNpr6Wo0Cahqs1Se+VUlYrBpRMJ1h42xNwcyNlbS5FFxxmPdNVme6PR4lMrfDrXmr+vGaRBZKe/TZLeQkBM6aMl9Nucp3H04l1KUYC0twDm6ltWfEQWJv0J7118rkrn3xK5PNsfm7SUPT6kuS4xf/u1sSyXpjrFgGg/TwMieflzLIs4DI3u5HPPjqw26m4cz5yPBz4w7/zLzJnKc6HYGaXBhf7oDnTuqzkvl7PFm+00egkaJSNl2Yn3c4dZxGrtRacMy+4rv3U0FwlhYgLgqN8UHcZTMPw/v07Xr95TfMB1wq5FKZpJEZZ+WS7ZDZtUbdirBe54PaSKbkRx0hZq1niWJnvHbU03r174DCN7A97swASM2uDwGqVNigOhz1z71Yp6wDqDoY0ErZKMGvYeRVueUdI0RS7RVd78ISAPGKQ6vVyfpbSLwC+XQU9u/2BiOP5fOJPf/5zfuuHP6SUrEr7zWstfvNY8rbrtyoTRFmsyCPId0dPUYyUvikiG9HJJ6fUxhgCDlnh0qJYGzanCC7oFm6dw+2R7hU6vz5lpt0kBKujdryLLuvxHHc7mvkngXQeyotQZXQ13grehDMaYNIgDgPf/7XvGV3y5fLEAl+C33xtOkvOjFGCv9wKuayUktnvD0zTPTmvgmKWWaK7u1sO005WAa2qIg+RdV14enwghMChQo+dvKzMWX5Ow5CUS2CDaydWLKE70YG72CS6yyq+d8jVWEYegg6U2mx4b3OQYdxgO+WUny7zVcxzO9xwPp9YUuS4O8j2uFWzB5AR3eFwwEV59pfeWEtm6i/Cvn/a8Hr7Cj4wDhO7acd+2imTu8gmLS8ry7JyvL3h/DBTeuFm2l0rq3A8UoyIMI6jGC6WMNZ7uzrnehdwvhOap8UItVJ6Z5oGPvv+r3F/cyN4rwrSDONAbRWouOgZvWxGclHaWUQzoeg9a620JpfcGCK5FIYYqMvK+8cz0Wke8a4V9uNohAj9nCkpnOrajZjjaQyj1MkBSlGQjXcRfGddMy4L1sB1inewsXgsz6M7ZSD34PFOkEjJyzUmsyFNRGpwPp+Vw+LAIVKG9C6daqwJaTHMQdZ5ei88nx6YgjRDOa/4FgldbgDdWHFtm6VMnnpuPD+f2R33jGO8aiyiT3h3Ztp5Pvt4x+7oSG6HiGKFDz76Nb73vd9iyZm6rlw67AYRZeZ1UVaDFR1ior1QtF2M4IUyV6Bm05j4zroWLpez5j7jcKVD+wDzfGFeFqb9hLMLtzbNTXop1Fa5fXWnZDjA+0bpldN8IqWR+zevwQxCe6sstTJMwzUnuwfHYb8nm91PB6NHS7PhUiCgwuS4MyFxEStUtuH56ie1lMzTwwMxpaSXhlrn2uThnnuhowq7py0RTLe4/ORVYXqvwG9avw5hXe34FBnB3E3BNc0mxAAqOBt4Pr5/x3K5sL+5Aeeuh0sz7C4OA+uyME6jYbdcrRh0eAd8N/FNEW7om0JpSn2JEE1emH0xmmmM8oAqpRCLGB8pJV7d3vHw9HjNF25FwkLRc4X1rlV03lg9LXTLqW14l3CtU3o1/URCHqky/VvLSu/iIb95+wGXy0W4v5kENpocPy2HoWECxyIO9vFwkDNnLvgoKuYyLyzzzBATo2HDLnhalq+Mm+SzNE0j8fu/frUMby3w7vGR0/Mzb968YTfcsyB32GVZrwd0c5CzqpYNU//m3TtijNxamMrVI8o89ZectW56x0dRYjfM/vZwVB56SEr3MujoMp9JaeT5fGI3jNze3l7Vv8s8sywr+327mhxqKf4zhthdcMdhv+P59KQNP6u4GX3j/Cw/rEPdy+wR5Eb8HUrppiWQQArh+1teBmLxCPJ01FaYUiI7QYy5dMZxZLfbs2kwipOjKTZzaAZDrFmCRoeYJeuyasCP8PYwKh50SJHoPIfDgf3hwHmeaesqu27rFCoSu6UYZVWPfrZPnmUVK2d01+HctejbqtJo2o3aG6fHJw7TRAvOLpxmAUkqznzvlv5WGL1/Cb/yDocXo7Hl62xA6nPzPbrucDb+EtvrrK2x9kr3sk/pRRddDOqs8EFOzl4OtCkk5mXleHNLT53S81XMNu0iv/7JKw5HObWmYSSmQs2B3/iNv8Jm7dN7ozRHv8wslwuXZWYaR6ZpMkW5EhZDsMTO1ihZHYFvTQU2UJtnzYuF+ARFDLfGEJMZkQp5AZFlnIeWlRNRirlqh4Afx6t+R35aO5wLtJI5nc48PT3hnePu/pYtF53er9Cjp5iXnDrdGD0+ymGh5MJuGDidz8znC59973uMZv64uSLXWlnnWcxCZ5BLKWpnvZcIBOcoRdzgIYTNHBFwYnq0Fy8d1/o1UH7TOjgf2E/y9pEDb8d5qbTLsuBS4v7VPb/zV/8qu6MMAcdRg95oLI2t/XJemDl+a+81DoOtyneYhSIOR3UNV2DJstCIDi4m2ooxsK6Zec6M44BD4SYeU0kFudg6L5HY5TJzvDlKhdi7krmaDqsSGwNJGgqvYJ/ajS7VGvhKpiMDZivNqVcGzRgjvTSIau02ZTd01lYVYuQjz0/PdExTEBQ845qje9gf9gzjKGzbKz40WSewVdutVAiO415t5Voqp8cHzUuSsVzoJJ/wwXMu56s6u5dOdmJU+SAqZzMc/7uZ0a6JZhud53YaFYWKuMAuBMqSmeII48aokXp3t9txOV+4rCu7+0nzEWCeZ6toHWVdeXh84Hg4crnM7A9Z/9s/44J4uSg8wzAwDiOXeDG/K7i7u+N4OFw36FLk3np1VbUuJcZAyVaUBO2JXDLTOJrRnirLVhskrd0epBua55Xn5+erK3IrhTgkepftx+3xBjws8yIIy6vjxeZmW/pbQ1Vs7JVusbkpJXZpYPEqKBSHClNMeB/MzLAb7GmHfMmc1xPe38mjzHuLCNYDi8MgqKko6yRgTqj1xZU1V+sc6dSiXJab49HWsXZlzx3Gxi9+9RNazXivTrK3rkOkdUvz4+qZ9N0X55yjZEEk0HUueLMTD4KqbPdTvfZFybOyz32iukpMjnrJ/NrbNxyOnsllYpgQgqSY3O9/7weUhgVzeVJXWJPrcLPb42w2Wc3AsPWXM7K1xlpmUgrkYB2F6/RcSD4y3WjgX0ohtM7SV2J3JB/oSfkyhQyrYPySRWLoXh15y4V5LVftjaosifhiDOx3k9biWgmpgkFkw27C9cZcMvPjheNRswjvHctcrmyvS2uM48Bxf8D3zsU84hzu6rw9jkprjL1YO1JFBwx4lrLKJbE2Wog077d3qwAc3NW0Tni1BsoNz7pqnpAsCyAGtc0vkZCOOI3mWhq5v3+lA83gmtmGjM57ed4PI94GpJj/vnPbpeWvQx1vlUzFLDQaTJsvU93gK21U+e2r0osh8vj8bNDIZC6Z4nxXXwQ5tcbl+VlQUoxXgzxvNF/XG8l7XG90rxrJD4kxBNbt8mqazYAoj9E7yw5Xp7Fh210fk2ApbylEnpwnBmGwa+2UvDLtRlwH5wM7q/ALwrE3Y8RLnnn88lsOxxuSD5Roaty8UkuXOHKaZGHdJCyja+jcvfyoSi+40tmN8piqc+bmeGSLm1TQzxZ802S7Qsf3ROpVhm3NQSxU70gOenO4nq36TdcM89watWVud7fXCy6avfZ8uXCeF0bLNvlnfrk//88hBOVBV4W3lCUrYAcHSV45ocq7v/dgyYkN6BJ1lcIwDsznmTVXjse98r1tSOxDYBhGI9BIUxNC5PY40BuW/+5smusIYeD56Vtcc9zc3Oi95kwK4t3vDju8E+V6S6nzZiUdjGW0rplcqhke6v1viY4bQ4wOwzApTrc1duOgtEiv2cymWPeucD6fOez3HI5HxBiMV9O+rWPrHWiF7rZ8eWOD1ca6nCVuTYkUd9A6v/r8T+lbt9IB59lS2LQxFTjUcXgnuGTj46nslManO0caItGwf5nTIcppB1zXBd5XQhK9nd54/Spx+2okuVlMruBwQddu8iPHm3t6tt9Tu0EzAz4WSq8kJ3FoBzlJGCxPDLgsWm0IiV4zzXm8GefJtj+QsyChlEaisdQAlmVWEVq3mV0wLzd1irU1TqcT67xw/8ErelURM7kIoROHSBpveXp44OtvvuI237DfH0V46BLIRi9/uWDIzjqvrHklBBW/YRg4HI54JHZ2TgW2smHkHjukAUbwyTtCB98dQxfbZ10Xvv3mW+Kg7IDtYmhoYKQqxDQIRrcM1op770lp4HQ68/Nf/YrT5azbsFouq3ekmNgMLDe13/bVDILwztSz4YWu6ZyCTjZHy9EO6+g8EVmTt5xhsx6wQ3dtlSVnqWHNkM97zzLPbGE2JVdayZRcaEUuoEMabXivtLP7V/emQm1sl7v+IxiqWNUm6q/S+2J0NrDy+B6sahFnv+SVtWSWUsm906KjJ2cJYRr0llLZ73fsDwcIXm1jCLSshXN+fmbtlbXpc7m45TF05suFd+8fzHpkg2n0uw+HHbubG0IMnJ5OXM4nWlNHGYbB/sZsnZraZEfji2++5KtvvrbNbCIyPPO88NU33zCfzsSQoFVOpwvPjye6F7//3btvuVxmUf28KshiVUpvjbou3Bzv1eE593JReE8ch2syYd+gz7/EVwiBaZqIY+JwUOZ1Mf8sc2BSxvs4yIbDOrmNVVSNKVRzlcmgDcAvy8KaV0qpXM4Xm+WYi2ip5Cx2XorWmXhlB/Su4uKDN294Oj3zy1/+AlAi4DCN1k3od+Ra2fKyRWHWz6pNF4FgrWy0U3+1BgHBRltMcBoSu3EwavhITIFxSqLxRs9+P9G7rUHhFuqOg8WDOulUvIM0DCgMSgc+HX784x/z888/N38iQV3z+Ykvv/wVV7sQMOO7zVNquyBs31sHtbkXtK7ZYu+Qc2aw9RC8IzppqBQG1Kh9ZYPPHI1WCnf7kddv9oSYGZLs4GN0poDvlHa5nldsQjIc1MrT6UQuhZYi1cgwS141j4rSTDjUfdRW9HeXqnAys+npwLIsfPXVN6Z5MAKCQWcOdWTeqXL3QRdy6Q3XZH+/Ox4wXjeTRfSWtTCfFsqykuLAzc0N07THe6E667LSqgrSw/GIogAy3zy8Z11ErR+tC8YYd8TAEAfovMD8ZslTS8NjzIcUog3XLHazGVsFDV2DU6Xs2tYSapCNHZK1Sn08TgPJe959+w1/9Md/xHJZmIZRSXenExruuKvz5vbzug1Z9tOeV3d3vL6/Y5oUSSkoyQ5bL4OtWhXm0ZroiRfzbnKbD01wVrgJI356eC93wzRaG+VJQ6LXzrjfs9/v5AwZPEtexAaInjgMDHGUpXmIhJg4P5/56osvOD2fiM7jog7S1sRy8sbk0OBToUEhGB1Qn1YukePu2pU4dNn5bvYWpRlOKrbUGJMZWouVU8qqfOooCX4Isih3rV31JMM08cnHH3M87Ek+Xu027u/uOOz37IwZczjsmHYHnOPq3ltrUYCLZXXPubCshR//6Ed88Wd/RpqiHYgrzRWca7pwLifWvHC6zNdKFWC5XPj6m6+5zDO1FAsE6tdWv7VGGvfcHo94OyQ3GmLvctKtVfTYsi5XiOQv/LJvC8YUc85xPB5w0VkuxQZfQkxihsk+WsXBNAw6zBzs93t2+4Oog11D4xQjX33zDb/8/FemwsUM85zBXYHzuvLtw3tRfwdBCuM0kkvhi2++VuedInhvwVrRDns5bF3DiL6zT1JKTNPIOCZC9GB6G9FfuTL9oEk1a+aW67oKOrXZjnce5yMffPgJx93uquDeYKjeCi446XC8u+ZxdLS3LqdnPv/Vr5hPZ77+4kvOJ1GWv/7mKx7ef3tlWLmmPe/pV2GkLoQGvV3JDRtTZyOEtF6Z85nTsuoMCh7noiEKWltrzqQhst9NJO8YfOd4GEg0Rqc/IKUoVrwz40garjdad+afZR1K9OpaRgkUaxNdfDft1Qmar5LzdoH0Dm5LhHP05hXMljVXur+/w3kV3vreLuv/4AlBGq+8LKyXC3leCU3PK4ZA8p7QdK7muu2XTjd3gzFF7g5HzTBs3qHZMNJWlCwBqY8cdhO7/WTnkC7l0iqtFmourDVf4bRrJobaNWKzgbPUuZW+Fg6TvJFAt/jT+cSrmxtCdy+COWdrt1vkZ1VlE7oj7RJv3n4gkd3dDdVwsJDSFaLa6LXNcZ0nbLRPnIZYrpq5ljOrAic/KN/gNF/49umJcTcx7UYeHh6YJj2IrQItJmrrvXO4vWEak7m3wjRKd9FMxVtK4XI6c3t7y2RBMcF5YvImTINsthDeq6LRAaasi5WF1golJHVmPjAMgmO2cHpQR1Ttpt+S5a45vlgQSVX1FvA0bNaBgkpabrgIPiV2u0nOpM4T7YB3zQ6TVuk5SxG9ZIIxQzYOvS5oXWghJnaWOdB9J+fGbrcXgcAO0RjEivirv/u7SkdDN1u1Id5+1HD86Xzhcp7xwZGCPKFarqQ08fbNW/bGqBCUVa8OpD5EUhqvAUSiO1f60rlcLux3By6XWWZl86qZgIt/Hlr6p305bICsC1ltvWe9ZJ6fnyilcn9/B8BSCksrXE4Lx90kn6og9lGMA8syW77HxBBVQNUurvu6FjGLfLPfU2mhioKcV06XM6/fvFaKGZq33d7dcXt3J68kr0gf5xyPD098+fWX3N3c0o4HphgZUpRWwlll3xspCb6qpUi/Gq3bcKjjv+q6+/XSi1FuAt4H1nIWNTwOdPSut86q1sblcpKnlQ/sdzvbU/1aiQbvuH/7ls9+/ftMKZE2tkxb+eM//k+Y1zPJ7L/1KoKJ/awwdCZQ68rr2L6vO2h+O8wEyTyfnwmD55B2aDdUXNtEnJpbtFIJvhOnTkgQxZMHuin5X6xRYnRc8sK4zrTazfNJM4l5vnCb7mh2MEcvzRRdhRuGLmCfxdl7CwFOp2em3WhCyE4ajDLcxX5yG90+q4BKlrPzzbt37KcdH759Qwg6G5zvV1+56IJEdF0WQM4IFL0qr3yLCu7o3WOwrsYC0jxpSF959/DAGBN3d3cU7429KoRmo/1qvejQirUpbWmKiZ4G1l4Zpom9V2U598bnv/qc/W9Lxu5w+NbxAbPB0CE/JeU+VLO+3e8nPv7sM8BzWQvH45HT+Qyt04IhjnYTuy6Nwab+XGbdutNuInZYuhZ6bOpCFjPHW/LK/mZP8on9fqfkugbdbxW7qq5tIDcb22O9nBl25t2ytZxGvyx09naA0RvPl5mvvvyCDz/+hJ2xq/aHA9U2CzhKXfHBMXaL5HRYFSaMtbmKa6qMSy2srTEEDYmWVnj//j3H3Y6bdKs/O5gdg3kvLaVeLUIqUtxOwyDoyaoC192L2lp1Em4cCHjyuhCmyeiVqjR8F4vkdDnTWmOMUc/BKKwphOtlA5DMm+rt2zckr6TAbeDVe2Ow0KJpetEwVFT5VN+UNsiLcylgbLQK5qNVc6EE8D4Rgt75fL7w9bffcLw5cn//GuhkU3T/pUCn/gI5AZyfn9kfjxyPR8EABl1W6/KambvVBo+nM847Xt/d47sa8ZgGgofSO2WWAvztq9dXuuE2D9q6lJY1w7m5OWje16qKgdbY7SZBGFWXS++NnLsU7c7x8PDA+Xzmg48/YuegtI7f4K9SyFnqZ++cugmV9+bxJHirNekh6KKubmp5F0UbD96S12onmANswFHKxRxoHfN8obXO7d0tOAkdS1lpNjT+4W/8Jmzzo1J5fnrPj3/2JzjkqCqkQRYiG7S4TR8cZllic8n+nffWq/lauaAogtOZ/aQ91wyGqzkzDgOjWbbfHnbsdhHvKj55gjO9A918tjzRBWprnB/f8/rtbzK39aqfOteCj5obtvZCnNkICmB7Oyi07HyZKWXV3GvYE2MxEkG/6hKuVjre0XNTrK1ZosjJAV7f3coWpW0mpcUuNJ1P0cv0sFuR0Eq7zhiSQ/HTZjjYrmgPuvCLrJOclyXR7WEvE80olli284Og7kO27VKS0xpxHIfrph2imB8NMLIEh/2e7/3691VJOlVADn3YpVccGhiXXK+zC3HcNSTObWHzoLmcnqn3d3hdy3ZQNKpD/kj2AR8eHhgNP11quybddd94Op25nC847/ngww/YDYNofSaa6qUZE8rjIxzSDgdXnHFKicu64GJgTEo4o4mNcntzZEjiwQs2kP3B4/OJu2VmPww8XS6sy8J+v2dKwrDX3NUmukClkYzSupiycllmqXSd7A+G4KzqdPRSWJeFZzq3pu517jsMgxCJsYny5zbOs7DC5uRfpfQ+0ZFL12LxKTAlr4F5mK60xtaMJhfUtZxOzzw9POJD4NXd7RUDpneqIWS+y0VWmhPH8zzTTCHtvSPGSQeEHYANCZJC8MoesGo2BW3wEIINxh2tB8OrGz3aQb11t71zPB4Yd7KUtrtcStNc/mJRnZajbRgNiX/zhz9kuVzorXH/5hXrZaGb+nyDB7a51evXrwALq9k6SCdTv1oUa7rMi2DRWq86HrkG61B2NnOLIQmPb9LaqAMr1NDYjeZs26DXyv6w53BzFNbdjZK+FpZ5UbjTNLKsEu8djkcNbU3IV6tYTX4TVVlX27dDw1tXXhrOBVJytheNyw/XNXhzPJLGJJzayQ5fTYBZS6AiwqG54XldSSHw1Vd/xi9/8VOCh9bd9UU0MBNIC0dig34MZjJITbRjwHfzQ9IvWHPm6enC7e0Rp3wDQXrNCfmo6mK8S+pgrGtQM2GMKJu1uNaYl5PWYCm4kAjec9zvtfdbtQ5LiAmoqF2NhaQpt7rM2orNJU1J3TtTGOkoqCyGYIQUdcWi1u5YswS24ziRUr0WzrW95FJsVmWdztqKhIDBU4w+PQwDuaibH5L2Y86CqJ2hQz68oCG9Vqbd/uphZkANNa+M0+6F9o32n/QW5tVja1SzBjs4s1XFh+MOZ9CCq7LLzr3x9PDM5XwipM0Gwz5Q6bLa7l1eR7Uy7SbuXr2y6MZOMOzr3eMDp9Ozmd8pX/rm9obj8UYHuJOnSUDxf+tlMThKN2xzzvzoRQVUKKxUopvXC85M34YBnyJ3d/eM4yimS9tsNyJjUqdQereM6UwcB374g99kvz9wySvPT096ia2xNg3CZUGh9jI4RaKW7dX2plsaz9rLFTpzW2Fil1UM6ZqTG71nvlx4eHg0g7+XoWjvml2sNfPw8KAOo0hfAdjAz+JP12JKVkz9qecYY+CSM+8eHkhp5O71K4Ol1usFKIWoiAWjQWPrskDVQPzrr77i6fFJ9iqtczaP+0aD2q4DfEIgBInBnFcGxFJWa3H1WbrBjht/QaE55gbqnLQ2wfP89MxlvnBeZnJZ/+ILYjuBEAyz2+3Y71RFOR+Yn2aenp7JRbbOyzLjer8qtHe7HaNZqINRP528qUovrKsyvZ2zwavXHEqzKOWUpzTgzcRQVfG2bhvLKkdZumDb0ptgKrPLF9QnPFrzHR122DscRtEgl6Uw5yzmVAwKMQpblG+//hwtt3AlXLSmuUOtVQe6czw/PfHtu29tRjSYbf4L60a0Z+lNRAtV4dhKwbVGDI4f/fSPOT+/o7t6jQ3oDcEFG9GDl7/p+qq2ar1ZB9u4Zqi7AM0FER9axXmn310b0UeGNOCjWJW9y4Zbz7xf5zRak3oHgcb59CySwbLSqlwD0jDiLR6393btpJ0TYUJzMmduEJrZHW6OjJOsekIITONIq4KUuhktbmhFTCOlNp6en+XcarY5zaFZQ1fOekpJlOPywrILLhi8qOc6DqOQRa+C77KummVuZ8WVXNOus7e86YzsMHn3/j3v3z/QQ7gWNM45UkgMKXE87IjF1NTedpMLwqKcHVjNSYE8xkitdgbT2YVI2Y9sfjEpRKoNW7GBY8krtVUO00EP83C8JtYVGrF5VeSTcPWO6KzjOJkPOngnCKl5qCVzuD0qL9k2rdSpQeKybXgjYTOPD4+kGLk5HoW3xaiDywbMySfzgXLXaig0+f4XWwDgGNMolol33N3dkoZELY2yzDCMjObkuSlwN5fWlAZqlNe9FKka/Ne+8fGVXXD3+jU4caCdczyfL5wvC7shUWrn4fGJ3W5itxvJeWVplXHccTG7iJubG6ZhssVhG9FwaIBsA6ltFlHMYXUYBNNtc5PewcfIfkj27qXsbLOq6ePxILaDd9zc3rA/HGitK0Zyv1fFm6uGhM7Tg5gVy2VmSAPDqHzuvnRWMvs04kI0mqgostJfNJlNNmhlVfVdKg8PD+wPR9K4M3uN71hk/wVf2wB+C9qpVW8+DcmMCy+8f//INA68efMG75WOOC+LVXujhsvVjCudJ07y629NNM3gA+csiGqMA9VcBrpzNC8my1YbDM7jh0gLXtBNiKaJaIC48d0orhss0VrX3+BUALXWaCVTe2OeF6iVu7t71pohZ6pzrOvMYdorsAjH49MTp9OFV6/uSUnwZ4heiY7ryq9+9Suen574/q//uuJTU7IeQLROnKP1SuyWFd2No2Sq8NYrP/7RH9mh666sps2w0YxCrgeXI2CpZ9b5dDYB2TAMhJS4XM7ARpOF07xyc9ix5JnWOtNNohll2weFLG0MIsCKuJfhVUPU7K/ffYkPMO0mFWMOfKv41q7wU7ULopR8dYzQpeGuA2sFealzSUkixof3z9zeHYlJlvebZUjwfqvOdd6Vld5EWAghvZCFQuCSizGjRptBqSC7dgDfYfl99dWXfPXV1/zOb/0Wm0tvTIHejH1qa88mqdd/Ly/K4DgeBL/XDbLszf6OSMytk5ym/FsGawpiDDWEyQUfdJN1CFEVxaVmpmGCzakSy4R1XVnLwXF7d49zJgoyQYprmwmfePXxmvImqXjv6mKc4YgBWGomuWg6A0E1W9B8LVkb1EnaTzFxSm/88ud/SgyR3/jBD8AyDIYhslS1zWOKpBqY14UUlSnhfCB4rFJRHOA8X+jecdwd6MMkSZyDNE2iCG9qc1so377/ltvjEZcST4+PTGngJh7kV1MlCgINsJMXc2S1rOn5cuF8uTAMA3EcKa0ymC9VzcJBh92e3TDw4ccfc356xnW5yFa6qOXdXdv63nUZ9lbJ9n7PlwvewTBOguaaLv84CBLJrRO9hphPT098+/U7Pv3e93h1d8dzPrPbHbQ5zF56CFEpa869VE3bkdA3VEAGYq7BsBsM0pIKv/tOlxoT3zPRJZ7OohMeLAq3bApWB6FrVnE6na5q6f/cr+8MtlNKTLuJy3wi18Lt/YHHx87lcsJ7z/F2z3HcWzeo4qeWwuPTe3qH73/2Gc1pXa7bHK5kwal0lnVlmsarArabLsM56UNch14y3TqBECY7aJEzQFcaYHEWBIOnuUBHHPq8riIL5EJeF11WKWleIhsBQZBVgr/zfKaUxjCOirWsjR7AJXBRClsfPMHbZZECbz78AG/uBt4H+lrpUb5hW+nfW6G5QLF/X5i94K2H91/zy89/gkveugfBOV2sCjb9CR19vt7gz02XtG5bDfyr/4N/jf/wP/j3+eMf/ZGYUUGBSmteWcrEPGd8aOz3E2U5E6k033FhxEdBaNqXxoRy2wxEDq/P777hvDyxZqeAo65gquYSPqgMb6XocI8R33Q4bxHE/XrmQadyOOxZ18zlsjKM8ntzTrM5to4/ryL4mHHqMO6oveh7nNhOAKVWUZTTwVLyJKLcum1n847WIXq4u7khdHnNiWorS/htVqVZ6dauG+3Xe+5evaK/f8/D4yMxJXyMFsMqk9DuHVFzCKVyzRaoPpiVhrcKvRb5iDTnOK+rfJnWrArWOQqS49OU4dpNS+GabJ03O18fvJS7XtP6Upq8jbratxgl5lspDN7TC2ZZu1UCgpHwEs3lmkU3602xnXhWa8e9CxxvbtkfDhx2O+YsKKXnRHRBnjI+KAM2RhqN5NRyBe+E+84Lj88X+va37ZElcO9MPgH6/ubt81m34UPkNM8cY6SXQnHqckqtplpXXGAKjrw2CHq5LVdV7EFRot0qlnEciT6wWISpc9Cq/Hr2dnHWKk/5rYUPwRnurcHm0iquFmpS4L3mGHLYdBFLH+qi0nlVW7477u9fczzest/vddiloMFf1TuIzuFMqHalzlUdGNsG3R1211wQGuzCXl43A9duYBgGQSOtsy4z5/OZjqDHcdrhHRwOB804TJzZTDfxl/3a7/asx5V5PoODb7/9ml99/ks+/egT3HS4YrhlyfJMigOln3h4fOawGylNF8fp+cw0TKLudg1E1zVzvlxk45ACtWRaLeCCbJjNdVPL9+Xm2gqrVpSeF0c5Lvetk0YzO4BhmtShwZUFGM1+oxYlvK3rylpXHt4/qMu8v2XcjcqecHDYHyzkXhfROApao+qy2o0jw+tX7HcHzTh8N8ioXXOyvbFrNKgWS6e2iqudP/qTf8zp9CTlOZ5cV1ozJTkbg+mFdqx74aXrdc6zrit/8Id/j3/5v/JfI+fOj3/8U0pbrPtu3N+9usYK7w5HHcS9sebMmPx3nq0Yilvi3Ua7Dch++93DF7x//zWH3QdyPG3mTuAtfMthtGnBWr11TvPMfjdhrFlaF114Xdarrfp+P+qANbzHd/mWOe8133Jynd50Os6FK+SvbleOv6WqS4tB3UdZF8GX9qxKLZQ1wzhyc7hhvxNMXG0P+aDBNDb/EcgjWxXNNaX9kdRAf2tA4Uo1Z8I4atDfbSOHEJRI1S26EoVfXPKKj579NFFKYV0XaheF83I+UcfNU0kARwCi041f8kprRd4yzkwpumYWzcuuOYVAiJ51bTTf1AKvNmCNjroWsTDsAea2Df+A1shVwSdTTBBVfVXE1vnhD36wTYJ0EI0T2YZuvcmkbXSeKQZK1Rjt4eG9YLEhyofeqojkgikkvZhJzrOu1fBTPeAedHC+ub+X4aHz7D76+CqF3xZBip5WOisyHUzO4B27TO9ubmRZfbngolK+Nitq1xUnyTgxhShZfjDlaTXGH2KqVBtAdsRqSYOw5WGaxLfvLwZ53dy39XjFXrvkzJQSfhjEz6bRc+PUMvc3N+RWuayrZjmbxxHqNGPyV2fc7ct3r4F5l0bEOylNW2vsUtIsZV1xKXLY7UQ+cB7fO3FIYpN1y302CuBmt/yX+jLYwHsVEcuy4vAM00CvMrakgCdfqde+O17d33O8PWiW5Dx3d69smHyRL5IdKtvh3zQtZtxNYo/lhbA/QCvkrHS+jUreqywVUhRhldzxFuzkB4MfujGYvFPOghP8F+wi/smP/wkPD0/8zb/510lTZG2eVzd34Bz7myNlkf9Y6yYYa52yzReawSAhMa8XHp+fGJNZjqCI1jU/k6KG98syM04TrsvPSJCgisxO5Y//8f+H4Ix42zplheU848LAOCY65TqXaLZOu9Gaetf5MAwT/43/9r/K2hx/5w//Hn////b3+fzLn+Cc5+ZwYLCcit4cw86U/s5zWRdubw5ofmdr20xAPZ3ujf7tddmcz8+cHr6lrhGI7KZJ7q6hyhnae+sYPHlVCNBuGvFerDEQc6k2U2U3MakcgUCnGWU++UChXAOZei6sIVDmmWXN7PcT43gQ5N2aHIGDvzK/lMjrCUneXr2p4/QuEEaDlEumOUfCKYLVBuY4j4+OVuXO23WEaS0jKM57uWrrBWBQVaKumbUWonNOISI2dG1Oxl25dT7/4guezs/cv3rN8MGHBOdYloXuHWkY1HY1VSQ1N9Z1YV5mhmHgzZAYQuR8mald8aS1NJ4eH5WwZC8a1Oo1GzCVIjiqV4W2B+evg2Wc4/nxkdP5zPGwZ9jvGUjyU7KKYRzTFQNMUQlhog468GLq5KZoxm1+07oO7myYo/InOsHDeDhIWAR4l4T122GgW7lbtxTMy78bbtuZ84UpJcYxsi4y83LIs35TD4/jiKvd8iz0DEue7FQTk+xyOXOqlZ3x0LVIRJOjiYW02TD7EOm+GjNG0MxSCkNQjGLtwidd19+yeW6FDZcJjujhkguPj49wc2S/2xNj4N3DA8+nM9TK3qC2bHTO0oWZDwSiS4InG7gYtIm8iRcbphDWs8w5az4SRQkOUT5XYbe7JvWV1inzigsR7wsuZzm43vg/Byf9xXeE1m0ad/QOn376Ka9f37Ou2TjnTdbnKUIBeuH+/o6bm4MOBWe1n2tczhdKWUhDpFQnBtYQr0ro8/lMip5lWXk+X/DeX/Uz2DN3dKIPsnTwnlIWw5MDD09PYpslZ9TQLg2M99fnkktlCJ5ht+PNMMinJ0aGlIylomqx14YfVYG21liXzFfffMNxv+fwyV7r28sAcFlWs/ew3JhlpbvGMGjQuazrdd3q8vKcLmeca3z7/it++We/kkmlc9YVrjw9L9zcJqBeh9POhKNazy/vaD6t/PP/hf8y3/v0+yxz5u2Hn/LX/sbv8ct/58c415jnmf1+R3cwHfakJGjw+fyeaxRr2PygKluSXQVct4jZLg8o+srXX3/O7/zOr7Gsjtw9h5iIXmgIbFDgir8WVd5QG3+dQ8aoIfNWLNZWNtNdeuuEoAJHhIRGGAfzcEp4m3fRJW4DiYAv64rrmnHUIh+raMPs7oIMWc0huHbBT0OQFVJLiSlFnJEeApEYZUffe2PyiUqlVVmEdEN8FBMshpsLiZYt+bBuVsKtafjkPfOyMj+fiMPA/fiG27s78yOXb1EYErtpIudMhat46PT0yOkyA53DdGC3G3n38N6MpPY039jt9zgv24mRJAfUrJjHbPht8KDO3Fmr261VVyzfOI5Mw0QKGiSm8B0KaKs8nc88P8um/PXtLSElYpIHe68dzL6gOcfiHVNKlFo4PT9by+Z4Pp1YzjO73Y6b4+Ga7dCd+bPoUbI5lTa7LEGtdwgOnJw885J5Pj3z6niDC4HH9++IIfDm9SvOpzPfnk7cv3pFjJG74+2Vlz0NE5XObPTdu5tbDcjsQs22uSLgXOByPuEC7IbxyhzKtZCXhfEwEY2hcZ5n0YZ3O3bDYAPDJjFj1+bOy8w0TYxJc5H1vHI+z9ze3Oj92QxmCBJIebfhnPLr2p5LtfnRZmDX4fp8cq08n56JITFN5uRb5SIazCQyek+vwsPLknHDhEMJbsXUw/9Ms7/vXhLOsZt2zJcL2ZnjqQtAxsfAclppIXA5nYhxYkhBXmA+0bvnclnwvtmh3q+W2t5tGHFgrY3cdElcLifu337Aq9c7YnAMPqJQHllRj8moveb/tHXxeM+dzbR6NyotgeyV9e2AvGRaK0w3B379s++pM7DLYxwnnBNltDtHTPJhKlX6iSlGPnzzmv3haPtOlv9DSnz49q3EWeb9NMYESRfsui5cloXzfOH2cAs4QkikkKg98+Mf/4h1fSb6Tm+evBTm00wwiHNTgG9MQIzhtHWzuXTGac8//1/8F3l6PpHSnurhb/7+3+Lf/fv/JrLHyHz1zbdM08h8+hYXHa1nQvccdsP1YHZhszHpW4VgX4LrtnCkh4eveX1/y9MFLmslRBUvtpxRRocgtd5FDy816yLtOnPoGN0ZY15uhaRYXBvzrWbpQ8YQLDdC52iMQZYbWfuiNulrYpKNy1qrdY06F7wRekrOuJioy4Xz6cy026lgNiSotEovjUahORmRjjYvbM26j1oZjMF3Ol+Id4lGJwUYD3v6umyiRIu7bBWGIFXmEPnszSszoqrm8eG5uzmqK2kNhydFMZJiDLx9+xHj+ZmcC8OoW/vmeGRMw/Wm2k/Tla+fgrBBF70ONKR4XJqw+RENsHOr5JoZQmC/P5ikPbCZjOUm2mEIheA8JWeWy5myrqI9biEaq4m3QpDFiFXgpVcW0yVUTJNQpY8PKdJKwzlhw0uVcCyMQa/foDQsSa9WWQN7PCkE8lrJZSXhrurPm+MNtRXW0vDDwAGuoqoYwwuf23yl7t+80VBrSNReRe0tCgShNYKfCFGH1eU8G+WycZh21CrRliJGobTC8/PpOtjaDVrszVTveI0n9scjY5RCvtZKDvDhB2+JMVFzZhNDhRhx1nJvMzHLnwFMwBN0QftW8TGyrhfyCsNu4nBz0Pow1tkGHeUifUBxzfyC7NIBfOvyTaqCb148l/6iW0JspmEYOJ2UCCdRkbFHYtasaKvYguP0+EyM2hObS2brleY6eblwPOyvYrTaDHJ1nvv7+2tBNIaBJS+UOot84brcBBC0RoP5cuLx+ZHduGecGmlM10hYFWiNEOQY0L3DD57gRmpV5bpcLjjXuTkeBQm3RvDmPmyMlY2tF2JgF7RP1rwIbqidwdTYgnKasrpjFwPHe4Zx5KM3byzr2ssOI3l2u1eUcuaXP/8ZCahe3eLlcmEthWG3N7eFSjfPp9bMZtvIFc6pc/nbf+fv8Vf/yl/nssyE6Gm58MlHn3J3/5r372Vh0mrn6f2TBv0tMgazsUgOnwTjaR1tDnHSW2z8KtfVFEYc777+3JThR2qCdTnz7pt3vPnwDcMw2lxP69J7uFwuPD+fRNgYhiuZxnunwvEK4Yr11oQ8svnNtbqyNE9swTqQ8Oco1l33CWnTcIGKCJ/MiqbjnNhvm5fV5bLwxz/+Md4Hbm9v+ODNG27v74ku0F25GvatlwtumrRfcyYX5c4PN5P2sX+hObdSuSwzq6x5glXtgk7EvnFM40Q1SKR1Yfzi2SqHNQ6JGoziZ0whN8BYR2IMnOaVcajcHA5snjGimZo/VKlUr+FQbzLNC3RqCCZV3wZZsMwza87Eww3hKv6xXAkn5eXWXpcm59Zx/Eh25eNolf6WPLXx1BXr6IMW7Ogj4XjUINY5mwuIBrbSeXj3Ducch+NRcwKzsOi1XiGojY89BE9zcoM9XZ5Z15WbwxHXHbkWnHfsp70xsrzw6K4WUlVWlVrZNus4qlpb8krJVXRfOxRrqSwhSzQ3TWJ2lUKpmf3uQO2FnDP7aXeluL559ZrzfCYOiZKNQ+5Fzyv2GdI4sPHZAVIIxBBYLitrqxqYhwClkMaR9flE72I/b8wwEB5qVBZ7pYqS7L2z3+/ZHyZ6aZzn2XB2/Z6NKbWY/uL+/h7vxaBay0o5N16bwv8vCh/67lfwQVWY5UsfDnucm8l5JaVELpn9bsfj6USeL5ReGfyoz+IctWa5v9bV5jCOaPYSm6CtJyu0HLx/er5SMnNvTJYC+e3De9Z15XuffXY10dzt93jfWctq7CZh3jbrpRZtCNcjmFbgfDmT0sA4Sa1bTY1uYxHpCGJgni9mcifPrWWZeT6fOe52MlvsneAF6bZSKKXRl67oXRB8KdyXyY+stTHQcSniQ+IXP/lT3n3zZwqUKpmlQ6nQe5AWw9uH0DjA7PVl8+Po10PvD/7w75FCYvV2WLXGhx9+xF/57b/B/+Mf/N+1viqUIrbTmBLRO2KC5MXSc71b0VlfoDq3nRsW7WqwzsO7P+PrX/2Uj77/ewzdcVk7p8uZu3LPMIoNFKxbxkgk0tlI9e4M3to6DdmMyFam1MyQJqO+qvhLSXqKb56eGHzk9u5WnagVvq2pCNS5Wwk9kuIgmvPlQkoyRw3GVFrWFefg1atX5DXz+PhoWTA7COn6Pn2MjPs9y/lMiIHn52d+/JOf4XH8rd//A6EgVxp/JDcp81PsRN1w4Yq5ldYIFo5SinDPNEQ2WMo5803vjegctQHBGZ6GZgItMV/OhLBTq9K78DrvqVkZuz5tm1oMmd47pXcdsK1DEDQif5OB/WEPQFllODZE2U2cl5Xjbsc0KCd2bt1S4CI+bUpTswBwztapI6SXcI3aGrk1BtN3gFxKZaWh77u5vcH7yH4cbMBcyLYZFdf6YlbXPaoUvXz/y5ptgURc9/jeLDPDrDtM26CWvGluALTSWVplP2r+s8wLT09PvHr9mhg90Y20qJjZuRSSl8iplEwtcpndUqZ6l4VG6pFxHBjGAed0QZ3nWRUajnfvHpjnZ968/ZDDfi8KXHCsS2ZZdAANMXHJmVQL4zTSWyempEPTFqXsThy+SezorSPxfuDueNRnDAHfZbvy/v07wHG8u+PN/b0Wq/fCctuWgZ3o1dS+Dr744gti9Nze/gU02P/M13bwCV/WAdCaiAJbZGlKiVaKqIDGaJNJm9ZRjAMxDoSgmcw2a3AxsV7OYhJNE4fSOK8LN6bQ792CZYaBUqsVYmLAHKaJy2XGO62F1pX7HjaRXlfYUcsrMShxMHgJtp5PM++e3hM++54w+25xw8EbDMr1c3rnOJ/P1HXFH4+mStaho6rWDqCaGVGmQO39alq3BgjVk5vD1QZ95h/94/+YNc/C+n3Ee6t48UTfSden7/X/2hUIQvkRjQ8//JSPPv6Iy7qwP+xY5pnTvPD6/p6/9jf/Fv/hP/wH5JqhCZIcUlSYVG+MRsV16ALqVjyG79Br3dbqoouE7ljnhS+//pIPvreyroKyv//970tpXl86kY2Ft7nrOud4enrmy6+/4uOPProqlZ3zLGtBXk3eZoeZb799R0qJm5s9h8NOYt7SZNudPMEgqmr6F8Bo2BvU1a55E5SCN3q8a4I9f+2zz1iXBedgGidCEIS+0VhrqeScSUNiHCeWWZfL/avX8qhqjpDGa+Ez+AEixFiJcuB8sUb23pnyz+7dKm+dzRzNw9VR1PaFnEsdSqpyOlR6V5BG8xID+SC/n+4kgNtyCHTIBnnoVChebXtwKlRb76QUDK4SPzxNI6Vk1mqJYUZD894zpmhOltJY+BDsg+sleKPLbY6SFG2KdV10aH5XeBM2uqmUs8k2bquFVrt52ZuNhc1EMPFUcjJqwzkOt7dM5uWjSlYc89bVJmNt5lwydSm4rtxvOgw+8XyeBVEYC6HSiOgyUnY0zOczD8ssu5Fx4u721v4m5Xcs6yqbZR+puRlFWQMyjOEwmmlg71Lbbgyoec0s6yKIcBiIYyLWzvPlTIhJ77s5LAWD7jRsdl5+U32bNYWArw1CYDlfeHp+5v5eKvxx2iuLxGCvZiy2YEPYL774gsPhyEcff8LmMPn4+EjvldvbW25ubv7SHcU0Tdzd3fP09EQ1P6/eHYebA73Iv2YcR9KQKDkzny86dDbhnhNcEcwCobSVKYki3Iw9FWMU/jwmUWKrGF+bsOzNq9fc3hV6bczzSoqBmJKIA0F6BxVgwYaf8fr3Nzo4wcDRmEjlcuZyOrHMZ6YxsZnkqpvoykXOmd4dLiY9L5tj9KZ3IscFVLA4x3EnuAzXTWAm+ErOzZ407CBUfvlnP+VHf/L/xcWGa8VcAKRid8Ex7gdeetItAlmHL7aHaq383b/zX+LTTz7Fh0irma++/oalFe7vb/jtH/wAeqDmmegih90eLDfe+w5BAk5FgUYN1X2kkxVsZJDWy+rQvkk0fvJP/hFvP/4B54vj9uaW+/ubqy2OcwHnPMPgzeabF/qug9Pzmfq2Xde4814wOlvxIWuOd+/eiwiz/zVcUeZnDJHcM3Tl32j+5cEH1pIZotb++fmZ87xwc3OUAj1qHSUfpE/zTt2HcyzLevWla1V0x2h6FO+cupLauLm94W/93t+ELolDafKDA4V8uTHhmqzyo0MDnsqLkq915Q8E59ntFErTwNo/gWa9NkpR4JCevAZBKoo7h8OR0+mZby4XxhC5ub01Fa6M4RovHj3eKTCnG2a/zBem3V4pUvZ9vWeoCopPXqZVzsnBdM2VkHRgVpQF0eiwFtIgZtRWFfj+skBKyZTeGFMihIPhis4WlKdQTQUtl1WCBqtrNY8eBMPMzwtff/UFH3z4kdmOeDDm0+V8odXK/tUrXXQ2hC+lkbcXFwKFznK+cD6fcNEzlYHd/kjujZ//7Ge8e//A3/i93+Xu9SvBQN0YW03RqBscELrjfDrJcG8a6OZr4xAFeBiSWFHouS8bPddgnMNux3G/w6fEWlagM89nxnF3ZXfQKqW8LELnPN5LJNW0oFA6cDdCkCqlDTYJzrGfJsRDl8Pqq/tXytfdBuF2IG8uscqa3mOgP/tp4u2rV3jT+VzL0s53T4J/6lfwgf1+z+VyYctHCWa3XJzsLRwSE6Y08tye6R2GYbjagKck2KYDCuqVBXQpin29rBeWvOKiRbvWTm/VMtU9rXuiH+ihX3+/NEpJa75Ucqm44jXktM8XY7TcaSOb2Ezx/uaGMQYOhxvZrwRBkq1VfEw2R3BXmNI7hzP32b6x95oGq2GI9CbXAZxjuYj+Oe32YgsBnYpHyvNf/uInnOcHXUi2Bi6XmbVkbo57UowE1ylGexXldRvsyvJ/OtzyB3/r93n/8MhlXnj79g1xiIL6KvwH/89/yOl0wkcVH4JGCniJYKkQJrvIW6EUCWcV3qS/2fqM6/53qPN+fPya0+kdh8Nn9N755a8+Z7ffsT8eoFY5LYsuwDKL5OCcI42Jjz95C07nRGud3XSQjqdkRdRa5/b2g3uGQe7Bl/MZb0FEJWd6jIS+hUd5vOsKQfIqOP0wsLP3Xey8bq0KOkQwofeOh4f3/Pif/IgPP/mETz/6WBYtQYP4lAZi0hC9LCvDODAMI3kRXByqGSE6rq4AzknPFi/rwuFwoKx1Wz/GP1DVGqLZRaOwb/np6BBtbhukwLo2/DZUqWqNdrsd65otPF7fd1UN2i9zTcHha1OO8jiODNPEsMV0OjQ4xhGGwFCTOhE72JyTbfhQFayillk4/GmVlP7Dt2+uBnfO1JJLln4jxmB+Q2rvSleIfLfWdckLvSwaMjWxdLz3luBX+Pmf/unVaiRGx26YWI3KdjzcMO32OPN6clGVdCMLsquV01y5i/qZ02Gvy43Gbn+Qk2iB+zdvGaeBcRSPe11mwn6vZVsLIUR2+x2xDjyfTrTWeDqfeT2NxCiJ/bLM0ntMYuqEKo8nbNE5PDk38npht99DyWKCeacNvxSGMXJzc6eLqVUOuz3RWZttkEWlmbpWgSbrurI/HuS/5KAHPechDsRBcbXSLvirc6oWqNZHzqKnfvTxxxwOB7rnWiQsy8JxumHLT/7LWnRscM/usDcYSxd6QYVDDFIgbwPV+1evqetqB4Hw5twbORd200g1d+IYoy45pIpOccAH5bO4IA1PphJdwDnLfMZxWVb24yD2HTD4wKbqra2p0iyiWoqyLD3RUitPz8/cHQ+klMRtb9UuMB3CtTa8K+A8Q3oBfbYBpcvF7PJNOQ3fQRY0E5vXVZ2mrRXFFGuPLeuFP/nRn6jbwMu0MmdqXdntI+M+ErxIIK6qc/C9k6l0A4PyuvL7v/fP8eu/9Ts8Pp15fHqi1spHH3zA+/cP/C/+V/9L/t3/y/8ZF5VFPwyiIffWab1yGPakAXXbesHkkhmiN7KI2fB3o1s46F0ISnSe5fLI/PzEb/7gIy7PFx6f39O7BKzd6RkUE9eVVhlNdR8c7HY7rV8XwYl96XH0YEy2ZsSaXC25t5MGXTprrZSS7UIXRX2DmjYkZwtXW6rmCqvN6MZJyZTBB+XqWKb6MO04n89Mu4lWGss6M447Njqvx8gmqHuJSQxM1y1/B0deF9ZamKbJCmTnucwXhnGUcKYWMxurlMtMnib246iX2TprLvioHN/BR0qWUrTWQveecr5ILNQksNnvdRDQYcnGIGqI3+xkFpZCoKyqMKJzpFFsE3pnydXMzTxDTfRe6I3rDKW1wDgMIrb1blSxIG5zEAtgLiuTbZAqVFd85ThYZkNmsLmL/NZ0+SU8YZq4zAvffvMN0zTx6v6eijqvYUiMceDnv/gZbz/8kP1ogitEVxtSYBcmzvMiKwzzaq/Wujs88+VsGorAEBLh9hbfISXBcjV0PvroLbnccTqdrwrZWi0TN2gAH0OCGLj1/ooti23T8a4RU2CeZ9JFxl0tOiIOnyItZ4Y48PzV13z7zTf85m/9gDiO0sT0zqvXb1iWmRgGPPLnyTRZgbh2rfaJUfnGG2PFtBl5WZH9d6SXSsuZtN9rhtmaZZm0a8hQrfVKbXXO8e279xyPB86nZ5zzvHr1mtYLz88L034US2ddr3bgf9GXDMyi/mMMLrkLdFwUFh08tCzDtOQDLQScOYB673j3/hv+9Gc/57d/57f1e6tol+C4PD1xOZ8Jd4HYZTsSGjjfIFdqhBQTy3nG5qH0qHUb8aIm2iGe4mDQh1x/Q1UKZMnqpKfdqH3XG4PlXbfacJ1rKFJt3To9U7jbM9jgUvoL+2br8h3mUtugeoleey90cyatIRBc5/Nf/IIv/+ynBO9Nndtktz9NtAli1EyK7qyDUMxxqwqqakQcgd/563+DNa+Mw8D3P/0ev/zlr/j7/8n/lf/w//UP+Sd/8ke4pA7u5nBDb1k72XV6y4SgIbYEvZ7SHEMP2us2Q6IJ+oxGqHBmjdMJ9Lbw9dc/Ibl/gfd15e7uXl2AreveZckevaj2Sik0CMsLOqqt4Kx/jingm5h9mjdF4v2dGHwdY3dVxhSIlh4nIeb2jlTEOOOn5FI4nWdizHgnlXyKKgh8CJR14dvHR24OB37zN35TxVqurK0yDhPeCW1wYBoRwdvrcoEYxWIckpFAZJXk7KKCTizrQjJubTVFtfx3AtP+cPUCcU6DomwK1x7UBcQkV8lhN12rHHHutficebJXo4hKBJQhDEyDqifvnFTP0eOMM9xzxyWHj45dsPxgOktrBP8d//wOiUTv2Wh1/TrE7r3y6vbmOrU3I2J6d+zHyZhN2M/WA/euyTLCVXzSQVJT5Hg8cjgexFH2Tu2tc7z68APCENkf9vJwaaLINhvGtyrBUx9Hcqtm0NVk4+08d5ZxXBuWFaIqvNnBuWUc9955fHpknydev35NK+JCpehxDVYqyXmG/cRoFWfpOsBpkJIVAeuCj06Ct9ZwVYw2oqyIC5U5Fw6DubkGMV9SGmTnoI8uYZ9p2Zz5efWqgXXOmehEAfZpIAxB0GHTZiO8RF/Ket5TesE3f8V8Ny8saRsUAPTu8Qu6udl+9NGHpCERDFMvJdPbqJ//l/gKMV7dZWOM19lSa41+jVfWenE2a7qsi9EeR8Zxx9sPPiD5QLAutRkUteYVgs25RrOgoajCpClz3WujllKY9sqh9t1RzP5iiEm0bN8Zg2YVZc2U1jU8tn0aQ1Qec/Uq3gx3b122DZspd2toLhVkkaHMgMbmtSWbhqIMCss/cED3jsnCo2S+J1g5xMQwen7xqx+zrGdiaNCg9YLrMEyRXKt1+0YY8Yjh16sC4qKwjY8//T5/9bd/l2Wt7KfIr371K/5n//P/KT/72U/Z7Q68fnNPXVc++ewTnt99y9NpsdteTMCcM7tph7taK6Muo2lTdWxmesUhX2ik3TW87/z0p/+Ed+++4u74Ac3Ler33zmleGEIyt+OqopjOYD9LiKvWf+uF2I2ZFzBhZTP4U1OZnIsMPp3DG+W9t2aW4oglucGtvZHXYnRmxZN6p0wTcNYNBv7088/55osv+P3f/31e3d9RW+OLr75mWWY+fPMWP430K9Qm/dRlvvDzzz/nMI68fv1aBJeuteUNqtRcOeN7VGC2YIvAbpgYQmI/Thx2E0PQ7VfNG184n6OshaVUllx4Op2kU8AxDKKIbVF7kl/Ua8UEjlwyyzLTqnQNtVbOq16874KXqlN7tKlMCdCT0VetWlcp5AneM/hExxNdZCmVECLTqGHiXAq/+vwLfvXLX/HtN+9ppXHJK5d5vf5OA3c5r6J4LiVzXlYb1jv2hx0e2SUEJ35yqxpi372647jb00oj2+DVd8/D4zOlNC45E23g9/T0yLv3Dyy5mMmbQR2lcF4XOXhiB2q352GLJjjP+4dHcJrflNpZcyV3Deadc5S18nSetQF6u34uHz2H2yO73Y5eu8E4ygDxHc7zyqtXr/nhb/4W+91Ey+XqVhlHYdfNLi8xAmR30O1Q3qzFjctA65ai5mVS4BoKcmpSHStESf9uCI4hJFzvLKbf2CiFKSVub+/Z7Xa8ff2aaZx4fHpkWReKfYZq3vrbaPQv9eUwhpCgvi3oSp2N2cdHT3BRlhsxWuANPD0/M6TEp598ImuSebG1rZnNtN8RXKCslfPzRXM7r2c1WO5J6Y04JPb7SWw8x5WSHW1GMQ4jydghrVTRS61i3mizGzxXStYzRYXG+XLi/fv3LHllNbx8+3yXy0Jel6s6vNpMovV+/e+DMXmGmBiPB8LmdKyXg6PzvDzys5/9ER3LdkBQXLPnm8yzCqSJkOW3IB4/Kp+mlMwf/sHf5u0HH4oJ1Br/m3/9f8vPf/mn3N3eMh4GzqcLb159yP/4v/8/YrfbmZDVnFC9+cH9ZwZRKtLqdUVsF0W1/SRzPmhdRIP59MCXn/+EOJqSGh3AsuAxhbvZsScvMkEumafTs0w4TTfhDSrMubHMmefnZzub3bUy972zLAuNFwtv+qYREjOrNiEorYvNF0JgnCbFyBrrSQmDjle3N7z96COL31W++nEvKHhZZkvBe3Hi1RyoctjvRLtOiWWeLWyrbZ6fRnToxJtpQk2XM6w2ST1rtEO6GDJbjGU33H4+X64D6t4bpUNErqbdNOmtd3xU4HwwBWeMAT/twTC5EGQgFn3U4NlEegHj7G6iOdQyxrj9/H79Pb0LMwzW9STD+Lde+uHhPe++/ZaQEq+jrClKrngvqKptFLO6+eV34cY4a8PFZsnIFrgWie/208QYB0AsBocWUKmd6I0QYHYPa5AW43hzyzKfVcm6QM4L337zjsfnJ3bTjrdvP1A3xsZ6EhOrucar1/fc1rZFHlOrxF+t6XOvtdGcjonSmsrJLpijO29DZAdNw8h1XTnsD8pqeHwC4KMP3qooAHYpEq0r8t6xrqsiFJtZqPTGEIbrJVFKwdlcqZd6rV16t03cZAMSYqA6J+GVk7tlCoGlrHjg+fmZx8cn3r59w83NrfjaZmt+YzkjGzyyBaO01swd+C97R7wMrGXXkQhV8NiyKCcC39GcuNF7Zbfb83w+k2smRQ35nPPUkslOFWsA9uNEsPWyUceTlyj0OnPpYqv58J1Iz9aI48SWXNdx1pV3i73V3DB4R3ONtmYLtOc6TK2lUGOkrIV3jw8spbDbTby6vbselusy45jwQcrvKQ2Kgw2By1worXJ7OIBT+BW2Btdl0bs1y/Jf/uwnfPH1L7mOgly9/rOz88Q72AJspLl2eq4GBw3DxO/+jT/UfCAE/p1/+//Ef/Tv/wOm/V7v9jJzOV34r/83/1v88Ld/h9dvPuDrr7/Y5BaaiZVMaYVhkvVH64XQnHQl4YW5aQ/+ei647axyncF1fvaT/5SPP/shz0tjvz8yjklBYq3ab1NXpFmBSBdTai8XlrlDFLPT36jUzlLqajVBpK8M3f6Obd6rg0xnr3cihhgbsodmKYLe/KD0Hmvv9Jz54O0HfPD2Azbb/s3y5+7ujnlZeffNN7x++4EubGu2xiHx+vaOEAPrfLmem3kVzRkjMfkQ8MEWGZ3rsJarOrCZG6Igh2g3aG2dOE3spz3Re/b7A0PwFrbSjX2jDxG9l4Npq/ynP/oRP/7pj8XXH0SXpIqJNAw2kEYQFvbQneFjvovSGpE6lNqhaMFvYmHlS+hvz7Wy1EwIkTdv3vIbP/gBv/7973P76hXjOHBzuOF4UI6z92ag16xydtHM6xZOlwvrWmm1M8aIi4KJDLiyxaKDVAFI2iJLFf+9dNlrJBeN/TAyjHu73JRdUR0MKYDn+tk351xVf7JZH4aRlJKxq7BFJ2ryMl9YlgvRbywJYY9byIwMAoU5+ihoIpkjJV3P7vT8zGVdyMZEWmvjcrqI1tstqN7cbl3jSqPVASc31Gw0QZ/in+syNq1KuQbC6B0pdyOK9QI4H0jTSBoGQtz8huqV4x+GiPfyAZO3vwgAl8vMZb68sJz+4lvCfMFkW3FjvkdaDzIerBuzLelZbQfBftxdleHjMOBM5LeJANVCqagZxwHfxbrzdsg4q9Q2qKfZhb6Wyrpm+/scOa+seSZGb4edKZSt+3NeAVcOsQxrFzxZgfF44Obujv0wKLb2SgF37PZ7clbnNMZBB7/97dM4sBsVZpOzPMZqLszzzFx0KW3C1T/6R/8JoM7asc0Iq8089J/GS3HZvvNynIPS4Dd/43f43q/9Opd54Sc/+RH/h3/r3wQXqLXzdDozTUf+pX/5v8o/97f/Lrl2fuM3fqhLxzI9tr1SWiNci0bILSsczF72i+vsS8dxzbjo4GLj55//mH/j3/hfc3p+Yr+byGumA5fLmT/76kvm5UJKkRS1px4fHyxvIhhVWL87WpG6zdhah+fTiVqL1leXqNWxxY46JvPC680cH7rwuY3c4Id07QitJREbrcn9dllXcyGocj8wIkWMge4c6zLrPRhhIsZEGAeenk/88Y9+zLvHB0vIS/Ln6p1oM8FICBLEqDRlzrK/AGt/eqf371g/e8/Om6y/miMhLxhy95C6Y62dx4dHwt09u/3E4CPrMjNE+bjk1R5YisKZLbwjhGBRkWLLeDCGhzoGb6sgRCG8KUrsU7ra7YA2Tu1bqlRnPwzsp4Gcq1VoQC/03MneQVfk41oLQ4iWK21VYIxSwIbAgOi3+I4PE42tg1IGtARgidwKy/nEWgo756nOX6uqbkNpB/RWScHz5u4V9f7VdSNtg6xqrKFW9JniFgZkdg2tFrzfcdgnyjbsR74+IQR8lKOkNArYBd4ISWljBP3dtVS8MUJ6t8MzONbTidP5xD2vGVNg7UoOdHL9oDtHbnqPQrUCy3wSnz5Fub56rmrm4DytydAxjsmMBlVRhxBk3Jdn9uOOu1d3Sjekc35+AiqvX7/CdSfvLK9ktFwaoRQG5OfU9u2ahvYXffkom+QtwKgUkTZy8JTV4bwd+lV0h4y6Itc7D0/P3OxlXb4fZTuzlkwxn6nmJNh03eOoVzWtB8tz39hbK8tZzLOjMdaqHQJxTLo81oXog3kidLbcFxAlVv9LMyjQU7vo3rvDjoCXcGw7Ir1cdcMwXUVhmifV62WeUpRjQGu6xAdROYeqXGbXG+/efcnPfvFPcE7eAM45ejHEwTXolv1hRZDgDgc2kKcBxfFX/tpfIzjPN4+P/B//7X+Lr7/8hmEYcb3yL/wL/yL/yr/y3+HDDz/gsqyMrvP6ww8IPtJY1N6rtGC9LJRpEFUdzSSUCLl1AC+zLh3cWidbVe6dZ7mc+X//o3/AF+8W/rX/4f+E/XggpUAaBtypyVTyqHvm+fmJP/nRj9jtdvyV3/4tahBeuBWctXXzexNFu9VGM5PE0lVQ4UQV762DExpSLX44RQUozWvGu84QAvNlZjGx5xYfjEMOxnZZhOA5Hm919jnwK2Bz4H3Y0xtWLKp7vzke+OjDt9ze3FyLyRgjRHmmOQexGX3Lt866VqI3O4QsClkuOmhjDKy9apO44frAQ4qikzZhfqF3fErk+Yl3337D8ebA0AdSjPzu7/4N/n+U/WevZlmanoldy233uuMiIiNNZflmu2E3m5whNCMBkjDzQRhpBEEC9Aso6Pfpm0aABkM2yTZT7ck2VZVZJjP8iWNes/deTh+eZ7+RBQjo6kOwG50m8pz37L3WY+77un3rcUViTcWqbjA6AjKlaoxf+VDdU8/Lr1KKeiBgSgVjKkGt59VaJbUUgvXYYEhZbuL9OOEwtH0raIG64BzE53CYJCMjl4JbbTAUWi8ZCdM4SvKcKkgCllOM4l4MgZIjM4bONlotV4K37LY7OTCQZWTJGWMKbW1w2mnNKVGotH1Lg5Gc5CoKK+M/pHRZb8+ft3eOw3gCYxlW6/NLYn2g6j4jzhNTFQnqNE08ffIEFxwuOEpaZscC/ksxyjx1GLjRQyJX0Zys+g4fGhpnmJNouhvvBfWuVa1ZvlfNkBhWazFexkxxmdZ9MOUZZwlOOtTGBKwpgiJGqmrnHL3rxRiUK9EUXCm0vfwuxnFSTpM7K6BC2wqOJWWa5p+wk0AURo0PZ+lq4zzZeZHYNoILSXkk5UKwwu7ph4GCYWfk/17CgQwie8XqOKAuiANhLZELphTyr1wQUV5wa/CNl0LImfOIylsvij/Q5ssq8wnI5Yzfh0w1DqsOOlEaStdTNDzqcDoxNA22aQT01rVSiOn3IfBK6faEBCvdkSlGx3sz6MHrGs+XX/xn9vs7fBAOGtrxogfN8i3rOF6/quSUYKjVstlueP7sY06nI7UWHh725AyN7/m//d//r/y3/+1/R4qR0zhx2D+yB9b9mtA2xNNJ1GIVjIO5qKhW8+OX3Zj9lfnjh04DRd8vC2WMI1RYhZ7/+G//Hb/9W/+c/+P/6X/g8f6Rvmvpnj+Xn1/HSU0IfPzRRzRtI1DAKhch2kE5nbrIPsGy2WwoOUv+RhaGWcrp3FEa9UnYoiO6UqkFOk1OzLlinCMY6VJLqvpMWmKVSUOvWBvnRIlqjaPvVyLDV9P0uUiWu4MmtHzyyaeUXCSdDynGD48jx/HIqhvw45zoGgne6axYyLM6qxftelSZa9V5t8zM5cWXw95gnMzcspFfS9MEdhc7oSXmQi5F3NDIGCPVTKuz7loKSk/XrGYZbVErNRed29XzKCc4T66ZWi2nNHM6HNmsVrL1r5VY4tno5ZxnPN5TK/SduInlKFeFlBH2yuDl5e8aiWE1wdDVDmsdznuBraXMqUTGeSYoLM2HBof54CgvlWIE8LfMzIMR41KqH1Di1VSSkcW3z+rCrpmaZCRTjQTZ+BAwrqgCRUiTj8cDcZz4+LPPyLEA0mVUKzJeHxqsNcQ5crHbYa0jTkn2Q7nIqMgHusFxPBxk5mwlQGmaJlDpZSnqGzANbePpwyA6+CzZEXmK6uVQ6ByGTllZIUgHmIs45k/TxDxGttsdXePIFVHKmQ9O5qWSLbUwNINgMYrsOOZ5JseZ5CxZO7vQted5finSjf5KmM0/9mUQ9ZY154NN5rkygpryiHEWq3+2KNAEpU4jiA2W3ycQS5EcYu0GD4eR3XqHBcY0qb8GfY7BF4NpAm3TSP4IIg4wRnESVQ6LKUXSnFmvexlrAFMVHIc3jsM8sgQ32SrqMW8EoV1Txuhi0hkUv4KqwCSi9ZtST9khLReciExsXjwFXjv/yI+/+DG2ihMbvRSlAFmuh+WGWE7lDwcTRXZm3/vBd/n2t76Lt56r7YUe7oZ/8//4N/zr/9W/ZhxHplkWr6v1mlIqNzdPGfqB9+MjVjljC2q85ATB62L9w/jLucCCyVi6ivNYsFb9XxK2Y72l6Vq+/PKnTLMwtCR6oDKnhEnSafXDwKeffnp20C/LfoPEPS8iO/G7LMvixMJ5K7WqKk/ou9UI8rvWqt4OhSBqXnwpmXmWnZCzjmJlKb8YaUF+t7UWUlTXfhays6lQcpRzDIkodcaQUyQ7h8dRqkBSrTGM4yxGypTpugbbtg3OepbnfYqL0kh+kTln4aM4K+Yza7+h5JAfJuXKFJPozq1V5QxcXd9wOp0kpF0vF5BDo3Ee1DB0nGZev3rFNMXz7mMJVAHBUMy5UqJ8LAVxe3tjmMeRn/zkp9w/PlCr6MljTKQaEbRuZbfZcX15eaYtFsoZJZxzwRkdgcVZuiJrsBXGSV6+NWNLKQABAABJREFUoW3xPohSy8hCqlfDn1M65LL8l73csjRfgkukuvDGnh8OU4Q3I39u5TDP1GqwQfTy+/2B4/GId/K9+GpIk1Abby5vePLkmQTUO4+znuk4nf0KQ9/p/FE6j1/+/Gf8/Oc/4/HuTi7+NmC9LK+2lztcaHj5+jUvX71iAaHlFDHeUnJmihMvXr1iP44450hG1DXGafVpFzhZ4XA8iotbVS3jPMrFHoIYF7PEqJpa2e8fmOMEZQFF6iGvL8uCsBYnslcPQyFnGXUtKWalyss2j9PZjPTrfrVNy9D1eqZ9mPeel+6IKicX6eqyVpIxy4I36/cOsF6tCF78L0Mr2OY0Tzwe9uI/0J/bV4OvhhgTp5MYl+I4iXomy8GQdGQktNmZGCcWwKF0GZpeqCbCEIL8mRoRWxVt7zTtcbvZEryMXJclf9EdRoXzDuY8S9eLwmlim4hYBDnx5vY1t29+ifcZZ2S5egau6hu2XBKmLmeFkJStKu0qjj/4g3/Nbrej1soUZ776xVf8H/77/57/5r/5r8kxYqg0vhXys3U0IXB584TVZisXlPvGRQTM08yvCF1rFQNkFnuwHLb1fGfVb3y3y1+LMeGd4eXrV8zjUcavzpOSKJIq5ZwbEXVhnpWcMM2zjLSl1WOaTpyOB1k2q/zbGqvBRJyVdTjtIqyoJsFwOh5k56EjzFILQ78ieBlB1pyJ88zpdBRhyaKM0vOylErSqYoc07oLKxWjXXjOmWkaOZ0O7B/2vHv3lnmeWQ89282GJ88/knAwi9xw1sq81VvoQit5CGfppTk/cCAVruSuSoh4ofL4uJcZmTPc391z9/4Waw0X2y2rvsdUWcylORHHqAeBVDM5Zd68fcv+uD8/oGfFR60K2rMYLw5SsrTUp3lm1Q/88IffY71ZkZPkOpxOJ5ogWQm1JooR443xTjqQJDGU6AvWhIZUDc5KUEdO4h04no7M8ywLyVqZ00TrPOt+EDdtaLDOM+XKlGRUNEU5IL23SE6SPBxGPz/vHRkJV4o6n21DI6HzRtzE3tvzbDBnlTsuDllVAg1tiykyoqsxs398ZDwccUVekyYENqsVxgdizbx6+YKf/uQLkeQBNUul75yj61quLi/46PlzhvUKUw2zzs83w0DfdnjfUKlMSWTDS063MeJlMcYITqQL4gvJkXGceP3qBafphCmIgsYICXdOidZLUl5KEVMKZBmNWDw1y14mhEaCe04TcY6Uamn6lhBaDocTUY10i6Jjke392l9G5vpt29J3PcNqOOvEvXfSJSU5FIwXs5pU5bKYTimpxFuzrMOiqS+s+xUELyNcUYmoWkhVgrnoQl5AmtXKpWCUKpqRIqpfDcJaMvrf04PZWysdiNNISmslT74WGZ/GBNWIqirJ95c0UyUo9jw4rwIAznN74LwXbPRAG8eZ4zThPfzDj/+a/ekeYyGZKmrBms6XwyJyQA/f5ddhDBjnqMlyfXHFD3/4m8xzIubCj/7sz/A28H/5H/7PzKcjc0yyJ0wzx8NeLqsqDudnT59L91a0+kLcw+MUhalml78ue7apStLg2edRyocFsNFIZGScPU4TVHj9+mtevXnD4XhgHKezRNpgmVRltkAesZa0LOcVwyEzJ4NVy0CtyleC88WMkS5lPAolwSDdjDGV0zTKs2Ila7oJLT5IIZaNBBfJriPLOaCEjJIzh4c9r16/ZP+wl7PHKPbFoDtJWSr+7Be/4KuvvmaaIqvNmtVK+WdBnt/xcBIhkSQsyaFF1dCTKi1u37bU+oGfI4A6WcRap2qVkulCYHhyI0vG46RhNQFbJR0upcSc03nz7pqGVWh0XCW8oI8/+YS+Uy+Cum+XEYsQJaUKzwXarqVtmzPrp2l2xJgEyFdhGNbYari9f6ALDav1IIHzKVNUFVMS8jM7mY9672mcoKJjLXhnubm8IQSn7aOhDWrqy3B7+w7fNvTrAes9IJVYRsRgRZoKjtMIxrBaCRr88XDk/u6WeRrp+jVPrq4+APBQvId1XGy38lkXkdBihLiZDSIz1hGH8yICkCCmhoKAv4wJ4mSvhe9/9/tc764pKuPMOopj2fOUxOk00g29zKeRnzFnWWR7LE+uLynOSoXnHDlmghduzuHxIAXD0EPJPOwP7A8HVsPA0PWUkskkcetbR/CBmEe6phEJss5JFx16NcIe6sJKFUAZMx2ZponQ9HjvefPmHSVlNt/7nJTS2Qg3nmRvsShL/rGvRUUmi34nXWiRttognVhOSbwxwGGeOB6PXF1dSEWcsvgT9PdWkIN8aUVaH4itLFC9bSiaXphypgkenOZfW3WtKxKjqK695oJxRrAwQDSVHCOtb3ChIedIsJ6cE1mEaqSSdVdi9FKOGBckSMY0HE8n3v3yPf2q58nu4tyxex8o6UOqo9H5t7eO3XZLionXb1/wt3//l1gP2ZYzirvUqgt38yufrzHq9dG+zFrDTOJ7P/hNLi+vOR4m5sMj/+Hf/zH/z3/zb7i8vJTYXr1lfvGLr3h8eOAP/sXvi7jBN3zy6af82Z8gKgrNxzVWR44p4nzg7AtIlXiaaFeNXrxZ9xQZg/yMsriWzrSmRDaGtulY9S1v3ryh8Q1t1xK8ZY4z43ii2V2ecTyNFnHtMDCNIzkXGi+GSEGcCIallkqxRrxhRi4FUyXLZZzkuS3zTHU9V1c3SoC155FVSXK5WCzWWdrtVooiw68If9q24f7+Tvw9N9d6Gcr32oaWQmU8Ttzf3mKdnDXGbOi7lmmeOO33pCxJmAbwRR8o2TOIounheOC0P+K2VoJWdLaezy+UFXmWBUrlFCO9s5hSuX3zks3ukpsnT+QDz1niTkODa4RtElpZ3pZcOJxOhMbz5PqaOScxmakscAntqOoyddbimwaj38fyEghSWWeq1uKt4Rc//wVv3r7hanfB59/+rqhYKOcqzTnHmAQaGAKCVfCO4A02i6rKBlGkLCqXYsCUql1MZN4/8q3VIAd1lIETOXKaIoPz8uB+Y/aIsbx985oXL14C8K3PV3RDLy9mks5qUTdVNdF4JyyslNS0OCeG9cBmvdYW1soc1kmU45KtUVNiSolRUcub7QaMoemCjNiwYm4qMgbb7S6kPZ+msxvXOU+ME6cY2fgNwbfKApK3X+JrLY+Pe37+85/x7c+/zWa7pVa4vroitA0LPjn4RruCiZO28V3XLsJXnLEMQ38e86SUyIwSu2mR/JJcyGmkVnEA/+Ll1+wuL3jy5IpxPOKslSzmNEiwxa/xZYyRsVBK7FU54maRwHrrKN7hkjwHU8o467i4uEAQ41VS6oxo5quBlObz3gvtLMbxyP4wMvQt6MVf9F2rhnPrHxTUVtQI8+71G+4e7littnz09AmN685+lJRlrDSeJlGrOSd52dZiqqENve7e8nn+fAIlh6q4YRxpQ8vQ98Sc8AR8K2j7mCWLYZ5HVpsNuRhinvjbv/0RD/evwEzUkrEusOQ9LxfE+eBFcp6FXlzOC31H4Pd/719KsWIqLx/e8/t/8Ht89/vf4/bhTkCKWulvdhtxvxswGPKceXL9Ea4N5CgBW8tOggpzKnRVoH65ysUt+8KMN5J1bbQjWL5lU8EZRyWB87S28vHTGy4vLrG25fb2jlQrq9WK8XDg9u6e1WZLjTPWaBiYjrIrUlzNiyncyIQm5cTheCAET9v3eCv0itCv6I2Y56hIrHKpOK9eiXkE70hZ9sXeiez7m2M2W/WCM6J6a7uWSwWKllKYponX796Q58RHH32EdZ71dsO//C//SznT54miuSU5S2fYhUDX9qSc8DEnQmipGkxhgqVxgdQGTjmy7RplFotXIWuLZpaqwULnBdMbWs84RV7/9KfsLraYogYga/HeqSbYMo8zKHpgPfSMMZ61/w5ZJi5u7UWWaqxqz61I9jCqE89ZmPlVTC/FGWqSuL+LiwtSLrx7f8fHHz0jlQQZkpFfaAiemGR8lWqVitwvUl9RPcy5EqyQZeM84kOLx3Fzc8PxeODh4UGS9XTWH2o4V8UmGFZ9L0EhOatGfcVuc0nbBZ5dP2U8zjjANY5cxPFojSHlzMPxwKrr6bqGisd5L4e0UxdukTwCq4ocSqGo5NRh6UJzjvbs+06ot0rPrWSMERlsRWbzeY7U2opRzMkF3HQtx/3+3CobY0mzjLdWa7nkLq8vORwPQMU3jk27kapYncpxihyzGHa8ehPWq0GNZPoiUc/Lfvm/xfVekO7Wgo6ZGkwxXF5uyeVjxvFETFFiNJuGXAp3Dw9c2C1N84/HmhpjaJpGO4pC07YMtQiG3KiXITjKVDAaeO+DV7WaJThRAhojJsuUPpiuZGwFPrS0reRBON0VVFU5WW/Z3z/wxZc/4/PPv8WVVn6mwHqzI6XC/vDAu3eWi+srSkq0fQex8HA6QimEdqVjAQfVcDzJDrANUglaK0jqFCcILcMwcLFeC9bfO8Zx4u7+gVolN8VrwNjDfs/D3R2hHzieIq9f/Yw/+5s/pZQZF2SEUkumFMOylDgDXlk8Cl6FEfLPx2TYXV5zc3XD8SSjy+9863O+9dknvL1/R+MaQtOQovy9J9dPuLm6kWhPD6YaPvv4E4Z+xX3eiwpWP2/vgJT1ktY43rO66ay1Ekd9NSiyWv+aJdfKZjXw6efP+eIXP+Wv//ov+d3f+X2MkfCr4D3NxY5B4Zun45Hj6YR3WzC6sLYGQyDOk7ynzkkUr4GhE8NizUlyqudZ3qfgabzXsKiiJjnthBrxCn391S95/fYdv/vbvyXcN4fuE0baJtB2PQZ3ljsPqxU5J46Hgzzbc2J/PPLzr74ipcj1xSUfPf8IXyrZWFKWdMPxdOTy8hIfgmZyJ3zOlZrn84Mxp5kaDJ0d5KCzTsYd1ipQyoKVyooCU4znyM1qLR9/9hnxpz9hHiNNIyEZRpeRFhmTnKYZ33Y8nPY0TcAZIBd8CExWgturHuJOzWtt05BSOcu4UpLvpebMnLOoeqxlHmVRur285GloyYgqYxxnqhEH+NJen9HlWMgSquIQ7XgqEjEZgizrnClY24vGO8mhZqzhl199RYqRZx89Y2d3GKzA4XQbdooTVauNUgq73ZaLyyse7u64u7+j6VqcsXRWzDLTNAqVtxSJocyZOfes+47NZo3f6tgtRTHXVENTZa7tvQgQcgTfyFIs5aQBT5ZTlIdQEOJ8WNKWSrFFsRGeEjPWyMWPkfyFZXzjncAFT6cD291OzYeW73z726SSFD0czkC1koSAWpMYEptVi/MyfonzeM7ktVUQ0LVUvAv0vQTdLP6FYbWi1cTCUgouO55e3VCtdKSn08R2k0TiV+v5Iv11vmoVoNpuu5U9VBJY4H6/5/B4oNZC1zbgPG9v38m4s5EdTUF2R8sObWGdOS/y7lrEyVraRkaiup+ySfwPnelYr9caDevPIyacFF2ffPKcx/2WN2/fkN68pe9aSoyyu6hFfzfy3yxUKJXQOnKcycZKYVESaYqaVSGeilFHlMse5eryUh3IorhzTnwbXSeYne1QeZEOHB7f4xSPY9AsmlKISR3VVVDXYpkUdM5CTTPWUVLhN37zt1ntLimpkHLGB0l8u7q44Az0tpYSI0ZHj+cdJZV+u6EdVtgHMaAKAl38JTHls/N+uSBSLviS8VaqcFMzxVhcReX1UpRUZ4hlptbEeuj48z/7E37vn/8LhSV2OOexTiStj/ePTJNIc4fVir7vzzuCKSVMELPcdDpB24oqTjuO43GkayvjONH33XlcVYsUgIV6Hp8uz+cYE/3QYbwwp0iyUDfG8NVXL/j4k+e0Tbc80Nze3TEejtzcXBF8YLfbEdSwl7P4LKSoSRivmT/WsLu4+CCucQ7nLL4LQaIAFb2RZgnssRXG/YncDXLZ6hI7IyoPjFH0tvxac87UaeJis6H5/g/lMK2FoNgDgz783rJdrbDG8OMf/4RpHvn+D3/I0HlSEf4TTsYl1fhzUp7EjmpgeFocpvILifMs88Ym8P7uXqrRlPDXVxK40jVS8dR6Tspbgudz1qU8Fdv1jKcTtULftsSaCEl02FhD0BXXIY0cjycuLi/49JNPgSI4E9kjnl3kc5aFfq0F3+6Yc5RZX9fTdh2Pj49sm61I2krCVUvX9dIitxZjduQUdRSIjJDUn1CyjHEc4ryuSJqdc1Y8G9YyTzOn6YBZrZFfYdZvUKo9bzhTPZe5ekmZu/d34kq/2BGso+laOfRLxngh2z558ozQir/AWEueZ9AZ/tItzKP4SfqhxzYBV+X3FlzDFGce7x9Yr9ZsNhtiynh1v9fqzyMX77WLrIsJsgKieErVUWf5uZrGcjwcaNtOOohcF8XjP/plvvHfcTree/fuHeNxYhz3IlENXg58NTSiuRql6DinVr1IBWpnjaj8fPDk/AFV45BxU8wSEZoaYQRdXd1IAmGpPB7FOZ9SJDethBbFxCnNOGPx3hJcIGngrUlSkUqhEAh4Xrx5x267Y7PbCEzPSW7xYTyyCh2hkWJojvGcxmeM5EDEGNkMgyoMlXrgIn/7d3+GsRGvShqrVfhUixaCqixaVJzfWFgvv7ph2PJf/av/NevhgsPxJL9j50hJqm2qkcCknOUZqJCizOatE5GN84GL3SVv3vxSPm/95xDvr8h1raQ8Lgq1nDPVLaNzJBnP6/drjFwMbUPbGPb7Wy43F/z93/4NX//i56wubnC5kvJMqJ5RY0JrKaxWa3Gs66K/loItBecDzlmmOjJNI8OwUrFOVluBoF2ck0yIWgEnSHOD4P3THGnUBPzJs6e0/aBLcPE0LNnvP/7JP3D38MBv/OD7dL1Qt4e2ZdV1soNUU64x8PHzT+Qy0zGwMUYYT1bIwouy0KsjHGOxNoh1WxhDGV+h94HOOa6vLvFWliRGW2fHB28DQBOW7X09B+q0rTo5s2iLHx/3nEax9JtSNWUuc/P0BqwlKq/ealVmMcxzIlexod8/7nn//j2pFknqclY1vzJr9c6x22xI08T93R1vXr8CJFKzbzsWg5hDyZsL4K4WwfUGGeXUXPBBKkRDlTmljv+Kvkwow+jh/p5SKrvLHRe7nQTXG5kjplpFUVULgypxFhqrzKAnulXH9fWFVMokQtfQb3uaxvN4PHA8HfDe0K17+qEnlUysVSSMLEYqg/cGnMDqUplJaZZQFgq4ShPas2Kl69qzUg1gnhOHxz3H0yi7JrQDsvL5mlIZo7Bg5BriGxGtAhOUP2c+q3v6phHsQFUKqRUJpgQtJc06F+nwZreh6RtO80iuiVIXV7gYOEUkUrAWpbyqP0NhfsE5qikcDgfAM8aZ0+l07j5+nQsCPdTapqVTKWxW/tR63XNzc8PV1TU5Feacuby4YL0WOjJFdSp6uTn3wR+wuN9TTPL9mnp+wRcj5rAWPlExlb4VJPjhcKIsZk3f4JDl97e/9S0++/hbXO8EJtmGRokERj8zicoVIUJm6DtCq/DIxWHrAxbJ2nbOgVXsd5YC4HQaGU9HVl13RsJInoHjZz//Ma9f/hK/pFHq/8wxS1zteUYut4NRR/559IanZHj28Wd8/MnnTFPGOWgaf1b9GSMeB+eUaZWEwzTnyGk8UvKy/LZcXl5jkkJAjaJsinzuOUWcMfqeiGR++b3IFEG9Ilm5bKYK1ToYrq8vmE8nGiCdTvzhH/1bVkOjcnAZt59OB6qBq8srdtudFptJD98qaqcsxXbTdQzDmqYRUUxWFE3TBJquw3/jz7WqTCs10zTtByGJtbi2JSVFb1A/5JI7y0fPnn9IRNSANescTd/p52PYrjc8e/pMTzaoVuTSy9ienDmejjJOVbFRqvKzeFM1c0DNNWlO+CDmOnJmGidsGzDWMsVMTBNt24nCq6ISK/MBiaFtjLTA4q40XlAXtUh2QM6ZX774mhwj3/78c7a73XkEVGrl9du3xBh5+vQJ3si/l3NijLNIPxE3onGWzWotCF3V6l9fXbJarej6XrwYephl9WRURLIZY6ZdlDajmNe6rsMaw32cmUuSF7cILjdjCCox3K5WNKGhaeTDlMWdLow1cMiZgLVyIzeNuMJd8PhSzgdgLnA4PDCNJzKVz771CdXA3f0tfdefjYgSgpNxzogBLUPjghqtdF9kJWAEIJRA0zTISDScw4McXqSFWQ7hFCNvXr/mydOnDLZnnEbiPHF9c6WKJFFUWHXtFuDh8YFaK8MwENqGeZ65v31PBbYXO2rjVQdu2PaiToo5CxCywjSO+KdCG45O2+k8Y5oG487rxA9yzep+5dmw+nIYBLznnGO1Gsh5plYJ3pmmkRAcbe3O/+4/9mWdpW0blcM2bNdrEVW4pVOT8ZDOJgiN5+FwoG3FsX04nCTFcWFlIfG78zxzPBxlPq7PqHMirV3+mima8mcMp9OeYbXW7GYZ8B9OI10TqBbGNNPYRl3i+l4Zg6kC43NG8OFusyHqpex09OaMk0MzS9jNIkYRb0QQZzmN7GJUTegsnOYj/8uf/RGpTpp7oBiQKpklRlaE+vcAHBIWkKnGS8dhKqlY/ovf+n2c7Znm0/k9MLaSouA9pAMR5tXSGcRpIqeKbzSYzHkuthfgG6jTuQgyRkZMoqIURY9RW3rBClK9Lqq+RMnCF/tgtyhcbje8e7fn4XFPt9nwox/9Kf/7/91/R9tv1JtjWK/XXGy2xDkSYyKejvSapBmL7ENTiszTSGhF3p5SZh5HWaI7w2F/1DPDsNps6EIglypVvxOydZpncir41hOniXmONEEyfNq+o1pH27b8s9/+TfI807SdGJ+RcycYR1J+VdJur8wzPsgO8xzAlCuH45HtZiPZ21l+BpQObGupKsszpJgEU6tV336aGReEt7UC5XOC2GidZ86FedYsWGe/8c8FXVZLhb7qW1n2qRyuWtFL3z084NpGM6xlsfT+/p75dKLvOq16DcNqhTGG8bBnPBwIBihZQoGCZAHknNlttjy7ecJus8FZx6x00DlLvkE1MOcMWTKDi+qGS0mMGl5fa8H4QLDh/Es01khuQa26uHRs1oMspKK4pH21eGFCCwpZL8+l63JOKmpzDqYXN7i1ENPEfv/AdJpwxnFzfcP24kIuxv1RxkhWJLIBJ//Pe2xw0m10coBIDvISMaoxqVNciiiqhbZvdO4tFfCTp09Zr9ekLOMi1zSMx/Gcg933HUEvW6nWZF4Zo3QP43FkPJ047B+Zx5l0DnMRiBlqimwbCQdyznIcT8xVEtpKyTI/No6YMlETwGqR/Ib9/kEOP52bmuWCzfLcees0DEbkfyklUVCdTmfvxD/6pWfbstfpuo6m6yhlloUpmheRMvM08erVS+5vb7m6vKTvV5rE6BV0Z/WjqudnBycmVECQMxi9IAw5xvO3Idyd9dmgab3nMI7c3r1nXrDu1oKTl9t4x/54xFrH4XDg9at3HA4jsSR517wSFHLSTPgoRiwrO7dYqnZv0nm1Tct63alIxGM0x+InP/lrXrz4CT5UjPH6nIsKJmdRClktIxYkuJjXnEpZ5TJa9Wu+891/Rp5HClHMukopmONIySOlZqZ5ppRM18gOIYQgh+g0EZVE/PHzj8WrpDsMIbDK8nlx+hvF35RqzmpJlNYsV1iGmvQRkA7It4Wb6zV3h0fiHLl9+4o//fM/wmQ5TE3RPD29bJpGgp1STqRcmI5H5mkSNWfbaGEqoohhLaOpNrTsdltqSdw9PBBHuTCjdu0WMQG7EPBe1GxB/TYVlO8kIykKBBfo+xUPD498+eUXvPjqa+ZpYsqJ0+kksnVdQqf0AZ2SshQRKQvRuut78d1YzcR2cs544x2tc9RiEBaSOfNcToc9m8327JHouh7fZOocGVPieDxKJdR6grFUJyyfEpPST2XUcTpOYKpor61UKJ998glPnzzBesfD4x5nBUtwf3fLxeU115eX7I8n2uAZ2lYWLaUwn0ahwBqIJksspLEEa3UxU3k8HgXO1XiV2k6McWS1Gmgaz5wyjZWAI5AOwoWgudmw7gcqkaQgvTGKYartWkiVU5w57A9stAIIyIdu4JyAV2olW6g6W616+LWhkTZYO+B+WLHZrilFZZ41a6CPk4O8k0O2cTLCM04ugJKzPjhSLZhiBFseAgUoWbqtWDKuql2oVMZRXsAlKyB0w9mh6YLDG08p+TxKAjHoWJxmO2y1lZYLousazM0N3jr6rgNjmOJMY2V0gFkcwpbry0ve39/z93//D/zO7/wWE4b9/QPDMOC959WLV6w2a7rmRqoZ43gc90yTCANKlSVpUmNY08iFezpONL3ItMZxFECdjr/+SV+lqvfGa+HSUlPkcNjjjWOz2ZBrZbfbKaMf4iQ54F0nh2vRkcOyTO27DlsNp1kko7PmU0sHIfyoolLkAvRtJxeSkdlwN3QyJgyeHCPWONnNlYS3HksVr0TwbNZCd7WjjDmgyvzQySFqJIiFBSMRglyuZ6yEA4yX8UsByDw+3vGjH/0h1qr60EouCqCGOZWnCYVI/zxVeNUPfy0n+OzTz9iuVoxxogmBaNJ5Z9A1PXNZls5SRC2fY9O0mGCZS8TOE/Oc6NarM8blw6xLZbZ5UVuJpNwVQ8mQbSU5YR65KmpCWwNGDahYQYJf7lrevoW729fUavnRf/hj/uB3/yWbiyfMkwh1cs26l82yszFyBqzWK4lGsEJ7rUhhJd2tx1oR+bRNw263pes6QtexYOHjPOOtjGetd8IKKwVnPW7tefP6NW3Xy+h1nqlNQ1KBi3eWy6sr2Qt6T9Yu0luL8w0ln6RDQDq0h4cH3rx+Q62VzWbN1fUV/bBizhJ2ZICmaVkYGxiFlUlQiRiqutWKtm149eYNr9+8wSAYhP00UQqsdxsuLi/k8KqV02HkNE48Pj5yOByx6keIJfH29pbjNBJz4u72juPpJK1YCOdftms8Hz3/hIuNOP/aVtOwjMG7wKpd0ba9PAhGeEegjkljKCmxPx548/IVpxQxOB5PRxonS0dj0Jvc65xUUtT2pxPzPOtuRC7L/XEkzRFjDI8PD9w/PMgLjASPD30vYwNdj+VlsWrU8ZoTOc76vSqosAoSZHkpoSjWG5quAWS2PMWs5FTHqusEkFcEEuiMElOtjCGiVqJN20jWwSxmofqNF22MSYMVZbafU9bvC0pZxk/mDHUrSQ9LY4k5cnf/QNL/TghBHZuQla0UnMU30tlUnUejy/U4z/LMHA4Ka4RPP37Oql9hqwDzhtUKi8ylp+PIPMez/ny7uaAdOqFcTiN3t3dnFLL4JipNH/BWLrdlIQdStf9Tvrqhp21bQUdYK8hs73j3/j37gzjV53ni8vKS68sdSbk6ORdK+kY3ihjqBMFgddxRCKGlC80HBLyGONVUSFEMgVHn6DI6kYPHKX+iKKkYqiiDSiK0vXLVDKGVEahB/BpimtRuDVGvZcR0VapAEWedeYMgKUaVQQppOPK3//l/4f37XxBsxlb1yCCu8ZyiXEJGzKPZLDN+qzL5hUCbIcFv//Pfx3cdlYoLFq9xrTllppzkUjFIJEGVQscaPaKsCDe6bpALe9gxDHIWfDBKoOcFiuJYLo6iSp56joaFD7G5S/iViHAK1sPz59d4G0nzyM+//BlffvljgoVcE6dJOVxO3uvFwS2ZMlafxUI8e9DqeXmfa1E1pjwPUKkp4ayhbTv69QrrHftxZK8jKWMcs6Ldry4vWa16SVVcZLM6qWiahouLC3a7C1wTxOVvrY4xj4xTFJ+ZtVIYGhmdb9drYsxMc/rgZTGG0LRkwJaczyRCCfBIjMcjY8oMfU8qhf3jo6ggVIvdaRtUaz0z9B9HGTk4Z9lPI/ePD0yK7G7awHq1whjLOI68evOa93f31CoyTzmQxOiy6nucC1ANwQaME7NME5oPjHRFHzRNoHENVfpw9uPMPCX61ZrgLPM8UbJgDLqh18Q8eZAf9nseHh85zTOxJLKpJJMV8TCT4nwGYe0uLlmvVtRSJKAl6CWBmHecEUv80h6kmPnlL37OF198STWyYLXWYry05TUVKIJWMAYd8Ul34Y2og8BSi7TJy2F3rpxqZZwj4zjKIaIqhVzEz5FigWzwXt3MVZzuNWWGfmC7XuOdpTGOrFC1xnmIMsLLSaqIFCMlyiIwJpEml5J1dCLmt5oqb96+4+H9HfNplDjPEMg58bh/5OtXr/jiyy/kInOe7cWO588/wWFZrdYYZzkejwTvefrkGRfbjXQEaWY8HLHOsFmtMdZye3/H2/s7ccfq/qskicsc55HT/oitleN+Ly/jPJ/n1b/OlzGG1Wqlju1AN/Q0TcNqtQIrs//QtBLUkgv7xwdAEuy8l66mfGMmPc2TjHFTFlyKE1fzeDypgcuqS7+QEIREmqMsg7WiDs5gvBzoMU4aIyqjqMVj4pw9fw/GyOxdsj9k/yWHJyym2GqrzKpr/YBVN1CMHF45F7xN3N1+xd//7Z/RhoxDolBrVeFElShVVNYukMT/f4h2GZF0qwt+43u/LRL2GtWcKOOl129est8/EHyLdwLprKUSS2bOBVN1D6XeEuc8u6srqahzETwHHy6FopduUUluYVklSZpkpghWxsrIaemwloPcuspuHfj+957ThcLx9MDf/qe/YL+/Fdx9zhjjqNZhnRej4unIfv8oXpjls9ALHWPo2p7gA8F5jC6np/HEm9u7M5oFFNOPZd33eC/j09PxwOk4UnPWEVSDVeNlzRl0rO9DoCBYcG8daZ55eHg4nxtN8Dgr0nJTDeu+5+ajZ3z2+Wd88unHWGsYxxPOO/rVIFk0qeBrrfJgmohvW4b1GrAEJ6MSZyzf+fzbgizIAn3rbMPLN2/YPzzw8fOPNd/Z0W22eO+52IlqJ8coaWmlslmv9QB1fP7553q7aqpUTByrOAVDgThnWY5bCRJx3jOpNrxVCWIu4uS2VQ/OUulCy6qXIKFTipBnVquOOCW6tsE5y8P+yOPDAzHO7HY7ALqu0apZbvScK5cXF5LylQp9E1j3nQSB6F5iydbwVhrm4zjivcNT8cGzWu9Ym8r97R39ek3XtQQn4TroAV0qxDmqPl0e0mmeCV4IozLmk3HNmR1fxWXdeI/TkcKcBNNwc3nFOE461pMD4WKz5TSOkhmhSABrDA7p/pZuT1OnyaUw6AK/1Ir3QYQFzpJKFpCc9SxxwoeYBMvSDXogLyMeQxNagh+5vnkijm/nIAkwEN8oCsVpmp58AKHrtRjxJF/0Mkhn4OPldiuOewo1RVwrXU0XGnKBd2/ecfPsCaZCXPwzv6b7Wg58f5YAtm1DSi2b7VZNoUbyw1NWDtVOLoQ8U4G+H5jHkTHNvLt9z+PjA08/ekbrW6r/4Az2Xrpn7ILiNpgGStIZ+uL1aAP74xHvRYgAooZBmU7OyXLzOM9YKzgG3zQYDQtaLgaj3iAJPbKMxxPWe1xj5PLTd9FaoLE0OKyv/OVf/nvG6Y3gt7OoiGpNYGfyrFng35CQFYq8j7Wo5Ff+XkyJH/zg+1xfPpGfJ3jmOTIdT9ih5/LygrZZ6U4tM0eZu6dZsDsxCD9OjJTw+PDAnGe2u0u+/uoLLVqW1TPUksi1pVW1kGj9Kq7ac1gUKsuXDi3iaiMvYDFYm6m2cnHp+d53n/Hjn7zk5Yuf8vb2Jd/65AccTknGjaIhZ5wi7+/v6dvA5cWFcNqo1CqUAFOlg3DGaqErAVYuBJ5eX9F1nRrx3Hlf5YM/izSaEAidGCPjPIsIxsp0pXovHT0iHLDGiVKwVJphOOfzrAY5F8dp4vb2Hc5Y1sMK1whqKM6z/vuyH6wV7u/vsdYJqt4YyUimZE28qqRUBROr5p9ixMlrDJINnQtd3zOnSKPqH6sStFXXERGYX60ikzXG8P7uTrDcm7XiLeQgXO82eCOwsXmOsoT1cNyPZCNz/pxkNJNKPi9RjTomRTL34aEsOeNNJVY58DP1jFhOUTC4u4sLLrZbstrR4QOWOai5RYxG0gVklZUtCOWiFapFkNcS+7eSihx4+vSGcZp58/YNbUqQxUdhjFEaZyQmcZq3NkhozSiV7zzvefnqFRbDxcUlT66uMNZy3B85TicutztyzRynE11pJPdXcQ2ZzKrrxYCTk8ianWRhxFToG6eeAFGNNVpdihROXIB1kb7py9dYeQ6WzykVmZcuKII5ZmJOrMOgYz2DCZ6m9TwbxPV8nEZSToJcUA9EKZVhWIlfIInKxixEXWN1nAjjOOFc4PriUnTl1mpVm4BIzAbvO9J04tXrNxRXuLy+5EN1+et/LW17SlEWstZgvWe7XmN9UPaPxIQKlNGSy4eRrWsCvbdc7C5krJTLmRs0zzPGwno1kKnnUWFRj4D1glGw1X0YYaRCKhNN42lDI91xkeCoJdVuOk0yrvABZyU7e472LGvt+xZjHPcPd6y2m/N7IkvdJeGwCr3YgPeZv/mbP+WLX/5njM+CsLZgykyuBrJUzxbOxUitGiBl1LNwjgk1kDy//Zu/I9WvC+Q8c39/x+FwZJ0zN1fXOMVcz3NknCeJFcgZ7wKNFUMgRnxaNjg2qy3Pnj3nP/+NyM3t4qBGMt9dSeQStDsQRVrNhZiMoHeMGCGh6o4waTEhMQJYgWc+ebpivf0OrTd8+Xd/wueffpvtekWU2xyLEUNcCHRdj7XSkWeWzwHmkilxhqbBVWViVWGUNU17HlWVHH/lPUNJA6UU4jhyiLLsX/c9IfRibrYWvJBehZAcBSSpju+26wSCCbgiP1/fDEBlP0oUr7VShPd9x2GcKfsDKUV+/JOf8tknn+GrYm5zreSaiVSNOoQGQVbUWinB6gcZGDpBOOAdRuNC2zbomEQenHGcOR2PrNdr+rbjNI2c5omVzn1NEmVDtHI4TOPMXCKh8bTB8+72ltA2tK4VMJwRjru4GnVxVpDLoQoSAVPPagJbqn4/FYIXPDgCKhtWA63e5mdTXRILe86FoM7IJ9fX8hjVD2HlxjpSnLFGTFEgu5zdZg0K44qqkgltEKWVmngEKSyH+fF04Hg4AZDblpweZT7f97x6dS/5032vHBtRaCVTaLuOwzTRNA7I3O8ftYrUXcg883g4sFqvhBBbxS8Sp5nbN69Zbbc8vb4B1c5b585uT2NFxfP4+MjD/T2+abi4vKDtu3NE53KweX1hi0GyNqqEHC1L/KgLWpwlThO3b95ydX1DE1ox7iF+h1KdVqCikZlzwhuDbyxWUeB3d3e8e/eeJzdPWK/X8nL6gG90hGdEnuvbwMXlTp+TpBd/Oev9f52vZY9grVwADkfftkwYYpwE5a1zd5H1G4gWW2VMI2eVZ1j1hPAM69SRrRQBUeJUyIXgxCxqvRxWtX7wEC2z4e12c4YGGiMEz3QaqbN8BmBYbzcE5wSdn4QKOo0SV2m/QaXoB/GB+EbIrxV5Z1KGnB3OJfre8urVz/jzv/hDDFHGUAjvSNIVHTHLSEeenQ/eEBScpwJgvYgq3bDl88+/T1rEBBX60OK2kgFdS1UyajnvrYqzrFZbnBXcRTESJGSArmlo+pary2uhJqCYHv0dZyMJb6lKlsvywZeaVfgAJng5gPUcKZ7zWEq2SuiSubJeS07Hm9c/5x/+/s/ZXX4XfEvTS/Jf1/bYQS7JUqL+9wyxZvb3j3hvWa83+jHJ+Gwcj5QiIyA9WuQus4aisanzPNEPKwzo7ws6a/FtKyh/uyhKRVVXHJgiOdq4D6wsa2VEdjqdWA0DFxc7fPC8f/+OGBPt0ND3KzKFUApTSey2O37/n/9zEZUsElZ5eASgJ2aOhnGa6d0HVICpQlltgiAM3ty+Y7NagzHUFKkh6Nxf5X96aZSSabwjuMBpnLlIsoStVlQ7UxIuepoiNniaRirtthtEUmssTbP8uU4fRDmQa5EWLkWRSdpvjGSCl/l6sIY4zbhWuDk+i6bcKvG2lEwxwq0JVhzEyyH3QYMtVZGQQRtqBeeMtuCi9kp5pg2BU5zo+wHjJE/Y6PdUdf+TkQoiZ0l7897x4uULqPDd73+Xi8tL1pvNB+lfrZQoiolgHfvTid1mIKXI3fuXZ9lmrgLzmuZJF1qVfmiZ0kzTBq6ePhXzjr43SyVavtElmVI5jSNv373l6vICZ6/ln0sR74Qjk2sh6iXjvePjT57T+OYD5MzI796oI99guLy8Zr0aSElcyqlKdrJvGhm9mSxwRr1oZewWZOn9uGeaJq4ur0RqGBPbXYP1TkN1PGma6IcetzG8f7jncDgyDLIHs5hz9Os/+mVgaHviHJn9LMojI4wjgdSas4TZFDRIKpGMZLnXnDnsHzmPWmIme/lcmkaSDJ0LlDJLNol2zzln2qWStYbq1FmrVaao5BD0eNNIEmAVmaTRZe+SrWEQ1Ma5yldlkxBFhUoq1atUkalWySaxifuHt/zpn/1P5LQneEtMVqxnVqTPNltsrlKcGauxuBr+o5JTjEQL1ypS288/+ZSm78Wbgbi7/drSKNctppmu7ajF4IwjLCw4dXxnmyFNGCVH1+rIqfLsyXPx15RJL6lvvKtVLmJpjqy+dUo3TknySSyy90OBshmcrxhb1NtRoFqMnTF4knnkF7/8Tzz/1g/IdEwp4Zxj8O4cPgQKNTAG5sxq6AhNd15gU+SyGkeJ9MUoDLFq9rQJlCBcpryoyKwhzUlzsCukdPZSSNNmyDXhjSM5R5onQtuRa8YihUe1lhZh1JmSOT7suXv/nmG1oXWN5qIIwHK3u6TqiJdq8IsjmVwoWGl/jLheZQ4qC8xa5UWzOsmLcZa5uHd45ziOEynNdL05o5f7tczExpO0yJdXF/JDOiNSS0Sz3ZkWVpXcFVrvsMZysdlgnWMaRWG0BKVYZ88L6FKFJ+WtP1c8Dn6lavStsG5e3b3n6c0TWu95mEaMsfR9J+EdJUslFhq5vEqhcYIJEYKpl6Qm/WMF3ZApRuRspzGddcUi2ZPQnzxlpWomxv2ebrWSSzdJ/uzQ96TQUnLi4+fPWVyzFqG/1lo4HkdckMstx4prPDs1ejlj+fiTTzFFKnxb4emTJxxOI+/evcb4QLd6JvNT5xjWgxxCy8isSGLgIj6YUqRtGp4/e8b1zQ137+84Ho80fSN+mFY8MK5WCWg6zUD5cMhXUdlYhMrrTGBOE94H+n7gcf/IP/zDP9C0ge98+zty4XqHMQ50SW/lLcdh1Ci34tNPP+Xh8aBjGUun0Zs1F2zwpFl+dmsdxla6TkZc8xwJ4UMR9Ot+hbahmRtOpxPOLsFR4gROKZKMoc5RwpOoWCumNqxVCqyha4KkuJUikZUY9X7IkrOkTDcM5wIszTM5ShJYzZU4zjgvsbRoVrtvRA1jTMU4L8ttBOnw+PjIPM1YZ7h9/56Pnj/XKExLniMmePGj1IopaqQq4rrughgvx+k9f/zH/yMPDy/wbdXUQyNZ1XqYVnWZGyu/54IV4ch5SFIxRoN3jGcaI9/9/m/QtmtiypLEaD0Vi/Myn08pk7ImGB4nnBcywpyiXhqBXBOpFJHaa2F3cXVN2wwi4ND/ulOJPcg9YTUGUL11OINcvFrRg+D3TSy4GiXVD1E4yuhJjJvWZgyO23cveHj/ko8//R1evL3n/v6etBqkU5ApFcc4nfE+m80W76264mWXWpCRo1OUOKVgvMMZyzSN6k8a6Dq5UETdxjngq6pYpVLFk9FIbGlMiZwS+9OJIWd8CFgf1B+ik4IUef/wgLWG/ekoo6m8FrVoVUOkOsMdkLyX3HADsvzyMpaRvOQq0j01nyx+fIMeLrlgQzjfUqtOnHoLumIhaErlbTkVYQtZlU8aY865qo3ztE1zXqqKkiPikX1DjLKIaZtlxihKBaP6/tPhxBhHLnabc+BHQQx2KCX26upKsgtS0sWhKAMyguuYYiJXmYUvKbBCk6w4HNW789w1pZn96XRevM5xVI8DzKUw9CKVndNI0MNljBHGk0a4FkxWX0XXcBor6/UgnVFKTGrOylEqVZcF9kauZ88KCIws2EZeosWPUSveW66un+gBbGj7/tzN5JzEDFQyv/jlV4Sm4eNnTzHWEZwnGsBbrCk4JzGeaY7nSqgm4T/NoybGNSLdLVUW6DhLQLDuphbSlFipfyKlrC29oxZYb9ciC64iI7TWUoyhpkRxUrF671mvt7RtzxIRuUijSxFcvDUW30gnNI0nVqsNjT4rzjl+3VHTN78WT4oPQcaZOXHYH8ilsFoN7GMizqMuBjPWdEzHE8fjSHAW1zWqBpODupTCOE6UmuibltrJ0nrBdzgX2D8+cjzu2V1eSsCRrewf7nncP/LRs4/w9gNxtuas0lZz3qO0bUfMkX5YKdxOE+6soNdDK8iGmRFfHCH0lBzJ/gTM/Nlf/H+5vfsFxiRMSRrVKh4DwcLLSJoqzmYZxxmq03vsPGoy6vNwNKHjN37w2zgXiGkSZViURTsq7Rb3tyiX7t+/5/LmCmrm/uFA1zRstjsa37Lf34OeOTZbGt8QfM+xVF1TFlIBaz+olWQyndULseDxHTkvgo1lNyE8qpoLxRqV3ipzDkGXOOcgn/j7v/sjNrunkA2nw4GcZ5q2kRGsgRcvXvDu/T3rjTDqttudNBbzTFIkS1WKgjEGp4DGBern24Y5Z5wBZ73InlWuO08Tt/d33Fxdi8eiaZQanc77xKFrtdi1VPz5z856bj8eDrTB8/VXXxG+/W2cdrPi8hdfR+M9NaphtRiHpaippzJOMytlsH8zk9AUzZk24mBsu47W6M2dhE+zKENQL0Ct4n6c9YcPrpPlnJzyorYp0qJ6vS2XvF1jw7k4aZog5hTnWO73HDN3D/fUXGh6OUCO48x6vZLvtxbe3b6j7XrA4I2hGOmGViEQ4yxUTqrmAci4YKHbhuAYp8T93S1N07C9vCAn4QjVUvDe4JyMHtarlXgPSsJYWRKD4LmtNfgQuLm5JuuCl2yEhKpjgj40UA2zpv0ZzeswJpNjZMyZru/IFL5++RJq5ebqCowk1y2p7zEXXKiSdBdkYV/KoskWtUSMkePxII70eeL93XuMMTx/9lT+fpEHI8fMerfFGCOuY6eIa7k9Ca0n4Gm9kCWNsTSIgdBoClaak4wMrGXOkc1uw2/91m+KUqXtZD9TslzETjrUxlvmKql0y3MjAVTyIpeUSN5jjUg4M5G27bFWLo7NZiNquEkc4W3bUobhn3xBOOfP7lxjJR50tb0ANGin7umHQU1u6ezoXa0HzoRU1eifk9AMdEEu7Gmazjst3wRsEtTHaZyAKgTlms+X3TxNso+YZ0LbCE6/FlwIBBeUT2QIBEFaYMlxVlm2YZ4nvE4GYpyp1jDHREoH3HTiiy/+nHfvvsCbJMo647FWMA6mipGVIhJYjFEOlSiJ5Mue1U+1SvVNTewubwhtz+F4FJVVlcKtCR2JojJcKUBiipJDnzImOPq+JbQdxsguZBg2+udnxjiL6bFr4MF8Q3WoYU2xUJqM94acLM7ojB6rO0jhNZVF7KI7S2dAmT/UaqWjqMIMMylifebduy948cu/5Ae/9b/h+sk1h/FImtJ50rJZr3h43NPaQL9ZMyfJEX/z9i39smeM4ldyXoKnQPajXp37cn5K3r2phaD+mmmeCc6rEkliE5ZLDW/PLmlKPSsSF/Nmzpm+a+nbG0rN/M7v/i69Ls6Nc9hqyCUxnUa9fDRN8+7+Du89V7stcZxYd5L8ha1kST+Ul6aYs0HLnwmqWW+4zBQzHV4NPxLBJweE0YPdyq/BOKGBKtep5Ir10uZMKZ5bnrNKxohuGSdLVVOk1U05Mk0Tw2qgazxdtxXXZCnEHBnHSEmFzTDw1Ve/5OtXr/n+975H1/cMwyDy2eAkoa4WbJAPdzxE8jTStI1W+zKCa60nu0zU9hRtexckiUcWp7bCXMt5nzGrIa918gDNaabvGvFFUInzzHGKDG2gcZ796Ujbd/KzGIl/XWRsP//yS169fs16s+Xm6prVasM8z+cLeomxLDlTbCWnRakkM81vylNzLnz2+bdlSVoqyYgBC8RwOGXxGQzqbEX9FEbLs9Y34ESx462lmspxnCglM6xF5VWco2kb+e+qgWwIDcnIzDW0A9VIYltFxAM1G8nGAJ23Ow6HPeM04b2lbXvWxuDbRhVO8j3UKTKsOhEpZCjTCPSKnMjo+fhrXxLeOc0BkQ7ZOC/omCzvxMXFTp9HSNZIVGg34JyRqEvEiRuaRggEplCOkYfjgfVqi3Eek5MY3GJimmeGYaBf9eeFcynSOT598hRwGjvaysWTMlYvz2qqUoFlSR5jZDweaBqv76uHVvhO1UKJkDAEFzkdX/Hi5d+wP3zNqrXEaKklUFMllkIxRXYh1Z7n/tVWdV3L6KmqgKSeU9gM2Mw0Zy4ub4g18+7uHR89fSKL7hB4fLzHtAK/rJqPYIHVEh9bDaEVKbdgWVSiWz21Ot69fUPXWjZ9z9uzsVtHcShmXvekxkCqBluK4DWcyKNdlkKPqjiRCqYGpDjWPYuRjh8vXbipAZ8n/u7v/5BhteLjT39PYJZz4mGOrDrPdrdhaHtCP2AxTFlwNMEHyah2Dkqk7QLzLKTgQhGHtOa/OC2mS4ySMKdG1/Vqhd9udREvF5itjoR0nbnC9cWljNC1y55rxnhP1wSJtzUGVzJtyowx4udJRvhWOpdu6JnGCR8CNSX8q7evuby44Gq3xXpHAKZRsk2tlQUY1sg3WxFaqhWUN7rMtc7hvbyMIQRCNfIL1Qr3Yr1lHOUAyikxTiNdEMzt4vY0VhrkZZySFWxnbOX+URKdhrYT45leVE9vrsHoDqQqJ6cKKbWmyEeffEwXAlfXT3j7/j0xJdJ+L2Yp56DxzHmSGWUq4GHdd5ywEhoSDDeXFzRKxVy+rNXMAGT+WWPGBqGmqtlYOD5GgIkoibJQaXzAhYZCpIyRuUZhqjiHDdB3/bkCSLnQ6mEVj0emGLm4vOTj5x/LYTDPys8pYMuZIumdE9if+iJkUS0jnaZpNNPYMk0zh/09Xd8TlL8zIwefbwLGWXXEO0qSdnXBgPONSn+KgkeJujgVsq18XraKv8MhLk/jPK3+jsV45Iglyk7MVGYVR4DBIYvrmGaaIPC+tmlwTaMV/geonPcywnq8u6dZ9Wx3lwxDRyoCqez7Xx/2B0LVXa3WWCtKlFqLeG5iIufI4ZCY54kQPI1viEXFCdryj5PE+C4Kk5zFLWycxXmLq4YpFEVPyJhz+fcBSjHsD3uC/v6Njs1qNRrmlbQ6VGWMjoFTUj6RkWfRusKcR0rSLPcscZvWFx4efsGL13/NNL3EuSxBP8ZjnVFEfcIikmeQLtKqRj8b8YopohFrKtktY6gPaq2Pnj3n8fHA27fv6ZuO3W5NrYW5JMoJgnOCuymSi120my/qki6632zQACkjo+Z+6FmvGtabteAvSpHsm7pc9Jx3NjKLB6ohW9lJhCwyfyEmi6x+eVYBcok436qs12Cs+A+SjoHMfM9f/eX/hxQj6/X3aNs1tu1wpkLKkkGdIkW9B8EFPv74uYxXqeAHYs7Mc+L+/hXPnj6j6VYgKmRyFWaYa1phuJ1OwghrW/nhtAg1VvIlapIED4o8n1SYszjDf/bllzw83PPsyVOeP39+dpR0XUNTpCtZfs5MwRsnaJuceTid8LvdjovNVu5OA5TMcTxx++6Wy6sLrre7c6xoyontZi0uV2DRblkrwTzVGKwNGL2F0yxOX9uJ0SeXzIsXL8AaPnn2kS5/5S7J9YN8FSSEBGd58/IlL16+oGkDH3/yKbv1Wg6jUuTCqvWch13UguqtIXnP6XSA0tEEzw+//0NWg2iLg/cC+CraQVDOhjLrHW1bNFS90K9X4oqtBW8Xy1nVZauGzOgLbFTKaEvlcDyJtl3DhkQ5JL+cHKOM76yh9w3b1Vqq4VLAVGqSzqltGlytnA4HrIHvf/+HGAOrvpcxUEq0xjHlifv7Bx7u7ri6ueFyt8MWQ8oV46ssghfAoB5mLjiO+0d+/vOf8dGzj7harWn6ARNnkhr5rLUcDgfG44lu6Omb7mzAy7r/aFwgWeH9b7fbs9chadJhrrI3mOIk3H19g01BJMs4TMk4r05iI2O4WBLH44F3796zXq+4vNgyzzNd0+Cd1T0GjPOB42Hio4+e47yTLPNpFMduTMDIfJpo2iDO6V/zy1gZJTrniDEzjqPEqxqZKe/3j7x8+ZKUEp9/9m2Rqhoxplpn6fteKkArL7QzIjowrpMqMKM7uEKkCoOMivXaDcbENB7xw0pm61HGOqHtwFYaK3LWRd5blDMG4pOYphM1J6xvKaXwcHdHPI6EztENcP/+K75++Vfk/BbnKiQrahiTkXqo4Axkk7F1uYksigGjVtl7e4ygq41mRmPxVvYRzlS+9fm3+fTTz7i5eaYRApbgW64uW8aYVTkniqwlltWHcFYoVcRg6ryXs0bpBUE7565bUZx4tLTmZ8mFLrnKUsLJtEMW7x5TDKlGBiMXtnGy0Ae9bFz+lYOzmIpFGoBcZhIenx11euDH/+nf8tFne773G/81put5+/YdcRQvk1HRg7MNsWTSLHaD4B3VGLxxOGcIXce797dsdlvaoJdhlWw9W0WOPUfZQXnv5QLS5yGrtynnLOrBrJGyaT67uJ/c3NA3LRe7C5xzTNMkeRRBY4p9oDonyqdaSVZl87YQ5hn//OlTUFxGyYnVRvWyTcOqHajWQwZvCxVPKcIsMdYS44lMofGCS05RDSEOvTwMOI/Vpc3Xr17w9u0bthdbCRiydnHzSVvjREoWc8a5ShxHvn79klwyT3ZPWXUDGAdG3K/WCJJ4qcCWByuVSue9RD/mkb5t2OreIjin2uiiqyorubFGxgRNK85LFyyNVmcgSzXdF0suhZV5c62C1xC1lYyPihFFGMaw9o1IyYw8gKdxpvfCOOqbwDRFUhwZVj3zNDHGSKuwQest+3FkPp3oVisGlbm+v78XtIa1zDHyeDhQamWz3dJ1LbMyqDrnMU6jSAu/IuktpdB1A9/61udcX16SqdScJJwmfki6i1Pk8eEBa51A7KpyeeBceZSUsaaKwcga+n6QoqEuuAFD41pAHvjxNPLw+MhqkIAgH4T2mUoiTYmhFR8LdimaZNnZDx04o3p9wViMJ5mv1ypT5e1up/scOJ2OzPPMxU7yfv8pfonlIDRuyeIuenl4cspstjve373n9us7Xr9+zWazkcu9illyVJ+Cc5JzkVLBWQ3WwZx3MMUYutAwGemelzFuTDPXV9d6+Bf1fRgaIxXwN13ktYpxNSWZi4cQaPtBZbIGbwKmFt7evmA1wHH/yJvbn2LZY50hFtlmGJtEhVMEyS0BDUWyC7AYEzBkkQll6TKqNXgNGxKxiuyOquaADL34pGTxG5i1AzJVhCPFWl3A68Wkz6YxIpowSfZhRke88umB1UmEUxk0i11jMaMg04lcJCMmpXx+9o3zMBtGwHUej0cs5YgKqGp2Ss06brKyDCdD0E63ihm1lDtevvpTQuP5zvf/NS2Rd4+3bNdr2tDjrEQRx3EkpcRqvWachYqAgfVmS7m/583dHY+Pj9xcX7Pd7bSiV/OgqgCtDQpuFLNqzvk80QmNGDa9QSJ9YxKFnbWst1sudjuRxaNdN4rdp5JLIk5SxBlrISVs2zLtD4zjiJeNfpYqjMwYJy52O66vnkCx2JIkyrLxdCqFElx0FvlajYC8HLUWzZEwxJQx3uByEU18zpRcePLRM549uaFRRc7ZieotznghyeYCxlIKdE3Lk08+4cn1zRlLXnJlfzxI0FBKNK08MHGeMNYxaFJUaMz5YFwOe2qVqsEYaf1EuiGVs9PkPWtoTFAPRTk/mFVlrmi+AMvFYQ3OekwuRMR05b10EcLxySwqspwyj6cDrWvxXeAwnpjGmbZraLtO3L456YNpZYEJZ6OiiheJc8QPvVzSbSuOYGuZ00yJCR+a84VYMVRTqFaWYaYY0hQJbeCqv8I6DxViFsR0sF5w06UwrAdWG0EmOHR+W4R5n5K4VHOuFFNEemolqlQYQfL5LmE8cZrYjxL7WEth8g7rLF3Xyfw9i4tX6QxMOUuLjuFw3GONuPxFkmglRrSVkU4ILWmamKYTw3Z1Dvax1kmUqOKil2yFf+zLWTHRlZJlGe4sx+MJZ72EBHUD3/n293n29DkOS4pJwodqIWVhc2UtHJwT4vBxmqQbVdWZPBPSSrsqo5KcE29ev+F0OvKdb3/rLApwrsE3gtSXQ1SeyrvbW7ph0EsbMb1pV26sqntq5snTC9r9gbu7L5iOr3FmouChiEow+ErNjpRnStTRQwWQotDiKE4YZaUUvDFEIwmWWHOGSi4j31IBK5X6YoZONVNjJHQdj48HTtPE0HX0q7WSHpzE6Krs1GBxfkHgf1BETvOknaLM3Jd3UV9wqtxWMiIPomScpvn8u/VGDs95jvhTixnkdxCqtHi1QHWZZRnvnPLR6LEuUUhS5QPFFnK545df/0fGw9fsnv6Azz7+Dn3fy2Wp/Kyf/eIXvHv7hn/5B/8S5yGmgndBeV6O7Wp1TuqbpomUIn5YYXWB3S4k7JQwQf1KpZ4X/yVLt+uc5XQaWW822BCI0ySFkZd8kuos1omMHQRk6q2n7z6MY40W633X0TYNPiv3xQWrfoMKVhQbHpEkOi+Gnpzzue3LQqMjA+MsQKmiaODFneytl66ggm89n33rU31JPCXJgT+nqJXxhsYtiqbKaTpSc+Fbn3+mXJ5CyhFjCs7Dbr3Sk7ucHbdjjHSNldkkktAVdH8gjlWDC0GqBaNwLKO5D2ZZyMucNdclwVg0+/r8YZPoIYw+iFC5v7ujOsduJQHpxsKUxOyEc1itpjHQtR1v797DYBhWA9e7HWMbP7wE2p46DfxoQ3tuQVOJnE4Tm9VKFDzjSKmV3XpNLpK/kGLGB0cbAgUJV4k5ESeJeG2C7GOyrZSUSRRs5yQvOyWslyVYUVWEMUDRRaoGlxgnVNKu6844kKAJhaXUs9Gucy3FKzn44ZHjSUiWz5/c0HQ9j/sH9scRZ73QV4OnwZGzAOgkwElUSyE0lGI4HUcwVUJevPyerXOUIsDD/X4PxtA3kkf++PjI+/d3bNZrejeI5vzXaSYMuOBpS8PhJGHy4zhK3rGzzFEgeiEEvPGyV0lF6LRzBAetlaW1wdC0Alsc44TXjvdwPGIrdF0vWeXGMZEpaabvOwEDhhYfHCZLwTJNwjPy6t1p246uE3HAsjfzxpFNBhsgVqwfOY1f8/jwY0p+j0Pc+zUVwKFrU0pJCqXT55WK9wZTBcNujYD3qoEaIEQx6omMV1VKsm6VfHQKTdNRYsbZwPF4YB5PtE1H2/eCs4kZezwSulZ2e87iQyNFfc3CEVKxiuTBSMbKnGae3FypmqngXCPjpQrVy+gtmUKoWT8b7QXnSgiQRhiPkf3xyHrVsBkstuccRSvvLnhbNVYArHpThIMlWfbWVazxeDPyuP+C+8eXbC9+xmef/QGbi8/kHFD8/v3dHY/7e549+4gpzqQcKVOibTr6YcWlIvjfvX2L854YhZ799Pr67FmzznI8Hnjx+hUfXd/Q9r1cHlUEQ02VHfE8T/TGiPq0FKiymzFV9k0pifemcUG4dprTro++xAEY8CHgg/eCtK0SrH4aZ+L0yHq9kaCXou2flfZNHgEhP1aKsEqQmdgyQ7TWY6y4iedUGLqA14O41EqJUTT1iFuz6zuNUM2inzbastZCMIGYCs5qpOiS7IXMvduV8IJyjCyZrblI5a5N8Ln6LXC+mLyVF22OE94LPnfZsXhjyEYYLiq5liWrXijzPGkVYFTvbb/xS5ADrC1CTy1qwislKz6j5ebykliEVOlDYLWRvUWuYqxZLr1Fny8+i0lmxabqoVjUQ2qI2q5P04xxVhHIuvyrHzwILnh5wb3DOyMk0FS1TbU8xoRLi5Pa4xr57xiqVjRV9wmCrLbBYUqlbVvmcSLWSGibX/EmmCJVf9/3bNZrGie0ypwWblFknE6afR20IrZ4a6CRljx4R9PISPN4PFKKeGCOhwOgDH9TcM5KxsfQnXOEjTHsdltiKjQ58U+ROS3uatlLRMk4Dq3sY6xkV9RUqFaWq6J9F0e1tZKVLc88kqkCeOulKzRAzhzmmaZpZNQH5BQ5nEaurq7PlwFwliBPpyPBiYz2dBjJeeZ0qPQrubAXbEiaK20DU3pgPH3Fw92Pmed7jE3UMpPTCIjSUOsAjMk4l9UVXCXkpho1oUmGgkA15e3K1pALhGTJpWJl+Iu3llikqNgfDtxUQxpPBGexXUcxwh8aNOf9eDwxzbMm+wWcXQyfUp7NRWbzJRUxIpbEajXQ961+36L+q1XwHiZLp2uW94hK4x1jglIt02y4u33keJgx5sDlRUfsHeNgWG09bc30ncPZluANvnF0rYw/LTJGpaQPHY8x2FKV+JyYDl/ws5/dcrn/Lk+u/xmuecIPv/cZH390zXqzI6VKnmdOpxHvAl2/FlkrhlM60TRBfUGVRs+6Rb4eXGAyE8fDieki0VYBiuaU2a3XYvcuhdNxVFe2wyrBOwMmziq9lrNjGIYzx22RuFc9J1OM4AreWItH5sn748j7N28Yx4nNDyTTIZYKy8hgmekacQ6mKDRMlgq8yMXQNK083LWQamGK8/lQXrqMWgt905FdISIVGc5hqhBAqQnaTn7FZmnNrCir4JzoddwfMM7ShoZe5WMLZgLdAVSReAsqpBSCdec2TZyQszDddRQhH6EurdCllco/Y0okZA7sVU203mwU9JfOHYt17kycXMZd1jhp++LEPIkLvTecv59ai3RkxojHIcv3lEuCXCWBrkoFuT+eWPe9oCl0ib9eLUEsehlOER8kp8E6Sa+Ti1ks/IsWu1ap3LvQyMWiL5kcTg40Ba4itEjjxFNCNWRNohMeCmrUg2oFM2CMBC1JtyFdTEGq59D1PB4fefvmHeFxz831tYScqHpj+fxkZCimq77vqVkWi/vjSNvJBeuMoet66f4qOvJr6TcDq2HF7fu3NM1T+n44vyC/zpezXtz43nF1ec08J8bxJKoc33CMR4wVqSlO2E8BS8oyEnTekeeZ42kvXakLtK3neNwTc2E19BRgikn3WvDx849EuGGt/twqrLAW34jb/HQ4cn/3nsPpiDOWjz75lL4fBGdeAZexdWI6/ITH+y+pZY9zwsvKVdLPlJ2gBsdK4ww1WJG4xmVAKnibag0ui2S9lEp1VY1eBePkwgNRPpkacLFSy8zbd2/5wQ88pXTM88hqWJ89MNVYumFF6Fru7x85jBMb70nVKbVBxjW1ZlLK+NDQNC37ecYYS6mG0zhRsKS0jKkqOKPGWPV15Iq1gmWJc2Y+PQoJoIGbqwtam3Fupuk6Qm807bGh9R7nDE3Qs8ss0QgVbzsq8q4UI8oib+WadM7i0x23L/6Ex7t/4MmT32K9+yFXuytq6JjnwnHK5Jxou4aUZ2KSqYS1RoywTorU7XbDNJ1ISTrIpOfudz7/FjkX7h4fuLm6hsZSShXpQGjJTWa/PxKCF/y3E/9MaFvqNDFPkdVqUOVXwiwTolpFx6bFg8ZBGIqxuFpY9x3dx88JTmzeiwzWOVksShA9UGUfgdE5pB7CcnjLB5aSHFDOWF3c6tK0iuxPOC/yZ2aQb1LT5yyOaZwJTSA0AVsMqsWTx1pHHqYU5pRobNCDROeyqrMXMF6ibRpa60Q1oYdkVoVU32plmLNWQR+q4JzFzl5VpuusxI8G7SAK5Vy9Rb0cFlMgVVpzoTJKu55qoSmVOdezMqumjGmDtOnOCN66CvCuWhn3vL29xXvH2q9ovLB24jzDeiVVu/6Cl4hMqsy6Wy8vRi3aYlbJwwDIXhZjycoobjpJHq+xViV7YsiRWFRZAEoWsub1GiThy1pyFtOasGnUzDRnatvo2AEhlJoPL69GEZDmrKM+L1kNehjKsyKX9TxH9QxA21lsE6hU1puVyKT12ZqjVOuhCcS50LYC1hvHo+YkfIgK/XW/jBUMTNcNzPPMNMUzF8t7ia70riGWWUJ2jGFOQgCVyFVRMXXdIBGnTnZdLjSsVhWvY5jXr15wcXVJaDt6258VcfM4yuiv6/WzEQmlNY7t5QW+7QhWDjXvnX5OhcYm3rz+Mfd3PyHnRyBTM6J+0XcVA6ZkYpHK2BjJ/DBmyVyQ0emCqMBZUaJlR0kSXeqNSEfVQgLGCLSwgmss7+/ectg/ME3CVku1QJbxECxdrGMYOu4fH5jncC5GhmElXhTvcYD3hrAeiONInOVSff/+Vrptb3FVCkq5rSvGy7QjIf/sPE4QoelaLnc915cXXFz2eDtibaYLnm4TaIIEaQUfMKbQegsm45tA4xwO6W6rHqhZkRfG2DM9OBhH4w25PPLm9V9xeHjL9c33GdafEcyazdAzzYLfSFHk7s4Z5nnZ8Yr4wVnLPEVyrWzWEoiVS6YLUkx9+bOf0frA5cUlp/nE2/2e7UrOBe/kApDO1pwvGmslc2SeZxrdgbTILsLUyvF4kn2qE1O1r8ZIFWDBhkCj8rM0J8lZxVG92OyNc6SYmcaZJjTYoBI85EVIZGKt1Jhou8BCPnVWE8swHI4zxhtZXKsaY6n6UZJlTIlq5KUOiG671iqHg+ZWLxfPdrX5AKczcDodsEYw1bmK5rdrVPGjB53xgTrOPBwOxDhztbvAd6IuKlW8HinLzG75UHNKmlxnCQoa2x8kktA7h3GStwEoU78ihE0ZK6364XyYDV1LrY12MpJCZxQ1kdWtXQRCj7FCw2ydJVeYonRCT66vyTkzpxEwqjyq55HfIgcGWWZ673GlnruOWsWteTqd2Pj1GYDnnDvnXtQkMDYJlakU0UQKJhxVQJlGfFbL8p/K/njk9t07bp5cs95dyoJt4evp3HOeJ3COm5trLi8uiEUQ7csFURUnblR3H5wl5kycZzoFM0pgu+R627rskeQzTKeTZKPbTAgdu8sV1nqm6SRxmL+myskYQ+Mb6VIqWDvycP9Ammeur67o+xVxOhFHMUy5xil+fslujhJU1cl/sxrD4TiJF8W3zDnS9B1Pnn98/l1lNdFxXrQb5nHm+HggNA3d0BO6lnbo2G53ElQVHFMUdPqcHrl9/ffcv/spmEmc01lx3kaBcgt+xlj1hoOWeVgkgyJrF2109ydAP6/5HwZnOMcDmGJw1ZCQZ7+EQtNavvrqp7x4/QLvez66eSrgxHlm6Cs2tNKBF5nLP7kSU+XpdFBAoRQcjZPl+ThKVv14GrHec3f3jtt3L3BIVgRGdgTGVkSrK+OyaY6c4gljK+2m42IzUG1ku4N1O4tQwltCMLQBjDUqfZ3pvKda8Rf13st75C2Nk+LZKUW5FI1iLUHy4quhFIc3DusqOf6SN6/esTm94eL6n+H9BRAw6P40zljb0DYNNnhRugF4Txc80/Go61rDbrvVFYDls08+JtXKFGesc8Rp5M008uzmCd57Hh8fGYZBvFYpcX9/z263wxnHy7dvqaUwDAOXTnIjSs74BSKpRbyfTieO0wzOsN6sZL6dZEndeLFY1VrO45fGebIXsJtDYkFzEdt4cJZaJoIX41MpCVMdsQj1cNW1MlsfJbRjtV7zZBjEhyCDZuFBhcBF2zLHqIeB+DI635O8IbgPwKusfP1YxHySCnSNbPu994RGDhTfNGeFUcnCnJ+nibdv37IZVvL9Vnkpqr4YwvyfWHWDjtKS5A07UV416psQjX/hNM2YWglOZrrjrLuXkimlFQWU+cBf8t7jFcCVkFGN8cqsrOrFwLDVZLYpjvAN8UDVM7dpNI51uYxLwTpLjFl4LKqkqaae5YXoUss5x2maWQ+DaNVrkhQ6HfHYLHJnrFHpoSfPiXmccaHgW3eWH5ZScMiBjjHEKDRX3zS4JFhxkLCU2/dvSKXwyccfAbKPEJyLfHY5qefF67jOQAjSfU2jQM2Wy8bYFlCzZ/DY6rAhSIFShTJaUqc6/JlQG37NO4KF4STvq9B2Ly8vOZ1O4heyBtO0+JSpVNI80/e9FDo6nk0xQZW9XrUGwUmb88jPOi9jtCou9zwlnBOlmEiRhfC67KKMSjULhporycPj/Z7OGVI98vrV33N6+CnGHhTAt3QOFedUvZORixWpvuXSdFjdrxQcrkqCm6mLdFqKPmMqNlSyLbiMsJBMIZdKMChFudAPjrv7lxQz8+3PfsBpTuzv96xXA9Y5cpwxXoCWVnd61cBqtZFnoRQsMoufoviLqm+4efqU4D1/9hf/ltN4T9M5DdFS34ApYAq1OCoZUxOboYeVo2lbuibQOEPXVlwjcnfvRd1kqyZJesPQNLhGitRVI3tT5zx9I05w5xzOOrwLlJr0nCzE3AgOJyZKhmDF5Vztkf39XxHjgY8++Rc07bVczsWQSyRH2Q2F4IhGcTS1sn888P7hnqc3lqHvz3uDnBIXux1zSqJ2DJ7VsDp7IZqm4WK308tFDvyFDxW84/mTJ4xxpg0i+797fJQd3nolZUMVNab33tOmpAA7SONMTJnVZiWzZaMLDxbssBh+zsY3fYGX3N6m70QbPp2IMdLoQmY99Fjvub685Hg48u74hmkcud/v2a3XcjDkLEog82F5EudJNMBoGl0p58OmJuG4OOcpU6btAoPtWXygjfNUVdq4ZYRh5BDuupbWCxitaUR5YpxkGMjy2nI8jjIH1zmwD0KGHe8f6fqOduhVcTJKzGXXapqbKAWGtieOM4+HE9Y2bNdeZvfLclrNVsZabK0K/tP9TIxyOFpRKInCyDGlRIozvc73KQsiQQ7pcRyFTmpgaL/hMnayZJbMYZiS5G9vNhudzguyYToKKMw3nhwzY5KHtelaxvFEF1qp2DQZbUoTjRNjU85VQqKGFZ8+97x885a7u/c8f/4RbddRYsQhMLLteo2xIjioRnKcZaRlWFhOi7Pd+4acI6UWmhBY4h6tEVf73fs7MIahX9FbS7GJaoXzJEvyyjieZK7tLyiNCiT+sS9dtzRNQ9d1zCnKfojCdj0wjhNxnqlZcqJzSZSiyH0rQEaH4TBJUVVEE6yftVS5XegQRA2MMXF/ewcG2n4Q1HoB4wxd2xGcl4x15yWeskSsl8u89QHrJu5f/h3z45c4M0vvXuPZAyCTP08hkas8X6YsyiRLxeBMI5kpNVGKlVYBA4oXt8VQjSXVGRBEB1k0gKEUYKYkOWxlwX3kj/7o/81HH32Myx0X6zW+9WcZfa3L7zmfvQcVkWFXI6gKH1qCsZRgSMapuezAn/4v/w6DIju0vPN4ZMsJxqHMN08j4w7aJtP6Sjs42jbQdB5nKt4J38l6g/UQvIXg1MslBrxSINhyHvs5L6iWWq2OdAqGwmACuUjIV0pV2GdGJbVtosy/5Osvb7m8/i/YXv4edrXCx0rOEzYF5mkm1pHgGhlh5cTpeCTGC2qPnmnyDFcd1QK8efOGUgrPP/lEYk8PB1brtcb9QgAuLy9lRGwtXd/TDytSjKQc6ZtGCmTrcNYzxZG721u8C4FglHVYpVL0VEqUoA9rBSFrjGAVKCKbqhbSJBfKsB5ETlkFrW2KVP7B2g/bfyNoD73U2F1dsx0GCuhoR9VTpYjGWQofYsq0rT3LWFNKzCmx6XuKEdBgTgmcsPXrPAvSQ2mzWV3docrIqFqLDQGf4JAFKOZ8gFrOWdGAkG37FkPH/jjy9s1rrm5u1K1dhVm0GJpKYZwnGg0yolZBHDiHb1vW1tIPElGYa6Zve1JSB60NHE5HTuPIsF7RhSAVlI4mlhyKcZ4Zuk72CFVUJLmKqTDpy56zeEYa4DRNpBx5fDiyWa1omkDMgmzw+jM2vYxAjsejXObOE4JjOs3UbFkovk0IeCuo8qnO9KuBdQjc3d1z/3DPzfU1q9WKYiqHxwd26y2h63DWcpgmjsejyDx1SZ9TkkxeZ8/jylI5L93jLHutJXN3GAagMJ9GjM5b52nGWEPfdcQSaXxH27UYZym5UMZEVXmgDUGVc1kUa7/OBQFnT5CMnCSf2FpZkJtaiXEvIgDfYMlELKGU88jQGElCfHh8IITAercl58JqGGQvh2RZlyIjC28N3aonuCDdwymRS8QbLzuwkmRZPE4UhdsFbeOm9I6XL/4z+/svMOaEMQlDpSzvlhZeNi93n470StYwnyLGWYUo+eyoNpFkHy/+CGMpiwiwCKW2VtmROFOxJpCqIdhMTuAr9KuGr1/9lB/96A/5Zz/4V1ztrkXabA1WuUpL1+4VTbKMoCyG+/0jQxfZrNdUPAGHt5Uf/dV/5OXXPyW0gvE42+xqxRl3HsEZwAWjf1/4T4uAsukCfadGOld0n1g0YtQJyBGR/lIL3gaaRp7b4Ay+adWwl4UaK/+07gYLNlQam0nWMiaoVXwmwRtyPvH6zV8wz0eub/4Fq/aS0+Q45ANpilDANAkTLG3b8uzpE/VCnHRfBU1jmKdZxqdUrq+uZDycEn//d3/Li69f8Du//dt8/MnHZzOhO5sXRRJc4yzIj1Lp+07OCGvOarqmafDj4YDRzf0Zx9C2nPYnrDO0vaht9OfGOJGxLhb4BSHtgscXwWCD5NHGMp5HK0LBFHXEOJ4YxwmQRLeUPmQYG2M4xQmfZD/h3ZLtjKKLJZmpWAtqxns8nZinEYdnTJGLzUY6HK04F7ctRtDEJSXQWafVsYqMBaJw3ZElz7pbkSiM7295/UZctc+ur5nPGcIyOnIaAlPLh0DzWCqNN6xWA3MWOmye9ZI0Ukl6J59tBcH+hoCx/szvMVXCULCWUA11CVbS0Vg1BusUA00gKS/fekfrOqaTAPdscDwcjjS63KzGYIuhpExB2mvn/JnDH0JDHxr240ScTmAqQ9iw3q5ISbTcx+OR169e0PaD7jMMaY6iAvGizGiGFj8HnLfn56JqlnI1ApBDd1XByghtGk8cT9qZDRs2q5VozSnYoNwpvVCaxoOzXF9e432Qtr+IFFb2DjKmwRiCD7Q60okx0ra/XidhdMu75IxbY2nbhjjNokBC/573IohUM1bOMn7COcmBsFUySVBFTpEoV3GVS473nCTXZJpGYpwwRn4XgOx1DHgjCI9qPaEKFOPN+6+4ff23lPwKx4g10m2nHEGRMyJlFtrpmdBcs2QF4FTw4VX0JYiZmr0SETRetRisxJ/JqEspqVlHmNaAKUrsNYVTNfgKjTvx0y//kt/73f9KDZaOxhnSNFO1UPBGMjlqtdqxFKwz7DaSzJdLJmbDMHTUfOBv/+aPgRMuFEFyqKS44PDGarJBlYW2KuFdgNY7QmtprCFYQW1YLwIMiaw2NF5gn9Kpyu/HB09opYuRblwuFCoi7bVW6cBifgxOxnzFWHKWAK1SCzULaNFbi3WJx7v/RJxO3Dz7V8S6YRwzzhnyOIkZs4jC8eJixxc/+wL76Hn+7AnDsKJWwzw9ijS2a2XHC5jg2W52dN8buLq60hhgUXxaY/ChpcmFlBIPj49UY875Pe9evaKbI6tBIpE311fYqNkNx2mmtR6HlYSjWnh8kG8gTTN1TtRUOD4eZeZdjbyIzlBiVv3yB3dtqoVZl8xgKEXa65wrh9NEqvIiLRTRRatLleAd5xwmBLqhF9eq/jMuBFGNZPmzU0r0ytI/jidWbacSW1HG2CUTAKil8Hg6Mc6T+i00Fzpn2cG0Ld5Y3r6/5XA4UijEaWI9rPjWZ5+zWa/OwR6w0GqLzIfVDWl1zt+3rQLYhFxbUqJvW/phkBclK7pYu4ZGaaFxFoeksSIBLVbyNKaaVKoomOnbN285PO45nibevbtjCSwyzp6d7P2q5+mzp3jfsFmvxKyILMVtEJ6/tbLALHpRtj7IXLNtuVivxINQ4Hg8sCCHHZaUhPoKAmlLJfHzn/2cmCvBCeZaFDdSBbe6YB6Pe/ld10LNUVRmum8Y48xxmqgVfNOeu0pnBeexqDWWbPTTaVZTk/0g2bVO5/6ZBZWSoihGLJb94XCOYP1Hw4jMh//tgnz/S8a2846ubWkUNigWFtHpL18xZk6Hg/zem4bD6Qg5M7Tio6gpc//+jtN+D0AXGozzCmAUA2HMWQ84QWMkBS0Gayhl5vHuK25f/wNpfIVnwlrJSMlZqlqDgaohTsj6qOhoOCCBT0bHhxYJ7RJPkz2/I9J5iYPbOKRosQYnGw8aJ2MYawveL/+e8qpcwTeG169+ys9/8de0avQ0RkY2i6tbxlsybZ/GI3NOqprr2e62xBi5e/eemma+/OKv+frlj/FNwlEIFhoDjXN0HsHwW4cJ4L09QxUbVzXAyxBaRz+0hEaS6DAF4+SCQFWCNngalUA3TdBCRtR+zqBpfxCcIThJraQIuw01njpjaawUo+Jcj+LCrhZbM513TNNPefX6P9CYB1atgwTVWbyTBbZwpyo3lzc8u7lhtdrq783StKJ4IgtWfp4mnLF89tknfP7pJ4QmMJ6O8t5r8Zlz4c37W+YY6duWVd/LDnGeMFRRQuZEUVGTbfqOxnv6rj1LPYXHk2g7eVGDSqPQwJpxnNGUEXIsMt/O4okwVSqDaRolbs/yQX5lLev1wMcfPWOzXrPqO8VhiC4663JccLZLwIn4GbCG0+nIeDqdVQUhiKwSXSKth4HgPeeYRqymeaFqGehCoPMCGptSYtIUJmHMCwdlvd6w22xErhkCm82W5x8/p+tkTPSBgS9jH2H0WNpeMOuy4qsi9ZNCjEZ/qa5a8jhyPBy4e/9eNP8YcsoE58/7DDDneeR+PLLfHzjOI/uTHMztIDPxi/WKj589xTmDr1KdHR5FtSWIBiPKCJXIOpX4lpgEqVAq8xjPwL7TKPCvEqPKP+Uw7Pte5LrGkGrm3e1bhq7ls299qpUKPPvoGdvtmlIq+/2e9+/ec7Hd0g0dc854Y2hWgtUYx4nDaWQ/noRjn+VQD8Gz3e5Eqqt+D8FrWJZbUv45mSl7BeIdH/fknAmNRF9aYE4SJTpNHzramnXMAr+2wgmEPZarpN4FjRkVVzqqplF9kHaXInSYRbEFzHPCGc84i9u1X0YtWYB8pWTmPOO9o+la3cPICGTOkZqr8oOMqgkrlYlX737CNP0C3EiskYx8jrVK9yUrNv1ruYoKJ+czTkMuYAHzLfHEkl6XsbXgdV4frFwewTmpnJ3Hug88quX/YzKQsN7StBbrDd56ugb++E//J8b5UTAbVTI7TCnEOONUpFEKPO4PzOPI6XTg8fGe6TByOkaa0FDKzJ/86N9R66i+ETF9yjxJ3hnnKsaJZNo7j7MQXMUEi3dOZP2t5LU4b/FGfu7z8h6L9Q6vSFbn7Pm5y0WKRGNFvWhLJc0TKc5S9RvOAhljqvCfLBgjplRzBpIted6Vxjrq/DVvXv0hef6azabj4uoG6wyv374hxoy3jvVuQ7fqUR0JxgjBoWlbjBF8yZIZHnxD2w3sH/Y8Hg7ie9Cpxd37W+5vbwm6a0wx8vLFC756+YpplHOfiuyHa8XnWcw08jSJLR6dT3kjUDexxYvpzvkkXHVjOcWJGIWJsjhic83MaVZNvSamqeY7xcRRK6vr7QbXBInzWypUdVhmlszcqrJD2W2c5ol5nDEGMUUZXfoqvncYVlpBylLMeckcrtZyHGceHu55cn2NC55SC/M0yz7CyiE1zpGha8/spwWeNX+jczDL7AuYxoh1hvenB0LTsttssc7KknSKDMNC6iy40FJS5v3jI4f9AWMN680G7zzzJOym0zQKb6mIx8I5jeNsOi53Ow7jxIuXX/HZJ5/RdB0Xq7V8/0aUXHOV1LgUJ3IOmMYyzkdevn3Nk+sbhmHFnOWFlMO+UFOm7VtlMAnyuyDVt7OWxnlO8wTzsjOQqNSL3QWrzYDFnZVvGw0pylW8KduLCyxwOhxofUu/WuEV0+G9PXeEqSbSKdP4BrdgVVSSczweWPUrhd5FrHdSAQ0r2taKhNpaHWcqzgMJ7ZFdgCc0HfMc2e8fuby+BiR+1TunYfL/+GURQmDoeo4j1DpK4I91xPkoB4y15CjhW8YYptPIfn9kM/TY4Al9S0mCSElzwntZqm53O3mW5glRLRcZ/QXPmzfv2G0G2kYYUqY4Gek1DbUeefPq7zjsf0HTjBijF4AWQ+d8h7Iwy8r5MzUIWFDuHCsRrXBe1GOko6hGxkkeSADBYbIMrbwzUIP+41IwFopyliw1Q7aVzhtKseTgub39ii++/E/83u/8bzllidSlylzcGCmsrPNsLy9JcWbWC7WpSmVwji+//Cu++OIv8EFwIcVUmfp4yE6J0gYMGWc8wcqo3ARz3ikZUwhWPBC16H7OOxm3lSKLbhdwFdzyodSskm8R7NQKlEy2RWRiCtCU6CKDqXoJVNkLlSh8BHLFkERRTBVeqZFdXM5veHyf5D1xz6lNw+XugmGQGGiTRQyQYyGmKCq/IBGoD/sHHu734Czf+da3RFQyjqSSWa9WklsyRYz3bC4u2O523L59S9cLOfbxcMQY+OjZUzbrrYowFuqu90sPKUu0KOOntulogmzX5WCUm94ZuY3ByIvfLfp/ySd4/+5Wuw9/vtlr4ewtGOPM4zRig5JTdUdwdmKfX0uLrZrpqovzFBNv377m9dvbs/qpqPu271fEFMl6uPpGeCmLIa4Lnt1mQwiB4+FErZXddsuq78RN2jX0fXvOkV1u3cW7UGtVBVbiYf+hajXGcDpNPNw/MMWJApxOIzGncxA9RivR/CGDYDUM9I3QZ/u+p5C5v7/jNIlqZH86EkumaTpWqxXWB1xwrPqNSNaU0nn3cM9Pf/IT3t7eYvX3M6xW9H1LrvLzb9drXHDc39/z+tVbgZ05wYY772mcPy9Al8u+V2EAaqiJJZGqPBu1VrbbDX0jC+Wk6WQWyDnKARwCTROYovCaDqeDtMVFWvBhWLNZrwnDIO553eeI1nyBLhqOp5HTPDNNE3fv3wPo4jdJzO04k1IkNIKHefvqFe/fvQUkw7zrBkoukvONYTwemeckAUu/fiMh8tempQ1C25xS0rGEyBtl5PQBsX73cMft+3cCFyxZUuKUaXQ6HZjnyKjZ8bXKMrwLgVF/Hmslcte5ICOmc6cViNMDX/7sR7x7+58I9gg1UmvUBasUJbJwl0O+5kotwtVapMWCm5GRkLciLDFWTbFy5slfR7INJHjMgStnoJ+3XnZoxlGNkwG/qWJEswZbC7ZmGpNxGBqf+Ku/+I/s9/eyZ8iZcTxyOI2ULHnruWZ847GhMqwGtrsdITQ0IfDw8IL/+X/+f2FMOit7MGL4xBmct+A8wTq8la7HhoDxTg3CBusMTfCar+21whaUkDMG471cVqIb1bNArsBlpzOnwjRHIfPWKjna3+hKq+ZTGCPInJIKXrtGoTcgiika2V/VQimCJi/5BV/97N/z/t1PwMBueyGij5yxVXDq+4cH0jQRrCEEhw+GN69f89d//VdM40nG1EVoEL2SXUtSLHstxGmEWjmo8Giz3rDb7NhuNlxcXOK9dJcpRVV6GkPbeLI35xjSEALzOHE6TlxfXqq5RBeP3mOyIeaEtZ6maWVpkgvvXr/BmMrFxmtLqSHizpIB6xy7i504nnWZJMoWdekao8lsa1rviHlmHCXTdzX0fPT0GX3osI0jeMmIrcbgmkDNhbfvbrHWcnN1JTGcCBisoPr+aZYXTTX2y6K85EiehZEkfBQ5HFkQG1UqMzFDWULTystkJIzk+UfPdLkpuJBh6IX/pJpycSknQttwudtyHEeGrgULJUfmGJnTzOV2J1jqCrvdluAC8zyxoJWD8zx99gSs5fF4UAKq4f3dHW/e3/LR8495+uwJQz8IHsSJgCAEAZPFeWI19HRth8ewzxN1LoIf6Fd4ldA2XUPjWmKSpa/cFe6D9NRa5iTfc9+vxHBVKliHr5ZZq9f9wz3ONex2VxjtJk9RfwehoWa51Gzb6WWcaF1DiQuXCpF4lsJmsxEHvu6rHh4eWa9XghEpBe8sKRdJ2soCIDRGDnFjIcbIaRoZVgNTnGly+CeNm0BhZ1G8LZ3GbK7XK6Z5EhgfVivbwvX1Uy53F5RSGU8z9w/v2e52tG1D0/U450k60061YK2jaRyd6uuxlRAstRriZKlVlt5TfGA+fc10/Io2JMmil5NJD6yqnR1ahFU52nSZLleDqBlVekJVCbWIQz4ooRZvhEUPZAQPjpXOYvEUZY11E+aY/FnGykI3IobWpgJ0vHz5M37y5d/wwx/+HjFB3/e0TSaWRGPNOfHOYs5jTHIh5RN/8qf/I+9uf05rGyIVazOlyE5Fpn1W9iJGCtTgJbTMW8lcd14uMBsqwVYab0lFphiLknCRVVv9EAR9Loe4NYLtpmRKtmRTcVb8IrbInqIiBFxTzbmTEGMwZ8uiCBUqzhrBHumAGlMJFmJ+w8Ptn7MedrTNjRzsdcbTAFJcOxdkZ+I8+MDNxSWX/+oP+PTTb519EX03SHGndAkDZ2qCMfDx06dnjtOTpzdQBYw4x8w0nZjntAhCggZsiNwNLw5jkXRxXoLWIiOI0AROGrrtvVjXc5xx1vL05gmmsVqTVuSKr0wpSYD8MOiMzgoDyFhZYhXFT+t4o6ZENd80MDUSoD6NvHn/jovdjrKp52hVi7i9d5udqHeskUhFhbx5J5b5eZ7YGyPdwzKj0wsq1oS1gZik+h66XqS5Vh42r/kGuVRaU4kqPQOdP2q0qzGGMk2MpeK8oWkC/z/K/qtZlu7M88N+y6Qps92xrwEawNtodM8MzUgUNSGGvoBC+ni60YUidCWGbhTBUFBBiaKoGVE0M+Rw2gzQaJhGA689fpuqyszldPF/svbBMMSGdkc3Gufss3dVVuZa6/nb46TpYZkmYuzYjiO0iidKedNFcyDrZF+aNSTb4te8RQ57a8kCbp7cSGnhHD/6yY/5+quvWKaJ48MD/ZMnqtkskhPOs6oxh2dPaQbrQWOZNAE173j5/DnjMOKC4/hwoHZZuVxA36kdq9lUh1VKLtMCm4b38qP41mixU9ZPa4zjjnk+cZwObPrxcRVqUQ+1N77JNPhdHMRX2Ka93e7Yby7Ybrd477jodtrsUuL9+3dM04knT27oItweHgjBc7Xfs7u8YJknam30Fx1pmfnZz35Ozpl/8k/+53z++eecjhP73d42kj/8y+MIXVQHRBU/lJJerzcRx/sPH8i1cLHbs5wmhqHj+vqGlBO1Frv/KiEM5FzMtdzItbIdtuSQOM4T0/GEknvlx+lD4d2brzg9/ALvjlAXW8SQctDuxWb68ZoU8tiqiGxXdTJbVWzODJI27OpLQc44ZzJ0586bge4/bxAwEhXUx83I2cax9rpUDzRPYaHzjuwKJd3z3Zc/5x/+5N/mkGYtYEArhfHJE1bzYYyDxacrtfUv/vK/5hd/89/SD0W1wm01739k9qXgDBXxztONg7KMvEeSYC34uEIIowQj1nuykszV5OTOYmAwuqk5qeukhlUeVAsqtnJVXoXmsZ9R1SJnajtlnxb7t+umro3b2SYi019HoGPnYC5veX/7L3j5/N/D1SeQHS1o89/sdAj0pXDKBRc9Lz79hOCUui0PTWWelJj8uEapTjp4pXv3Y29d8IXgHD5Eg/kWFjMO55Tw5AQli7SqxqTXSt8PPLm5puTCq9evuL3/wLHMHOYZ7x1DP0huVZVjXmvWDpWtL9Z55tPE+9tb7m7vON0/UJPG6OilQfa0xw5Zu7HG7faMI8oTkKle2fYPpxPLdGJ/sdMu33RrF+u2uLjYPeKr8PvyV+Dy6oKhi7rDg6P4RovqM4ircSsEOh9wwQnjx4H3Z0il5MS3X33Hq9dvBR3FyMNp5uF4OquznMMK7D3zlM5hcOI2pArbbHZyq+dMTlIvnOaJXC1Jt60PvzeRQDuby3LRw7AG+0Yf+P73fsAXX3xhhTeqn61YVEVDapLQkaaJaTkBjuuLSy6vLtkOI6HrqK7x+tUb/uLP/4rb+3sFN+qOxjU4HI6SCWf1CXRDpxRU16xnwTGniePDUVjyOOgkYidCB8J6q4rlvfPUJo9E33eE4JQLtcwcjgfmrBtYEJfC1IKDro88f/ZcNa2zEezes93siJ1au1JOeC+pYSuV5XTk6eWlHUp0orSn9Q/eIJpNj0PX69o4eXxyzjgj0JWZo6jm1R/UDz2b/ZYQOhbrGk+LpLIhSFcvtLWIJ/Kw2YzUWvjt777iNB2o7cjD/W+o01eEdqLzae3gsa5jwRmtymDalizYo+mzc/weIiIJJl7SYnc2zetAiwkvwOSeeqYe/1yGQu8qzhecUx4UFBHgTsR29I7ozaAWEjE4hiHz1dd/w/F4L9w8JU6HB2VwIUisC4Py20pirid+89Vf89/8N/83PBlXNPk46UtNdqrT+ApW55oIodF5J+WSTUDijixHbAjq9fD+nPVWLXNKir9iMt/HEMyaZKasTRBrS/q9jkpOM3VR6vNaopSK7ltvn2/OmVqKCtfcmmVn918uZtTULTmGxnL7N7z65p+TylsUNy6+rzXbjJzn4XhiOkw457i/v5UxrlZOxwP393cWs6PDpP5TGwUlncVEq1+ltDXA1en+MxVhbNaq1uCjXBZ9CLU1ur7j5vqScehZSmVJ5dxz7H2jtkKMTuFtJYEXPNBK5ZQT3gcud4PSJxf1DlAr9w/3jL2gldB19vsq1YqFXKumRGuUvNC6wNXFnos/+ROGYWS2aHJnHMKKxa44ceh0Qmi5agoAwjBCM2IcT8kza6GI9x7foI+R0HU68W+hVsWCqB0rkOeF48MdtTVuY+Dm8poherJlItVSmHNlcJVxGM6yMx+ieJsp0XXQBun9D0uyTdIz9j2eZmOpbqJSLdvJQR9kPtTRTtdLp3EVJs3zTG4NlnKO7YZGP45UCuTKvFgQoUWnXF9dk2omRnFKt7e3bHcbxQ+Xwt39PQHY73bWwCf1znGeCZbZ5Gqlecfh9EBJlaGPhC5QUqIfheGLEAzqRzZSrYt7puWkRX0cSWlhM2zwPrDf79mNG51ozWNzrgL1ke1upw4K+7w3Nm2suTuhi/gQOM0zm82Gf/zv/c9EAm4G7h7uTMHRfn/l/AO+hqGXgc4i6/u1A3xdRGPk5skTekswHsZRC3DNDENHK8K455Jo88R2v4dWyTVpMcrJPCWNftzy/NlzYOZ0eMPx7m/x7ZYuihR1zpvUVcqbZtyIy80UTYAV08jV3Utl06DZIaThbNH5eCK2/cJpIm/NqU+hGpTlBa2spsFg/TB1nTDQs+uo4JV8UMtM7wdaV3h3+zXv37/i+ac/Zr/JnJwKpLBmPkXAVPoAp+mef/b//r+Q8yu830D2NBZaUwpso6iS13a50gqeQjf2+KD1yVlmlWJoBCF1yK9w1ou5x2nKE+R0p+GjiGpXBRe5ZvdhLSTnqckTqln5fKO1fA5QbF6+ilVZV2qlLdpEcqecstIaLTUanlYz2aDt1gobNzAdv+Zw/3dcXz8nMxCcJ81Ktg4NLnZ7qtPmmiuUeSZ4z2azZdxshFgET+x7HUiXBR+Hc+J2wym7z+D1GqMdyEyoEiOxeY1T3715RYyRi8srhYoFjzf3qO86WuhI6SiOe3V5FcjLQnDaJNaTK03l6ftx1AkhhPMNmPMCOMZeeHqtRRlQXgFux3k2V2PAO9jv9+Sm78GjrKNWKfOMD4EpLQScGsuqTki5KoYgukjpzOV7zgVSrHTLhfm4MHSVuNlAg1/+6peclpl/8Kd/qsROIgrt1kIcaBznWSOb1W3VajElaX1woe8VkufNLBeco+RKIFhdZGJ6mLnY7dkFMzKFaMUqmqiaZcHc3r3ncNCp9PNPBzovGKCURPMOCmx3O5ZlJpVM30eWJWmzC4Fi8eU5a4HbbgX7lJIMyy3knMhLYhx7/vSPv8B3+sxKy8Im54XtdmRvMSTOgY+wzAuduZwP9/d8+913UOGTTz9l4wI+muBgmWWaqo+9HJrkm9znXTnHl8cQJVsMEe8xElfw2P3dPR/u7wgE9psNFyZTbjRiUGTK6uReF8oPt2/xL16yGbacTkdTSmpiyfOC7/moiOh/fMNY40JAME6thdB3bPc7+WoatJJwVRDlaqjLRSmeIQSaeWeC78gdIt9L4nSaFALpoVE5HSamknjy7JLl/hX3H35DaB9wQcbU0HQYc82UgEVKPLdC3A1c9Ra/4cUrtFWu6sGtJUFSVIlW8OeTrTjhJs9Jq8SqOYLWCNVTQ7XsqSKPiFd0hRW5a7NygoC8h+h7Sqf+krYsfPfd3/L97/8ZuRvoWiO3zKnA6aDK2W7YcLUb+PnP/gXvvvor6AK1KERPLvWsza7Y5L2S6rUSTK5LrYQmTq15bT4BZx0aDShnyHntjdGCfrZ+imuKmrKdWGYd/FzE10atnfjGEChBbmZx+BLeNNuM1nSGOatOITLj+hFMVGG7E5VK5wLOdbZ2TBzf/Y6by39A8UG+kpqt28fRhYElnch4+sHUpF7hi60+8k7rhFBKIc0z0zQzjj05CW3pgzxo8zSRc2UcTIpfK7E1VdotS6akyu4is0wz+0EGi4gML+phiCrR6aTJbw66vjfiR73OtVrhuxE/zjtqyThvuuPWOC0zwziYHM2fcb7YHBsL1dIpz9iN1lCLA8QqnbPCzgp938tjYael4Bx5WSgOwjBQloWvb2+ZThN4ePL0CfvtlpQTm01PH1TxF4Ln5fMXLDkzbrbKISqKT/ZO00Yuhe3Q8/n3JDEbuk7qhaZ8I6okgNvQCUpxVafs2OFc4eJSTvBcEqd5Zp5OMh7FjtNRyZelSuM+DMqrOZ0Sb1+/ogIvXz6n9yogag02vaI+umiYqNO1EtSlALlujCzLco7sxhRX83GCDXg0wRTr03Dbrb6vKsLi+skNsVZiCJymE33f6yQWAn4z6oCAZ7ff8cPh+2RTJaWSCAaJ+a6n894cwOKZpmU+E7ieQj9smdPMw+mB7bADl8lZo34/qLR1GAaexWekeTpDiGusR6Naubx1h9j7HTe78+Jf7dBzeXkJwHGZYZlVsBUCZwLxf+RrlXP3fc+79x8EKwVPjJ7jMZOmmX6Q4bM6nRJ97AmtSlmVMv3QEaOjJc9xViTKfjPqVO8cx/sjr779luvnV5Tynjfvf4krD1QPsQm/butKbgpBnIk0ilY78ZGN2jyuLjjXn6GT9VZY0epaq8ld5SDWQuzwLuPNebx+d6uV4hS8J8GjKlvxOknXVR5lr8dVbRY0LdzBaeP55svfcPy3DjQX6fueJc189+23XO4vaK4jhJ5v337JP//v/hm+6818qumo1Aal2ucu70GhyKJBJXYday+2W/PRUE2oBAG9DhLVSop0MYUsG5GtsEm99pKTTt7e4GQaNep6hCp/VzAyaKmZXdwo6cBiS7xTW+BSiw5fpTItR3ZowgjR0VqwDupKKSKXa4PoA1N5zZtX/4rd1b+F6y4Jw0DOC2k6yjMRA8mSEELQVFeaOOTNfs9Pf/ZTGvCP/uzP7FDg2O+3lFLposd1SitItdi1Ezzlu45WCpHgiAS+9+mn0t6al2E37ojrrWFW9Ijjdl7YhkDt9WaxXyoYItDIOtEbCcQ6AiN4JKyYv3PQFHIXvflBna6od4FlmugGJa7GKt6hmupIY3BlmRPdKI5jrSKtTkRWNELqeDpw+/4tmDdgPp642O7ZbJR6WluloxG7nqdPu/ODM+cZamPoB5yvZ7xut7vAeU8XA0vKkl/6DpkeM69uP5DmxJOrK7a7HZVGmk50fU8MjpSFQ+63G5XNg+Xr6OZ8f3fHsiQ+efEc30e+/9mn7C92ysK3RarzKpRPWV3Yxciw4Dwu6gRTasEwAVusC3mWIz4EwTmlVHwUjLZWt7pWHxdZr8lMYY7wcDri54knT54pl6tqYS5FksSuH+nd2hCmbpFpWdj0I9kDQW5t5zyXl1d4M4qdTkeeXPdsw8ARPVg5WQ6Y3T8pzcJKtwO9iStA0EEI0XgcSGmh5UTc7ZXt1G/wQd3fXeioJZOXBBupb0rj/HD9/V8rNWsb0DhwPDywiRvoBurYrGayUlJm7Admt0DJRB9Z+h5X8nnBrS3r0GW6/OPpiPeO/WbH3x6PpK/fsVycqMtXxNAgN5rLj4GOrF3r2jBKrZAbc8rkkogEWk3glIYK4VwxG/yKr8iJLm6offRO1QsRXT1f62oQeq2K45Y6bE2Ibfacr5uXPsdQHTRP8Ir+l2N/4d39W9J8xIWRFgVJpmmibrdc7p8RY+Wf/rP/F9PpNd4I7LVlsZaVfFdont4bxsI1+n6rJAOLGHdOCkvxE3ZP+w5QxfAqXliPB+v7qdW6H+0vvJk5fdA1dK1SvTaSXCurCmCxA1dKhaF77Dvpukgrle1my7sP70kln3tlal2E1VVPLQstKDSxFs/QVR7ufk5rHZfP/22y30Hs6EdwMeCrx4+S/KclqQuoyBTXclaDYqu8u71lPh558eIZoRtI6cDhNLO8f8/zZy9wbs3NqqScJZrBEVWDCa4LxOi4f3/SxNkqBWfyM43VS1q4vb/j9v6eT14+pxsGjdReVu85zYoW8KgVzaRoPgS5qYsWrtFC+eq6sRhm52xcrjlzPJ1I9/c8ub62roR6rumkQDTMORvm32yCqQ02WxHYqVSeXj3h+vqGkhNLKYz9yFpSL520U0Cbs6A852gpUVJSbo5DxfZF6qvqRZwtx/mcWBmCLJD3Dwd+/rO/xvvA5h/9IwYqhEBNC7/98kueXF9zc30Dvic6T3GFbL6DYRBvcmPmqtIKLI7QB/abHWWz1UYYOwKOTd8xzzNjF6gOajbuY3UWZ4UQrjd9XrKFoVXGXlI6fKGkAr7ag9JoRSax4lSIFEKgtsycEuN2q1iH9eFsjXme1ToY1iTPJue4C+QWrEq12gIlAUC1RbPUTPSe3bgjZz2Y0UdKs4BIi2YuJRuk5FiWSf4ZSwM9n6sNV+1DpOApqdAiqr10hc78DffHE9++fsUff/Fjhs2G/W6DD+tx6O/nJ7z3bLc7Ukrs9nvu7+7IOfP27VtNKF73Yq6JbEU+Dcc0LZqAnKN4R4iBmALNR7a9qZxcI6XK0AVePh24vf2GMt3TBx28WjQewDdDdeoj8VkEPeVSqcsiItmtC7mgpOC0yYnaccbjGd+jd3d+n6UZHFWxyBbFcmhAEQflkHAFW1xqa2uikRJ9GxSnDujgHc4lWpuJvefu9jV3x/dc7F5Qlokudvzoix/RSqPrPV/+7uf87jd/iW+Z1oI4lGL8Q7PXXg0ywhsX2gixETsz5tp7cLbpuSp+s1jXjSLQV5jJ2X3abBTV1LQu/NVVUgx03kPVXaehSWF4lGZTujxRu90W12DJ1jPiFPnhx5FDS2x3e2qT8rDvpYJyBp225khpIkSHa5qEo19YTr/Et5fE8EOWEvAxknKi9508Mh5SOqqwab/He1XO/tlPfiJBQBfZb7fELpKmCe8C20HpzKXIfe6dQWNOfq/NZkNspUIXOT488Obde/a7LTdXV4/yUC9lTAkQh4HvvfyEd7cfZCZbF6VslZHTwsW4VXjdAC47ycWcooOXRdHGLkbrg7Yz1aoicp4aHS7DzdU1uehBCyFQi7PxrZFdJfhIa5l3795yeHggLZk//cmfKDG0VE4lM8+TzE/BE2PPMAQeTgd+9tOf0TnP02fPeHpzozylZo5q5ygWR4EhEL5hngg1q83HA6dZZUWlFt0IRqg+ffqETz//Ps9vbvR3aea3v/str9+8J6ekCsEQyVGBen4tLEqzKGunYIDTMbPf9dA8LkTSMjEMAyH0imluIkKVXeQoTYmpqSgjqnrFIayk3rYbcDHQWqbiqTWpXCgI3/VebWPeq22wZY3GSh/V5jwMggGSwV190NieXSM2dQhgCqDqK4fpgTQvXF1dQlP+0N3tiZoL11eaJKrh0ctplucmdnQelsWIXOMB1mKpmqEVtc7N80wcOih24qvVzFSSb8/Hhf3FRtxXKtQxEjtNHYfjgZwThyPsL+J6Bv6DvhQJMzCnhefPX/Du3Vv1dgRHK5BqOXcjeDzON+4PD5ymiTiO1FnywjInWuyopmzxfccQHMEtXO4L8/EdUKkl4NpMc0ZGNxGyZ71RKbSaJcrIi/2pP0NHq1+kGlkdvHiV0hSP3axRby17chZr0qqiQJzBWhIAI2iqWqO1QSTOzJnaRAyasnu5tELwDe8sFs855tOJu/v3PHnyGTELy6/e0fUdISz81Z//U1o60Qim2MI2NXClQZP4pBnnYMUY9HFgiJt1YTlv7OvEFbteP6tUXIhmQGxyQjeoJLyL5j8Rx4j105MhRQjNERGk1koxaEkRJM45SirUiqaYppiP5pqFWzY8QcKaVGzoKoAMkK1p8W/VUXMgRHFGIQZO8y23t7/m5eYpKQ1UO0CVkInNW0SNqnCHnKguy1wcFdSYUqLre1pz+BjJs/rVnz57oc+xKf3CRUm8v331mt999SXRBU8rhd12y5xEhjaPiEYHZUmkVujpKRTi0HP9VHpmSmPJC/Np4vLiksubazPdCLPWTizCpAHdZrSUTJF4xVJI+17qptIasSK/hoPQ9WysnjJ6JVBmhPPj/ZlYmqfZSM5MybrwWJSGC57gVsNQow+Ry90O7xU50ltXhW6pNQbEsRlGey88xgH7yDIdefvuvVQg11dnviIEz24z8g/+7B+y3Ww4HI9kUyXd3x2IznN/e8f87CX99UhJmXmegcZo1ZRLEadTqcTomOYT83xid3F5zgMqZA6HA6EL9LHjsJzEhXRRN16uNKeUzcc8LE1AvQ+kXCk5iZQ+CU/fjltyTbjg5KC1SIHOezME6posS2I7BFJKTMeZq8srur6no9oU5pGaUKe6cRwYu44VPY5V0s7VxDgvEyH0dKEnIXI+RP3boe/FM9TCUiv3H+65vrxit9vgXOB4f+D1u/e8ePHsHB2T0nKW/AXv8WMPPlpEgvo0+q7js08/5fLySmmrpbDb7VQg///HV6mJZZoInQx++/1eTnPvGGJkKrq3U1KufxgHrnZblkUb8nKacVVZWrkmclpoQREr9x9+y5vvfob3EwL+PYJGipoiqYKQWtUkiJ6pWqodaB7lvWuz3+9VkbcGeJNhWk1xM2anNbyJq5t1TKxk/wq9qFrXDBUG8rgGzUxlgpjFSeRacUgR1HnH4kcyes0f3r2i+9G/y0whpUIXPMO2529/9Rf83Ze/JLRGLs42o2ZreVWkhXtUaNHsmuDpglJzPZZW7daNMUjZZROEthirmtWWCVnQt16fvlcLvcF7tdrmYS57c6vXGuhco2aJWNbJwsXHe0qTjYS1xYkfaWuUh0UJVZvaokeRIxmqT4ZWdIx9x+2H33C5/4xx88ccl2o5TkVoD9okTvNJDaMeqfBMsYTzpLRwOp1k9Iw61JUsGXkpieA6WirU5rjYbImIl1ZUd9dxc3lpGnzwdhN6U924iknuMsHJcbt2Orvthtk2ixg7xmEgxIjrZGT6cHvPdrvh6vKKZQFK0jhznLg/3DOOG26uL+miwVI+aAOaJuh6XNINepwmbi6vqE6GN+cDP/j+9zk+ecKyZHb7HTlJAeFCYLDXp7iHRmiS4/3xF1/Qx96kgZbG2tQbnGoxNZQauYwS5eHhge1mw5JV0CEorbHmEFcac0q8evMO5+DpzVO6oaeVxg/+6Ac8nCZVh9oiVlPm3YcPUCrPnsn4I5VB4NbSd68ur+w0iiRqOHV2DwOx78jzTJ4XiQJ6EXE+BCiZFkxil6Q+m08TcbuV9jlGet9zbEfA+q9rPmPM6sKNpmRqlFTY9hvuy0HqLufZX+5wUTddjJ0KZErFh54lnUQix0DfDcxVhPVxPjF0yiEqVa+j1ExKVQ+3cRFLKSpAsUa0WhtvXr9jO+zYboLh5Y3L60s2u52MTSg1NOBxwZHIBlVVI/EtrsWJw1L1a2UbOafKutXh+/d8KaVAoYepKNYgzwvZ0oXv7x5ItTCOA1999SXvX7/hydOnfP7JJ+RoMEwq9BGal9fj4XBgu9mSple8ffMzPEc7JVfktsYW5WpRQfWc5ip4URvqml7gmk0yJg/X19luxxpm51ZBkltJVovS0UFZsk4eOQYfFBUuh4UmJXWb6yhQKOL6fLVTfxUh3yog9EGzzonb96/UGojEDi4EyBN//uf/NSXNtJJtu9Lz2Wh22HPne8PBWVVYWqEbOlKRl2HsejngwZRWjw17LSkiKJVFajp7DohOIikPgQJVm0sji1tpgeKbnX0r1UWi3r4a/pIqCOa8QBjpY29ubhSg6mEcBpa0KPfJ2jwkIMhnWMzkaRZEFWlVU1/vEne3f8vn+0+Z/EhzgY7A4hPg2e33OGTi7fqOVHUYramy3WyIfc98mkjlse7AeXUAich24g594ObpM65bVSxHjOowqN6Tk7D7oYqEq97hWzybyZzdROtGEaPw5ylPdF3HYGX2zSyRx9PMNAsqca0xdsF08jMxRk6HI7/5zW94+fwFP/mTP7GTT8XFwMBAnheC9WCP3YolipBKlmZ5SonT8cDT9sQav7SwRJtmXBNG2oLaRmLsFATnRFwrw0j6Yx+0CNHABX14vQvsd3uad/St8r3PPmO32zLPC4stDGtXwDD0nI6TJgwCpSWePnvK/jRJNeIay6zcoM9evjQHtCI8ujBQciKZ6bDrOlx8bP1bb6bYqS51s93RDxuO00mfjXe4oIiBlGbwXr4UnE4wtXJaJoZhpOt7dmbbTynLeBbXPoZgTl7HdJw4HA70LwZ245al6PUly5iqtRGj1+TXR/o+4t1AbtnqZC2W2kcpN1oC51QMEwK1FD48fOBuuaWUzMuXn7IZ5FOhVYqZ1T77/DMKlV/+6pc05/njH/6IfuhoDVIr1Fx4enOtCbUJW25NCrWh65mnmY057QXLaFN8bzHKz58//4M2iPWr6zr1Vs9JcSCzWupi9Pzyb3/JzeUNm+fP2PUbhk8/ZYiRN2/estsrFmRZ7vFhg2viUK6uLqint3z53V9CvVWwWhN3tp5k0dKhE34ttKKU0SWVc8ieKIbwyFWARUyYiMSEHevCy+qXaOsmIs6hNvEm+halO7NuQM59JK985ATXoLr1hdZSsHOWLfLYdK4mxuP0jjTP5NBpXsmZL1//ji+//DWORd9vJH1pVSkCFqG3QkHmGdd/903IgR4GaMWUWZyfHR8Et5Vaycuk64M6RlxTtLnK1RwZiCZx1yVrphqrZh7uiE6KtFrEUygos0LKLH6hjz3Ry/fQqqbCED2xRXIFlyveF+ZZNQOlNGoBF7T5tSKoKwS3br8cHn7Hw+lvGTZ/yuHkmN2Mt3qH6ALDbjxvqjUXxe6M/Rl2DF3kdDwx9J1ZFpoiZ7powiCsObCqo8LlSrXxPFm2/3raaGDKFdP8em1uzRlkZBc+JTUpbfaST9ZsJK+D7X7LxXZrrmUzyxRpp72PfPGjH7PdbmnOka3hyaOwrcN8ZLvZnnHk7Thqojgd6PtRuoZa2G4G9psNzmmsw0Eqi5FyXpI9rw8SgzqcU3OevKP2e/vuXK+55IXqnBm64P7hgRgCw2jmqWp1p0mYcEo6/e6fPKNd6wMqVJMQerAohvXhPTwcSa1wvd/LvdsqD8d7DvcP55+f5pka5DQe+0ER6mHVdSt4sRZNPnHojKQVmZyXrCjgTWQpiT4GKpmSMn7jzkUxp5Mil/fDjgIs+WgjsGpYN7sNu3HUqbFhm1dvPcB2+nb+rCxa+7aj0/tOOUlb7iR9FeEstVGZZ7bDSD/K8b3f7BiGjiVlQjAc/+HA9mLPxW7P3d0dv/jF3xBCxw+//0eUvBZSPSYFhCDgW9JLZ7lVlWHs5Yx2Tu2FtdIHdQK3ZsVN3R82Sawtiav6KtfC6XhSwU0IfP7p52y3G6bTzMXFJZ7GNB1JLpNmndhc14msd4Wh61nm93z17V/i0ytCZ6oxy/5q64KO1Gfra2iUR4Wc/b2FOMtDY2ogb4ejc9QGkItTOVHzHy2kfLSJaE5oDlwVaX2GX50zaNZa71b2F6xjwYP3SNapRUgyVG9cpMqw0nSyQ4VJtmn8xV/8c5bpHa5K5uwJ5Nq0QbSVZDm/WqpTt01tjc1mo3bIVumd8QleacPBN1PvOEptpGXhdFAkeWuJECPjMJKLueA7lYJlCi4LPtc2ocw6mj/nYbXWaFFwkssZ13XiZnJhyTNd63CusVbiOefp4kAtsBQLN0XcXy2KCIoYmW5erFIKWNhq5xPv3/+al5sfMvZPcRRSnkgpU/vIfEoMQ0dxuvfD0EuMUgqlZU6WmtGPA2lZNMEXJRR4GjEO5FYUfNoFou+s+9jyTgIwbEZcjHIYOmc3mnb/6m0MjZ5QlMzqu57eO2pS3klbSaVc1L9qIW3aQLJuqibxmnOVTz55yVqtV2rm4XAkBgvoCsoJCjFySguvXr3i9avX/PhHP2K731NKYdNvGcZe8sa8WHe0Nj0/DAoL80Gub+Mq+q7nNE10fU/wkj92PpBM1nmaFr759is+/+z77LZbSmscDw/s2CrddJ7Z7XbEEHg4HNjttoSuJye17EkT22jRMMeauT8ecc5zdXGJ846HDweCj9xcXZKWibsPHwgh8vTJDRKeB2qd6E3Jg3P0IfDq9bfcXCvEcEqLOqbR51VrZQwdebQFzx6Ww/FI7Ht2F3udiIpqGjvTlKf6GBewunmxFNpkxr7qPNF1ZBJ4yTbPJqF54XhUo5x33qpoBeE1X5mWie040neaKMjq4Jhr4XK3O59CT4vKr97fvmM6nLi6vrGOjcRut+Hz7/0R281ICJ7j6WhGvw1LzhyPD3TdcOZhtlvhw85bbH2uhFDluB4Grq6vdRr9vYiOv5/Adk4TY2uFUhV1UF2lDz3zpPtvnhf67QDHiWk+MW4Vd348TWzGDTEEjsd7NuOIK/d89bu/IJ2+IoZsMKcOah4ZECn59zaDmis5FVqREsw5KPZwVqtcXRf82gzCbfX87oJN3Gree+QjdDrnUSrrjHRtZ+7arsHj9RC8pU1LCp9qU0ex/7WFriZqDTQnscXp4cDt3R3j/oYYA9PhPV9++QtcnSktA5qYW5XZrTZ3hox0lhXfgdN1GdbekZJ1KLGIntVf0UATEY772zvevP6KZVYsyW7TcxoOpDJzffOMod+wGXsLBlQ8TWkNnxyuK8a7CEZaN4rOvq+WhKPTAp8ktMEFgrd5ppnpzntCjJBUZpWzXre3tF7fK76olkoLq4Km0xw1TTy8/5b9zROmXFnmrCDL2cQxsZfs1z6L3Ap4z/H+SKuF7YVyy7pejXbTaTknVF9fj6RJSRD9MBCjCxCEQ8euU8xsa8rjQaSz4AggBEJpTHmWuilEM3w4S7W0yOgumFStcZomhs1gSjKdTh0yxDgHNS3MFhxYqu7XYTOwCb0ljxalLTbonOSgux+Z5Rydd5b5xOFwz36vfobizFiFyKbqIJhhaM1S8cHz5Tff8OTJE148e6ZduBbaWZrr+PzT77HZDKSU2G5H+hDYbAZNBlGLhe8iF1eXRCN8p5JwYaT3UcYyoBr2qEiHyrIspFLouiiFkhO0tNtd0o+qMK1FpTHBR+M91Bb29t17ptPMvE/0fWQ7bCRBrkmJuCiXiqpRleboQqccJTvFH49HYoxsx825Ba3kzN2tNqmb6yd8/c3XnOaJH//oCyMroS4Lk2vMJ/OwDHKdtgYx9lxeXHJ3d8tmt2Xt4R26Xgs0jbuHA9ttYewHKbwsAqZaoOE0L5I0+8rQbeiuB0YrQCm10JrjT378x+x2u3OjYKMR+sAubplPJ3Iu/Oznf0PXd/wH/8H/Um7qpvvAecESXTfSHJYRlXk6SILadX+4wsk5rxReHKfDd0yHE2Pf8atf/xpa4/t/9D1wMNVC6AeV8GxHQRcNTrPBufWOb7/8Genh7+h7KY1KFaxALTKF1kZxKy/QTLX0eJLXNRTuDjqBnnk2vyaaVttgPN4162V2FjCHWZQsAs/+u1ulrk2Tg8gLO1GvoX7rbnEmd1fprL2+1mgIig0+kGzzcM4zTemcW0ZL/Oxv/pL7u7fUsuCj4q4bjtoyrZpzujWUG2WuiBbtmqz5WZbKt+L8aLpptLORlKoq2ZRsKrN1JOdCyoWcCkMPqZjZt0Cx0NCCej3WDhO58FcfiXEJVUrMnDO+q9RU8KFCq/jY2VpoG+ljlonu0SrIuLZKzYoJqqVqfXZRidotQk4cH77l8uaPGNyO1uvQUptQkwa00ui78eOblrYZuX84nDknnEj4GANd3FjAaeXD+w/cHR74kz/+gphq4dV33+Gd4+WLl/IezLMsQyHQLHslg2SOSLFTcyVVEd4d7qyiyDmTJn3IVOi7jpISzTW60GvCwFPJLBbBgVebXK2VeTrxu6++5Mmz53z64qVOgdXJJOXhydMb5ln5J75BWRZ+9+WXAHzxQ3VgJCotaYRsDjpvGfEhUMwP4JwzA6F0+85Ony4G5uORGCLjRjBL7xv3DwdKbVzGkYKiJZzTdIWdglsTkVct8G3oNW5LRZHpQk8XhJPP84nWKkMnrbNzgd3F1jJYMsE7qv2e03yS/NV5QuctLC4QXc8hiXzeDBtKnuU7sekhdr3CyMyXgE0aQ+yMqNQYm9LCzf6K29s7SqlSeoBOns6iBXCqji2VUy3cvf/Aspm5vL6ijzIT3t0fpLAqle+++Y5PPnnJ0KsUpQ89cbP6JtoZ41WMM0xz4v7unu24IYy9xuUqcjaEaD4McxVbEqx3jqurPV3UCXLsBw6He1pe2F5fUvJCtdNozY3NOJCmmX3f0W23uFrYjQOhVVxL2Er7hwwTmry9xBdffvMVv/vyt5ymJ9Aqn33+maYfu9OX00QMF/RxZD4uLGUmLyd6X3j13c94eP83+F4RETJtavEK2g3Itmg3W9GEFxdyrmeuIeChOUXw29daO6oFbC3OahYPbUkKrpiwVV/F5M7KZgv6XTJBUIs6ttv5hQDO+DJn7ERbgWrwLQhCxnEOP7XpgqpNaRg7govUOvGrX/4lcz7QSmYM27Ofyf4lq8kN0195Ps6lcmy6Ad+SNj1khgtGiAtSjlSv+2/odwyx57QsNAepwNgP7MYd262CIqNFX7QGZAX5OW+hmanSArTcoNehwbtGdZLQUwsxdJScpPpqkURhNEsBeKtNrqY8cnS9kAiHDss5FwUkBn/+3PHWuUJinr/hePwG+h9C6Am+0hucXmtlKRlv/M3x/gBOJtmcFpPOBpZ5OUPIEpsoIsd5uLrYax25u7vnV7/8FT/4wQ/sxjEME33owQWqL7z65huOpxMvXzzn8vKarpO6yVUnvqEJa80lMww9Qz+QS9VpzeCYte4x1wRFkJVOoVEu4Zx5++GOf/4v/iU//MEPuNhs2O4uJEOTf5RlTgqp6jtKzfTDwOeffWYkb2TJi51eYOh7wx9nVfv11siWEq1W9hcXkpXmwrxM0FSOdLm/wFvybKoJ7wL92HE6nCi2sDmg1VUV486EnmvCO7/65lu+973P2G22pJSN2HsMFHt6fc2cpcBprZCqppdSsk1bXs14XUfXDbTcSDEzdB1j6HDmVu4sQMytTmcHDaXolpTwXTh7Po4PM6GrRB+lpR50Q/V9z5wWrm6uKCnhauPFJy+V6WRR8c4ZPegdF5ud/t3YSxVSCrU2NrsNwSnz6ZNPXuCDU0qqLTzj0J+jIxIZH4Kl72qifP/uHfX6ks+urwh9h0uJeV5kkOp7pLzKHB4emPPC2A1GcCtttesDzV3wP/33/31qLhwfDiwl8/BwpO96njy5ZowdC81CDW/ovNzpqTRG94cCTvZNVZ/78+fPLRfK8fbtO8ZxQ8mF+4cHnHM8nCbGYaPX6ixIM2Ru3/yK+/e/IXTFpgCnw4H1n0vFJTnmqtBbewHKOZZCRs/mO7yLCspEe12tmePxnmHYK27hrPRZyepVVqp7c+UmvJPQo9qm7IrIctcU3OlcNAhKp3Jn95zpj7BVWr+r+o/EVWndsoBMKTPzfGDYXvP6m7/lw4cvGUMgVU8taqwIxRz45qbGyFttOv68YXV9pIuSCrdWaC7YZis43UfZ/By6P1Oa6MeOVNSZEoIW6YvLHSFatazTyRweBQT+I6o8FS3YbnG4UGlNPezBiUfxpbC0RoyN4ORst/1O78N5QEZR7+36n9eIiPfq2Yi+U3hiq7gaqU73S60nptM3tNM1zQ9cXl3YdGninVzOKrg5J+bTxPX1Fc9fPIfmOB4PgAJWU84GramnZ1oS1xeXeOeJIQT+3X/8j7m5vGSphcPhSOeUbpnnGb/Z0HBM88zth/e8fP6COVkMcnMcpoMynZxj223UMRGCScI04vXjQN8P5Jw45oW8VEJQufzcFLm76Ud8CHz28gX/m//1/4rtZkNeMsfpyH6zowvWnNcqXd9zPB2YTjOXV5dyulqSbXaR4KQG8D7gXSU5mJeJfpAnwvtA7DT2+TV80G2Y54k3H94znU7s9ns1g9UgOV0/sht3ZyzWO5nHWhMUJlORI449Iavf+HB/YL/d4r2SMp3jTEp/uLtlWSbGLhIHdWp43zEMOnkrO0YGlzVXqOZM1w26TWuVc9d8JI5G7EzZ00Qcu75y9+GW0PVc7nZs9zsR19ExOnEJrmlOwDui6wj9OkoXpU02jcbbcSsCsjW6YSQOvXqygcU2gT7o1O6bp+vH9WkgenNbl8p0mnT9rVReiKZj3O750Q9/qHgMBy1nlmXh9va98QtbdtstNAjOcbnf0/cjzmHmvo6aRVzHvseNgYfTkfu7e6pzjJue6FVyX4D3b97Rgte0WCqn45GhG8/prX/vV9Prvr6+xrnGzc0193e3vHzxDO8jv/n133J/UBvfxXbH/cMD3jm2l3tcPvDNd7/l7etf4OJkPN559bAfvy5Q9ZwXReN8Ci95OauURBI71vxgW57tQOS4u/uKT158Cl0vaM+t0IizzUQTY7EQv1y16Xu/egR0P6pbIn70Otvvbaqr6XRdyotxjsXIjFWu66qmGZeTKoBb4Ve/+CnLwwdKnfHmdaAIFlunEN3l623jz6+fBpuuQ8r51fxX6JwDisGM62uTRD5sPJf9Fdvd9hzJMow7bTT2/blCCG3F3s4T9QpPAQpBJcvcWyvEoE2ywpKqpc5qksDCHaMdwtfeDe9sAgwBijbnVpM4BSdpbGueXCA68LHQkNx7OnzDkxf/ANftgHZOaj4eTzw8HHj29Bm5wdX+En/1RMGDzpNM+RVMMeqrJA3VOabTxLMnTxmGUTUMu+2Glivvbj/gHIz9SPTq662tMM8qZ//0k095/uwZ+/1e0igaS5p5/+Ytwzjy5OqpYA4gUSlJ2vvOd2TncKXKu0Bg2zm8i2SvReY4nazZTHn8T2+eanztC/OykHKii51usiry/NWbt7x/95aLt3t++KMf0ve9OICgboGSCw/Tkdh3xNjTdwMxqNt6zXEPXdRI13V0vVRz6f07DocHbm6udaprjwsCVSd1EZWNpSyklNn1I7NJ6IZhJAw9P/nxn1IopCVbrIFusNXwtx03UDIhdhrHqzLpx36gOauL1B1GcJ5jnigpsQu9IgNMiaAgPU0DpTojn3pSy3RBRecABZnNaq1s/VYbOJxhEUOUyaXQe28bkqTHYV0YnEWs2GmWNe+oVKVkut7GZyPGo8Zk75VhP08T0/HI6TRxc33D1ZNrtbnVSqCSs/islTe5v7+T+7RU7u8V0nhzdc2w3Shd2Dlc1cNS0kIqle0wkIFhjJoervX92+2OWtYwvMp+tzWVVaa0iavLS01ErZ7DAf9Hv2xxCj4Qox1gKrjYscwT2/2OruuYpiPb7ZbSsgLu2sSrVz/l62//nCgREM0lsNjqWiqsDtwzxAKuQG6ZlqqZLjmbwmT48utHdP43rcHV9TWXJlbQgvTRW3ArWmVxOE1R2DTwRkaXqmmiVVMIOnEYvjUIhq3bNiEXuNUIgPw6rRIMqjoX7uibCd3I1cUVp+M9f/ebn9OSVDf6KZVS1XnRjFdcD2iCtm2Rdo2lZeLY6y43HtDjaP7ROe68O/dqeKcsKR875RtVdxZbYFlM58j0ymPkh3NaJOxA6oFqyj5tqoFWReC5oNftnKO28Ej6t0BbvSUOYt9pE81F6dKxoywzS8l09PS9OEOQjH3JC51r4OXtmI/vmI9fs7m8YkoF77tzxfSqQgtRqQ59iJTaWJaZOSfSsjA4BGVHQU/pdMJ7zzSdOB0euHp6TYyx47gcFVdbdGJeT3NjtxVm7xpj15FCYDJfgKsikj//5DNhnK3pprCdrzRFY4sMl4IitqZ4Cxdw3tG7jkJREU3UYpGWTOjU2hSDV2Bas0RW72m+MXQ9T5/eYIymSE17WGqF6oVHppLoWiB45TxJ+u8pwasycpXraWomho7PX37K06sb+qFnNm7GOVTrGQJxGASZZXXX7ocNoQt89c03dF3PJy92LCkRQ1R945Ik6ewCHnjz9j3XVxc4HK9fv7XFK7KkhdBp0e1jh050E52ZGvs+0DqFIIb2GDPQqtybrkqxFUNkSjN3Hz7Q9wMXF5dnOKwPHcVZYUqR07tVI7DsRjwuBx5ubxl3Wy43e+6nI9V5wYqtUb3k0nUlJZtOm3lZYNgotAyPi8ZlFYWotdoYYk9/2VHKOz0QIZwjXRbzZ6irRJ/7brsDF+i7aN3ZheYqnVORUD2fnQUBNt9oXuGQOIeLgfHiQn4GU8FQCiEO3B9ucUPHjd03zSCr1SPzB2FO6zpSJcHNJXO4vyfGyPXNFfd39+x2W2iV64sLak28e/U3fPl3f4Fzk5Jim7iV5hq1qMLV2UGmtGJTriO3RE2ZVvLKEdOcdRuALYLWJmmL5bl6N/acz75NK98aEujWxY5mHQru/OaaEbO1tPOiXFtBoflZwXs8chDOILKVmPXVwgNpFKfCHV8V/6LF3ONd4be/+yXv3/1Wah/sRP4RrNPcSjD7/8EHU1vAo9y5dYNwzrwh9p6dFz8avMc3dZoQejEbrWJJ9Kyd4PBoQFx9HqoutnDDoJih6lSnIGmqF8Hs5GYIZn51tqmU4s5hfqvSEzADoQQG2XLwCI6yeL783Vd8+snnXFxutaHXimemlZ7WIpWM943j4UuGyy+gBJbpJEXS0PPk+RPqonUzEljSDA2tT86zubwkuECjqTXRNfrBEAbfcTpmdWM3Glf7Pc+fPmW7GXk4HsnLQsvNsltMCx/U1hacSrWzBebN1kVQSjV3axNDb9fBVVPorFI2pMJoVZknFUVeO6e+gWIL2NrctOKk1W6c6DtarQyh58nVDS8+/YRx2JxlekoB1ch2c3XNxf5Smfg0UlYCZ3CSkjonKWCthXmerLtA+TGtWYuaDwQ8Q9A1WF8/iL85TEfSlHj57AWfPH+Op/Hh7gNff/stD/cHCF5tVUmqif3Fls1mw4e7O8VvdB0uenbbLdtB0kilbjaW00yqSm7tTHIavBI9a5EvgCZYLVdNAVKjFWIvddicFg6nI8Fr4Y0hMvievh9Y8sRxnmQecg7nPfPJTjE+sjTxS30fcaVZiGCjukZdTJJZjbPwillRrtLA0A36mdhTa5DlvKgEaDNuzvBDroXTfKJW8FYTm3MhN+itnEXTQrLOAsfqjQDs85aLu9VC39nn1kW6oHtHvga4u7+n1cLFxQUPt3e8fveaLojfUm3jfP65f8iXc7DdjipAonGxv8A56KIUXKXNeCc+5uH2a/7u1/8Nvk16XyHhbFHR/VRYoZ1aRKTLGFrNb7A2SEvB5Fchjy2dzXwVwavI3iMTl5zZjwvTusmsX8UgJXELeg2r+W39+R/PVuuifa7Xbka+0lhP85JMC77ARULrZPgqC7UmcXuhcTq95le/+AtKPtoG9/ga2zr92G9//B3r9KL8t+jXbK8MHwFuH8UVGixl3iIspsRyn4JTQ50KyPSjXXv8166imAyDgalqVqSJqMZqRVuDWiDb358zs6q54bMOEq2JcNcxRwGJ+v1CFXAytX319Zf865/+S968+8DKv0jRZQcZBO1Pp3eUfEfXD9ROfoi8JFxBKbE+nGP6mxdy0+yAJZlKJTdLmmiVh4cHWms8ffZEm/1pnqitEfGkXHj75jX3x4P+ueXvr/+jsC7hXt3Y0290qo6xJwRPqdowXFNonIptDEpZG7Scw/tIC4HqPBQ5z0tT1kkIkSXNItAtbtyxdmwv0vSnROgC+6sLxs2G1DKnycw33ukNx8jQd7ZpNXofNR5X4bwpJZxr+CBzTU7KL7m7v+NXv/41r96+MfJKP696z9CpCMc3yWu/+c2X/Mv/9r/nN7/9HeNuy2mauDs+8PVXX/Htt1/y9Xff4iqM2y0herq+YzfuoDl2+x1//MWPdfNa/ar38pKSdQocd1tCkdHL2x24mqlwKLiw00nFY3K61hjHnr4f2W63dLbI4pzSdY8PzGlimSeTfUZFjDtHrombmxueXD8hek/vAh2KsfBdwA9RMAEe30eTT0o+Nw49azvaunmBFGXRrZr9xocPtwrD845lmslFk2prjn4YdKqZ1N28HQaa18nH99FKe0TIYjEbAU8ulgZUNFeEQcVULatnJC8zX375W5k+O88pL5Tg+fDhjtPDbCZPmSqpv+9w/nu/nCPGgXHsubq+Ydhu5Jh1jtDJ90PXePvqV/z65/+MUj8Q+4L3xaA4ncpzSZxPVm0lNbUmtpLwqzrJy9jmvDv7mqTstTid5gUZlbVKdF3418V8/Tlr6unjoizeYV1/BdpgaarrCV6yWb82WpBto2+2SJa2Rt1IOks1KA55HVYIrTTHZnfBh7df89Xv/gZPpJkSx+yD8j21dt441qqqddPQBKb34JsR5jZBrXbAdQJqYAeJdJb9Kr1WiQRrzJJzuqeqs95rrKCo5d/bKB2C53wTzFho1uq55mi1M+xKg+aUPrDkRGqZ3ETMr/5ao5wARxcDm9Dxk5/8Q374o58QYiAtawSKakzPhVDV09ID08NXOGAYB6pZBpwXFPb+/TvevH6vV10r83zUvVZUgFRzYoiRVDU5rJEzFXh4OODv3t/x3evXCvHrRfq22gR5OAWUTbYAq8tAxiuNjFXkcFCch3eeOS3c3t0CjjEOrPWWKgoSTleK7N5N8il5Kkqh9x0Pp4m37z9w9/AgOKFYwmTwVjRUOS2z/rxxPhkEvMV+9AQXWIoSEFvjnHU0dD2hD6aEksFKqQRNdZi9TCjb3Y6L7cY6npUgOh8O3N7fM88zLnqWmuk2A5998im73Q5nUk3vPU+un3B1cSU1VlpoVZ3hlcZpOpJqprd4cix+ozZrqHKOlBOtWpSFt+KRebbo78cFTOCCokWqPV6lqq6x7yNd19HHjv1G1Z4pZW4/3PLd19/y9sM7lmmmC4K2apXqyXtP6BTRfZ4kMQgoKM48lyxna/Bn78XQdXQhcrHdPqqtanuU4vnGfr/j6ZMbab9rphQVpbRc2W83QON4nEizgvoayiQaB3k8bm5u2PQDacn2YDWbtEzhpT5VliVxf3ggZ3EQ79694+H+HhccT29udM96+KMffJ+r6ytqzlpk66Ms+A/9klTUM/YjXd8JbhoCtc4UKmO34fbt3/Hzn/9nzOkVQxS4487wTxEmDpZg8NGnmys1azmuzmATi8SR416nxI8TXNNa7OTD772+latYQ/HWTCs+WkilGLAVi8fYjWbqNng8yTuH3WvYEdr8Fu7R7NbMBV9qppTFWgQN18cxbrZ88813PNzd4uz3+fpxxhK0j6n48+RSzrxia83EFo9d9nKAN+Mj6jnvyRnL7ew9rwHppckfQS3nTc43bWxrRer6Sor9Odh1/WicU/T4CpM1iuNcSsZH3E1akm0i64T3CHeGEPT5Bs/FxZ5+UFKD0mk7PNE2wHr+PAMwffgaX+/xWX0avouqY3CNkvWe5lnr5rMnT9VClxdyUV5U805FZIAzA/Dh/mBwdgwmYazE2PPJ55/SucCSE8O4wbmiKOKmInAshwSELRZU4hG6SEozNWX6OLDf7sg5MacFTJ0R/Ih3TnlBOTP0AJGH0wFX1IIFlWEcGbYbMNNbBdtMRLpEby1OKeFiIBdNDsEigYNzDJvt2dSzlhQ93N8zbrQJdFFyzOW4MA4947ghl8LNk2tubq5JKanb2nuGoefhdKBNmj66rmfoOn74/R9YzovC/TbjQGsDlz/am+t2Jna9gsMaNIPk+tDhOid+Z30CmqSRqdRzX6//6GEfhoE1PTWlxLIs7Pd75rRYkJ/ynnwXeVhb7kpRAUnTaaaUzDCOxC6wGbe4qHrTCpxOUpHFrqPm5ayXF4giw1CzyWGZJrA/K63gWrRRXJpyb1zMh9sPxD4yjhuiKdM2mw1LWqw+ceQ4HRk76dNfv33D3/z8b/jjL77g2XbDNE0W1Nhz7iFzympa5iwTYq/qW2diiyVUegIXuwsIkObFugq+IKXE6TBxc3OtA0IzWNMJipxSph8KblXX2Ofy9/ET3qkjfTpNuNbYbbZM85EBz2H6jp//6/+Uurxh14kTciZ7hIJvHk8je2Harq4+BL3jQFUsRWvWuwIyNpuSqWkDd61YQoImLW/qsVot/n0VX7AGWhYeAw1X9B9wj0SxeitWSYMW1doaXprYM+zakGx25XMa+qybyU1Lk9lPgase53pantkMI69ff6tp3zah5rVRVNaRhrPZT8Op04bJCixV+XT8Y55UddX+PpgIwe4dL3K5ukaogs0qQQdjv84JVuW6Lvyu0ao/b67rd0mRdgbn9P3OYMAof0hnOUYNxWuou5rzZqUOFV3B9Vo6F2yz1baU5kw/al10HlyVOs3ZulY8uNCR8x1leUVqkRgHXKdY8tev39ANG/VIRPVLUCplSeL1nJMVIYsPaVU9NH1QEsO4G4nPnzyVKc57SmhqObLdcfU1dLGna45mZo/B93inD32IvULqLIlCKpvCMi/Ms4WqOZEmIn8cvlS8Nbv50pht0RlK5mKzp1LZ73csOZ+dzEqWbBQL5QrOnzNYSsmEjcPRCULpO9swJAsMMTCnZG5E4eveJLXQ6LtBN0kp+vchmAwNanTEoePp9TXns02tpmkW9NK8dnZxo42SqlWadsTgoMnT0Pc9+508BktKdD6eb7beK1BsKYkh9oILTJ673ljembEHqZmcg84URjUE8GoE3HaDDGfTTO2UBtmqsm28GQZxTlJmq5/1wJQWttbNu8r0prTIlFcbrSjvyI8jrRRCHzXmYwuEc+QKKSdO84nY9wxxUBKmd9Qkp6z3nqEfTRGi+y3nwv3tPaANMefMdrtlWRIpa8o9Ho/MKXG5u6Ab1CFNU+KliFqT28Yo70CFVAqb/ZauH0X6BiNB7QQ3l8LpNHG5V5LtvCS6cWPKFP8HEdhadD2XF5cMseP+/gO//cWv6OKBX/7iP6dMrywpt4Ev4OSmp6xGtWqfq51+m+4hhcLpLpafzQhnh3B+I7qjCyQeuQa9nnxe2B5NaO7x9zhNsmfRbMMIWN3DrqmzYl0a3TodGKSEf/x9IlXtd9g9qo0NnaBbpaQKLVFrpDQpCl0pvPr6d+fv04ylhALXHi+8q5wVVs5pgtJkpINMsGiY9bNaPSfnO9NL8NGo5Ib1069O8wr0rFWjAW/rjSL3hbTp965LulRDouRrqzZNwDmevKFdZOVTgQ6FSvrQnRs9WzPYr0Fr4SwGWSfaXAqvXr/j5vopMSZcFwlOycner02SiPPNiWV5z+7yh6Sqz7w66GKHq4VlmgkXW6aHkzazqMSAaZlIcwKEHimBQfzkMAxM00RsYlrIAaaHA3f3dzx//oztsOWUrMLTFqt5XpjzwuV2J/y3qLgmmTmui5HovZTItbCLW2LsWJaZ06Kso1ZtM8FxbCI6CZ5nV1fqavWZzul0FlGLVjNs1QHd2Ouhcg6XC32IHBbFWbve0UpjsmkjxoAzEjOOHaf7B07HB+Yp0A8Dfd+x26nB6Xg6KlUTjfXR3rM2vEx1SljMFqeRShHU4jwuOkrR7661Ms2TEVEeX3rlyFgyZymCR7I5xpeiEX6InZrgTBJ6PB3pfafoC7sxSy1k26CaBX+dlUumnHDO0XcdtTVSUXSFy4pm8DHQDzKlFSpd18nxHDzd/opSCqd5pjXFLHscqwa4FCPsqjJgvIG4tWgTnpaZoRtErNdGjB3bYcD5jsPDHSHopru7v2O/2+P7QF4Wtdh1kZwXnj9/zqeffmJ9CBrrD6cj7VjouoHdZsNgUBrOMwxW/WgLxcO7t8xz4vvf+xzA2t5UEuRRkGW04L9mfMAYrRqTRptnam3sdzvp3f/AL30OgsX66Hnz5ju++ubnHD/8DOobxijHb42F1uTuF++o56RWO7nWZoevjxzVVtZTG5aPZKX2Z7I5nIGhxir0eDyxrhEdH+92K/JRDK4Rvr7+ZzkvhutJObh1inO4KgWjgfqsJs7zAmr/jtpIdbGfp8MaxRzcxdGHgTfvXnM8nnDBFtYqXtJlcR11HXDcOsd4k26velK9a0f8SM6r9xKcOBuap1UvgYBzOG9dYs5O5AT9fhf4iDbXb2gG89mmZCQl1ApB6qaP4d/z9T1fP2XYea9GxuCk9PJenMcjRKZIeI+6PVJVOGkXRn72V9/xwx90PH32Ix3e7ZDQqKiH/JH3SPlIN0ZOd5Pu51bZ7jbk2khzYlPU3hmc4+7unngZ8Gaq2262DH3PUjJxECpTa5EgYz5J2lmXbJk+HYHAssxoz8Y6hEUKX2129gBm7ZY25hOU95SaMoOqA4JTM9tXX7PMs/BurwjinBOjj+w3GzZ9x2meqHaKDz5SctGNXDTQHY5H5tOMRx6IvCScg3HcsO16dsOI956+6xhiR2pZTWEelirC+9PPPmW3v+DrV9/x/vVbLrYXeu+u0lmz2Ot3b3j77h3DqOpSbXCTIjH6qM5r53SiDjIerWPuUhcajWiO8y52CMYXftlwzMvCcZ4tF6spXbI2ka8fpWqO/UA/aKE+nI4mDe4YO3Eb8zyd4YRlXoy0D6SiUA3vHEPs6TolQAIc5yNLK5Yu6um8OIZSKjkv5FbIy8Iyzfzql7/m1es3bDdb1Ye2evZtdF0nG39T0m2z09OKfXd9pPOBh4cHPty9Vbx4lgLOhci8zLb5PJoBFQ2w+i6KyqMMgqOqVSuVzPZiZ6fVR1WQR8TlZtzimwp01HAXrB5W4I1zsBRVuk7TkePxHhxMpxPzNPPV11/y9u1rS8htf88UsZ7OITiR6j6IqPUcCHxJa98Re5NO2klVB2stsq5Gw5RFkHonOXctMzknal0sfwvBSusivEY52JcCGR8d0+vXuRfCreqgdn5fHy9t50WtfrxInoX9NJeNu1sjO+xjavl8ml9RAr0eSHnWfVPFk5Ui93AyL0oqhbevvqIy6cwfLVUYKGGdAtZX5k0UYZLWJvx/3bz68exlRk0XkdYCFmmN803wm4uE9njCd7Wd130oeBp4eX5q1XrmKZyTEkzU4E02v45SzaDk9bMomHLTYl6UFiv7m3OSNmsYUy3r6nw3PELoifPEfmC/f8IvfvkN96eFNE3oiVtJ+fVwoMnn/u6Omo5kZE/oUdwGpdrBqjGOWidTSjw8POCiY7/fkVvh4XRkOp5UmOS9uoScw885M+UFHwPX19c8ubnRKa8JPvFjT/Vwf3/Uybm3+j+vTKRWskx0VZ9JzgmCx/vAsihC/Prqipubm/N5x4G1wilTaTtu6HzUZtMaS8ksNfNwOvLm3TvmZebVm9f8za9/Qc4L/TAyjiMxCjsehoGu789NVCF4i7UWj+Ga47TM9JuR62dP+JMvfsyn3/uM0EcFytXCZhx1cjWCWouXegMudztNI86fVSUi4TXup6oioiH24BwBlaX7zogx9elRqExWptJo8m84b8UkUhEp0z4oqqQLBB/Yb3fnmHaCGrU6Ly5nnmZ8F8g5s2SL6bDo5BW+wGG9EerTFjIkY9S68HR9j/eOzW7L0A9cXOx5+uyJHhg0/YSgNrxGY1oWmR+dIpN184EzhcdSFgiO7bjhcrdnv98ToqfvI2/evKG1xnazFfmclnMJSkqZJS1421gvdluePLmRo/n+gYe7ey1c2YrqVyVLbVxc7Pnkk5eCEp0IzXEcmU8nKZvQiF1a5ac//Wv+9V/9a3JSP8bd7XvmNNOFyDQdmC1C+f/31yNmjpf3wnvPb3/75/yX//Q/5HD7d/RRURaCTwx+cYEmMTy1KdwuNzloS6kUE2Ws5Gxr1SSqGPxRz/j1WqjTVoOoroxh/M7MbdWWzsdF5fHLYJQVllr/un3ks8CZBPSR6F5/n2/ipM6LVpOcuZSFnBdKWjR5lsdColYV7V1S4u70YAS+Ve0ak7D+rmYLzfp++Ojkvl4DaGpT9GsFgK7tmkd1nrG0kp9fq65H4BFEaudyoHPSrHM0iyApduJfyfLzcGYQMx7qeWuzWKNV7mq8jp4Pqc/EPTR7nd72HBHGhSpZry988acvITTevTmSi57FVqRMOl8LsUCkhwdOx/fytK0HiYatszrYK1bFc3VzzThs6LwCRvOSGLqey8tLcRQOGQsBP44bcMKzu+1IN/R4HwhDh7PCGuccxVWmllnyTAuObtwQei2kQ9fhu8iyLLx585acdHOWkvAx8PTJE/rQSXHkLJTLCLr15sY1Yh+1AdVCnrVQbKya8urqiqdPnhuOrZ1brkjTK9cM3jBe1yTR7Qe22x37/Y6WK9M007nI1dUlu82WPC+M40AMyi5xVRCEM++E+IeG7yKhjyT7M+fl6o5dYNOPBCdCpnno+44P9/d8+buvzPAFm9ijwqfAfrcj2iQlM5W8AdFrEe6GnjUriSp1VAj6Pc3D/Ydb3rx9B8Fxsd3T9VIwhRBopeg5CqadMfWUVGnhnKobvIqVvDFk66EouEA0o97TZ0/pQtRp3klBczwcNT3kbPBcUT2inUyOk4qVikW2U/M5GrxWxSEHFxiGUe73Wjmdjtze33F8UI5MjEHTWvTUpFN0F9dKSvkNOhfpzJzomk0SXpp5HzvWqHPX3JmgXifSGEXAX15fEGJknhZCcMzTwnbcMu42KNTtDAr9vV/mjebVt7/gv/ov/kPu3v+M6LItdloCnC+6R1vRRtoy6zTinHKAcpqln19x7XWaqRlatW5nBy7gzssgH20Q6+xvjxTWr9zWDeCR+1ifG0li7b5uHy08DYNoxAdYLy2VcuYLJBN1tCK/TGmCJFNeyEmwZc3W7lYdLaGSpSIBitYwr8Mchic7j6+PUI0zaGuFxdx5ZlgnI5H7CqNcN0PT+rlCI4uIr9nu89XPpedcyq01Wt0+j4YZ3+w6ulUZpQ1Evoe6pnfo7+0ZkrdjVXPG9YUaz/soB3atPUpx7QNafSC+OSyglicvdzjv+Kt/9bcssyc4+U0kDiici7lapvmZ0+kt+MZ0mjgtOqj5rmPcqeJg7V0ZYmSz3VCd4PEQvB28A0PszbgpKDmWmoQ7+Xh23q7tb61Wpjmx3W55+uQpp+kkLsJKfDZBLHpuCsDqezHipSQCI32viHDamlvfCE2kaTWoggY1qcd1GBQ3Xqx3tjNFT+cDvTXegeCROc10LRLCcMYhIyIac63cvn7Nd7Xw5PopT26ecHl5ac7KxuHhwDSf2I1brsbRFFviQT57+ZJ5loww18rxeGCzGZVvU6G4ZmUtumlC8IRm8QG5Qic/xb3BUB6F3JUmh3P0jvfv3wrCM8KvoWBE54DsCPHRWeqcVC+hj9Q5M+X0WCcbPYol1sN0Ohy5Pzxwsdur6NzG6VIK+MZm2JxzgJRnv56csD+vZBrv37233uadZU/pIQ0WERC7jqvLS4JNbYfTrEXeO8a+N+NflOdlURTIZitieNMPfPrpJyxLUsXi0LPcT8TNhs1mY4cHqWOwE41rjS5EPnn+gmh67uBkiErTpOiQreK/p2li6EeGToVHKwQi+KYn50oIkR9/8QUpZYIXpBU7ncBbLgIMykJrHash6t/8elxsRRh889Vf8p/8x/873nz3U7ZRCT/NC4tvbvVEPG47azyIr0ZcZsFiOSdVfraie+px2RaR7KI5b53NB+vUYHr8x61Dz8V5E5Ge/zGyo5xhKIkn1nTRav+2anH/H0BY8Vz7+wj2Nds4Kjk70jTTWmBVT5Vqks8cqMWRl8I8N2KPIKTOUU3TL4VTUDGZmcbaR4qjcCakHxdvqbeqndBty/Zym9sCxDoFCGpLlCYPUKVQq/wZ3iI5is0CuRWCZZzpM2t8LAirzgnKsirjNe1Wk5bBg+eJCNbwveD4CM7ydsSohiXq0LE6uodYePnimp//9BXffXNgt3+G9w23TpoALli+1QzLA6OvuJsb0nKkpqxpYtufE33PPSLe8d03r6itsBm3bDZbutgxrwfYos6S2I8bvaAixhz0UKbTxCkt1FLoY6DreqIx/K0Wpmlic9GfR1Vqo+96Xrx8oRuabFknZjoxvX3Dkiydh1TxweH6Tqdg1+i84idKaaj0ZlCkRtXJWQfsyjhsFYZnRJvypAqhKaOk1sbthztFaN9c4Zrn7v0dwTtubm54dvPE4kJgzsK3u3Hgk08/ZVoW5uNRpP1mhNbEgxRBNsMwnBU4KvPQgpVrhuy4vLzkYn+BDzAtmoicQ9EVMTCOavDzzRP6jrIsTNOJ3Xan4K36GLveXCU3R52VhfX0+kabUxegyBWusMHEV999R1om9l/8mC4EDg8Hsoe8TAybkXG3V7FJQVJD4U4aRZtqQpdlYU4L3/vsM4t7F9yR54nOdxxOJ/b73fnE25zndDpxOJ34/NNPGYaBJQtm9DaCex+EqbtHiCR44boKb4xnNVWtleAEZZaqovdUBRUdjyfm08Tz589pQc7yN2/fcHVzTVd6nE00MnxVFUBFg8nGwXpCNEnM84LDMdWFy3FguxnxXcR1nuPdgUNc2G53/+bWwO9vGI1aFn73m/+O//Q//t9z+/av2Zm02pHVasa60D1GL5zff4WlLbRaZFzNggOLQTmP8A+sRjs9b4H60eJjAMlHi6da0j6eg1bfnHjXlc9YJwuT1rp25m4d4cxdNCBo7BcEzSPFqy/jLpojt0nx+M7MeFRaVRlpBZbcmLPMj330xBDxzX/0WhqrIaJRbJNffRr8HscCldh5PV+t0VqiuR6cElmrrQePEfOWoWYTXqWJG/tIo9DMhd0MalsPSDaUnwnuNVTTrZs3nhY+Zsn0Vn4v28pCE/Hho43AwhWL+TlaffQ91YqPnp/82R/x7atb/tWf/5ztLvDZ59c41wOZWmQIji5Q3ImH02ueuUbfefpup3UxZeOHKn0IMkCi5/+zl5/oIN53SmeuheU0qa8neOpS8M4Mca1WWl5DyBzTNDM4z/XVJV2nOOvgPF0UNt+ZGxrD8ADzJIAzk02z3QqLxShV4XaO1VshO3zNheM0aXddYYmgsvk17wTn6PoocsuHc0+t3er6QHLjOJ+E/S8TpRTGcWS33TNPJ24/vOfh7oFWqmKtYwfB0/tOvggjgPsYuX2443Q6cbm/YCkZgtJsnZ1Igkk3XZMDu9ZHt3FzqiWcpokh9udMIp0wTLKG53B8wNVC7AKX11f44FVIlDUm5pTJczY+wKvkqVYR2bOyVlKeeTgdoDVefvaSH37xBeN+qyiGWvGl0o8bQvBMy8ycFnLLZyPeOuXFpoTKkhI319cEa98rRfWauZUzx7AuTt55qIWL3Y6XL1/IpVkrVNhudwzjKBjq4V5R7I4z9ONRR0iaZ5Ux0YRd2+J3SjOpZpXj4Ohj5M27d9wdHwhRWfz3x4Ni1Uu1KJmse7OTBLobde3HqC6OVhtULZSKxFcHxXpW70Nknk6kmkwt9kgOf7SMnBffkmd+8fP/kv/4//y/5f7dLxmDI3hBOWtQoP+9f6EYGH8+3QoGqVmRIikrVsQJ4/s93H39EjTSzoRxOyfHfQTDWMpqNcL4fJI1qMHZ7z/vMeavaAU+8juf8XyPFk3F0Nd/wwFtT2BdzZMO5RF4WhN5q8geSFWHmeMs1VlnRsDqtAeu/iCRufr/vU3pAUmzeeSdtcytPMU6GTVJ1zEy+HwFV5PeqiYrBRkAvV1Xzv+55mH5j7gJTSxKCnD+o4Qrp1RVhU1isJH9bKpt6o2cV+OcNQca1K7cr0orhVIUzZ9TopRkOVmwvwz8O//O92n5yF/8xV+Zv8LRml3n6ikIOkvLgVIe7HCuBAG8J8+JUm36carGLVjKRZRJuTalaow7FbpFLx9SbD6wtKLcpJJsu7RvGEZiWNNX67mprrVmUkoVD1EbyzzT7XZSDwcPJeObJ3bKWsJ5si84JG1bjWql6SJthw00VKHpzfELZGuMS7WwGQZqeVygq6XRtlLlBXCNUD2bYcMPvv8DSs48efKU6OD64oJtL9nrOGyMaBOBFGLFV/j622949slLogtc7i544EG/I9nGNvRs9iJbT8us5EyDglz1dAb71KTFKjnUc+3UFZtzZk6TPmDT8Qsey3Su45iTFkXfUxb5PSpSYfgQzieVTdio7zrJme1qoVTHfrMjt6rd3yteuwG+l8M5Zy34D8cTtSpDaR2nmwdfKk+ePFMvdCm2OXZEHDvrkAhRZp9YNTbHEJmmBLYYOZzh/o5cK9thpPa9MqlalSACqMHOv2F9wBzZVX22zpHnhe0wKnsGR04LT2+uuXpyQxcjuWQ225Gr8Uqf/9oNWTOHwz2XV5dgZqVSEpGOLnhO00npuF1P6NRJ7Y3ET5YbRoWb645W7XlY4yKMvKwOSjrx13/x/+Sf/if/B1L6RkVOzRZxg2Jyy/hmTurmDIPPKnWymJmaqn6nxa6vjt11EdSp2J2lj5DthOrACb6gmnqLVTFjTXXWhWLCWYp7hEBqyx9xGuvmsM4Nes5FE6x8RLVF76OwP1fPLuja1o2i4lynU/06zTRPXZr1y2RKgaFbNxrLS2q2UZxhVv1hdQ3fdP3FT2CThqOtpkFfaeqhtB+ic7LMHOXMp6yek+YFlzUfV9yQM3qIFTvaGWr90mamZ9mvReLYZuYev/Ws/KIRcsEPAdWuVqje0psrBUcwxGDltNS+KGFDrVVV0QjSffb8gn/n3/sxQ4w4rzorWjMpr65aqR3NzeTlgcAVxXO+Z7NtACABTc2ZUrUhxnE8J9Y2KtEmHYfDuUKUY9Z2PadIiM4FQQpOhFRuld4udM4V3wUpm6icHh4oJWs00e1CaJ7D4chhXvjk+QsFv9EUh+ElZzzNE+OgF9cNgzJovIwvpqngcDzw6s1rttuRT569ZHWMOi/YK4RIXWZ1YHeR0BzbzUhrMo4NnchrT2McRi73O6lbXKMUyU5jCOQs/fDLT15qiomRmyfXZJsG1qiDdCpcbHeSq9p7SqVwOfTUjrM5L9hmQeqYjic24wAxsCwLx+OBy4sLigMfHMuy8OrNdzx99gLvRB611sgtCd93wUrtZecPQacZ6dALMXhK0WRwmheRT33k9HCgi4oh9sDhdGQ6Hnn54iUX2/15ynHeU6ynIm/0EOQs4cF+uxO5PE+qIQ1Rm17TQ5OrZXTVTDbb/5p2O8+LSkz6jrYkpfgGmebk7teEmKZZU5IZ4rCUzYvdXgt0qeQizmq/2xG8Y0mK8+iGXuqq6Ei1EXyTIXFRz7SzRbfWhlOwMfcfbmnAZ59+xrzM+JzAZIGv3r4npYUf/uiPqUVmphATjzIWLcRl+sCf/7f/V/4///n/iVbuFW3iJKhw1YLb3EoMr4uyAtQmOzmWknX4qMqmKm3ta14XrRUQUFZTKe0MXan6V3CVuIp1gXfmgHdnNVVrBcwUaMgNpWZzMK9sh5EX66aByFMAF8IjjGWr4NmlUD96vbWR2iyCuOmaNduBqk0tuWTmuUjE0Q96TQE5moPpfOo6qeiUvzpmqvER6ytphox1H3EmZ+hbn5J4kjNMZa9TGh1ya/S2+LtWoK2Njqa3MgpDU8X6QvPjLrAu0FU/U8iJ3nVr4kOKa7iczeynnxuczWgGNcnHoU2rlqrJxiYgyaUztTn6biRwVGICkZKT+BCbDhrgvVKXl/menO4h9gzDALURhg5K1ZrhPMV5SsvK1Jv1DK6Jkc7WsWzIR8SBd4EwRFMiNJNA6UZT1zLgHW9fv+Gr777m08+/z7Oba5GfwVNK4+nFFad5FtU2jDTv+earr+hiZLfZU2s+55LgnEht55hzpneOGjxp1ilpu9nhg2O3VUTu6ThBFOq6piiGEJjSTOwCfacLUbwcyMuycDqduLq8oNv01AzLcsIxMG5Gg3sqbHtahthF+i7CxZ5WGvcPDyxpUUdFSnz19df867/6S26ePuV/8U/+icxxQ6cCn1JIWTryPnhykWJhXiZqhePxQAiei2HDOKrrONcq6MhB10Wurq5kHvSBSqCUxDzNnO6PPH/5Eo/ju3ev+fD+A59/9imhC8qO6jrWyJNUCl3whOhxBtlV13BBm1OMge1eHgNJUXtKKUSnZrm7w526MILgv9Iax/lIWbKKdZogDm95TK3Kte6jPBPpcMQP7iOpZVNzHh1/+3e/IcbIH//oR3TO0fqOlFQolZdE6CLbQeUnc1voi8WPTJOguqE36EYenOYsirk0itemrGbEQhy02ZwOR8ZhOPMBLSd83wsCK1kQGzI3nSa5+A+HA1vLnjodH3ChEOIlMZhCqGXu777mX/yX/xF//a/+c7p2T4j1rCSzSgfI1jdwhnnWDctiwAuUXIUBZ2HFkUDxynHS87auFAje+Gj9c659xEF8BBvZAuTlvKOhlNKIQjQbdvJvH62C9u/OTXP2VTFj3roYtqbNBs1VxbT56z8pJNZa1daKTrpVJ+5SMrmiyuOkbp3gw1k9hVNR1eq1UO/H40YllGk1QD7KYD1A7AhufT165euFkifk98utVml1sI1DEmUbZez7vGu0tpYkqYmPlVdtDaotyrZ9aYIMnDOdnD9360jwYteyFmq1kNDzpqZ/JZS2KSUXTYZpKeL+sid2G969+8C33x24eXqBC47BeaXQ1ipe1Dl8SzwcPuDCDcOuIzjH0aTdrQGpkLuGM1VZcBb9D+q0cI7s5eMoKYteiEElF61BFzqduJpjmWe7YJ6+k1los98R3/UspxPu5vpMrI3DSMnCz7quo1qpzp/9g39INIVGprFMM66LGnFiZze4Ln4XO6iL6XMtqC46vve970kSuyRddCp5Sez3l3x4944Q4NnNE1xwdDGetb3b7ZbTcSalt6ztcZtxVPZQEZnchw6l3arzYYgDofOkeeLtm7f0m9E0xAu7zY6n109YlsRxOvH05oaK4jFSWnDA0neWFRTNiS5T4Zpw29HjcOSS+HB3z1e/+x0/+MEf8fLlC05LMmgCxm7Dh7fvuD8ceP7yBall0pLY7bbqetaRjtoUgR36nvv7Oy4vr/BVrXfv7+40Edgc/dlnL9ludmd9teIw3OP/mjprzfqhNi7GLX4fCDhSFqHlvbwGq0piLaEZdhuN9V4Q4TwvbLcb+lFqpu24oR9Hpmmm1cwyT4xdj+sHEWsx6zWVylyUy/TlN1/jveOLL76QcTFX5tOJcbTNzM6MKWVySnLZB09yjnmeyVWBj47KlGdiq4pG6fdSfAVHh1RmIQa+9/ln+BCYpiNdABi1OdRMLplXX/2Mf/af/R/57qt/yeiQvNitwoVqRGg6l0x9fAJ3DXIpzDXRUiKlSk2qlgSU6XQ2w3jWxNMmLAnv1Pq3/tCVL9FippoecV6Cl3TAdzi85UWte4L+zLYT22Z+PwZj3X70esQxNltI1yCPNSm3mehFZV5p3V5Q+quj1UBeJOhYFnETu602CEFIFgYprOnRUOoe01/9yqD5x/fgvXgp+Q00CYk7seW7NVroznutO28UgXMBWC1Kea2rF0N+r9LkR6m1EGMkhFX9Z8/N2TPyER6F+AmpDm0T81J4tbVQCmdlTjaEUY270J4dQ8+0TJqbmg5vrdq04xrPXz7h7j5yf39gdzFS3UAMjyS5J5LcTM0nrq83uF6qzD52dp85ZfL5Ad95XOspKQsCq4Ioa62QG9MyMU0TN0+fEEspUiPUBtFRlsS8KKp77AZccByPJz7c33N5fcFPfvxjwSFFXIEiDxwER/DS6+ecGIeBofcsJXO6P9KPPa0W0nRizoXL3Y7mHdOScW7Gh8i4MVK0idDzBIbYkZuXCzB6ysPM4XRiGEaeXd+Qa2aaF+H+Fx0djhqtgrNlbj88cLm/kE64i3K0Tgv0Pb4LpJoZxw3JiSwupZIruKjFkRj4ky9+zL/9D/8RtVbujgdKyXx4f8vlzRUepxBDIJ9mM8GtfgCdeD/cfeBit5dPwSla/f7+nl/+8teUUnny5AneTmwBx8PDA947Xj57Sq7qtf7s0xecZiWLtqITTEqFUHRKubm6ZrvZMKVEt92wr5mHhwM5ZTbjwGYYoRZOS2LoBlxzgsy8Z9Or+4DWxAEFJ0NOUtHNh/t7LnZ7HCK/N5tRXgJDkJuD+4cHhtgxxMDD4YEKlNxDgSfXN8btJPoYqNWBKbxSKaTpiN9spYaLeh2xC3zvs8/OCcRYLIi4BCmfasoUmxQ678klkZMeqnHc0nWKUzgeT1zur2hu5WYyuRb1a/eNzmsqrLGD0M6Bb9XgnWV6y89/+l/wX/2z/4jp7hvGwZ0POCuk0pypVRDvIMOc6f9Bv7dm8iJuqOUseNIjGaxdR00Pq5FL/72atHNlDkTur4SrDGRr46LHtPfVYi2cLUQGWapBpknibguz9qF6JjmFRdu/RfdsaFrIq3Tb5/WxUCktQWuU5Ggt6PltiuDIVc/TnBPT1IgRnYScelK8l1+n0SzuY0V01BXdzsY6SfI+HoC898Q145uKgi3QL3DFpr/HIEOnUcTI50eXdrMpeQ3Xo+kzWtKRcdjg3EYqp3UzCIrgWTkb52QqXIl1cUmPoYofcz/UTDbCfRUENIOoXJCoIWUdFGpdi5QKKU1cX++I0XP37lbRI5cBv6ZJOyEsvlVynoQkNEwhGGitKLbeq7itLIlpmnjz9i0vX7wg9lF1BU5KzY0VvrnWiK4qpG5pCZZJH4xDjSJOb8LFANGMSd7jalFb1UcXuo89yzwzpVnqkugpWSTI/vKCkhM1OKJzVLcQu47b+3upOwxjO+bEZjOCh+molNBV9+6DNUo1ja/H45HL6yvCIjI05yzoYmOkUq08uXpC/7yzMDz1T6t6FOWth0YsOom1AOTCsmT6PqoE3CSVhyKVRmrKMgk+8Pb2HdftWgm6ueg1dk4mLxesrU/kcVoWdUJ4z4cPH3DOcXF5wT/+n/xjLq8uqUVPRuc9x3niyy+/lKIsOOLxQHdxIax/Fi4dhoHjdCTGyHYz8O7DB6ITjBVjpI+R8clTrq9vyLkwDgNdCNze34tPALIZqHIpIt2jPCq3H24ppfDixUuVEJmzutrCsB23eBdwVMsW8nodwyioKUYuL68IIXA8HhVY2HVn6al3jnd3d4xdz7gZ2fiRZa1YLYUY1+YwXcdhGEjzQvKePka6XgqvMlsHMHKLl1rofK/Jykk51VpgHHs2mx0tOOb5xN39PS+ePsVVR8oL8+TZXu5sk4F2KqRxxp8GdpvEh+Ov+Vf//P/OT//q/4HnxGbTYai2JM+mUPH+3wzL0+dfmr6nlar2r1Qe2+WcN27AGYKv4DitleuSZFWdRkA6myDBup8fJUHasNH0qD9+hEbWqgqq1yLvNblIQt4Ehdg7+5i/cObxEF1S8ZYAfZbA1nz+7BQqGHBVRPdSM3V2tOqZF0gzbMZAINCtP9/UZnwMJdl7becNQ1HzKze0/pk8VOAMxrMBW74U14xDeAz/a8HgUJO9eudE9K8bolPrYyo6AMQwUDKUIBo3eOuyWCFBO9i1skJRj0geDYV72kEKo0cSjWi7XPXrXuvsk24MfWQp4viiEwGuCpBGC4F37++4P9zxxW7PcSn0faVYKGdxmYrndPog74v33N/dcXWxx8VAm5XoPZfMPM3s9nuWtPBX//qvuLl5xg9/8H2GfqC5dk6RTikTq6uELlKXia/fvOXp5TXvPrzn2dW1dmrvcV3Hy2cv5KwtmeI8RHSSK5mhH6CJX7h9955C5erqiutLKU8ELVXKvND3UbBPc2wHkcubcSTVTF4WHu4z42YgpcS4dge4RDksbHcbvbGSVKZDg+jpXORk46AKcjwPhyMXFxdsN6Me3aqu1xDlngahl7GXkqcHUmmE4NhsVI6e5pn3tx+00I6VEKPOK13g0xefsOqvt2Y4U3GQZ1lmciq0oeGLZ39xYc+xorJTrey6nqdPnihvCs/cEktJbIaBL/7kj4neM51OHJeJ97/7HTh4+fwFsZf7eNsp1iQlTRql5PNCLOerTspD3xO9Vw+GYb4hBnWPV5UV5dZIVVPD05sbLdbekQoMMTJeXnGaF2Vrdb1FfuiaOgeuiIz87u0bPnn2HGIkpcRsNa50krJ4L4JSS5mKnloUIbkuhIoXyYwmu42GmcZudU4r+qE1wTAxdnz9zTdMy8zTp8948+Y185Lou8g4jtzcXGuUz5mH48lCGVUtGUIkRihzZqmFrlS8C2z9nofpNe+/++/5+U//M969+RXb2IHvBS/Z3fOYlpypVRCJ/h/BGg3lFNVcxZ8kpRBQHxf+ihZr98ixnjcaj5M0uHEO4JNi57zu2eBROa/kWk7OcNO62dRV/+TWCA/D7Bv8m018HizNQH+u9TmwJh2vf36GvOBcJ6BfGwTRpUStHSl7jie9/th7OoM4m1NYjfedNhfjFVw1NdCZiFmJFE026xS3dlKv+L91ztGM4wDEkfAoa3UuEL2TFNmvZkGZ5yqauIIVEYFk+7UVfNGftTMf1IzTKLhVqGJXu9kmXlqw92lchqtyngddc2d/bxeTWhtdjIx9x7QUaoBQKrPda745psPCcoQPDye6YWDZZvnCnGAwaqCxiD904oBP80LLRcVhwVOWxLCV/+v68hJwXF9eakI3BRtZh/HD4UCsteEo6lgYR5ZlZn+x10Jq8bz3t/ekmrm6upK+2AsTXGVSPgTmnLjYXRC948PdHXd392z6kb7vNco1p1iOSWa05lZMXCNly3pAnf3sqxuRpf1mlAu2GX4ZPBe7K3Kt3N8fiFFGqaurK90ozhODU/phqSwps91s5U5u0KrC81YNd0pJBHLfkXIhuo5pWnAOPtzd8pvf/JbLqz3D8OLczZBzYU4ijlfCr5mt/nA6qS8irieLtcYQliXh/VqB6s5dEUvJ1JxxtsENXY8Lnutxw3A88PbNG7756hu248izZy84TifBC5ad5L0nuIHNMFhfR2FJC7f3d6R54WK7Y7fbE30hLct5DG45U6Pys07zzHbcEHl0cCvtMhC916bhYFomaJ1OwTwWsfigzZ8Q1NGA5+n1FalKtbGugK1ULveXwj69PztpfZPD3TV4uLvF39zQOW+hk5GUs/4zJRG9Q8/t+/fsLy/IWflLy+lEiJHvPX3OOA4KP1xmTvPEbrdnvxkVS9AETYDMm6lm3rx/z6bfcNEH3PE1X33zr3jz6hc03nIxaNHymJLETs/VFknJXiGXCuvJuwlqqTmz5AWSIxelzPJRBLdfDaofkcZr0U49cwa20LfHxNaPw/xWZdPHX+2j/7t+VVeVeKAfTvMf/301N4I7g//NFtW1n8GbePPjxbe1onKbFYIyx3wzbiu3xnTKLCfYbKAL4ELFR5sKTKno3DrHPG5YWkD9710bWH0L4m88SqmtGH/isWtaTaa6OuVk2KvrdbecNJyzJjp33oucdwSD2gKdNh4yj/0b9hM/bg9sBu+xmvYAb+vj2YuhEa2pQYrVD7KGu9IqqeqZHrqOaZlpsaNvj5/vzdOXfPf6VzzcLjx7vmZ8Ddq4DP6SfyyRyYzjCEBCSdQheG7rBHNmcY6LqyuuDQ7uwgoRFgiecdxonaJUCYNNax62I/v9Ba5W6qQuge1u5P50IufEh9s7LrY7thc7XGsMndrdnPVbb7c7QlCZjYsBbymnc1mAQrFav846s5ciBj/GQOyUtd6aHt7jdKJmuTcvLy+JIZJyYbvZsCwLxQcKmZIyh3rENdhtt3TjgK+eeZrYDaPKRmi46uh6i/0l4F2xm9+pPCl68tI43N0z7LbUXOg3A7vtXlHerbIsKvzp+55lWeQdMF1xa41vvvmO3W7L9eWV+hqcl8nMyFjn1MmwGQac85xOR07HI/srdSM753i4vwPnuLy+otuMvHj6nBfPXnB5fY0L9mAlmW5c1517IkDXcz6dmIquS6tVJ+9VEdQPdrpRl8KA5IDQCN7xcDhwOp24vrzWg+48uSlW/KzeCNLiNx9tdNck8OLZc1aDkO+k9MpLxo0KJFQFra5fCHoQ1q4QwbWSyV5cXdNyIQU5k+eUePXqFcPY8+z6KaEXrHScTvR9z/WTpzyLgRg7nojDVFgkTfdQLVqsDUdZSsK5qIehSiZ8c3ONL5l3b37J3Zu/5HD6DV0cGcKO4ArN6f5VzaYRrK0ZxAK0tZc9ID+Bgu1qzfjiOOZF6hE4R4U0I6u1BTWQeh7WvoPWzozrquZcw+LOtb6tnmGOx2W0nRelsxmsOZ2uDeapreKr12K/ThIecAHn6nlDEqmtja36urJQrJlKtWrCXDONSpZCUftlpCWYjhKddEM4K3uUuOrsNcpHtW5Bzek6rDHk5/eyEvqrOaMZtNQ8zjec61ldBx6oFl+zrrFSaT2qiUqrdL43L0YDU7utVbDydzVWVdfHIYGrXHldvlutEFYfioFMDdQTsfJIxlGdpxq9idUAX01NitOkpYQA8L2nNY9rnjnNfP3VOza7S7xT3a9b1WxBYS3USs4zqc68f/+BpzdP8DimNLOLOy42WwpN6iUfmJeFruv47rtXtNa4vrpmGDX9bzYb4qYfrZIz6EZyOk20Cr7r5IkII88GufDGrYxo02ni9ds3PL2+Zr+/pEZHzY1KttJ5mb0O80K/GTmdJjZDj4/SXS/LgvOevu9YzHMghl83zjwtuOYZR0laCZHUKl99/RXXN9c8vblhTonRWsTmaWYuCSbHdd8ZoaQ0VtBrI2Y8/TmHKeUkojl4SoPQO0qZ2O62+BjZP7nm86Y00WQPYwiezaiqymWRLyGVwvv372lNSaQAx+OR0AX64FnzYHzniCmYv6BRmjrAt9utTrQ58bAc+fXv/o7OR35o8tXffvUln3/+OdE53r//wNt376Q6INJK4TjNXOx3rD3S4ziy855lGAmxJ3hHqlKzdF2QFrsUhhBYSmHsBwKR02nidDqdYZRoBSSl6QDRuyjCDi89vBXa96FnhV1a5XwwyGRCHyTttc0qxgBE+RicFCApJY7HI4fTUVPk/lIn06JDRd8F/ujz70nS6zyuiuv67LPPaKUyTxO+deTamJokh11UvP1mM/JwOJBrZqSTiidX4gg1JVKZCL7h8sK7b3/B3e2v8PWOy3GjiG+STp8tyGRFMX17ZpVbevNs2fpLRX6iUhMlFUquOHv4tczaybKtMNBaLuXB23SCF7/A2kXtbfN5RGE+7nFYvxyaMhQSqJ3FE6jOnrF1oUJkOqzmOG8lV9VygNYsJ+z1riS9tVSuG0t10Kri1WvV55BFYqcF5mNjPjW6jVNIZZ2Vf+TDmbxdX/kKKa2Dw+MGocMVDZvK7bpHO3ysvd2Ns+LSh2DKIC9TJCJkS230vkGrRO9t8tMz0Vh322bXW5vf+nPld1kJ50cPjOeRGqr2mcT1Qyr1vMnoP0So6/PVxnH+DPQX0KTcWkM5BQtDbZmLvdbkr373nh/80TO6fsR3ntD1dE1k91IXHg4H9tfPef7kKSlnfvbzn7PdDPzoiy/oh47OOQ5FcTDjoOij43Ti7vaOZy+eUam8efWKi4sLYquVLj725OZl4cPdLZvthiEKNglendGrXiN6z9SaFCT9+FE6KszTQm9dCl99+w3TNPHFD3/E1cWFKRMq0zTx/vaOzWbDTbhiiIFSVR4O4DvPaTqo48EFutgRnefu7pbD/T3guLm4onPC9ErK8ksMvbmxVaRjeX5454idp5bCnBL9MMj16rx4BgehVhJQFym2Dqcj0+HEs+dPSSlzOGlSiTHSDQMPt3fc3d/x7NkL6ehz4TjP7Lcbdrs9y7LQ+UDXB0qxG7I2WvR05xuxMfQDMTideEshOMf15RVd1ymqpDV+/KMv2Ox3LCaX3G5HNsNAHzpyTvhO1w8nn0vsO4vyFpxTajPvg2SXu3Hk/uEeHyMXu50y/nOh73uiu3w0EIGgxax7I7pIagkCBCJLW+icV39IySrq8ZG+QUoLx6NSY7fbHeMwkpeJt/dvBTECF1WS1FUddn1xRXXqBXa1Kv6dImG9V35VCJEW5G6/v7vn9bu3PBwOPL254fmTJ1oYgk0/DrZjR0ueutyxzB+oNXNCJ/plmQgxUOotKX1HOr1l8MaduIhzTWfL30tHrUTnyA5aW53L/iN+QMq/XBeWeaHmel5QzapkC9+6/Bqc4s5bx3nh11ptKqoiLbymlxVMstPqeQIRpr5+eqv6DKcp2jnrZ7YXe053WtU/6+9eV2kHrikOP7iOVvPvbVC5QSuzvrVWWlWUSUXx8SkVDkfVYm63vcxfUfDl4+bwuIiu3Hp0TjETPH6dX9IZVZPQw/sIZMB/tEFYzSpa3H0QJyoPRiaFIPexd49eFtsg3EcbjcNbwdc6FWja1qLuWROz6jmzCdYEZ4eHZgjFSsSbms2tv2jdjJoZ7Jx501yleS/+0YEvDZoOZpvdwGefv+TXf/0tX/72G548+yOGUFi3Tuc9rnj6TtC8c57f/PpXvHvzhosvfqApzvwe6ppvuKhp4vriihcvntOFjlQSh2kipYXoTLZXUBCbozJNJ7WvpZmBwn6rYDiPp/eRUrT7aBHXAjKlif0w2klR1vebqyumzQ7n4HQ8MOeF68sr+r7n+dMndJ11054DAO2kUB37/YUgK2SDTynxcDxydXPDzfU1Pj4Gwq0uRfCE2HN3e08umefPnj7igA7VbYaAqxoY11O1b4VTUigdHvpxoLTCvHTnrJNtP5DmRHGwTIkYOrb7C1JKlOy4uLzkyuJCWq1K1o2eZUnE2FTFGqNurqabcogdqRYe7o4MfU/oBeN8/7PvUaicDke6YWA7bpimEw64vrzk5uoKUPNajJHYdKDztqC8+/CBZZnpQieXsqW3huDpY2CaZR7bDMNHp0rFrrg+CiC1WsXYoAVn4WSN0Pd0IZBrYr/fMc8L1DVCRGa3uemB887he23cqlxUCUrK6mr46puvcc7xky/+hDlYm58PLGWRy3jJhBB1GveCB0IAykJugW++/YbTMrEZBq6uLvBdoCXBnr7O3N2/ZXp4y+n4nrI8ME8PTKeTOiTKzMXFyNMXN0SfwGX6aFCesxOt5W0p7Keas9UmpnWxtngM7yTLzUtiyUfSnMllgdWU5aCaKuzjFc+Lfz9DRFqhsp3mHw+Xq7SysZLPTuMLa2R4MRmuAxdtET6LPM9uYjCdvoE3lYInqOKzVSOT19gHg8TcI5ovHD0L3sgLqUjuCupPLk2Cp5IDpylxmKEfYOiCuAiB9bZISt5abcFe845YobXWOMd3u2D3arVpq5hL2HGOqPAKgnTF+AyPamzPRjhB652PhKADgHNeB0a7TtVSZF2112ib6xoJIsJa6b1uVSdVR4sKRPRNzyF+nfoMKrKd21uwZa1FELHD7rcVXuy0gFticCkN74JqV2NP31c2Q89ksT6+OVLLSsuyylpv6rshDBzLxA//6I/48Y+/YDtuhPI0WMw4B035ad3A4hWXDzpUvnz2gn4ciGsy5brLxS7y/MULqYesR1XNZZXemthOp6MW2dCR60IcekpamHF0w8D9wz3D3LPb7wlh5nQ8SRobohaBrIKeGIJFJmOR2RDiCpoK81XGU6RVlQttt1tijIr16HphnV1HWhI0ePPmNcuS2I6jiJouWmiaFC3ROfABbzwIqHrUFT2t2+2eeZmY54XNuCXVQimZmhJ3D3fEvlM0RucZ6KitMueFQGAYlQB6mmeGfmBZZn79m98QfGDcDHzy4iXj2JFq43gUtLIbN3pALKKjD5HkMsEFmRRL1Um7YdEVGCGrbu/tZmv9HJUPD/eqI3We3WZLsJ6PmgUrKMxO2Oxm3FCd1BvROULfc5pO9F2nk3vWA5z9CgtpgfAOckq8/fCBnBMvnz0nlQy+w/vIskzkKbPb79iGvYIYaczzTAyBi91eMS443rx7y/t37/nTP/1TXJaEtzmoJlSIQRNuMTmnD3pvPsrAGDvH1nc8e/KEYRxxtZDqxPH9G27ffMvp+IFyvGOZPuBqZj594DidCF3j5tk1z57s6eNJ5zmvxVcJnxYAaJNtrWqO08UrlJpskW/6NzmRqSxTYskLpRSWMoscdmsGDo8TicEUsJ7m3Rn/12KxrlnrKVc8x6M01FnK6wrT2nSyZgOtmLjBGK1hDoJ6nngefzesU+3acLZ+tbNuNpxPqqubugKlqlLXGAb9eYWUHXOqPBz08ze7gRaUy+VaxbtVpbR2Vj9uhuqQKP9fsv7sx5YsS/PDfmvvbWZn8PEOcWPKGHKsLKq70Wo1oRZfBAh6k/TfSfoTBAigIFEPpACKhChoeBHZBAtks6u6snLOjIyIO7j7OWa2h6WHtbYdj6J3Z+XNe939nGO2bQ3f+r5vse2TwJKwBEWfjU5aaxAHQjDDSBUImszWJ7RLVwEXRXXv4oAYJ7QaEdyuq3c0rVNsm2NIuhVSmy6IsP2v7r2EXFKy3SpzozAtmUHOtubWZi2hZ36HBduFo3zpUsT4Wt04tbj0YL+z9QhrtlWyXUdiI5RIwzr5XFbefvcWgPuXd7YMrgXWkinLgiTbE38+zexeH7i/vbPP447e4zDZcwg2dA7RXmjJlZDMYGpZVqZpQFVIAaPF1Wr21MEq9DTuKGqrNWOM1DXz4cMD4zjw29//ge/fvuXLL7/ko1cvELHhyXw6E66MilhcAVxrYxp3foGUc6189/1faEX55OOPScPA9fXVtjO7NWWujd1uzzLPPD4+cnV9zbpkijZu7+4YhoH1PBOPB8Jk/PrcGpPZvzvTxB6y3W6HVrNpjkF4enhAh8iyLAzRbIc/vHvP9f0N0+hU19QgK1SlBfM6iRXyvG6zi/sXd8zzwou7O46HAxoCQ7FMPU4DaRgYFpstDCGQW2F5OnM8XiExMjieHwb35i+Zp/lsPkkxMU12qIydYPDgYb+3davB/JHmcqavSCwl+6C+oaUP1IwFNK8r427PmCJZHYuvRkWswYzYQgg8PJ34r//1v+Y8n/kP/tW/4u7uzjtRowEPw0j1Z7LUSq2++jRGWrbuQFX56MUrDvsDZc2U1nj68IHj1ZWraQsFJQUYUyJXw7xzNgdRQuDl3QtqVFIcWB4/8PT2z3z79jfUhyfWxwfK+khbzyzzA7SVU/6eF28+5uuvv2B3HGghI1JMQCT2lKu72ErH+9XsyiVE3/lQTKUr5l1FyaxNaWVlWVZytSQhagFCPJGYSZ85iHb6pDGILGBaoFQ3ffSLpzwbINvfC1YQ9O5ZPHFB9C5AvHK9YPcAEtQZNJ6ONtprNeNIT2Di32LzkM44Kp4g2nZN2vb8+J7xqhSEmgOlwMPjSllgtw/shkQKikh1XzN//jy5BQl9MSodhJHtw/mMojXEZ109tUVxzYdVTm6AaYXfNtuWvg7UflcUg6OsMGjU5pRZog25xWdGzuz07GDdjYg32eL7azwDi7te92Qi0afXBZGE7biwFLhRd9Wup9ix2L4sWermqtAV2nad7Jxe315zfZUISX0hGHQFvY/lUVUeHh4pzbz5ogTKvPA0z8ynk8WPEHn58jW7w8G2Yvo9qK1QxT+4QCq+vnS/M+/8mOvWLaxr5vD6NRXl4emBw+GK68OBZZlppRG9vsq5kILtnGgoH7/+iH/3D3/Hd99+4OOPPuLGubhVbXVh9xwqa6a1xjfffktei1WE08T+cGBKiVoaMZllR87ZrBha5f3DB5bFXEF38QAtcnNzwzhNfP755wzjYGso14XbqyNdTp82JTae+QObykgCBau4Y0zc3d3ycD7z9PDI4bAn15XPPv0YSYNVi6jNGWIgx8A0jgwxseSVNCT3qIL7mzvkBvbXV/a6tTHnlSBm0SsixDEyxEhI0f2zLGBQG1mtio9etUgIJAnEw5H9ONr59SfbLEKyDyyFNa8+kygMXn0HsWpTqlXqTRtzziDC9fHImAya63zw7h4ZNGwsjRiFn//VLzg9PTLudrbCsthgNueFwcV75/PZBH4hAAlqNWFma5xPJ47HIzc3N2Z18vTIU145+gd6PC88Przj5uaWu7tbQDnnjLTGOCRCUPZXO87rifnxW9796Te8/+a3MD9QS6XmCmSeHr8nrx84XF3x4x//kjefvSENStXFnzyH6LWawZE4pKE9wFZHRmxfiQUQSyaiSm6NvK7kbIujWu3D6D5kxSiPHevekoO9zmaNoaAantW7/cFXf3TDZVAtgGaeL0Kw39gwBzt9FuCf4fgunLMEUB2osnW3W9cgEROqmX+R/Ybi8BYGUClosWG1BXDbnqE5Uorw9JQ5nxoS4PqwIw1ClGJupVIRGbz38IG8P4Z2602YSAs+tvdNlP5nu2o255DYldJmNYIz/FSscNOmxL6K0xOEOcYq2goaIuKvgkNqkT4fsQSuChrMKVi2QO1IlCeoJu5YgT+sdGAwEMTZfoAEq07Vk3UnDOAQ2/PVwtCH4G7WiBESQoL7+z2ffn5v++iXlfGw8ybTeq+iQisrSOb2+obdYceQIqXYDnuJiZAMqQlRKDlDU4Zp9FlTcz2RNwK/+vWv+fLLLxAJ5GWxQCqBOo5cH67ozpz7aU/OC2UZWD24H3YJWiUvM3G3N6xOAsNxz6effs4Xn0WmwxFaQdXocXFIDNNokIKbxF0dDoSbxDgYLVQ9GO73O/KaeXh8IMaIJNvDPA0D+3Fid9ijpTL6/mUwymSnYQ6DJa7etIeQPAb0R9GfHgGRSBKlRpC1ME57xla5f/UCLRUpzgOPgcBgw7WmpDRyjIP/Ntuit7ueaLnyxz//Ga2FF68+Qkv1G+1GilHoezaGaIkniVHO4mAeUMs88937t5R15eM3H3M4mJXFuD9wOOygKadl2eYtWowdXWsXeglJAkzGlQ4VXwtaCJ3SqsLV8WgNtPvVSGcRqRIjSBMf5p8ZgjEpfvTp5zw8PbqhorFLJBcez2fkfOL6+oaUIqKBvNhhJiUO04SGQBjGrYZW10wcdpPNLjQwxsh5WXn6w++ZBrMI0JKNJFFWxt1AXh54+svvePvd7zh//x2sK+W8Ms8nCySc2R3hq5/9nFcf3cEYED0DwQLGNuy8QAq4C+m2T6Ea0KzN3I0bxWzNqzkm53UhrwulNFQH+kY5CzO2oay5pUT0eVWvOC20X/5kEIsPoJ9BIGaa5wZ4W6kd2fAXP3u21tR/LHZ4yxwFbObgr9h8t3JoCMk/vTp8ZjsILOboD3fyCGgVaBhbsInn0wBro7bAkitPs80mbo6BNDVCcBMXh1mEjMiAOPEEhdIfxT738QQqPeh6p6DRWU6tMQymq+ioBgTv1ALEhtZCIF2gG7dqrTV7oRocR7UEGQkXerInn36rOrmgu+r2NRb93wxWSiBGaG5EUooXiMrps922pO/iNmJNeHYSnpMHLiCk/VMgJeXqOvHFjz/i13/3Kx6eTty8vKJvw7MGVKkKb958zOl0pubC6q9wOBwIKRLjHcX3+KzzzM3NDafHJ3I1cS5DMGX2eSYhwjCMNsQy4BlE2Y87Ss62O1mUthYeHh4Y7xPJ6Z/VK8v9/kgcjA+cxDjqt9c3hBBdS2DeIYIwzzOlVm6vrreW6u7FPVTlPC/GCa72uq/uX/DN99+aAvzVS1P8TonD1dGdHDue6SxzhVoqU9xZXdUCuaykmHh6OCER7raht98ANdV0wLjspRQ3Gyz0hSJVK7urAyUXTucnvv/+LTf3d7YD2o6/DcWxqqPlwlorjw8P7I8H23WAHQYJYm6wC7ab2g/i6fGRh8cHPv/0M0YnAJRx4P76htm3rdkAVIyNpgYZjcNggEAutAGGOmyHV0RdhOb1YJDLWsY4QbOBMLXweDpBDAzj6PO+wmmeOe5ciIgyxsBSClMQZp+JkBLT4CwJEdb5TC5Gqx0OBzMYG0dKa9ZZxOhKfnv6Ht6/Z9rvuNrvqbWQmwsnY+SzN584j185n94xpAnNmSXPPD4+8Pjhjzz9+bc8ff+O9XymnGcLiqExXUVefvyG169vGA/JB6ArcRBi7PRFd+70oNhdP2nVsXGMhw+gtiO5VaGU7CaGM3mtbiUfaG31CtGqcEEvMIT9smcJwjqHDv10Rsym5O1xwoN/r20vgrPID1eqWReh7hjbfP+EOJDTSqGpaRhMTW0UUWLxX3BhGIlrJUCJNJoYQCkN59dbsyK+YCc3pbaBvAqncyYvyjDA/mrHMChCQaRtUBAkmiuuG4rtorYOMzjsF1ov7fzjhQ6fOccyFFfO969IuEhMNpGmhWu7lr7sgMaIqtGCTafiw2TYPNSCGFMr8D/86jCUQfQ+cwreE1rrgUS8Q4MQ+gIrh8I89tj99RZKt3y0zYpauySKS0JqSAp8/PKaXfqaq6ujzVufJzM1gaGIINHWwi7LYq7VITLqYHC0mKnn9+/e8/7hgfvbO8ZhMDIQBlMFEdLXX3zhLYhtT7OdrzA4yyfnzLfffsc33/7ZlsDc3zMMibfv3vH4cOLTj99sSr0+QCq5gMA4RJYlsy4zwzggEfJiBn3HaW9/h2xLfUS6IEm3taD3N3e0G1PkdmFQzRViI8fGbtwhwGmeGaMJ+yqrZfTdSK0TuzFxOj3x+PTIMIxcXV3Zg6S+HxcbyJeymoTezbxKK2gpLGVl1IRE8zi6vb3ZNs01FVu/KcLpfKaUwvH6mn2LfPHll4w+HAohoCGQ15mUbDE5tbEsmTgM7Hbm2FhUqcvZJPohMt3dcaPK+4cHBg+4Wqqxr5YVWiONA03cb380umgQIau5OY4tcTgcKPNMTImb6xueTo8svn9i1cZ5Xbi+vqLRyIt54O/3E1NKmwNmqcV2MHuA3497m5UI0AolF+7uX7DmlWmcHMe2c56CcHN1ZfW1499vP7zj7//27/j8ix/x2SefGfOs6wmKucW2ekZz5f27P1PKSssrpcwspwee3n3L04d36Hlhnh8p+cTxas8nP/qcjz95zf4q0iQTBhvCJzFx5wUewNW2ug2VK926sF7mBm6e121B5vNMa6ZeL81ghdaw8bL65gPFgrlEEr45zIeSfQgtcgkUqoEgzZOLoKwWOLVjzfZlJ7N3EdETT7PPhLu5diUwSt/FrlQnEHmwEnznOxv2j7odu7ZNjdwkbL5IZiqZoYmJYqsaM6gk1po4PVXyIsRROR4SuyEgwYfxEp09iXfuwbH6/rrYkpxm57iksC3lajS3DdceRSEFugJaCTasF4ih+mA/IHEiOTRocyzzm0tBqD5T6DBb14JYQHeHYQku7JNL8qEn825vgqfuy0KnzjrbpIcVCPYeu6Or/aSbCqp/k3c7Nlfy2UcTaJVIomCD7ygwHSP3suN4vQeH70Sqa2qEJRfmZaa0xjgmphQpsrLkwocPH7i7vTV/tMF2Bz09GV09DCYfKKqkGNgddyS3NLdqKiVatgMRp8mtHWz48frFa17ev4Ag5HnleH1FW0yMYbbNxURUYO6qy8qiC6fzieU8c7+/47g7MA0TN9e2qhP1QKzG395Nxr5ptREwXUNKiWEY+Mt33/L0dOKrL74wtgBCK42Zhf00kUKgqA3VT/OJ47QjpZF1zVwd4HhjTrDLeeF0euLu7o7dbk9tkNeZeV4ZBluXavbstm8AEfMRKtmgEW1MoyXPECODD7EfTo+cn54IKXHEdhwk78w6xtgH7q1kW5aDDZTEh3KvXr0iRTMHrNpY54VdjLQY2E+TezI1JAaePjyx209E3/yniCmnVRmDrWUdNHKulXenJ6veo89QWiXFgb88fc8f//xHPv74U+5ubrYg2FrlkAznXKtvQiuVYbejewhINIX8PJ8dAhxZfS5xe2P2LX3bVZeUWtXl0E4KhBSIk+3W7RWZKeNnnh6+pS4n5uUd6Mp6ntG6ksuZOi98982fyOeCaOF0+iPHfeDLn/2ITz77hGE3kEKDYF5cwY0lJUQb2HvnELCg1AOw2ceY3Ulr2dAXOpzQyOvCmhutrazuw9S675IHfwsmzR/+tAUg8QRwqQgtKDUXW1nC6DXmJSFsugo1nyD1AI8noWqFN7EPv6Vj++pzBJuv9MmGwTX2fDnaaAGyl7FO9ezRuA9SmwitVbRmWrU9yU0rtQbWGljmxjJn0rAj6cLNYY9EH6L2qrYXxb2r0MvuBav0TbRq+akP+H0OtF0Te3tRhBQTEuqW6XoQVnUG0ejwXMQU2ZgFh7ovlXpXpQ7TiQbni3XFt3WBF5HdRhh/VvXbawZ/c+bnlnx+ZG4RDfNpatp1Gb2T0Ge/BZulbE3DxerHdvtgq56bcavGYWCVBRBDI5oldVGcYm4kiHVeiG7YV1B248h+TGgIlGWhrIW7mxuO+wMPDw+c5hOvX77i7MLW69tbEtVWkTYErStzXs0UrzVSjNzd3fHRq9dEx9BPjyfenh4Yx4nj9ZFSqu1OwAYsXWz3sC6UcuLF/R3hpWXm3FxyHsUpr6bNKCWT19U8lZpXms1siDW7gC1Gbq6utoMiQYgaWc6L8e9jsgWGrZFiIo07FGyukTNRbH3lH/70R/7h17/mF7/4BT/9+S8AZS6Ntham45UzNcwtMShMcWDOZztctbAs5mo6xGADoOArWHNmN+2Q0LURyRblxADeSZQ1k9JAnldqjEwu/ltKQVR59+EDL5yVxbry9sMHXtwHhpb4/t1bcsmMw8TVfs+4n7agYDYZgDbO64rEQFTDvw+HA4+PD/z2d7/jzUev0dlENNP+wJ//9Ge++ebPxnDY7RCFwzRSovk5hRBYztmgPd95/fD4gd204zAMtFw5z2emGBnG0WYQYuJGW/conJ5sp/i42xk8J5b8Y4gMYeTNR28YB+Xp4RtSEk6Pb3l6ek9bZwuC60rNK09Pj6xrRtfK6fED3377Zw77yO3twJc//ZrXb+62HeTSg7Wz2CLRr5GJ9PrD3AfBl10D9nCKVoKqM8CaUVrXE+taaJIsqdVsnlXYAqbovHi1YQCthwKxdxTU/IEsGXYKpT34NiYTh6rE5gI2md38vyyIDDxf9AM/AJyM8dRprGoqiOYdgTisYbi7O8Vug/PLkNtimDGaLDk55VbsOhgZUZDme5JzYJ0Dp4eFNB4IQRnTzjeGLvbZDd2yzyEOE/ey3CK1XTvas3tgMKxoePb58C6rMoTBB+EuBAweJ591aOLJMW7rSj3Qu++TbmG/twgds6n0vRR9XvFc3wQdjrPXi6Ezo/zH6R1FnzMNFx1Y8P+j5lRrL2lkAdR811Bx0Z79HlvyZOmq+wHGEJmcCmu2JvZvVS703zQE4mLMx3meSdFIOxITWoyRmirktTCMievbG8qaWZaV79695Y+//wP//r/8l6SizVYG1sKyLIxjYhwn3wAWCME4t60lW0c5JHZpZBgnc1zdmfmalgohkO88HY4AAQAASURBVLUSBXbDxKnN3lYGNK82qB7s4HfxXjcC27mT6trsANviG2uPW2scr68NimrN4A7HAMf9ZPueWyXXamZ0MRnm7fBXzoWnpzPDlPjLt99yfX3jQjjD1Xf7PeO0I4RIyys1L8yPJ07LmWncMdBY5rOtjYzGJLc5DpS1UFvju/fvub26MtHcmri5umIcBx5PZ3LO3N3csD8eaaWwqG50Uo2BXRg3SKeBG2wZdyzngoymoQi+qnStlevdnu++/x5K5e7lC9u1sWZ2u2nDFdeijMPAmzcf8+e//IVlWZnzzG6YeDrPfPrpJ/x7v/wl0zj6PutAbZWcM8Nodu/TNFGrhbxWMof9gRTcaE+Em6Ntyaq1oJjtvL3Hwnk++c+qQXVDZF0Wx80D6/yBpGcmGXh6/wdaOVHagtbMvMzk00wpwrKunPIT5/fvmdeVQ6z85Gef8OqjK+5fjOzGZP5MtUG0+5JScAzcAvHmjhsgaLXK2Isa66ar213r9p/SDF4ri+0XyFWROm8dlymurSptzfZPmGLW4m4TvHLUC93TA7hiYigJ3ZW/r7Xs6cVgoUqHQwBM0Cfa5wgXLBqtHnjiNsA06lZnu/XAFz3QWmBhC1LPBqz9Bb06hcZaM7Vk+91NqBpY5sK8KPPZ5o43V3e8P/2J6XggsNCt4XGRbg/Q0rtRf4+C00B754YtY5LoC4X8PXXZoISApBFiNP1EU0+2fdbUnGQUCG5EKMEMNWMI5sbg9FnVZ5LDhk+FXETpicMugXefktwWvidVXwwUrE8RHOoKHUqUS+ILl2VS4veviSDNvreJxYVetfTZknqiKH4mjJNi4ljzYvTeQ3FbJbvGMQ2MByWIUnNmKYVWGvv9jqVW2mKeTZJsl4Rtizzz8u4Fn3/8Gfd3L1jmmbSfps3LaBztgSsuvkpiC0f++M03XB0PfPz6DZqVq+OVZ39/UJpRG0spJlIbJhjhJiWzRtbBlu0MNrQ8n2dEII7W3iWHqUpuBr+MgVZMtfxweuDh+0de3r2wZRnYwR3EfjYilFoZUjLLXNc+qEAcBupqe6zvXt5S18LPf/YL7l7espv21FYJwQbOrRTClNCYyK70HSRCrUQ3R1vWmdPjEy/uXjDEyJINKnv/8I7f/vo3yJdf8OL2zlekBnJtfPjwjt/99ne8ev2aVy8MThp3EzvfcdG0H4hASgNlXdlNk8N4pp/YT9fmcTUvPii2VZ/7cUL21m6uuZKXlaurIxoseYVge4UbcHt3y24aOeQ97z98IGng5cuXHHdmXY7brlQ1QaXzFwAxlkZTpv3BLFnWlTyvTNPOHummrncxd8+CVZ1DmkixOm02uIiuUOZCPj8S5USuD8yPGW0ry/pEXs0O5f37tzw+PSIhkeKIxJXjceGrH13x5vUt08759o7nJ995EiRuPjqXGtQ6G1sj2jwguQmcWJBptbp2wP5ctNJyIS/ZOhhVtFVKLcbVl7gFFHtAO24/PJc5bHDEha3i+0s8EPec0PlVW3XrAarbRnQmk6hX9+6e2v/ueU/RyIj2RTsJlWfWIeoWHpbSnr1Xh1XEo2XXI2ijNqUumVyMZaXAuhTKCuvcOM/Kx28+53R+x+3VnuCDag3NNRBtA2r6PKtvkNyCs5qmWzFr7S3P+eeXcLmG2hrTOGxFo6qaHbtfgih495MhBqvYfWgcggX5TlTtX+r0/OcCCyMeqNnbBzNJBGibPbj6bhW5PC8BarAlWPQuzt9Pc8PAoPZebPZjHlHVoBMbmgfrrGrtZoQNEbMWseG8JZk0jP5WTefR5ySCsRFDs1lubZVxHAg6MD+eUYX9NFKTGrTvsXy/m6yDEXvf97d3lFZIxXOiamNdVj48vOP66oZpZ9BPCpG7u1uG4F7jzVaLRh96NSDGxLosvP/wQBoCU0oXVkeprPVsgrvDARFhmAa02qKgIIE4mB3F6gN0nVc+PD7y5vVrnt4/sRtHG7plGyIZn9c8dHKzbkGC2F5jX2pvF1ZRCrVVUrpmN06M086qxFK83ROKCYA36mgcI6mZClcCnOcT33//PcO049adWHMt0CppTLy4u+Nf/ot/YTi7swvWXHh8eGCeFw6HI6enJ/affUoxUxu0BuJux/npxIcPD7x4+YJaC2/fv+PV/Qt+//vf8c2fv+FHP/6a128+4ni8ZllWrq6uSXHg/HhiHEYU2yZ3Op1I48i8mv1FLZVhSL5PW9iNZlqYc0YExt2Om9tb5vNsNttrtt0hADFS15WQgjvGKrkYNfLhPDOlya5zisZqakKKkRArmgtJlWm/ByLffvcXjseJMRUoJ85P73h6ek+thVqeKHlBGzy9f+Dh6R3z+cz59MESIjMv7m749PMrXtxeM4zGtxcqra0MrgoldN9+w6qrV4iIeWFZNRacFOFOmTTz9S/Z+Oihodlc+lortFyZzzNrydSaDd+n49YWwOoGhQxARjQ9q8ZlgwaaFro6t/YZgci2wzk0oZI9kHtVL6OrcG2wnnTY5h1NbJGROGzWgpnQOd7lyWu1hCSXYGwfwOCa/ufmdtv04SmeNNQMOwLQajaIjUBrgSUreV1Zy8DpVLm7/5QQKiIzw5hsS5t0x1bTHjSvpO0Cq8MuXk8HZW3VFNP09aBOgxXBZSYE31cdgWgyYLfGCM44EhfrBbe96B/H9ObJM5I0Ou7T88E2h+msNKRDXoa0xDhYEg2WCUS6geh28TA2VSBKMnZt6w63yew6sI7biW5my6GerCX6rhJxZlq/v/Z5pJmw1PaPWIK7DNItUaAJZaFpJYWRlAIjibdv31OGRApmrKmtoTESB4u9rVQjB4TAsDNBM61SSrG5sM0EjA0UMPXqEE0rYWq9xtX+QMNsn4varCKoUKibfT4KV4c9N8cjj+dHIoFht7eZxTRCsQckNqMFllKtBRxcsdkqa8lILRymPeM4cppnPv74I6IY7p+rtdmjDra+sjVTeodIq9YV2Ga2wYdOSoo7dtNIKZUwDb6y04JazbaTV6IJcTrem1KgRjt4TcwuYskrN3e31mo2Zc2rMZC0IUNiP5gWoaoxuKyjbhADX3/1lXPdbZCa1UzqInB+euLbP/2Jl/d3TPs9H08TIQSurm54Os+8uL2z2co4cXNzy/XxyMPTCYC76QYVePf9d/zmd7/jRz/6wjbEiTLuze4jOjsLoNXK3c0NpWTq6vCBQyx7T579EKpTay3P2+B2Gmwrm0SjXzZRlLyJXrXazoxxjH4tK7uxMcgD6+mBxw/vWM8nK0jymfN85v27tyzLyuPDI7lkQntidwWff/YRH338muMukpKSQnPIaCCJgpiyu1dSKr2zsJbdiZ+u/A6XAaBXSq0aTl+yD2P9+jQXx9VS7OFptneE5msge62/dYD4n5MHV/pju403pcNJ0nF52eYhFl+6ZK4nt2h4u4ohRs2oorHz4N0epQc32WChPj/oPUZ/B5e5g2wUWvv34NdHgBaqbZVzfUUEcl1pZSU7xXapmXmOzGvk8bEy7g+8eHHDt9/+iqurkSBWhFSHfSQkTI3RK2rsOhpd0d6FW9drNWW6Uh1XDx7iPen2QJ4c5WhGbyU4BCXFr0E16Fh8A6Wfh4TNCIMroKUniKZe0fd+yuFVae7masIyDZHuJRUirrOA7l9nrgK2ItcHKHZt5eLzFELaCgS7/34u+nwMddLDpo7YTP+6hsZmKgrexSR3sbbO1d4fQVjLSqswjW7jsWb+8u2fuL9/yfX9rWu38OVLdsatGIiEKLRqaEbKy8qf//xndvs99zc33F3tqT5waVUZNTJ3Zk+E8/nsxnw+KYpq9jXryvH62h1hhbAz+4y1ZO5uXqBnCzQlNB4eH5iXhevDkZAig9tUDzEyjiNxTNSHyvl85mq3p2hBVBiTWVLXWm2vggaiKqVkszsHwC2em5lj6eADqmbmcCpqjpUhEGLfkVDoDI+SV8PbFa6uD6wO27x6/coqUuzQ7aaJ7NveRJVWjPFDLQzTDtXG9e0t07p3zN8GUsM4UfTMu/fvoTZe3N1xfTyirdJWw+5LLlzd3XD38t4gpWa23V3FPA19JSvMpxN/+e47U1OrcjjuOZ1molqFv5TMw+Mj11fXhpsuCw+Pj8zzwuuP3zDnTMuZ/W5nFDtvW1stPDzYrvNhiEzTnloK5+XMbrcnSgRfNlNQq5pqBm3EENF6oixn8vlbHt6+pZUHlmVmnVfOpxNPeeH8OLM8PRBT5fZKuHtxxcuXb7g77onDRBSzU69tMa8dFcZgrBNJmOo/DhvshGPS1nK3bYBp+5Et8Da1jkG1kGuhlWweOLWa1qRW1jwTNDgturi54UDXURh+fLHUb+JMqQ7niwvYVDdmD1jAAit4wBS11t3Yz/TAbYHOo4p2eni4UIrRTfQl2/+xv3eCLc+hlJ4ounlez2Y2C/BuQZz2SvA5YKVqpq1WnGmdKFqpc2BdhIdZaEH46Rdf8d13v+FwCKTUFd0O7mjYlPumvQieEB2X6dCWmr1EwRlcAkGjCeD9Eyjq0GBjin4v62y/twUfXJteOoQ+a+jwka8tFYeiJCBaEUmgjeYD/oj9m9ME7DP4HAOCr17WLXn1S6x0exsYaE5eMFJA6IUEdk5kQ7Q2CSObsWG/T8/ORz9PBqH3zsrWqHY9Ta3OpgsNKV0MCue8Mj8tIPDh8ZH721u+/OprSslosRlebdX86MQStbjrQ8mQy8L+eLCZxKsXL2wLkirz6USapm3mUMWrjWgVym43ma4hKiSjZDVR4jjYqj9xFtNS+PD4BMBNrix5JUpgPwyk2ztU1SEbJU2JemqMw0QcE3leubm6ppXG+Wx22VfHg9MpFQ3YTCIqa60kMVuM4IuMmpoVhDr/X7Xx4uULW2Nrp8huQLVkEIdkokFVSDsOO2ENM+/enVBsVqNVmdeVFK0yyKXyOC/sp5ExJasbO9tCFK2NKOahH1Ni75bk2pS6Nn73298RQ+TqeGScBta1OMapyBDROdNEWGph1Ma6zuYsu2G60KhMh4mPPnpNSoH91RX67PnrPk131zespTCEkaUUPvnoI1OgFls4U1R98VDYbMLn2YSDa165PlxxmPZoDJznE9TK8XhN3y4XFabRkkSuJ5bTmafHd6xPj5yX75kXE7vN55l5WVEt7HcH7m8a15+95tWLG6a9wceD8VJpuqASSAIpTF6BRcZkQTYJXgB4q68XP6I+EO1mffbIWFegzYVFtZDzyrqeadWq15qLKacbtI1zfgngPbhv/HzpPYPb4nkA0OdK6F4hioNceqFEd1jqeZw3eMHer320iEg1ooff+I6NPx+sGrvmQprV7Rc2Wt+GqBuq4lDTZSZhgetC2W1YgiitUrKQtVHOcJ4b8yKsc+Svf/ELqpwIKbM/RhoFqcEH673+985GLOBu9rY8x3jsuQwBqgqhCk0KQtqCvHjlra0R3FbCICYXGor4Ui9/POQSdPuL6EYKgIuWBLpPVKvF4p5DQSoX3pclUnFrDV+NIB4zFLPlBkzm4wmiw4HN/JrMXuTy+bdbFKA1Ox9puz1WaHQRLZ6E6PeXPqS36xK8m29N7MzEwQW3preKyR0ThhEVX03QGh8+fGBeFqZxYEwjr169Zr878OHpgfcPD7b+mCBcX19zO9yznE68ff+OqzszvKu1EhrEwXYilGq0yDhEFldjm9MhxHFkXhezgaiNTOb2+prRl9Qf93tnM6njeZE6zzSUfThwdbgixcjTwxOn+czN8ZqQhPPT2dxe3UrYhpMGedR1garMbfVB7khKowdrgMoUE9PofvJaCGqwwBiUpdrimCFYZVJboWplHGxOMYxmLAfw4fTANE2s2dxMh5R49eKOdTXBey0FbYGUzEr96emJdV25urmhqlqljw1Yd8PEz3/yU0ottuu5NBu8BqGuhZyfzFAO5TzPrOMAIowOHr97+5Z3D+/44vOvGKaRq6sj+/2O/X4011wRNApDGjjPhfk8I2pEALCB+sPDA8MwcHU4OpwjZqKnlvivj0d247SZ7a2tbruo4zigFMYAi/pATwqlvOXD29/z29/8PYM0Sj5TlncsekaCcHd7w+t45HDYcTzsGXeJ2lajKFa3nmAEKdCye+0MxGSWEva/ldhcKY96QHZ6qw0E6JYW3Qq5VksO67pQazamUp5tf7qz52ot1LXTIr0LpYA8GzLKpcoT7YphH4I6DHmhp0qPxRYIvOrr0MTzlZwiNrjtIcD0JdEBH3zRjcFUEhxCY6tnrfgRS0A9cGwzhgCi1bqdnsSwZ6MTE9qWeCzbtFppqz0LpVSaRsoiPC2Z9Sw8PVW+/NGPub274de/+luubszmpGpEY9uug4VBc2rt0EoICu4DBm542NTIWVzU5nZhvKrboD27r7uDxZLmBnkSAlobLVaSpK1zuXxYB5fCZbhvFNzLXMegyWZRPrpdiKTt+5XOmAI3k6FVYzuiBlXa6mT1Arv2itTOIn1vCBaLWtgSfMRtPjzFt3aBKYt3XR2qs67WKMnWnfnra0Ewl+iyNmIcGaY9t8NAK5Xj8YqHhwfm8xPjtNtYi2kYOL/9noe3C6d5pmrjx1/8hCEO7IaBOA4kaXa4Wi6Ic/dPHx5M1TeOSDO3xT6jSyHw7uGBP/7hj8iU+MnXXxPd5nqIiTDAfjiwzitLWQlJPHAHtCm5VYaQCBEbvGqlrManXvPK8XgkJcMbRyZiTBxvjkYHVdtUth8nclnJ85kwTMQopCBMUdH1wSqAWAilUWRgqYE6G2n+fH6itcLd3a0bz8GjVp97KEM0Zs9aGrViiak+cRhAtFF9l8FuPPrI3wZkQ7QKVwENYm6urXCXEjVnkiRiMspvLaY9GMJAGo2u27cen2fj418drxmGkRQ71m2HI8ZImkaO5ciQIi0vUJsNxdZsjqtBkGLrYzWbBuNwOJDEVpZKEK6PV2Y8JkIthdNskN3hcEWuhevDYdOA1AB1yaQgXB2v2U+JWmw3eEIo+sTbb3/Hd9/+Lae3f+Lt93/k5f0LpiFy9+KKw3jPOI0cp50NJMuKhoJq8Ic6QzS7jJTM3yYNBvFsFFBv1XsSUFHqmp1cYJVdjKbSzcWdW7Fuap1XgyPVKsNasg/GQWsjl0KnGWnzgCJig0BXH6uID6+jB2QrOIIoVe1sB+3F/aXqswTjaLGqV3oW/HqV2Fr1rXuupBbrRpTu7rr9KksOW37RHj89GLYtmFj2uHhSiXsRbZ3GVtAa9LIV9f3vVWjZbPRzFZa1Mc9wnuH2/jU//vEX/P2v/jWH64EhGv05iBUYhEBQS5riy70ua5nM36g3xHiiktC6NMOQHHXHVXXFNQFtgRCFfXIIz2O+eqWeQtyKK+3sLbEdGylATB0IY/u8iFNTnZZM6Dve7f7gq3+RiLbnwRwuW+bYzsVm0+GdY+z+WZ78babJ1lV0p6f+lrTfR1MAYqr0wA822D07V32YrqJENbbpMBy4Pt7aYEh122Ex7twAVIRxMPLQx68/4uZ4xR+/+TPy/j2H3YFcFqZpJL14SZRAKqpuUx1Za+Z0ng0Tv742WbiYK+Diy1rSNNlym9Cccgp1nVnnhevra7uZMRD3tuNBGpSyUoN5iMRgQxmtxhfuZ8e2PkWESK6FdV0Yh4FpN9BapiLUBuOQOC2P/On3v2aZH4gjHMaB+5sdspi/fa0LefmWWs+IFJzBbs+mUxX/QZuxmaK4/N0UisO097M8UIwPSmAgpIlaBWJiGBKs16CJZWnsdjfs9rfMudLWjErgOA3cXB9tqVoXSqkNnGyIqhtNDQnk+cS8zEyHI1e3A4TAQKRWmLNRMFuBndhWvrvrW2ptrKsd1C6+SdGCfkqJXDNhCFxNx21Gs5v2VoVHk+3PZTY19mTOqsNgrpu52LwlxoCulZgCaGFiRddHtD1R2kJsmfXpL7z/y98y6szVRwM/+fEvzewMHyC27AF0tWIhWBCK0YL7MO5obUVir7ZBfC1t6v5GGFRngUx9s1g0QZvae0YNn61loYWAamFZ7D+t9K7B7Mtbrra/AnsoWxPvHMJmZWHuou6142Kq6sErSbSVtzi80LoSoD/oTnVV9fdvhA383wKyVf6tzyGam8oZoI5WRaVsgTRgVeOlG2mXgPGDyP8MxHJ4S11MZ8wqz4EXUJ3+Lmun/lYoLVFWmFfl6VQ5n4XddOCf/JO/5nd//BvS9MQ0JIOifXKaQiJ6BSzRupXo799ou564PIk2v5/q7ZF0Zhp9i8Xlvw37LzYHpZIkmumf2+sELMYY9t+TawWpIAMhRE9kDQmmJ9CuH1HQeNFtCc6U8+sjoXmCCM+uv4NqYv2YMUDNtLRZ9e37s83BQfscwa1/cEFx38khmF1IQ0gOJQYCdZs/eeKVy61uIrhm1Ii0pSFxYhr3ZDUpwLpms1f65hvefPKx2fiUvoZW2e8PfP2jL1jfrKRh4HQ+2QbBYWCZF1JEaCH68okTh3Hi6uULg4O0OVbXfP+tHaXjzTWfy2c8LAtUG+49zWf2hz27dAARd2NtzOvMoJGSjZp52Cc7uNoYUuDd0xMxBMZxxxiEpdhKyb3sSNEraDLrklnWhXSMPL79A6F+w3FcGcJMLAvnt8oSQB17jqogmRDt1ARnGWiDtbq9sNrAPSbb5dwazMsTp/MJRvOnEYmsa0VUSHFktx85HA48rYWmgmjivDsyHg5IGAlxT66BaXeg1QkNiVwaOTfef3jk1cefcDiYpYkMEWnGxkgpcAxHYpyoayHExmN+RDOElBjG0fb5NmXJC6hVyblW40Mf9nbIanN7buH0/oGYBuIYL5EjOmwXIFZhfnhgmkamIaFRaflMCjBE07+sT2do1n3VthJ1oeoTpT7R6hlpmUEKn7ycUJ1Iw4iGgNRsojm1TkuiVduSzIo9BBuRSwhIVEKNWwIwJZqJObcWovX5gz2QNIcafGAdsPdbykopDcRsM9bVPJZaNbvrmmfj+9sTZg6tGNRlfVGPXz2cBePtqzhEoAS16i5gAerZd/o7VMzxs88mov1rY/u75gNK6xAj2vc7+P6OoGwBymOTBwiDLy77n+VZbrhUm5e5h+ec4LYaYjODFgTpgrHeRTShZBMO1gzLrORVOT8p8xxQTfz8n/wT3n74I7W+5ebqQMUoxIREbMWGtmCOw2piv8vA3Iq1oJfVRiJ90VEXneGVeKBbl/T5RimZcbCdJTEJqrY0qMPLjeZut3JJkIgL4FxkJnGr4s236ZJIY+gGiTbnaLVtO1m0mX7DYCt7vRAdBlOHQqMQXeAYPXF38VyHP3sC6kkSBS0FYrQk0sw/i9A7KIPo+0ziOXwJJtbcrFuaFTtLqZdEGyNlfeL9h/e8fvPGmZ+WpHM2N9wg0FJCmi0zS+PI6fGJabI11GlZV2vZo92Y3WFPGGx3cm/PRYRxGjnIftNK7I57D4yBw/HIbrdjOZ2JMRJTIkZhSAE0EmIgqXmt1LKiWhliRFSZH99z3B3YHfas+UyKkSlCGqG1D5TyaF1MfaC1Jx6+XUj6xN1+ATKpjmgz7rxgSloSruOIxMRW5TUM5kzyTKSSsIGbC1iWsvJweseYD6S0pwHraeb8eCYOAgTefPyG08MHntYzQ5wYhkDcJYZhR/DuahwmSIkhWAIiRnPS/eY3yN1LalN2+UBrgVoh7Q6EsEfLBCT2ceD9t98QJfLqzRuqrkQa87JQFtNe7NOAtmQ7rnNBtNG5GVIy98fjxgiJg4Au5PURamY3DdAeifV72rmS0oQWpdQMrCxPTzQ9U8qMOE4trWH20o2xm6OGvOGvIkKrC0FlU8CGIaDVzMcIbIN/87gRNpGbn/6m6u6cF1s7BbqnvvZgIgqtblbTuazUtVCKsV5KwVwE1mJ7S4CmK7X0AJ641NuDQd+OBXcowSpIs4G3vcNm4leJ9mB5uEf988gzr51nD3L/jY3u0dQt2cUShLYNQjIvpq4RYAuQPZA1zeAUz54E+pdqhyOevx9h83Fysz5b2du2jsk6KSXXSCmNdW2sC5yXxnIWyiLUEvjrv/4ryvKO09Nvub/dI8GEploHqigtGDVdtGz30yrkS0KrCk0ykLDVrmFLIIAHYjP+s/ffu51G05VhGlwjoRg1tZ8BmxlFmlfeAaSap5V37TF2eu8luXa6sKq6dYtpF6z5EesStoRbfI5gthzmtSUmAHYvOpvAC0raPF8vBAi/hxgEpo6gSBxsNuPJ3E6+Letq4vDZdj8vicKYUrbwLKhTjFHG8chSlEZmDIMtX1tXT3Y2g8tl5XyebaeMJ4gxRoIvj1vn2eQCIqRaK60JY0rsp50l1lJJRFYKms1lNCCOe5l1RsdcW2tEiWa2tdsTQyKqMIhyWt7z4d1fePXinnV9ZNUGWgz6CBax7w+VaSpIfiDWijSl5hOFTGuPaDvT6oJoYSf28Hb3yFYbDfP4gUrJK7XCsDcWUBoiKY4m5BPDk1WVSV0EhnGB1QdJpZnvy1W5orTKboIlr4y7QM6Ndal8+913DOPI4WqHLI9UPbM8Fuo7Kyd2QyK3zLibOB6vKHFgECHEEZMjRh6+/T2qMIfRNmM1SHszJAxyRGSgDBOpZpCRx3cfQMxtllKZ3z+gy46bmxt7vhaBWmirsrZsKvFhoA2BUgoxBub5hLaVnE/QGmuI5HwmSiPKyvqhGBWwc6WbPegpJpoWhpC2ktaSrhKjDZBt53MhhtG0GQHEo16Qhiab90TBKr0e6B3+sLjm6x2xM6bY7w7dlKeLjnBIwgo6Xxe6mnXMapBa1Wr8/lzNi6bWDdI0DNlEXt26WbnA+mat0Dyo4sEgOlSIwz09pGGBwu0wGvYZwCxAgphXTg/eBlcZTbW2vkynuS2DWhXbXKEsvYp+hlc3+9MGE/WhqMMPImxC0kui4PL5+rUGlORzwkBlpdRCXgo1K0uGeYnMCywZFg386KuvONwM/OnPf8v9dSIOeeuuJEWS2sIl684SkUr1wGUFmGxMIe3Op6hf30vHY199GdDlq6hZxh8PV3Yh1cSRVXRjI1kydCsQUTSY1iSo2vnqupF+UXxHRe+8NnkJ4VLp+01XbOZlX5eipiccU0kHQlBXMLNBh323ix1C7y207+wQL1rw58KmFKKBUlbWdWV3sJjQyRkdcgJLqrHTsBxu+vTLHzFOOx4eV0RsvfNnn3xKjNFWK2Pjipuba58fKRrN5LB5TDfCSmM9nUjDEDGMNKBDoC6FWVdCGpiGgYyZ3ZUAujxzdDTCsbX4LTANA2ES/sv/8v/H+++/4Z/90y/I859Zz9/x3WIDGEsogJpP0Bh8Dejs4hFnL6BWjTQyg5h7qWHugRT6Qwg1JKtimyK1cVrOaFV2JMYwMcQdKjAxogHfEmVW6CFalteY7P00YWwQSIhMaMm0ujIcBggjx6uJd+8f+Ptf/Zrf/v73/E/++T/lej9Q1sL7x7cs60qMwvF6T6uTV36BJS+kcaS12SqaGhjCaHqIMlOWTBoG4rxSaKZsdvM74oiESG7Wcq79AS8L8wlaSS6EMQgpBNlsEM7ZhEa5lUs1VCr9Uc1iJ8WWZTVMV2ND7RD6Q+eJQYENGw+EQRhS9cU9EdU9rRUkCsmV+eZ8agHepEuV4MuZgvTZUWGIgycnHx57ADAMd4uMG5vJBu32/bkV1vVsbqxNacWsIpay2l7v6s/OJjbz/1J/iOlmez2Axq3aUx3YwooPSi4wAVzSRC8+DPoSMRuLp6cZVeH6eHDk3WilYftf/WHXPnLwSL+BB3YpNpsIj23atiDkY/gtuPbuuLNhejJurW4zCQ2J7kPkvRu1QF4aa1bWuVGysiyF8yIsa+Crr37GR5/c8sff/w0vbiam8URgpISBwW06KokQqttG+G4I/zxo2vQC3RKl3wxtwYIkzQV4Dp/1Ibh5VaC1IAHGKaKaCTLhiL37O9nZ7HK4oIYgIFjyxQQtusFLwdcE2JVovojJ4G3BnFsvNFmcGt4p6NrnYAjNhYG2XGlwV4u4nREJHeLqDl2yHSNLFNFV6n5PHEbdjTtUFz68fcv+eM1uN20U6v6frbsmUNScE2LcoW7AOK8roAZVa6MsK1NKjCltCaKJUJdl604lCNM0UVolroFk1D6HY3Ijq4nYUspM0wvOj0/ksnJ1vMLd5h0msMbbTm5Da+PXv/l3/J//L/8HfvrVKz559Y7d8MRhBMpASBdnQ8QYU6ILqSnGchGvkOzgEy6shNDPgNTtwgQxTDWECJLIeWGnB8YpMcaB5FuroppIxAKFrycVg8Gwt05uxlMKAXbJW7ppR1QhjYm1VvTpiZf3e/75P/+5K31NtzAOA+Nk7WGKNm8ZBrvAVRq2GXAlxsiUJoZxJLqRv7hl8bKshJBY5jNP84mbqzsIYgkxTNCMPYIHtiE5h78uVlGlgASzQhHXLajDCpPU7SCFiPvvdGl/g2aqTdQ6CYOXjc8epZia2Q3+1K97IFoyEXvwQ7LZzBbTXfW12RsgpGDYp+kUZub5RBz3mBlbY55PjGM09TyN4ApYBypQrWixIsUWua9mvldmAEpTWqmsy2qd7lbqWxGkz2EG2g80A7ZX3dgkfU+DuEXCVjB6QK+9IKyXSlLp0JLijGnKupi54fF6C+5bIeTsLHuTnZYZPLhc4IjmCcRYUP19hR5frfreqmOeVcI9KTWbcfShBsnjls2HCI1aGuWcOZ8LtQTmVTnPyrIEchY+fvMZP/ryc37/2/+Kl7cT+12FdkAEJqBFdTgxkEMktmq2IY7ZaxOHzgY668qeTIDsSUwci2/uFG2iO7sSLoAsld1BnNzi1z6oJ4pAV41XVkMICF5sgqSLfsL8uwAXpnVYsAONG6TjswVVhaAkCT8I/L1TsKZFLnBR7C9UL53Cdj6gGzzZa5g+RyTa/AaHBB1i1AC73R5iZH46ISnYTMHJz7bSwA6DhgYVahHu7l+SxoErhXlebG2pFvZpx83tDQFlWReD5ONAW1eyF/BDtLnnuq4IgTgmklkVGMQkKZJa5fpwZBzNOnpMthBnjGGzJ0BsK5oC42hWDX/83e/4T//v/zG3e+FnP/mUiPkshTAwjBOtnVENXrE5qwAX64nZX/ygvVO3vlX1Nit4HrabFekPm92EcRgYx8SQhq0hF+kJwoabQthUpTgu3gQfqroJWYIkA1EDw2Co+CDK3d01ISZubg8W6E5nq4TTyDAkxvFAiIFcKsMQacUsDHaTXXSjr3bedSUAcRD2u2vmJZNzYRxHxmliHPfENFqb6h3Uw8MD59nEMNM0MqRAiMqQ1CmMTpYn9kerR68t6BIC4lzypFCKAitBElWawxXilGdxb5kIsfpB79YibmGtimpBa7AKstlClBh834de9hEEr/aWfOLx6YHddCQNAfFzkNczw7A3aKdX8GVlrYbf52wLlqqqs2+q+S65iKjk7CtEK4rRa/vGro7/22fomJHj8z3K26njEgEcLiNulgfS+jW+VPXQjS63nIFq4+rmhtaUqsU2PTTZxJTPkIotMG0wE8546mIwH5L36083jvadCULbAmTTRl/3ac9ZM3ZUe24o3u9jpS7KeV1Z5kYtypKFeYVlhXltfPTmc77+6Vd886d/w37fOO49yYW0YfKhqf36KoRklXrKSvGgZVWxP7lBqK4viZgHlrbL815tnO9UhLZBPrVlisKLw2Q0cu/YtqSjBgvajbkE8gCbP5ZGgVpprZgHFOLx6CJuvNyRfoP9em7HokN7hoyIdF9a6DOjrXMWIUTfSKc/JBdUh3N6R2PFV39N/0xiYscAFhOG0fUTljTDsx3UFsdsW6ISGccDuZk3nnGPDFYvpZhRaFkotbILe7ueJRLIjNFtZ1JE1oAkWz2cUnAP86pItaA87Saezid2w8Q4jjRxDNVhpoiwAilETqczf/t3f8t/9B/+HxniE//yX/yMw5jJa2NAWEO2ziEq0avPVivB2Smo0lpXx7qIKHYut/n6N4VENOaANdV02hu+o0IFktgWuFYK4lbepoXyByeYaKnjxiHYMpq1WgVbqSQSMY3UmulDrRDSBsMc9oPtmUjmABljJMSBtdqi9+v9RK4NjZVr2RF9xWlrdbOmzqUYHcL9UvbjxBgC6eqKlKJZnktkbdW7kJEhKn/87k98/+53fP3VP+XTT954BV+5UC2b7fUNjuk71m2YqFH9jtPOx4K2IzhXa5OjRPucnnhjH9CpVXoiQm2pl6+0ZtRoqIRmwSs6xKR0mIEuCcA2262cn84c9lfu/Nv9aOD2+gWNCjUjQPZKXJqyrgulmc1xH7qVbDYaXVFb1DykJA6gCfPxYaPN+nO8daUXb5yOF3eoow9S7aiZ6Vr0DsTxEjHLbrYAZxBT/7MFnn7djXbbUKQF79ac8ujn8rK+tCcbX1BE2+6rvX/DvJsGxCtQ+7N/HtmQby4Db58zKmhbLKJqo+TGaS7MWSizUCqcT4WlCGsO3L94xdc//Smn0x/Z7x447BPRq+8+SLXoHAgt0GI1Jk60wJuqQcKlyda12eXqA+q+M9x7RQlIrbaYx699daibYmuR9+OVqeql/fD6+ef2Hss7Cx9lkRllRLPPUBAvIiZzc8XNAKNV8pZEXMS4xZne9V/uC1s/04VulvyLXnY+WOdvLgbNEZuq7nTdk2FTLw1sXN1aMNhKTGsiHXbECAilU4W7YFhBxTrbvBY0HGxCe154//BAKZnD4YoAnM5PzHPg6Xzi4ekDX3/9E5s/DxF0JOfCn/7yF25ubri9vbUNmKGQqprvTkjRl9UUIoEpDbalqTVbwJOM57/mbBDPEPnv/93f8Z//5/8Z//a//W95cbvnl7/8JdNeeXx4b5n95kjWTBr2ZgMeTUQ2JReIGRpto0L1DxxsxtBqsUVHPjNoahk0NcPM+jBMetXrnPGgENJgN1kt8UmwTNpx+x4xTIgSrUuKghTjLCc10ZqIEjXSogcKpy+GGNjvzdDPIVdSEGI0ZXQKgagmIBw6tl4vgWgaBpPR0wjjYN1RdUuEGIiDdTqxVEoTQqzc3x7Z/eynPD6+YRgGxsEChqCGnWpgqStEzGdeetEbNqgKVSTYWDBivWqK0SG73nqbdw8qziG/2AeIKDEFSq7Usl5a9CRQbVDYjdtsw13fMWGsESFwvL5yqOMyhO73ViuspVjn15SaV3JtrCWzLJmiJojTKuSSATb1sTZnKzUPrgJo9UAw0Ae76kyeXjyGoM8Urt3yoH8yhQZ9iKrNHtTqga9tAV1csd87Fdn0OKgljrBBqboFt96J2J8vyaAPpJ+rsu362+83swW2gGmJ2Dqj5l1za4szs+xsGHSTDF5dzixLYT5b17CUQM0w10opgau7l3z54y85nf5E0Lcc9okpKUOcbL6hQkMoliOsU612nTLJq2QjgyQJfkssscQObbfm9GNTNzc/a7gCG7Vntlb7fGkEGQLashV+3eyQfm2NPWYXqv9uv5OKEyfsWQkALVuHpo6JFN0C/qU9uMyNnmVf67g77GdTaKO2umvs1l3S4XBLAerki43OHHqU7zAoqKgz1K266jOIDl0F70ZVtwec3lKV0gjR9nd7O8Svfv0PfP2jL7m/vUVCcCEvHI/XpBDs/SmEYOsW3tzfc1pWymIQlNZqViHRE4QoLKVBqIy7ifW8ElOgJauEhxRYlpmQIv/Zf/pf8H/9j/9jRJX9uEcb/O4PvyPoS06Pb3n16prDzjDPJCu5zARgt5soQ8e07WKkoZk3Uq4s5xNXV0dAGVJgmqzZrprtwRgiosIkZoVby2pCnBgMUulDeG2UavQ40bjdoFadU+3GaV0zgNoCkyTGzGjaKE1tgFxBsW1qrZkDqjgdW70jGdyRsW3sigihkLvPscv3rVLWTXcSpBJDoknxaqQR3ZiuxsYY7ICnIXAVR25uPrIKGxucmcDKPe1jskBSKiENBIk+s/2hFYQdrcHjkScacUow+IPcq+PgdL3Kui5stD0RRJI9FM0qw6rVLB18X6/ZNndVcbHfHRwrB1QLVYVlOVFzNe+v2qzSK2YymGuh1EbLDS0WFAzCMr+s0PcJi9LtOdSluyFEQrswgQy2jITQX//CqBJxi2a/QD0+N/oYoesMDO5pXFTV7dm1tZ9XhzUtmHdQQnVravlB7fvM7uPyqv78d3Ol7f8+h8Q6PNG2GYz6VrVuF6Fat58pasLXZa6cz7Bk4TQbjl2bsma4ur7l57/4CSW/JcVvOe4aSew5iGKFU3McvorrS9wKgwZJI4r0vXZbYsbtzI2V5gr21umhDjW3Bm41UbVSfbZUG9werhjiCGG1eVFol6E+6oPxPsVyhlFThjiYI7Oz9ULXQXgQt1GSa3JoRBnQqrRgXYDYQ7YF3a3IhG2mgeD7Lixwh5C297XdKssE9pw6nKl6SUzav88L36b958OlaOlFRdRnn/UirGwqjNNEjCO5wuGw56uvv+J4OJBpDMnslSqNNA28ffuW+TwTgePxComRw/U1u13lvNhCttaUtCwLV4crBEsAT49PSIq8vLvftAPiexVMfLHjN7/9B/6T/+T/ZqOwIVFa4dv3Z3KBp6cnHr9/z1/9AkJT8vKOlheubw2DHsbI9XFHCNXmCjSWFc7nlSBKGtTWdCbzQTo/NiSF7eYcDkeiQiMz7XfkuqICO9nZwQtCKWaWp636ovpCLoUUol3jwRJikGRCKQyrtAK3otGWHokaftj8xjcRoiQ7HP5+KnXDuWvzfbwd//YVZep6ANuvm9BW0KD2TNBMcBY6NGPdW/dgt+pBUayCMsgPb/nNtCJt8wOjKrekzg7q9gRemxpw7UEJhziwbqFZMg7+gNtcxx1Pu8CqWQKLIXl1Zt5XS10Zxx1RlKaVvtWrqW0B24KxCDQzyst5RV1Z323jTQW90pr5K/XlV0ikqdGH+0OiPiHeHFhb9SQwbMlr0z3oM8z6wi3aHuQuUrsk07oF/UbDfPrZINAojUq0YKz/mIZq0ILh6w0YXMBmvyDgjgNbgDMIQ/2N/mN8fPvyZGBBo0McDjF5caSaPegJGnwlpoAwknMjr4XzUlkWpa5CrhGqsDYhZ7i6fskvfvYzKCeSPHJzDKRYCG3AnAsgDFZglRYYml2D4o4CbWModkjE9CRSgxVBGzwil+7Mnhw6BTS4lWGrzsbyy3Q87k1A54QZ91ft4dq6AfURnl/rrJlEcFtx2brc7rjqT60XB87eC82Ebc1ouEEGk0KGrtl4Xgx4V4GjBU7S2ESUimlSgvQ20GAmjxOKOCnhefEQtp+tqBeMeulQneCzdTj9eKhwXgtff/WlxcVTJjR4cfeCIOI6CUhp4u56RxN4ev+eZZlBAtO+UnLm3fv37PcHc5l22DS11sg5A7bh7e7+3k3qbC/zsiwMu4lxmHjKJ+Z55r/57/4N5/PMfrcHFQ67xG4aOEwWdcKU+P1v/kw7P3J9vePPf3mg/v6BF3d78vrEl198xO3NjrU8UGqhLDv+9t98w2dfHPn6q48dPw20tbBUq4xiCIQEbXXRXGvEx4mUAo1A2Stxsm1yFsSssrVQWc25dhwNB812SGosSIMhJESi0TINPbZqVoLR+tzkrSkg9dlw0A6dGdB1AZH6rW7ejscNY1UfhHV/GWmNJkpr2RKX97o9GSUxyMGsH4yHnbySVwkUt57omKi5TtZnD09zdau6B5JAUGydjLOVrGe3T93pcNVsrg0dyeRi+5wj3p5itD/bOqikNFgH4JCJBPUQuVKyvZf59ESulXEw40jAZwuZkm1ulbP5KRUX/GgpGJ9f0SrU3iE0sz0wtCf4alCxACX4A5/o1FRzgMWrSOsILnV5ATFTyM5dN6Vz9fGD6V5NWPos6Wjx4Cyuh2j9J726FFrvbN0XyKCf7CHN93F0jLtnbS6dWid5XAKTFR0b5K1ODyVAqKC27dAwaj+PQVnyTF5gWZT5ZIy7VY0cd66RNTdubu/5+uuvafLAJN9wfVhJY0IYoVUkeKJswe22rertFhIlWgEQqFRRh/Gs8kkiBE2YFVrduj5r2WzW1C1GtJmSurXiVilKSoEw+NKlDt1IwcouYxbaMxfogj1jNlkCaBpN1U8PrF4UqAdlsY4v+pUtuSHxksREIsOYtvvQdRhbKeUwkME2wU0LnSkYjOzQNxlW71abNu84ZCuq7F76nyVsHW1nTtVe2DU8Vtj5arVn04FhuOE0LwSUt+8+8DQ/8vLVa8Y42MwCJQ62BGl/2LPf72y0oIrkyuBQ/ePjgz3b40iahsncW9PAtN+jVEoxhWoU2wIndjY5Tnuujld88vEbYvItURLY7fYcpsbNIbKbAh/dTaS0cLMbSFPgs8Nr5tOJIUTG4cDpfCZGRYbEEHdMNyM//+VnHA87clGWljm32RlKyhAjJQjkzFoDwcuywsnQdW0Mw8R+dyAOI4f9niB9vXjxC2jTfRnsb6NEYgykFFhTs6FibYQ0mK0D4him+hDbHsaihRgGorO9grfG4gPEhPrNtVPzA1dL/PD6/9MoxuWOsm07s1mCm351908/rSLNPbt0c47sG9PsW+xBq1oderNjHEU2eEY7I5ILLt+cItRQHx6amKf6bAHM719S5+f7zEjMa6Y2s8AIEqktb224quHmtRZyybS6cD6fCBLdJh5UzZU2oLRqD0+t6w8Hzih9uaVi17tfS1PI9u+0AKN9yTyCm3/Qdx43t5cW6d/fA65BfAo0t6WWaiWeeFXXVdHNWUXixUNt3YLjeYfiAWh7Z8EKD+1rYfQffS9e5eKQngcpMUFY9xfq9e8PXWmbETgwJfklICt1UZZzYc7KOgtLhlygZFirGVne3L7k66+/IMYHJvnA9UEYx0SSwQbjsUM0gRpNXDhgTLOiDq2pUFOgNCEG68ptfmw8plat3u+Rb1u65J+lXwk7c9W7bIOaro97ptGeBcWgtK5vES+oLuw+cUfawC7uiUMkBXtdpbkP1AW+Ubl0gR02FIk+UPYZZhifzbGePc2qG6Jgf34+XwLxlQQWzht94G8FV+x3km01T+jD9j6Ct+Ktn9GAwYJRxFcbiLP7lFYbS25cH++QZt17jAO//c1vSGngzes3JJ8FB7HNmo+PTwSgTJP5O80rN/e3CMJh2pslfwqkRiOmyDQMtmykVMKQbNGGvyFtylxnQohEGn/9V3/FT378Bb/6h99ymEZ2U2JMhaDmJx8m8zDPumLsgMTN9REJybUSlaU0g40SUB4Yph25ZdaTTdRDqyQCQwiUYHuaRUDr2ZfNuIo3mj5giZWnk7Xbu+lo1XqrNKkMMTGMA6ozKRlbISVTIo7JdlDEOJlXfDHR25CCLVpvahv6gjCkiOC7qatjktEYQU0rilCaWQ2nyznaHoBe8VuvYgd9o2b2gCCBWuxgmfDQVKVhswK1rqJ5qxnxLVfa/D3oZc+Bny5tgWRNPdVfu6mSvErHh4k08+gP/p5ETVWtJBNNroZRlpI3503tYjAMessuZAsx2kwhZ5s1oG4H7t9bGqVY8FaFXDsF0h+M/jBvWL93Cxt237YEuQ3oN256dGPB55i/bAEgSId3fFmL3wClJ0w6gEDVur3Olvh75Q8+RLT71llzBgn9owTgj7lZdKvpT7a5gusmemR9/uUmcPb/3efJK+Bu99BBG+tkCoWIaqIVZZ4L57WxzoG5BPLi84cCuQSub17w45/8CJGZQ3zLcd+YpkZUe8bsPZmNvRoG4q8UUD0bhh9t+CkloKmiLZGoVE/CKhBa82vibJ2GD8F75rWz0Wqj6yrxsxx3yvl84nC191dOW79u99eKB3TLE4zB9zHQlwnZGeozC/G5gL1K27rvwTumVdVnagbnPr+H/mp+buxFbUZn7+eyPhk6/VRSf39iy7qCQvMO1u+ciRyjeWoByrNNiGKISfDf2XeRiKMH61rQlhh3R4PNgzCMA7f39w5H9wRs72sYBvb7A601xmEk9N0YwOn0REqJ49WV6SSGcWAIg23pcnVGdIhEBdZibKbg8vbWKq9fv+Z/9b/+3/C/+9/+78lroebVqmEN5FqQHNz9NFCzsaSXoRKqm1z5ja1VkWKl7dIWu3lSqWL860GMSdTx1yCDsY2oaM6kOLCsvkSclagrj+cTbfkWGaetxY8xMQ0TKQnDaGyDGISr44FhSsSYGAchxoUhKJIaQ4zEaWdDMsXt0BcbtgfzoxKMDaaOcoSonJfMbgzkPhxtjRRtn0V1pWvo8wmcgaW2UrGqt+Ot0Re/B8WTCduD0DsUVaMvF0frEQMjamv+iD471mLdit1XEwdBM38W/1nVZvMQoGhx7Ywtk1qWgpZCqSt5qTT3sQkhPkuCAVqzpNCMfVRKIeezBYoQyUv2ZGAOrqlZe1spSKtU6Z1Bc+qtvzl6sO9x1f35UfoSIPueHtCTP0yGjfTr2WGlTXnmpXvTywzDXr0jCsmTZriYAdK/vxCITmHty4JsGGuBvcMqOBx16Y7EX3N7788SxEX4t8Wgy/t6HlgBxZfz2Kmw6rIIrRbKYsK4NZuTa8lC1WSsFZTb+5d8/fVnjPEDu+mJ6x0MoRCHSMDOLD7AvVwqoakQtaHDhK4LhORFnC0A6wWM/UwgK2YF7jBJT6oxBFrL9AU7TdWGpX4ga1OmEW6vrsyDLdpMJiBW0Gk/t2ydlZEG/JyrkKJstF8VNlLL5q/V2hbcjSRoeE5SixuNZsaCcTL4yH6IPh/oRZYiHtztjMZo6w42kgcY1OTJJIgjAc2hJzCnbH/WS59z9SIkXDr/vpOnT9RVYF5skdcwjHz79i2H444UIj/+8mtSiiylbM94f99XV0d3L2jUdaWumf2LPafzmW+++5747i1fffkFSUsjx8IYbceDPSeGp601U2phlzbHPASl5srPfvJTvv7qK/7+7/+Op5MQ0uQBXYllBgZjIKgNMDUH1DxnKWIVsLRKbND95kUbNWFeNthuaanVsq5EkjXsfiMSZSvWHPcuK6dz5fSYKeXMstgDNqTBeNCqkALTmExMshuZdnuGIAxj4LgfGafG4TAw7iK7oVinEhq73Z4QIImiuiIxElMwZpJe7I3F3+EQjKIKnWvP9sQrwSrUDATzZGrNxGFdxakqVFd9mqvwpZNQb/XFjIFsQK9i98hZRP2q1O7jE+xwlRiMC24ltzni4px+F3/ZoBlKLtTziaVk6lrJLdOqsvrsQFUZwgRBbI5AYyKSm8EfGiJaCkszG/hajXek1QgGaKWQ6Ru+1J8a7QZ8/jtkezovlxHwYeKz4LmdBO+ivKp8PuTVTpH1s9N8YBlCQjFX2KomULyI2AwaMmJDRLR4ZyIU9TG/Cz7BX89hAJELzdWG2njndrmXl27pOe310iX9MCkAeGEiDrdJsdkMybUkyrI0zudMXiJLsQRRVFi0QRPu7l/xyWdvCPGJ68OJq+uZpIkkk+1z0eYBypJEX4CkNKSq3Zem5DQiapqoLMkCcgi+C8ICbIjGZFKviMVnRJ3k0IsTIypwmaMp7HeBaT/ZjEAxVwNMIyFut2ELjPomODEKfbRd9fY8uQ2Jn4kQuhjUnKlLyVaIIf47oyU1TNNwmWVdiCCKbcfsi4ysg7lAWb3L65v0VHuClK3v63vSQwhmjNhseliCEUk0GGTVi6NOH7aY0OdgwpBG1vUtV3evOBwPpMeFv/zlj3z65nOmcSLnQlmWTe8lMVCLWagH/M+l2YKhIfH6/p7jfs/7Dx94fHy07e3G1glUMShhXVZolg0j5jA6zzM5Z27vb6gls0sDX3/9Jf/9v/3vqG1ifTgzysA4wqyVsUUG7QfLNZfaRUNdJWiy9OBzBYBQPcPSBZuCUTzDhVbnwbM/NuYhL6gkxp0Q08jDaTZKpgbW2tDVhqN1hocm1AIxLBAeTX8RTMF4fTNxc5/Y70bge3bDyDAEro5HpjExjQpRDKtLo22UcwZCDDD4Fr86JmcHYHsTnlk1o+ZFZcNrYalG45XYaXjikIhZaxDU1MGa6XYFTSEMccODQdGSNyxf3GtGgIIJklSbCw4bazW4KM/zFkQbjqE2m8M8nh5N69CM2bYui/vQjE6ZPEF7YppuWOsKCrM0Hya2Z9CQ2WbYw+MVc09ezUSLIs76kGSBr3WVt/HFpf8Z6xLsdHTKq1VU21pRNUXulnwuMRakPYvJ9jOtW35Qzerl8tTb92o3CLSVsp2nLv7e1Bf69BlB58hb0qimr1fbVeHLNNgEaZs4SrZksNGGdUGY/K16d+HDcJwybcEnUVtA20qtkXlR5nNjXZVzaZADuUWyJrRWXr56xcefveJqeOR4OHF3OxFDJGpwA0bH7pMFKxjNK83PeBNPIOLJ3+dcQ1JqtU5DU6TWYsHcz6c5z1pSFMywj2qGctUTt2Kdbh8x3Ny8wBQQntw98W7urY7tB1fXW1uREY0MaTDLe6rNRTahnlXiMQ6UljFGDG5Nb++hoYxpsAQRIsF1L0K/z9adi/azAqbQHvDD4h1ARwGcZq2mPFcJFFWfbTYrJD3wiT+/zymuW6HhgsDts2K6nQ+PZ15/cktrym4/Ucqtn6/GEAM6mlZoSNEISTlTFosnwzCgKTCEiZILORdCSLx4+RoRJcXBhrAEJXhH/JdvvyXGyKeffEbNtoFsrXXbvGa3q/HtN98SgxAlkmvm6WFmvBt9v7RAbag7J1aHq+TyccHHsuI3jc55p224nIToN0e3i2MPRsdumz+ENmwdUiANAqNwmCqtGZ3N9hsvhn0XnO1R3TcmMq/KvGQeTivfvzPLjETEdIPC8frA9SGwmzAfq2BagBB3jLuRIdo2tRhhGIVdMvvfhi0hmVLweUBw73m77n0+ELX5YMndT4cBowYazEOwoWxoisTkxojLDwJowOBCrc2ZIGLH3UVJpSljitRSWbPtz52X01bJ2pnqi2eyrfssVrVWmsn+FULw1pVAcwdWrdZBWaC3IGoskK6LKA51dduEbovhIjAJQNoqMOkV2rOgeWGPVU8AlyDRpzyWLII/XM8gHoWmGWHwhy/SyO451cwGw2cPAds2t5Uq3fYEw8zprX4Qn11cbLsvWpTwLOh3y8M+ixDvsMtl/4H22Y4xs0RxYdVKhzDs9d2PLFhkbgS0BGpdKLmxZtsgt7i9hlZlaYnWbPnTy5ef8tmn9xz2H7i+OnOVMtGdnCUqQazjatWea6It+xK/DupVvMbqgmuv1PvzHoLZuhQooaMJAQk2M5NmqMG2L1ztz61eCgow9G2fxLt16z66KM04VR1i3PBH6wjVIFdzIr7srQBziMADvaIOB7n5gTsg9FmRiK086FRynuUCsKrecBH7ezuaz4wVlUvH4Of3ea3SsAKjadvYWXbuLUupRH7wA96t1ho3SFXEvNjWtVBL4tWrz5mzCZZvro7M88JZlOP+YEmn9iJLGWOE0RYSaQiM42AFTjX25m9/91tqUz799BOS7V4eqVUJKfHw/j2/+c1v+MmPf8IQI+u6Ehrc39+ZCZ9asogh2pIaX8kX1JTRVZVd7H427jkqEHxfhWgzpkjwTVs+5LOM3G+80Bko/THsVgd4Jqe3b37Tkfh8hS1IQo+jsTOqt6EEIFJqYZkry5xpKK1FcoZhFpoWo+8V5ZTNeTIGeJrf87gX9jth/3BGxCohRRhDZHc4EAfl+rhjGBIpmWVHCnbgZBBSHAiJDaOMKVk1Gwz/FMlewCpjWOgLVVrLJNdXxGSc9eYDsK0iBe80vANTO1gND9wWwXiisZbqCumA5mwoe6cgViWXYvMTFdb1CdVGDDuKKjh7BTGWWSOx5MUT/+BQkQ9XQ/fvt/tZxeBK38u26RMMcnm2lc2PQN998AO4ReFCbb0UVBcVM1sy2eYXTWmaYbN1wWmd0TUpz1hJcilhjCprSvDOUgvRzeOCeFfQf85CQtNK0PjD4KCGL9vebEsXvatW30qG6zjEQVUzqPPP3ky01hNlwXa90AxCXUumrJV5KSwr5CLkHCnFvINqs2Ty5uPP+eijI9eHR67vzhwH2xGSJBKDnSt12/PgA9wApAi1BWLtJGTD9lvwDW8t2b72GDZUMEVhjMLczENKmrq+xK5l2NZ9ZnALDzyw4g3W9e2e0Y06Vc1zzATCyWFE2e7xNmCParBps87UNG52rWMIqBjRw0qXDM0K2BhG1IkTRMxm3OHKvny17/+wLrkngA0Y9LPQLT28i+jhSDqNtb/hjqg8Lyx8eNwvgrUgF5gSh/Ojs9ObuQWYd9qRYbhiOa8M08S8zNAqcRzJeTXPt3FEXEd2Op2RGBnTSAp2pmtpnNaZ43TgzauPKO5SkaTBMi8s68Ldi3sLBCjDkPjw+Mjp8ZHr62tGbCDXsGUuREGzXfxAYBy9YmyFGG35eQhm+Zxicgz2ktdVzVHT91gBZkInvij9krWddxAcRmC7dtupsmrMueVN0eDujx1pTArt8pAljbYI/GjL3mtdgESQHbVklIzISCmFVmzHRYhKiBDSuGGhRHMsKg0en05MQ0SrMqZAY6FRaFUZgpDGyTbMpYGUPBBFb4lT2qAU+sELkSCNmAIhJkI7bf8eo8nrN3aM9Vgbnt5U0Zahr9SUXs3Z9Wm14/dhM7+zu97tMQq1Vntw2wDa7FyoPQi1GU+9dwNC8mGl3ZVON90c3jYU1x076cG80emPG2G3BZuLVSUF5/3X3kkBOCatDj9FHGLr1Z79potAKm1QTV+OtHknbf2pUYRr7xroA29jg6DPtAktEEOjNTvTIhC0bkZ13jf302mf7xnkpeqbx/qcBDeLwz5bp8lCo2als1cuiTI43GbXcM2w5syyNEqJzKVSc3AVtVBrIqTE64/f8OnHB17eP3G7F2I4ksITNGF09X/1udCw8ffx+Yyvx42jiRbx8iNc2GOJZF1BLNQqhNKQKEw6sBSHFINvpWsYzLcuLGtlzaZXUi4d1ZDg+vqKMIjPB5y1pwFnvnh08BjQC8xaQRZSOvjWNivyCL5vIjSCryEWgQElVoyl5RYdEoo5IjxjFaovTb+cVp8lNcCfZ54VNM/4T17I2VsOjqxou+zXEBmcFGHFbOjq7V7P6LOfDxddhbgl+/lckDBxfXMPYgPz3TSh42izDjdPPS0Lu92Ob7//nn/4h3/gxcuX/Pjrn6K1cppnRIKtsV5Xpt3IJJGcV1KIwYRzEljXlZuba37+s5+y5sw//M3fsCwrn3zxGT/94mtyK3zzl2+JUXj9+hX/4t//l/z617+itEyqymEX2B9HUrBd1CG5CR+R4APd1gOa2GCrSQ8blmTi9jg+/4qYCOkSBPoHl66A7g/yBkcl3x7W23xxvFsxH/VGGM3x1ayzXayjCRV7CKOM9LWSm0dM8N3NMm68+dIuzDClkZuCmBnekk/kAIMWYhlZWDZKXoyRlIZLoBCrzEx4ExwPjEhyT6ogHjB6u6nOwzZFa8fxuz+9aIXm1U/n08uAkH3YbnqMwGVLm31StZmBU2tFxu3aouvGxqDzpTY2Sxf2QSc/XAa6rkv1Z0dDfEbhBBisOpIMGGRhD40HFOXSeYpQXEiGGxra93YxW19AkzaIwoLrYp3NM3ZLEHMVrVq9Yu/299atRjH2Vu9YrLBXzBRMbA91Z9bApRpuFZuhZlR7EWDuqU2blcrBvs/wDrt+qmz7nvta1W6psjG3mt3PtSp5LSyz0YnnEmhZaESyKhQlToE3H33EZ58O3L/4lttjYQhXDNgOCKuwbbFUiub1pMHcklVdRNjsM4YopGCfuRBJAqrROtGYCNVW+iYR6yqq3fsUjJGY/Tnvhoi1OASlvdO3oDw35f46cLia3EIlW3nhbtG9HjFUsXnHVbfuOcUDQxisg/DCNBJowfRFRhHvsKbTsJvB1VFXE9FGdcaIbBrNTltHm+/rvhyMTk3u1PBNOS+waXA25p13Iaap3lClS3ccLn9Hz4ed6WdzzUigOrFgnhdOs/CHP/yBT778KSLmdxYl8Mdv/sz9/T3jMPL7P/yezz7+mJxXo+lWs+jfTzumYSRX724Rci7I4OXThw8P3Nxcc7w/cl5mqMrd3QuW05lPP/0EQuDq6poWlJZhnmfzX1pW/sf/7J9xddjzH/2f/kPy+oFpl2y3wWCfWJ4tsY/OGmgY1Q2Hl8KWcS3gPF9luTmJigXG0IG+H8AShnHbQ6/eTjpWK/2mYhvSUEpz22zpRwcUc8oUOtpgQbdi+L+lGqexbeyGYq6yJNK2n7aiAZrTLVMc2B9eILq46AET7WmwikmVJectIdiXPRTqlU8S/PXtv42h4JWpWtoVX4G5EQSDD1opiAwWSGVwb6ZsD1ZnXJHo6gRLVnVLKPaZHYsXs+lA+qYva1Et8RoI0QP78y95DuVgjqhmfO+22A43FR8ad7pl1eaa3LjZhmzeBU176vcnqasakj+A2c3tOpVUvNMM2yrb6Pegblmrv0dzKbbH12Ag2Z7Wdnlw/X/2jgza5cHuNFW13sJ0AWL3Fa+ErYLxjqUnw+CdDK48fh4gLvYmrTRKE9bVWEy5BtYF1mI+xhVF18b+sOPLH33ER28CH706k2IlIQyyOvNO0bhDKwQx5ksTNsNNex7sfbfWE69pY4zO7kJF3/SoMlA68y1CCo1CMjfTaGe1enGS85lcKqVWN0a0TrX6GOn6/pooCrJazycCwWjN4s9uLwENmgQNgpZmz1rwJ1bYXF3d+6C3rdgQ1vy9GqDREAebo6i5G4AP6BN9MxwSfbC84Rxb8fZDhXz/d6Oc1nbRSHkP5N/zQyZd35t+mWkF0EiTZskbizHNi8LT05lxekWLAWphXhulrI5amAuFbNvmlN048aMffcHN1RW9bovR5AuXpK2E1ohDIj0+PKC1sf9khzRYa2EII+Nhz0eHPURrP+fTiRgjP/nqK9biC2rays9+8mP+1b/6D/j//L//H1QWb5sGWvOBLIJKcTjCKWn90nqiUCl0G+1GH9g0ItEHipZATEbTE0QPau6Z7vQw9QczdijBHSFrYzOZc1CEbn1gTyOoPO9jenC7eB+JH82NRdOqLZSnY4cB5HKQiOrCmh3i3ZoZ6lm2ts+mLkgLsHHtuweMhxUJW8DTVraAYopn0JqJkuyYSQEdLXBrX/giNB829/3R3akpCpi1h3UzRo91BgXQB+NWfnlSoGBVcXRhmH2rdYc9h18Shurluvd/EzE4qy9QCT1D+5OzdRIi/mBcuiTV1R037eGsmjHPJq8qnUor/T4DaHWmTtkW+th7y35d2MgSP4TFHC7zD3CRAPQZAj537hHF2Uf+gCeJFKl9orpdKPVZjaqgBd+I7LswvJIMOnjCjjQiTcXYh/NKLiO1qDm3rhNGYDMigNbI8Zj4q59/ypefLezGM+PO5z9FvPu2PJXnhVIK+/2RGJIv/3LZm89T0AsOnpxC3CSgTag+8A8uJkzBiqCkKzUJFCXraq4FAORNoW+UartUQU3Hk5tytQscr44UWQhaiWGy4k9kUyVbUdlvRvLZwEpLMA4RpBK9E9wKrGZQpYYON9rPt1ChQWi9a/SVoHYCvJvK5lbbCyX6AFn6t9EH2GYmmC7FbsdK1JT6pb+uxK373eZnHfbTTp/2XeCoH1If2auiTalFOc2F/8X/8n/OJz/6CY9LISWb9O7Gkd2LV0iyLud6nNCcmaYdoRbCMFByZm2V83y29+jsNqWhVWgxkF6/eoliLcswpI6SWLsRjeeuQXmaT9Raef3iFSkE5rWwNqUsM19+9QW//93n/OUvvzKDvLqQpqO5lDqWp1oJoRmU4sMx/O1c+Et1qyT7Q2rXs1cL6qnBGBgRw+sQS0gbJ115hvF59dUqq7dZKfpDTfQqVNm4Ch6og7fAFiPU/YH0maxftt9/aQUtEfYb3lCSqrEqtjPnKSr4YFKKv+b2Yc3rx/fz2gBY/HvXbYAFrur0hKHq7o4ybVV160wNIDQF6RqK3uU5aUDCs/c9WrekXTNuXYRo8N4iIHRjxEsL3b8uOLtXqtv765eg0iv+XpmD31vt1xGfQQSklS0UVG1QV7/2VnUbjDg8f1b9D9XhEhPANQ94faD+3Ka7i+G2axXY3EmfQ0ndUsO6EraOsLXF3sPl9pp3T1PwJTmbE2GzpKkOjfRFQsVtFfEwJRq96IlAoupAK5l1qZwX3z9cC63A0ipVzayvhcKruxt+/OMbPvtk5erQSMPkkFylhW5u2Qhh5DG/Iy9ndscrq7odmuxGk6E7C6t1X05isqo2WrA0exorZFIcKK1YUI9KbZezb0JRoWqhls7ysnKlcOGn3b16ZRUwzWabySHr7XDo9mcVu9ad7ZScnq7VyTW6sjkW475lbry5nT2cYSW9ELmUklHE+QmeOB3pUF+8JYFLMlB1ttclNnS1/HY4xV+5FUu0/A+/1OeKF6+pRmcLioiZN/oCrnnJjOOBaXc0A84g5DmzrAv7aeK7d29ptfLm44/ZX115oSaMaWRKkeS/MwWzX7HePboyW0gSSWYta4Z+OWfO68y0M252AIZhYq2FMQ6cls7NVk7zyVS8uXJ//4r/6b/6n/Ff/D/fseYHapsNt3YBHmpSHNFAbcX2P/jJiVw6DHtNX0SidksNVnB9hVjQ6R6K7VngtWrebm4XvICJwqo69imB1mBtPnQN9dnhcu77psQVUzlqMzpk7G1gMxENgeYul5evTs8DqGiFmsx+5AJndGy5Wdu64eVtC5DNVaM9YTXMvE/U/JcMgy02jNuCr78n2ga3BfdraoorsK3CNlPKuL3nqpdtBxDs57V3R5fGOLSeNJ3G6Pe2JxpV3GffrxkWWAOg0gVWHUKxBND/3Fv3fj/MM6oZq0uVznDpGhuVBq3ZA4zjPhhHvQ+kO321bXCOXRfxB0C9DRA8oPdmoHkR4/MefTY70daH38JlgX1CW0axeVVtCq3avWhgHUNBWnKI4HlouBQIBtuJX4+EubiqqdZrZV2VeSnkGmnZNAmrJtpq4syQlC8/f8HPf/yCm+PMcV8Zx5EhRExXEZHgVEddESp3N6/cKiderNLVu/0+mI6XDk86i6j1rtC2CCoFQiREdxMoYv9RbNgvtt9ctdJyMEv56qIxvxJFld0E93c7hmAaAhvEqjnA+veJM1dULIjXgAXdFhgFovuHgSW94FmuiTGc7MRYJS4h2hI0h3LrpnC2vdxGDgn+HNiZTw6TN3GyjBcXiPBDUaWRRVpjU1/TNqRxO5Tamj3j6vYx0m1DLt14X3oliCWsZr8r18a4OzDs9jQJlHVmrcZeujpecXtzY+y3UhjHiVoKcRhoKE9PZzdzLfz5L3/i+vqO+/t7d9cwCL+WlaRq1gnB3Un3afKz6S6N2PB5SCM3N9FELwpXuyPzPBPHARDG6cg//R/9+/zt3/3X1PrBhD0lE4e4VbvQoJhXO9HUjC14Z4AFrl5NtI7SiRDVqrHWGQ3qFfsG3EAXq/TOo7kqYdtiFZJBQa3vDRBTGmpFYqKKpacgl5ArLTgFM18OGlA6rRWHbdQCgUhfot69YOzANWf5dC8m63Qs6aFWuTr40Y/E5r/UsJlIh9cuATVZtSoda73AIxWvdMWgCmnWwdHqxevepvQOKzwbCAJNkgVOxz8N2hHz2HfRXX+75mzb5xKNKsnfeANpVhGLIs3KgibBF0SZQhjt0JJsD1fbhs1Qfam0irXAHfmPQItig1/pHWGh+/AYPnx5j9a9dOdWZ6nUrsuRjaDgjaO18ly60ediN22dAdV/d0+wjdACoXXxYPNziJ+FvD30z9lsttNCXDnMs4ICSq3kAusamNfKWht1beQGtSYoEZWV673wy19+zmc/itwcVgZV9kOy62be+s5GLuBEVqXawNXPsimjLYkZ4cSLt9ahPbvmIaitLW3d7M8+Q6MSg9ntqLPEUn8mfclUy3ZOTEjqCcbbzNbg1euRaTJUwJyNo7MjfSWLw4/9qtoyIetwUrIurG+XC8GAZ+3zQKAXUoAroa3TJEYagRTbs+442LPZE4Q6fVt6UWdFkg0nLz/zg/PS0Wzx8+JTiW70F/zh77MNFMRjEv6uu+IfjV7I9jOkzMvC/Ysvub69I+dKGq3jHFJCUYZxJMbE49ODwUwhbIPrNA4MQ0JXmHbmiyVuZChx4Ltv/0IaBtNJPD2euLu9YZomlmj8/9oKqSYKZhexzCem4xEtjSWvjHEgTYnqi8R2uxvuXn7CX0+RX/27vyHP31H1bFkIC1gBSMNAa4X5dGJ3PDB4C9svkPZW8lnL1kSQDlPpPwqn3sJt8EGHBPCDjR0qCcGqxWAe+K0URK2rkFaJpdLGwR4WbdQQ/bAVO+g1IZh9dOtCMd1eCVC3yOZSthpAafS5ptTgoa/JJpp5/u2XL0seLVjgEw2b3CZhvqYbjOMp9mLn0d9RhG4lLdFmN7ivjjZvi11I1ju2/vOexPqbMhivJ++O8ftnF4C2/S57+83vSbBKqXd30vFsv17+7U0EW7bij7EfCEuN9XKfO8wkdePbb1DZBtVc2vyLU2jY5lVbPeqdQ6Vswd9+1jD2ignsuptu+0ffc6miK8/JF9XtSS5wpNmMIJck2CmMm0gL0+fg3XCtpi/JDfIaKFWZ10zN5ss0N2hF0AqjZD79JPFX/95nfPp6h8T37MMOYQfB9BRSbG6UvApofo98nZfd1zAYZh5sx3n1wBYwmKziFHV/39Whib66Vjfo0BJekOg2MYkUEkvOzMsTOQfyWqn9UfbrWoFhhPtXtwwpuwVKcghyIErvwNQLIzuNVbvQko16b/tZhOCEEtyhwdKYnfXLMiybX0hwWG1jtsmWpHqhERFnH/oZ6HTm7lLpXUGIBm11hTUY9Vwun6CzyV1WYC7LVS8nIjYjpNSmJJ/DbANvvdQReVU++fRzKmL74NeV0/lsu23EVj3EGJnSaDhhjGbNHwO7EJhPZwT47M0nl73YEmjryt3NDSEF0uPTCRkikiIZUz5u4q5oTIa1ZgqNXWvG7R8nu1E1UYOVKCaMmvjiy18yHQ78m//m/2VWECxWb3vAsLuZmI7CvMzoNDAF35K2BSKvsrFq1/zeI0G79N7EYdbiPbNZcLhgi7eqz/7ODrwKRI3b4p6RyFpnilbSaj9WA0AGlOoc8ibFFw5l0EB3fjWKnnc11Qbp/b3gLaNWu/kesmwJEX3uYoyP6NVHn4VZ8WBsKfGtWl3P0NWqQen9llUYoVtgg6p/GPLl+vTKB9tLjC9z7wycTjVuzkoLTgaw+8H29dymWiSgLfn7vkBn9KFnV9zy7Evxh713JM9sKvy61D4f0maiqO5hw8U7By8M/Lsvn5NGUKuiO4IiasIp9blMUx9Ob5mxJ6K+d1kNg99e6/kgW+36NoMftYnb0qs5C+BKCellqNMjtX94TyDNNwd2RzIZqNUKr7IWznllLbCWSKuR2ho5K7kFIo2PXkZ+8bPP+Oyzif1uJsYnhrgjxUBrq/lUScfJn0FGaq7G4ronFGSzULcCwwga4o1vwK2T/BEeSBRWQIMtxgktIq261YRQi71Y9p0O63qmZvV1pIapbx0E0Ap89mZgN7pYLbiBpoCp9eUHzxBAle4o1RXQCnVF6TPPXnBuNDSCOiTrFVXVTCmZYZi4wJbG3JJ40TJY0LelZUFtwA4VSWHzYPLg5HGhFy4CIV58quTi2xWAXiH3RUreOKNOGAle6ILTucWhK08w61r46PWPTMslwBAZY+L6cCSGQM5u6Bej7eZZZkKM5FzIsTGmxHldmR8+sJsmpjRyPp3JxQb1N7sr0uvXr8ziwV0Aw9ANqyzbRmCJgcREt0KorSApEcfEOp9YTmeWZeVw2FMKfPrxj6Eu/Nu/+f96sFipcbhcGBFEE0GyB4hL9FDt1022RKE07+ZGtkssXTXpD2NrFqM2jLzfABPjbIWoBzbBB1KO3VMbpVU7lE7BNzaHPcIijUImub8SQ7dikN60eLXlME5bSTJsn0ykURFqs+pDgu0hcLsYMnb44hYB+3l1CrHqJSH4lexe9X1uIB3ieB6R9TKABX92ekW1QT3NFa++fKU70nagxKuwbWT/7PdvCF+H3foh9zTYA1WH/eDyPTz7rDz7o/a/bzaYDqE7qRpDpLkIT0hu6vZ8FuT/29+X9DZV+3u1pNUN0noMaf7+qvYKsHvmpo3Saq9pMKZJUJrHH+NeVbWBv82UvEPzZ8Yq024h7rOwjQqdzBuJxppXSlbWtXJaYS1uV56DE3oit9fw9dcf8ctf3HN9yCQphLRHBPMaohHDQCCy1OwB9jLs7Tu9L1YklgF8+meyjW4dLeIzi4BW8YG23e9B7CRpsH7UzFYrqDkDlEWgFNa6kNdGLgrNljH5Km47r03YjcqrV6/N8sWve+yzOwJseiq/r0GJ3tVcQnn1LsEttVswF4YexNVhMDGYTIDQKoPT6EX7LA8LyD4La94NJ6kIiaIusk39GrXtfkq0mYIbzrhWpjqVuBv5Pfsc4u/PId2ofYM5lwKn+e9sRoSxDticX+/vXxDjyMPTA6LCOIwcb2+oTi9elsVM/1JinEaWOnI6PXE87BnH0dxha7G11GLR8Nd/+ANDFG52e3a7yfTtpTUbXNfCFIcLfqa2ACQNA2M0Lm3L9VkCCeRc+fD4gZurWw77HU/zmaEmPv/0r8inmX/41b9G2wcblInh0MGZM+O4B+kDJNku2IbPbV+DBZ1NJ2FXtxG2tkFCNAKJ4A9f8+/zxOOMqs3Rk2BVAUqsgUzZhrnqFSxaqYLTAu2BzrVZtc3IkKC1BCEYS0DVLK+xi62Ok4cYLXAVCxBdrCYWBz0IKkUXajCzNUJzCKbTf40IaXqMjkt2nNO565ZqjMLag9Oz4NnPI914MeiGxds3GERVO0TY4SAuXcwWbLuKGTZYxzoIx7KpPxAtaRO6AM2xLJx+cPnvZ/MCGxBDX/OI6rMKWB2yqx7ULgM+h4FBi8/VjK77gy/BxYTqSbhY5+FMmw4tGXXXAkrH8Wv/PKL28Hr1aXHIgor9uVssKEr8gf1Gp7+22udqAa0wr5l1bcwVaoF1gVIxjUJTDvvAz378ip//8pr72yOqD7YXxc9nw5CPqJcZzxAmEk4Yac7l993UwWds/YBUxTDpaO/LjOjsrIVoyV49YDaHeMSv97YrIgpRQVJgWQpLWVjmEzmvNB+0tpqpz57xlpWXb64Y93tg9iVZOET3bF+0F2DSLXbEf4v25Ci+88ZWEFt3WonitufIdvzEE6CE2GmSFqR7PHE4KnR/Lp+buefEBjFte67p999+l/rr2HzQ4pTJj2y+Jhr6qMfp13ZW7HSly6/zJKRqA/alqFmmqLKuyo++/AUSIn/685/Y7Y68uL9jP0yMY+S8LqxrZr9TdoeJNWfyupqz622Emnj3/p0llqtrUrS48PThPe/fvuWvfvlXNucobssQUmIKgVwyKSZzDpRgE/AxEQd3N7R0w5QG1po5Hvfsdp+SMAOp28M1j+cTj+vKi9df0qTx61/9DaW+M9OtTjMj2YPkOH/wgGbRz6rS5sOhENg6jj5EsoqXH1AwbQ+yNcsds+98eQvyphFo/lqBQGll25KGNBPCVbcs9p/sLBhjqxTD2ktGJBGTiU6qBx2JfV4w+GEz9kDYXB0tYdVWHDILF58Y9xaqqDGJYtsCu/hB6nXGNtj306e4SM9NzYJe7CfMw8b75HbB70Ov8gElYZb/Nv+xwbPae6peTYkJ3GzPgw/9elWkFyime91v9tzbNwW6GVwIl+7Giv3LsNY+Vk/0/rCq/XxV9bNjxneikUq5fD94clDQ7jTUB9qBrmZ9PoewV7dVqfZvP2QzGZvaLUsUupdOcKiwv18zq7P7222h2e45/p6aU2eDm05G1rJa+5/NlK9lsYF9M9rC/ih8+cVrfvlXL3n5UhjDI7W+Q2QkSAIxSDGFRAidAWaFXOqBTHGmjZ1P4/y7zoV+3WxgqpqRmKxYEYUQXGPkYjF/BonBIUnbq6HNXIZLVOqqrMtCXU6sufjZ9sVC6GZDXhV2O3jx8pYQ7Lnpj7QVSb1D9WfRP4fNBMCcfNXFgWHTHNk79dmDqLehBg2JU0+bVtsO6We+US8Lt8DOqHApkHpUCCOB6q61W/96ed9iPKiiysWJuMtwoa+97acjONW9hf4wCNI1KP59MSitwOm0sJvse4omPvroc463t0wfHvnw/ntKXvnszaekceAPf/gD//APf8/9q4/4p3/914SUiDFyc7zisDsQUuTqeOS4P/gZbYQw8M/+yT/l93/4A/v9ntoqqZVCSsk9090qoYkv37CHeZwmW2JS1XDH0phFeHx4oNbKbrdDS6M0o9Z9//Z7slYiyv3LH4Emfv3r/4qcH0mxqzrdCFz6LbEuQbxKYess+gNm/4a3mDj3pFMmO2bvj6IPmNrGLgCrEI0LbTuZqxZKsS7KhGnd18Udpfy1SoMQfDGIVwlpGBBxvxqquaAKjBK9nSn+/pzC6e+huMhNm+9eCxaw+mGLYg9AAwe2bSAuYmpUdwqwJIpRTlVx7Yn/o4t+1OEvC4yBTvF93gXYxbHgXZqva/TdkVXxas0q+bB5C+k2XrrYVffrrxvWbHOL8qwjgI6Fbcvi/e73fcb9L8z10zsIu3vOerJ7v9lyB1ta88O0Wbjsh4aqhUCiqDnUihrcaW17FyeyPSgbmwQz4mte0W09qNr3XYwU7aHd3DTEXYc9uGnrOw8sEYHYbu9qHlzrWphX6yp1DRRtpEG5u4t8/fUnfP2ze26uK/uh2WKmlpCQiaEYpbVekQJIzDQiyTtgUDfWdKhSBdW82Zj0e1hrv+Z2ncVtYWJyby+cMeYXKQbbw95UKSoW9ELvHKFV+0xrObPWszkQF8gZ9NnzCJbHP/nsntubHXhQtDxkrEYrFMW7v/6m7RwEhRA90bVGGIT+KcxC50KysEZP/XMbPI3vuIi+2AyNbI7UsDGy+jnsBWzJZwvukhCHGk1T0EWS3arFz7QY2aU/N52BiNjWum3+omHrsLr+y1hml/eTQrLYVSvTcMvtyzeU1nj1+pVZtSyzBfYifP/ue5vltcbbd++4u79jmkbGlKhaGcPAt99+x9v0ns8+/dT8pGpj2u/57NNPTQAZI2ldV1JKBiMFIaRoqkmwChKDnDoTQUJkiomn85l3372loRw+mlhKtr3H0aikHVv/cCrcvviUz/PMv/m7/wrVhSEUNAaXryWzefBb2xfcm3i2U8n82QsdArBnuM/C+xN+2aDVLoyp58NOEVOxXpoPUhBTqoZI8m1SQ/de0Q4PKFs9HCKDt+FVOn6qWyKoQV2xrCCD/2u/8XWDioY0oN1cT43eJpI2OKeLDdXb3eY4sNn5uouuWBLrq+Cls0+0z2vsffs5pcsGedbqXp5W4/93fQO9s9OAundOp7tad1M2rN1sQkyQaHqU7urL9rtaz9YidE3FRahW+cdf/aFWqls+N7e2ELYu3K0JNmEVlYv+wyCunghVLgZqaNiWBfVqri+/6VYHHWtu2E7t0L/Hh4uidp6037/N+M6Egh1zD8GSlAVHe92mQlmFNRfW1azrizlhM0yNj+4jv/irr/n8Rzuur0B1pdWZwJ4Q9jTxPRPilXzIXlFbQmitE6XtAbFKFKN/u/MBQEyFWqziVoDkynitKBlI23a2IFal+1Nj97ZkaAsXowkjCrSysuaVVjJ5zWi12UorUNoFxqwK+wO8fnNHTNahb9V2jIbqeOdycUrFdSuXYqEnOGk9wfRq3ouYZ2ddtzNoxZ0ttLKu35AJmy8IW5O9dRMAtWYrNqsSh+A26mquER2zCLK52l7eu0FMVfu59sIxiHX9fYrRCzn/tD03NbVdEDoF1pw5L5W7+3t2w4G3Tyvz6cxhv+f29pZpHHn7/h23t/cEAte3N9ze3XGaF4v1pfLw9MSyW3j7/Xd89/33oI0f/egL1jVD7p20TYDTcyOq5mV79iAkQcwufFkY04AMkVaVVk0kdHd37zin3wSB3GzD0fLwSKmNFAM5jdx/9DUffzjxl2//DuoToVVKCpfpvRbvKl2h2gehDjlsvGPtraJV/UZOCUbvU/VEcnkYjOlgr5Fc0BWx4Ktu9TyMiShhc36UGP0GKZDMiLA1YmukcbILjbnFqh8uJHoF1g+NvbfqmG7vbgaBpslfp7dKharFDin2e8TXn/ZOAXpBE4wxhDqdr1g152WhBf8tPWyUP/VlQAJOv70IuwwCuvwZsK5BsAdRFZFiv6f1rif4KzSkmk+W3ae+50HNv14uHaFBR8Ht5S87dX/wJbDRmS0ibGI2Baclj57DTMOi0mchFqCrDx+rr1C1OjhtkaLz5Jt3TKh3rz5Ebo6yS4W+PtIq8+BwZZ8zePetiyd4deFU9WMbqa2a5XKJVMxMc8kmjKsZShNocH8V+fjjI1//7BVvXk0cDgGtMyDYbnjbCRAotueEvjbWlLnqqspE7EQsiyy9mPJEHqKYi7NHMAlsorkYBtM7qHkVdYX16Peipf6zK2IFMDIMUBd3VmjkcmYtZ8rayGVl9eF7WX3u3gOvHXs+/uqGYchQoos8LdkFBI3VthhGhaL+GayTDT6zM0TsojHpNaPBThZsrSOpmOGfFTubM3DXUIj0UssghGAQpCm9TaEfevfa1fTiHbG9IH3uYYnAnv+gQhafK6lLg6WCJnPB1guTrxdzfY79wzLOYfKQiUGY18DrV5+jLfD27Vvevv0Ln7z5hOv9EUR4/+4905gYXr9kHEdEAmNy/zYRlvXM/rDn/vUrlnXh6enJknpe0RTR4MujWiPtjgdUYcmZlJK5PIq5GpZqVtoh2OEoi5naPT0+0RSO04GFwuPjI4pymp9IaWAaJuTGLMhTjCzrwvn/T9afdklyLOt62GPuHhGZWVMPQDeAPZ5L8opcpChS+iLp//8CcZFci+K94h3PsIG9ge6uyowIdzd9eM2jaku9zj4AuqurMiN9MHvtHbzz9P4Hmjeef/0nbvuv5F4pi9xPY5mCF+RrH+1h+nsYYwR95OPwlX6ionjT4+Bxi0P3TXfx5rknoJvJdiDnI3Mh54mDmx8HluXMlDPeKlaCWodhNsf3iqQ512a1pENqNzFKBvpoUTWMxLo4lyAOXysWFW2OwewrNKRZSxxUsWjkEAqi3WpxpmGXEXXN+L2B+Q+ICPY3r2FcmDC0B93qqxkemuDEU3sDzahNbrHrzZqgrq4q/GBEDQ4B4dgbbJKURlfwegkcl+IRcBMXI9vxHob53DH0DqaTNq4GyrsbbwfWh91yXHAtOpsxXG6j+wrMSLOG9toFthB/9h7UXW1abxvepziqN8XFBmmo4bCJq99bo7XGbYfbTedQmeDTxzP/6s9/4E9/vOPhXaakG71vep55Yi7D7iP0BzmHGHGsB6ICB+tVA+Y+zG6GINLAw0nZoNgrEaKm12dkSQmNQ3F8jFTG592lNnbv3NpKCsepXia87fQmN1oVo41anb2re3AXrNXHv+/w+GR8+PgUOibTXu/D/AUFUeUuUWvSwZxMYVEAOZv0T3SRGQZ5zlTs6aR3hl/acXs2wVUa4elwF/MsKf8FPw55DuhI5njK5IY8KbVO1vuVXGY6Cm8aTYJ7CDJ9dLC6vIQWBNFlFGWWw/I+4kwZBdSAc9/8d5eH2ruP31Nr5en+nnf3d8zLHEaYzk8//aT9lDRb7vAqCsT58P4jl9OJ9Xbm97//I+8eH+k9qMSW+fL8la/fvnA+XSiZxG/fvvBv/+2/4bvvvuOHHz6pYqv1SDLqAbd8fX7WhdE7Xju/9S/0rbG3XUE9e2Xdd9Z9Z86F3p3bduXbyzVWWubp4UdSXvj1l8TL+gtzX7mcZ2QlHnMKiIO6knuJiluHyTAuEEYqNo4w+qbs7FDa5lcnNkb8ZI8PBsRXzgEppRjYpdgUyYuSv6KiTIQ4yMbQF95896MVTSmhtLOEpah2jtfAcaABUbH1OMB1eLdeZdsc4fDmryIlc6iWsDQu1CS4KoEfVto6YLVYB90y7DDi8D2sF44DZhzQPeYFYfQXGyQhPrqNriGGbB6eMq+RoVGltaETCdaRSv74mgEWgbuMHS3Yba+v1RkD3+5voCQXt72P1h0dBpjJ6p4hYQv2TRex4PWN9njvMUz3uDh6ZJ2F6K0NLHlcIGQFNMUKHeygGuIovZ4N4rm0BjS9Glk8VNpubLvLyK/A73848bvffeb3Pz3w/fcz5wXc16OLIxVdPN6D+RZFxvDIVlt6qI/NwIIurMt6VpaCvWHjhIZFoTlO6hvkidzSAckNSEAU0PH/YlaXE7mP0ByZflaPCFIXvXXfd1pTh0Q7U/cbtEqr/N0swh3yBD/99D3FGnmZRKJImhkpc6HKQ6j3A5oxNABO0S5Y0uzEx2Xi41CMgXEM8V7dVMfbfE2FGIy64bjspk7iuJRTCsqwclbkhpuYswoDGwzvsNixMDq06GZr6gH/af4x0inxV2uiodVxxmf9plgaRZXrQstWuPXG48NH3r//nr/89VfAeHp6pHVn71UX12CC4vKqayGDzcaSC9++fOXLtvH+/Qeu1xvPL1/JU2GvskBaloV1U55L2dvOvq5cLnfc3z/gTdDKHgO859uVvjfuTid6LIYpZVrufP3yFW+VeZlpnrCSqdtG6p2v12emnNhCWqmcZWOtTs4XHj78jvYL7Nef6UuhxbA3xy2eUCaC+MEhCBkHamx68xZcb46DtIcbqMWq7McZpcU8BC4HZzzgqGEnPLJms4kmm1zYv2EH86O7H2KcAY81BpVV9snVOXDteHUHg1eL0l4rGybZARzwS6RqJXDs6GYHW6l1Iyf5+zcXE8oQzHH8tOShb0A26b28qbg0wByvw4NtgQ1KLfHe1AuoBX59/RrepujoeuDy8dkMsk/AM3pH6ThQD2uVMbcgdDBxCKcQHZmp+nYb1NHBSuoHRsuwVHBotsUMQviK2YwgTCUmdu/0OmAXCzZlpkcXYT70Fy6aYrT83uWGaVZUkfqwth7VYpQSrktAy90Zc4neYC7O54+Zn378kR9//8Tn7x+ZJ0Gs9D1otfPxXGJBiipuUXx0eS9FWUpKuuBIoQpOCXd5rok+LKqwrv1EQyrbRCdl7ZNc5DJbew3WWHSJeQoXZWLIHbqigYUgOry5s/nGuq1s68667uzVWGOftzaxbjdqDdjHoAaV8/OPd0yzc739jcvdZ0jDyiZz2Kx4UJJHNY3y3zswlUJJS8yCNDMi67I37IASj7lC/LPHvDJ5RLZaYuSPaI6h8+GQ1/grxbpaeI2ZfNtyoACakR8DUgYZR9npDbMpKLF+rPkWDLiE5oPKuUFzlVFMWXxP72Kxof2zNecPf/6Dzpna+NvffsYyPD488vyystXKaT6Rwu+qVhOU1GR0+Xh3z3xaxJ5LiZSU9+21c7mcVBRZ57uP39PdKX2XCdjHjx/JZkoocljrhoz8bodQ9+V2o1iG4txuN16+fGNaMvM841XCjVZ3cpHR17rpIKoRWqI2WArMki98ePodf6vO1y+/8PCghCwMHImRRhaLBT/679LbGDdtZ4TwiEHWoDXhkce8RRUwwSTS0LHF3xnsKNUWyQdtTpRZwbHTEfhDCHXi9A0MviJlsyrrPoDRENVkUnCN9OGbtVB+zxyMo6hyPWUxpnpVBVdytKeqmr3FeKwbPWWsNbzYsRmGD5b3Rkeq0eM51WjraxO99oCmVFF57/TkjByQEbg1Npku5Kj44+c0T1K62jho1S2lYT0RXk3dCr3X4wIZVdJ41bIuiWqYTu/7AYWBHzMaHR6jG4shecBAIyZZ85AddRzy25E4MCi7Hr78wVahJzHUxjwUHfApgXQU+uytBfOsc9Bho0kV/N91KKXiPNwb33/4jo/f3fP5+wsfP9xTSqb7htTw8drjAtzjRk82cgs6lqYoXlpw48E9kXLnsE736VjjKalKHfCOEJwOlGBzVRI6sKYsSM3jMldg2shdUMFzDFnjsNVBr8/HXNWptx18p3aFK/VueG1sN7htjb0lvLXDRqL3xrzApx/ek/PKaXnHELe+ms/oB+6tHbqUNAhJOKXk8CAbBz6IXpuPzjbF/h8XxmDfmRs1ReyvZUq2A3pyU/dgZkeHP2i0675GwFQc4K1BuDsfiZgGA44ddt/q+ARnkaLQej3GAAubdOXcY/LHy1FgHZdcH4WHyDIf33+Pp8L95Z62r7w8v/B4/8hyPsN1xUzBQefpRG/ypkrN2faVbV359be/8XD/yMvLC1MucD5TcuaXX/5GKYmnp3fUKpp+aTGE8ercthuVRkYq49ort+erHtJNWRGeOnuvbOuN+XIiAdu2cV1v3LadKRnZFaazb9uBgZvDbd8wZOeLQ5pPPH74kedfM7eXv5EuHfIWUnpXpWed7jvFRWlL6PCJOv+4IICgSIbIjv6K8WFgYTQYGyq/uWR6fJVw8lcnHg+Ts2RjViC4x+PTO7IfxqEXFfmYlzST4liMiYgjCc+mFFbeHZmI6cCcKGbsISQjqt2/w4ZHBxMMDIZ6nFcoZ8RKpuahARseMv1Qy4ZCIyY1NgK+sOaMOE1pJtJxEL+CvqMzULVWXcwNvU4NReXKUPVZGWGXEAeAg0UYTVzNUqLS45LrOpwDMzagtpjvmI4x7yJB9xah9z0d70UD+eHJVAg9OwTv/qCn4micqv9O/qbifHMBuEtt7G+6CMGDcXgavHuAn354x+Wh8N277/nup09cTp1cwCxR951+0zMoc8GRDX+PA3cyp0ZXnEzDakGjNT7zIHkYwqQhbFiaum4GC1BVIT1EqgGdGYmcZprXIzBHC1+HrnsJOxatg2E+N+BV3Z8N76Ke9964bcqJkKW79kfzztYa+96oW1ez1PWsWjzT3/3pHU+PZywHgcM69MxIhFSuiUNqKkqR0aNo6ENVbcd617p7te4WbDnckOMQV2U1ViBmWUzMCFqK4zqKweick/aJ4XiNcyKMUA3TzCTmt+N19L7D6PhwkhWhCrHuX4kfdlgVtbiBu0tzYqa0v3TAtVkeVcC+VlK6cPfwHvdEWSa++/QDlo3WnSkV8jnTWmW93cgnnTy1qQu6O58hZ+7PF3KW/QpZ+eUpJdbbC//hL//Cf//f/Z8PoWT59vIifm9v7HWnm7ZNb43ujWmWAntvFaqzbjeyZWrv9K2y9oZlDXXmoipla1UOq7zy/3vvfP3tCx3n/cO9GEJupLzw7uMf2Nf3fH35F3J/Zp4Dqw6eyrau+JSYy4nexbRIcLBeDgjBB/74yo6xOAtC5BqHzJvFOBaR9+gq9Hc9huWiPrZxNgrKoOFpeL4Pv5uJPMQ63sIYbBJdkkjVA5KH6ZhrhNR9xZlIOVOQb00mK37RoRJK5NFVJdPhf1T5FplMGnYlDxOGblhWGpbFieDsssnIhHHdoDx2fRbDttkRTNMTiueyI8Rey1/4vSItg2XTdwhOtj5vi3lJlzK57QGXDKZaQ1oIsTzcd4a6QytXLrdiZ+lzrTgpDsBBVW10evWDodN6FYMt2FaiGedXNkoPGvKxGBrVBZMJNnp9tG0gmV5lw9GFpV9O8O7pex7f3XF//475BJ8/3fPhLlFKD9w6jP663lVJE/2UMTbmJCPJ3bMYWEYATnqWw1A0GVQfCuq4nEih9wgagQsXT7GORYXVTK277K97CDdJRuZE79eYhxGJa9KDYGL96xKMgyyeRUfq825ObztrXWMQPdPbFesL3hJtq/QVtqrLorpsO6rcOnj3vvD580dyjss5Dm0SJJ910BIdvI2s7RZ6H331PE2CrqIY0E7NkLJgZl7xfnPBoRqEC6IW1XXSGRNwkh9IRdbFEdXCsHGJlzhOM8jzcQFzzLBGhGrA5PH1oh5znIejqxipiAfDiRBuZqNE1PIwOQTCVt1IqbCvnbV9BYPTcsIxvn37yu228eHdO3LKPD4+Mqx12q755TIrhbPc3fPzX3/hbjmTe2cqYuf98P1nllToBMzeu1xg3ZKoerWyj57bna1tcThm+rbpmLlt/PLtG9++fKHhvP/wgZnpEGINnxtLJsvk1nSQ9MA7d4nxSgnGSJnBE8tlIk8Lv/ztP0F95jwHZc0b82k+fEz+zn3VEhxBIWPgOSq90dOl44AfoTNqB5uYCLyZqBHf483fHcK15MrY1WzAXnUALhtuSwPeiIS8Lv/6lPyAMMYy8YDUMHnYTAP/POYrKYzTJlod1D1dEJhjk2y/1YWMw7sf/GsPF1H3qHR9kAHFEsnuYIWeJ6j7MaytMajNNoa2jVT14lrASDUU91bDsKwN+Oc1+0Jv5rWTa0c++fh89L17b/r83nRDakBGJRbPehgHdqe9yWMYlOhOE5Tmk6rhY/CuL229H/qbo1voweJq0hDkFDBLViFoCdIEpwmW0z2X5YlUCvd393z88MDjw5llViVfzlUtfWu0pmeckkRmRuD6KZO6kfoMofKdejmKk1q3WN+va8XMGD69uuECVj0gQel83I9lLsbeYJalTKNJgJXkJwZyF039FToxg5Iz1Rvdx5AUzKu+XxQq1Z3adnrb6FV7pdXGvlWum3Pds0KR2k6rTt3bcbniUGb4w59+R5kDck1ZhQKESr4fIrIcCWmW5NQ6XFRLnkW9jY596IcCSwZULJm/brqDPRVV+QAfxh72qPT/zgXguCiVBT1YYm5OEioUX29xbjRZfFiLbkHfe3hyha776MxydBYN6bRSvBBzdfOEVuLV6mZsK+Pz737PtJzpaY46xzGF7pGKyB+3b9+YzyeWeaabs24ryRLLMi41OM+LxIhw+MClkpnOC23fIHKvi+N8eX5mqxslvWLDv/32N67boJplylRIZry8vPD15RupJC65MGdxq+u+YSkzl0AWzfGswI8MMZiWWG9KYqTs2watUJaF1hM2Xfjw3R/Zb3+h9i+YqdpMAT2JAmfHzd2D5aIK8XV3je5BqNXrhw6qp9Pxe8Ks3waUB5aERqCvVtFDpCTtTtQUI4NgZB/7YJNo8aslFqYMxx7X9zcgG6dyVrB8i2AhfaXgk9zllxUMEg9a7EjdS0H7s+q06GKIKj2+jaoWlzvsAA7UcYBVo7tmIMRdFvaD8b5SPIVdz9MTqWe818DkDe8jI0Hc70HVGwwS+ewMm5TR5Y1f4WNkiyo6Xk/2t7jtwI+7t4A1BninFh23qNBG8p7mPEaPChGKQS6iRU8LpDJxf35kLmemaWJeFh4uJ07nE95X0jmTceZFVWvOUwxrFSaUbZNPUFb/OVlmD/aVMnq0VvM0SXjZghqdnMFCs5xYAvRLaaFWBSulsK3ukVuRXLDkwNVTdJz9uJy1t+Tf1eJyMmHg8bwL0NOwvHBaZGjTpFbGlEhmHtOzN/kaTTmz7Ps1LDYQ06cp36D3zG27cV0727axrZXbGzvw3vS/P/zpkffvZ3LR55IGFbrrnKguSx1L6myyuQqYgF7MiqI5XRfaUEdbSurYfAQrRdcYl4aCw4hnBfguiCg2nMSCY43m6HKJIsdprtx3E3aI5Uk6n0Mr0VVdgBhl8YwPqC8KTQlKRwiSirJBLhjEDMl5LDoLwXfqZhNt32kt8XT3kZwLde9K4jNj23X5318mSjHOdxe8NWrvTDnx+PSEu7PtO8sycds2Lnd3MesYGKqML5f5xLfrC2XbmeeZsq4rv337G3/9yy98+vSJaZlZX6789W9/02R7Klwu99yuV+Z5YSoTD/ePEMHadGf3nbXu1Ns37h/vyFl0sLa+4CmR5oUZ43w5s6RMngt13yMQQwdYyrqxU5q43H+i1gv7/lfq/ky2FVkajHs4YAELsVy3v+skJLsPq2uhJa8flo4msLchL2LQHK0k4oI7Hi2qPnwfALu9aWithS5Ah6D1hPuGXHc83FvHqw61cYrZQBs8/fGqYliF0fMIXeqH0dooewaX/7jcTBefM2Yy/bWDOBqvFkQJ8cFb+BoNH3tc3PghMtL0J0LRTdBPig6McfSYIhRH2lyiBUlB78mCRZXReng91HbGdYhNYWBndCvxWQz20ui2+ut7ssJhXuCqPHPWtkpFrJdpSkz5wjJPnM8X8rRwupw5LQvzbOqU2LmcZ3IpCtUKG5hSXLBYDtFfQGHFdtkwHJ2k+OQlZR2iaSIVQQaK6TVI6kQL4WTrhBW0Tg1LRrJBdR1alxwmc3rGcvbV5SzmXSHhJA/K9qAQWBIZI0X5SsK8UiwHJt8pMUzto0ghitRjL3XcGiPvAlOnsDVBzG3vBPCuOYRzUKJ77/TNue4uB1K5z1BdncSHj4kffvyApRuWE6kvJGs0M4hZT0qFYm/gZEMEki6RbEmdxCz4rAuOJrpeZ6AeCcZB70CqYS4Zg2vAbA7xJyHqHGs+lmUUnDlLMLm1FZLmGjmNLv0VzRAdekzEtG93I1oVXQx9APzeYcxeAt/0gGCThz+YpdBUIbjO1RnVXkk+M5U7fvvrV369vvD5+w9M0wWjc3d3Zr/deH5+xrszTRPnktnrEA4IiVm7prZVyk9yOGxI5GpBo21svXGaZ0qrlZwLHz5/R+2d29evakVOF5o7JVR6OHjrB2eaiCncu8J7TtOsTR6tn1NpyVimwOot8XB/r5VZd2kayhTYsPQNz88v3Lb1GICWpI1d8o26fQWux6GullOwxKAcwuCMpzjs41COm92DlfPG6Z2hpNSFF9Wzj0N/DP2MkYMsx8ZxgHn4ycRGi2vMKJol9DCVS8SsQZRDb2OBRVd0CG50QSRL4pWnNig2sWmDZBBlv0eoEGYRWKLWdDwP9x6VmBhGsgqIA8rFJKruB247VGopcG9Vsc7A+t508LSo0HE7IDnDY+FHpkIdn4HjvZGz6aBzC+sSdRkKuJmwVqkesKVHhkBvGvYj2mBOcDffczrdkXLDUud8ucdm593DIzkZS84sJZOmzDTJGmU+RTJhbEb3otTE+DwtaCfJRjvn9CxIw9tJGyyhw4KKuWFZ+e8Jk/jQtH5SVMOe1TXQ/FXl3+Twq+cVpAVPVGRZnyKTgYA7LFlc4qEjH064puGyxTrIqcSf62A9XE5t+P8Q8EcnRxfIG1adFrwfRAXlLDda0Etb20NtPbK3NfvY286+V3pL7N6gvYrmAoGjzPCv/uHPnC9JB70VXI6NFM+i59IoZToOaIarKx2yk11UUnzQULUlXhmMY3CfjgOcQ2Py6jbgr1+OTjCjxd8ZB/nYg3tTp7t7hS5tiMecZxR1PQ5c769Q81hThyTJ39qGj3Mn/tDUBVnUnx509uRIaNd0cvW20VpjOt9xOt2x7sb1+sL1+cT9hztKyry8POPu/M//y//E3f0j/8U//JcY8PztG+TM+XLRuqyDIj2SOO2A5L7dbnKOPV9YppnaVVwI6/PMdbspM7VkTucL15crt/VGyVJip1axHp6aZvSkVlDry5nnCLhv4iDfne8Y2a5OV1fhCYpcZPfWDhO9jlNRMtLeG8USu2XOlyfuHk68fPtnntd/YqGSqfq5Il+q9je1TNaDEXAshjeCNnr8DYsLYUAqJbDNqLbxWFLp/+fvc2CdesUhLgub4c7AD2Vb0q2Ea7lojZ5fOZYHNyNa4kxQKtEQS5+d4BzRX6OK84Yf7qaAl6NVVpW40/t8HOgWNMfuEUnag6kVdMfh4Ck7c/1cT10lIKGBGP3yuA3Hf3mToLHFu4nXpz9Pol2GwXmj0msSPGTauAO4bb0ilb2YUefLA3eXRy6XO7xWis0SVCbnfJ5ZlsJyKpznGXKjlIylRk4TS5nAb9EVlOAvNKyMrA5dyhaXui7pznC4TWHtUdNwJJImQGltFeJSSKHitSh5Mx7sO+JzDL1PXAaDHl2SSZwYgrHhBGGGiqlmWOuqVlG+89gfObqYYR6nkJ/Ovt24Oz9EvKZejxqZgbEL+lBWhkoZdSuJXgIm6U5tldcLw+hVh2atY0gcQ2Wg+0yvnVo39mrszWm3nXVXF9FDM2IG/8Wf7rncd1LtpKUIKgzjSEfve/gnWZbjgIwxO9lrwEK6nI+4YPOjWPMRUWzj2bzhbqNhk3eZH+riifAyNJMiBv9as64LyhK5d/beD6KE4+RgfHVHhJkWlFf8KGZAc7DUMnFCHtD1gK9fKy79vBZq897DvQGx2Wo2tSVtp7fG+w9/5PLwHaU2/nw+sddGj4Lt+fnKh/fvuZzv+V//l/+VKWf+m3/9X2tPTTNLTmJSIfbYIB6DhRWRR5fUaHuF5cwyFcq6r/Rd6XPNVXVsVYvUcmKxSQcdHsrDuFVsfECj5XRqbYe97gAjk+VQ0boGaC66G+ZMcRBfby8kjI8fPlAfGt++Rh5ryUxTpqWMzR/Jm9Nsxfsz2W6YbSTCosMBK68eLlFh1K4KLJnu/lcDLTs20zGmdqmYNYA3VfJwuDwmjub+77oMece0qCDCL8gmUfA6UZkRcNhrRIoUpKPKG0qKMYGMA0gh4HhXJsFR97menRuiO3oY1HkS0ygyO2RhHWykPjqp40cwKsMhMnCEk+K8igb1hhn3AD6M1XKUP40K6jqsh5V4hz7H0ztR94l1vakazTBNmcvFuJweyHGC56yQmIf7hZQaywR353fklLhVAdzn08RcMmVKTLORpgkzxYamVME601SYyiSLjOzAFDDRwNn1cxTiguzhsUO8qCKiH/TbXCSqNCuk7OCJHkaOltMxBB+CqTE3SwFLjdnZq7+QiAmpm+BMG9dvQA1mgiRMQ+rcGy2p2s3I3t6i4yrdmM932ofdwTJ5aGMY9hRR+R8UUMOtYEHBpodNRRyEdd/BMq1vbK3R2ip4l1eLEK83rrcXbldn2xNtN/bW2W5O1QiLkVn9/Y+fmLNjWTO6lGK+ZyCWwGui4jB/TPHvzbKAWxsMry4Yr0WuDQMZC88kGys7ipxhnJkTuOi6NbLOZX+xSe2dA4pK0XMkOHJE9CMZyuoxixhkjXHYq+g7rhuOHeXRPCZigP72jIqWo8fBnexg6tmYvRnBaDvx/Xc/qqDImdqcL7/9wvmsDJqP79/jDn/+wx95/vJVoujemKdFc54W84+kHuo4x47n27lcLtyd71jXVeFEdxdKXTVP0CGoYG0N9YMKZom+7eSc8CQu7sCW4xkcdrYe0E/AcHF59MBnxGMvlkL70OmWyGac5jlUopnzaWJaZkZA+O7Ovq+0dObu3R+xvtG2r9T1V7p/pdiL2D8J3IeOIuYJ9ANG0EYcmKQGZm46G8c0QtzkwI69knsOe47YGG8cVV6ZOiHoYbSS8r5JxykfLJJgYuh1RKuKqlipr6Xe1qGiCyjXIZwLKCleB/6qXMYTjRTsE4s7vB2bZwzftC5HVxewg6lr8dArDIvxpL43PrNhlTLs08Pm2HVoGzp8TOcTy+mMMVPmmWwz1+s3MoXujUcW5tMTy7IwLwuX04W672xrY1t3cilMBaaky2CanNNJOoEyJRSrq9SHnBFnvzqpaD4wMPrXLA/ikiTgm1cmh7uRcyGc+GINjAIgkUsMRQM/7sMcDoXUpFbxoyC1UdzGZapLowVMm2Po/mo7k6KZjY6xe8AvcUlbwKQxtHRLb6jHShNURGaOz0gak6PijrU+WGRmOYRlb8sDfe4jeGiY3m11EzEhqLted/W5oag1T7Ra2RrszVhrYl2N7bZx22Gv+h8d7i7w5z99YpkFZeQUAxAbe7AdORCxq4DQKplFUmOWk26rDIYeXbOBFmvbjvc8CrExNA4kISBkC1ppa1VdcFtDlSzvLyySGpPRI0Gyth4miJM0EqaO1oKG1i0g1oMZMi7lkbXBUUzr5cclcTTlpvXT7fBdC6AjEunkjuuemMsdeb6wrht5mrndrjzfVva9jhwx3OD8cMf/8H/7v9J6Z123A57beo0LUDfe6JQ9oHOAl5cXci6knDjZzO22Umq0o+5ObaqGW1NjVmvjdruy98ayFO4u9/TaXqsdH+rpcnQUBLbVe1M851T0Yecso7c4MI0c+gZlMzTPeBWG3tlpDdbaKLlgDktSAoX3mXn+wHJ65PbyC9vtF+Z8o6eNbBL7eRtPOT64sK8YD3FY8Ro6RMYmUyuYtVFTonslDWaQx4JwsUj60GjEZmxYXBxx6BP02fgonAFt/f0Fiw2DOrQBpZbCaXSX8+rAOMdB37FDKOTjwCYftEggZih24NadjnvR4eVO94F1G8cO0wSUmpJYFwMopWExAExvTAdLgoe7zLKceP/4I+WyMOeF2ja2KmZWsQ/kbEzTBN5oe6PHxVt32cuv+29cr7/x7t1nTndnzlPicpkoE6Tsyls3aLWq2q8rfc+kqUCLDsSI9jkuxuzYgIwM6TVSoZiYRsViHaaCEZDGAKwT5KGyB7C3sGilMGmAHkwlPSHZ6udxAXQ/ig+IosKGgXsw1UYHHB2ulOpGTyG8dFOhFoeh/m/ARyUuABU2KQqPg7vP6GATYuu8WqhX90PIOAqHve7qILpMPcV+itXqw98K9q3Re6XtTt3k9bNtcNuddu20ncMh9h/+8InLZSEXe4WlR3GT4tIJ6wnjdYCsGcKrIE0wQFKxx8EdgTyKUMDD+Te2/euYRVohFbINeo2heEb+Yzk83KL4zWMg73EJgfAqCyKG4yk40v01FsBiL2YfBeUIoDpOGv1q/Zij6HwIEaCpWJEzhEUxU9V5d1Hl3336kefnjZf1Nz5++Mi63jjNhXXd2HMVQ2yvPD4+MF8Kf/3r3/DeWU7nyAPqTMuE9cZtr5znmdZEjy1lwl3ixdHJTNOM204Z2oE9PJtaG7hlSF1SLJA9UriycL1RpeWICZSDI2z7ymQTlrXwZvewnvXjAx4CJ70gaSm8tuMDEPxpnCe9udY6KU/cnp+5tp37uxOnvLDcfaYsF+rtN7x+o6cryVZIHbdNwrU0uEVHL6r/CmhE2dODSpuDJSToSXkRcUHQSJ6PTaN1pWHXkXrm4EQbf1QK6pB0Ecvea7wKXazRRtMk349NMl5yD5zZj99VWdBj0CyyXAqlpwEFKXClm+iaxMWlNgbbVSIsF1NKFhBhJ+JGagQLCj2PPNLZYJkL58t33J0v3J2M909nznMhzYlGhr3jwyqCsTmjo8KoCbZNMFvJji2Jd49n3r87syxnLsvEnAxnJ7ljTMdFLOM36U88uQSKOVES6grigh40Ya031f+jWLKUKHk6KicdVmL/qGpVda7LwcBl2CiHdkEVI273tQN9hSDHMYfpkCm82oi4yztHNg5xL+HkZNSRR2FgvYvSPD7vbNCChx8GipZVreajI3nVEoyD6S0D53Xdd/lR6SVSWxcbaa9s7ab33jwEeGHZHR3MtqnxqjtsW2fbKvuaWW/Kj9id8CyDHz6feffhkSl5MIi0gDJaZ6/hV6OyPp4cSonrIhjQ9HoDqsWCDIAswD3qQdU6duS8W54ORKFEp6FnWeKcuh3arVSmgGvDC83FcGvt1d9shLKp04sXmsYP59iZ/bDcL9F1j52gwjEOGn0fR3O4gBYPpOOo8HVW0sWOm6Y77u8/UJZC8875fObh8oDHnGloiJo3zAtfvvzKdV35/Okzl9MD1+sXxcvmQkmJL1++cj6dj/WhDqWwhEC4emffd0o7Lgd55UgEpIN1nibuzhf2tgMxczDXYh0Qhg+83ckpk9MkFkfKnJYFJ+Tn3Uk5awgU1XGKG3NJhX2CtmmC76ZBoadgfJTMvu+8XFfKpJ/RcIXvcGK5nLB2z+3lV3q/4XaNSyl4yEOxHPOCFp8vqYSx2RhnBxsnBHKJEbAzPmnD0mAxvLkcomPRrCAzDAYP+umBWx6f/LGqhl+MDwm+a2wuJs6kuNSUj042hbOLsg6FsY6CS7YKGiZL06EDQb+f4sUo3/iouD3EPv2V1dRMOoUcGyGXifuHe949vufh4YHTvHCaO96eOU1wWgiqZ4vZdRdmPBVKliWAVzG1bNI6cSCXkw4KX7T2sowLJ5MRXM7OW+ddwQCd+XzHlEUqSGV8QFVYPBadlWCidMyKnGGQqANWHZ2sEYSVpZTCO8njx5kGqq2J2gyUNNTUAyaJCtY9zOdi8wc41WJG8cqYIzrRqnXurzOxsZbk7uLhKuxxj+l7d9MhlcZliS4BVe9xIcUF1poOTLfRtYQK2KGyyYm4KwZgb/pvj4AlGc8Vuct6w72A72zN6A32NbGucKsbrfXImdGjf/gAnz5/pOSNUk7yMYislRSq6AGp6vfkrZWS+p3uYZOSMo6KROU6DMPIcfAGePfmGR4Qb8zeHAvyyDi8DXKmvsgfS5oUpxQNys1jKG2ie/veYES5+nEf4L0eP+u4NA6q43BGHhfC+A+L/R6dnMXF43ExGoLliA4/GazQ2CjLR5a79/z27SsXu7BM0mp8fX7hfLowl8Tl/l7rp8qW/qeffs/15YUyaT76eHdP2yvbfmOZF6ZJOROn00THucsXXtaVdVea5PPzN07LTOlxUFxfXsg5Mc8n9q50Bit2eH50F8vjsFCOittM1XrfGjmosa2uEX5iWGukUsKWWRtFjolvPulsTGnSAq77kc2A77pzHUpJPD49kIrwsuSNjUozV+1cHpnOC95Xtu03OaV2mZ6V6BYIbDJHpKaPgzognrfLz4Ix0IFkri7CasAO0U2R43DW7CMxMbygXlfU+EE9cNFR1UTF5zIKS52oCMIQL2S/fUhwB9RkE0Hkwm1icF9eX30JeKLQ2hDV6UAbswflOwSUNNTM0uYCMzV1Wp/Ibnx8fOJ0nznPzrIkzBpmN4yOFP49vGfkB51I9FCjWnJIYg15RMJaN0oRppxzxi2FMCl0HlZUhfV6YMDKcGhMedYGy8oSUPiQK540BrspjQH0a89mXdV6CU3OmE8d7r0mMgMWWhgLY+ex583prcnvKxd0jde4aELxflTroU3hGEBJUeuurqXr0N9uN07zBbPw6kLwHKbX07vTkzLZfazdJl+1ASklolNyzZh6rBES9B4214wGWsWgt05jk4Fk7dASdR8IQhR/ZM35WgjpXNky+97xltl3Y9+d2jL7tnOtlW036u48XODPv/sd53OinMobdfTY8prEZR9eXPrdjB9HQrJRhO2vl4XDYEQpMiHIEa61q0FxCtimMMSAan3GpQxTLqy3Z5E7bOTI2LE3e0CwAu9gZ6eEQWLvUoArgTgdotwee7kTs64xDyG2WB9dnUoH0ri8wpeqh5B2DA+IwB9LNF/Y2jfuP3zkw3e/43mr0TWqK57neK954uvXryzLQsmFf/nnf+H+4Z7L/YW6Na7XK08PD/y2buRknJaJeVrYopsqmJTy28bd46PM/RD5oLTArk/ziSNdbNyEcdCNi8HiLHWv0daLPZG6HmprwvbztKgSchc8ZX7I0G3cpm5yVcQPoVGxxF4m5uysu/IsPAuzLMlEMWuNvu/YlFmmk6wQHJobzTI2XUhmTDyw377R+8rar+Rc9XOTBpDJjdZXjHbQ0tyJKq4clZ+GTgbWwxo4M1hSw+8lW8jzD7NADnaDYKkR1DOGaW+6k3gurzYSTVCS66AZUY1HjKtr+cr86zDBOD4vXap+HGCjmpEBQFwwIU6T4FRVWu8LqSysNbHdZrab6qFlAdLGXDItgaeGpaZ8gZyHTOMwELQogFIAYWO3SDVrcpaNQ9mTNjdesaCWYlndaikMvUcpQ22sAyMNWCiqs7C747Wq07PBCopqrSo8opoWqy0w7oM1UyHWuNT143N3EoWcBhH14INBk2ZIKls/sHt91OrKsk4EugmuTC618eVyL6eC1onAgWO9EYentDL67171zAdRwuJStLggQK/7gDIOuFP/6E057Ldtjffbua1fwRex+nzwuoYSO5LQGBdEo/bCvkq1e/xva/Sts2+dkuH3f/yR5aEwn2bZ2durcE9nC2IaDWjszfo95hVwoBljX77dO4fwz4Oi7lGtx7zP4mc5pqFz71jOeJKg8/byjVpXcl4op7vYz6F/6CPxMQqKcZCLMRDwrRAEQc/Rt3ggAqSYAwpnyJHR0i295pmMWYyj72Ue8K6rUIh1XfcaHfAd//iff+X77595fHp/MLF++ctfOC0X7h4utN74T//4n/n47gNPT094NvZ9Z9oLuRROKbHXxmmeWNcVetCaa6NGxvdcCtPTk5w3eufu7oE5J8WXtt5Js/KVvXdKybTWaLWRpyLxV7TQ+hwnbeCmW82yUaaZuu/kksixySxJzVtrpddKKpnzfOaw1DA7WvFf//oLuRTePT6psxACcHz0ZkDb2NcbnqCUkyxE0qB/yg63e4dypu47O84y31Hbyq2uFBrZdtx2YMetQmRWKLzE3izckWOgV/CaVDWq0GAjjQM9ZhMpBaT2plt4HSa+Yo3aCEFDA14nD/rHqCAPLDb+TDx5vebxszm+c+Otz8shp0VnZu/j/QUN110XIhe2NvP1m/PtW+fn335lygvn0jmdEg9P08Hm0BC5YyZr5tFJjTJQRnBR1THIHDqMZd+cSFkiuSGG7MOmPUGiiklyUDfr0ZIL0lQ2MS060niurXZKES1XTpranCk2rtSk+wFh/t0vRzoMH1YiAy7wEVdByo51redhBW9jbUJQCj38r/Qh5xhuSnAliG1w6XtXnnYKOCgFpNFr/bsMdgtvqoQIJRaQkqjXrwcpKeG9BoQb5ULsM29NKZNbpe6rXmcH7yXWjN5763on3uWvJgxeGojaJ/a10Vqh1s5tX7mtO3tztgbbDb7/PHO660y2M5WJ2hplnhhEDelFBkusHXvj7a9ByRwme8deiULjwOltFJuibh6QnavwJL6H3l7iNYxo5vT4jpfffuZy945cigqELjshdWiFut9oTf5uDaA3JkqcCq8Q43j+hjoCFT8RntXfbEd/cwl6wIDk0C3ByGd3hzqILZE1cnn4ifXXwq+//o337z/SWqXkiXeP73GDeZl5/vaNn374UXTx9caP33+i9UqtYn72Lvjo/v6RSynsXbB+Krq8koVBqInBmnIm1cZeK6W5x2AoPjD7+4OsbvVog4eQrAeMKwvgnZSXMJ+Ddd+Y8xJ0vMS+Xdm2ldY7c58o0/zaVnXntq2cTice3j3qIWXDg2WVDltt8aqnaSKVjMdHZSZVq1S+Pfjqem0tZ6bTmeadl+tO6ifKaaK2DesrnRuqCRdhyQYyC2yYryisJtSPyCjtsAGJrkEKZx0ig4ky2Baj03jF1eJ49iQskrAQD0jLo6PTQgmIISql4+/HsBMb7Xf8HC84K05VReMyTfTegl4XGCc60Ef9rQCWhS/Xws9/7VzXgvvMdV259Y18n0nTmZQGnIY6t6LNKhFcp5lRLIelgIVWQH44aueRcZ7FLMqTGE4W7Jmg/hrRhkTbruU4WC/657bvTNNEpSFBui5lKYktoLQY7Ae0N2YELcSbpBo0y7ikvEWXqAG/GFFG7shN1Ry6XDLNTWSILhGiBTRwWLw0qeK3vpOd6J4yqcyC5tTHUvv+Wm2mV6aT7F/6URb0FoPf1A5zy1QHdqP52dvOdLDuEi4Yq+/ctg1vG60Z3gutNzpNRYO3sHswmlfleHStr96GxXzB3ajNuO6Jda283GTqt95g22G5wPv3T8wz5EVzuWl6a3Wjf+qwb7rIU0QbWX89VCzcB0ZvENoB3HnZnqlrZV4uTNPMaxoKoRsinu/rGSZNjFG7TBinCS7LmeXDT+ScxSByU2had4rN7L3FHGSwpVQQthiEp+jqx0UR7wyziAkda+gwFXy97EZH5EeBM+x09N8WBJMeM0K3xufPf+b/9F/9A80SrQvWrW2Hogv9+fkZsyR3DG9ctxvcjMuygMN6XXVZuHO7Xum9kuaJ83xiP14/7OvKdDpxwMa9cdt3yUuzGXtt7F5ZlrO6iSkgl7g86lZpdOblRN9j6p8S2VUVtqZDPPcUNh4ZijBAFphSxsInZ/x6WZ/ZrisYXC539CbbZxiCJLEialUFVXvDXGKpkd0gVxLHvOigDdqjpQbJ+fbyzLqt3N3d0VKme6FQqHUCu9dB2XeSVyztWKoYRf47g7veq95nDDs9zPucuFMDHx3cduCNStkZFuYWsIRecUQoju7kuJw1WFZv0d/YCFgcqlElxWGs76Ot0TCIjucQ6SE9w0CdbEAxUf/ue+I//Icv/PJ8ipyFFU8y2/v2Uvnb31744dOCm37Ky/rCwzSRs5LfUhxuNarYPgCX+P0UzI1uHMK8g43jFoK1RA5IyXsc2kmJf6MjGKFQGpJWHOUop1TEcvIehngJzxmvG8yhcUD0xnRYy0eV7ftR4Q/bFUF64/B5FTU5Ch3qpckbKREMIICJsOALmLTR26rFkQv5PKuCtlH9B16epeodJItOV2dc/fVy/7tfHhd/0QGlOite33i9QVH1xBbV8F6fNcvv4tsLQ0+Y76QuFp+MElNU+abwoOjeWtupW1Z+9fWZ221n35y2wrrB0xP88fd/4unpjOU9BGGD1fT6GR7vIvbC4XcUzr0cRUHwxRxKVvzu1laev/6McuUTre0s8/nNOo/5TEcuuP46VDZ36JXb9Zkpf9CBmsMzIQR55rIWqSVR6yryRRCbc1ooGVH6Uwy0fRgrOmPJDCgQz7rzDjubHkVPnAmmy731UQhZoBP2d89or3A6v+P9h98zzU+KBg733uqNfV8p80w3ojMNNlfJx3mSsvHt+SqYNmX+P//mf+fXX3/lT3/6PZ9/+glLhb1WQU3LCdxpe6N6ZZ5ncsoUA3oSZ6bXhk8S/Hh/hYO6Gc+3K8ukampgg8RANFuConZ4rTslSxHrOL1MzDYdf2+vO3Mq8ksKvcW+rfTTCbdK9sEld10azXl5vnI6n5jyxO57nDiqtOUwK4xy3XamaJf7gCtq5e7unmU50VvF8ol9v+Gej2FjsxPdd1rb8LoyJcD28LwXNbKnhvU9WtywOD5aSA+MNTMS84aHvQe7pkfokRMvPwbUo9c4AlfGKjHiMFeV5dGZSfyUB9R/wEwamkXwTrTjmhoWUWu9jpoLZwKUY/DbC/zLrztrK8yzIMLalVte985//sff+Ic/fuLpITNnJ9mJ3FTJCKdXl2WDOXQ0LcYetFK38MU1AnbSn6ehW6Ch+MqsxLymCn5oatxHxoGex23v0Cu9uWjSOVHbrgtkclJ12V73F/I86fPxRoQYS1mcpVVokRIoTZ22afMt3kOi106J19wdPKzTh3NuM4XhWFcWNNsmwWnv9JRIfWeeG6lktr5zzBxAnU5QXVtrB6QHyOzyuKTks6WISyOlSHrrwwMr1pk3tm1j3TcSxrZttLrFYH06qtpEZnclT1ac1Odw9fVDpSv+0Zl1h/UK61657p3rtnGrK/vu7A3u7uAf/vhH7h5m8iThVk75jXlmivmA1uprEJD2rDyOGhgULwxG6YDSPEnwl1rmfP6e3l7Yt2f2DWqHZQlfLYzsKTrGiHd1jq4sp4mH+w/xezW6tOi03eU91VemYDi11LHqbwgWexzeCYJNJnq9sY+ayyq4YHsL7dFrJPH49zgvvB8ec8nGY8oKvMPJTdENy+UnyukdmXxY+mPQ15VlnvEuMalYiIWXr1/ZauX+dIkLxXi6f2DvnX/56y/8u//4H3BvfNo+c32+cXd3x75vZINUskgVTefJZIVG10zCvTNPM+SJ7oQjaxUensU8KWbMi1qRktS+mZnw5XFmt8ZpOsVtKr1F6nIKHW6vEeiKJTifzky5UErRbdpgbRut7pRpprXObV3lwRN52b020qLLofrOtq7Kqs2JaZoB4+uXX9nayt35wuX+QXGdBEcbaS4GWOh4VDsTrVb2zejzgHBEwzTrzMnIycG3WBz70QU4TTGhYzH0Gu6qWlAex/hgMKRQUBKOnz4qwgHVvEGYRp96+NR4BKTEpTIM/xqR5jVeQ1TbxoRygEcXNF6jnCb7gL/SGH5mTsuJbXVBFdeVn3++8d139/S2UnKnTYXmlVYrc6kD+dCizwatU22PziL2hBXBZfm18tOZPaqteI6A7D7iovv/67gkytx3Y1s36toEQ6ZMT5263njZvnB/d0daFqztQbAIJT3Cny24+8dZxoAVYn36awfSkgf5LWl28QY+SICNgKU6NCcOXmh1p5tgLnUGAQW53ncyFV09dBcjh2AUaCBSBkP5H/5drXVRM5UiQq+Nfb+x7+thL37dN7wNBL2jUCd1PL02etsCiivUfoNYk94ztI1kJ27bjX03amu0ZtStUbfGtjXqDucFfv/nz5zvS+wTWaErNz6YaRZ08vGcjQgQgurp6BaNxOZ7ONjqIsliRGDJKEVWK3s9M5+DZtxl9TPmFGKBZSy8lnDkSRYMHm9NDhjDhSEOfXfZqxQv1IgHLTZTy4Z4V4NFpSXZu2iyyiaJhdk7mgPF+fK6qjR7GFv6tQ4gpUFT1koaOdfa547NZz5+/CO3286UXp+v187Pv/zMD59/ZPeON2fHmS1z//gO6zuDBbbXyrLMlJ759vUbpRSW0yNPD0+URZnoy7KE3brTc+bXL3+TOPjdO7ZtpzhoQJ0TacqBqXa2Ve3y6XzBEBzkMRuobafk6RiIFJPwrtJZor27Xa+UUignVZ5Hi5lkV9AQm2VeFqzqNVRvbOsGydjjcrAhoApZ/jSVKIg0/W+14sXJNfKcW2eaC30XG6RXpeRN84TnArsqQ6ZJHYfXoFganjP5dBGdMPZkc4e2s7qGtSWfsNJIaWIK/NxM7Bzxm+uBTdph6aFK+rWSED3UmnoB8xS4skqSPrBWT3R2humcll0Dz6QY/Hkcowc04WNoKbigs8azlw8t/VXJanaikkl5mAQO0Znsg6c0kSfjn/7yjT/9+YnLJdFThZ6prZPsxtYykxlTnjSf8hKQX2QmuIfaeY7XA/RQ9puYZW7Ss7Rg9aQ3ueUD8hBRQIPPYVHSeuOXv/w7Uip8ePcTp/NF0bq3F+oyM81z2H0L721jroLR2xvPpAEFjizkeEJpuO42BeRIpk3M4/zY6E5X8IuD2cyEhujXdmMUYfTGyNUeGRd1q+SS/66DUHcZsFscMa3vEZ+pA2HMEzRwdfZeud2+yEAuARR4UzDUrteWUqXuyg8finwPOLS1SrITta3szeh9Z9uMuu/UJqbMXmWP0XYoBX7/hx9597RQcidN4UJrYdwURUkKcoVgFT/S1XSgv5kF4cprP9T80VkfxYvOgWnKYgzF94zmiD32UTKLpMMQ7/Z+dC3qGDuD7m5Z++o1sjSEeiHMTD7BYCHx9wXOYBv2o6Ufr+m1GIgfEovYBvzCYdHDq6NsolPdDrRhd7h7+syH7z7x9aXx81/+hYfzPff3D7g5Hz9+z6Bq55I5uSQGbhpWT5Ps/Zcsfck1CogfPn/iu++/5/7piaUU1ipb8H3dOJ3OZHdOpwu39UayzN2SKMs0UZIwLIV3azHPy+nVRTIexHCglK9+vGECXtg7U5ownL3tisuzxAmj5TFiUk2tMiIskcM0rO47e6+03jhNZ3pv9N6ZUmZvFavCKW3KWG3sWQ97OZ0B2PaNHOEl58uZk+uWbK2Rcigat07rMiFM7rxsK9O0yOwNKJH05A41dbXBreM5gtC3RAnlZcrO17ZhDufLmZQ0D0l9wmkkgyURw2mPAZ0WQItqqluNZxiCxIC/zJouY29kO7HHKnVGOEo/2nJFHAqSATGY8LHoR9wRh2mfgotEF17XE//5n35l60ZmofeVlKCG5iVlRTv+9qXxTz/fWE5Gund832nuym7o0JIu0mxZQ2HXUD65uhUjsdVdRIWvv7HtV54eP1FO5zf4GnEpqErTUSnILo0jx0PJmjqgkKvbvmJ95Xp5xq0zTQvLfI+3Rqs7Kc14k7U8uwu+GB48FgctrxTQOHPGi9EB3jPXfePUGj5PR+7y62Ub3QAp8qKj47E7UuKgCo+f0PvrpZRq0GeTLOUlqI4Pj8YQeO57xXunthazI3H/iQ7Seg9arHzHXnU/r4fsVtsrQjAKDxcttDn0touWWxutSz+x7ZXr7lxfNtoO+94oBX76/WfevbtQZlVTKWZtKWUJKePiS2MoTw8sPthHlklubL3hvTLlMWBO5PCNc+/hO/lq5Idz2LkPGrA6ihyfAXIP2Ne4oDqelRd+hDiNDAmXG66lIl1JiYrfRqcoSHwQ249C981+E318kAcCihyt9fErHfOWHqQc/Z7mqmOWmREZxLtYesvyjm9fbqTTA5fTHIN2mHImlyIniiQpQqHhObFtG9Wky8km1XTfVywn/vjHP4NJVzNnzZyXMrHv8GVbWc4XenfuL3eKeMiJr1+/UswgT+XIJq477L0yDevezsG1iO6fVHQ7GsZeV5blxNokgktpIafC5WmmDCpYkjpaH2gNZauGNs1FL80l07b9VXQVt2T3RilCZwW5xGHYOr3uCjAhxwC1QylBYQx/JVNWqyoibahM57pe2Vdht2VZmBNsbnoOJl+iTYoVaLpA2hxaEa9s3nh59phXRA5t39WDWmFJiWvRIM1SI5UUNMkuY9e4OCxV2QDY0DS0sNOWcMnThMbzQ8MbYqfXQjEugmhX3/4BftgUwARuwYaa+ctfd/75X37l22YkJrzv4I3WnPN8UndkjqXE2jv//v/4hXf3HyjWOd/FBkoZyx38hhTOMfjtjptTikgM1/WZbX3htDxQW+Xx6TuWWZe4WyhKwi9KB8ugoLaDliy4wsg5OjFbMDPePf5AmSbuH95hvZKnWZdVHuuNCA3zoJqm4wAYg+74YbFWRgfzKqYz4JwLW6/sX688PD7GRtdhklggaLdK+spxOYwsh/g6V8e9rytzvP+97ZRUqK1KrGevOpfOJouFnvAuHVKrnda72Dq9QtieK0+7BfRijE9diW0a9mtwHZsY2bO4v/L6ncpWVUjVG2y7s+7Odruyr411l8L9h58+8OHdmTxLI2R5oru0LzklconYXR/Da4+DWBRxi5lnB6aUaF4010KDVosuGghhra5LZR6EyLT3Y60PPVcK9pw1dQwj+GnAvzHlZxBJ8IbN82FQmnPGkg7PdbuKzRjmexYuqbrgB7kERkSvxJivHcZh0Ni1btWxviW3BC386CJFjkgps7edeX7k0w9/5tonzpb5/rvvmcpCbepA9lbZa6OkRN03/t2/+z/485/+xLTM5N5kmULn+fmF87ywLAvn5cTz8ze+XF/48P4DROdce+Xx4VFnbE5s1xt5Vud/mmfKFPqG2kXtNDNKnslTfq1UW8AvZlQaJWwu9F3VJSyn81HhDq+dysB4tTC9iveb3MLHPmirSQ97H3bVbRwWgrM8wRgAtT2gmCT4ciaz7hu//vorvQli+vBBpnJmRkGupSkX5sDuy5TY1ivTPFHpzAlSKUxRdXhvNHfmVmg4m+2kOZO7qjSzQqmZ5aLLAwyvTmVi2Cl/252+aoZSilHM8VSxroWQAbIzpYmUpRUoYRN8WDoHPqkwp6hajwugj3MtFmM9Zhnddfl6D/hiQCQUqid+/Vr5N//+K2V+wg2a76TemUqOqqmT84Szs7bGPBV++etX/vnnM/ePM35dOXvg/MnxqMLUZWm50zutah5wmi/cnR/I04l0WBYYhHaiW6bVXdVU0qD9GMf0Hn5HGgju+6tgrxTju+8/RbRoCUils3dnKjkU27JzFpMKik1iJjV1fuMy0nMVfp1ssK70XmQaXJgBz862VSwPYgKkUt/AKhbOpiHUi27c3ILxwnFBgA6Tve/Uusd8IkXWg2Zu4/Oum6r83jo7TSEP2iVCvsdsKWjatRv0piTBpgtgdBB9ZEOERTju0aEIZtq3yt7GTPCFl7WyVe3HP/zxdzzen8jLpgsi1L9YJacJy2HLPiWoQ5QmqngGBpNHZpkcs6Faq2zBk0Ukiwq0txYp6saGRXiYWsZesHH5uLhjvQ/jlEw3OS+o+1CyXM4ZDwKNCh4DK+Qsto/EnLEGBznlzTDaTcSH8WciHpToNqKzPDoFwfSETmR0GQe8G11I745HN/f+4488PH1ibjNOp9WN3jf2vVKKupdeKzVnSknch6DOm7FtlZf1mYfTPefzgnfpYmRdkylZOjgLGHa7bdzfS/2/Xq98uV35dD4zRNSlTIW9Vb7++pXz3T2nZdFBP/BjnGYNa51t28NITV0EtcvzZBxaCHccF0VCrey23TBzCWuasbdKieGVt06tqkjmoml9G/m6HubcfbCJO75XvKNZhmW22rh+u/Ly7RkrCb913j09kfMS+LVeSykFt8pSZpo3SpmZJrEwrBQ6RuuJeU7suywhMEgtLrXuWDFyi2GjOcuki7F6Jc0J6qgstKgTiVpkGFd9zDg6fe1Hu2rDayfp2WXUups5Uypx0I1DJzjj6ELpjTDz0gE3Lg8GZu5hFBeLFjKbFf762294Uqf3fH1myQuUHA7C2gA5T9AzN7+xLGe+rQv//I/PfPc58XgPftNw0muhtW88XCaYOyU1TEHE8RyKoIdstLbTLRTqoWylE9W/qI41wgimPNFaVednEjw11ybK+RJ00cJUGiNlTYNmP+AIZYIY7oJyzBTZGKNcUkNeOSmGnTSyT9gwoUO01t7FW+upMJ+yBqB1Z22iPmcrTDoBxYCK88RxpoDPGpXcMq3vB6wbvGD2trJvz4LGupHSBEZoFozu+wH1um44QBK7PGAlV9XWoxvEobU4jAjr726YbQe3n3BK2GtHNi4aTq/rxm3b6Tv0W6WucFngu+8/8HA/USa5E6uolN13Noc04l4V4+HDZqQXvFeGcaiq8BmzG+6b0IYxN+qNyZaYQcXMTqdQvGQVlzYcYMewt2vKiamnvXbR5nEoNqubKJOKkJhqlZxj7RiyEdeQXtDma464htXKY7GYP4yPDyImOZV4X5oHDtgaPJCBmIeYoWzveG+muUY3IQXWK4l7Pv70r7k1x/sqV/7uXK/feHl55sOHj2zbevhNtQqff/wd19uVl28vrNvKeV5UHKcSzL8d9wIp83j/EH5ZWpu/ff2Vy+UixGaa+C6KmGRGKkUOdiUXHh/fMS+TqHcBuSR3anDZm8G0ZOrW2OvKPM2CgsL6QIreRkmF1qvsv3tjXa/0Ks1Cc2cuk8yyogV3kx2HR6xeH4Z33o/Mg2H5Qd01lCkxp/COR3ubizqAy+nMVGa8Be/aVU+0fcOa02YpzKd5lgcUHl8jSXw32TdMSZGSZp3ZNOgU1XwD7GDbkCbSZqRiLBNstcWFKb3AhEfsY2gVqmE5k4KVMSwVmuvSrURmdO8R1lohafhIDJS9h6G562AM26E41KLltRQXRw96qrNqmg75QspXNq+k1MhZdMLam1xFwypiVMC5FKZc+PrtGz//cyaz4Eui3Taev/6C9Y0//vEsGt1UqM0pOR8zGO/12JwWtN/W5e7Zk8lemlFROXWt1CzhodhcmVqbYCwSvd008DNofSi4d1WYY6NWJ5Xx1FN4/uvgal6hN3rWbKo2yG9yQwjRFNnozaBVquXQV4QkrixYX3m53ZhTYe2JuWQZ5uEMwdgYIvcul1XpSTK1y0126F1Em11xL7Rd+S4lGbWt1OpRnB2r6PBp6oG1i523SmYajB28H2KxFAVca1mwKKLs7lVK7N4zrRq1Od4XvO5cbzvbDqcz/OFPf+TurAKxJM2axnwHIjNjKOPjdQ4SgA3UIQ5UN7AmnUBvLoEYQcYY3UIa1vej8n4LC8IQmroZuTkkG7lZtKB8Z6aArJ1MVreJHUWEXrc+qXEBN++vcx0z4RCHpXns+eguhsGnuodxQeg5q3t9M+jGjplIT2G/EV/vQQFsVLrD04cfKdM7zRe7s9WNKRVyTjw9PjHPM/u2sdfKVCZ+/fYb73MiWVbg1iQ92r7vTDmHn5nF+pTIsl2vkIzTvPDTDz9xu636mnmWuLhLt/Nwd0exJux4WR5odad2p8UU37qTgx3w/PyFqUxMc6GkU/jgjOGLIKOcghOf1F1s2426VqZlmKJx0PuG3fJRXQSGaF3OKYN63NBgqq0bO2rr11rJDnkS573Mmcd3T/jeON+dqV7pTV1ObV2YdE6HOM4w+UTtGmimqRwL1xymZHhOh1eTlUQzZQNXlvDOEeTRHfop5jfuzCWG3XEBJsBT4VZ3+r4rGL7BbMaU5O3iJotlzWrSwVkv5lE9a7ituYvJhr1V9ibhVfXQCIQamQMKUaXb4uLqDXoSFTInHZbJCp6NaUps1w1MkMv1ttJ8p0yaPyVz9r1z/dZ4uXP6dmPdfqWtld/9+IlWdRGv3chToTVBPsnjMo+qprkGrznLnrntnVxg3+MQ68O+3OPABsKWwnPWBeZOKjsj9TCnRi5O6o1STmJxGUx1HKTQk7qrCSdbkCDcBKu6nmU2Gfd1yzK8a0Fr9rCt7sqNMMu0sLe4v5x5qRu0yi0Ln9elsYsKHAaHe+9s12d5CNlG3XdRtpPsp3M6cduv+H5T95hgi0PPTOwiHbrlgM881kkK358OKoT6Nv5iHL4pKuGhHZjZ20pvgs7aBm5G3bsyZPbK9bqx7XC+gx9+9wMPdyfMVURYyTokTZfDAbN5lEeuOaYdYNDA62N24E6Nyrq7iCWDMq6j10neGCmHJDsotAP37yj1Um0LeM9k60qi9GG4KDpyHpeZe8ykXmFbnc+vlb5DGGhGEdadoeMeXQIx8bFRVBAQ67jGDzscFSh0iU1feXMx6+QAnvAmM47dTnz6/X/JXB64Nc0FT9MMZqzfVu7u5PR6vruoiCuFd3kUzX68HjG1VPCWPGNBnTYT1DpMXL9dNbP4y8//zOXujvvzPWkW3fivf/sbl/OZcrm7p1Z5u+Q8QUrkpjChlpxU9SG3TYEUaS70KSh98aZ1E/YYTAW84J2pnOCkDzWbxq5Cj5Q+1cOmPBcNt+id6gqXabVSe1WgvYuRsARYu++VXKBvjS/XZ6Yy83BZsEum75UaKWcQmg/vB/zjwVhpZpRcQrbhEs5MM953rntl9pliRkVVSMoZvNH6Ltx0bAwcusvpM2dlDpjT103wTXgdLQ67ZVKrI2yZNE143TGDEm67loIDnhLURjERBTy6tdo7zRLzPFO2ja04tieKwbUa5MRUUox7XB1KKdp4xWJiYpxyYm9S2yYS1+tVvProk08l6f1YYt1X9n6jGMzzHddvz7zwhcu58+7dEznDdf1KTidSqSzN8amwbS/CqU1VTCq61CxZuExKQZ3rxLY1WlXGefcgCvRBNQ1qbBK7JpckfjwbkLg+P1PryuXugceHTMnikyunuov+bKoo29Y0X0oGFowg1Dn1XmkRvkJ3muWDYLE3HTi97zKoa5217ZFVkOl1pdfEUpw6OW3fxawLHci+ftOaacj63TvrbSWXIvM9DWBivuAR/Bf6CefQw6Qk3RFh/DjuUflZJbrvsoZ3aQbcY8DtHOriTqPvK7XPtJbZvdG2Susr21pZr3Dd4OEB/vCHPzMvTs67DmsyKZ3w6JQGrJajpDsMMO2VjeaoKu+tsdPI6YS3SvWADC2R8kTqjW0XBf4oQlMUWqhYwEfBOQwewYb+xxKJdlhuD2bdNGWGf9oYQI+utYeVT++aKxCdBaYCdHDEigma8QCw8eG4MI55AkLOxwzCEFFnj458MKNSwK1vxXVGp7tx9/QTeXrPbd1xl3cSGNO0YGU6Lq9WxSDbbusrzTdJoGseIs+RX94qnl5p0Tkn5j6JUZcncpk4PzxwWs5Mp4V93WhuTKVEcBhwPi3sNXFdr8JmXYynIwi8di4Pj6y3F3INKwLnUDht+5ViRUlhx22qy3KKN9ZaVSuXjMkHP9vZ1g3fjdM8haGXxD7rtvHy/AXu7jnN8/F9rRtTytDguq5Y7eQJdQrux8S/ZA06W1dl38zwYf3gIT2vnaUkmDIjeNzyRCmNlI1OJo3BaWwF5SiLClvDaI1s+N6P7ih3Vb2WNBBzy0y5YPt2aAEsFlielPRdc2SAvxl4qfNRhZhdbWddG6eL5jGVhN+uumyKMZ8WKkbyTu1O6pUupE+q4XGx5cL5ZKwvV7atMSM7FDPou/BeK68LeUqZjZ1lKdTauN6+8uEpcbl7R5md3l/o5rxcb+Rk7NON6TTjbcf8BaOTk2mGY5Na/KaOspSF3hu1Orf1xu3b33AS295YpjusnCOPoEZanGIr8zTHpnS+/vrCz//8C8v5r/zuxz+Kqpuc0ymTcqUsF0Zu2Z4TZYM0zUw5sa1fgUqZdD9OroFw9YT17aiSPTayJcguppPXzg7kHBkpyVm3jb1uunBaCA0xwSNxadtxWLl0PmMu6hZFjQbprQvOHXqYYb4mhl5EilboyaFvdN8ZrLPaO70qJaiF/5MlmdDV1oN6KqZUq53bvkFtXK+KH/34ET798FOoxRUbUMiozNDPzkQHPobRAbMJWcoRsav3klPnr7/+Rdz7S4pZE5gJerU47Et+zfMLoPCojEUb1T9dqeqMXwO2S2Ui1R1LEdQzz3FZaIA+ui8nqOxJ30vwtKDCoaEBMHl9i4QT1iWMzzT6t8N36XAUFkOrtQiZitnEyCwR6STx2ke0KA/OPL37Hc/XypyeuVzOmr1ieMq8e3igA3/9689c1xvfffqBdd3C2FJF0JRkrOjeIGYfHajbps7VwoxyFkPMEDvo3d0Dp5OG1TYL3nzImdu2UgY/eyqFfSvUvGtAXUzurmSqO62urwHzLtGLPHpgmU+s242pGylnetuPRQ1So9JdQrdUQtzTYnjSaXtg2O743mg0pnnmcXpHGsZ0lkgNhtqkO8zLiXmemXJm5GJMy8yw8W2tsa/y/U8YqWWmJdTdLg430XEMSqNmMYZX01DYCDzSGSxX9wrT6djsyWDtG83F0885BxTSA/bKYJ29w94q59M52t52dDdzOlHCEiOlrDmOAy6nztaa8rinzHk6s+67lOjBKsNiKFs3ruuOuVGmE8sceQZm7HtT1Yozn43TVviWG3sb1hTyx7pfThTL7F3rIGWnVefx6Z75lHmcHrm7M2q/aUHmSUSH6nhO1DZRa41tvmE4yzTT+guZRw2Y2xX8FQ7oFGiJrWfqdqM65NKZ+kbPBZjYHaxpnlBr1Ja9cr3tVJthNb7eNp5vO2WBS5up/sJSbpyXs+izCUqGsu2000Ki03yn9bDHKEmeTJbxJuPAlBJzyhCMnNZ2egsXLTfqHtofnNr3IDoLXlM05pgnhD1KrD8dNbJ50d+PQax7wHIBtw5mX29433Av9GzQROxIPVHDrC8l2OoNQm09RH/NRYeutdLaSl0rTmLfnH2X4HTbYW/w8AQ//vgHypLJJTHNsvTIvHqmvRpRBhQ4qvo+XHIjDtikum7uXE4PwTwKyEUnKiPLGyyyq4fyvsc1kQ/40Y3ozvIbOBKcGIzHuGGapJ8qB6Vej3YkA46nn5IG9o6EiQnNIxwOg8NEwmKu0+PM6+GiOhxth2W1u+Ht1eVWPzsfXcTxow/oqQE7vRsfPv+RT5//FXsV+lCmzO22UaYioaTJCWOtO+smgWWtOymdmMpExvjrX/8ZDJ4eP+p5NEH0c86s2yqabynUddV8jASnEySZcV7XjbbvPD4+kVLmbIny8PBA23f2vjOfZ8puzEVOrXvd8e7Mp5k77pms0JPz7aXStpX5dNEgNcJUNF9QRWpdG8yQBiL6QeoQnoAGyFMhV7X75s7eOyMuMpusnruP+1AHqgI5nLmUgKXk1zM41e6NnCbqXqlVqlZV46+LOc3lja0GxwJQJyUWUQ7edY/FmAKPnWwGk6Wwx/BwmedgBsm/SLGZWQwqAanMp4X5tKhqcqdS1FqH+hUIYaPcq6zMarld0M8Sg8g0ZXKwLnJKVBcjKHXjZQXfO6lkpqxLevJQjns9LsLTaeHLt6qKa8AS1lnmiWU5qRpuOw+P72nrxmmeOJ0SuWzMJ3CrTAY5zSifWLhtDWO4vek9kjJzNtZeBS0kWYETqX9itAgE82xcLk/46Z4UYh91VnJQtdCPdMt465hnumc8T1zuxMhYbx7mbU2XSbuyL5XanLvTmVQEV9S+BZwDUKm6Z5lr0AORhkDW5JVbrlgOONUT0siGk8BxWDnEjEn0TeUICOfWfKCP+UYcVlqvw5VWs4MeF4Qui/56OMX3F37+OvDde6X7jqEui6Z5hYq1SahMStTa2fcaLgSzusKt0ppTb7B2uH+AP/zxTyznJUSAr1Atnl6Fw12ECovCAIt/Z1T/aQAzwcTr5GkiNVXdWD4OTLGURP/W/ok9Gkh/7/txsL4aK4uU4VaPLmTAhlYmXg3KX3/GiGqGJBpofA7ePFiJOcw+idlhDQqz3nM3kyWMD9Cpx+uIQjY83vsQ2tnQfMQtlTzmhIPaK/cA7x0rj3z+6b9hmu+YZvW9+155fn5mWRZeXm48PD6QU+H5+Znn52de3r3ndL5jKiVIG427uye2/cY//uf/wKfPPwaUr2F9bTutN52bLs3KMs0xl+nUrsF1L+WgyLbW1ElcY7B4nhdqKooz7E0Og4Q1QYeWu1rOvTFNJ05lonpnvV1prTGfTliXGZghmqqiUcMjJ6bmg6HQe2OEbvfWyWh2sVnQ3eKDHvqLNIZaaIC77YpdVbU/qfETq5JWK4VEz4kpFVK2mAWEbN6g1ybzyRTW0gV6c+ZcqC4nXMFVHhe//kzVhoGpws9JA/zhhCAKHWoBzWB4BKWQ3XsIu9701W3b8DkzZdGEU1m02UxLsdfOPBVy0IRLES7ek5G6RIsdDUjd1J5KaBLVi3fIE2Wyo8Nzd7xWLHjXOWWWMuEd1m3nfFqgJJ6/vPDddyfSfKOYQ540HM062La2k22SV5WPVj3jLu76bsq9Sy6YsBQn2Rm3ld4h57+ncab82tabKbVLmqQYhwbTZG/Otke0ZgpsvxteZtb1hWwT57M0MyWLWV8YYjpYB5MPOzj8t+DnZzMcg8i1RnEl5BzEC5PBIJbIHlBdHBqGic7qe7iJShfjXcFGNY7SHOIqDFlye0SF1sGkEYd/xGr6yJYIt9ZRkUsnI1Fi76K0Zss4RYFc+4YHBOnVWXcpt2tFCXMb5Am+f4LvP/0Dy6mEENAwm0Q8CNGjLEM2MeHc5GAQy7ibuoL8ZkKR3KndqW0LHazIFFIqDx1VFG9B9XlVNesytLCMySnL4DOetx3lHYJkDEG8Xboox45OigEjJeXGtPiZtcmiRGfTdjDNdAETcAx4Bqr22+h6XqNHR3dlIRrm2LcQxWWsssNpOP7UOrQOj+9/x/3lR26tU1In2UzKxtPjO9w7f/nLz5gZ9/f3/Pj9j6QfEr0568sVlonz+cLenZSgNa2B1jpWdFZ2y5znEyMq9jSfNGvGZew6mKTWKEl56VjjH//5nyjZkpLeDLa+qUq1TF0jfSxlmjeWedZAmc7l4Z6UFfSSu4YqeepMZWavGqQAXK9SNZs5p8uF7boOjzIwo3pjSuW4j1soRluVTmHK6WA5HY6Y4drYum7gkgLnc10iHrd3AnwuLBQdkPH3hwLyMBabhm8S7NebcPvTQto188imTqi3/uosGx+yWQ4M1Q4nS3Mw7698bpy1Naas9IGOVKkeL6a7htRpWUju3F5u7HXn/v4+RDNRsViimXDOhElpmSBtwdRJBt1Ypoz1xGmeYkEMB1U4TyWq3zBP8x1Dles0FbI5tVe2qwadl8uFl+evnBbj6d2JaXnGZlFqk1vQZDVLetkb2WRLLsV0J6WJ5At9X9lJmE/M00a3G5kTySZKSUJGAs8eUCJHHRo5FfE0E07rxm270Wtm3TprBa+jUtoou8lHqpxIG5yWTIqMhLU1HerpDXyQkI9WCNGmDM0S1hJ76lif8NTouyAeC3M+C3rmLsUCNiCHGIrjiYYqPAW6aPZlmkqH7089DgsfJn8uGvjISHASjf2Y43TC46iPzlhfV7vHoaqLdN9volj7xN6c9aqB/O5SU9fWaTuc7+F3P/6J+U6fh2DQ15Q9MfhD1uFS0+cQZB0pbJEfYm+ciHsL+5i+H4NdZUpLfT0q+2SZkQA31uq4HIbuYjwnPUMgiMZ6dRZznOgmVF0cUFayRAtbn947k2nGuIe6fIjaetdrlzdWeH51oRoWCIYotKIY/70eQrqRAEy0D2INy0jTsTYiGIJuHWQE0iO/+91/zW1zvrw8czlNvNQbvVaWi6Dp77/7njxNkX1TNYyfMvu6crveuFwurNcbv375hTLNJDO2fQ+o28PmyJlyplZB1eu6sa0rH57ecVtXvjx/5eX5yvfff09JmTIvPH/7Rll3td3LsgS7xo6q0hNMqfDl+TdKzlwuZ8ntTYtxa5sGeOacp4XeNVs4TTP/8svPvHz7RgceHx/CKFAfaraEZ5j6GMo5DMGaIaYDYQLokcbVJTobQyKQZUQ/HkBjTjMBHdMTtE1taglMlWGz4ao2WlS9rXVu28rLl29MJfO0zGJ8tJ2ekiogs1gIBOQlaxGJwBrrLqFhIYtZ4FFZGizjUgjPKPDozrTZciyq56/PrPtKa519lfhnQAseOQMpJb3HFrCbG+45YL7GspzI03zYbJuB+R5jV2cE3YNxmQt/NUErJecwMAuaLbCtLzS/8en7O6azErDdOiBXUxsVMAmr4oGlLAPHlDrmGoj+y798gZQwP/GHP8ykvpJIVEKo2UMkGPOfw5cfXcZDFGauMei+NbYN6q7hZW/GbW1cry9czjOlFFlm337m0/t3lJypxSjVadahRIrEgBK60UwaDgn4SrDABN1gEvQRa6WURPNRper7yHJbZaN1D/ZfMF3i0IQWxUMsJ5flw1jruSfE3tlFW/XGMB2sPjKHw68osHI5JSSSeWgOblg/4dZoTTYbNGerLk1E1axuC0PCdx9PPD2+53QulDIR7AbMpmOuONIjj/vIDGtBde2dZnJYHuZ0GRPM5sLbqwcbCVM3FUrnYX9uaeyrHp5N0T2M58Tr3rNR5Xo4NjB8zMYQ+bgzo+vUf+iyVHm4OeEeOwKOoLqrwxlQkkmEiTXcMkFcInULR94Blw0G0SD563v0eCEjmMq983K98vik0LRBD647fPfjP3B//x1/u16preJdFIFfvv0KX36llMI8n3g6n7FkfPv2jdu6cnd/z3R3YiFp1uQ6/N8/vufD03fquEqOXHNpJiBFl6mL88tvX7m/f6TkwtwraxbElJJMhH748UfKNE08PDxyOs2Bz3WaN2pWrm2aE6f9DMlYbxsd3UZfv33l6/NXEpm7u4tomrv8Z/Iy8e7pifPlTsZd4fxapkk3cq2IbaYHlQL6CBgWH5tphJkHhJR95KmJuZDTWLxaaAOG6ggfjSOP3qt8XZzoILIONHesObfrym29Mk2Zh7t76JLtl+kivFBFYQwrx6xCLdHWesxAioaFOTaDyXSs0bmt4q2fllMsZ3nStEGjA7YWfI08kadEWQT7iPaY6L1A2+VHgy5w20WbLZbY66bvHc/XAt4iZVEiITafWF+dzsO7B37Iif3WeP525bKc2au+R/XG3m58+HDicpay1nD0IhM5yUKi7xokugmnF0Cyx+cgvPd8mdh3qd6tp6CWyt6ELuZQQ3Cjsg8CWHTwNir2HJVyYm8Z3xu9KS5077DVinnhdt243GWm6YzXF269UraNlBULNERpwu7jIvA0YHJG1vCadLAlk+dWaw23RjZjrT0qVkFhuQs9Dx7aa8YDIXTUTzl0AAPqG780p3uTwWCwt43exxpOoR0RQ8ubLMw7KXBwZ6sr7mvQRSvrehXO3yu3rbHtTqsWDghOzvDw/p7vPn7ifJkVWYwuSktFc1g3qd0Hw89rWLunY40cw/zDQUx9fI+DtlU7aMSCmF69Ad5y+geMOLqLRiMzMtQFP6qYFETXfUOakeEjJ/ianGNuIbgwHW4DA8LTs9/bhrvRkyIIkosWH8OH+NIOFLx1PFL0Rvzs6//GmTXmESDzwvgsSxSDKfPweB8dj4ty7TAt9/z+d/+a57Wxbd94evqenDKXZWK5v/Af/9N/5MvzC3eeuGw7OUsTNgpbEMtyToXT+cxyOukC83AbaDu/fv3C6XThsixi07lwlbvzhW/LC+t643I6U5YTH6aZZT7Reuf5+RuneaFoiCHGCyZOflt33KFME96d03LiZV1pUam2feN0d2K5P2l85DpASc6+iyL4cP/AKVgg+77DVrFpUiVaJkprbwLcLSojiU40DN4FW4Tieiwc0U4zp3nCm/Oy3xTwfT6FuR9QxcHORUrd9WXn/u6sTU0OpXimxqDs7nzmNC3YNAZZxtYrJRHW5q4oSoxhhNRbV+hO27FcmEthq3qNUy7Se/R6DORTmQ7OO2MmEV733RWiVu4vGkBFoyqFpjZQSQlOZ3rXwmjIGsDH8kwoR8gkpQfThb9v+vlJQ1Rdk2HFneDp4Y5vvLDejLrttC4X31w6T0+FuwuYVSYvh/sklqiulC4P0RM+PicDZtV0Dqk0nh5PpJQpZnTfoM3UnChWOVoGz1TPquZNkAZdnU/vMjNTm76w3m7cbhvNNSD3NpM949Yw9N4vp3taD9EXmeoTvTWy73iSIK012UhgTnajNOVrWBO0R67KWCEIGJ6p49QnYZFmR5mQpbuGnSPKclS6A+PN6Q27xmVBkQNm6b3zGkFlx4XQrUPbXwfW7kf31lqldQ2oE3uIMCfZLTRnq01mgNVo1WldA9nTHXz88ANP7++ZT4scDzzJ5LFMTGnShW9iJlavR+TuYdcz9Dwo6CeFQlrGfYKwu7cgcLy9DF7zyt96Mx2U0zjMS8w39LfrwTDE33wdw7/MwhspY17Ipie5AWaZra2yBUHxyLiJYWmJ2mpg9hYEhERLhh3Z0wdopPcQxQGoKLLOYaioyiCG+AMCj6Jj+M9JMKx1XXfj8+d/xd3j93x92Xm8e0fJhXXfucZc5PvvPvO+13Crzuy3m7RCOTq/uHAgmFp1P9AZD2bY3emePEkTRk6UgAytJJ4e73QimLNeb5zP8oDqvbG3yul0ovxv/9v/xnfffcfnz5/E60XCMHcxZzw7p3lhrZXH+ZFUjFY02KpVLa3XymYVq0rfqvvG19++Us4zpyzIxOaJkowvv31jngQJ0I2eLAYoo5NVG9d2KaUTIf9H1Lm6N3J2YKa63BDdnW3bFI4xT2ytUcbitMTDWUMaeYJ31ucr6f6OnIqGklkc97YLi08506vUjN50ebkFPa9WRm27d6dMs9SqrqpeKuwmR8+UICVOZToiNxkLzqVHEYdbw6ZhH52jB87mIQwKK2ED0qT2ta7HkVKjEhMdUsImSykwWGHVk2WS6/MVtbKTcyJnuFwK7gtfn6UIfrgUypyYZl3iyUtUXZnZHLyBBSMrvRE1WcJH9xeEBLfhscOR5zBYS8202ROvWH/Do/DQhV57o7cUuR+6HluzqFu1SXqXuChRyEWuwK3BvNyTTBX5um6QOkspRyvtWGgMqp7VrPlWM1NQvGcKPeCXMWps0uAMLyHveK3SN5gjV1aJqIaNew0gYrCazbpS0XzDPSPJsGy/CdO83ozWtjgKVdHiYcLXgkrrOqiVJqdUNHdNQveaNHNoUKu6rWzw/nHm/fvP3D3cs5x0Wcrob5g0FvI0xwUdf+aqjLu9ZoSYZw2uzYEiJmKWUeO+rdQWbs+MX4MYLFbaKw011g39gJN4Y4JH2PQwcH8joD/ReYfuyeOmkV9bCiPRHsSGyM7oAd0OWj2v5BgRSnQh5K5M8d7jUkgjg2XcBK9TUjm7+zGPklmp1kVKmUHuTcRfC5isVWe+fODzD/8a95nqK0s5cd1uZBJbxK2ezmculwfavtK2ynw6UVtl3zb+9usvlLIotyfXAwmw7HhK1Lqz3W6cLhfFSOOsvfHv/+N/ZDktfPr+s8hKgzDgndvthbvznULceta5+unHH/nw9Mi6r2zbyul8Zp4WNr19piSV9d4am8sf53Qq1CqbgJQyvSDRWRKFstYGU+I0z+Q8077elH+dtQDzsgTTx8muQyFnMVW2fWU6z0zzFIFCk1St0TGeTueBAurDtYTlaO7D/wg4sqStGJ6NtjbMdjGowuGxtSobA4QXW/hsmBnn80nU1CzPHqudXju1dwbvoSR5wQhTyFTEkhgDR0O4575v8unx0IMkCdUsKJTJTFm+wcTYEePAUo9q4bWSUX3ZsJKZS+F2u9HrLpIBxi9/+xvn84m7u4ugqHkhRYsJQvCky8jSOFhinibsQQNeUmXvCdhISXi3KlOD3SVqKyVMyoYT6Rj57Mq+ji1oxuur9sThOpp6EA8ylFGrDf67IBELi+lWDfPBVGkiTzTBQvu2g52Dvih2WfIcSm0JljqJVuVinFOiJQn1Dsfdbsegtm0wlyQH4Z5oqZN7qHUt6K5JporZRw8nuKc3J+UYvPewb7Dg4sUA17rr+5g6iyOXPSCcoVh2brTeaD3gDc9hzqdigr6zh/lhSTPeEjTZlW/7Tm9bPAMdjHWH6QSfP3/m4fGOMs8spdA97LxNaELOE2UKUatxDMbNMiNB0HrHkX0PVmIviulDd+p6ZW/74YhKMOlGlFayt8RUAi0YVizHFPjvRaWRLU3YXQiyMWyQB+xVX0GwpRKZitPbpvkhY5Add08otqXDCiabSTDXU4eeNBc6XmlcWv1NR5GyEjnj/Wl8laAkrGo2YdmCLBObpKvDamR+9+O/xtOF674zmRhhGbG05nlmnnN0xlXoQOrQRXzZuzRYaers25Xl/EClKTgu6MS1bvzll7+wfLvw8eN7Ssr85//0n/if/qf/F//tf/vfiXzQ26GfOd3dHdKFHNCs90Z59/SIm7EF1DClIh+c8MlJ0djte+W2r9w/3JFLYV1XAEoptGq03EjeOZ1OLPPM+bKQLUVY/TvoGuA9Pj3S9hqoTdzKyaiWWGxjmYsuW+NQLWeTTD9rVSnBygwz57ycj49wKonaGnOW/bY8X5y+dkrQX1OHvJTXIJpspGbKGh4XS1Ps37pJQXyaFjxLmDKXGLa/oe+NBTRHBaYDSut92ytt1wC7JCPZRG07W6vMucTT1dpOobBOrbFmWG8r3hvL6S42HOFKaWTLyqYlUeMSbQg+okxKgYwB+qiEeteyL2RIBds628sL7VRYpoU5m5TGbaP3YLr3iu+GLVnGhNHdjAt65HSPN2ExuPVghRAUVmHBgS51w5Jo10qkkz12jzOlMeliQx1UbY1933FP7BUdhF2iyOva8d2BLMbdutO75gglQy6JvRmlO3nJEgxuVSmFyFm3mMkULjkv3ZnNRQ4wY29NDqcBx8rGXfoYM1Xn3lt0kEZnPyAvQQ+CFHWJ7Ud0qeI1R3CN6K0qrsUE0sX2QkpzHJoqyFrbaU0FkVfYg/8nq291DpvGU7pkHOY7+OHzj3z87jsdh6ZuJpvgNTkQ25FtYDEcVMJbQEIKZWHvmssQQJBhWMq0Vqn7xhrirQ6Ya3ifLDQE9lqHixkUHYDLUwkP8Vp0FsmMwVbS+48CLIY8Zq+RvSm68tTDctsIGqeswV/DuSJ9ztStaptYHP76xpp8ylrdyOFwoi6qe3s9+LvexyDeWEBNGbk7gIoNqYDVYbS+03vn8vADn7//Iz5f5IKdQ+SLyx6nQp5nfv75n3l+eeHu7onHu3vBxt4hJ15uN15uNz5/+oGyzAKYYjNmjJxncsq8vHyjlMx5WVjOM//3/8f/k6fHR7YttEIup4psjXme1GF5sO9wSh9qUVPSWGudrW3K7UUspLp3np4emfaZZVFle1pmbuuGmVHmEipV3fqbc4heDNl+NO9SCAYFy1ImF3nqzJZpc8NPw8Ncc4m6V/q6Q0YHlENK6WjxUi6UKUfW7Cuim1OwPYjQjykGhRbioIqUdWaB0yF1qFd21yG/7iuEKI8x0DMtxOE/pM2gnyq6nA66vUVSlgmPLueZIZ6KFc88JPp/55tv5GRUg8UBJua8iC2TLGY4KbBS/Z7NiclVCc45wXSBrkSv5h54OqGZiEWexDz58vyNtjfup0KaDdLE5MoxSEDusvAA2WhIyOYU66QSfHNEKJC4cGLkNOuw6ZBEEBokAlVtHJRP69JatOgs1XW0sLP2gFK6fH5cQ96eFHAkXH6ntXDzRd+z953bLvM+gs5IGhDcjnmlZKUeVjrdOvO8HJWvKNbEjMLFZkHQWcJZvIf1eFL2hVvAd3qP+ijH92o6fJugm57sWKuEAaMcpHsI6RK0nd6HpXcNYZM0R/SodiNYq7YNwqyyhrHkyOOZJnj38T3n04XHpwvzLBM9QTIRuOTyBiqTCgvvob5vHFh177r49raq8ja1GR5FkrqVlXW/SYOTSkCGGjw3LLQCQRO1OJjFdX0zsPagl74Kboli5O9+OQHT6ZLHoZtEuDuNKaxb5L5MrBVh9ClFR6iNGJe59p57pLkhCI2c8KiI3PXlZgkLXZLHi4nVQTLNS3m71pO6njElgIJb4f7hD3TuOM0Ltb4A6rRr3cO/rPPy9Vdq09/f1hfq5UzbdvZtI+fMj59/ZF1XFdbu+vfTSZdt75zmme8//UDrO3Oeqb3xtLyn5KJirItNlvPM//5v/2e2vfJ/+e//h3haoUszU35QNuNuuue23fjHn/+F7p0fvvuEpUxddyqNy3LhfDmz143rdsVyZp5KWBVrCKf2pzA5pGXRrdoimaobXiwse59UMUSl0012v1bkvLrGIWilsCEaWwpsW4lnajVySO57bWKOuGPLLMm8N3nLFKPvG70lrKiStXng5Q5bVHOzQS9MSDi01Y2cZk6nhSF4SslItdKjgspTwZoGWa354dJKb7Qku/E+TceS8cDPyzQfNUszj2F1VJsKncAsMeeTXDZRdS5UV/yulGR93FrH5hXfRa1LDj2Fi+b4qLU3ZUvRZSFgXUy0h3cPnO4u4JpRtJ6YbKfv7Rg+dwTN1VzJLcUowENFrIso2SQs2NVRAhLpWQ9IBVIKo0HQ5KEnPKsCsyY6bCaqsz7OA8E1mcLWh0VFZruqm/j2vGFIOVr3jZIEHxacthtta2A7ZZblyNwnLEmn0FKoXa0ylQWbhfvvJgbOXuVjJYNJY2Rt7J6YuuMBL1l0SB5wl7u6LadSLCn3o62ilYd9zEgnG8201myPWYD+vMdBl1KhV/kyaTC8aUBdI+zGQjUd8+1k8O4DvHv/Oy7ne06XCyVD9xpd3n5QTXv3qHrzoXQ2d7bQwoyVKXqq7FYWs8NZoNGp25Vt31G19WYKYZAoQZlXMfpqok/ASMP6Iip7G9iMDk2ZBb6+jgH6pxQkg3j25pGt0juV6CYAUsZcmopkPZr+GCr7cDsQnJbcDpp6e3NLpdBPjOmCLvgYpPOqEH/LoNIHEfLKLmZU9xX3xHL+ntPpM799eWE6Px5oxHBHTkn03+vzjbv7e757/x1rrSQ3vr08Y5a4O19Y143T6URiorWdum2kJDuel9uVlDJ35zPuC3trlG7a403d+ZQSe1UezZe//cbX24so4MOhNor+cnu5cXd3Yd93/t//+7/hb1/+yrKc+PHTj0yW8akz51kayu6kbuzbzr7vnC9nuV1a53S64O6vs4p51oI2vaBsFtGkwqQTgmK+ff2N55crXiufvvtEWmZSFe7daseWRSFAJq+mum5H9OX4VS2RWpMKFLkc7nujJ7WOVmZOy4yZYh/rXpkndUTtJD1E2/QzPSXSlPlwes/tdsWSuP8WWDk5Y9W4Xa+cwyXVs5GRPTkgzD4ZlERxjt83YkDeG82MnFJgo+omshk5TdysKT86FSm743JxUfyP5brXjZQSOc/0fWXddlGNS2aeg7XCKx+jeecWANfl7o67x3uSFVGJuzbw2pzFzlQa++40r2R/zf/QaahBq1dVxilNsci3Y8CbzI4cEUuJxjgYjWIWg30pX3XSilLcwiOLFBvdkdnS3vEmGwos0Vriel1ZXza6mbKhvZEnmIt44LXusd6MqWXyLJsT3ZX1GKqaZcEoO0qr8wpFmpckBdmh4cE7rW/0bCxx2I0pVR/4dAr6drjKFjMdLp6QBkJ/S/TVDYbbaK+QTrRueNOFauEQqyVkErC1jtnKvodFk2kojsva+/vvfhSt/TKFeG34KekiECVVt1o+JkLixqtLhcleze50oRglaW0L1lHnsm8bW6uCoA4dkB2HvKegp5oJmouPW+d9DuipQS7k14EBPRTiGmQrz0b6LfAmuDIRF4PnqOZTOCBonemCceWNBFSkg3y8Rt2oHaKrG+zDYbIY3eeYbkeRMswGBan5m709TqR4311nkfarVPGkO95/+DNlOvPLty+kKXN3eoTk/MvPf+Hbly98+vQjd3d3fPfxe1LKXLddM0Q6p2mhZJ0V57s7vn37yvP1mVIm8iwou5SZuUxsdee23WRhk/MxNkhJIunaXTAu8D/8j/8j6y4obNuugvFzplenXB4ueBPdKZP49OE77u8f6b1x61X4PtFOuzb25XRiLfqAU8603iNEQ4fDrceGNmkkMoA7v375yv3lHKIOOJeMc8++b3xbr+x9ZzFlzpYysxTjtlW8X0klMy8Ly3KSonnbsaLkttz7GCuBGc/fvgHOlATzLKczU8QkNib2tKmCxSheaCmxupNKUtpeKpRlxuLW1UwErBn7beN2u6qNrpW9O5f7O2xO7FuF8Kg5UquyQSmB4esltqrNVSwxnwLOqYIlXp6/sm6V83eiw5aoesh2bHAxoWCKLm3bZZa4e2f79kytlcu0cHm6V5KfSbex7fLcMmC+LAqI8rhGYuHnluheeLGGe4Wu4aJZI1miFKW4GZoZpUHnbAT+OzaEKzshDjfH5X2EuggJtl/x8eSJbjV6NF6x4nHBmWG5qPusnXnO/Pb1W/AUnEqN59ugiB69brLWnuYi3wk4YL0xM0hxSbTaoSvekTRgER3/qUY+R44OF6fgbJ5Fbw1YT7AklIjKrL5TKtSgPTYTzONDsdsqta54q1ie49DZGOmGIj7AuupqNxfkWOPWX1eIbcbdPXz48MSH9z8xn0vYvAfMYXZciDU+x+M0ToTlx2DwBP02oXwVezNzYpJdOhvbemOv6sSylej2MxV1djbsNQIJyPG5yuYtFDUtaL9m9FY1KI2zgsDErUtFU/KkYKMWBnxV0E8PmMe7HRoAkgRkI9hrvNUjw4bhAQcew3FC6yO4dLzudBBmxhYZ9u09POZ6DJL1fXU5DsqUo2fYUHFTKXz66b/i/ccf+OuXjYTx9fmFaT5zKUpi/MvPf+Hu7o7pNGHd6F7ZX67ky1lJlUXPa2+ab8meaD882A5Dw6JLd12vgHE3yaLF0XpKSXED5/MJd13+8zzTXNTw3sXSM3NKTorrXJaZ/+a//a+xKTNZloHUtytrypwvC1ORj1OtO2tVzuq+q4I6bCuacMplPnHbb4fqd0qZ9XYlp0Qp5WDiuHfK/T3TNHFaFs7zDEmxoH2vpGXmcTmxzhN7bSxlIpVE33bakoLuGB8Y9hpyf7mQy2PgdDeWacJKplWNHHM+y8fFYbdG3Svny93BzHKD7JlpmbhtK96kq7j5jYbyvM93d/z222+hhpxV5Vsh53xkVDSUQDVse91hW698+fobrXYe7u95uH/CcPnHd6ecGqezFK1b3bm/uxxzj2xAmVgWzQi6y7mRvjLnRYSAc+P55Ur1zjJNB1y3e+M0zay3mz6j85nkRl1ftJm6M80zUzkzJefraeavvzT2jbAeCRphMLcaSQphMzggpRRiP5EDW9cMRwlj8vCCJMYnUrhqHi8X1OTDan50S6+7M1mnZ1Vnvct7v6TEMsO+VlI2coKpLJQykXDqfgOUm93bmGPYm6pPM6kyMGt3ufBSlJIY9ho9ckxyiyzkhFry7mKUkKSJsaG0F7TiFNpgdKHOpRnBKjJaW1Wpu6xHrIu/P54xwL7vtC7xpePUGrBSsJbmE3z+4QOffvgd06Q9MUDA2nYs1uQg8BbT0L21JgM/H0ywOJiNOOBFM03hm9QH/OdO2zdq3cALyaaYv+h55DEUNjST6ZG0GK+g9gGxbRSTjiUf2omYITVdEN7BFcDBbbuRppm2b5QsJGFYqg9DxDEPk61POQgD470rE0avqbuIAz6oOZbkf+WDchw3y7EedZb1sNIJb6FB3oqfkSGNac+YTRFdDKT0yN3jH2i+MC+Zu7uJtlW8d+q28cff/4GPHz7qPbVObZ1lltHiertyQ4Lc68szrXYulzvcG+d54XK+UOsa1inwfH3mn//pn/jw3Ueent5pzhMXmlti3SvTNB+FmlcxJpM75/NJWTutszsUuvPzb3/j03ffiXba5Ez45ctXelf4zO264heTWtU1GD5wVY8ByKi2o+o92Ylaawyh5C744bsPtE2HIUVsmdI7DyVzNy8HXubZ+Ou3b+y98v7dB2ZmpsmP27qcomtBStu+N5a7M7ge9um0qFr3zrKcmE960C/Pje6V0/mkRLdemdLM5TTL3hvYm/BzdwmQ7uYT3WCaJ+Z1gfumOM+pcDqdomNViExG4poW1gZEALwnC8y9s15VAb1/98D57p4MTNNMtszaO5/u78A6a1zApxioJhdsU1s7Bk/rvtK2lRUjl4mnj+95nz7y8vUbp7s7Skp4cyiJfa2clpny8SP7tnF3vuDERXQ5s7XGMi+iPBepo+c88fNf/olt/xqRqtCrXH81fPVQ0AasxxgFGi08s5wUJHHpF2QjIiMKM2HScqpsh5WBHxtThmzETIggWbgbtVcopo12mSgmyuABSYj4Lhv3Vd5kudwxZ+j7zjKNC0OkhOHbo6wLaTJKMll/p8I0CQYrCIYSdCHzRzddDNkm8Epz4fCi+ppOdGS6N6C/kWlCYO6tOkP5rSFupvZv7JsOyx15cFWNU5gKfP7J+PTDf8n9wxNTiW7NJEilQwr6NIyquovu/crr1D5KkfmCDhjHaHU/LgVBMLrI9u3K7XYLlMBe6bsm/yQPKFF9SRA7xpe48iLqLmi25vA1ir2sBEZZ9McrC8hRQVS+7mzbhi3Tsf6mMmmeE8r93kVnLSm0KX6c4rG2Ks1cMa2jo4qT3qPjpecYVkdXYZr39bhIx6Xy9peIKbH+OypoQjtB39jazHXrvP/thT/+7gdOJ+nS20nM0q/Pz1ya3KRrE/3dA2YrJ2XAf31+VmfYXUmL3jmfRAHfe2ffKpuv3J8fud2uEr9itG2nhtP0NE081519X+ldGovburK2ynK6yIYlKcaZLG1VuW03bt++8e10Zp7mqDAS9+c7rrcry2lm9xoVe2NY7u7bzrZXltMcA0wGoSOqp0gS2zTQvq03Hh4eybNwVUtSdG5NQ7Rc5HOecqfkzPeff2DbVGnN0wxZAfSCJwyvlWmaSPvGBtydT5EvrQHYvt5Y5sL5fGZvlTJlTpczvVXmaabmyvaysV833j09SLvgzjIFBc47ZE33UwSYzHPkeo+BeVc0qFnCWmY+TbS9MU8TW18peVjuGl6ciQIP93z//j3uMhCc54X5dGZ2yLcby2mWZTe6fPq+082ZpoltXVHSWg7ox9imidP5rO81CRq8O99RzHi5veAY9w8P3D2+Axp2p85m+DrJRmXmkuRVb+bMFG7JeXr6xPl0zz/987+l7r/httFNaYKCHSr0oHtSVTzEjGUwUlpr1BbJZaVEdVkpNumiQENx/V1dBkEYDJhT394sYSYAfioZToJsauvc5bOqu9bxHL443gAd9rlooE6vtN3AdmYmPHmES4nnnlCyITgpOTtSxqbSlcGeNOBsvQ9EOrhjDRPlQYexZLiCU+qGaqKzuj9aWOirE6x9j0zqGjCIoIneV7ZNkEjTS8ddncO7j/DjD/8F758elJIXHdmobhNGTzACewQXxmAdFXODRECXTkGFSEfsDn/F53F6CAOvL1f2/SbYL4RylsQM3OOQHBMOS+kV+oeDLu4uptm+79D2IGaom0xxcR8VOIB3aSiI7Bk3Xm5XWq+6iM5nEQLoocNR59C7BJHHPC+J/1+bB4VXL94teHFqaWV5giQJntQd+ZtbVTOKV1sVhQjZMDBWkcjQX6jLaT1xubzn63PnP/z7f+SH7/9Azsavz184nx+kifDC9fbCfbkP+KrQXIzRfZdV0ulOCMh8WrifTwxPKEHfGy/7yu3lG3fnJ56e3vPhw3f8+vU3/vLLX3i8f6DRIcM8TTz/f7n6ryZJsiRLE/wuFKDIgIOAiSszq7u6pvdl52Hm7w8t0dLMLtHSbIPp6gIJIgM4MDNFInLRPjCLWvR6UVREupubqYqKXGY+fMDphaVbuE6z5LlU+K//+T/xi1/9irEb8N6Qc6K2hvch8ItvfyH0OkXjnk8vxC5yGA/YZogmShei1gjRC6up06AgY9ARdxUYiejI4bGdJ+WZ4PXGshEfZDQstUgyXSuMuw1dCMKHxtDKTJ0LbvAM4yjdVmnkPGNqJfQd1TjJyYoBH8ONothaZTlfiUNPiB1GLRmCc8TtBjB0Rd5PcB7fD5haSLkoxi4Plh09plZsCKR54TKd2W1HveENh91exIRVTAhzylzbhW7TEYm3nri1SiviB7Xf7aFCSYlhHHHOEGNHao04aibCLPFg/TiwGMmODtZjetiYHms8WMs8zWw7cemtBfKSMF3HZuiU5dARuit938lhuLax2qXlWulCL3sTDDklZIHpGboOZw13hzu244a//OW/MM0faE09omqlaqa5WroJaF/l4atVDn0DOJOpRthQq8ixtCxaHNDgdaMLUst6bIsOYy1BVhadAZwarzk3yi4B2fFcyoSj4XyH80Hsukum1iS+Ya7pYQypZYLVnG05txQqk5FJ/Llk0sCsB4LRQ0hZXKj7vGLwpTWFjUTf0+pCqaJCLnmRg46jfrsO8aaPqkoPVCZ9P5I3XcTVRaaaCF982fP23S+5249CQW4VbKWpZqSZdTIRwz1YJZiraZ4ulBUOc1gRgK2YiTFKsjC35W0ujZor83xlmS9ybe3PEukMNFuxRcq65F8YTJPiUWnCqiqeVBexNzOGsR9JtVLyTClSDCOCUkjnXrGtkFu7Mf5qLTKbWI+tTiam60Q3jHIAqpWJNHBZyBi1ghH2YakyCTSrvk6aj1GbPM/yuajmSKTst8luhSobKoRVF4SKNEBW6pmQZars2xwzrRmsP/Dum39g++A5vhzBwuly4acffuL+sbAdd6ScxFoIJAPHeoX+GtBw0d32JT72kmlt1SVXH+vDdksfO16en7mcz2x3e7bDyGEcwTqenj7z8vwT+8OOzXZPH3teTi88X868eXjk5fjCp48f2f/qN6Q0M80L3jt859ebtOhoJ8Ek1li8ZgV4zSYIzpPSwpIEw8wpEbxgf1MSEY33Fsmql8phrSGaDms9aZEFi7MW5z0Oy3a3Feta6zBO7D6u5zPLdabR6Lpe2EjKThK8UcRkRrt6HwIxBqECek+wjm4YheXSJKP5Mi+4zhO8J5ckJoT+XjQIRnUALr966WSJbVzSQgwW53q8E3FPa40Qg/xsa8CK+tcEw7B7Q54TSy4472Samhd83wnObQzeG6zrcGokGLsgrq5ZqLt+3FBqJTqHd4HWRaX9CuRWcmGaEz7IdPPnP/2Jv/7tr/Rdx+9/9zspOjUzjB3WNZ6uJ+62O7x3ontYC8WykNXcbLVOD7FXZllWrynDeHjkl+6P/Okv/8T5+D3BJh3O7Ss9mKBzwerH9EoaRB/CXCvWrWwX7Tarp5lCA2qz4hJKw9gg8ZZrkdXD22AxTjn1ruKsZUmJ1hL7cUQCeeW+C1aAj5SF8WSMKoydkcMVEcG12rShls/eGXN7X/A/VFbpwpscDa2tdOh1h6LThWZKpzLTyqyFT03/mhTopkvBZjytXmSCyE58lkqjJokxGUZ4827Hl198xf5uD3XCOLW3N5VKvIngWl0X8+sBLi6kRW0u1j9bu3e5TrL0XRtEY+SAs84zXa6yw2qVZUlCwHDr3kiZXbcCKtoBb/xN4FZEIYExllJFEJnmSQKx4oBtFocnM2MbLEvGdz3BVFoxZIrkVVi3Cp2xVpIyq5X7NueKS/nmGtiafH5tZYrc7P1/9hnqf1bzCm1SRAW9bnQ0zZQVhlr1O1V1TQZoTuOQb3eIiEjXD6OYRq6Wt+9+xd3mPftDz9dfQskSiDXudtKdKGzmnYiU//Vf/oXHt4/EYUO1nvPlyMPhkeN0ouTMZrNhtcBpN8KQONvObebl5YXSGunzB4buG4iyc7TW8Oc//Rtv3r7hm2++xRi4P9zJTpXG73//RxVkLuIEbeX6+VpFuFRSEgqbNYxdx+ly5Xy5kFPmdHqh63q2hz3eWFl42UZBLKhTqbx8/sRmt8Pa7qaGRgtF0/Gumkrv5c8bQq+bp4WC2E+YG/PBEKJn7LZs+o5Fx8h5usiImBaa94QYxNWyLJhipSgYS8qautRJtOeSF2IXCEHM2lqzBOtwIVByIVMlFtT0lFaJXaCWytOnzzw9PWHu7tju93jvuF4vEmITvGz/nbBOUlEW0bTIuBkEZ5cOxDF2I7WvlCUxXSdiFCOv+fmZ+4d7un7gUoTPvR1lX2CKsCNO5zOlNg6HA7UuJBfEFkNhmBA6fvXLX7O/3wlpYLpSciZsd3hTufd7NpsNpRhdkwjbqZYih3lrzFMiDgEfIqs9dckV7z01VbrtPb/77f/EX/9tZL5+jzFHfeASVEex7vZQyRIYhE0my2vbECdePUCabeRssC5jK3grcAvWKr88S4dn1u+3YIzFhSrdqrfQkuhOfCPsenGjlSUQ1kvB8sYSgtMimCW7YAW0yqKccA8lY31WEear31TTKavWhsmVEkToKYxIgankeJCvl84ZTC20cmXJmqtBpjSLpReRXEX9nRZak2S8MhdSkelks4X370fefvEt+81OkxqhujVzTZX3slJVqEUWv+iOrDXkOhSdkLRLXp/NhrCaVHd8O0RpMM0XrpezNpBZYmytaoaautZae+t0MSqG1OmCZhTE05RFZ7DJ6bOK0Fi9gGO1SCJjCBK6Za1EnopduuSAr4FBNgRsLqqxqRgNFzIY2b8pqeBmALge3uu0cMOxQIq17BrWol1auxW5W662ft1ts2GMhHrps3OjLVKFuGAE8s7FMAx3GHsgZ8fzywdqbew2W2I/8O3jG5ZlEYjfWD5//sTQj8RRDDFX0sBm3DLPM8eXZ3IpYCzjdgAj6IVz4q57ma70w8h2Owvb1BiWvNBpMRuGDV9++SUhRILzzFmeqY+fP7MZBjabEe+jZqIblmUR6KkiI5kNTtgGGIiOdj5TkQNz0/aUUnl5OmJ1Qbbb7/AhSPD7MjNut3RdR86FWrIEXzilM5bCNF0ZhlGWWZIywzJPOOfoY69mWDBdr/T9SNd3ot6eM97JjbkZBvHCd0byrbuIq/DThx9JS+bNw6N0+ap8dcGTloUuRPbbHamJWjEODme9HCpNqL0OKXwRh8ezsGCN5eH+ga6LgmMax3a7xTnLMs3UXOi6QWEJOF4uXKcr+/t7NruRz58+8fGHj7jYs93vGGJPcYG0FGLsJSehE8w51crYdbIcDdKtWQ/RduIxTyMET1WBU4jxZsj429/9lkrler0qzznT9wOd+r/AqgQVqwVyodVK7Dpcka42dp2oYg3qbeUxRrN+KbRiCX7k17//Rz7+OPLxx3+hMGHrBWtmIMrfkcdInUpVyKR5DaVVUi0EK9YnrDi1a2rHsOCap9WMC0Gmilt2sDyEoFbiVoq9s020DVZUujXPGDfIZErBaaiS0aNE3NMDkLitK418TwCjDBg5TasegkI7bU3S2AhR9gAIpGHXZqhqcUGU0LlI7ohY0jhaXWjWU7M0Q7I85LaQdhZ2O/j6q0feffmeYXA31hZVpmJnPM0sUgA0c6GtNOW1AwZaFXv+18lFoChrDbUIrVSIqWv5kJS56XohpUROQte1dCKGk9IpPbUR3YvRQooxN23M2iawtkdWmqmG5H/3YUNJVRf1GW+j2Fo7h++kCGWltFvrcbrnS7VRcxIGX614F2lGF+RW9B/NqrYCndKa+A0IQmJvC2p0ly4iPyRbZt1dtJ/PjRZWWxJeNUdO4bQ1rU+XJzScTCc3mKrni6//A6beSWPTDN//8DdO/YZxN3I+Hcm5sN8fMEFC2na7PX/3m9+RcpJWpMJ1nvAx8M1X3yI256L1WmHCeVmgVYZxpMyJ/XYrTLAlcbqeSSmx2+2x1vLlV1/Rx47T9UzOlc3Y83B/p02D4eXlmXGzEeJEyvzw/D2+KuRhgZfzmaHvsNbKwjcvBB8Yuw21irldbUWWYkYgiuAd1UeBQVQ0Zq1AGrfKe1ucNZblyvHlyMPjIzF2GnRTVfiETBTOqIBOdhDO9QRj5UaKnk0Yb7uATOH+8Y3QXEHjIpWWm5PUvCjvyRsJOylFoJS8JEyVwKVSRFRirWfOM/O8cP/wQGmZUirH84XL+cSX33xBNIEwSjKX73ryPHGaroL1HXY3Ku7L8wt/++FHLvPC6XziD3/4O2IIvHn7BoMVG14vDqvzMmGcw9kVl1UqYYUWxMHxWhLBKV3TWqrkz2r2rqHre0quHA5WbaMFLmpY6cSMHDjFW8GQVe0dosP7wPPnJ67XiceHO3BidbHkIgUpJ4ppeBt4+/63dP2Wv/3tnygzVCt25FWXn9JprQ+jxSjLSezgG6WuiYdgasWpa25xjWazUGPnWfj8bqXers2a/R+Wo7VWjBdFNjRc6BTake6sIl47quaT2FX92pXDj09U24nB4ApFVMF8TctSLOSmotSFtrSb4Z8zSnkuQsstmschsENgldpVvb8rV9IsKEgW2Juug3eP8OXXX3J/f48PlmA6gjevBABd+PMz2Ko1capdhXGixFdM34KjKnVVp6K27g2lwMrUJVY1uVSW68Q0X3UvIY2UFEpHaTITmGbAqj6GJhh8kymimoojYMxqzte0EM0YA9EFsnWcps9QCpuxx/oOZxrWBpyyrGhCx5Tmy0GAYAMpe5aUydNV2X4AYkkhojtJ/TNW4CCx69cdi2k0NUlsTSnMWZqHorsIyTIWo0JxHF71ELKTaFaICeLttAKIr79WSndtjVQq79//Ow67X1GM2ARZu+Nwd8/5dOLy05Wh79gd9gLblcq7d+8oNI4vRz4+f6Iftux2e+Zlxhjxt6tNiSPekuaFGCLBO7LatKdaWJbMxnmMM2w3W9U7yM7vehUihXMe7+T9pZSJMXB6OdIp/TXnhcfHB/Jhhzcr9IOwRk7TTDBWunQsNnrZ2GcEF2+BrJ1BqrMsF73VzsZQWsMFOUCPn585nc/cPdyzGXeioswQQtBRWJgUpVSxRTDyZ2jXaJvBRVnCVifYcwyBp89HnJcQj9Yq5/OFsNtjgpfORbuapRiC95wvZ5bLjA+BcRzwum/52+kTXQhsu47T6cJ2M5Jr5sNPH3j69Jk//Ls/QlnZQNKtlVSZXZKQjiyv/bLM2tVDnhd8DHjj2G/2WPcDY98TfVDqsCi0c0qcjif2dwe8D2yDXJ9S0u2mK1ngoP1mK4lqmjlQFV/MOYmjbpOHUg1D6Yee6Xyh1kYIUaX2Itbz1rJkSduqOTEMHbUW0jKz3W/wQeJk0SITghAO1q8JRh6QbvvIF18Hnj9/x/npe2w7I6E0ehhVKQ4Y7f+r7BVyq3gDSRe+Ailk3Q+8smuk2aiixbCVVoTNZK3w1KUByaK8bZIAtyKc6GK2OovN0IrACKZKvsmSZeKKvifGiLEeT5ZDTndSBXA13ezNpTsX2msxUFS4W2oVlXGDWj25itdRawu1itmgKZIrXNQCIRWwDg4HePP2gfuHO/Z3A30Xoc1y6DqnRUZezdop3/INrNCMVwmXtGcyyZQmXXcIo7B1lExwcxtqSGeN3F8lCYEkJ/H1WLObMXpIrvsAJKO5rjkYK9ykzCAxuKuvQr6m7Jsiz6ONATvDck38+OORX/26Y9s7OXhV7Q2IMZ2+TuEze3LNQpbxET8Ixp5zledC76/a2g2qyrWqBbbAYUYFfw1hH7VSqOvKTD+/tsJ16hArJn+6lTKa3a0sHadFsjRZXtimQVlqsjhs3/Pm/W9YlizXKUoDfLff07QQ3N0deHh4I9ByEy0FVZhM+3EvP7cWDvs7TK0sJd8Oe289NmqT1Azn0xOTDez2B5nAgFxE0CqKc2ELbjYbsZKvlVQSXewYhoHz8YXrMrHZ7QjOc76cAMna8RgZH6d5omGY55nsHCEEcoOQ1/jEBkU6FbEJyHqRVaDRmlpIQKuNH77/gel6pgCb6wjDSFkkLGO3P8gjnhK0SogdYJjmKzEKq6aVSnOWsiTsRmCqUiov52e+//FH9psth90OY0UsNFPxJXMtlegd3nkRshlkHEMOPIO4XjproTQSmes80drqqWTph4Gvvt3irSeHgi+eh/t70m4rOd3Wkm0kk6E0fBc5BE8uhXEcSSUTY+Tw+MBvf/2b132OFSM+X6Uoj7stwXfUUilWKYTGU2pW6EImZB8iJheWOmFomvDWGIdR6W9KDV4dWIE49rRSWJaFru+kK2sKw1ExXSAbbmIvYxohdITQ3ZaVxsiNKweqFO9UFkxtLDkzbh/Z7e75mx94+fBnaCdol3UtQW0O05zi3nLAtmopDow+9DgPJmBJap/dWI0YS00058UWpCmOXqvuuqpOq073AVb7uxWJNgpjGEyxOFMwine3VjRpLtPsyI2ZRZMdC6JDyWsuiCp15X1ZWZ7mypIztIptC61aalmVvMICzBVVclfNK4AuwFffGB4fH9gf9nSdw/pI9AYx2+uwXui+WX2FzOo5pAmDa2NnVYQovyfNQ64FauN0fKYfELwadSZtqgk2Tps8SZ9McxYDztrIJckOxahxpma1Ow2yMm1d7coCX3gfP9tnGDUt1GU9ukBvVXcqHnw3ktuRaZkZiiy914heWbbDkiXMy5ZKVhTCWmHPGZD34j22FCpVXY/ldZXaxMq8Ftl9qC0HxaippCrkdfkrueECaddibmJHEJPMFU6uCNvIIjvXleyBPj+1CRQW/B3b7S+4XhvengndSK2B2hZi1/F4d8/hsGe32bGkRWj5wyivqzSCj5ioQseUWeosQkAU9DKr5YjkwVglB7ycjqLnCh3NOmx0Yjx/vdIwhL5jul5Y0kLXdXRRzoU+ROZ+4N12R9f1tzPlp+cfmHYHvNEC8f2PP7DZbtluN7i2KguLPJBWUtZKzmyGgdwyc1pE24Byx3O+3TCtNu4Oe3i4I/ooCXEqDrNqACb4sMHFXqI8i0T85bSQjdVpo2lnKqdlDJ7zMdF3HaEP6qme2e12yoARa/C2dta2EVzg3Zu3shCl0YVA7z3LvPD27VuaaeS0EPZb/TmVw92BPnSUUuhcFAFSg5wL41YiCFNK9DGSXBVjOe/Z9Z0uuIR9FW1gWiaWknjz5gEXAqE6dXaEzot3P8ZgrMAfzVahyLZEM5LnkddQmyRLUV8rXq1Las14hO2SlJl2Oh45HPZUY0hZvFqac9Qli6pSw9hlOrK0FgTnb/Ia1mtfShWCfhUb9S5I7nFplW3X6cRgePvwLWM38vGnv3E9/zPOzWAytURsG4SJYaVDs2qPIkmGoo5tVpTP8hEJE8cZ6f5eXVhXvx4JyKxVmTmsHatoG0wzr2tYZUNZb2+u3ILx74md9I24KktmGngNrDdZm2OntUiCj1ouoFPLkgo1S2dfaGr0CKkmyJAqt9jb6GB/D+/fPLA/9Nzf3eF8IdcJ5wPRecGsbeTVPVbLXSsqwtMFvu4VaAghpKKw0drtS2HvNztpHIxydoxRO3M54VNK1JrFVbQkHY3kNYgth9p9S4ngpn2xYkdBE/zeaid+223czOGEnWXXotQ0xY/C4bDnj3/oyelA4L1KAAEAAElEQVRKyYsqwmU0a3oQtyLU5uxWtX4VUoHuArD1JmS8QZEKp+WmU+VNyOkQDeEKv2k90xcqFFj5PqVm7UdeGWBtNXg06vZsV6ZYYzUbbC1ByeTa8/jwNdDz9HTkcPeATYWUE10MOGuwIRCNp5Yk+esUTJFz6zyf2ZgtlEaeZ3AOZ4XCLzCuZSUdoFu1agwP94+M44aUEpfLhXEUoO/D8ZmX5ydaLuzvDwzjVhpoG3DO3tYI20G891bSyn674+OHD5zPZ3ypst1/8+6dyMPTgvNBy3IRipkNpLRIIRg6RCshSVwpZVqVTN1aG30/YoPFZ6HLdv2W0+mZZmTZXEvGNFkUdf2A1dHLB88wjCxLkkLSkLwE5zlfr3S6K3l8uGfoIj7IxFERGMpZCROyaq1Rahb6qIE5ZS6XI28f3nDYH4jOc7EX2VUEz6dPH1gXAK01scZt2n0hFy7nhPdWfKeMpxhJtAvNEPwoSXutkVoj5QVXFppp3N3v+fjTRxlJTSNTyUUYXaVWoomKSTbmPGmUZCP6jlQWvUmrhAVhZNmZGpMx7DdbTDFMNTF0PWaZicEzjiMWYWC1KkFHpVbJzS4rvi5dJsaogDKy+ho1MVaSwtVkinStYoLF1ib89yrYaAWa94y7t4Rxz4e/WI4vf6O2F6wpFBKmeVEAtzVnwOuiVxaoNatxoTVkp26drAIzxPitNbCO4iSMR/DfAKv/EwiP3oiwqVWw2QldVh/09VCjNbxCUyYbEpMUx9xhnEzWaLe+VMHkLZYyL/J6m0IZCPSSk6OQJPlPi1FwsL2HN4/3PDzs2G0sofM474BFQqPY4VzEGEnAk0N9PckNq6q3rrOAUehH+f3qB6yHhkyf1shriT7q4ZzFMgRDqY2aRYeT8pUQerV1kaUrbZ0YlParFgqSQGdlz3OT6Okv+/q/pcMX1XWtBtsKxnmxN0G1Gs4SjcW7nhQCP7cMX0/81sQLLlfJQa+rHbgWKoFmrMYuo42H6CjWIlNr1d2oketjkWwHKlRzW8Y3LRC0SimGtpIB1qKHTGkYp1G3OqkafcdtNQUszNkQ4yO7zZeE4Q3DsCMjaW+mNZZsJI8G2Y/UUrBO9FkyRcKm3wpyMy8sNRGMIWUxNa2mQcnM84INns5GvXRVp16HCZa5ziKEs56XpydMgzD0xG6UOAgrgWVrBol+jPIa0wLG0Pcjdw+PfP70USiwwQdyWrimRQVtTaJGj0f6vseVLPnAXsLa145EVjcVrCWqPNw4XUrWyvHpKAexMTi/HkJyC5YlU0NjWiZSWvBBYk5XOMt6Wd5hDMG+3pYuRi4/fWDYSXKSsdIVrZ70xlhilNHYWnGFfPr8CWg4p7bdTSadECNd3/GLr75mmieu1wun05lpmkg5UbLAEtO6J9CZ1hhYaiYWQYStXam7FlNEkHQ8nTi9nPjqy6/Y7feClVYJPHHO4aq/yfzRcbYsieuyEPtOrptyrksVIWDnItkkfAz0QVPEbIFJpoU5JYJ3bDcb/TseOzrFI8GrcVt28gBUqiiMV11AE7jHW8vL5SKsLhdwzjBdZ+r5SghRDypVQhSBDS+zuAk/vv8dLuz48PlP1PSEMQXLgmlBBE/I8k3cb0GWyEVUxdXgsVSHjvwF4yy39q+IvTwNjFWLiZYQ9581Ca2qpYL+tfaKowvOLIdqBTyG1BIlizdSouFXSqhZMw5EQGdboVZPWmYamSynETXDItIOug4OO3h8HHjz8CX7w0gzV3woWJMlydB4MB5nI16fiXXyXe2txRqhQbMKZ0jlkSnKkJrkNcuCVqaLFZo01hBClPdqDDVZcjHiXFvENSGlRRa6Zrppo9biYwygqXIrjt3WQs16PdcDVPtZIzsO52QHYdYPwLzafa9abHGGNqqX4hbfW/WQN1aX8GalmEpToHJN0U+sr0X+Iimrxkvff2uoDYnAXM01bDHaXNhX+5fbUkLtU5oq0nXv19A3V5tSa3Vi1eOo6dRqG6RsMWbDt7/8B7r+DQWnRavgQhDBqPoxyQ5G4N/j+cyHn37il7/8tb4eDWmyls4J67MYZV9NiXO64l3At0Cz6mhcwRthcjkrNHfjLTH2/OqXv8KotqXWQs6Z4IWIIEiCiGxrLqJjsjLV5ZTY7Taifbucrmy2o9j9IgzyZZ7oushmt4NSmCehuNaSeXl+wQbP0MlhEbxEmdbS5IA3kEthM44M/QC1YX1kyvMNCgixl6zWJVFLoe9H8S+ywqNelpndfk+larcr239rLDktjJuR7bBh9ZUJQSyRU1oIXuy3xUpD7KKHcZSFEo2WEzVETYKSjjiGwMP+kZoOalooPv2X84Xnl2ec88zXK6frGazsDC7TlXmeGAdhfpErxgs1dWiVz09PzMuCC44R0T3kJXOZL5zPF/qhZz/umVJiHAZqXaiI/cbQiSeUYKHCjGim4oJjZ3c0shwQxgr0N09sh4GH/YFUiu6XwHhHOp2xunxepzRvhf2SahNKaghQKnMSm3dTKyFEfPCUZaGu3lSxk8OlZEqTBWdNoiodYsd8nZjmSr99w1fdhs+f/8r55UcwC80srEmExjhoTpbpuhwU7N9Ss8WULG6XKvLLRuAulaoRVmFeTdrlVQoL1TScqmslG13tVVRjAVa1CUJ5zcgB4NbDu0K1aFd6veEYNQu81WpmWcTqAy+Hg4+w3cDD4453b/bsd5GuQxoSM+OseH0ZAsF1VKrQPu3a1Kz4h1N8qmK9x63TlikY7ZpX1e86Oa0oU2HtoHUKspaaEzUn/vzdD9Scubs7CGxprd5blpIqa5yqkAZ+1vFLtZLvCeoWbF7hpZUmpKe17ETEdsSZqAr/ogvyNUVCCrC5pcCJ64E0e5qVkYSd5Jqw5WqWF7CybWXGadSShWKsTUdVyx6nqjpTX0Vua2SvQHg/O/z1G5dqlJTgbhd1NcoTTdG6a623A3fdPaFMporj/Ve/Y//wFdiBZZ74fHqSfUdt7IZRpqIqTYCz4oVlrSVNC3nJOGc5n0+6GxUhcVmBxlzBWebjzPNyYrvZEd2Vzf5Aa+3GUJ3TwnWZ6M2g+ScGyrojE+KEaU1C1YyT6GJd9B9PJ/b7nUyfGfoQKUPBu04UksaKpN5jiL1EJuacWJbEuBm1kzOMnahaq2mcTleul5PgXF46Nmf0w23IuGyrZCe4IIdpLUzXk6bKRWLXiyusE6vf4+lI33W3ERLg9HLkOk1stxt2uz2bw6vtszBvJOi+ixFrHafTiRiDhLobx912R6MRjWTDOsRGwznL6eVIaZlvv/yaLvYMgzCASmu8eXzkenlD34tZ4fPLC0/nI+fThd244fl4whnDkpN2VoJZGuvY7LZsdhs8ntVrci4TP3z/E5txYDfsRG1thTU2T4a+6+hiLwycZcavedHNcrleiSHQxZ6c1V8qF07HI9fjhbTd0fcDbRE/llLUb2ee2NqNBKH7pvbdaj5mKnWpYBvPpzMUocK5riMiS7RqPOfTkdPlwuPdHfM0YywKiwnjomURZC4lQW0sBaztCN0jM1e8yZhyxZFBISGjjoFlPQSRwiHdvsHp8GYxNx2EGPA1FvF8wJiGbwKLWsSxtOihVI1AY4JlC55cjOQdGJzufKRrEoaINAfNCPOsymiD6Ii4nVDOQtfDuJHisB3vuLs70A8dMTZiXA9M8cQJcYM1DWOCHrr1Z5h21YNf/n/wnopV23SFAYgCJWiRk6plpUtH8j6o5raDaa1RU2JaFoqSOJIRxbQxkGoWyAZEiFblmjYlNrTmoKnxIvZmL22sxLCuB6w1BmPDbUIzRjr1defE7V0hqY9Kfmmtqq5D4Y7SBOrQvUnWDX9t4n7brFyPzGtAUylCS89tPdgr1ojNeNWdUakynTRjqTVjcbK0Xr/JSnEoqzbC3ppYmQ5k+lmbDWkyMhZh2dWWKRpHW5ph2H3Fw7vfkIvB1MLxeOJ4PPL+zVswDmO9+J4tmXOa5JwABt/z29/8HVXfnzhUSB7PXLKGXsnZPAwjT63yp3/9F4lS6Ef+7u9+R86FTT+SW+F4fGG73ZHzQilB9UowzVfmaWYYR0mwNI5puuDsRoxbc2Wz6TFA9FE+dyPmrn4pmXlJjEPP5Xwh2ULsA7VAyoVlmnHBM8aelfssQhq5MbwPsnDU9qauN5Kusiownc84Z3EucJ0Xnp6f2W83tHZmyZKWdbi/o+sHWUpHEeVJESxczmf+83/5r7x795Z//w//IA+E2gA4uWtZU52gscyJRlMrXUiT8IzpBtI0yQc7VPJVvNbHfkOulaBj5JIyx+ORzWbDsBnFcsMY+r7nwTlGfX1pyUKBDOIFn3K60SG98Temk7OOVDK9j7x/907Cf/LC6BzWOXGyrVk46IBxRsbJeis9UgCNWFI3Xf5f56v8/BhUHZ/ItTL0HSmLUGrTD0QvDrMuiL/+8XpiM26xxjLsRlqDoevAikI9WMOcZA/jjEAc0Yr5XWsSa1qotyVXs4b5fMF6RzPClnHes+TGNFUe374hAOfnT6R0xLoF1yrOqqmyWReF5RWXNkInxCKwW1sjaRvGlhvUkfVuW21kVi+lCiQ9+CRfWWCrQkPC6DMNcUttVfKnCxIKTxWOvXTmsi+JAfrRsBlh3ARCrGw3d4zjnqEXexYbRDchVGSPi1YLlOYttHU3UhR2Ktq8e/29DppQOdcEiMZqoyF0S6MYeFN6cZOnWWFgSd+b5yz3Zsn4LhKaNn2tYlfdhF2zP+Qwl+Wr0725lyLaRENgjGc1IEQhinWKMbrTsk7dQ6tOR8YJ6WGFAZv8XGE8yUG/TJMI5wx4HwG5RmLNKF9nalXbcZkqihpMNoUshWEk6Yur96z8uHprzmR7I07KkkBnWcvYLfRK/uatEDWFxBRpul0n1XbLZ1EqpXn67i3D8CV/++HIm/sOZ4TGerff43zHssxYZzkdT+Scud/fM82TNM1BzgCn0KKNURYETZqgeUkseeZ6uvLNV1/z5uEd/o+By/XK5TKR80II/c05t1WxDjfeU4vA5ev0Z50TZEi1FiktXCfxk7PWU9JCaulW3Kd5ZrPd4D/+8CPDMDIMHeNmFBFUrcLjvtuTNr2OpWsdsFznq0wOSLzi8WXm8c1bMe1r8nBbb5iniWVa+G///N9xzvHNt9/w+PDIOMom/XQ6cjmfWeaZEAPjsGWz3bJK5GuF48sTqVZ+/8c/iJJQi4PYO3NjU1nrsNqZ3T/eQ6vM8yTMERuw3km3O8/U2jjs94ybDWt9i2pW2CrYIMpqgOkyYZ1lXmZOp7Pg+rqPiV3PkhNlumKMUIFzzUJhtKJgba2RcuJ8PrHd7cRwMC30vtNCKh3PnBLOy4fjnaeYona/vbxG22FaZZqu4karN3jwgc5Hlpz4fHqiH0cO+x3BFWWSNdKShDpnHXlJBOtZFsnS9d5RdeQX4zfDnIsY46UEwdHHjuDk+gVlqqzsjpIz1FWHIFOkD5J61YeeL774ilIgt8bm4UuW88Dl8pFWknbIRa3oRERXdIKUe83IstGIUEusSCw1S7eu4IgcAsZScYLX+zURoGLLOpEKQ01eu+gbGlWEfSguKycGwYlhbQjQ9w5rGmM/sNt2hEHgzt4jzgBdh7FJ/LhurqGSm2KMZkysLZOR92KtJhfq4jRYqFoobHOkVoX5osr7FXZriCnmytWvRayxS8vkZQFrmM5nyfy2sjyW+0uKgm0V3Gpfve7CmgZacbN6WXcR0DT7vdyaP0k4E4bPrcBoPghtTb3TZDfrMEU8cltbbUN0/2FkylvSBWM9vfC/WZlaTYt0bnLGOGNkB6UNAKsBo+6QDFYN8QQ6Wj211nVWa0iUboPW8u1nAIKk/IzGa3RvabSBsVY+B3fb1RQtEAbY8Pjuj3TdA8/nSfQHZmG72QnkbeQwXr+/c4JjGW8FdjPww/d/4+7hnrEfb0W0ITulGCM//vADp9OR/WHH4fDAm7fvAREcixZKinuuhcPhgVwrsYq9Ua1iwd/Fnr4znK4XrIoK05xxbqaukLMWfdmVSrPWhw5/9+aRPkay4tHeOM7TJJa0TtgBzluicRQrnUAIkVIzT8dnptMVaNzfP0qVNla81PWi+h62fc9fv/uOw/7A4/0Da2LVdiMwyGUW9lJFaYWtqYdQxhnH2zfvZCfhLTmroEQrZVUnrpwype9xRrCB9UGapit9J6IpC+zGkaaGY8u80EWhex4vFzabDeNmpORC10W892JpDCzTzDRNeCuYr3OOsZOlfK2Vy/V0k8r3saM6Qy4L1jqWZRFfFZ2UipPgJavxna0lnDEE66mtYKsRjNIGzVpA+OC6cCtVqJzeyP7CeEdMSd6jsxo56eXhQmi01QYV/FlalCnFOe0cnSMtAiMZY8jLzDzPYqqoHBopAuKblBU3Xn1uchHB0BraIwvDRs6L4s9VLcYNvt/TE5muJ1p9ERzaJYyG8nhltBSHwkjcYIBqGs5BrkYOKtOgZpyRYKGlGCCCHhIlV5zRuE/k9Um3KEmMIJx6qlh0DB30Efb7Du9k1Rq6SLSVzX5gswt0IdJ3PcY2ggfnsuLb6oNlKpZeH3b1B7WyxPVObKa9NbKQJ0AVzy9ZpuebQthYpfIqoUCW6dyW8gI5Sf9bU2W6zhjjOJ1esLan62RCLEZyLPSEV4qvuR1axjvWeNLaVg2AlF9ZJMv06azWlXXBvN47iu1rObpBxIVV84I0VcbIdAYsVXZ+Ta14WkuU4qFZcpmlKJp1mjL6/aQwrM8ATTQO67K7mdeFel3TLNZtvrqnNl53E5I/8Qrx3AaKNbvavWpSBNtfobhGLYu8ntLz5svf8f7tr2m2Z3sQoSbViSi2SvG3QSbJvpPkt1bBI3tByehIHI9HduNOjBAncYrwQdye7x9EVxFsYD6fCUMv6ZAKt+dcCMGTU+F0euZwuL/tboLSq8UdwLDpe7x1MlkpJySXwjydbwFqVGGKGiO+fH7sekIzLDrCnS4nhZgCtIqjkRtkhQKMhbHrWWqCLJztOWU+P33k4eENqSyy4PFO7Jqb45tf/5pJF0s5SWnPZcG5QOgCPZUQRDksKXPS3YJh3O/FNtcVgXRSJsQ1l3ml9SWOxxPBB/EvyUKztSFQSFJ1lwW6gDeWXmmyzmXaJAVhHEf6rsMA3333Hd47vvnmG7lvlI9traUbBplwTi/86a9/wXjPRg35QMKJmpOxOdpANZVh6Hk0jzSV+ltvRQCn2HRrhr4ftOOw5CZLamc8L+cTVPFlMUXwUWctJS9A5ZIWmJt0CqFndb0Eeb2mGqblytPLCxjY3x8wSbrS6D25FZbTlSktoq5ujawivBAi1VbWDJElZ1rKXNJMmia8C5ggOR+2yRVoGWrOlFq4LLMK8RyuwlyKBst46ba7e3KamOazFAibKU7orbYKZFeNTJXoAy7FSm0qjByW2RqselxIZJb6E7UKJUmHrjs3o/486PkhmeOwGeHtm4EuNIa+o5UzPo6Mw5btxtH1huANLliCFvhXuGj1l6o4Myg7ydFMViRDFuNGFePowrwZZXnVwmpBvh50zmpn1wzVFO2YJXo0L6qURvQaQjiQqNjd7q24yIqgQOBPLf5i1aHmf0Y0Mc5YmZ61OFSdtl5/iaCvrDynJvtL9a2AJswxazV7nAJNoz352cDRJMpYWKiyu2pV9hMpSYjRGoG8BkY1vY7rZw8IbVpXEVX5xkbT8WozqjfQug23oihWKUp7rU4niaaT0ypclS6/WYE2+dk1oSE055vPk2fYv+Pd17+meElxa03T/rRwNmNY8izL+WCxRmx3aOg1bJRcePf1F3gXWDSv5+PzJ8ZxJFRP53t2caA5y7/+8z/z+fjMv/+Hf8Sr9mzsB6zzsjLoBuZ55nq90kchQEj0gRB4KmDWSAVjsTaIs3WF48sL/TgKdRrIeeHjxyfSMuOTFoToPFNacBX2uy0+eByG1GSrj7MaxSmwAq0RukBumWgMMYh673o+g2l03UAIQZZnLvDHv/vDLbp0ul6oORNDT0qJ6LwmTKmfjpOxU0z4dPmlLpGgGdGqBKfBn//tL/zth+/4xbe/5Hd/9wfZY1wn9ntRELrg+fzpI7vdjr6TzIbgA8F7McHzKydCHtD3795JYclif94ceOc47LZ4H3k+vvDjjz/x4fNHbAiMmwHvvHCZW2O5XPExkkri+emJ+/s3EnSkvOQlL7IA04kqGCm+3kXFmhvBydcvaYZS6aK8j950XK4nhmGDMUUyklvDNnnwvIkCxTi5UZc601rFBo+3lvNJDmQbpMMoS2LOC52PtFpZatJJqpeDplau80wrwo7IufDxwwfKkrl7eKBb/V9UILgmmuUmgr+GwVZDKkU7vyo4MzKJeN+rn9YiAT25YoxkkM8li5cVkvOhulgaRvk8cgjYqkWhCDGiNUOqTT13GmQoRuCm0EHfGbrgcM4xDB0xWrZjRx8b3mV8MET/hhg9IcpC2vtGCEZYZVZeA1WOauuEmIE6d1qnmRgmCNxkRcFdmtAn10zs9Z4rLSuvX7vYZtRfjBX4R/JcRA1+XWZAMstbWQ86QQhocrCuy+liFj0oBVZbrSnW7n4VwlWN2JXKKYZ5WHezmDZVQn0E82+3BkeCbEWdjlm7dXN7NlvVzYDRHWXVZb0zYK0WAYGImnWaVFdfGWcgeSm87kHk9cvXW4XUGgIDV/1f6xqkKTVW1Pr5tu8RbzNefwYVr+eMaG30e7SfCwYbqWVqtfhwz7B9x/la2PUKYWl3r3MfrRY524y/QTjGwpRmaipY7+i7nlTEhDKnBWM8+8Oe4KN8P9so1jFPE+f5yjBucE6Kf4wdz8cTP/30I5+fPvOP/+EfxbW5VnKrhFZZqqTdnU4vpLxwf/egz11gnsVHb7vb8vj27bqawTnH89ORoe8Zxx6fa+W6zORc6KLIwX1weGUCgSiNReDVKEviPBV88Gy3O3bbPc47tautDONG8qwV+1yFHqY2Um1EFyWjIXYYJ1a2QxwwViCdRiPagVZhyTMhyMI25UQIQTQGwQp+3GBZ5OJ+84tv2e53nE8vdMMgi0RtGafrlU+fnzDOsttupPM0aAyo4XQ64WNg8EJL80GzL4CXlyMxBunKnYgKrbUc7vb8JvzmtkRstWGCZTmfZRJojcv5yH/6z/+JP/zx79nu9uzGHcv1SjAO1wUqhpYWjucj93dvyEjYiEBcYgG8G3ecpzPTPDFacZwNMbIsky4VLbELeONZ0sxsZpxz+CZdYmnSPXQlM00L3luF6pTxYuVaZisH1enlTOw7TBGanBzgsnuY55l0najXhO09wVtaqSzXhXm+4EOgWDk8c0pyYOoDWEF0Dk0evr7rRFQoSyDJcggDtMScLrQsE2DACP23IctWI8KjJu2xLpll0qnIErUViZHNNYuBoEMmgQC7bWC77bCmEpxh6IIk+kVHtGJZHwPiXRYswamjTxHacWfFGsSYJp5P3osXWBBK9Y2rZOXec048rCQOayXxriCK7N1KNVgvjJlcGssi+c9C/5aDeikSd7nMF67Xs5YXIwFUNzM9OUEtjWQyrTlRkGhz15pQiVeRnHTh6CtWaEc/v6KUUwzkmpQFpHhRsdQ2Y0yUTtuKEK81dBcgRVv2fQKXZiqpNJo1SsCQn5tLIdpOvNvc6s/1qpoXvYIWpyJNR2sNiryXjKjdRZsl+wu7khduTCZtAFu40fxlDpPCY5oKRDUtE7NOR6sDrP59nUJ92LG9/4bjc8b4I3HcYxp448gV8jzLpsw7XIOXy4laKm8eHpmXWTRn0WMRHVc1Ej0aQsRgGAfZh6Y8MZdKtJbYd/zx7/+e4DUATncOP/30I3/723cALKUwhsBcZXfph1E+w1q53x84Xa/M86xwoyXGjq6bxJ5cG/qmHcd33/+NPvb89te/wXd9x49//Ru5JN5/8SXRCZc3mcrqB9MM0lU3CTI33im/3uG8YGGlFKwF7z1uu5WqXkVI4lvgeHrm3/7p3/jjH/6eoR9F1DPP7Dc7jLPUKtv04L14QTkEXmnCbvBeAonsDU4RfNwFxx//4R8IwfPp40cu14nd/kDnoyaFNeZ5ll1CFU/6Tz994Mfv/sYf//jv6MKGw/09XexlyTxnak6kKl0rtWBNL15VOWGcZdxsBAf0kdP1wvF4JNeKU8/7bex4vl4wxvG73/+BYRhwWJZ5Itcsr2XVAJSCs57PTx/AOu4OB4INMtYb0R+0BufpwpwX+tjLlEGmM7KjsU1TBYzYBjtXoROGTmsSTm+8x8f6KuAD0rLgnaMLkdaKYJM5M5qeuQhkJMpsy+nlyvV8whnHZr8TaKCJxXlqFRuiHNZVrDaqYrm0JmZry8y8JLFyMYa6LExKnwzO4YwjU/G2o3eRVBM1z+SSVah4xrdKK2J5XZR7T5Wpoi1J4UqBu4KDobd0nUwL202Hc0f6PmBt1rAqS7QOGwzRy+HlHXT9iHEV79TIsomLKU0MLL1qHPrQieml0UO2QXOrQ6r0pzcIyeprK7JsN7p4zU1KhgW9ZhlvPIVViSvHd06yzE438ePaNSMFa82QkNlGKLM3N9Z1d7DuO3TPoYeoWX/PyGdTmkyDt31SEUoqeN0PSTftnEr3FfOuN+dFI/bpTTUGzlA106I1jbRthWaaJDP2PaiWuxplzDVuLKbGK6mgtfz6Xhs3mDeVqhEEa9io2OHXJtbvzjhsa0oBDkiYRdNdkARR2XXBbtZFtlyjqs+LfFY9b97+jm7zBZgL42bP5XSi6zqcF1jHWff6GRURqJVcEDJTxLtALiKILKj3nZdIYufFpXpJC89PLyzLxBdfvpfm2Aam6UptQjTBQd93HO7u+fKL9+w3G9GLXU54HwkhEtdOwDk2m5ElJdnjtMbYdfTde1prr8XLRXwX+e0vf8XxcmVaZnyplYc3jwQfZNJU6pcsIeXieCf5vtZIwpfcig5jnWK/r3oFa8UBNqsVxm63pxlhgnjvOV0vdJ2EKFi1hWi1kdLMdrvT418dYHXf5tXFsNYipl7GEHXhHEKUQ+x0ZJkn7h/eKqOh0UrmMk3UnME5klJKHx4fyHPCa0qeZR23IxipyJtxECjDi90zxjAtC5vNBt8Fur4jlUI5nSi1KtNGYDesJTrPEuHtsKWLkdpkkSsRowGrBcJYobX+65//zDdffn2jwq0CotQKzhq2g9ijr4C6s47j+cjT8wuH+wND19GsIfrA9TpJOpcxHI8nzucT0+VMqpnoAg/39/RDJ51/zkzTFeeCLN5rY1r0kMBxmSaJTnWGYbtVGqcEFqVWZfJyXjjd2hgYg1g5FIEo1kjM2EVaKaS8kFO5YcrFOlmaKy/fWItxlmA71TVUWo6kchWc/2beJrBNLUlYPxliB9udZTN2bDcbYmwE3+iCw7g9xspritbhvGO+PBPqhmIicYgEb7FejP5ylTS7PohDa6liE2JdRLZ0Bduk+7wRv2vB+NW91d+sS0rKGr6kWSFrTnp53ZfUKlh3qom8zKQkxpRYR8tyCDvr8E5YTQ6jjCRdQuvytiqeLwuAcjvw5JBdmywLrt1WWLL30YWy3s2SAd2oeZLdECuXjJvLqzGrz5ShUZSSKzkaQuqQiT8XZfopAuBwOBcJncE5rwyzRjHqqFrXycTeXmNbw6L09a20z6qTpFh8N5niqr1ZbOgCglylsbDrXqBajFk/Ob0qKw3dGFpJt3uyNUuqgTePv+Rw+BbrRnbfvuM8XTldzgybDbk1iTSwlrwsLCWJVZAxbIZR91eGksqtUQvWMi0L12litxeY0FrH5enC5XLifLlgjOXtu3cUK9OsN5YYIq0Z3r//irv7B2LwHI9HttutEhEan5+fGMcN3jvKSkxyjilnPWdlvs2t0cWO0/lESleMMbgQ2Q5CwvHPn5/ZbAZ6Z3l6fqYbevogYyRJunXjvS77ze3GkqFZDkfnXoVvEmuaqVWCddYVunOe3/zm97dpY5X9v8YtuluxabXdgtwtVj1OpPhISK6kBxj9PrXKctj7t0TfK/W06nRjOU5yaEZnKcvCsN2wGTb4GFlKlo5Lza4M4K0VqqoxGsYjHOdSC7YTy5H1wH759Intfi/pflVMzHJaqKVyGLYsRW0FnNolbFeXS1G/2i6yqVt+9+vfMG42wiRS5tHp+kJ0UQUx4oXTnIUKU55pxnJ3f7gdMjSh20mXBtTKy9MzH378EeMdwzhIBKazXNUaWiylI9N0pZXKMPZynZsUy5YryecbRjqdzzw/v9CPA6F5lpJUYFSkWBqYl8z1MlHzQs4wxEDXeTCGtFJZrWDwzlg0RIsVBDZVikRl7bI9Ju4JbQOtyHXIEylNtOWId3C/C8Te0AdD3wuN1fkLfdfhg9A4UeJEK5XSOWyp4HtC5+iGKHGwnR60ii8H38kuzFocARcs3lqsEztmGkofVtgCq8VLXEH1oaC2SiCKkhehKzYauVRaSbRFDuhaDWmZbrYQTgeACupEa2+d7Wp1cbPHAazxr7YRdlUorxqCV28rh0wxeiTqpV8BMf1urenkhuZ1vEI3WiqkEbjtReSJzU3wqtIyxq7sGoWOdAfSWiOGiPVOss+V2vvzgltZF87otWz6nuV6Ytadh3stgqZqlkeTqQOx+0mKbwVrb4WuqYofs15BZQwV+RkrUQICuRjuH7/h21/9A8ZsqavHWuw4aJZOsAjLr1ROk0A7d7udNDVePr9WGz99/sBuu8WYxny68nw88vHTR969e8+3335LA8Zx4Hq93na7rWW8D6rUXs9OOJ9fWOaE3R94evqMtY7NMPLpdOUyXdhsttK050zX9Xhr2fQDx4uEEY3Dhq4TUWTXDVQt5tYahmEUrY1pErqDLoq9tXx+epaOJTjmaQZv2W42N7XiDSXU5Vcpa7ciH74PYkNQVdGIjuq1CO10t99pQyyW47KkMmL+Z6QLq6kSho4lZWFhOHPbe+SqKtpbk1Al+jB0TMtMTpntOOCcp6VEDJGHwx19H3k+nRiHgVRmWZp7KWTeBa6nMx8/f6bWyrgdJe+iypO6TFdi8Dc5fSkF7x1v37y9WWFcLxdqLVymiRiDGAtez/RdxzRlyZ6+zoQ+6tTVJNuXTBcHWXCxakSKiqgMqSTm6xXjA9t+JCNsohClGz0dr4y9fobBMzhPzYK6Hh7uuC5XBtdxuN/jg0CFZF3xGRHdBeeZa9KbROBFKkLVLE1/Xw62cSf6kst0kcnTScdsmzwP8+XC+XQk2gjWMaUF4yH6ICwa71B5l+YINFquN4vyvu+waBA8QFNOutHOr8rn3cWA2+wJrjBsGn1odH4RfjoBF63c09ptp7aoKlughdwSfRcJ/ShKau8p6Sqwpvf0IdANgaZJfn7NK7HrwVpuxAqzQng1Q17Df9YDVa7xdTnjZA1PybNAAy3rQtjT9Nqjh62xq1WH5BcLyl9vS2fp9hXWQWCddeHKWhjWhk5xetE7CQffFScTtLXCsDIWh2QNNC0guRk5aBGWjFFPJZXFybPalDnUCq2IfkdsPMCUjHNBYONbcTOgzYKparutB6iEmgmcZNrqZ3UD1tT7SXcFbV1YK6NJr/Vt4jBeIU+5kYwSHlYB7usvKZLOyNmWdVqXzxVy89wd3vHNL/8B4/ekJOQK+R6W0/WKt5643UGDOSW6GMlpoVmDj56s97fzju1mZIgjx8uJp+cX5nmSIl2L2sg0moV3799rvsyah+H06yrNWt2PdGy2O5z1fPPNtyJCdpbHx0fu60GbZVhKpm/Is5pmXp6fOR6PPDzc8e7dlwqry5/fKNG1yn7s8eFBJO6IeV5plu12x8cPP7Hb78kl0YdR9nCoEZzS4gxQS1ZhkOF6ucg45ANNFbnOW9JcSHlWQzNhz4niTw7qruvwXv1sWD1fCrWIUVkzTbAxHdHXf1uFxnKRjsyYRloW5fgKg8HGwMOdhH37EHnse2qtYlzoLKkUrstELplPnz7d9AOnlzO7w56cEp2zjLsdQxN4o6R8k7sbL0yQdL2SlklyBib50KlNIl7V6vvD50+cj0d+8dXX0o1WeY19t5HkN8U/VzFZ3/VyMLbGy3xkFwbpskqV4KJFJqaWE0uRg8U5Q86ZeZnwzhOs5e3DI8YJ/llzwlQpPLlk0VNUyFU6trUvlV/tpsw0qgexxhGcTC4x9KRlBi12K3w0bDaiIs+VzovFRDW6YL4dbg3rZBdijCwTrQu3G1UWsHr4tvVcqVhmOnclMDP0hhAtQ/Q4l7G2EP2IbVqAjVib5zKJR34RxXjoIiVfiXFgCAPBRiyVl+MTMcC43RG9x/sOSrvRUS2e1ZjQNkPOVayejWRtl2yYpyvbsWdOM8uSyeUqHbbaWhhrZaLE0NIsh77uLcS0b+XlywKxqdCrGZlcDWI7oRQrVh8lp910vemDC9UUbdCsapj0UAeZyJw0QbKLVtuNKnsfgXgk1rfSWO2pW1swaDpbkZ5cmEeZkiSPYo0BNdaQQSEsFb8Z6dmNCbKk1mKSdcpoWrCaLvWluKz7FCkCFtF0iHi83SinBUnqa82KXkV3da0ZvE5gBtEmVRVjrnYkFi1IxtLaGvxlyRn6zYEvfvUfCOEgGqFa5OsU2tv0o5x5pbHkhc8fP3I43LPd7vFWRKifP31gmq6M/YZvf/FLjDHszIHnT8+klPnNL3/NuNvqHkatMYpmsmsSoDxfqmzXQ1zuRdmFWHV3LUVQipLELsdaiSWY00ylcrlcGceRcTMSQ4QbtGdoOeOCkIuoSIDa56dnoa8qdOODIzpPHDeEEDjs9wTnWUrBr9XYigAl58r5fKLvhQKKUjp/tlKTZV9d7Raq4NJNllN919N1UT7gkplTJriA9063+AVnLZfrmevlym5/YByHG/S0sg9CkMOl1sbY91jvabrraA2s98LUmhfCZvwfDuLj6UgumesyM242PBwO5EWyHOZJMrhTSgxDT8mZl+ORWirBe+ZpElGLgX4z0m1Gnj4/4Vumj57z+cLj4yPevzrcbjYbSZPLks9hnd68TrMTWLvEphnFlWkVL3nH6mBKrqJHaI0wdLRcWeoibBdEZ1Bb4poyZcl0fcf5fMZ6yYu4nGUcnlNiN24kMa0K5TTlwjRNgmEqnXI1M1tKEYPAJsEkhYrR5DGQRXarld0w8nI6k0uh6yPRieVEU0+iprnltYnwynpD7z3NWLIuKV2pYCrOGDxnWjvRd5W7jcd7QxesMs8alqj/yHKztCyHwXIlq2tqBrxpjHEkbB7ovVjXL8uVvnN0QaYPbz3W9NAsaZm0wZA9RWuyS0rNMl9nvB9ZcuZynTg9n3DG8zRkSjkzpZ/ou55h2GBtoOs3gFCJb5naRmI39YOXQ0+dUG9GekCrGfuzdDWD2oU30S1UUH2B0oRvAUXKKGqNqhYrthVyBePkgG0gLrfKCKo6qa/+rdIulNsS19gs+QxNMyaKQKRF1ezWCoU3FXDGU0zC2CD5EhpGJJkdPysQrOwsha+shP8Y417dFVa6bDNgg8qpdRIzhbWfWMubMet1WJsvbr/q7bUIRCjBU7qo1vOr5kjo93z5i98zdg8sWeBUF4Io3avQmEsr0rg1hzee+zdv8FbcsI2BzgV2hx0pLXz8/Im7+wc2my0heB7ePnJ4vOduv+d0OdFwmhMjBdg6y/V6wbjA2PcqE5D39PT5M3/5y1/4/R9+T4yR6TLThoHj8YntbseyZKarPMdv3rzBWse8TKKwjpGh78mlMmcJf7PGcy0F7xH4LES597//8BN/+M3fiRpSm5BaC7thw7xMDENkDTxZ5iISfmWoWGPpugGrwTjB+xVcvt2gtVZC8FQnys7VFdEapBprB1GWTFpmsknc39+pla08IOO4kcW3UvlKzpzPZ4ZhoOs7wdCc1wfC4QyULPbCFOHYWyMq6efnZ2IMbPqBVgrb7QhYNuNGMr1Dh/citgtrNoXuD+YlSZZxzoqlCzX29PLMeZ7oQmSeZ8au53B/zzBuXnF2BDnwqmS0zoGzpLQwnc5stlvZZ+TEkjJdjEAjzVeOzyfRNaTM0mbJS7ZWFrxVjPjkhlWeebXgxKo4ukDtpLh8/PCB2HXcHQ70XSAGT305MSV5YDGVkiTWUKZDMe0zILnOrSl7RrDiJSfZX5hC7DqxEymLqte3HLYbSq10IerBLw+laWIXLS2HoyxJokODUHNNC1gz49wFby4MPXRdZnCGrndEJw+2d06OFmtxTUSyBpgW6dBNq2QSsdsQXKTkiRB6TAha/ADf6H2HDRZrPd6ui1hHyXC9LORsMDVjgmcpCxRDLZ75nDmfvuPpLOZpOc94ByEY7u8PxC7Qd2+kETLSqYmCV5YwraljKXogCrC/OojoZyCTgOxxBPJptt5UwAJJqT+SqtZFyKV6BO2U1+S1tcD4NQa2iahPNByacGhWKFmNs5sojFdmnM2N5uTAKK0J6UCbl9oyt55w3YioHqOxitu47SVKE9Fj06LX2qp9kZ1H1WW0vptb+6ljr1y91oTF9LNfZi2krLNxu51N1RhsFVi3KeKw6hvEkyzTSke1W7766t9h7Ibnp2eGYZQ8GIxmasvuNBjHdZ4x1jCEkWCFUHM6HUXTorvW/eFwa/zO1zPTRXYOu2FDmhPTdaGUzOH+wPUygRFU4+X5KPY7Icr+Vwvqw8M9MUjDFoOwpkqt9L00JTFaQvBczhPzIhbjq//b+fMR9/hWzBWtw2q++G4csFiCdQQnKIl/d/8GHyJ5mZU9IRUyt3o7742R7nMujc47plwobSGGQIyeWrSbUSzvdRmmH0QDU7UzRlxPhYZXmeeZEDuatcTQSdExwrM2mkplrRV+v+ZDYCSrNajc/ebyqRS43Cw1LwQnnSkIiiqsPMPT0yfeHO7wURb0nz5/Zr92+DQ67wlOPN9xhmgDKWectQzbDefzmZIrPrz6QaVlpguRN28e5bBfkjAKnKMpx/7Dpw9YDF98/aUsuKrwklMWkZr38t/n04mrFd8WWiOOA846TscXcqmkPDMMI10I6gEvD8GSE8wiPPIh3GwJJOu38PjmDa01pmnGqEDQ6PIPY6ipkMrCmh5YikBrLnjmumCbFNucE1gRBpnCLU4Va1UgFAXy6SKuCCYquKocwAWNskRgkGaNWGj4ijMzff/C0Bk6NzN0maF3dHpX+bXZqIs2IZnaLN4Izt0MdNHh3UipjXGzF+aedVjzIDkVNROsw7hGwOOik3hWGlW7z7QkaHA8JngxpKVynl6YLhnTPMfrhKWwXC+Y2IjBECLsNo67h3fsdxt8FH9/eV3mZj1tzc8Uvmvfa1eWjky+suNINBzOSvN1E4ZhwGmH3RpGbUWagbqK5qphjRHFgFVrCrFcX9XSorxeF8q1Wo1MfQUcC2IaKeeyCOdwQXcCUg2WJG60Rrv1qrwZozs1UGKL3iPSiFaqkelm3Ss2YzFVJlfRQ1RuFt/G3pTP64RlGhRlcFWF8lZTQrSorEXI8boj0gwjKk0twhF4C0OuhlI83o7sH74hNcnljlYoymXJnKcrwzBqXkchdhKL+/nDJ+pDYztuAJELnI8nhn7AOEPXd3zxxZf03cDL6SyWF1SuSQrJZjfy/Q8/0k89n56eSEuilsTbt+8YlPkphV6fhRB48+4L0TAtieNRYg3u7+4wxjLlRPCBh4eBlDLzMmuzLA3v5Xphv9trXreYZaYsDEgXg8QrWIPf7TeUZZKDTBdML8cz+/0O43pMKzfhSfROuk4ras6Xl2daLgy73frpSXHQpfK6gW+t4aLj9PRMrY3D4YAa1tP1g8BcxtOCpKnlWsUi18pHfTmf6fueqLYZN2YUMp5flivReQn3cJ5WMsHJ4tNZc7PpaM4TnMMOG7ktSsGGwGazwThH8AFqIbfGnDOxRboucj6d+fjpE199+SUhBux14jiduZzOUAu7uzvs5UyMUWikypJoTX+Glcrc9wPzMkOFlGdyqXhnxYq8VShFMH7t4lLKqgw3zNcrc06UlCEX6DK4QLpMhL6jLImXF8E3O+/ZHQ6qhM5QK8s8sxSBIiTYRWCTaqDmqgw1ZWAgTBvxnoeWMr45Ub42XVlW6EJHRmA+XL0JkIZeNCdNHUFFA1BpTmIkreLDAg9UxgiECednNnHmbl/Y9AOmFVo1AkG6Ri0J65ow3LzDG0cjaw5xxOsLbk1CU5o1hCheXcKBz7cpzjm1jjYNjxe6ZIO2FC4l8fSysKTMy/OR8zFxvi5CKW2CDfsAwWf2d5F3b/eMfSQEwzD29FEXxK1hnBzKxjhqkxW20Y56pZFiucGjtWmcaltNK60G89jVSV3f48+6ZiM4uy7CBFZSCrRRIz/RYBRlYenBLBFv8rOaUbioaTGTA8k0lFCi+4SfeUnV1VajJPHHsmqVovukalaUWfTxTYknNOleSyuQoVpVOzRYWUUCWuvktdJU9SypVQ34jJSxdWn1ypSU3y0tI9Yk6N5Cl1useRjKM0cKScpQqyWZgW9++Q/0/VucjYTouZyv2OXK0I3S5LjAMl9v1zl6sdj/65/+wldffSXuCEPHWyduC6llTIVwM/as3O231CI7glwSD3cPPBzuFBJslGUWhmFDQ4HkDPNBdhSlVPJ8Zk4LH376kc/PzzzeP7Db7QjeiseYaWq1s3A6vuBDx3635+7wwOl8JuUZG4f14ssuuFqWnEilsjUDfpkXistY63CmcZlmXj59VMdV+ZSnqyihbzo2A61qRoRxpCVJ+FASo6lammSoGFkaWX0AxnEjN77XTAPbxGEW9cVv0AivC7Zab2rvG1kvBFnRaXdzPL7w3Xff0/WRb7/5lu24kY7EW1gWUMrYyqDyMfBwd6Dre93kW3GGzRnXRfGoMSLC8l0Uo7pSebi/x4fVvruRa2YuhWxkwhk3G9FAOGV/GLDOCnXUSLrc/eEg+oIqOQzT+YJzTmlqQvGb5wXrrBacgrUiBsxVxFvXRRLZqjBeZUmv1zjEiLWevovkKod2WTK5Zi7LTKdxrkbbzlqQ91d/xtUvhZqKsCFCJ9TeXDgej3Rjh7NibSwWBIInOyOHmG16gCuNsTUJijLhZxbX1ilskCFngr2yGxbGMLHZLIydHNrer/ss8btxztKUhluRbsg6A83hithEGOuYpxMlVXzsCcHrQae9rTVI9p0TJjWGVgpLqJhcZEpLlePxyH/7l4+cL7N0qwl8gO22Z7tx9P2BzRAYd5ZxNGw20gTUVui8ve1wrNfXZbQ0GN2/GIezijnfsPKmbqMyFVjraQhTRSCaldUuy0t5tn7WlNWkS1jZJVjjQLt15UNLgajcchUkRpjbruHG+LGGlgpLzTdiQQNdosu+YJ2CslqKrxCS/IfTOAH5xzovk0YVceAahCN/X+N0eYXebrBUVRq0kYwLWJfnRfUTFW6FQWN2McKUKu0GNlWruwezUn1/vjWVmFwhy0Ry7fnlr/8D797/Fqosf41pDJuB2gyXJFGiIUbdr0oRLLnw/vEtfYhU03j6+JEv37/HBM/peqZTYo6IZ51a8zv1kLP0vYSs5VoYhoF+s+F4PiFaFIEel7Rg84KxI8YH0jLz3/7p/+J6vmBjR2fNbSdojFz7tMjeMPjIw8MbWpEdX85FpnIn90nRMzX4AAj5KHh5jv3TyzP3hwexD6gwdD2Hu3su05XDdsecNCfBGmLsmOcJmy3jODCBxF9agQ1CFMdI49ADTrom4wytyKbcYG4HfE4qLzdWmE/6Bm300v2mhPeefnMnIq9J/M1pDZwTw72+Z7/b0HW9jEcpYwz4YDGdvGGa0GebmnO1JtDX+XzGOUff94DkSFhnCX1Ep3TOpyubvqcfB5brwlIytTS2/YY0JZoPPJ9O8jBYizVwuSyghcmqFXerFetes3iH2N9yGTBwvpzwvhOr9FLIpSmdUQ5bkAS+1DdcC3Rdj1YiUT0XycUmiqVAyQlKEwwdI6FDFloRi2awpJZ0QQbTsgCZlmX5nEtmMWJkN+eFJScGM8hkVpouOsE5cZ6lrAcKWNskdTCBjV5gFAO2ZkwN1HomxplumzkMhrFbiG4iOjnoVd4oTrmrmR6oWV3BEZCYR8mv8HozWwxx2MMgQrO1EzbGKb2xiqCyCnRRMswl8/zDT8xzYTs+kuaF55fP1GVmDJYQDOPg2O63bEYhcnSdw9hCjA5soXeeSsa7Tg5jvQ61SeimBOLIzkHqs1RqszJzmi4hjMO5cDuAq/GseXSlVayVMC9ZTEuHaXQaux3SiM2Hc9BsUChKSetaL6zmULebsM3fvK0oC0tZu0rdIxk5jKvCZQ61+TBOSAO2UmpC8ih0g2kcTYVo1IYhUEwFIzBr0QWsMwWav0WDSsGxt8bQNDnqMYaS5bpJoUAmAW1aa5M9Q7MGW1dPXp0atP6VtsJo9pbdsuqs5mppDHzxzR95/+XfqQWIQFIGybYvFY6XM/Oy8BC8UH010TNRCc5yd3egFogxyJSuxTfGjg8fPxL7yGbc0IeeXAt9F2imv+XKlCzX9fH+kfPxzPPTk0Cx1pEp/Pd//mfevXnD4X7Pd9/9wHKZ8X1PcI4YI0PXCZSPRKPWVuQ5Caq+N9zOAe8FNpzSQh8i2QjJyLsmAVgV5mXGPxweADm4smmYZtnv9zrKyWXqooxcqVQ6H4RCqMsY2wWWeaE1uRDHlydCiIQYxR8oz0TTCd2yOZwXdkNVF0jvBbes2lmklAjBczqf+fGnn/jVL35Bnpfb0nvFXleW9jAMfPHV1+IFNM/S/SiuWnOm70dMLwyqFf5JtVAvF75/euGrr7/k3dtvMNawTBMguPf1eiGESNdHHI7L6cI0zeofZTG+Z1xGpkmCw4UJ5ClLIiWJYHXOs3ErrdGuEx3WWJ4+P+P7IDbtOTFfEyVUYuxfzdZq43qekWwAgfw2/agWCdobGsPx42e+++F7Hh8fuLu7R/+QJS9ykCi3XjzYjLz/vLxSCFsTiGN1US2Fp09PbPdbhn6Qxe5e3l8tTf1tdA1t5X1ZKwfEkq/qFxTFjqFWaIbWEtYuRHukd1f2YyGMFecNnQVvt3qgyn232khYa7Dq6fP//6sq4VOoqVI8xBGhktP0qgXQhe+cGufzkfmaOZ6vOG8oS+JyyTQLT58uNNM43I18uQvsNnd0Q8fQR6KXxsO7gAuOVg3GiqUK1hBsh7dGfaTE7rwaaQBWy2zhn9sbrXelDDvrdRmpmL6ym9AigLPYW9O8Ct7kXlqHe4F5xKpf45sUNqo061iNXVtpJIT6XFumVKe9u6jLc0tyuKr1BVi1L9c6JgivQNBNc6R18YwR2MiuHRaGZtYIU5liSi2317wu6+u6uKb9zDZGM8arTFDFaIhQXaeBV6PCdb9jndcJRq6O0+LyeoHc6wW72StO5OppJfLF17/j4ctfUBBvt1qUTKHmhsZLzszx5chlEit9byy5ZHrnaaVyvJ5x1uKCuLR2IdJvetY8+M53gs7UmTWzXAqgwMib7YBtIlD+4ot3Aj9aQ0qzxBRvNxLH3OD9+7fsDztIYlKz3R3YbrcYrE4oEicgO57G9XwixE7txRe6OFBbFdPPvaGL/S31z1qJoe18xLtgmOfEECVXOddExN8CP5x3EkzTKtP5wuHuQMmFeRb3UdcFzUO2/PTjB77/4Tt+/atf4X1PNtDZKNXJq6eNsiEkNF1GNeclt8JYDW5BCkheFj59/sz7L94LHKaRkmY1LKuyMHdObmTvIy0LxGS9UFezRhdai04fwnvou4749pFhkDxa44T9lEphmmZejkc2o2CG2+2O5TQzzZLS18XIdZpIOTNNM51zzFlw0+fjC/N0ZakFXwS/74cBkK7DOkcuC1Oa8CXRUuJyuXKdrmzcRvsfeXBzqXozihuu+L3AsizUtJBrE2uRGPjy7RvwQejGRal6xlFqVtWocMtTTmIgaIQ7vgjmpN2FwTZhN1Ua87QQQhARXLM6lUhhCd4j7JOMN+Z2Ixojn2UzMs3UXAkeentkt7nSdRc2sSNYA/aMMR3eRmgVa8EFg4YGyFShHlGmVfG4aSosYl3mVqblSkozIfa0XGk1iwjJ9ZhSWOYJS+R8vXK+HMmpMS0SKtQFw8PbnuhHSrnQD4G3b99hzEKlEKwnBLCuYR1UFoKLsBYKY8BVmq0kORcFIqAIDGe8quHVBt8YcMLi8ioaq9bc9kGrbuDG5LGvnTSonK7eCKPc0vxWaAW1fGhGOlkdmaweis5VTPUKW4mO4Hq98MMPf+HLL7/B6HRWm2D9bd1DmZWRtZ67jtUbyqqqutZ623/ciqEyrGorOrXqZ6uit6YHeGnrchyBtJBxwFirUJBagSA7J7QAsk4E6O6nQTXuRjFu+nfWXab8W65ua43cPLkF3n35B968/y3YHqdxodY5sgpn+9gp1Ax9DLJ/SRmUlov3lFz463d/5f7ugbv7A7kW6jLjXMHj2T8ciE4ElDkX0ZSkRDf2/O37H3m4f2Cz3bFOo12/4atvvsEbx/PTZ3746Uec83R9kAneWmIcWFWswspcVKcmk19wXsW/FR8DQdEcmXqlYX14eLiRVYzub0ppvFw+c7c94IsqXJsu0oJ2vg3DfJkotTB2HbUhVUvtrr13TClhK3R94Icf/sZ//+d/oQueGHthYijjQGio0l3c9hSA8yvvuWkKl04n1uJ85O2bN8KIEq4ey5Kwg1M/n7WoaMejS2jfvHT6OuI1DKflQi2NN/f3hBjpvIxm3gmLaV3c+ehl7wB8+c3XTKcL83Vi7CXjOwYvqlxd2gXnpYCaxvX8QquN0/kiXlUhyhSDLo70hq0pkUpht91SssQcYgQOW+Ev5zy5ZFJKkh9treRTN0OZJ/76pz/zdDpS04Lxkf0wsr/bM/hITVK4YnBc1Bog9r0kzVUVODqvh02FmrFNwkVKEfPBPvZ0vSzlbDNcpiudj9jgKCVL8FNrXKYzl+vCZjMwdELZlVE3Q5twnOlj4rD1DP2ZEGQycGYBk3Et4IyXDGuEZGBrAbd6H0kTYa0XQkKT3ZlBsH5nI5frC9fTE7kulGUmpRlspIsDZb4wnS9cr8LZLwV2+44uDhhv6YMY+fVRulBjR6xNWHfGWkdve/08jFK2G9F4UPNLTMWp51kzbfWLk4MfwbvXZbJ1EkBUm6jljR6mtoltjcRq+ltrXNeGyqAQy5rxLEpvFEaTB1tgq6qmlHXtplf7aiNMtGoquYpdiKtRFtW6Wzwc3mn9N1T8jTlVb5zT10lOhxzqekYbqxbo7jYdyU5F3kOr4szbWrlNQPLZ2hsMBiu8haSe6hVc3WLl65xOlMJCo2rYkbE6rQpBwCgbaj30DEYzw7MULVbzS8NcB96/+xX3b78BE/F4oQYbjwEC4vBL46ZnGsYNOSdSq6LMsQZnDH/67q/87bsfeP/+C5ZFHAvwEoi2tIXgA4nCNC00Pbhrq/jS+Ot3f2O6zvz+91uErHNhWSSdMCMC0MeHR0rO5NTwDqbrRCmVu/2ep8sTT59/oLTCL3/xC8bYk10j58zpdJIJxaw09ar73sTQ9bojqhQqpRZ91hrn05lNv8GvJmnCrpBqXdQyAgPLIoeat5bBjkrVtDg8uYne4ccff+Cf/umfaLWyvTtImhry4Zgm4pMVJ2oKpMpwfUNp5ebQO8JYy+n4zMvxxDfffHPrwLou3rqkZuDzp4/cv3nDfJWs54N1EpRTZS+BNXjU9rxVjqcTIXji4wPTNDHNE+/fvaO3HbUWlmTYjCPTPAs/OHhqidRa6MdRokuNxVY5rJouZ8uyCAc5GN69f6cW3ZWkUam5iS23tYZpmVeXAMGYs6XrO2Inwq7pelEuNXz+9Jldv8F1AsPpKcG43WK943Q6Ya0Vk7EfJg6HPdvNwOfPLxwOW1G8topLoqtAYa8VsluK5GpXK+vclQJZW2W7EbviOS0sOnlEE+TBCZ55Fovz1hwlV2zUvtAuGGaCv7IJE5ux4P0VcRDJ4gHUCsEGvO2wNKqXZa0noKvH1wPJGsXbm+4gAKuTbklM1xfmdOV6bXh/oh96+tix5Bd5CLYbdneSeobp8d7gfAEKwQrrTthnEecdtSzg5N73qnZ1RvL5xNZCpt1GxXhDM/nWUWPAFBCH11e7Dsn2kINPwojk8FyFcBTJa7BeDuVX5s7r8Sx8icYtkGfFWuB2GBuzisbEh0wiG+Rzp1bKuuAnktaTnooPgd1+K4ywFQprXotRuR3gTSFQrMJi67MIQrnVj80Y0U2hsHDO9WdvxmGakDdWyqwRIYd8fW3ChKtaDJDFf9W0Qafl4waTrshDW511hawgUKSyvJq6CdQVRnMk1eO8f/d3vPn6V+QE13lm1zuu1yvGe3bbPSj80qw8G25VPXtPnheuReirMtBZfv3bXxFCZMkzrcEu9tCcuBZYQ1qSxCrHKA2T9VjreLh/4K9//TPffPstm3EArAhaZ4MLgbHv6PvIsljm6SoNXQhczkeu1xOX84Wai+S0Y2nOYUrm+ekT58sV1I681srj4xuMsTgXeDmf2Q6jpkxmMZU0EEPPV198SSoZj3blwXg5NJwcwCUpiwJLFwJDjKyOLdY4TueT2CaPI9ZY3r39gs1u5LA76FnWboZkrYj5XQhSpVupN6vpG+8bQ8oJU2BUUd64Hdlsxtcxfe2WdDQKoWO+TrRa2e92OLsKTQxGsfPcMtvdjrQkvv/+R/qxJ6XMy/mJ3//yN8LptxIQ7pzFB8cmbJANP8RdVJtyR62N+TxxmSdhMinV8HQ+0wy8XC4yzhlhjyzTzNI0p8PAMs/8+OFH4SZrrKAcfp6cZubrleu80Awcdju+nydiCIxhg5sbSxV67f6wZ7ff8nB3J1L6ljlfxaDPGNgeNhoVKTijOKbW28K06ti9CqCkdXJYCsd5lolSBZOuc3SxW9s5Geeb2BJ0YSCXorbQltImvF3owsIwTnQh470aACI278ZVXHMYKx15s4j1AJVWhBHWKGCFeaaorXSOrdFqkqTCVjm+fGJOZ84XiRIFcDZiXGQb7mGUXYm1YpdurVG2kTzQzlR1+XXClrIOe/OuWf2LnAAZRoRJAqmgnk3lf4Bg5HrKvSr+UcLZr/UmD8BY4f2LQl2pq9ZgmiPr5yKQjT4XTdqplcVTS9XFcb0RQKwVuLWaKhRba2801loLLYtnbc4VH9Qap1RWHUNpYkIpewBuRaFW0bKszrU0qGYW0z8TWJfbDfPqz6qJdCs8lm/LaCOK7tq0AKAitlcdU61G8CYtyevesSqjTVhqVqcDtNi+/iytVqzWJPVWRwOQqUYMS0sx1Lrliy9+y/2XvwQ8KV8pS2LxDjRZ0rSimgvRnfTWU60ajjZDdIHT9STUZheIPjIOPcuciF1P1p0gTZhrxhqsa+x2O5yPLNOke8XKt998rfCRCOJijNzdH9RaHr3PhDJfaianJFooa6T59Y43777CNHh++szx+MLhcMAFy3a7IS3yd5YkdvOrlqOGQFKafvQdFisU9VpZrY38bZTSE9uqG+tpWQjWiz4hBnCGDz/8yLzM3N3dcT6e2N3f0Vrl7v6Bh4c3Mp4q64Iq8NAqeFtv6Ka45NoI5ayZAp2j60ahPgLv37+XsV2Lwg0z82Jf4Yxhu9uIpTS6a2jywCw58fl04rDdytdrAQh9xFjD//b//H8wxMAvv/yKWps4oDbYeg+I0M9bQ1WP+VQEv0wp8enTJ6ZlkaXUplcLEcd//af/i//zv/wX+nHgV9/+gl9++wsWKjUXqhV8erZGFkvWcJ2u4rUSIlBJufDh6Ykv378XdXfOXKcr0+VKsI44dLScb4Kh1TuqLGLAGKz4y9fScEY6l6IHiDDBzU3wRq0UA8F7UhV6sqnyHvvQyaTXdNnN688yzSi1VnQVm91ITYXaIOUX6vJMv7f4OOM44/GYFhCx8M/8eqxw37ErJCNou+iq5LAyuhhfoRTTNL42Z4Iu4H03MFoHd09YE7EmEuMW7+WwsIDR0CBnpdOX6EbZUVW1CDFG6ZVtZQnpjsXctLoC4+gC2hhdOlspeHKuGlAhaiDKNbQGX29eivJ6xJCINTva/hw+0YNvhZPkCnCDCa21UBu5iu1z1dhTg3T9QiSAWgpZn51aCzVnfT+Cm2u5YjXdy1U0GYpBvu77WIvNyrQz0Dopjk0mE4lB1eS1qp1/bmrYJzy1lYTUlLYtsJJMFLRCqVb1F3IfrEW3rsUE2UmBBFjZZuQ+blJA5GxQL6Wq8JLcUbqHEB+r0hqlOGDL+69+x/7uC87nK/M0sSyZYRgxITJo03i6XLDWiVW+aVTnb1NcrQ3nA4ftnZBygmd/OGCc0cwIy7wEJON+5unTZ0IMbMYNwXlccNB6pmlmmTL92PN3v/vtTZGdi7A+hYghKE/shAzkW9A1iOewPyButBGQomZ94PnzJ2rNbHcHnLV0oWPJRVMTXynMXdexpEQpCWMkXbGCOhgYhhDx4gWiSx1pXJjnhWg9PvibqApE6DaMooge93tRZs9yA8ZOKazKsKhVKZvTjPWONat2Hf8kGU1sEqzcETQgJ1lUSbcHXVwD7LkBU84Klhk0exdEHezWdq0WxnGgG0dazqRloRsG7vZ7/vy3v/KH3/2OX3z7LYfDHZ+fPjPPM28e3+B18y83QZXcWu9u5oa1iAzfOcu4PXCdrtTWmOaZP/35Lzhj2W+3bHd7cspEJ0HmrTQuLbHMCzHKIr+Wos6q4pPjnOH94yO5FCiZy/EksAGVl+uZh16S7MhiHpA0sEc44WINrn0WNJizdNzWWahF8xoM1EJBEryaFhxyolY14PvZSlQlTq9Lc2UcqcECxhrmWvnTv/wLD1vPw1sZyX2aqC5TslBkZRupSYUUUkOiIjEU226W202DcqxxSu2U08KUFT4QfUGq8hpWZ4bN8KiqYIv1FmOrsoJeO05r18hT2SfhjHohKTvKmleLbdqtSKGMOpSOLEeWZBIYNd1zulw2DeKqdJeVBWtOs9XXsargjT5sN5+gNSf6Z1AbKKvGSOYCyHtabdnlgarMZblBO/Wa1co+KH6vzZnxr/s7RDQm/YIWi7pOAUL6FMxfpyljaW21z9awn9aoCh8XJDu8aute7fr6LVUFjGXNSdHlsqikV3hMafTN0YySTtv/WCDkfJKkNyEsyN+tRuNO9f6q1dKsfE4r06k1gWFqM3h74O3739KND5yuC9N0YZoXnJUzLPpIUqv/55cjfddjNxtsq+Ql35pVvWW5JkEy+uAYh47j8cRlObPdHeS9Gs/x5ci//vnPeGPZ9QPb/Z73X3xBBY7Pn/n4+YlvvvmGYbuRBi4XssJJyzxzuVzYbHbiURe8LOWbfF2pjceHNxhr+Lc//Zn7uwPjZsPdwz2TZlGU0rgUIRpF04tUQfVMzlg6jUWg6qdfm4R9IWw0L4rG19uylIzzMnIUhN1UTaWlyo8//sTdYccXX3/Ny8sLy7zg1DOpllcVaDPrUrphxl7OCIv4C1lLzvKwBt/h3GtV88bydHzh6ekzXd/xcP+AtaLSLLnQBX+DTFwznKdJltz9oA6y+tE5z3Q+cn9/T3OWPDVKSsQY+MNvfss8T9QiLqbT+Ygzjt1mQ0lJqWOO5bqANUzHE+frhc24YbPd8PBwz3KdeTmf+PT5M89PT+x2O/6X/+V/ZVGVb0ozqSwEIxqGy3zFGEfse9Kibo1dvC3Dqj7wxVpenp4Zhp7jNBGjZ56n2y7CGTnASmlcLlexLalV8jXUjqEok8QbJ2Kikm9jedP/w6CimUYrM8eLiPpuyB8CDzorS8B1khAKceN0utKPPc9PL/z402eOTyeWyeHjFuctDotfHC4afAYTNJCqNWFRUSnGSeJgbVSv9hUr7p+tBjklrA3q35P0cEiyAwkDrcyUlmVS0FQ1u8qkDEhwmlE/poKzYl9vnLtZfDsA93Mtw2sec1OYR+Cuhq3iEXY7JBTtcFog1EtOeli1CDHa6/88tKciRVIpZdI0aFUx2vQYzZmWgmZ1KSGHnrXr3m0VLRaqijFzEctvasLaqIU0yJ5RKFQ6DRlaNZSab21B+9k/AvnIg1uR6Ud6coE7jDKA0PdeqGo1A6a6W4FoTcK+bvY87XWXJ+6ua2UWH6iWDbdLY4w2aMpU+hk7Ci1kzXis8bdiK38sTYWxKJTmKMUS4gMPb3+D7+9YmsPYzND1vHnzjqHrsUYcb1OpfPrwEecd3aanGMnwXtJCHztMM0xZPNrSnKRhjTKN1mo4ny+02nh4cy+WQc6yHXv5cxrPz0845+k3I3lObMaNFB9NtixVipSNhmm68r//7/8Hf/+Hv+erb77m6cMH+q5ns9tibMO2yqfPnxjHnof7O3GBTgtd7Dkc7iSLwyhKEAe89+ScybUSvRcKe84crxdpcvd7Wmt8Pr5wvVx5vL/DCyNUKrN44Ivz51ISzx8/MAwD++2O43Ll6fmJ+7sD1EoXOqx1dF0nXkBqRpWWRCrpNhrJDS9d+HQ9M4wbmRSbkchAy03QlVrlww8f+Pj8kaHvePPwKBTTXjDxpRRSWsTH6HRiul558+6tdOPWKX5tuc4TzVo+v7wQnKeLHoq4ll7nhW6I7Lcb8XtvEGLEuUBwkcvxTDdI4MdmHMW4LkaC95xPZ5aUhJvvPdFLHnU/SDDI6XoShXht9DEylcw8T3IjWSkIJYvt9qefPpFq4u3btzfqYMuJcegxxrDbbIjecj17RmWf5VLJSYJsQgzi4JgysUH2Cp/kSk1FFZTSofq1YOsBVmnkVvBNFnmFQr4sdHojCw3RSDeRxbpjVWpiDLt+5M9/+Z7//q//yn5/j4sbPr0ccf5KayOHuwFTZ7VUzgxWePveFPxq34y44Lq+h7oe7RWD/EwxNC1gMq02Up1uB3JrlrpcAS+qayPdqNBirR60mWohrjClMcpC8RizUoTrzWbitiAzK/wvB5Ix8rlZlaqv99r667YYlZehhWotFlIU67p5tq84eV47elRjsjKVahNdQ4NWhPRgNbvIWQ+u0XLV7vxnC2Hk64X6GW6HalPfpKo054pOxk08m8qKINQiXf26/2OlvDYtEGiBaDQk9wTdD8i9ZjG6Vm5UhZXWXYESVVbUwhhadQKrAbdkuaZEFvkiLc6vC3G49UuaNWKUY6BQGKsSvWJbVXgpUmvAhTvu3/wK3++xcSQ62TWV0ghdj/GeaV4I1dH5yHW50i6V+/sHyXLHELqBKS2yeHaRKSWaqcxLwU2ii1ouZ9I88+FyYdiM9L3h8eGBoetYloxtjcv5Qhg6+r4n7WVCCDHKgjwXjJVoXYzsL/7jP/6juEgY0UmlKiFC1kihfXp6IqUt93d3WAc//vATw3bLnRHISFyoZQfq1s8b0UPlnHh+OfL//T//P+Ql83//n/9nDvf3fP74kZfjkbdv30p8KdboclE6F+cdronDa9cPzDlhGvzHf/yfCFFUzDFEcJZcMyHIYZmzdPYSU7maczU1ZYOuG25LLHlWpLto6CLQWHb7HZfrmS/ev6cfB9KsORK1Mqckxn8IjfPt+3fEEATbRT3mW+Kw2zG3wv/7//h/YZrhqy/e8+UXXxC9w/VRFrGl0UJju93SDYPASxYus1jrhi6SihQAMemTG9roAxOcox9G3r17x2WeuV7OfPjwkfdffAlNdhHzZea6TBjtyEvOlCzXBQt5UXsNa2k5s6Ry44I7Y/A+st0Fui7QlHrcTAVlklwvZ8nv3h+wVbonivRUwWoUaFtV23LFV/feVrR7BfbbHS8cmS4T/aa/4Xrr51QWtbb2igkHx3WapUeOljItVBP4fCykfGLJkbIHu/f4PlNqwxsozVJJxJ9RXNNSqK4K59yIKFN+qjBaBLfWUZSg+Pa6YBUufTWiF7FqvUJrWOcIqrtpTd2LG8p40dxk5f5bPZikM+dmiV9VVW5NpTUrLJz1dZmKrTK9NsWpzO0A06VyE6jEaFERgz45sGVyERSuNW5uyLU23UQIkcMZz2qvPucLvnZk4YjegCnTGqaqdYZZtygCd63vCdAYTrFQNxh5RvG8yvMUnrmdyDLpZJ1wqkI9VRYfN92AYGBZoCItuGUtCuuzXlVJXQvtFY+S6aLoVKCz1s+ADZmmftZs3oq2zmKytihYhIou71ns10uxFEaG4Q2xuye3gToXfKgsSRwCrpdZooErTOcrdB3d0PF4/0CtjWBF2Z9bYimF6/nCy+nEOI7EKs3j4W4jmphiGHdbvv/ue4btqo3SfIgu4ryn85F+uyUnAT+7rhM7FoVhSsl0vQSh5WXCOctX33wt+5/WGHYbulpZpgUTxLLm7u6O1oROH1zP4e6OUjK1JJ5fLhz2B2LwnKcZoxkXTs+HJSU2fcdXX37Fv/3pT/zX//bf+L/9x//IZrvl/RdfSK5Ka0CRkfZ8PZOmKw8Pb3DOsdttBXNfZlqpLLVigsdamPNC0Y4Gq4svMkuacd7rg6TOi0YsAISRIV2KMdqFaOfSjGDTj2/fst1v6fuBMmd8jILdG3FFNSYRQmAcJTNWcMOOzm9Z1rCNUliWiVqE9TP925VuHPniiy8UY7a6VA/0h5G8JF7SCwdj2G23OGfJOYtQ6zrdGEub7YaldORcuJxO5NUqm0bXD3z5/j0fPn4kpSwmhsETWi+eLWkRtkiD63Viu9uz3e6ppWoHJ099MQZKYZoSl/ORfuwwydz2PdWsfPdMboV+6BVTFkx9KhIaU42l7zqlDvKKia+dLypO0iix7bDjYq+kksTCoyhTxrlbQEsFzscL3kkaVuw/s0wLOUsnv2THp+dCWhZ82NH3FT+phYeVQuNB7MeN5DXnNFNrksPURAzgWpUJgUZbPYuaBElJt7jKh2X28LqUNethbQqmQnUa2QlYHFkPMqs0TlHm2ptHmbEGp11LI1NNlqJgRC1dm9rP6zG6Wqq4qhCKAbOaFjWoyP0oi2OB6zBGsgdMohkPzqhvV7kxenI1+pr11VdhCpbSqHW5HZCmiU17a7DUBMZh22sBFnvvFQ6y+uxVXQwXsEG6/FW8WHWB3gwNmSwEvpTprVS5Hq1IguHP0yhXDURpVemp69SkYrNiVDSoe491t6A1prTXwiZDmwZZGcBJUyCsrp/tWSzQCka+SJl3ospOWFLriJs3PD1X+rzwfi97mVKqinmF4nxZFmJtYqVRC/OS6Lqey3XieD2L47LvKHkilYLDME0TIXhCFxWudzQL227D17/4hm7oGEMUa3Gl0ZZUWeyC81HvVUOInZAJWqU1o8FYDVMSl9OFbhiwtioTTNAQayF29iY0nKaJoe9xTnJzrBEHWpxnM25orbKkInY6CsiqCTz7zY5Pz5/57W9+y1dff83Hjx+wwOPjo+jMSsHnJAo9a2RZ1PWjWPjWLJt0Zxm7jhYN12XmerlCE9bMqr4vWXx2Qoz4Jvbb3onqb13qOe+EXrvym2U216WtZlUrBrrdbEk5kw2U85VmYOg7WdpowlrL6p2/LgK9x1YJxMEagtvw9//u3/PD999TS+Zw2Msh5VV56sPNgdYFx2azESX5MrHdbbHZgBdRW71kwbGtlShCMjFEuq7j6elJTLucox835B9/YpquHO7usBic9yKmWRacczc2F02wQ4Bpnm8PtjWGl/OF4APee9KSsQ1SrmSqiB0N5JTpu0G/Rr73Uirn45F5uhJ9JL55hBUEsGuHrojzyuVvMNfMEAIhOJZF4mKLmn7RKiUVQpAez1tHTom/fvcdqQBFlt7iry//vs4LLy8z28HRdQW44k0iRA92NUlc8GbQw96JmVu9yoLWVqioEZ3V1wvrzmL9ZYzkkWO92h2LmR9GDpVSilrYCxFhtb0oFFwVfNhYYR8Fm6H62wHfkLNNMST93iKklAw0UdEa1kQ0bhBTMAJlWIVKbqLSptCK6gAakhJotJM0ugwW6ZwRV+YiD31tVZ8fmQZWLUQRmaYWfkuliN/RumCqSbp65O+tsFa7WWyjOwzZQdJk8kpNvg/OUpqXTBVWBpgskVeDwdKyLq2LTjRGp95XONmgSXMrfVeN69bCKDAbNxHhCuG9TiPtVpTNmh1RVphS6cgyvJGI5Nax3X1BPz7w449/5TR95v2X7wnB3yalGCLDKFOEaVIkaEjyJEVijufpdn3RCOVhO1JSIcaIkLcF4jLVkFrl8e6B1ipTXjTaF+ZplonIWUbvyQk+ffrI4+MbYhdYlisGf0Nbcil0w8D5dGSZ9UxywtQU3ytDq3If3N/fsywLp+ORZZp4+9VXGkRW6LpIKQInDoN879XjarpKYuP1fOF6ufLrX/6S+/2BTBNYqok+xIfYkXPG0xjGXimA8sH54JmXxPVy5vn5mdP5RE6Z3/7+9+KnjihFS8nkIqymEILYPyQRmK2Mjoo4jMr4X3UnITBMW6fdZnDWMWu2RQiB8+VIWhLx3Tt8EKvv0sTmGu/ptNqdL2cu5zNv3ryh1kpaFu73Bx72B47XC6UULtOF7bjBecGhxcNE0vUOuz3P84V9EL1FdoKF2wY+Rk7HowpgLJfjmafnJ0l3Gkfa5SJMp1L48t0XXOZJHmBlgtSab3i+93LIL2lhzZMwznK9TLLHyZLGF73FuoFaFhbdC9jaFCJYEXNxiEXtHIKzjGPP0A2STaHFKyfxlbfWvHZsinFKAmAjZcGNrXHMadaFuChZnVh5Qm30u5Ef/vaRaU6ErheRH8JttC4I9bkII0bS9rLy3MXxdwkJ14RVIXbZTqCLlrlOibEXd9c137o2YQeteg5r1+Wl2EqUVnE100KUa2IEjsQp/bKpA21eaLYq/Vb2MlaN5AySoe1MXmsEkBD7BsXlrcFR5Htp1Gexa+EptwMTGtkq9dIahQHFDsUazapujsyaC+CgriJTcyuCZi1sxtzEd/IlVo3q1KxSvYwqa8oa2tWLOjnf2Ekr3LX+mRyUtbWfvWdpCnKFhiM1YbqsGS4VhddWhi5iy7J6M63aEtFJOL33m+y91LZbipUUoopML/nWBSgU2JSCrK9dFuFZ73qvP0tmr6zFSV6NTAe1bdhu3tINbzC2549//HtKSoTQiQUQkJYsdPvaQI3upIGV56YgYsTQ92KjXjMez91hT6nidRe9ZtI3oTKvNODiGg1xsJ7OVzEp7QfVyzRagZfnJ77//jtO5wu//PZbrFPY3K1Qp6X8/7j6sydJsuzME/vdTRcz8zUiI7P2KjTQy8j0NGREyP//nSIUPpAzJKe7gepCAZVbLO5uZqp6Nz58Ry1ymCIQAJkRvpip3XvOt+ZVibPjrG26tRs0qARtx5YX5sOBaZopeaUejrheuLxe2PLG/d2DDXCea1mJPlGcOLZ9E3z3/Mx1Wzi/nfnp5RPReb55957mHOfLWeqmGDWViOjSw7nLTAEdRM7z7ukdw6iOhbb30FZY1oVSCncPD4oHqJUYBxmIevvFQ16NVLSV14rZe1PQ11YKgylhxkER2/d3j9pIQsC1zmaS0TREvAsk79lqpeS8j36A3ujL50+8f/cNd/MBnGPNCt/rXbhvzpnoA8OoCG11DHTKTZYoNyoODscjeVm5vl1YLlf+7a//qkwpNCnmnM2sUm9ywLzlG1HdcJKf5mrKna4I466peUxRD1jrFmgnvbtlBNzgosu6KAAsBoXtmaO25EIIkTROOmaaJYfiyMtGjY3jUfJlWfD3Cc1TcRSTUUbv2S5q5/I+KLs+Jsl/q4IZf/zpk+DD2oneyz3rFGddeyV4x+EhkWJmL6ZxPur3rvJLONf139j7nROHQ5KMua87RP5/UhPhjAC3yd35RtgDzFqR+it4enWSElrSnfc7yr9zM9XIbjnIhehUmv0+N8lnE2chJZDXDlEzIVhfdFPiqhrOEKvX+QUhaxO32GlNuX2/3n9BCrsqWEakgvEKpirrIoCVE/X1cN+3ElpnD9LXMKb7vduhXH23Q9Sr2rb2GzQmqLlTumAkfUwl0doNl3uPNei917TuzMPgkKmu3C7jZhsN+4XSO273TtlEvs+E7Taw7H4GhydQTQnmuhoV9XPFXeAFLih23HucwW2tJ2qfCHFmGp4I4x2dxOW6cneauX94svdRZ0lK+m47PN1rU52AVxJqGBTxfX678Pz8zOlwElyJzsZau1JbW6XWqnpeAi/nLzw+PDCmgdaurMuVeHr4Gm/iHOu2suaNx6f3xBhY14X5OJniUJf5HrWfhgFHZV0zPogf2bbV8pn2c6Dw+vLCMCTmw4G8FU73d+x+lBijWutqvQ2U2OsQcPQQeHx44uePH/l//N/+71yXC//uT3/H7//0J/1dPZn+hjnvZdtbzoTgGceBp+dnvYEh8PLyhVYa0IwAg/PrmVIKD6c7OUpbB1dvnbr7kx1C0rTkAnVdGeNEA9ZyxVdHHAaCgzAkWf+bwVQGAxdTXxCtDc9V/DDizGT28Phg+K5ym86XK6VJNz6MA4ek3JLz9Up0sFxn7k53nO7vFBA4JNKovujgJf1dl4WYIkNMbA6u28IwjXzz4QM+BHIubOZ5WMvG5bqQ0qiSn3Vh2zbSoGm91XarAw1OZDV2qeqD3W4H+7Ip+RavyIZWNZVFZ2UtODOfIezWujudKUlwGFYPLgSW5co4yj2+lCJxgvNUpzbCbJHmgg4dtWi6298/j6O0wj//+V/59OUVF0VCDmO0S79Rq3iX013iODdCXHHeCEv0mvYm13Xv0Q5uhaQJVoDmMwEpO9hhGC/DlhQwRYofwLlRX9vLzd2cIzQ5uRvGD/hmE9wOt+lW8N0ZBu9uLvJ9u1GKhrdDWLh42OGu3qmGi/tm7Q7NqAbkYu67ka95qrd012akv3M76M6+edhdoHnADvS+h/iZzNXhbgeNx0QH1Vn4nv59bRpYdLlEfQabDn1nqjYd3u0mqd2tdb03ct9/Tx1mdJkYjQEwl7YTL7DDek0HUTc+YH8o98LR3vdQPrsc9s2OvlMVhO7Ypb/Vfn/Xld5rnD1th5TsjNLvAPRErZ7cJ4bxHXG8YxhmQhA0fclXPn1cOR2O+BAtWE8c6pYz+IQ3DijGwPmqifrp+ZEpjby1V8XrTLMJKaAGwV5bzhrAamUNmW0rfP/D9zrYXWAcZ+Iw4F1ky5sNRo5hHHh6fNLz7y2vq3ma77RaBLPS8DGCg+W64lNkDF8VYb2jVIQgKPB8veKAeeamUi1FicTBe4qvDCHoPYxaAILzUlIZ3/H4cM/v/vR7/tv/8V/53/4//1/uH+/5/R/+SPSGleIc0TXWWrlcz0pJHUTS5tykMKKyrSvj4WAeicA4zzw9PynR0Ik89VFf05m7ttRyS31trZBSgj4oXx7wVeqRtOewgLBNWzdrLdYNrayWfQopQOqN0pqwaZt+nE0wYxoom3KLgpWeL8vCmlcy0q6Do9WioOkQ2DYZ3qL31CJDy5gGwRoxMDNSa+N0Oin/aVlpeROHUox8ypltWTVl9E5sjWVbycum3yMELtuCR7Hk1YwxXZs5S175+PPPvHv3TlLH2uS2DmaOcxjmiylqHKH722EutZrbz0NCDPjNqVyoCc5RSYsFyxEYXGel0WvG7X/n63CL6/Dxywt/+/6jUniryo/onhAjvjcu25U5OX736xPTWInBGXiyk5xGm3XLJPUiTxvNYisK9CgzlvkEAHwTvBT2n8WED811vOv4fQpHA7kqSJVnEJs6oXcYp3ePD5WOxYJ0b4d+p6GJ0vdJv5ttEeIKzG8C+G5bt3O4vsMf7bbR0B2NZBe4Dme1+hVTVGki1F2+K/ycHfA2VbtGtXdxl3fup0PDmdqu0fY5j2abmf083tFRWY94iK8XBvY67hCWeAXLUjLyX/CXShC5QXzcBCmdYHdmux1at46G28XDjSSFjvv/UzU1m/6a6Wg94sokznC3P6/WPQ1/gpMq2biU0hK1zAzTE4SZEJR7BBIMjDGQhoM4HvtdnUmZMXw+BAVX5qxAxNPdnc6M5G8cW1rVmx6ix1VPL40hBFbdVFwvCx8/feR0uie4wOfPn5lM5rrlTDRFX2uZFBJhjvvHU++Ba7YdOnwVoR1qpWQZ6w7jBB3ezlfSODAGj4+R3tSnfZhmqSi9hr8QAst1Y1muTOM79lc+t0zM2lZ9Gm4BjSF4gk/8/d/9O54fnvjbv/2r+OnWiDqcDPvzji8vn+XCu7/XgetkdCq1QOlMszT70QdCSjg64zwxtImSN2o2RYeeGnCBGBQ1LqzNsSzC0ZN9wMbjSTrtWq0cRgenKRT1ybeDwdMl4e4ikUoTOR6HQaFiMeF6I6XE89PIy/mNbV1lhfeO83Kltcbd4aj4365Vv3fwKZKXleY8fUiElBjHkd6bzjMf6K5QgVILa84yppSO71aRWQvZh5ujN9pk17JhsCai3zHo3Bo1Z0QYCgaopbJt2XLdtepjE0fVJ+b2Yd3xEucMk22mfy/KRRpiYkgRDgfoOwT1NfjMdxnwfAj46pVl1ET/9apI99pEpV6vCzFGNjNseTpbzYoEcYHDEPnVb0ee3wVCeNUh7Lwdjnsjndm0nEeE9R6rYJOpTjhqkwzYd2eRENKPO2QU69Hjaqe7oh4UZ6kS7EOPDsYKIqlbo/uO95Va1J0QgnKMxIc6mit4F9R5sE/UBgkZYqQPepfhSWVGDXqC3pRNxU5Qq+yl+WrSX4OfDEO/BRd6k3JWUw7ZZbVHewvzFxbv+Ip9K4FVRWHY5qOjXLxG16IBLpgZUje930M2u703bk9Zxi4VPaT7Rq4NwjaZim0PNsz13T1tHMrN9MZXOGu/oKyv4ga78DUBVuZDU5t1fTHX+k2663vVQNlkuGt1YKudViNDumM6PuPcxHK5cpqgJy/3eGnMhyPz6XTD31Vi5alFQZaKUs9c1w0fpFQMKbJmHebPj08i77H3rnRJop3EL4/3DyzXK99//z/Y1pU//OEPROvDyZd6U0b2W6R7oO37mz3bIPJbzyS3s9g1JVOnHA3pUYtkeTtTxyITXtTZOI0Hcl7s7FjIOXCL8ffOzKOdIcgDcj1fuXu443g4CEEIgVaU8Pz+3Ts+fPONfucO8dOXT2yXlfvHO66XK7lU3n/3nWoTs148gBAiy7YwpEG48aTC8lL0wjrnCEnpnN19JQj7DXd2t8ujlFXreRz0UNeqFFJvBSO9kNcV7xN+SnQa21oY3cBWK9Ggit471+sZ7z2TqWKCg+o8W6nQClOaTCKng8LVRhoHHh4eKbmwLqsySkIgNvBxIOBpW2U+TJKnOWfGnMrHLy+8vrxyvl5Zr4uhwcJ7e99ozZHLSquVFAIZnbnDkBjcQK3V8pUkBfRdIWg0gzuaIIn3797h+Jp55Ty6ILouCBGjuiBKFw/igyCZ1y8vXK5XUkq8f//esOcGUYbD6vR9YfcYBDaT8oYYhFsb5q9nuYvviIFcVHhUGxA986DiGUdlGiL3p0DwK1BxVdCgc9HMaP6WwaOAu0Jnh52+hsvtJUns+UndCZLq2HbRzGugyOfQO91H/V61EJxaweSTU4GTDF7e+IGvByn25+jaZnaSr1qla7OP9J5h5LwXTu/STVqqg1oHvKp1JU0srkAzg1mvVINfXRf3Fbpg02bSKNVoKna62jbU2eHbTCCSwWo9vQxjts2xk+pd8FXzTc1zRmjvh7H5yG/biifQb5uEDq39+RIUpuzVXQZ7g+yMR9QDYlBW/+p7olvardOr4pr8GSonko9EW5YgLUe0N8M2FtD24Pdwv4C8zY7SB/LqcX7Cp2e8P+BcYBj0nk3DRK2d43xkmCTYyLV9DW60DSiGwPntjbfLhXfffKPQzWrwJGp1vHUzbIVxGtnWTByiiqJKowVt0qf7e44nOBxmam3c39+Rc6FshTiMghudQY8mcPRR4Z7dSRXm0USf88ZlkZ8oRFWNrusb0zgyDaoQbq1y3RZmJlxyTIeJVNTw9/Zm8P/DI3dP97ogWlcyLDAPA+u6WtKD4Mx1XfAG0we7MFT4FYitVMZ5pONJ08S7uzuC97y9XXh5Udzy48O9oKVhJA5SL4Xu5Ii1FU7bqQxIHsFMrTVy3khpMMxRF8UYJ2qt1KwM8xQixamEpZqawvlAbRvLtTIcZuq6cT5fhKn1xunh3mSNtor3TnRxn1noQEG9F7FGSm9MIXC6u2eaJryDdVs4HGZKaVzZCEnE6VoyNNWo7quyiP3G50+f+cu//IvyqFxknEZpnvs+5QtfjUmFP5j8r1QplCiNXPdoR8hm2DGQjV6+lrzsHQLOfXWdSiQl2KZ164ZonrWIeO6tU0rleDzigy4dvCNOg4XlCb7ZDXut6aLoTfn2AWnWQ+jU0qlG7nWP6lfbbs7rpOhJaVAPMJn7uwMpgesZ3z09jgaHSSbqu6cb6L3XOnpXaC3SfTcYqdG6x2PksSWbYpJKZQgN2oDgttm5PabCK6NHXRgiNgvNXrMdmWkmjf0KZzkvklZqIE1+JS/U1hnSTA+CQVxTC54WOF3urXuR5l2GQY+ju4gaBM2xjvDovvfGlUDzxTwKRmRbQVbpHYIuY9cULeF7pO51EyYEqV2wCnbot17Nt2MXlTM+Cx3wNwVVrxYZbpyB/U/bDXn23rRmeUr6iprGd/bYLthySybEvk4Hb5Ed3X+dlnceAm0c3i4DKYNk0K3s0k79qX2r9M1RiLTmqHUgl4kURFKHMIB3TNNAvJv11Z34zXFUMutmr02pRTlkrUpCPk382w8/0crG+w/fAoJZVe/rZEy1yJSX1zfepcR1W7hPR1otbIb5+xB5fveOsmawLcs7qzBtzjhcbioy/U9luxTm496JU9jNzP/jL3/hx7/9wD/+r/8Fb50mJW9cF23y43EkxElcZm90q3kWZaC6g/NFfTBTsr5710l0mvOUBqfjEdc727aZ+ETx7QHHEBNxmDTY9EZ8fn6nMKmYboTHsix8/PFHXIy8f/eOcZrJeWMcRchsrVji4o4+7q+AM+lnpW8KGZPzUUS3clm6eQ4c1+sFeme4u9PmMIzsUjThwUH8RVN6YfAeP5rSouvwDTHx9vZG8EmRFt5bxIhj8FIMXbeV5fMXvvvwntPpQKmVXCpHw/l6h5wrec3Ew0yMgVIyy1nWem9y0W3bGNLAw/09D09PxJh4fX1lvS6SAdsDVWpVu1VtlK4IwlI7ronM96hjt7lOr1WwgElb9zTe3qua4sJX4l7wn5ck1Q69nVBuVYGEwzTw/OG9HTA6IIJJPiV37LeHsdiZEQzmURRHt6hpB7FZNIaULc/fvOPDxwt/++lHXTIhmdChEVxnGKWsKV29yRAorhLQh0lHpDO+QQ5xHRgF1zzdCWZx7P3CIidvpszeLYoA09UbBu5uZ9at0EcSSRUqBVcl1fZBh1CvpIa2QAeNQm/2d+uK9yN42JaMD4kSIVZnmndBUQKJoh3aluJvCr6C+ituFTu968B0ImKbwSstQ6OaI1tTeO5yU7uiLKqb0dI3fHPiX5z21z3FtpnCScoikDS4m+PeYkfc158Xp0PcmVGhW3d2N3gBHKX1GwqwqxH1tFW7nDSQyARmzyi6IPY470olEASP2c/lurRP+8ZgIJDktZZvLimtXNuhBzYcrQ0sq6MxaXMYJnEtIeKSxye5iKPXpRGj8r/WvIlXjFHBfUHfOw2J3hvv3z8yxJHonAkHYE8eVm6cwu5ckEhgCFHx+Dc+xe/FcKRRfKUhwHo9m4qeUtLAWW2DqdXx08vP+KCAPW+w4Lpt/Nf/+n9weTvzf4n/V4IPzNOBmEZyKVDFXQbvb4pOpWT02+t5vLvTmds7W8niVS5XcopM42Tcr2OrVfyajyQSwXXWslJrNWhVz0d0dgBs28o8zzhUvnF8uOf56QlwnF9fqb0yjpMmlk2XhPPepjtILhiRKDx5Wzda324Ss50YO55OjDFRKESntbtZpEStBRfDL3oh1BRXsqKRYwrW8KUHqZpS4TQfSYOySRKRQrN4Az2LMUgyu64LKSXVYnpw5qLFO1JMbLUQq3ovhiFRc6YjtcDb6yuXZeHdu2dTQ3XWVdlP13Vl6xmPVrR1WZimiWVbqauC6aRUCnjThXv6jZQqeaOWyjROdLp8AlXEprek1q/QA3K05yw8ssNWiiKAgzOlj9yxzfMVg3bcJkFvH4jr+cw4TYRR+Lf6G6C3Kj4kKJYhG0Q0DxP//j/8A+flwpfXN9ZNCcCxd2KEGFBlaXTUoGHBUQUvdINkK7Soy6FjHzAkeFAbmscbzIW58ptrtwtmL7qq9mEWWbwrfAxWsomU7mlOguaAeKVu2GxxVS14dmHjquJRms15veDSIEy/FF0U7atUs7pgB1qnt4LrjeIEi7jehEHbwdkd7KVevRVtml5FWA51sXdTUqkOs9mWU2xw02tVSsH5atBRB9tKaqnaxGzbrU6dHN0Zh7PLn5xtCe3rxN58xRVvx7/UcArw27fbr5uF68pD6qauwzbK/YLTxSyiX36cr/DWrn7o5k3B/vvNO7HzKqbeqQDVU3ok18h17azVK/stTRqSvGL9nfOkMOCdYxhnQmjIRhVYt03Cihj09aoiYnzaY4AeBPlhog8Tf3Q6MQVa94x+4ng86XyaEm/nK4dxkIM5eFzwLG9npmnEe0fySW2LFXrsxF9clD10vb7B8fz4aJ/fSoq6eLdtI8WBP/677/BBG3ipGUdgjGqp80a811IJMeGd5PZDGnTWOM/pdCce2UHA8c//7b/z7a9/zenbI0vexBO3DZcStYj3CiEyD5P8HduF43xgGCJx2yTh2tYrw6Bf8vHhwYLUlH7YnaNsepBLa7e0SxDBRDelQofuAzF4uajtsIY9j6UxjMoGSj0QDoN9cCq9Vi69cozHm+GsN7her0zTLG2ylW1sW4YO4zTYgT5qMmvFipN02LkkfX8IiaenE9EykgiSCLpR0khpp3VALNczoR/AO4ZxvEWHaPhx4D0pRDyVTy+2RZRNk3kTnHZ/ulPP9WpTIe6Gc+6Kit6hbCu5ZBnkvA4SZ/uB9+32IaVDLpWyFcIYb9LWPV5jGkZxPN4R8AqPM1nmPvHQu0lebbsJgel0IthGmFuzk9dRu6P1QnAjTXbfW/9Brpu1qKmzYh4OOFcg7Fk93nTtHag6rNqeheogdMO+AZepFnRxM5EhgvIGt9HwzZ4lkincKnKeREFnVjWp2IYolNVMm67pkMZ7c0tb6nHrFlPuKfZ391KHVjURY4R9M+VVMbc+XY7U2pWn1XqzaDspXXzQ+ytzl7PzsN02nE5ja9gUboclgeraDZIQfKUBznkNUV2nMMEgE25eaqDWW5f5/lzolLL48f0xqLLhtX2Gb+H253f5tO/Rtor9L6Hssd4MthJfVZAybr+ELN1MJj+DgesOMWlV1WfA7T/OLpzAXOjc/mxrkVoirY1c1s75WonTQIwDwQclEgziG1KITEMipIGUksLvvKn/gmfZMofDxDDKhWysmBKv8eRcSMmqDpw2K7tLAfXIbFsmt415GAX1Nse6rKRBr9/nz584TAee372jU8ANMs713Qfjb3yE6l49aUxKOGiNUgSJpiHxj//4XzgdVZHaWuPtcuYwzaQhEVAtbKmNlCKlVVUyXC9U7wlpUFR8UImQpM2ZrWz0pvTX9XphvLtnng9EHNdlJZfGMEroovKjwYrRIKZhYAqefjwYaaNfrOyrlxfGNU0TZStsTaatOARyXtR2FRKvXz7TkelsPhwoobItm4xfaSAlYcAxBmUxEWg0tnxlmg5a/1q3VE8IPpCbAvH2i2ZXvIQYLTTQ4AY92ry+fObl5YVvPnwDznGK8jfEmBSjXWXAqbnSQieaKUX9F5qwx6i+B9cc1RXiEKGok7qUyufPn4hRqqfSKosFAuqwKMrxd+IFvNfE2Cx36bqqwjBF5bmHlL7mrZjevcPNM9BLNf9Dt8DEKlimKcCudh1yDRFkaRxoHlxVV60UNLpt3U1aqPgA7x2HJHjv8nbhcn6lNzjOB4L3uKTkXRcjoQIu8Pp25f/1//x/83K+ElMAbybE5JlGyLUwdkU8qO9Y6gq8fnYZ9PY8L10M+6Sru8wbTt5Ndnm7I5EhT9O5oit0ubRusKbT91dnObtuko6XAqop9bX1IlgK8Qs17JN5tIgLRwzBUk29CHOQT8Wkur07mi82STfozf6mx7lALeYLsIle2Ox+GeiSwP58906bU8WmaGGARX9AysjuoGZAm3upFsTp/G0C94D37RdQkG0QFtHdW//aQcHOB9zmfH2+tG7quuu6DLtJMyuSd+9/v7WdrdOvpt75cFMkAfoM+a7IdrgFINL3QcF4HiOTJapwtBYodSTnxNYjLgaGyeOiw0crxUkyiQ1jEsLhPD50E8xgr6tI7Ov1Qs6FISaKB98UceJ6oJhKUKU7+p28Mzl96zLqlkquGrxKLuStMCSIybMuG3HoxDRSt8IQA5e3C80LmVEOXAenNk7fRE6XXii5WnWCYn68dyQ3cZgPdBB6cblwvlxwHdIQGVISlJg16JW8kWIgjuNNQRq9o9jbqvM58t2vfoXzgVI2xvlg6i0HacQFz5QGei2sWRaAIaqJ1LdOLKVQqz00Tvivnhk9rLUq7dF5r5Vt2VjrFR+PcjW/vfHw+MRWM+uy0ps8BL43rstF1Z/ekVuVIW2Tm7f2bsmxlVQKRJUc6QFXTlEIgWFUbMg4jSQfLYvQMZpdvnfhnut25c9//RfatvLttx8otRJNNtqK6jb3SU666MZlyYyjTHQgBVf33eR8jdfLG4/DI3gZU5Zt4Xy5MsRNue+9KuKjJUqRWqP3Tt5Eog5JmVT75QvdJKpf8ePuZXorXVkprSoQLAZ7gHvVoYXVTdqf9V0ZMz4ElJrgiSEKQ0VbjzKE9IFpTnyEI+DHoA+1HR7n8xuue+ZJ5SOO3eValTfjla/1+dNnPr98MVKrM0+DFDIekwqv2p6CZ/KeHiPNNXwvMrXZRV0jJBfZdat+P9Q0R4Jd2nilmzZfDI6yC4B4m/b2aA2B6lIVycS5h0gAPdJbpZj6zbskYxvta/eBr/KHub1JTtO9s/SBSlX0+f4zVk9rmT0YUPHUOtUVkmfx13A7iJ1xCAbW4G1r6s3ZlqOcqdqKeJtd1Fsre7nWni4Lt8UHTIEVbMrvpjbS5mEn8y4zRlueYDz72b4urBIIfL2fac3dypO4/R52Udqr5C2+ZP/vhrQATTLl4MVFtH4TLnS/T0R66wz4o5VAKYlSZiqjBpYQOR0inkgMgzbEEAgxkuJgP+hGb0IUvHeUYkS7U0mYtuB665cecBTvKFmXeK0N5ztDGiwgNJOGgcvlwmGcGeYRuuJ/cpX6K4UBP8oKML070IuCD3OpfPz0kV/95jdEP1HqSu+OECZC1KVweTsTh8QQR3kRgtRdpWyKw6mwx7Z/eH5H6ZXXL68cTydiTILlI8R0NKd75XJZFPhpfOX5fFamXkw8Pz2Tc+XtfOH+eOJ8PfPD6wt39w/cnR6YppnL5ZXz65k+N4ZB9cHVO3EStSqsan+oQVkl3gc7ONstIM2FgM/KIp/H6dYr8fz4jlYqW1m5Xq9A143YO8vlwvV6YTqM9CZFzpgSdds4zAeuy1WrTzT5Bka2eW+ytKyLo3aZ8szkhPPkWvCt0IEPz8+M08QwTQy1sWyb2eMbl3UhRXUz7NK9YVAMdwq6oVtrtNJJY2LNmXXd+PLpM/cPDwwp8fTwSOudrRYulzPFtpyaM703lrzSUHCfsw9p3jJ53SA4hhjZSmEvGep0yRS9Y3m96OAKnpYr8XjQh6ZXcHqAnDmwva3uNpRZH7W6mkErtB8StMa6XGk4xmFQa1xKN5VP93C5XgA4nY5EF8k13yYSRUc0fA+ULZOGxDypcyIkRwqQonKRconiI3onDRM5Nsa+E+Kq2IzO4V21/gQ7XC32c3cp7zlAmo51iexQpZ0p2nBNRdK8EaFYz3KP7FEw3TgB3wFT87TmwIt4bHxdWHoJOC+PibOVbnc2926bW81QO4GgfkeS4CwavUW5G7w3DUegOhHszb6Jb/4GSUmh5PX+R5Nmur05zgvGlX5LsleDdHrvhBZoHrvUdlhI3E6z79ctGbViEFZzN9VXt21Fm0uwfKX98tkhKynQev/Fe9SDXTRy/u7vV987O5o3KEvDB/tr0fbtURcxnZtCq2GgWR/JNbJVz1YjtEi36PdcG3dRXfSdThoPdCRsiWGg9k5pzWTwDucD4xiU5Izyl1JSQ9z33//At99+S4xJvJt5jZz3bNeFnOVMXpeNcZyYpqMpGZXZ5UJkTEqPUBWvN+LYE8eB5jyH48H6QjTQpRg14NGopbFcLtRWGf0ENA3HDmrNLNvGPA6AqgiGUXlTow10Ptrl4f2tarq7indwPBxtv1ZMz//+v/3vQOfv/uHveX56R+uOjz/8TBySPEKtc7muPJykivI+UntnzasQFDtgYrTiHHZyCiWzLterfkAj87oTLh59IMxm7mhaQXvja9/A2viXv/4LUxx4fv9OklbXOBxnXTqjpY+GyBSsX9JLJre3oYFI1PPbG7V0bSNx/wAJulLQmRrYmncc4sT8699wXa63D8x6XUhBPbPXy4VzLfh3z8yjonrnecJ7T66Zvuj75JqFF4ZgPIPcwrUKDrq7O/Hlyysf316Ud4R6n3POfPr5I6WJ57gbZz6f33j5+JFlXTgd73h6/459m3B+N77J5XtdrxwPR8ZhIAdtCN6ilb3zjNMkAx3OVC/mvwjR3OydveeYEHF0qveaKrpeT9clcStVq28vjW3JzPPMPMsTkm2r3J34Keoy2srCh+cH6r/7Ay9vF9blTKsb02Hm8nallEwpjdQcrTp6dbJmeMlKBwIEj4vJqiY9t6Kgfeq/6fBN3dTc11Pc+B4dPtyGGUejmUzT9SY4QZov1AEBxWnLiwZltdZvP0Pzbcd0bBO0zQSLr3by1vSmJj8cCvar6IClm+xRF/+tRtUDXVWxFBkYJcZNGlK8bQwARZtrsIMfjHj3/TatSx0laWb1ujR2k5tk3/6G/9Ps9bhdrwC/zE+yC7cZzEcziLNSTNHUu7txEl0vtV3EX9viLE5QPiTnDMq0P2sXJISbdLl5iVekN243k2EuAzBQ6sCSTRXmImPwuOipW1FsvfeEkDgMkxkgBe8lD24AnMft3dD2Hjgjoh2Ow3Tg7k7ST8XIVFMHKongL3/9V5bLhf/yv/4jd9Gk/sE4NuSmH0IiWxq7952OhmgHOBeNvIfj6Wjepq9ydt885/OZ8/nM3d0d4zBSWyOvi34X7ziMsyZ4J7YuuZG3tzde3t6YhoHT6Siy3kQeUiYayRMEP3rveXn9zA/f/wgR7h8eeb5/ZBwT799/YIoRguebb79ljIM8cTbs1py5f3pgmiYcjlw2aeJ24tIH6+ztjvlwpLXK588f9UvPR2IIROfIXcYQcpPkzWuizlkmMlc7zNLWpxCYxif87SDr1G2DWnBBWPJx0v9uVYegN5L0er4yzhPH00GHIp0tr9Ri0Jd5AqZpYi9buZtPFCreO+6PJxE7IXCYJ3748UfedSwSoZnqCkqpuACHcVK0SPAsy8oQB54fHimmc66ls23iGsZpwuMIfuOyLuAjPkbK5SosMyReP33m9XpWFEfSNO5xN0WXbCyVbds4Hg8W2eFJIXHb+Q1XdgjyUbn9rhhpxstoSnHd+gDYUx470zwbnNNuSinXO657ruuF6DzH40FnlTPfhSX6ll5JMcpIliZKK/zut78BGn/5y585n1+Z55GWEzUbsThCC9YKtlU2GnPwCt5DxrPmOmmHZdi5mN0L0sAuDkwCu/8j8t8OUq/Dudtx5TQOQnVUb8IEM2P5lmjBOC3vcNVTvF4fmvEaO6ls5UK7M16nrbepWkGGnkRtWQ5r7yxKw75e7wa+R/N771CKyVXJ+iNl3wwM6/fOgvC8/d8Ku7O3GbF4XxVHFUusNV/Gnpq7q432etZqt1Bvv8yDktsd25IkD7BNwmA/1/vte9KDficHrhqjsquV6HT3VYzQvDZP+Vl2SKmj+HcFFe7ptzp3BrYyUuvAViS9HdKIi+JUUhoYx5mQJqYkP4UPnvEwmSBAn9dazZjapK4qXqBedwoODb2TUuD9+/e391wqR8foNISejjPff/9vtFxwMcpIi2VVoSHs9fVF+U9z5Xg44by2bvGd9eu1rCmH7qDkypYz0zQY/5DET8QA1TFMs7YDoro1qtz63els+uGHH/nx+7+R6fzHf/gH3r//hnVdqWUlHk7kbeX18sZ2WXl8/477OfD5ywtpjLx//57f/va3GhZ9YJyVI+cbzMOsHLSmZ3stG8MkwrpYU+G2bUStMInWwPVKaR0/BmIMfP7yynndmKeRLa8M8WgPtvT9W16Z5gO1VkIQJh6Pkfl45HI5k9eNOB3wKEZAeK8eyNIqkU7wCcK+w0iL3Gshec/90yPRJ3zwXN8u6EJrdC9XcHAykTmn6OlaK9mZ4qRUGFBDU1On9MPDvbBs+q0BLpeVznDDZYdxtJVcWfCvlyvBeeZxpOMoWR/ygOdqrlzXxWc8PjziumfLK87D87tn7u9OhDSwE5LVCc/09jC1UjRFuqiHIwR6qfgYhNvWpgdGOzp09KDFQBgGTYG37KGv22C1jcV7BSPWWojm1Iwh6pJ3nmmetb1V029vlfOyME0j0SdIDlecJK7Ise1957e//g3f//BvdFc5zider69mw9bPUoHNzvKtejqF7gIhNAoO55MERHahydBmk2cTGdwwEvE2T4tJ0DZmc21z2gaQKauzT/lOl1JvNFcJJBpmduoVVwVLdMS5tN7ppYHXlqHuBfFYrnb7/zvqat40tJgIoO3ksR2UtSp6v9kku9eCCpaRRFa/iV0UTnzGDThr4lCalfzISxHlp8HR+2YRFvvft7h19pffPDh9h8K+Es7gbyqi/d/pefdQTTDRxTlIGNDtIg56ew0K7vALb4WeON2pxifdSG4U1tfFSTXA9URrgesWyH1g2SKd4SatD4eR4MGHSAiJGCIhRpz13afgSTHKm1QUAd67AWHB4kOqItrlM3Js24r32npBKELyik3RRdz59W9+c5vNBPMKjchNEOmUBqiNbZUaaDocCE2gZNt5imShlJZVl0vmcllZz2c+t0bpmW8+fMfxeHcbbLzT56CaX23bKiF00pA4rwvLcuVtuTKn4QbheweOSOjw5csLf/2Xv7AuGx0Yfj0wDom//4e/57e//o1ENwaLykxYyLUo9bpWiusa6GPg/niku27BhYoeis57YpQBbCv6kEe0shzv7jkd71i2hXmccE5yse6FfYagUu1xHCi5qmR7y7y9vXC6f8AFM7RcF9JhJoZgvQqRui3ElHBxvx4s5fW6ct108N/d3eNCp+bONA9g3oSYhFV2B+OUTBLYjY3XrV5aZWAgxGQPT+Dx/sHgpcphUCTI5XxhHCtumrisKylnDjZZr+tCK5FxHMi1aGrxkXy+8vLyRS70IOiNpt7v4+lAXKShn8aROgy0bt3UTi7grpJhXEuE1DnNM7Q9ilkQRQrCBPesfde8cPAqXX7vEfVDiBB1xlE4h7aaJlGAY28JdPgU6EXBfr6r+2OIVh4THK50lu1qUewjpcHgAzVUgkv4IG12pXM8HfmGD7y8vpBi5FrO9LrRW6IUtSDjHTV7vK926BRWYHQefGPY/Qk9CIGwq+C2RPVOIRN80ia0n3M2qd209QY9NK+E3WZXhD79OshKz9xMiV3xL+KyGntDnZ3wOszNRe/sa7WW8XuxksPiQfYMVQ++mxeiU8qGXOHxdtgqQ2oP9Qv4W55Ssw3BeCoLM2zYhkPDEXBd+DoNy73CHOXWyeKCcpH2WaLa70/fNShflxy3v77YFuFl9Oz7NqLnyt9+HlM3AXuwYrfXyXfBTLux9msZURNEhqNTLGsqUXrA9YE1R3KJLNWRS2CMgTBI+TPEhDNl4B79E6IjRE9AW7yzbLSff/gb9fGRu5N8DMnEJ82UW641QhKMWGsRx2Wb2/5jtmDG3BD57e9+S69NMfzO40Pg/OWFAMTHJ+6fnjjmTdemi5Sm3uoYk3K27PnrWZyu7451uXJdr6zLosy368r494n5cGKfTl0ItLWy1dX4GxV8zePA6f6B+8uV+9OJ+XAQ2kLABzmlT8cTv/v9H/jy8iLOsFZ+9atf45O31Ghuqd7RRXGkTsN+7VVS4JaZhknPTuu4aL6M1kRcDzGxXBe2kklpEFlXpc4IMTL5A3nbRMCYxCxEqyU0Lfe6XhU/HZIZXDB5ZrUavH7Dl533HOfpdrCH7iEEQmu85ZXruuB94NQqJXecK0zDZNyFJRh6bQKDH6wQ3mK0EaxyGkZiFDwjDFIk7WE+EFwkl0q/XPjrX//KH//4B759943C/ULgcJjZSiGFwOPTE9fzmX/7/gce7+/14TB1SIoqdhmGEe/ObDnTnHDIXAtjTLSS1SRlqbIhStKqKsFq6bqI5HMNfGSKkxneGoNXmiih0UojjAODc18Pdqf12gX5AryXI7s75TiFFK19rRFdwA0KH8N5xlFrfa8V14N6ElLk/v6OlEb2EMEWzEmeV+G7MeIcHOc7hjCxlgu9Zz5/+ZlaK7HLYb7lDskb0auco97ly3Clk1EseHCNViM9dJNg72a7Tu8yQOn/s65l+o5+3KZnTcxN5GZztzm9h2Joh9WUIhzZdbmkXat4F2nmlgBwreH87nHZu8fU1teDv5GD2ga8OGzZm1U/64Km2V7ofq8atcC9X0qHENnrDE4UpNpuf94Rbr9fbt2ErsYSdE/FE2+XoN2I7H4VDDoSdNW96k/Dvmkg45q2VakNvWU01d7NGY44H7fTIf5WWrXrC8p+63j9LjLq2eXjJDNtZCBQa2JZE3kbyHi26khhUPmPD5zGQa+vRUx0O4jTaeAwH8V70rWRoiHx06cXvE/cne4VteI0S3XvVUXrTABhMPIQByrGd2FS3yLe1Bu+X5raGF3ojMPEN+/fczlfFDjpPYSBvneUNITpYyS/ZUStuTAMCh4dUuLny0VDTYMvL1/42/ff84ffzxpELOkijQMvX77gveM4nLgu8mD99te/41fffitJfZSHpTWvDCcUQfI8jTw/Pd3Q2ZILg08034m+iZd02npyFRJRaVJKZW0gMYrDjF7Pt/caJKOzmyOkxOwDw2EihsDrl8/UnHl8fAKw1TcSgFwlT/U+UUqm984wzyQfTaf8wHW54qNc1Q3H29sLj4/P7OQfMdG3FdcdWysk5Nb1PvDr735FDJHrcuF6XZgPJ5EoqyRmMSTreUjqPLEHU3Cu9NMKZ+PWueuCJ1oio3Mi3a/bxvlyIVgbm/OOISVeLxdePn8ipIHnd8+03tjWhVyPNGCeZ8ZxZFkWLtfzTamlVMmv+f65Kben9UZ00WS4/lZU0p0UT8KIPeW64mOQRqk1s8/vNaJyVPuOacIdaZwsjE193N1w1m4f0uN01MFbPW4r5FqZhiRTkXE/y7IwDoEUEj0OfGMqktrKjSCOPprb12SXhnu7jtb2KgNOD57Xlx+oVQPClqvgpgQjNp0HQUWNLly+6msG75QHZhhw2/cKU93oSt1BJL0uatNT5WlAnoa2M/reYCg7zSQtrQy22mPKIHr8hZRUG4mglKD/y1m4xn6210JzCUkjdJpXIOzeBuMwOp3cYC/L7Du4dDvMjY9wu9kOerUsMvt9la/UUUCev8WQCGLsBsDZIW2bQms7Sa5Lla4LtlVrqpNN1r6uRb53j3ojpHZy9v27VjQzle0y1/0399ajYXvbTsdgUA0WJ949tU3UFsklcb14lrURh4HaCsn6UmqvEOUVCEGKw2qa5GkYmQf5AIIp44q9z7/7/W85TEcNqPYaV7jByfrHE7xMqOits88N+GDGRAvepIGLltSaC9FHhjiS7pN65Y2niPZMhBCpLUtW75D03g0QPEveOMWRh/tHlnWzSA3Jd58eH2+/R89ZkFrwnE4nZdfZkPjl5RXnI4fDbK16lZo1ZLoOITmdHa1wXa7EkHg4Hbm0lXVbGceR2m0gDHpvvRUSBSdVnYuRMSRylvKyxCTD3TgxzhOx5IIPA9M4aj1zjm3d8MB0PMmE1grjeIDerIVMb4BuNDNq5UyfdUCFqKjsmAaSD2yrurEPx4UYB+iV6CLDMIlP8IGyLUZaJZO9SSs+DBMx6GDd8ioyL3STwVqpt9P0M7honxd3i1cITiac0irzdDAOQQ9PGgd+/atfs5aV9bpxmEZCDCTnqK3T88a2bIzjyO9+81s2k7q6Hmk0kUdVUF2aJs6fP7Jse1aMorFz8dx81ONAdw23wjxOYGTntm0M4yyiqhYLGnR2vnmLn9CaLLliJ6aItwDFaZ7kj8ibKaKgl6qk3tJYlovMgl4lSTFFfBef01ulF0c6aQOEkVoKFMWb6+JRrEFiwLVNZsFcoKt72+M4He+UGtkyl+WN2jaSNzYVSXlr0/rqvVNtZdN7GL3CIrtPEjjQoTX2NCvnDYtCYogG0AQf9NZxrdDiQGwmLXVeOUqtm+/FmVRUkOZev0PfYSDPnkLanUhaZ1lae3y5+IliZrWdoNRxS68UU4N1p9RZ8d67akich/foQLIDvhn82HrFt8CuRtq5CY3wRjCDeR6Mc0Zbh+s7R9PtOLTgQ4PKFE2yE8je/DL7z63v5fteQdq/fi+7GPRRkXMek9U6Z6DKDcLSNEwHjwIXtalEti1wXSOVqMbAMOBSo3vHEFRHHIZBeUhh4HQ44UO4eavWos09t6pk07sJamfbFryPfHj/jd7zJk5u90LlLeODDa1dGWgNEcH7ZyEEf4v5aS5Qt035Tw78OGsAds66QPbtVXBtzg28miu3sjEy6Oq03pvoAqU3Ss2kYeTbb94TUlKaBAi6NFPO5XxmOhwYnUrBrpcLvcE4Djw/v8MHz7pu+JxpXSKE9fJGa/D4+Ej3nm1ZOb++8nD/SBxGxq7K3Gp8mkcJD8554hCJMdl/1/PoouP1y5naGsfDgR8/feTD+284MBN/+v4n3n374aar760Sk2cIJ4KV8GxbYRjtQXOOIQSWslLtaV2WC8uycKRxOOogvjuc2OtQUxr57le/IqbI68sXWrNij6YO5tY7pXWmeSJGJY0G7/ApQndKZl0y26WQZi+HITvRY/WZDYr3N/nbDYrYMb/9yW+mqmnWD02jrBvrdmWeJ8WgB8fvf/cbrkZaBfSzxFZxjOSmAMPuPddtZc2Z4zzyw/eZcUhq0wuBumWil3LMJUE0KY5MUcmp1XXWZeHl5cw3HybGWY123mnSCV3FJ757K1sSZr70yrJklssXhmnQ9BEq3utCXfNGSNr6Pl/fWNeVIUbBF8FTtsy6ZqZh4NsP3yqTRjkZ+uz7SI+Wt29SSD3YnjCOBpt1eunkqmykwUWOhzv45g98/vQTb5ePOLdhCK3eieJpZjwrYH2+nmzQfnKNWAMtyJlN1UTqaweSTavNSEGFGmJ/39VGi8GmLSHtOsDUFCdNu8Vs4CXbtGS2Rre8KA+9aMi4Haw2rd84BH0GunMEu7g73jYTHdqdqt+TLoVT18nempG+3f5724uvlBF0+/rdKBEsEt0C9PZAid2rIYtdNzJ/994YDAImce23bar2jquCtW7dGGAEqpEZ7L4Lq9g1qEYXCjhnpUP2x1uH2IWlNYv0a82z1ImaB5Y1sFWHjyOlZkL0+AAxRlJIknAPgclHjrPCNb3BHdF5XIBpkBxziEmCl+AZ5wPzON4i/HcFYO9SSV63lTFawnRwRG/prxWS13PSSqFFb4GWHYZkJLKUeMG6r+l2+djv7b22PPE9TWrEHQbHRBXe3y4QQfDKpHOWVbXlzC5nH6aZXhvn5YX5dNLumPTnw7RzPPDx40deXl748M0HQho5v37hzqE05nFgXEe6c+R14XJ+ZRylmmq9sQE//vA3ti3zxz/8EWK4ff9S9w0JylYoQ+G3v/4NY5IQJIYhGC/QrRbTYsBvL75jGJIIMqWx0b0nhsSyXO22Fo64LAsxha91nX1HkfUwtdqJKUkJ4JzUMx5olWEaNXmvhZiCIBVnD6j3jAaTeK/JrbbOtmWGYcA7b12vlcuycZxn+RAw5YxhfqVVlpw5jjN4x+FwYBxH7qaR4/Go1ZFKIuJ9ZJomci68rVdoMB9FvmPEzjwNPJxOOOD1qtyV8TCTt4xrcM1F2uNamYaR/fMG0nyP0XN5e2PX7g8p2jot6K2PkeCCRZEbYh6lHz9//ogfIo9PT3JoZp1o3gdSGmX0c17qKJsa4xBJaeTL9RNrXm4YyhAHTeVd8tFeFD3gvBHtfMXUg3lcQM5wAzvsjPGMcea7D7/l5e3A6+uPOLdS+4bvjoT8Jhn1CXfLPJKzQZlS1XrQQ3dEBDlobs3iALo3Nr/RXcV1j7fyqtYqvYCLewqtoD66FCRCHgXhBNe/GrusWAnfxBF448oI9Fu+s+H8Cs0SrBEkW3XOSPcur4FGbA/OIAwXkBLLNp1m4XqucQswt80X4/xa3y8M23ssZgQUzVE9t80A+5x1Z1tyd8YxcJPEVrcXhNo988vhaf9ee4SHbAz07ixBWAaOsP8IDmjJ7pTOZoNALZ7eD1xzYCmJsgUTVii563xZmY+R0+FEcIGUNMmHkBiHiE8eH/e9WxfwPE/cn44stXJ5O0PvDMeDeh7sd2ut6hk22ZaPnuM8sy4btEx03pRhMCX93J7Op5dXQoqMhxmFw7qbabGWIoVhM1ixNplkQyB6j08DtWZKybfY84CjWpWypM1Yw6ba45xTDpzznmXN9JK5f3xg8p5tU1KB956Hxyfyllm3lcPhQClq5pymmZ8/fuR6ufDNd9+qf9pCPvfLYB4HCEGZUKEymaQ14AjDSLKhZ8uKlaH3m8x9y4Xz+RXnURW1E3IRn56fCUE5SV//cbSmuNhofdLX68I0D8QYqKioZogDPgZqtZu1e0FVzt8K7H3vlNopRcqTIQxkJ+dq9YUdSXTOs22bQjBRxHfzFllRNN2lPWDNB7zrpNRpJeOCqijx6ote11XmsK3QvCO6ePvNWi2cL2eGNHC6OzEOifFwMKhFa6J3Du9hiNah7KDmTCsNN0dChut6ucWFhOuVFCNPz8+A48KF8/VCa41l3bg7HdVQhXDG2pVT780BO48jQwj4lBgHx7auuBBJXook52yqtoEv+sQ3H77F20NdctYqHAIhDrhaSUHyv+fnd+SSab2qycoHPn3+KG6jF9XRTmrocy7oA+UFuXQzSQnq8vRccNEIYDdAD7fgt9oiIep186Hz8PCOVgprOdP7GVzRJFx1IU7D3msdFP9tH57uHK4pUjrrUcSZAMJhfoCuTCEXIlSLLDFTZyGT8kTzwbq0dyLV9E7GX2FTn6AradRd37OQhOUXg2ZulonOV/GFHWKaw40rsu8TnZRSKrQ3OIbdEW7bgHP6YLu9me+X8JFNqc1MeU3S9FtWk6gSevdf48K9Y29a8t24lS54qNvPcIvZdLo89k4OUAOgNgFV4XaDk6oddLhAwxPNILZRoQYgUmrAtcRaGtc6sG0RmJQ7lqUgq7UxTiPzNBGSSalDUK5aFN+SYmBIM7tqrEfHkAaac4wxUccBZ0R0p7OVYvXKG8PDoIZTW3n2Ui4fjC/rziqOdRneWha3TdWgcc/q0kDVXKeuK4BVJzurSnCsrZKvr0SD3RV3rz8jcZpSr0spVgHgmCbMnd2lHu2d87Jw1+4oWZ3d8+HIuq5E66RPw8RtC++dw2HmV999yzjNpBgJdyfF0NiQGaM2Gt+F1MQYb1KH0poSMp4eocur5u338l6elOAdcUzkbeO6bYLEgTgEuUYd4gGccyQvyehO+6iiM9N7UgpsB7yjuMroEjF5khMMUWsXjmtrfPCe1BtxHKi1GfnobZEVQdk6DFEF4TusUUpleTtzd//AtmZaq9Sha+II2gzCOMg93BrFyRwSjpHPL68013j58kppld/86tfsRo3jdOTHTz9zcJ2jO0rr3ZWvtLWVJToOYdamEwJ+gHmayDkrNK8LT+0dWlFN6vl84e16YRxHrvZgpRAZDonTSX0UpRbhrjjp+L3qV6f5wOHoiVHTWnMeFyMTEONA9FIz+KQ3fK91VcquLq/eGmFQwYp3js0isIMPxMkzOanLQtQwEJ1nczCkgTQk82ogFQPdBADCcxvNUnLDDaPwaMtzyVywN+F9l3oLyOtGKZ6H0wdKO3NdPlPaIgOaSxRrYCu+Ewzr9fa1e2+S6YJa5nqnBVNx2aHm+u7Aj1KC2cFHKxSna0U9Fl7bhGvg+u1i7jTLEfImC935ALgZyuw5/WV8eWseF/pt2r2BaeZVoDeKD9xo067Cm+73BFl3u+wVb9FpzQxbLtllo58veEev3eK3Rep7p5TeYpd6t8uJKm9MRBvd7cP7ddej20XxdSHqdvlCddpY9lTWW0u6qRW0THlK8WytkZuj1wiM5Bapm6c0BcsFP1IJeMssCylIvTSMxDgSvTDxwfKX8rZRKxynwDgkSg3knJlGnTd125gOR5uqsx3o4nlqzoxptIY/64Sx7mff9+KzwjBYNhJ7bpVT09ssiIbayL0Qe9DF0mEthTENUjS2LuFL8PRtZb1cCHcnevfErpTsOAXamuVa74K1rmUj5zdrdoz6XqZSGqfJkhMaPVeIjVz1P6U15iBuVM+rIKz7h0d5G4ok7sEO+CFFjsd3OK84/R2xIehCLiWThsi2rBTvmcwPlotBu131DiFEnh+fuT+dKL3RSyPusFBwzvKNEu3W2SATXEpJWSW+s25i0GOIXF8vhDtHTCOOroyTOKo/tmWSHwljsNpGC6pr+01v6Z0gyVXvt0gMrW1SWuRSNW2E0VIs3U1B1Ju3F0kDXrb89OM8kku+9VA0Wx1blSnm8e7eJjSROpfLhYfHe3xzCvayKlPnAzVnnKusxdqfumeMA+1wJIeB8/XCDz/9xHW58uHbb6m1sm6b5K/ImFW7wga3JROGKLennavRe03y3iYQYEyJraGiEnNfOyDFRN5WrtvK8TTog29O+SFGnJNhKQQz9Bhu6p2jW2lK7J7H52fazz9xerhnmAbydWEI8iJUg2KmQet7aIHmGqUV7qaZ2hvLqnpSLLlWGLU5wYO04a0CRMbxwDHd00ms189Un4mhAJ3arzKWOckVW7MK0Q5qRGtUb5N83bsidjhI0EtwNm40wVQuBHqr1CauS/CB1GOqRd3b/jytihehe8FKdhjiFHmOXQPdefEJ3GB7dp+3Jamb0khQoYxxOzaDff+GAEP/Fd/vYk/2P6VZ3tvK4ix4U7+bfJSdZkS3Pp+mbXKwZz4VJ45gV2Pp1ZE/QynAznwi+vs4k6q2eoMM2R2/Vi9Kg9IjrUVylbv5ukWcG+hhoFSoVaokVVE76OILu1cY3RATrWv4DCkyDhPJ1H6ZTMRzmI/4lEiuUFshxoF/++u/cH93xzfW1dBLp/lGnCS+GMcBonrJm3XCOxw+KhjQdcdyudB6Z5wGy2vSa7aVgsQjjV4r63XF9c7j+/cEU1XtUvRqHSshqLtimhrrRQU9j09PlGXR85sioTpTfB6J88z59ZVbkVqXx8QHbw2ZjpgSuXdyqSTbNgbzpan0S/hfCtZa6D1bLqzrxuEwazjZB7z9Uumd89uZu9MB5wdLDFDYqQsKV00hsF5XbXLAP/3lz4Irq0JahxDZghVs7RHA8zBLe9/tEd9VNV5qg7UVxmHa0Uzmw2yqhGq2b82Cra605imusV3OzPPhZtRR8qSm3BACtWjCL6XSS8clW8mGRBoGM8Do50tBqqLtutCdZ4hRBK0PFBqTYe/yRjl+/atfMaSBLW9StmyZnoTBpZg4v70xPD4ShkjPjflwYBxGWitKZc2ZrTamKJNPcp7qddMH5+gx0EpliIG7D98yjSN/+etfAblGXS3kstk6p49sCIES6y26fDpMDGlQokRv5Ks6xefjTLL6z0qlGrvrgz4Q2k4qKSnWFx8oPZOvV+bDgb0cR/go5CpsNqTAfbyjl8owaLW8hcdhLt2ig+PzywtjjEzzrBpNZ5JIVJiUohQi3VbqjleghoNtXejdSlGAw3jHnCZKudDqhc6mtZeCZwGXCChXP+6uOaeDrGLOZxK7yqY7kYaWyGRReE1hcgY7doMN98P+qwtBB3Xotr1FrDfapu7uLIlCyj3XmxnpbuO5XQHNJv89N0lbiy3aXw/q28X0lRfYvenOfS3m+frl642E7XYLdHNfe9++/judO5Zaq6/fkPRWwriA657im4kPzBVuv0C1DKA9EVaPqPEeTT6MWh1rDrTiKC2xVWguUmrk5eVMd5nD3YOwcWcy3f0SckH1vsbDjUOUb2CYdKaEgXFKTAZBpTRBr7QYOPgDwTi3FOPtfVlqYfv4xrfffUtwgeLl6cit0otiZZyZdp0zlaN3tLxRY6DWwrXIAJdz4Xy98vTwYDW8igv3vbO0omRWpzSA5pVr5ZviMqb5AGElFMlVx2lmWa5c140xROaDIKG8raQ0SPFp0G1D+P92vdJmaKVQqczzjA+CwEpT+7t66zXlx2PCt2aiCUcK8l6lYVDkeJUC7DQfqL0xH2ZcUHBpt7qCmCSsoXdCGri7l7flh48/07bMsq3893/6b1yuV373m9/z8HBP3EqxD4Dgjx0nvU2gXdhfiNHCpDpY1s00H8jLKlllDNSilNE0zkTv+f5vf+Nv//ZX/vCnP3K6P2nSoN8upb5HnBQ9qKUUQhwkTXNayVJKN19BGJylwTY1x3U5rFNKN+NcbpVmmUMuKA4gWcLrPM/4GIg+fCXs8KRBJsFcK65WjpNMLj5FnMuG7UWVeXS4vl1Z15XjUevvn/70d7iU+Of/8Wd678zzQQR0UHR1LRWXAg+mjR7HSdEdOCkjvFzJniAy1AXGYRZ84iHUIEdv16R9f3+HD3Ygl64PnLNQNh9IPrGWlS1njscTJa/ULcvXYtBFiOFW3jSM6r/W1NjYaiUFkerueGSaZ9as3KlhTBzGiZdylgGwO5pzu2uA2jvR60MTR8Up9N6Y40BukegixScqK21LtHqmmWKuskFfVQzliiAvp+sHWwjAfVUMIcy87JyJTfndYjno3bYFYy3xCkWzQ77ZQe5Kx0dnX1sXRajQLXXUO8hdG9YuFK0UQo82mesSq10tzR7oVQe27rrA7j+Q90MXUPV2IRkEhBPE0/ouPdVUrF81aervsDuZW+/sJT664rUNeJO9evsdfbfCpQ44q7RtVVOjNyGGHV7eOVr1bDmQiy6KS+7kLQKJGAZ7rwvrVrnmSm1nPnx4Z36lQHP1Fv8SUyLY6z+Ns+DIoN9qnJS+HCbxbk7SOsYY2LaVkgsfvv0AwHK9spXM4DznbePl0yt3j/JPSfGija5bRJCPguKWdeFwOlJyFfzSHclHyT+bzoZKp9fCeDyRgsQAQwriEEpnWVfezm8457l/eNDv5j1TGlnboogZB8FnqAvXmiEGhnGidA0sjUY0X4xr8o+9bTo7p3liHMbbEDHEQZxl0LPavGOeR5sEuobioqBO3zrDOLLlzOV8odXMOAy3NOPr5UqM2lpiUmePs62d1uh1z2vTAJq8TNL/+te/cT0v/Pt/+PdfNwlnEridgQc5inMp5CLX6t4Y53zgfHkjhoSPkV4Lb2+vtNp4fHy6BdV1L8zrv//zn3n//h33dyeent4pnz9X1qzazXVbmA8HQouomCYCHu9356cjJa1awXse7k64ECjVDmDnNC1Y9n90kx76UsBMNs38Ha7DXm36/PjIbOmqW4H704nDKIzSeR2kQwj6oNVOK4WcM2OKkjGWxnw8ELfMJa8MKXE6nW5EF7UwjjMlyHC4q6xqrVqD80qN5gj24kCmeaZhzlGnW36tm8qRaBSle+B9NO1/leIiRHz1hMNAo3A9n6m1cJgV7S05XGW9LPRW8Un+EWcwV/NabUtW21mujad3z5YC3G7wmZrNwCHxQgOoSiHt3rJ/HJxOJ5oZ0TSZe4KHpci8NcZHtiFRykDoK01gDcFvqsgs3aIutJ06B6EZWW1Be6AgSGc8hhRI+veNnWYw6MXGe+eaIiecNz+BztiaGz066R8CZDqpYaF1AdfV+LCbzJyT2kuBeTchKaYGtX92Xs/SCfC3Kd7hcbtyaVeQ3Tg6u3j8TozbyuDM/OTtWulfv6/MdvpuzWkt2PvH2w7h4fDNfEWW1yV5sabV0Bu5B5bFsSyRykDxkU6AFHAkip0R3QWOd3f48yLeqgNeKhnXAzEFxmlgGAaS8Vk+eK7XC4fjHWlIECN+j653QfAUDnxgmIKpkLR7revG2/mN+7sH7h+eaXUzCXQjEugxEKpMZZ3dD1F5+fzC/d2JOIysdqn6FAm9MQ6jOLk9NLNWcmsM43BLHN56IZfMy+sruWTCGLk73UPviiLvCBLCEWNgPsj7NU9H6HCYRoYoM2ruisZYclHM/jBQi4zJtWW2RWSxM+ShtyrxBuJpfdv73StjjPTDTK9V9brbRsuZFhzbtvHl82da79zdP+BjoOTCtm1Qu3o1tpXaG08PT5ymCR8D8zhJDo+g7s9fvvDTp5+JwbJ7mjgOOjqsWm83GWzJK7msHE93RBc4X8789PMnfv3ddzjveX0940AYW1Sm+3K58vz0xDgkfv75Z758/sS2XLk7PUBM7CU8MUWmPslxeAjUNRuOKk1zuGXDVz7+8AOtVB7fPfNwOjEOAz99+ahY2+YtKkMM/5IXBeG5QRknVTIyTWiKG2nojdiWqoDAu6b8d+t+wOuhrTlT1g0XFRMw+ImtVC7X601eviw6fK+vrzy8e3+DD3xwuOqhKXhwnAbOb19IQ6JeC+tyxXVHnBLfPL/He11+OVdy12t/OV85nWbuTneEUFm29YY9piQpYG8mPxCoLk6BZHpsbxeLDvzcKsGkoK7rMnegqPCS5WSvhSkEmvOs20Z3MCRLJS2d+7u7mzhhx1i7Ya7NYJ3YHaXrVpNJzRFD0vfskRCO+DBC0QRWfTMJaSAmlfr0tldeihBONOiBZimmzn3lGGqXYmz3BHf7vbsZ8RrNRHCO2vbcJRvEUXYVeMEwtZKjIh720p2+R4OjSV7KJx3kN/ezs9eyK1/H2Z/11sSof8xFbQRqwCSviBwWbQ2+6U864VL2mXFGaJiazy7A3SyoO9m2dVP4uLrLY81Y16SAKXSTqFZadWx5oBTHWiJbG8HP9B7JTvDqfvH2JiL3dJyZ00C1nzPiFOvvHD45hjQSUjR/QWOOiUttlJz1LHulCyixJ9NRdH9taqiMqPa3bCu9Nxl+jft6eHrC0VkWRcakccQFKItCF6/XKz4GHh4frNJAv0PtKj9KKbGyUXLWaxqcCr96E3KQIlve6LUTh4GYohWfJbzToe6DZ4zqhFBlsqfVSsmFw+FODFqTj8G5pEqC3pUDFQOnu3tq2XBO/jFd7N0k/MZ59a7L0iBh7xy5N5LzTCnxcr1yLVWdE4dZz4LFaby9vRGjUJnLduXPf/4nLucL27LSnePx4ZHDfOIBz+PTI703Xl4/s1yuyFckKD+2JnIae1B7U1DfXiNZa5ZMzGotL9cL3//wPYdxpvXOED3zYSb4eEtQzbnw6eNHjqcjDw9PhDSwblfuDgfBHMtKrYXJwqpC3PuNIU5yG9faqDmDFZiFGLi/u+ev//pXXv75jedv3vHtN9/w9PhgHyBxG93roEouaJMuFUJkHidNjzXz+nbmV999S82FEgJxlNPx88sXEdDP73DjaHHRwn63kpnCyBgHStG6OYRID5Bb0wXpnbwUpkbw00C+rmxlZUgjrYuEj8PA8XRiGIVjNjqn+cQwqp82knj5/IV1WZhPB4YpsW4bT4bNjj6Y2auZ21wKHPremewY7x7I61Vel4BWSzxhCLx9fmWKB4aQuK5XRh/VHoZC1Hrv7E7j3lQIH5wC1dSxULSNOc2xQ0qUriTMaOtq3GWHTbk4wXVadcQgx31rciaLZAyUkKAGCgO4M96Bp+K8olhqF7moqAdnNNUunxZ3J7e5tgW9b90uErsG7F6Qd+c27ivN1fhi5wQ/dRwuB1p0mrjDV8ms29VD3VSgHcvysbRbuA0P3eI/dhir3xL2pN7yOzmM3ODi1H4RCohBTzec392CDV3btzrxRN5p0vT7NuMcfb9MbVvBeCfxqFHBgNWR88A1B3JzVDeAj+aPMBmw/9pEZy5ISaanqMr4Cj450pBM2qrNIcZkNZuF7gP390/ULLhlmmbWdSENg2CsKjhGg0iTCa6p5z6EwOFwwnvYrpuym7rlpJXMeDwQnGdEaQA+7UOE5/x2JsTE8TjjnHxdW9nIy4ZPiXW5UnLh+emJgWDbtDgNnzzenM3DMNz8GbUU1m1lPh5pVa+pD4HpeIRWVYHcHe7m+WryPGEd6CjKJSOhwMdPP3M6njTApJE0uJtPLHkJdFqz4cuLa8y1WrqthCrH052Ujs4xPD9zPJ3oXXCZEJbItmzkWnh++obf//73nI4Haw0d+dWvf8W77Zm385laOofjgbwV4p6ZnlJkWTbU0+xv6+1ocRHDNJKXlc8fP9Jb5/X8yrat/OGPf+R4uLPcIk3LdStMh5laG0uW6/b983vBTKXydn5juVz5ME1EL7VEb50QEzFopd4jF5qv1OZM/nXP+fzGjz/+yE8//MAYB37z29+K6Nky12VlPkwc5wNL2UhWX5prYfQys63rxs8//8Tz0zPDOBBTYh4nNnNOH6aZkBLXy5VxGIhjYhoGYgr87V//xt3DCfAMgw7MshPALYkr8EpdXdeNrVTWvCpq/DDjkLvxeDgyThMxFvEpVnD0+vpKSpGYJo53J5prPDzck7eVL59e5cJOgZINT2yNHqP6ObykdMu66EBZBW0NoxoH11xslfSkYdIH0ltHgdcUhblzW5e6pbVCrU2hj71jNRwkb1JCF4iu033g5dMntnXh6d076qbgOClMPaFJ+uytf3rAkVuntIJzTTk8RFy8o9WIJ5FbIyoGDucLwWValRQa409usSxeuP7OvrrudamxH67yWQDsgYjNoMc9+mQ31rHbFBBp7kswQt/Rgg750LFtF3klunkS3P4FkI9jn3xwt01BX1cfr9r3noi+J27oH9dp/pdxLBj0gpHZUrz0HfrZv03fU626HOAWV81tBBPx0JGUt7nEsgS2LRLcxGobjgx7gldjMOi0dxH9COrsQdyTcwGfdJENQRP3nggbkz4/QxopqfDp02fe3z0Sp0kXQwo4P984yKUu+KaBsDfrcR480/FAraYuBOLgWJbMVjblP00zJWf8MFOKNmWPBs0UPWke+fLzR+7ujrTS2LL9pjEwjapFXlZFVrgYqXnVIe8c3iVK3+wV1PPWa741z1Hl55LvSBeBT+mr8gy0vZeNXippGvF48pbZuj5b3RV+/atfMx+PUnU6boS190qUaEEciavmmfHyWkyTcuRAUDy71NpqDGqtN5Tn7//9P/D0/MR123i8f+Dp8Un86Lax1copTKQQeTidBPmFgTpWYkxJ04rzeL+R4mAEctTt1TvzKCL2y3rmermybAuX68Lz05N0+8jQVWydAsV8V+2hzMcHXIdty9S6yRF5d9IkVspNB0xvtKopJaV0U+Z45+lVtYz3j0+s60ouFee7EVXiTuIQiV7wme+NZVv59Okjd6cH3AmGYWQcJx7fvaPUgl/hJRfVnU6zLstR1v9/+du/8t279zyMz5rW12JR58Iq1yL99RgjMU4seSX4aNNTZMkFHyXJi8MgjfImU2AYdPPrAyjcupbGzz9/VkHS4cDD0yNPz4/kvHI+n3k5f2F8GXn37huiz3QX1FDWG8Fw3doD3m1KK226gARbdFNIZBGG46CDqDVSFISylUowItc7uThL7UiBVMXFuJHkhWf7Ha7pmjZ//vlH1i3z+PxkcfCaNHVK7VQxgh6iPlSxerZtoXaIHhwR7ycdyCbP9K3Q2Aj9QgwjnUZpG55m2TPNSlwMv++yOeyCU9cl3fY9Ucl2wejAU9GOA5OumorQeAabum8Hu2Nfuetu0nOO0DrdVVM5NVpz1oGRvv7dm5z2F9vK7RUx65gzD7RN/th7Vv3+OssLsvvP/Z611HfWwqBAACdhba8iXAR9OXofKM3RSmQpkdoDn79cab1xd0oGU+2JtE0Ng1E/qSo+Ct4F8xzoawfvGaZRlwUOHxIpadAbp5FkMORyueK7YzzMTONkUmUNOs5JwTelQK6KBnKm3tEW5agVZZwNA9OQrEuiEdIIrfP9Dz/zcH+vz5ePdCQN73iO8z3pm6ictVx4eX3h8eFBqka7lE7xQKmVoSohN+diPRZVF1qMvL68EFNiuV45HA9Mh5kvL18IPnB3fyepcNkYpkkx4rWqs9pgz+y6gkxbZ1mufPr8wh/+8FtCnLg76rPaBwcWS7TlDWJkWxZGhwWE6t0upXC9CCkIBxmcJUSwwaDL1tDswS69M8TIb3/9W0ot6vEumRgkAKqWkeW94EEVWYkOiHSorhM9jNNEKRuX85n5eCCMI+u6aMKPgZpXnGuqATze8c23H4SNB5Fs0UUcgpvAqRikd0oR0ai13zGlkTTNLNcLb2+vvHv/nhAiaynQNg6H8SaZlavYzE2tM08j3/7qV/Tab6QsdA7jxN6yBY1hGCnLwuFwZJxU0VdKIcXIN8/v1ekaI9e3N7ZtY5pnhmFkWzIXf+Xp4Ul1m63RvDM1k8ioUpRfE4Ky7a/b8lVX7x1bzbroYuJ4POlnyZVWKofDZCocTSK9FSVYzipFWq4LS1l5wDGEpEt2OnA8PrBcNtZTZhiMW6lQ1pVaMiEO4D3jONHrZhNfotUiZUuQ+uy6Ltw7TxrUASwVjGX+Y07hLmgq+gAmO3ZBpCB4ko9Up5nVu0ihUktjiIpXyMF8Lh6sz1WGx9agVUWNE3ChwJaJQVp+HWSO6gciIpwLGe9GYdPIFBf9SHeF6Ff6ttJQMdOO/rte1HlgxLE3TD64ZgS58RNdhOkuicVB78Huh3zD0vWfGl8ZYEE9DmTI63Y4968bw86FODu0sUto54x+SXjvK8xXJdPOT3SLhbBIHMwZ3eMt4BL7O3sMYKP+QsXUoQV6C6xtZFtHtqxU5oYHF+kUdQpgIuYufD6R8OPX3C1xWk5ySzu8nQ2EyUq1QkhM48QQE2stDDHdYnO4v+PdNxOH8XALoay18OnjT4QwcP94YhwnGlkbhME0O2mfhsRylSKwOB26wzQyjxNvb2cub2daLdzfPzAPJ5TdJVgt9EpKI+t65fx2lkHOOSvLa+QibjBvhdNhZpxmJQm0Rl0bKYH3gWVbOVmVwrZu5Fq5XC7mVzhQ6ZxfX3hOkeo9edusdlnFSNRN79C6gXPUstGqmuqqTRA3EY7TM1tzRR8bNWmmpAK1nDflNTmp3CbjUEFpx9F7cu+kLnXU+e1MSZHTdOCyXIhpAGDJK702sxeAa43leuXl7Y3H+3umw0HqJgc3otr7wOF0lMUbOByFa63rxvF0L2WBPdzRKv66kVrBR2LQL7hHEXvk4O3NsawXvINxPpJi5NPHq/iNw4HH50dNC9UCoVu1aNtA9JIm7loO7wKH06RI665sInXzYlJQcCFyd3fHcT5oLcdxXq/cBavq7J3ZwePTE2OSYuYwqzC91srT+yeSj/QQCa1xOOjhzjnTvaNsmWXR5eAcrNcrwzBwNJzYuwvee10srXNZLjiioLXeSOPATz/+xOfPL/zpj3/gMB14907vhneeaRwoFoD4/PTE48Mjl+tqZLiiMWILvH75wpfPnzmcDkzTQXHYwTgLq0nd1VwxBVJJcu8WKUckSW7mcIDWpGYLcbC+DDuyQlest63Xws01gffaFfHsdDkE58ilQVQE/a7oUmR7RN3A4Elys5cqmKRVnE+4vYeh7hCRF9LfKiFUqpNqJ7qRNKw4Kv529CkGzxv8s8/w3Vzh3YxlnmDtbWamAsOeMqoQjRb/YeuV6xS7THwD3+STsTmbvbPE1Q6Wp7NDXL1be6FtzK114i5ndb+4Fm7rxe6+t0YJw5uaM/ksUqB99XHY9tOhukQz3qb2SN5GlqWBH9gqODfq0nN6Xaf5wNvbG70UfIg0+v/p7tr71HfpdvJB9z7tFvkUozZ4uYhHXBMUFYdERfH1Tw8Pv3gfAodpYKuOx4enm+BgWVYTgVw5xBPR4v6T22XW2h5P8yzFY/ByqzvHw8M9wzjjnafVbDHrAerGtnfDd8d8PDDME9TGsiwM40h0nmtuzONI8BZVEcIt4gdUA/z++b14x3mibpnzcmE10y7OUa6rJDetK5zQ6UxsBj2dl4XD4cBwOBBy4f7p0c7OTjKfQ72Zdh2Xtwu9w9PzI947Sm7KtWudvBXmeTaF4VcnfamVvK7E45G6rizLynx34nh31BjiHcM4gvN8+vyRMU08PDzo0t4sIdr4nJe3N8Hf9mzRinCzaRQ54/3ubHZ2eDSGYQDvCJaF1F2/Re362mm90Cy3PbeGK1llQnYwrMvK/f09Kcow11qTljomaDCOIykpwpZuMQzeSkY6uOhZrisff/6J8O23nA5yBbfaaLWoCQ9ozRGCohsUDSLj3mGvJjWDRq6NcdQ6PIRIHBOHgypagw/gbcr24mxyqxbQhta1ZWGaJk4nKX3O5zdCHIkxEDbP5XzleDjI7h8j//rXf+X19Y0//d0fOKYDL29vFoqog3SaphvAUU1mGVzQBO8VWlb63lfRyWWjlcKXlxeulwu/++Of1I1RFpI3x2y1Ep8uRceUBkWM7K9Xs1A3+i2hMsagVb07w1ar1Tp0XPT6fdAFUlE65bZlnp+fqd2ZaU9qmv2W8T7gfbXXv95m5jBMlHalm5RZvA2kgJy0ffcXCIuvWNyGkxIFtxEoVDa8W3U4u93hLNHpHui2/5tqkI9O56/kL1+pWTPseZQK+1UV540wbr0TDM5xXREfe57SjV+wn8M1bbclBFyVx6M4r0C3XdW0bxldfEbfyXn7esFJy++9U+9EMD6mezpRai8XKM1Tc1JgYU1ci2NZM9PhQPdmeuzmh6ATY+R4POrfO3Sw2uvknHpLBufVlOiVmJpqNxlxF+9guWfJ4N7mOyNyWedN4pPeGp9fX3m8e1DFKIqt8PNIsNKe8/mK945hGBQtT7j9nM45Hu7uxHl2R9lWWkrUqs/A6XQnLrV11m3lelk4nY7swZ7RB/yYiDhc7Yqc8DIAuxAhePKyMU+zImiAUuVy9jZ0SBmm88RPM1OtTGngWpQ9FofE81EX2HVbeHl55d3TwDiO5E2bVa6NIXmWtvHhm2e2RTL+4JsN1rpkPEoLDjFaKi7EQb6J+osnFqD1TnTgfCBfrxQ6vRSGOLBFhYwe7056bku1n6MQu2oaQP0US9m4G06MYeDd0xNrUVVz9JYc2YIjdkVGXC4XuSBDlAEFJcGCoJZuW7e05p0YPERZ5ntHhTW1m8sXXJAb8+HuAZ88b6+vdoDDfDgSQmDdsr5Hd1ze3hjHGTcp4KrsrkI8MQWOxxO7u9R3R3Eoq926oNf1KrVOGoXrotTRcRw1UTjIOUsiGwJrWZk/fKvckyIs3/VO2QqXcrUIjcaQRg7HA21upKvCvsZhpLkuhZfz/PTlE87NRBe5LlfFn7uIS47XtzM//fwT/8s//mdSSPzpD3+g1c40jDeMe28VK1Uqs4os971VevdSH+26bhx394/8MUaWnMllY1s3fv74E4P3TNPMdDD8t+rCz6WyFWmmj/PR3sNqR6RIrr2YCTo1N9Kg+bxXm4J91BTcGt68NHd3d3z77QcZMB3EnmQu26WY9vu53d6LqUd8oKUoGtgm1mFnaVslOlMjhUTD04tKfxzmn3YJeoW+UUuk9o0hNlM/FYph+vW2aexeid39HGj2f8v/EH5xoXRdEPuZD/J+tB2n3/+Lt5QCu2CKkcSoJ1s8nbfOBy9IyxJs98IjH/YD3FnIH9AFArq6q6MUQV+6tshKADdRt0hu+ozlikFM+umbhzD5W56TNigLA+mmsgnR8qus6MgFbYwt41wijknprM4T0ihVm4lL0jTzdjlTS+bu/l7S7m5x4k5GzXmeuCwLvXfzWjl6LVzWq/iBu0fm44E0REpujPNEK5W8LAzzQWnEpmCUObPDJj9AtdSB3jtlywzTyORGrlylPpoPJLvk5ZuSetL3wGEM+DjgeuPp7p7z5Wx+K93W3cE4TqozQGrLrWTujnfgHNPpxHfjyLZJvah7P7JtC3/585/5+aePzP/LxHx4oqNO6eAiznemIRF8wrQ11KpNrteNLRcOh5lpniyB2x6HWqlBIZyn05HaJNmPv4Dkcy6s60rZCo8PDxzGkUZnWRa8UQAdmW4f371TOm2HmNDP5MwMCUxplKKrtj0CWdNVa51xGG+FLT5YZaGT6mW/ZfcIZ993uMHjoqc0TfZ7CUpMSe1PueAsenddM84XDtPINA6s68LhcAIcPnQOx5MeXCfCsNWGqw1ioFd4vH8kpkjOhRC+atars0MgREIwF2evXC5n1suVx8dHYpTn4tOnz7TeFDI2REouXMqF1S88PT2xkqE1rucrETje3cuZHQJ0xWQv20YIgS+fX/HeM8wjvChV0YfAh/ffaPoyruR0fyTn9QYHnQ5HZfwHL+y+a2OLPlBrI3rpxdvOKTRFa4vQF4Y8DJEYHxm3lVozpMhyufLz5UIaEt9884H7O2XU19I1pXg1hpVaSUOkFZmSeu0Kd3Pgq4g/bzW1yQfeyoIr4JKkOcErT+nd8zO5yoW/lqxQwt7p1QDCoGM3BKlvtlKovRF9otEIPinunIqEO0EFPX0/nAXwexzV788FOB/ZapOem4HXt8L5vPD+wz1pdLiW8bXifTViOAuytK+rOtHKDgyFm+lNOG83poTd32CwpZRL1im9hzcZG92dtX95VUzu4WnNQt+c9WS3pufIB324ZQwDiIJzm8Vm90GkMQHvPFuPbDWpryTD1kzm2iPOR0E3XkPbfrvt7Squt9s22Jt+Ftc0Ve/mvf01qL3gOowpEpNBdD4yxkgaBsZRAXKlVA11w6Bh0cN2EWQyT4MaAWtlHkfmaSR69YJ8eXnhL3/+Jz5+/MTf/d3f8ae7PzKliT50rtcrL19eOZ8vPLx75u505JoL23VhGBR9XVxneT3jYySlQRte0HvhomqHS85cLmeCj+rHDslEBZ2SM8Gbe6U30jwSt42as6XGqq9mGAa6CyTvyMDlTY1t0zAJYh8GXWIW862a2Mr17cJ3333DmALbsuFc53Q8iDeqyrAieOZpotZq5T9KqI4uwGFimkYr3JJasLhOapUeh103QM5ZHS+tkVzgeDxQq+DbWgvVtry6ZaqTXD04L6Ou9xZ+mOjFomfolCaDnkuJbduI67qqvzolDgf7ZpbYuv+jeAmLcm6Yc9hI5aA4i2hToG+A3UbDOBPNyJbzhq860O/uH0SamkPa2029LFeGYVT+uXc3CZgbREC+vH1hWTbu7k+EwVbCLbMaQRRjvFX/zbMm+23b+PHjT9zf3fHEIwGY5okv48CXz5/pwUsDbTlQx+mgYD0zBa3LyuFw4nQ60op4iFIKb5ezkl174+PLF+b5QOmFYZz48vbCelkZxsQ8z1RFzfK73/yG7969t4hrnUc+eUlNS2FIA2XbKMFxOhyMeJTuXiRmNyXIrRdQeH1TIqSIxcTj8zO5Zm0bJkve29HO1wvOReZptrAx+RccggnkHg0seSP0wDyMuKZdo1nsiicKpumNsik0cQwGP+WKH4MdensyqW0StsXFEGnrQqkbveqCdB68EakdbpWZ0v87m3AcIWiyNnZZdbUm+xvGIyGNuEG8U3OZ6jKtFoJreCdXNr7jzVfjvTyt7kbeajoDxVhUJAff9y1923DzL/g982mnDuwzkzuC75wuUppFblT0GjcvQpKKjxHfoxJUQwA30JsjtKAUVDzez+Ai21apPUmvTzMfhhdP5DvLm3wH02BkqG43GiarpRO6QidxwvNDUJZayZkaJGX1g8Qee1po9EpRGMfEPA2mhnQc706kMXJ3vCeNUhD54LheLuI2fcDOZQ2PSTDz9//2b/z1X/9GGiIhJVp3UrmFQK+dz58+8bosvJ3P/Onv/h3buvLp8yc+fPj2JrN3IXA8zIKBvDNoteKKVIUepeimgzmoS2VdVpa80XLheDySEITWqgQ8e4lSCILLHFJ45ib56t3jPc4rYr117DOpKoQQpBQ9HO/4n//xP/Py+kItjZfLJ9bLwjfffoDg2daVYRwZk3lP7AxcFnGO8SjeqNRKcvIn9dYZ48hWNwbbiHOpjCkJtagXvHeMadCWgba2AfkpwuDJW8G6gsX/uc66LkQfdIbklWkcdUkNI9MwUFojjqYKyrXgmRSlkQutVsVAmyqm1mJuWW4YWW1dhHfJODOCXS5n0jBqeqJxuWz0jnDH3rle3hiGgZ9+/kQvhcfnJ7UxlUozDGyaJimiGqTI7RJ5fXlhy4WHh3t9/1r44fvvqa3y7Yfv6LVyvS483t+bCqTzl7/+C//03/47/+E//Sf1P6REc45f/+pbvnl+FgmVC8FLehqdDriQYFs3xmnmcDgoF6pWlvOVcRqUJHt3z08/f1TKbHDcDXf885//B3/+8/+g9M7z4yPfffhwOziOxzvC/YM8Dp6b/PXl5ZW//uu/8R///t/TXWeKSVfAtpmMzwjo2ileUrWSixHywhmxyae2xjyNfHj/gfP5jcN8UMxF6+I5miMk08F7NOEGeL1cOEyTAvkc9D6YwUyQhNbhQApRQoFWTZ2zY+ae3Cx1t0mJ4b0mFsE5Oilc08Pb+8i6ZCs7gtg8DFiYpPK5QDI+F61JrmXWTVhrMEx+9oNh8w1/usNgfbW2+Yj3A9SsLmevKd13R2kbMURVvgZT3/XNOIgOvemA7x2Hekn2bNdgEd0gVeytMW5X4TlHK+Z6LoLpsoPQA7mpJwIPLXtqK7dehd4gjgMpzjjnuTrY8kZpMEyT4NTUabkZVDfSXd5ZaGppjMNA7bCVppykHapoUiPV1nBB4FV0UY5sVC7UoziKcRaBuzfBOeeYRoXIxZQIaWSzLXqeZ053J7z3LNervAkhsgWFUMYkOLBieSDA9Xzl8nZhHmfuH+/55t17alZcfa2V492J3/3hD/z0+Qs//u1vcjCf7gSBm6AGr+9tUgRoCgmNKd3ELG6MHOIdY5JR71pWVQ5bqq6gtT1+XllMtUlgUXqhx0AMyFvS5BMaJ5lycdBy0fbuOst14XA8AoP4UDzH6cAwTfz0wxvT8WDPQ1WNwO49kiZB6V728/QsWev5fFHKc8Jgy6p+iiCnvouR0rsZoJU0sVUJR4agBOkvb69cXl54enxmWRbmSec9dokejyK0g4uUsnG9LNzfnRitH2OMSVHh4zgyu4E1b/qAt2bThVbliJroSlWGfS1NL7DvUDulZgan6sxlU5/C/eMjed1Y88YQB1wMjC6wbQtvlwvTkJge7jge7yhWgOGH4Wb+yLVCU0zE5e3M/f0d7775ht46Q0zUWlmumupTCNpoSmVbV/kDnA7Pl89feH565u504nq9crle8b3z8PzMw92diGgHW22EdcOlQbc3gs8GArmsChIcR+4fhW/GGHl7e8M5x+9/+zvelis4/fuHx0ee372TqofOPE7kvIkI7CKmtloZoqPkynZZWN5eKb3y9PCEA14vb7xcLjw83OthbNroFO0bRDi3DlUF6MHBukoOuuXCdFTrHkHql7oVrutKmkaGoA9/6EixUwt//ctf+O1vfsPD/SPdQ4ymxjEXfvAB3wutdCpZQX4W9eyplLypZMWb+sd7QZINYrfIDuORaKqiZPa8nS9yakdPdJ4WO8uqS5cg6MOHgE+O9XXh7fWNw/HI3ekkotj3mwop9AANMpVAuFF7Pgy4oIk8OHUc5+ZoBEreGMKkDygHXKsseaOW5VaclaIzPsMk1t3pstW+gbMNxePIdHyFQqU1p8m/6SDu3alXwskj4pIu3bxttDCS5oRzkYJgC98FZ0RLV5YktBKCmul8L1TTw7tuBUV+oCwrmOT8Bq3ZaxGCyGD5MEwd5Tw+RY6TzKU0wZsxBSKRGAIxydNzmEdKrVYeFG+kLgY70xrTYWaeD0ZAd3JvBOOmeu+4oLDL092Jx+cnfIxsmwaMMA3QOsf5RIgDh1lbYc2ZOEwWTlfpW6aleBPY5Jz58vkzd3dqVKuhaFPritwJlhMVSiavhRDUdNl3cQWVNA6kLrjFIhfVj2OXawrBNgugVq7XC703jrMMbd5FTeuDN+hGEOHz4wdCkkrT1UoYRxmLLQVBplAJS4ZhUgV072qZA4soB1clAFE9gPiFsqkdL4XIcln54Ye/cf8oo5xrjU8//si2Fb779leEIbEsK8475nFi9wNV85qdrAVPWhOR4811Iugm6l6NVqVpGvEh2HRqJeBYR7Bz5G0hjQPeil+ii5Yd1KF0aqzEkOixaUJy4FrHD555mhnHyT40gg1ECq1yIVtB+DgJP7y8Xnh9eaH3xvv0DaVUSqpW6+n5/R/+gOvw8fNnhmHgw7cfbomwAP/Tf/6fGQeRzH/729/4+NNP5Fx4fnrmP/6n/8j93Z0+4Dv0EppxM5pKFJ2tZNzWKqXKVCelh/D2XArny4XkA+8/fODp6ZlaG8XkbLt/YwiJSiGFgZYt/K517p6e+I8P9zwcNQmvecV7SV997+TurNBpY1lWdVrnzPnyxpQm8nWhpEAaoxHaUpM0L26ha7y9VaP2pgMPlI9TQ+D+cGTNmdwKoVlsRZBD/nw+czoetRnEwFYLvVVezm+c7o701nh7eZVv5DjTkOKi1ypyzYQP3nn78KlnOiVJYJdlhagLRPCJPqAhDqZOEqaeyyYj0vXKmCameZD73Bm009V/7WwL8T5SkZTWOZHFrXaTJsoRHucTLcg/PTi58tt6Zms6mFMKxCQTXyWrFnv/LGC8w80QpvMm+67DOwZSVFBgbiLF1Ueg9Fx2wtGtJqqKisPoBg8CKYx4JAJxruEN/xaItMu0tLWDxCTjpMRQpb+aSo4gjhFT9OzQm+hGUyZFvCkPhxQtyTUxzTLLDSkRUmLdzhyOo2n6TaYaAsM8KRLDB8Y04H2Uj2C7ikAO+jwdxpk//v6P+ASEQHKBHAQN91LISAHnXeTucOS6LMpUalIkdeBaMpND0DjaQL/57lvWNXN+eyGGSO4VamccJ3xTVEzzkeLV356CSsuKTBvm32gEHLkVapMBrZo9oNeKj2amXa/2jEZCUuKzPDWCTmlYQCPgBYunaYRhoNvzsOaNcRyJ7mvu125gvtqw643TcXi697RaKLlziJKyZxvgSi/89a//wn/7p//O3//p73j3/I5spUlxHOkdDsPMula862xlJaXRODb9mOu6EpI4v9okUArNa0hpBgX4lPQAe+WUdzC+YrjpqvGeMAxc1pXRsslDSIAml9PDSQ9nkVZ5J7qdZY+4bv4KY+VxUlfUJvVQjJE98hjgcH/ku+HXnF9fuS6L5acn4hg5HHSDX69X6pZx46hyE7rMXNEzh1HqATPANaeQr59+/onPnz9zfzrhOqzbxjzPjOMeLdCgCj93UVj7tm74GNhqxbWF0qsI9FZ5enxgywV/vXItmeACwzDYzSwS1yWF/Q3DQPCV3tHvEr6SsS/nV67XhU5jtsDEYbAa1bpPOJ3z5Y0vX14Z342keaSVSq1S6Gylcn57IwTP4XDAdR1qwyi4cHfV6vYQ9v7w+Ewu6ubeLKY4da3VaRiVQFAr6/pG6ZW3tzeW85W70xFCJA3RoBYvOK03ldQXwWItRjvPpBpppWpTG6z7d9lY+8oQEzENtG6Te+cWzOa6x7ugbbYWYLROZMmlS3XQFAW9u/X77r3wjpaLxVmDa45pnHXJW3WvN3hpnEdiH0xNM0JQBELrkcu6MiQZF7vlVxWTVDsvGMk5TwKc0/BxyVdK6cTY8K7fNiSBEo5o0SnOeI79Pd5KZRzU7cA+VFVp3ZvDPDfqr44+WG6H5Nu9d0X+NyRZtxBHb+nGwbak2gopDeywc4rhFuewLpmSOg8PjyrxMc4lxV0YYkCNHYZjHEw9s1P9egZAiqFm0E6tmyZiF/CtqTudQGudt3VhHEa9Pr6Dj4zDLGd+24hupLXKcRjp0VNzoZYqHtEnDnMkWRBlLcXiNnbVoKNHz8hgsJPBhE35bt45SllpUVN/7x1CIqIq0m3bIGd9fuPAMMkXRq94Y60EyXcNXHmzylPlWDXnLGlWzvmyZm0bB2/qpK7hWysfAKVVXl7fuJsmhoMCEJs5prsNnvIhFT5//sTz4xMPz480i0J/ev8N8zjeLqa7gyoI3q5vTMndxBjeC0LuWyeM4pFTh+t2JZac9SYbC76nDbb2dQIlmKKmKu6i9cbrl8+EhwdSOpJztV7owDjO1FLYcmZIWumojXVdVUiCI9SmS2QcCd0pHrtW4bOmr+3NWYIlemhOMpEVcwSO40DeMjUXXHA8f/NOh/0qOCsNiYfjvX4Pr797nA/85Kym00lKqmrWQmqDeis6pO6txa7beufxUW/sMIxc14VeCiFEjnd3bMtCKZUxjVzOF/7pn/5Z8rPTkWVbGUelYW7bRqWTuhRf4jvtI+XUa/v2+ibHZFB/9K7cAtiKEi97LkxpIj1J79zQwbNaO9aPP37P+Xzm/bv30MTNYJti7vKUJGuvK1VZXcfDjPNHtfE1xV0kJ1JuTAPJR671yo8//MCW1Rx2f3cHsm6pgGrJLNcLPniGmMxDbFMh3By6Ak2qEcNVA0jyDC0oKK83tusVphFvAwQOjseTZUw5hl02bNN7a93MYPrA9g7dKc4hJf0kN+jAeXwc8KM+0NENhk8rUXYej3bItK/KE+0VeIoMni5QXFGekUFrwQX63mrXTfhEM229Dm/voy66Dg6ZQeldvfAumj9AWHVZV1yDeRwhJS7nN6noxlmXScB+/kApUm6p21k9JR5v4YVOg4j3Xy+JGGm1MceZcUx4r0N/H/q898zzIkHIqC2wmFHyeHfS69v3NkEn5ZTBfr13M7pJHRl7sk1LU/paKslLAeYa+Bi4Xq+koOw2S6TUhRc6YYx0ogVZVqEWTgkPS7twXVeepyd6z6xrYauK3I4pcRomPE38aats10Ub7DzfMsqoMvPVKOPg6CN7vCJUXl5eKTkzzTrbYtAQ2XPB9cE8QDKn7gGFraqgTQI6qaf2fp5SC84FxuN0q4mWL0IQknOOnjPbdaXRefvymbJNPKV3DLvct6oZ8jgfJU5xjX/4D/+Bwzxxmg98OZ+JQQkIzjnWujC4EeeDMvZqJRvflPPG7Gfujid71qXQ+vLlC3nLxNfzqwLn4j4JijyJKekFGQfJPpsePuFhnnePT7ghgrMD38lso6pMiX97rZpgHCzbAsDpcDJzk4Om4nXX3U2aWFu1ciOUFRMiDpinkWVZbaLTh2jnUKZJ2u23tzdiitRcuDueKF0Be6fpiA+B0/2Ru/lEnSrH+cjD6UTZMi6o5a4WlXC0oAkx+sD1/AbeczgeGLwRfathdTFRW1aaZV65XK9M08Tj3Yn705HmPTlnogtctyvTMJFC4Hw+M9gGUasuhNIqn758ZiuFFIUBBwv+yxY/nPNG8ImlrPjowTvq9aLWKuv1fXl94fPHz3z73bfc3z3qsLOMeNcV81Brl+u5FlrNxKCQs+5UfzmNI8u2kVvRVlkrISD1Rky0ZWWIgcfHB5xTQONlXShbobVySwPGO5KLdDM17jlbpTXysjEeJ8lInSdFYd3ew7oWuimhnOu0pg0gDgOPj4/aRLpMSLu8urVGCP0W9ldatYlUpqgxJkL0ZJP6jWZg1IpvmIs52naJcUhKEu6rNfYFzzwf9GyjQ2rfMnYoTWnENjVb5ek4H26bRnTBvCYodbkbxGZSbnzEtUx02qjOb69KHB5Gehc567xkmiHsRffyL13WjVoy0zByeJp1OQ3Ctb1N/t5HmT2d5/9H1X82SZakV5rgo+wyI84iImkRNNDTO9M9Ivv/f8V+2p2Zlp5GA0UyK4O4u5FLlO2Ho2bZA0EJgEJWhLvZvaovOec5iUw/aPyRc2Z/ODQTKXR9r9Abo8vNNyl05yXFTk023Q8DKcPr+0nL6N3IbpwQkUVgFN/GXzEKdTJ0QlBnJJhp8eNgLYN3TVnZcuFLVda8kToqplV+AtPUlNUytvF4WlXwXk9XOh8IXUu6o8r4ayRPz0XLcYoRu6kfWLcVlwzBBnXtRfpBqiVtibfzCec9u2mvd2JbNZJvBr7UFITqsKAfJHdd4sb5/E639XRdYH840jslWsp/gTpvp9G9M56tVraYCC106OXDB4ZBBOolJXwLWasVYsuaCdbz8fmJglL6utCRY2GtUbsNQ7vQ9T2mFmdo23grlUyN9Z7q9/5+4vXbV56eX/C7cdKU+E49tOTm0uX24KKZmW+SuVoK3OZlsbBuCzl7hlH/7K2K03jJskUdpBij/Ow2cjAFtiSMbRcUen7b9l/ma1umeFIqrDmztGjOdV25zEvLdVZl+vr6yvl84sOHj3S9xgFpU2a2sYYtRXof+PGnH/Ft4eM6uY8DIrHi7D2y0BhH3BKvr6+8fPqAt56UEyRNgL2XGcb07WBYV7brSh86/vk//ieWdeF0PtH3PaVot3O9zvRjz2W+sGeH7RvWIWW2pPl9H0IDo+kQM7l1GtYwDKNQ4kncpVoyS5MJHvZ7+i5wOV+0lD8+3kc+10Xa7pQzvQ+E0AxJGIzvKE0JZo0MYtKJF3KOjP0IXpeY6z0fP36U4iEoAtaUwrpFrpe5tfyudQzt0qdqFlwS8zwLdugcOFWhSsZycuvniLOBrvPS4dMCg1pFV3JuBYv4SwmpvLa0qRKvtjnFxZHSgS0tPA5Gv6NrmRnah6mG4zaCM9x/dj3I6h+ctzLfVdFjb0JXYzThSdT25xnWuAllYDxb2igl04cBYw3LtgjuaGiub4OzPc4VjbxKafTc5sAPA6lPvJ3PvDzKZ5CaFN0242jFYo3gldfrVYqUviN0GmH9PiBvgMuuux+W1jmsdcS4cr7MjNPAOE13fEPcNlyvwib4QOcD1UK6LBhTmecN7zs65znFxJevX3lIWhxPdtQ+Mislct024hLJORKGgXHw7WOUSCT0gTVtOBPAVppCl23dwHli3nANcFeLUB8GheNg5NnQUt6yHyec08I9JVkcjdEzsD8cNDZqk4qUKx7Iq7p8u98RjAEv71Q14PqO76fvMd7f93Q+9Hp3S+W6LlCrYoMNd1xJSYVf/v2vvJ9OVCpPj0+M4ySFWKcMditPAQaNeUuslJy5Xs94Ywmh10FuDEtUFHLXpgA3T05tbLzcZOnCggg7k3Kkmk4dU6soNIYeGirGyhCcEl/e3tntduz3O4IPTLsdw9DhndfSeVlWUk4c9ocW0qHbN5aEM52Y8cYQc2LbVs3tqxQrneuIObKtsQWYB0lnkXV/XWZcM9OklMkpSXppPWEQilzwt6LAl5KpWeMczU4TKUa6vmO3n+TMNnA6X+g66YJDFxinkf1hx7dvr439LrlmzhptxJLwXS+3aImQM1sufPv2jXVZ+OMf/wjG8P7+zsNhT997Pn36ROj61ppaYtzIS2J8GEUh3fSzXS4XhqEnpkRJEdM6hMfDgfM8c/rHidfXbwTfMYwTD0fhCWI0zMsCpnLYH4DauFnaG2w5kkvFYcmm7SSs4Xx+l37dew57EXW3lHg4PBD6XrLXdkh44ylNeaKxk4Zcy10Zppmo5KP67hX5aoltobbFDdOC5j9+/EihsK4L1XvJOdvOytt6b7nlm1GIvMFIXqsxOT70rOsmtcckxHO1jQ11lyXeDu8GxKsVI2eZgH2+klftErxzhE5GrdRc4nGLzYhWMQm6QRnUREMi01V5DYyUCpIU3xzSukP1HrR7I7VgH9sOeO11Gp/JVHLRHk4/fL3v4HIz0uWUqV2b0VvB+jRyM8QtYWpbstobNdew3x24Xq+UKtOhMfLFl0Zczs08NvmOw+MRb8M9qjKlSE6FaRzbmEod97KtrVqX8u75+YUQAuAIoaHBMXJQB6/vqY2PDruJOlYul8sdWbGlyP5w4M9dz3W+cn0/0XU9IcDlOoPVGWF2huusIlLGUHMftyQiNSWyoZnSNG1wXYcxDnIkpSLptTMcdgcFouXCMPaQqoxsbXzsc8TQtQLLKrkPjfrHYbhLYH2By/XM+/nEOAz4bSO0c+c6X+mCKnjamNpU05I6q5bWQNxUrYfQFKDc7z+2rCJmHCemhgm5XWg5CddjjXZqwWrXNnQd04ePpFJ4f3vHJIk6luuVnDMfv/9eiq0Gfcw5quu1VlHQpbA0Flfn++YgL7qAgeuysG2RZDOh77HV8vn1jfPpnfl6YRr+SD90DP0TIXSiupWb1rYpFSTd1EIq0FQpXrI5bx3J/g5AoyJZpRlI60a2Dmcb36b98gUwObW5ayE7S+eHxo2X3MrUpghp7fc07fUAVemuzc42GabkW4XK6gXoui3dpmnC+8Bxf+CWkW2MZLnWOnoTiHGl7zseH56xPhDnd94vF+K2MU4Tz09PfPv6leM04UKHa0vRUtVt5RixgDeS3Zay8fr6SkqZ6eHA+i7WfGmzYaqj9x0vzy/kUpivV67zmbfXd7rnZ0i3CtISvGNeV26BOKVhQhTQY3S6VkhxY1k3rJN5xlmngyQX9rvpnhS2xowPEEYt740J6oYqGG8InTABtornc8OcqEEXgyk3BZpt5ybONcRDaRWxFDPBOGwVwM9Z+/sl1ZbjBS3pjZHPIKdE3Da8c2wxkdaVflTs7O8Roa2LbQ7QG9b8BjkyFbo+QBbB8gZAC10gxdSMaXJH+6B8gZKEiryZ4RQHapuiTYW3bbknoKX0zVhtELkzN/GFd6apqyqmaPzU7ndijHLPB40VqeAmVbrynlShv6sq3T507RCzdxl6ypE+9Oym3f0/A20XgSVF7Uv2w4gfep78jhtw0jnxympXmcZRFWTLNd+WyBoXxdJ2PTZ4nl9eNOtuuzYoYh/V25hC3eC2Na/RON1T8eKyaQ819Lyf3og54QzMl6t+l5jxXp+zC+ric/FUGxTEZR05a2dRN3ml+rEHlFdiXWNHBceXv/0d1wUe9o+8nd748vUz//Tnf8bapuiLseEspLKTuEDqQo3SPaWqC8cErJcRzjdT6zJf6foBkyXOcPbCy4ePEt5s+j1D1zf1lZbL434iuE7ClhsBAnlO/vmf/4VlvuCcV6dxL3poQUyWvnUK3rkmfrBYH+irxnnbtmjv6zuwUZfAttEFcaHWlMm10lm5kTKGlCKD7+iDb7ktIh9/+fKZv//732QxMJU///nPPD09icvXnsdcC7smPS4l65JIccNYRwgBRyXVqiCboGVXihvrvEjm1lC69yS427KqaCTi2kNl9K2xrpGvX77QTRNd37f5sRbENgTxlJpSRC+1XshtXTV3tSPF1LtKCqcqxNTKh+dncq68v73x9vbOxw8v2GqYponzfKGrkjpmJH/DGFIt7EJQO14qu/0eYyCu4rNvMbHf73DBQZMtFiCuC9fLQvCOYRra61r/p6qvcno/8fXbK/vjkY3IZZ7pQwcOnl6e6YaB5TpjjLAEa3NedtY2+uXC+Xzi8fggtEIuzbyoB6+YQq4ateyb/b5WuUFrpSEHTBvn2abC0cdmWsWX4oYLHuJNBVNYY6QfBmLJwob4HmMqSSN7mQ0BQid3eNXlUNvvbr3yjI0BHxr8sepnvy3Hamn5GaA2uM1H623k4FyTeXq809owp9L2MJaYsn7uqtm0abPgagVzvF5m3t/f+f6HT2glLJ9LIAD2rpYyQbuJnACEj5EEUDuQkm+OgkqNCg5yzlJyIRhDNcoq0MXuWodjNA5xDoeqwbUdGO5/+gJM1cLeNOez/m39T281Z9dospBa4BPNO0ar7g03k2lP7w3W0STeIg7U1tF1QbN925bR2ikoKW4cJ1LesMbJOOVFGKhVEwXr2iIdo6xqBkyBJS387S9/5cOnj7w8P7PFRFw3hk5ZCCF4Pn3/fZMXO95O7xhjJbdMeo+C9cJtVfGhUozY3mCcMj+CkzIrxoQPDe5XBTQ0Fb779JFUsjxR28bb2xtvb9/48OGFZVnYYmTqd4pirtqtYgzxeqHv+/tFqE+z3FMxrbXsDkc6L6lviivX+cK8rDjvOR4PGj0ZwzAIi5GLchiUQKcEva4bsO1n9Z069P3xQUo0bpq2lsPRsrQV6qSiyBujd6MZ5Pb7HWkLrElZNH0vVzcuk3Lk0O24zhc+f/7K09MjwzhKWdkry6OgRXmtlZgS//2//Xc+f/ksyGfMHA97Pr584NOHD4TQ0XVK8cy3n8cGvOijI+smY5pv/ghnle41z3r5lm0jbivfffrE4eGJWw9ujFHmQr3Nv8CapmaIivH77sfvW3xnQzlEhYu7tNF3HRRIKerh7npyWsgp0k/7lnhn1LF4R01wupzlFciFt9OZ09s727ZhbQvxMYJT3R6IEIQxKMBht29z2ERFRsIffvyJuKzEXFiXhYfjAeNaN0Uhbxvz+cp1vjINI+O0o5RMjKlF/ymi8bffPvP6+o1xt5Nqo+ogckhJlWOklsJht2M/TffRhjGaAYcQeHp6vo/Kl2Ul14Q3oe0QNI6xnacvA+uysG4rNWrua8rtIVR6WsG0hZoOGWMNfTeQS2GbL/TDxGW+SIrbB2JSdvFNLmnaIRabos3oZIWm2KEJCDCV0If2PDRnKILLUTQqMvb3YJ9assJX0PLdWHBdIG4bxkSyFeiRFPUc7EZcq7QzunwcN9w4VOP4+vUz5/OF777/JA9IsKRYaPBSTNGYpglBqTlKB+VuMMNGB6apdrLaCouYVmSJLDrvyIk26sl3NdFtHl6MPDUhiHEkvtWtpGh5De3/FqDQthFcaUqwQjH5vvjVrsjcOzLxrrKWz03K6ltAmG3qJe/8nW2mkYaKIk0KanvPjsLKhw7XRCvWOcZp0BjM3y7t20iskHPhcjkTXgNPz88yMPYdeYtcT2e5kZ1hGPf3AgcnVEysFVf1LNzc5SC/AgjJEqy9d0JznAldj3dS2znjWdaZ/fFAXDe+vX7Be8thf+Dbt288PT9Rs4qKlAZqRWNu7yUlDx210audEyBS93dmmkbez1lqzGHU91Erp/d3LvOVqe/EXbLyiLlpwNjQCicj4U6F3uuMC82ndQtv8y2ILMWIrQXvOj0v7azVudimB0bvrwKLEn3L3nGNTJBS5LLOWGMkojDynnXe8f76SvAB23t8y2O3GXp/GzPN/PDdJ7rQcTq/g4Gnlw8MjR/1/PA7Lom2uK/O4m+uy64bJAnNkiTadqNbapufRXLOdH1D++bfK9RiDLZUqT2QK9CUSq6Z4HvGaVAlVwx2bG7EVQdKqW1RWmoDp4lYmLMMQubGvGkP3OVy5R+//YNppyXRNs+s68Lx4YHdNFGqmPNSYql1kqImqYoxGiVYa8C0eD9jefn4UXnDpWp+317lmBMpJoZRrHrRWV3jIVXiujCvG8M4cDgeyCgX3HoZz3799Tc+fnyhFhjHkWVZmbeN54cH8epTUqtsxN9njS3bRmMeAfnUtZk2ly8NKFeRCqILXgeZt5h0W36aVr3oqrOApzF+SsH5cI9sHfueaoRDp1E6TaFFWArfkE1pVXZtG1vRTKky4aSUtOTyGl0ZIxnxTVFhTKW2HG4wQsh3YJzBNUmsDzdMNdSasJ1j8CPgwBly3MhJ6V7lfuBXKJV1jcKn5HYcN6Vc3rLMZUXRsTc/h5aLumb08wq8Zp1eUmNvPgA9LzFGGU2LXvCYI94GWsmqkVJ7aJxzwmPXer8QbgUVzZ2sZz7dR4vGtLrLiAeVbcY72zoZr3vZVELvsW5o+x+5op1rB2xLh3HOMfQDfQelauTljKEbRPxcllW7mtISINuJ2XntB2otzMtKSpmw1xI9Jb1Hn777nuA71m2V+a22p8vI5FcLrPOCBeZ1wXsvIUnV3spWfQSlyb7NffmEFtZVz5j3jQ+WM8v5yjgObW+in+90uVCbQshiiIuCtlRUCq3yj99+I6fEH//0J4Lv2mTAtqLFUGuixMo07hj6SYVNzBIcAJ9++J7eB6b9jr6fKCVpJ1IEO82aVzY8Prg+QBL00LQv1RqddxI46Pu5iWNu562DJt6Q+tDUtl8phbfTmy7vYeC6LqzXC19++8puNzGEjpITwzDy/fc/cD6fGYbxTieuNyWosThr6HzHP/2Hf+EPf4wsm2KVbTvLbtEEpgEKjWtIHcBfzmdsu22Ntfc/3FQRQcdpj3VB8+lc2E+Tvk/rWpqSFiWpzahvN0euldBJG3yDBRqLdOV9wLrfLfXWGLpBeOAtRVzXMzU34E1tQ6vunPV8/PBJlXPrTLou8Pz0IBVjLGzLgu9aKlZtNMRUMUEBJtaaxpXxdJ1nXWb2o7Kthz7Qe0nbnDEyqaWIDYIfjtPIbakoA4zFOcO4G7Q83triLATeX9/4y7/9Kx9eXjAYpq7HPD5xPb+zxK05n01LR1NhE7pATplCobMBwk1xIwOVDoxMTImu69k3ZzdWMuJiwHrbzDbiPVknY9a8XNjt9gyhJ2IFVHSe0A/6fkqhuFbRlHK/EDIZqmCOYNpcv4okaSpbjGxNnmymG/kUHIbSOEe3Rd4tsObGcKIpg2qh5frmdmjrUXJGhq9aKjE2hZN1uGxwXjLSklMTGARMLS2yUeO3SgMjopdPWh/tqUotPByOrYOwGKsRlw8ee5sSVahO/h/Wre3+5WnQZdouAfN7ilq9dQW3HqJyv+RzVRd9U69VU9ps2+Bcw0AY8HiSU7RvNwSN2IzHB6nTvLWtKrdNKGLvqjQouIb2vy3gS2oZFc4RBqBW+tBrAeokRy3N7b5uiV///g9ePr5gjWdNq/I+rMe7jmma2JaNeV4IXUPglEJwgXm7UIrGWw+PD8RNE4Jb12m8uud5XXk47jHIHGecxSIYYAW6zrQutPDl7Rvf+Q/sj0cAQj/wxz/8gd9+U2Ru1wc9t8VQsnZL/dDRdT12JzVRqQUausQCxla2JWGrEvVyG58bo73gfhz4+YefgN+9MtbA2A9SRQnZdB8RudYml+aKd5i76VBsvExctBsdB2Sqi1FdnBHiJd4UEtaKFN0MqDULC9I5T9gf+fZ64tvbO/vDEWcd4wRd6NjtBCH17axSOqShu4VedaIue+/Z3ywPSIwki4Ml9B3r+wlbHG6QxNqnWiiLIkpDJ0nj5Xqh73qhao2VWsILfFcK1NqW3Dn+znFCubjWOeIWFUQfQlve6qB2PsiRWi1dkOxya47I3nuWOFOTIGegXUdJuc1VO1Uz1nPcd3qpjeXp6RHvdCGQMilGPHJ/5rbYK0ahIKPT71cQ+logNyl3LstC8B13ZssW5d/IhbFX0Lozht1u3xQxUiEN49hmyW3BWgrGOUpKDGPPp+++xzdlSK6Vse9ZVi25zucTh8OBse9J9aakqVznK2vcWNeFcZoaZkR4kFSSDhHvoVSic9BywvXhlnsV44NXIl6S0XFbIt7MhP2B4D12mthyovOSZbYJANVxR4pYRFottyW0gXlbcUDXD1hjCM6RvFVuRa0t27y20YFK5FpVJHhjtJhuB0tpnZ72FlDR91JbzrbghIkt64KorUvQB+6wVgE4h4cDpbm7Ta04bynOt5jRyhJ1abatCMY4xtBjMSRlOt2NfL+rnHKrBitbLmxxU+FjoVYVTbpMbh6J5j9prbppv0MsiWBltEqlsi2R7DNd3xHo7heSawdozJJuK5Crwf+MqmvnJVsNXhJP40TBdb4dgFbyaNfGOsZZvNWiT51labsoI0Xi9cpunPDOMW+RPnS8v1/4v//bfyNukeN/etQ+oDh6Y+kfDvpsWqqf856uCwJJZsEMLYVUzD3/2jXfSa1yf9fadlw4vK8KSGoKttJ2WbVWtrgAlU/PH+j7vhkGW5dhDceHhxYzoIjiaB2+m7U0dp6P331iCL2Cy4ppu0ztTi2GZV6I28Zh1wjX1hE6y2G3V7HSLg5rA6Vs/PVvv/D0+Mjj06OeoYZIcd61PRP3KALb8CGlVOXr1MputyfFyOvbK74pPffec7lchB8fOoKTdDsVfVeHaU/MmZoSNTjmbeWnH39gXdU5XeeZEDqGUXk6l7iyrLFl59z62HrH9eRSMA01UlJmmEZM0vQlhACl8Pn1lbJu/PTzTxrVj+MOYyA4yVa3mPj82z84THt4eqDvZR7yPiAMzu+Lvfuc1DjwVtP3XIlVhhe1l6qMSimKb2n7hWIa0/0GAUsRgyezKSXOBal6rGsjosTpdKJWUWIfHw5UWxnHHQ7J+mrT+9quw3nH17c3MJWn44Naf+dIVYlixUpJEWPkuN+r6m2Hm3AHUMvKr//4B99/+Mh0PDDe2tRyW8kUKYTCjtNJSo7SYlfBMI0TP/7wI7cQn5ozNTh2g0JYbq72DKzbinee8/nCL7/+IqwyBarh8eEBa+BtmSUF9lIYJTLBO9Imt7xp1uwtpwaFU+dh28z64fGBlGMzeqmOCC5QjMUXNDppUmSlx/nWBdyqZVU167yw3+91+DcXsWuvva1WS+8qh+tdcEBpn1kVrdN7qNqBiNhqf0cnCOBELlHMm+YWNkUMG+daZ8kttLFQEtLE24azsB3OinSrf19VYm0k3GmQTryA8pRpzCfjdFEYoZV9EFZBZGSNMqAHU+8AwNKECwaN3kKnVMBafo9SLcbijWFbF7Zt4TgcG0tL3ZkPXuOa2hz5DbzXdTJOuSATXtd1bYek7OjgFQBlvWvZ5/JAGOfE3rH6ZzJgjA6GXAoueGJKAkyGRClVqIqYsBQ+fvrE+/nCui6EoZcirQpaGJqy63pdSEk8K9cIwSFo32eNEbrHd/hB+yRvdPiv68qwn/SscZMZ6L9S0aI1JYWCTdNE9do1lBWWdWV33GHwWO9wsSFIsoq74/GhfdeFqR9akaHCNhWRBmqBYmG/n3j/snK9Xtg/PBKsZ1uXpj6Sd+nhcMQAKSX+r//r/+Cf//lfeHh6vI8HTQvIKqUItEjrxlKWizx0dEOPd4ok3ixNJq9LKJfCl89feP7wwmG3Ux5Pgy+Czttv374Blb7v2E07Ykz0w9CgiRCC1IKu8+zdgffTCVtVbFdqi0G2d/m5MYZt3Xh7f+fD7Uxr05/L+wln4LotvJ/PfHh+xlsnFyZtxlmcIGNzTuRvb3z82NG5oKo/bnJUW8O2RZnZmnpAWALRK4d+0q4hF6rXzFYyMy/sdyqYqHlZZ8SgmWNmNw6E4sFb5mVWWMm0J5fC6fTK9XwhJY03/D//Bx4e5Om4LeMqBbza55Qyx/1erV9zNJciE5wx8mWkhjsuB0kaU0qs80Kxld2gOf31OnOaZ8bDDoO9e0jWRtqkgu0CvpljXNcpvjVGaN6DNca7HpyawIlKudurKpuXmS/fvvD09MyWFr0I007wr6BbHyBui9zPpmOLWioqcU5jkiXnBuMqVGebKUquTYxh6Huozf1qhEevRqHu2Vp670ltzhOGoTm+1G0VUyCr0hv68Y5+d0Ji4p3c9rn+Ph6koRpM/T2kygBbjFRTWba17YmaaNBo3pyK8A/rpoRD7y29h+QVx2rQ6Esz3CadBkKv0VZAu4VSa3PzahRqreJtrdMuIseCzTdchH6fTCHgKVviuiyMBfogI5Lkqq5dDFqeZ9qfT5Emft3o+j1QFdjivdhmbeQ0jTsK0PdKYqu18ZSCSMsYiROcNzjfK6Fs6NvY0AjKZmg7EIUZuTa2M8046rsB75WMqCq3XXzVgpVyaegGSpRnyTlBBeMayTayOxz5T//pKFm1qYTqKM5Qk8F1VsmEDYCZt8Q8rw0x3gkjnprkIxXmolwVqZwS63ri/XTisT5gdntM1my+OO2naswarRX1lLkW/vVf/xVT4acff+R8vTJvCx8/fFCOQmnkZy/sDRambt8EGDdzrgooX7STNOid8b7j0/ffq0OpOodK0WdfMvz6t7+z/+cdLqiT/w//4Z/56cef7t+ZXqva9pga8Rkr6bg18H5Z1bEagzWO67xgrWEcRoopbJs6zJcPLxzGHVuKrTvV6HCLTQ7czJF919N5xT2XUiAVrLeKVTCG3lqwmcfDUeqlJLItFUwDO8okLsRKnFf+9f1feX75wMdnSaBd56XubOuAbVvxqVRcUY5xbRJK1yz4uWimXYMhbYXT6yt9m/EZY9Sem+Y4TpnUDkDvlEmdjcGm1Mw7QjS7G/2goTBS3CilMoQgF6nVIXA5nzidL/z0k1Q88/lKbIC74KXjvi2DHAbTML7e25vw6j4PVPZtJha5GYOzDbQlf8L57Z3BD+ymwNvlhAUe9opI/fmHHxh3I9sW9We3isV5wzKrY3JFD8q2CkBoQsOuVxluctKcfd1WQg1SHeUkTbUzfP36SkURmtMw8eHlA9N+0sK4SkhQqTw/PbKlzHK5tGAkx2oMrmqBXUqiG3dt+Spl041Cq6pZM3NnDAGNmKhGv4NRR2OrDFry8jZCMA6HJ5UNcmUYJ3IWoth0WlLfnomSN6xV9oBAyJBKYlkWjFO17LuWPe4CxlWc9e1B1kHsbKDWIuVOrwGRIHxSq+EcHgtZ+BS1+i10xpr7oUmuZFRZVwPZybudUtG8uAvihRWjpW9B0lkj7MrQDTjTwl+8pwxdy8LIrduQCzu3TivFKK1/U37d4I0pt7/PO3zv5U3wzVxo9L3fksp6ekxPk6qOisstmb5XSljNEZzHd6Fdvlk7gi2TozqdhcqHpwcMlpgrrlNa5K1Dtl5dgQuOrnZCmSTY7yYp55z8C8M0Mp9nhqcej1zythrO1zPbsuCcZ5p2xLhxvc463HxgmCZyyuz27bCukoeqQ2ga/Ao1tsx4I5OaKRVTFR9rvFDkn7/9g1//9gvjbsc//VPPxw8vbFuk5EroLM8vzxq9tJF3igk7tjCmUpijSKimeSJK0W6BalpGSsB1HXlLLNuMteBdT9cPgFEGg90RQs+//PO/kNDFap29d70Gg+18y/PRc1jQJYrViN6agi1VqYw5c9jv6CZPzJXjTjL8krPeRSzOON7nd4ah57g/tPEtUkGpLVTRkkTfzhS6PmCzJVudh7b5rNYYmaZRExwqFAW8rXFtuxZ1stu2KQPDBmLMDF2P9R4fnETpcdvQfSPNh5MEQ5vyahqFsRC8cMGlFFUh3rMsV+LWUAfVMDZPhKkKj7lerryf3nkphYfHJ1UwrX3Sf7XDtOQmfqn0Q4/zglnFTYtZ7zuOuz3Tbs84Dk191ZRPtVCMDHcKskmkKt3/Y1AriYXz+QpDQxPUqvyAbeP17ZVpHKQSCk2yVrNCzFOm66R8yLkQBunSx2lqP/3v0t5glcMckw6163LFGae/nxv219z10c449tNO/CnvqXXjw4v8H1+/fWPstYAz1pBrJDhL7jvB1pxn6PQgTPuJiZ12P+1y1KhhEJelxaNWtKAyrnlcEA45VQUX6TuPmFyotrJtEVyWXI/altftBZznpolXYE2pwNYOXJqsz5SmhhKoTyFCjlwaubN1gPWuejLNHS+TXs7qeGwx1GoJ1oBrHsRa7qqi2l58o/0kOZVGiNWLlYvkgNn+7qA2GEqs0rPjqUTJsVsBYnwQN6qNn8Z+ai/qTVtlmrtcrt4bIcC0hXnfaMcpZ6ahBxe0M+o0PvXGyrBZikazWIqzHA8D424n6W5DdN8AfIqb7OiHvo2kYOh6+l5KtPf3V75+/kzJWe9I1rirAtcYoVambiI2afg8L7y/nvDOcHx4UldaMxXb4JeReV2UP5Aza974x6+fuV7OjLsd33//Ha7rCKUIa2GFktHzZ5SJbStxeyN0fWNQoY7IKcL1JmoAi+vAJsg54n1gmVdC8HTO3uf/tVZC1zXiiHLmqQW7GxWQFpPS2LxGfPUW6VphXRYlw3Ud+/2kgKBqcd6wLjOlVol1MHz//fd67g0NP5MwppBSVuCRZjd33pHeFb1G3nU4E/F+YEuivXrrKWmTGrFqNHm5nPjw4ZMa79ty35omqjjoM3JOgU4ls5t+z0g0Rl20D17qvXVTRHSSIjV0gffLmV9/+TsfP33HbhwpuXDZFkUn58y02/GwF6pEZ73ozM+PT02gYfC2tcFd16MUSENnHLFmuqoXsZbMdZlJObOsM4ehZ42rogmN2sp7Epmz3KEKrYrfH/ZMR2mnv3z9rKSpcdRyfBxIufy+62iyWGc9rtNheng8MqwD/dBz2O3u80AF4vze1mO0BM21ELdE3wWKFfgLo9Agf8Mcg0yDFbxttvdlZRh6QvCkWtiWjd1hBzHp8rLmPnIyRodmKWqTv375yul84uXTd6zrSt8F/V4xU1yrNFMSy6kt325I5v1+rxezSUxzhde3V16/fYXjA6fTmeenJxl0jNrGm4P4dtnmnLUz2KTfd9ZpSWugxkr1bSGfsi6clDlf5zYrHQhNV11LJhhLdZU1KdQm3MZH2ihCVVp05wNLTFKMOS8GTrCNrSPZbWo46y5YVAQ7jHeErKovWkmK71LQKhWXt0ptK9UKeW1psuqKS0Yky9uuJP+eOSHgtg7PG7dHazFD8VUy7M5C1fw/lYJHSYBGZnR5MbDYlukeU9uVmKaMMcLZq0s1lKIDKHQdDksI2ofgDHXLSnXzvbIurDhDxRp81zW1lRbOAu95ht1IF9SBxBipXmyzwfX0w0DnPZ2Ty5wiPlZKiRgzT4+PeO/5+vpFleDopM6BxmWL8hPVgjdB3ofribGfKEXsLIejoD1F6DtqFn7eGMuXr1/59vpN/hxr7s9H1wlJ4Z1ljpXT6Z0udByOWswfDw/gLNYFdRc3P8At5CZ4XfJIfl+aTPbT8zMueKa+ows92xaJKdKbAWcD6nM1V3DGYL3l7e2NdV0Z+57944OUO+Y2i195fXsjWKH8x7GT4sfocnetCKq1cDgcm/CmQt+zbguduynJHLEUqaPQn92FwLKpcBqn4S5FtVUmwpskvOsHShaSY7fTbkpXpM6+0ozJGEuwkpKfTyedpeOod6PeDMvCu2BFyA7VKeCrFHKWO77vB95eX1kWpXY6p7yPB/vAcXeQVLzFPitptDbXfeV0veBjznS28earXuwuBEoW40QRhpXgHL9+/abc10cjjnlrX/qxl3oiJaoxzbxhWt4t+NDRhY7z5cTbt3f2hwP7w0FSsqSFoHFOrtzbBgtJP60xkucOEza4hgqudy0/xuA630gNwohXaxl74Z8727HmjW9fX/n5xx+ZdlrEUwod4ELAW8tuGHFOrtPz+czhuCduG++v6Y5FsE1XTFM3lQLX84kwDFgMp9OJ3fGBEDqNBqhM+12rbFIL9LjlgP8e8+mCU5VrDGvaKFnE02m3Z5xGfvv1V659YBgEY3Te443h7fWtVelWih7rqBprN5e2Lt1aGm6heSBCCLzO7/zlL3+hGwI//fCT5p4AxZFyJhfH0DlSkDIjt7ln4nZQGvzQUbaGmqeybokYo+SH7uY/kEw2bYlYkxLjisZjMSaldd08Bu1gMG15YVzr9jL3rAZ3w4ZYR2esAqFo71QRWqH62+hKgUdO8zpcBhskPLiNiHzbmYEuJ4zDV0uq6jDF4tdnq32czHO2SMVXmmqLWnE+tN1IUDjMtrHFxG4c6YaAdaFp0YV18d4zzwvWD3jaCwAAUdJJREFUwW6/b6ZMeyd82qZiK0UU227QEj03ObBGto68JX755Ve+fP7C9z/8wE8//sQwTZJDusCW4+9elSYQkE9BwoZpd+Rxt9duso0kz6crMUXGUZkbxVacs4zTSD8MVCr74/H+OccYdVl3Ciza7w86+KzUZtb7+7MICJfR5unv5zMfn18ojakWfGCbZ0x27B+OjLudlFhxxTl5uiTVqNjb79IuW9Oo06Vktip5uME0kqxj2k14625JqlBk6Ot8x/HhAdCyP6Wm+quV6hzeGCw9WNvy3CskXfY364D1DrOJGZa6TNcFapKx8nZZTNOoBM+iZ2A8jOry28+9Rv28XRdad+05XU4sceXD8wvWS4G0xYTHYUxhTZuyqduzYrWAI2eBRY8PR759eyXlyDAMTNZqZFcKqeY7wry20a1vK4dlWXj99oo3pWhQW9XygqEbB3zymp2n2DoNfYj7pwfdOk2hZEohhAHvAuu6kKKqT9v8DYZKjBu3mNQ//elPTTrmpZqpv7dr0ZTm2FZlVaqInSxaPndUqtUvoyQ5I8hbTqSqF/7t9E4InunpAzGtYKBzoRngahsV3GbAjs45fN8rp7cdvHoZDWuKnF/P7FprhjX4YDG1haNvkW9v7/jLmf3jgT/+4Y8UaygpkVJm2yJfvn7BVHh+fla1l+Nd5mbbw0iV/NEDnfOYzvMYOsWLxkg/TryfLuynPWvcOM+iuhpjGMaJuG1ctyvZ3tAMGucYKxyJDzo1b5RfY9qFnhPbtTBfL+ynqTHmY9PgZ833kyPWqAfWWsLNAKlznDAIUTKfr8S43S/3elt2V9VI1WjJfL3ODKFjGHuCt5L+FmEXCrld/NxHl9ZYis3QOjYXLBRLihGMDnuhGyQxdc5j2lgs4FhTq5yNJRNx1RCzxkVdcBRMw3uogvVO9GBnBTe8mT2tdfq7/yegX2oz6ePuoNhSa6lRLKKYIilnSirN9TtCA+JZY1QwVIln53lm6DvBJ41klaZUjDeYZHDOctsd9l4V8KVIHlor/PLrZ/7tf/wby7LydjoxjCO7nXw/xknC6YwH47AxkmJk2xKmN/T9yH6yeO9aNamvLMbYjHg3zAqQ9RmZanh4fORhfyDFjHXN5+L1zuYG3ZMEWJ3xffTYeqdajH5/53BGu6iUNs6nM7v9ntAHcixcr1dC6NrPHJmmAecs87bRD7JhltI6EKtLYphGXCdvVy2mjVILoZeEfbcTELPW1HZ5yq0Yhr6NjnWRSZV4E2TQCtkmxjBgOycaccPj9F2Ps4brPPP2/srD8ZnDbic+2RYxVELoqMYw9IMydHImpo2+H6UAc64VkBrB336Wl4dHjbeLdkt5W8EqkOz8+t6UeDI5+9C1C0NKtsvlyvn0zg8//KDOtKr4mPqRmovwO65hbkqmNqHP++nUnPrO3dsig4xIve8ozvPt2ze5Gntx0D9+/52cvCmpgq9NkVKE7u2HEWtv6IYmC6xNFVIEWttyYp1nHh6fdMoYmqGsmbNaglXfy9X5/vYNg+Hx6QMYWOar5oHekEsiXSLn04Wnl0e871m3mePDJ3KO5FrYDzsqlT/8+LPUK2vCBkvXqb1dtwjOtrlrj/GWp+ODfAyXC/3YUzsLUZdTjumOKTYGHg4HrsvCl1+/ME4DKVeuacVUUVIv1wun81nZC63cybbcZXXWAk5jFCmVFGjzdnoXhAt4OB54e3vDO8fbeeVyOjNOE8M4NgT4bfylz3pNG947sfGtI4SuKXtqQ4XA4bDn4eFB7WTQUjWlzLpFkrfEuDJNe4qtxCW25WbGBFXJ67YpYL6o8k9kbJAc1rQdR2luducNg1VqYIoJ45scz1hCO+S3bSH41gbR1E7tkKZV36adYNaAD0EejuwoKVJcEYjMy4fBje+ERonBA1USaH13DTuQS0sibMqwasA5+uAVH4mhOoszks6mZszLxdE57Ueql4fAe4fr29jMWZY1sT/uZHpqL3+1RpGgXdB7F4KYaV1PCO4+1fPBczkpInPaTVIIrglnZfTrnCVXmp5engvQmPVyPpG2yLQfmbqdTFweOXRNkGmVjS1vd95Xqq0lqppLPzwcRGaut9c5N7u0dg2Px0dFh7bx5e0yEQ7YtkM4q1gopV18uihq1bhU+7DA8/MHrLNYW+mnXuOQfuCaLpyvM48PPUM/YcpVl1UtzJcLfQhKY6T5WazEK0M/UMuMD1L21KTkyVJpSYg3NH7zONRCjMqqGEdFK998Jrogm0gmpXskacUoxdNYLm/vxJhwDw+UVPn822f+8dtnQvgLf/6nf+LPf/qTitSm9tMUWIl8xohv5lrxYa0lx0gqlc6PFGMYpx3W0OjZDUVTJAjZTQceDkfmddVlaY34a8FjrOO3L19IKfHd9z+Qa+W//49/xVnHf/inf1K3sC2Srfsm7olycKc18vnzZ477A7cVI3CL+GvdhAu8vHyg1ETKmbhFrIUtbZpXVWmNSZJbmlK5c4javKC0xehtUxhLhFyYt41dSi1cvf1zsUhWSSVvwtzWUhoWo9LNM0PJnE4nXOjojCHFzNevX1iXlcPxgJtumQKW6zZLh26NrO9GbJ21ZnrjGkNHTZSplX/841c+vXzg6emJab9na/mzQyeVg+/ULl8vyrJ2ncxs3lr2w6DwDxdY0yKDWeiIpbBdV7Z5IW7SMbvqtBy3rUqxTrd5wwY75wTFqzB0gcFLfTGMcrp7Hzg8HOl1w1OK8oVDCCKYOkeK4vFIxVKwwYGxbNcLYRyhKpLS/JPj25evPOwFFFyTkNApZlKUCmzbCvO88OH5ue0XMtsapTBrbaqx5s7Euj1NcduouWKCpIzF3qhJ7i6VFdix3HMnbiw7CRIk56RIWyUh/e3EkkQySxxG9bYtwCFtmW5o+wNj74Yz2xzRtRrWEnXYGoftbOM0iTbqrKO7xZ1mjZl0AMG2LaQ1KYCqKtjIWtNw680eZhXo03UdadsIITAM4z0n5ZY5XdD83PvAONCEAYWMCiHfdfzj11/ph4FhGNhNA6ZJZmPctNeyjmXZ+PjxIw+HB5Z54e39jQx8+fob1n/Hbj/dpb3UQHCwVSHCY4zCobQMkLtvBNd2dTdvRGlKHslfv/vheyGmjcV2Rh6VLJRFvQUptcvXe8cWtUzGGhUCbe5urJY8N/GBMSI41yr8tXGezrUxHxU/jHdUST8oQ/u8nint76IttY2V+MHdlsrWqhg1ijag+YRyk7vaYtlylH9j7JTOmAomxSaZ1w4gl9p8X4YQXDOc9vh+gLpwC8ryXlke58uFbV11+DvtbqtrqH5rGYL2m/SCY1rU5dL2EBkgRRk+iyKJg+94PBw1DWjjJD/0jM7dF803RWeulcNR+R6Pxwf+8fkLf//73/n5Z8l4axNLxJJw0dANGqd5r+f5p59/Vkqm3kpzG8tKeuhv0lGZgpblxGg1jd62ja4TwTDnzNYS53yQVLHminEduCKXoDV3XbW1Dtt5Pn2YWq1oidvKti6/zzhvt+GmA+v5+MSyRrXfxvDh4ydKyaRYWLetLXEVgAPw3U8/6INK6m5iTtLAI7Kks7qYUi067IPX+KEdMs56/d3W8PT4pKVqoTmDRQQ16M9PObFmuZ2fX15Y54V41kWYq/Y43//wPT/7n5sZjOa6TS21rDY6KQRnNYuNG+fXV43JQsC0hDrnHG/v70zTSJc7/ezWsqXC2GnRWUshVxl1bjkAtuolzC6TUiTYvS7eHHk4PnA87FrGR6bmyjQM2MmS6w68pQ+ex8OeLnQEn9myZxylgpqvV3ZNnleK3NDG6MDxfY/3+dYqYnPzKjR5NU1dlqyFnOWMNTSEhmmLauVTxJT0PTTcscVRnELujXOKm6xtT+J+z1THGkY/Cl1eEjmZJtXVqDEEqeuWy1W4ihCaPlyIDqk99PRIsdVBToROUbej8VSrpXK1le26yvzpNdv/4ccfG+Qy0nUDfdex5dyos5WSioyf1kpjXyolbmxrZL4KcHc8HkgpMV9mDocHrDPM66y5unWEYAkhcNjtcc6zbgtUw7/95d9xDaUTnKN3gZwjayqk1N4bHyhGKptSKr7zBBeozrSFf9WYitiECMrTtkYpiNWWVtSsYvxYS6mJdVm5LgvH3Z79ca8JnWk4Fx9UIKB9ozOOHEU09V6FTqmZUjR6sdP+/t1Sqqo66wAl5H35+pnr+cqf//xP3DLKKdCNgvzdxoV9K6IASlYhq0GG/AgpboKQZss6z/zjl1/xQT6Kvu/I1VBLJBtH3oS8uF4v9EOm7wLj8UjOUkP+9Mc/cN0WQvB8//PPbDlhnSMbeXi2Kn/OTaShd0aWgq4LUgv2VeOwnJljbNy3jeQLL4+PDP0gU16t2jfEyPPTEzYIjhmzEEfTMIIVhubxcOB/+1//Nx6ORxVcWZ9NsOrKT6d3lnnhxx9+wqCzYFlmGW1vc1bT7PrKDtZHWEoWm8Q7zpcTcWv27da29/2gQJ5q2zJBLZMAWNJud6EjxcQ4dg0caLGmEtPG6f2dlArjbrhrqm9OVO89xYm+aY29p7yJgdPCcTo5xWU6o+nOtUPJVUucVDOsia+vb1hjeXoQAbO2ZLViBLfzXUcuiXnWoUQIBB9YLjNb3Dg8PtC5gHWGdd3IMUJDWN9UGt5avp1O5JgZ2t5AHZZtbaZ2JClpLLdFGfp2fiBtG7/++gvzvPDwcERZw65BywrztjIQWJcG5+oU2J5K0WgpwHWRNyIEtdWS0+nAnXZa/nsL82WDuooQ6j3BVx6fajtkLSlv2kOEjgcfZMQ2hlAi1Xod1tYo46FUUlyJUXGYwQW8geLlBK2l5Uw082Ep7VKxAo8VgxbOhhZXqWfPeL1IaYnUahh618Yj4KrHWVWFNwOSOpMkDWwVvdV433AzDbRmpD6yxt7HrLuDUCvFGBm/EJLDG0s1mrM7d8t80M/mncOGgCvl7ooeu4FtXvD+9z/bOcsyZ4bRyblcajNuZmFtWjJf53S5bDkSt4VUC7YBLTsf+TrPGOc47mTALA2gaZyjYJnXlc6rCAo+8MNPP5JTIqeibgvYUuF8PilS1zqeXp5FAbBGI44lkbzUZiH06gpLucueSzHyiRhFgGZ+p4V2Tt1qcKF1ODO//uNXeUOap2e5KKDrBuozreu/LBfmeWa33zEMk/7MmqEKTVKaJPmmaLDGCLiYNvqu519/+x98/8P37A4jqZl0q9EZY4qyTJxVV72tm/Knx/EuwLgRBayXC31ZFj6/v5K2xMPjc8PGWKb9gXVZySkp5KyM2qk4T3B61pOB3WHHf/nf/wvVGKbQkWkjeVXk2ArLfOG9GWJ9U3Z1wdOFAdeW1rVaet+xbZGaMvvDnqG9i13f0w2DfBcp0w8jvuE2bl0rRZ1GsJZl3eiGnpcPLyqIc2aJG6fzO9M4sdvtsPNCjCu1FrZt43K5KDcFaltY65J2bdx0Y+44U7VraC/nNA6E0N0PLhDSoyBX9b2Ky1rS+DaCCqHTD10z1kGpVpm0zjMECNbdw7nJBd/3mJqZrxfeX8/sDw/sj3usKdRiW7arY7/f3fkoPtvfQzuskemkQo7bHQVhmmS2lkx/fCCXwjRNxJZed4Ou1Vr59u0buyQOSt91OKu4w2XemqMaapPr1SaTtN7z5ctXUiocHvas6yojC9wPjlJvuviW6ZAK17zy7dtXvn39CqDfq+pimIYB6xzPj49akIW+VUTNjNRMgZ2x+Ar9OOKs432Lbd5exd/Z7RsDJ3O5nKmp4q3HBB18UnFpYOQyxC2xRi3/a0OIdJ1gaL2XHNMZy1ojMWW8l/JEl0DBWxnEcPVOl7TGYkrSd28k+6ylknNTupWE68a7Zpy2jA7BNdmkvqOCciRMkg+hH7TDyrGALcQigmiZZz62yM5i2wXhAlTlNDsjRd111Q5lfHi6q5ayEdhw7DoqUqAM/SjGTgOkLdsmr4O19L0CdRRta5mXha7rOByP9H2Ps47QqdMRy0ih9DFCDJ5p6FoIUKArlV3fcZmvzOvCdb4CRiPbUrDBY7GkmvRi50w2HcZ4sZ+spTQIJsY0oxaMu5EQO/kHciFtQlXYwZC2jdRMkgIQWv1nq20TAttYXpZUNE7M1mGqFZp93QjdRLWKufXdG9sWGacRg2FovCJrhTmpNZKSPo8QvEaRVgbZXGhyehV+SlhsEw5j2OaFLUd2w8SHDx90cSUFndlaNbRvP3870jBFiYtbKWzXhXE/Ya1lGgfK0GMRMsPtD/z8w48sy4ZrzDo/eElsnSEEyZDDvnXF6O/1IXC+XLDeUluWRwlGy+DaFuKl3jHhy+nUUupsG/hr//Dy9HxXe6aSCUF5EkM/MnadIJbl9yC4p8fHhvuWUtQZ4XbMYH6XtlJZrjOH/QFr4evpnbfXd2JcieuMqZndbrxnbthq7imLDS5sGtGwdXRGpq/ceODOS4lx2B3u6ocaMzFHnHfk6n5fQts2QoobQz9qbq4VJFvSbiDnQtd39OPYoHCFbhCQKl4v5Jx56IUiGIaJ7rsdfRfkoLJGOAM6vPMMfXc3guUqOqp3WgAqGczhbCCMPdNompZbF9K6rs39uL8nM21RWbpbk416Yxi7nuwK67qxxZW//u0XtnXhTz//CWe0J9hyIq/qDqZparhgwzxfscZIjdQ6s1wbH8kIs4ATv+Xb16/QFlX7aSKEjrfLBYrgYC5YctzuHYu+fDCh4b2tZZpG7nStthMKvXLCTZEnxIfAbtqrxe9UOada7rkFpmpkuBF5P594Pj7S7UZVncYwBKjOtIICSJLshaDL9DovxG0ljDtCuOlZtHjznadk7RAwopZWahuLaNyTUiIVYV5CF3g4PkrJlOWNcEb7Aosl2o1+7Aljx/lylrKugima/adNXUg/dPik/ASdm66Z6HSoOJPwgzTw611UKcJnN3TaZ2MYJ0k6sXK0Pgzte23guGGa7svRQ98ROo+RSYGaKzZokbslVYeuSaFj0pK39wNPD88s6ywTp++pNeJ9p92GccqbqLAV7YacMWTr1OHVRIqFL99emfqRofMUJ/RLP4w46ynWsJtUhVbTDv9iCEE59rFRELw3gMNaAedKXFlKwfsOFwKpATXfL+8cd0cZxJaFrh9IJfHy9NKUjUJin95PMr71A5fLCWsdwzAQuoHgJa6oWbsErOoLECpD54tc+ljHWjLkjOk7/vDjzzp0V6GCcEoKlBmxYjFkY3DBSZ2XFeh0G016K2WcsfLOrLnw+PgsSqvTfqszmpT0veb2oijoMjLGYFFI0OA75tNF77b3+CCRj2n/WlMmNLXobr8XO2ub73vbm8gkZXHggvP4zrG2c4kGCzUI3y4kUTuv2+i63YmklMgxSlrdPGyXZWEYOmJMnM/veO9YN7hGRawaZ2T+a6TsbY342ma8N+mXMzJclSouTPABUw3zLFKhD+5u5wbownBfbDmcFsSNcX9LTXNtoWJam22QOxlg2zacbTsRC/tpT6ayLDOh6xj6oY1pKvO2NsQ49MHLuVszrs24b8C3GBOX60UmtdTGIhiy0ZyztoOmWmnSt5LpcVQjF3mxht04Mg3PojpWzb+/fPmGdXK4Wmv4/O0LIXR8/PiRvETe3t+VbDdN9N3A6fzOscWwmlKpRlVQsJ7X0zfNqXtJSEvODMPAMIx8+PACTar6sD+yxU3gQIyMXDXpMXAWU7Twz6WQEHTOtu9y93DQSM45qFF5E81E9vT4KExCaelvqem8a2WLmVJVgUy7PYeHB0opLFX0VzuOcrVTOJ0vLMuVl+cXaRCxTOPIEPqWACfkuLHKb3bOCufiPZnK5Xzm/f2MA/b7EdPovn2nPUPXOERxEx+oFtPiRtWq97bH9U6YERyVlVq9goBw0Bv6rqNzPaYTYfZ0PXPoB1xTW9ku8DQNv7trrcVTKY3B3/sO6z2ZJMZ+Azl643Be3KO6VSiF/X4vAOFNPouheC3EY1ReuXFNrJATeGWBzNeFXT/hgufx+YmSj7y9vXPLe7nJnUvNpOKgGNZ1VSRqteS8iUbsHMZ4Rt9TDbzPM701QrQvC74fiXFmvhZcJyTH2A/kkomb9pDS2TeYodPuItWFeW7Z2Fm/t7WZWDPzZaH3HeM48vnrN14eH0UbtbaZ2Byv377y9n7ieNjR9wP7nVSHoevIsWC8a2ayTHUoq6MlGK7rjDWW/eGgMXABXyFWS46Zab+n63vp/nPGFdP2PvouC7DNV3lQQmikB+Gzq9U50GRTFITYGYaOuK3kXDlMPcY1/0PJ9N5TmuDmNs5NKbNzHbvdRDxluiCsu3LWM+MgmnPdJEG2zjH1A4yGdQ2S+nb9vcBMTW13Y+KFoDGeKkAD1lLjpjHdNCnbonlGghVyXXy11rnmih0CNQpqejjsyemF17dXFTSDCvY4r3ROXfn1ciXlhFfQTmGJm1zOSHXi2xzOWWnsb7F8N0hebQeyDpWVYRg1emnzPW8dqSYxWYwInMZavNGicl1naDpq29yjAQvB40tiq7e2tunOc5aLund8/frKfr9ntCNY00KPDFi5P6PJLTdh0OFqfKOSttmjazfytjGvC3Geefn0seELKuu2qV0L6kaME+U250jwPZ+++0QphS9fvnI8HonbxrpsfPntM1/e39ntdhyPltf397uRqOaFZVsYx4lcKq/v7/zx58c7zuTlwwcxr5yDkjldrlpYhyASZhsbWFvvn3/wjpQKW2yGmFIxQQ98Kpo7p9JS4rJ+f1NVfeSq2NGhyjBEMHTOtZnrQoqRSuXl+Zlu6JnnmeU6048d+/FAqqJ0/t//9f/DnCKfPn0nA5+1lCiGkuIPtRgsuagbtMJxb2skNYTI4+OBXb+n1HSPfN3t9wL9NSns+7zgvWM8HBTxmGx7CYTVrsYw7Sccu2YadO0y9XShI+cqtEoqDKGTQStFghEiX+quhK2G3TRS226s60Lz8ThctTSl8T3EXpJchx1s05/rH9hioiR1yN5KCZZKhlg5DEdyn3jPiZzr3bey5I2h+RWcdxyPBznnbzHCtVJiy/YIDl8CSkqSC7+0+bPzjt3DgbhGluuV3A/0fWjy1Mr1fOZSCx9eXuQVyTd6cWBZF97e3piGkUxlmnb4vsdFjYRMGx3WllfQ9yMfP36Q/t7AeFvqDxMxJtoqjt00NdVfAGtacZluEhslOTrJl/19oWsgqaspSCBSym0sWcg5UpIh9IX97jbH1zjZGEO2lX70d0VlSonH44Eu9CJXG+FKTu8nrtcLwzgwTTudD83fk9KKc0dKqfz1b38lb4k//8t/0Ggqxvs/G7dI7XochsM0EawTCLUU3t5ngnX0w0Dx7j7uvs4z47RjGgb6XoFQoAtOewWN/Ev9Pe+9Iil+aLs80VsLrqhbDy5oV1Uqwfl7mJG1Bm8V3xBzZOwGfvj+B7quw1nDfn+QudXr+ylUpv2eHBO+GjidTvz7X/5CqfC4P/DHP/8JYx3kKN6OU9tPrZrTItmgtU01tCqHONwXe3Jim2xkkiqFUsQxMW1+Z6xv/grN6FyR9Isinn83jiIhLhtm7Mml0vW9FkVYti1BnhnHUSYnoOn2iOuqlLMqJYa1jnme5SDdTwQbWhxlQwBYS4wb52Vm6jopl9ImtYYt1G1lciNPLx80t02q5D+8fABnSZuS6XwXCMG2lk9jhJozaVupVaMsjMUGz8dPH/XFO12czuhCwiiTexoGxYbmQinbnXOUMPiuZUM7Bzljvbgwt6V/SpGaM/9z/nbXB6a2MCwpcjlfFXTvrSqrIsVJzkXQxSqyZQ0C7fVDz/64b9p+RyiWlCKn84lP333H0IvJY61hbcoJ12jBMSVhq4Gu7UjWy0zcVp4eHhv+OpNWJygatOr55t8xuEb3nTot87PT752LF3LaWp4fHshUhq5viqbC6e2ED460tn2Ig2k34pzjcjrT992dABxahnbfZMK2QSNrzRgnJYxt1alvKPyb6sYZgQlNm9tuW+SyXCm1SjDgAtO4Y5mvAPTjQL+tAkc6Szdq5JKbE7rWCnfQZtWuxjlln5wvTPsdtRph0fuAC45tnvFNLOGdZyMy7vYcpuk+vpA3QFJxGf89uY3XSspcz2f+z//f/8Ef//SnFjqkDok2R98PA7VaRXYiodG0G6FOulgfmpvZgAsWazQKHXcT/TBSSVKDUbHWk1IkblHerKJFeWnycGN00IXdgVxFBL7OFwoymW7XFWMND804ELMmAXqeKjllXTjOczwcqFkRy2tZ8cOEwfDt/Y1ffvl7w3r3/PM//5OUXY23JSCf6L5vr9+4BTsZKz5XvqXjWdNkvQ5vrM64WulCx/PLY3uOLY7CNAyauGAIXhGto3dc55ktb4zdCF6O7GKaNLmIjtx1Ha7K1+WcYz9OrRCWYqtW0Q1qgM4HHJl12zjPF43UNbVj3mY634mz5y1tvYy3vnU1HQ/7AzFF/Lat/PLLryzbend7WiPY1eV0IvSBcTroDisRHzpyzYxNt6/Q8sh1Wfjw8kGLSDQTTG3emtLGfDlj7Ew/yIk5DpNufqsDoVZaNGigltxUE4aUMl1uM/imd989HMktZpDNMfmR1DC7vbH3X3LoBoL1rHHj67dvyr4eB4prS9hxYDATIYQWmfrO+PzCYX/QwrdWcpQiY5kXpgb0u6lpQFCteZ4xDvb7Pbv9Aeccy7zSeU8NgbxciVlyYJxhN+rvvF5n1rhx3O11kVoFxNhq2WrG4chWL6l0z6oQrPU4r5GG7To6VE34YtuLkgVZQx6DWDJjGNrPrsxs51zba9jblAhvPN5vlKTZfzf0TXZpmS9yEJsKNlfw0rz/4U9/5vHpiS2LS2UxLN/eGHcDwQfiumo23MZgru2+xrHn6fGoTIOSZPQqlcF2YOFyucqtHBS4czNvWevamEZ67s5IXn2rmNZ5wbVxZ74uGKMM4NobpaK16FphqMS+ciHo8wudqvYqk5ouH2n/TdusFGqja2ZMKYzjjq1EUky4oWU4W8/x+ECMSh8zyBtjMYRuICZhMvb7g7qp4OhcR6ZikiznN8XNVmVIvF7P7HfHdkCpOg8htBAnLaZLloseq649DB0hB8CSsxRxUHl4eGrjC7TcbSj66tT17h+O2M5xOB4pucgj5awk5zhMmy4Yp0uA5j3YlkUwyqbo885zY5zN1wv9MBBc3zaUEqtkk5SRvWVV084Rc8WYpIiCktuIyet9ixvOB7p+YJkFHdWtCiVuXE4nHp+fm1Nfv5cHZVz7Qt0Sy3lhCDIvWmPoTMBN6sTW65Xj8VHxtN4rAM1YrHN8+PARWjEn340h0faLRbuTnCPGQLDiYmFaprbRRSbfjUK9zG0yYPQ8eufJ20oNWu7fdjE3YGfJGnsXW3l7e2e33zWWlG/UAXUaJRftAq0hV0c/jhyxfHt75bg/EPqemhLztmgM7jpi3rBVBIiv317lXB+0U/Y5ZQ6HPU/PT0zTxGG3J5fM+f2k9ts5Xr99aWCqQPAb52Xh+4+f9KBUHbxsGzlrRBGbicg5vRzB98xc2y2mhefNbm5zRUYEtUs0Y5lpH04fAl+/fMaHnsPuQDc0lk5oLXyKpCijWx/UZTw9i2ZpgGL053WhYzyMhEawNSh9bmvqq77vGZq3oOv6Jnt0aicxXC5nrDOMw9RQGpWtFH777TOvr195fz9zfDjy8vKBbdsESBy1r6l1wOfM0pZIzjlS1IJ9y6Z1a46aE7Va1m0llSxUNfJc5Kz871xLq9RMkyHrInZGo55gDZWO7X6YGGzWwj44p8UhYIMnbVuz4hcp0ZzGK7eLzvdyBtcqE+XldFZ1GTSi8qHjn/78R17fTpAlN7bWcbqcmPYToR/oc5E02bWuxlqGEKSiMJZyvUo10ubXad3wvVQ+c5nxgyeviX4aFJ6TMzfcw3KZGaaeru8080+JabdTsEyFfpwIvqcfBy13qZheljVTYX846OegSGqbhOOoVuBFezPIOS1AU1LO92AD23yVwsnpkMnOEePGOq9UZzm0PJDdTuMLg3YpnZHKLaXIljLTpNjbkjMpakc09IGcDGtciGuScmteCb2wJ4f9kVQiOYLtQ4P2yROxzAsGmUit9OgYY5TBYiylsdI6b8hVm5xUbzZFy/H4wH/+z/+FkhPLfNWl13m8dbw8PHGeFy5vrzw9P4GxrPOGdZZh6Im5YFNhGKSMujGdas2cThfe3k48vzwzDEOTtKoViTFyfrtweDzwcHwimEpsopPaip7Q/EKH47GN+CzbuIhf1SnvBiyHw4NMa01oQJViyVo5L2uBbhhk3rTw+PAAJfF+OhO3RCqVeb4yzzMfXl5UXrddx8ePn6hUBWFNbbKypTvn639mJ7nOU71hnVfGybFer6RaedodWOIm5WhjdGWkzuz7TkbbIhl7Ntqy1lp0nlrXEOUw9h22Vi7XK9M4tN2PlSAjtPFpXPWzBM84jlyXmVwrg5HyzafMebmwxo3dOGK6Bh/tPMt1Yb5c2e1G/DhpMbjNK7txkuRrk6Hu49MDwXfM64XX93ec91y3DVMrychJm4rmkkM3sKbIL7/8nRhXfvrpRy1sW2fSj4NmgUEUzHpn4Jj7zRpCJ0mhqfTjSPCOdau8n8/0YWMYejrTKYuhaCbovSR/NRfcNCpLwWiul1rQ+RAC/fOjDuLSwsFBY6leI4LQ5r4Z+O3zF66XC7vdxMdPHxXD2PXCSOfUXJ3w/n7it9/+wflylhPbOeLxAazl7fWtMZMMoesZgycsi0ictdzNhWPoWyiK5tkFWuhO4+kkOK0LRx8k721Viwt6ES+XEzkVqZpyZOg6vO+pJd8hf9YqmN0527wIwhgscaP3QZV2gw2O3UB46SimUnO9K9MOxwec8+x3B0Ln2WLEJrDOizQZpJLyPvD9Dz/do2/7vlNyFvK29P7WDUTN28cRrKdS8KXlKIeASRtL8gyhIzp7l5z6dliA4Zdf/kG4Wn7+WWZFcYRuVCnxv0LftRyQ5uUBghWraZxGCob5qlb8eFQC4PlyYVlmpmlH6GSuVKZER3aikA5Dr2VpypLSOkMthtN15nw68xp6nj88aRFcwQaLwxCRbNcGjVi3dWFdN4IXCqQk7Y7isipbulRy6TTPjpHf/vEb3//4ozK/04YLjopwIuOw146iZmptkUjW3Meuwm/JzVxKR+etKuG2N4wpAoWu79lWyClSKaQVtmVjv98Jr20lv6wZluXK++XMEJQG2QePdZIwlyQwZM6ZvikAt3XTJWEbinxNWO+xnSc1/0yqDYpnIebEFqN8T01tGZov6fnlg4B/QQ7n0i4d17I+hmHgvMx8/fLlXnReLjO1Qe8OxyPDMPDw8oILPZfrmcNhrxVd2ohFuejOSVoeEIyyOCcjmvPEeOF6uai7HJtcddvoYsS2gDOMYV63RqhueeCtWMyNZgEw9CPFzOQ1SmBjoImAKSVJBFSAXNv7Xnk7fwFbRXOthVKThCyp8PnrV3wX+PT8gUTh8fhArvXevf/bX/+d//Gv/4r3nv/8X/53vv/+iK2G/W4vooN3Gtlta2Q5X9ly4Xh0reIxDLup2eULvuv58PSkhVPf4XzQrI+2UDGyuP/tr3/j2+s3/vjzH+n7kZS2ln9t6Vx3Xyi13oubMSavka0pl1wjVS7zjNtPeO/4w89/kJHLar+RUxJR3Ul3/jvSQpA4W83vjJNqpJiw+qIrUGJs8DPbfibJclX9dSynM1+/fuV8OpFS5vnlkcPhKIDdJvPLvGysm7j0Ye3o+sTD8yPWW5ZlI8YN67W7mZeZnd9r9lsrQ/UY5yQ1K1UuVyMToCmFoRvuDuOtbOzGqdEtTQubMW3UV/j8+WtDDu+IcWXoAhbL1KvtT02ffTebVXkjaq0cpn3bLTnO15laiqqZ26igAVK3pJfUtO/fYhh6y2YN07Tj8fFJxpvgmtTXsm1XOfaNpxuGNtXQEKXUgsNL7dHC3nMqZJ/xfcvJrp6XwwE39PgY774JZ0Nb4Fv6PnC5vGtk5gLjBNTmlTGa6QYnUuYlrhp1VP2Ol2UhLiu7hwOP/aN2cE6z/K4LpNirUzNCsjvrpaKqivj13tH3PTkXtuWMwTINA/n4gK2GJa58+e0LH7/7jmnnlWQYtERNZaPzI13fsVwXvHN4r1FL6As5SprqnSdM/m5GrKVyXWbWZW5L3AoN83EzT3WtGmz/jauS554vJ2qGcRjlIbKGJS503UCyqWFQKmmr+KAkt27oSCnxt7/+jRwTf/jjHzkcj/hewTjFVjnujeHrt1f2u1HFFJV5XliXWReUs2xVktNp2hG3RNcFtnWlZHWfH56fJYWxDoc6LesdXR/o+tDiA+S4z61L7kNHLqWN4GRG25YV5z1YkU5/++VX3k/v6gjaGCylxLwuvJ/OHPY7Hh4f5Sg3Uj855xi6wLquWuY61/584dANYL3RvrSooO6GgW7ohccJjpgLXa1KoSuFx6cnnV1VKkZ9dxXvHdd5k4rUGOIWeXt/ZV0XbOu4+9CxpY11WemHXp0GHX3f8d3LB40n9WKpm3fyka3ryn63l02hgUS9sWBhjZm//+1vrMvK7sOe/TSRthWs4bjbS8gUGpm7VOjHHQ+DZsG56CYarWbEqeX6hq6XbrcLGnE0qdgtQnNZZrZ15eef/8jj0xP3LNthFGajJGLjIRmj29D4ZtqzhnGcmqcC3l6/8tvn3/jDzz8x9tKGG9SCkrTAK0VwsBA0knIhyOTRnDOiberBv15njVJ2Qbr5BulKKTNOI2BYrjOmLcd3xyP781UYg3lhPs/sdwcxbXIhbnNbWIpme9zveX554unhiWIt5/MFh+W6zFKJVAX0eCP1UjH1jlYutbCuKz4JmifGvXDmKWW+vb7Rd4GH41GLfmMbVygzz1IhPR2PzPPML7/+Svn0kcPhIKVcbUqW5crj4aFJlVX9x1oIfU9c1pYdXVpHl1oVrkVxbKTKzimbW5+bQGPOelWFznI8HOVhCV7dnDOQEt4ryjFXmrO0Uqvqo2otJUbWJfJ+emXsB/bDSM4o5AagREzfkUtt45hI5we2bWMcJnLcAMl8TW2zXqsoXgxUI/XP+e2dp+cPWC93dBc04x6GgYI+p9FMFN9MoCGyxY1u6NgdD5K+ZsHshm4gFlWAyzJTKHR+IFWFuOx2O5Z54fX1K6HzOOu4zFdCVDe0zgscFLizxYVpGnFBh2Uhk1BWxy2K93K+YK1UhZ8+ftLzbQMhVKxs6YJtBtNGk2LjOq/sbipiKbUx3LJtXJdV+4knSU9rexet17O1LAvjMPD69ZV1WXn59JHQ94JEoguqomhN646E0DGM3c1bxraupJjpOpkIe99xna9Y5zm9vYHZsa2x7Rd6xtDfcw1qKzpDrW38G7guF4ZhahBG6DoZ89YYGfuArQr2WpBMd9u2e2CSdU2NWaEajW5yEghxvp6ZTxc+/vSD9hztIPZN9ZmzTJfXy4nhpxGo2imZlh8+CjG036v6vnmrjNPCPtfC+XTS8nvZCMPAdx8/Uksk1lYk14JHl13X91gb+PrtlZQijy8vHA9H+mGgDwO1ZkpJbNuKy6VdyvJJ1Ap3zj6Gp+dn9sfjfbSvEdvNSQFDP7D78cD/8i//IkNxjJgsukbnfEMbWfw4TtgKuRRiXHBOPBdTcuPr1/sczDYTCZS7DyKXhDWO4Ht+/PEntTpZ8/yuybpq1Z8xjHIe11R4e39jGAYOxweMF8q5mOakXDamfmBe14YJXtRKt9bN1ooPDutkKKm1MHrZ9311YKoQwbYSmvuX1jV8e33l44cXUspc5wtd3/H19Stfv3zDe8//u//f+fTxE/t/2fH12zdp0btey2Anuuh1k/KpH3qeG/2yC4E1Rpb5yrdvr7jOE4r0zPtpR04ahWQKZivEbaXreoINXOYLb6eFZVnY7ffs9ztJI4HOwHK9sut7buE0wyBdtHOWl5cPyupYLhSEBd7v9xrJWctWkvI9rOXf//3feXl+5vn5GVdF5G2rDYyxpKy2dxwnUlUEJKVQYmLOiuXsBy2kc8m8vb+TS+Hp6RGCOgVrpT+/rkpB6/rA6XLm/XLi04dPDIMq9GoM27JgquH1/Rv//f/6b/wv/6//iA/PeG+oVfLQWAvBelWRVg5hY6DrPMPQMV81erBef6/JGYvlFt0YGoix78dmchNcL/QD095LfbWtnN/PhI8dvnrWdcFYtd3OCdhXq+jEDkWbLsvC189f+Pb2jU8fXrSo3hIlJWKKLOvCukS2ZSH1PcE65su1JbNV5suVfpwYx13bJ6DfOTVeUmexRT6A0Fy2CvA6NI9RbqKDpn6y6qJSuu0FI6MPgvAFy6cfvsNVx/U68/75ndP7K9/98KP2IbcDtGrpbqw6qmqM9pSHI8M0aeRX5KXItULOVCdDp/cWqvhjlcowDHTd0M6VDRs8UxnIMbXUSuRUd56hjRKdC6S0ErwlOC+11fVKKQOX01lL8/F3+WrOUVialBr2XfLm1CYWIfS8PD5yma+kLHx8SS3moEdJkt7x8PTMfhhZm4yXlLhuG+fzha4LHA4HXJCqSay40HwrA32pfFmumEakMEbFZwhBz0oprPPCsi5s28pj1+l8dZ44z3TBc2j8syVpL/HDD9/zenrn119/IafYVHd6Z0zVpRLXSN/Au9bKKhBTZAiDiNrOcdwfsFWRqQ4twmOJd+/Fx0+fpLIblV6JNZL/m3BXg3Yu4NV+5eZm9MoAAIqz5DXShY7fEzogplWSRNekiqgCccHhi2tZugmMMqtzybj2v5fmBU5FevjrMtOPIznFFiRisFSeP3y4p0zlrDl1oRC8upnSHLclrpS4MW8z3336TnnCNkFpRiqh2djv9CJerxfe377y6eNHTBU+gVwoqXI8HKRtLkUqEQzPT4/EmHRR5YqjEKuMeLlWtlwoDT5XDVwuZy7zlb//41f++Ic/ErqO60UobtuckvO2MF9njseDTEoptkAgkUN7L1WEaSM5Gzp657m0TGFqVLVhHOMwMPQD27YydSPmg6UPPUuMbccgF/N0GDmdL3z5/JkPL88yMDbZZ4wbfpiw1uGdZtbWOVxGOALnmPqe6ypkg90kravA6+s3jHV8fHm5O/RrNpyvM7EkdsPA6XTh3//6F67zhanv8f6ZYjQq2GKiH3o+ffhInFf2+4f2jMXW8Rg8Gi85W/G2pw5ydntr2Ja5RTcqH8I7ixt6UlOfee8Yuo55i/gQqEaI8XVb8UFFzroom/nwcLzLiMXjCTivYKHqm/8h17b8rJxP76QUeTge2R8Ocqpby/l8Zr5c2NZIrpktRta0sT8eWvyvJ6bIZZmbNLa1/5cF412rQtWlGmfIqRLavP429ig5sq6JaZIhzRiawsvTdW0CsCWu7ycOj9oluXaAFSqddzw+PbMbRzAt1KtW3udZVaQPTLsdxljFjEqTK7UOog5TirrJaptoQsbEmdr2GzK5XU9naqnsp4kYJGEPskLTdVquy5DuMG3c2bXvaNsSh8OhSZQbaiRloqt0xrOukXHsG1vJ6NntLK6isewtJOl8bp4MKZP6cVJkb05s88rzw4PAmynh+sCXL1/x1tF1PV2QKMI2MOjdx2DVIRvv+fThI7VJYMFwOV8kL7ce5z1937OtK9Y6np4f6Vwglk0dSefvAV21ZJYklddht6N++iRBzTAqo6aIFtH1g1zc1rGuC33X32WyLohwXZtU97ptSsULpimqpJLsOu3MaiPJklUEdT5wOp85vb7fuzpvjCHWQs1SAJmWEeGqrOzVcFfQKIaybwC/1JzQWhQ6oPMddtCM2bV5eCkKIKoVHE3KZbRE7X3H6fyu28pmAfXunKjSgnMctSRyzHSDnINx21jmC6VU+nFgN+yYlxVjNzof6IYABYK1rfmQZrkU+O67n1QZdj19LMRS+OH77/ANEeC94/PXr3f3s2166FoypVpiTtojhKBqu7YIzCIC5Dwv+rtuUaQUzJ2fgi6lVh1bqzCl/bQn58ylaHSxbVtb/CXOpxPXWeOy0lysvuvlWG17IQ3gHQd/ACeKpXGe63ImLUpXO5/feXwQNnierwz7HeTM9TLThZ6hoSSqleu1VM1+c5KywxhhBqosEMo4nnbsW9eBNQTjWdPGul4ZhwnnHJ8//4NaEx+eP+B8xy9/+xvd0PPp03eM4yAVlff8/Kc/qoDImS9fv+AMfPf991hjSDlinBQb9YbbKJKuPj49M+6POO8JxhJT4np5Y3h4aLrwijeWy/Uqd/HLC8m1wwawNtD34R5sv62buqssKsB1vrIuK49PjwQfSFGJXofjA0/Pz1Qj2XIxlRQ3tutVjmsHh2nH8XiQL6CB5ow1TOPINI13I1aJVXucdaU4x9gQNdZYQueI2yac+WEnL4wLdN3vpNqbiumWnuicY9xNvL2+kqpyNqq1UtRZw76NBq0XWqMYGlcq6BKs+nlovoObkpA2wky357BNLnrvmVPjiFUJeJfrpe0gxEUy1uG55UtUBRVVSFW59tPgJa2t8mWt64oLHbuuI5XCw8MTVL07OWeMDzw8HO9FqnWay9dcwDuuyyI/THA8Pj5AKcqdb4Y+RyUmRzBOMnxgN40SjqTEMAWeHp/khaA2igEKz6qNEQUYCtYHcqM8GKvkwBwzprOYnDBOkEnnXYsxTaxx066rwRqN1di+1kJJGkEfjg+6eM9XjDW8X955fHgSLt2quCj19nNp32AqxJI0oq+/74xNaTJ5Z4lLwhTofU80kRw3ileOfCqV129v2iebtgeVS9RTs2k3emkVuDgiJWWsVcWVamHsBxlrSst+aKMlqjDVCq/P4LwumxZlqhc7CXyFEMHWWYLVB1iNXKzOB3FwjOTbpSR8aCarJtec56taOt8xhI5sG+xuzSS/MY0fwGSWecZ7h2/jEdeIjTGmm+ZPclrnBeMqhViM5pjWEnPmcDxSc+J6vWKBZAUrrElu1i4ETIa1Fl0aFp6fX/AGtpRaDnjLN6h6QI9OWv+0/n74Wu94DFpgO2MaHrvj+fmJYRYKfFnXhudoOR1GbKJlW1nWlf1hpDd9k/9VteUhMG8rfT+w++HA2Pcs28o8z/S+43g83Em41eglKEV+AO89cd2akcvSN0TKNi/8+o/fOD48MB32ko46jdakEjoQml7+8eWJfdzx4dN3vL2+8tuXLxwfHnh6EjhRipMLNNNZSllomKqgGuccJjUAmrHK8WheCxcGHsed4jStJRjDvCxcrlf2xyPeWtamjvHB83Y60+8mxq5jTSs5ZaZpvDtaSy68vr+Tto24bRzbRZOaKW/a70gpsS7aI5Tb0nQc8VgZkJ4fMNXhLyd2Oy2n70EztXC5XNgdD3jjmsInUopMp1M3NYZam2c3MJw1DtfLv1EbRVbBTTq49b0V0pK1A/HqhI7HBz2fpVCq4Xy5EJersB/6T977bWskY12WhdN1xlYl4DkH2yJNfzcqVe1m+ryp53LrouIy0+2me+ecUma339+pAsY4KvpeKaWlzW3333ccx2YerRwOB+3dkjAStRV7Ifjmq6ptCXsz3gkddDpdCcEJpx7kps+lNISGnqN1WRQq5R2T7+5IG4Oirp5ePghkaSoOi21jpnlbBLV0Ch2TjNdSc+KyXO+XVIor9rBnGkZqLeyNUeeSkjJtFiFUwtBrJ5EzvQ2YLuCzWHQFSzBeU5dtofOev/7lb5xPJ37++Y+YhuLpuh6CJRRD9VVqsG1j7Aau64xzTgDWWhpOyPG+vrPZjYf9ASLgvLqbqHCxfuhgpSE+PP5mZceK4FQqrNuM8m6BKlzG5XJVHGMp7L3MJSa1zAmKBtu3qt0o4tIYBWxocCamUkoy4j1/eGFt4wI5oq9axjW1gHdBf0czC9VS2JaVbuiFtsiZfui1sE5JFcgwMPSdMrOBb6+v7KaJvs8s68rQD5zetAvZ7cTJsU2HnFsOQiiFvh+IcePyvujBtJYvv30Ga9kdtV/IOfHlt8/89ONP2GBJccOUineBDy/PrFvEkdv8NuOxLNsiCNwwsKXI27c3Hh+OeuFLaXJhmZu8V+Sq8zu6XnP8fhh0wTXFzQ3q571j54RYTjlr+WyrllHrxm+ff2OadhjgMs9sccX3PbtBOyIah8tUeTas1tjklsudose5FhBFYWns+sPxyDxfyaWw3+9uX7MotVWLvR+//4FUC50LzNeZjx8+aKeRVZFVYBhH4rrqd+x7fvjxxztkzhiZxlITLIDUUSBDnlhD2qltVvLIT58+qespAuGdz2e+vb1zvZx4+fBEbnsKY6Q+yzXjbEcsiS+/fWk04wrO8d3HTzweNQYTejtRa2EYJ7Z1oxaoKZO8EQZh2sv1G4c2es2a78NdcOFaRyFSqKcFnKvrbc7m1BDrYmipApWLXQmDNRZyM2emLao7NqVh+2/cq16LzvYeGvSd2CalNsYqsxuNJt7eXvn67ZWyiShw2O95fHrGej3H3lrWGMlJLC4XQsOFKGb08z9+w3x64cPLx9at3Ob0kgf7YKi5Lb2tpOhLXMlb4nq98On77xi8uj+ZyTKmimqajQK+bFsKb9vG2yLiwn6/xxvL+/nMl8+fmwIIfqu/8fDwyOV8xjrP49MjtkIkYbAtH7ve5nCA8DbjqPczrZHdMCoPJ3S8n090fa+xL62jiELcd8FDaFt7cyB4T1qjwKXNv0XXg6mEzuGK1FIWCQksQpWLM+fxk56D3WFHWDQa3e/2/Nf/47/iQuAPP/xMKYXLMtPbAayYcjcZe9tdt5FRIypbFevHw0GXSRKLypTK0CkLPRiYxqntlgwlRvwyX3FeEYq5FK7XCzlmfMjsd4e2LFHlEHMkX6ELIrjmmpXClCVbDU5y01wy3nhyTTijeT0VQhgIgfvBSz/ivUxIaUukvNAPbcHYN01yqZRbGh7KC+6be7LvVImuubC0jseFTkuYnPj08QXvO86X9/uS/bdvv3HYHxh3TQpIZdsifW91KDotN6tzWrK23INpv+N8vlCqIW0rl8sV64VmCBhSbp0EImZa5yT3pOBLS8xqc8RUCq+vb3z5/BvGwsemEMopU61iXIMVciFlyXuXGMlR1bc4TKVJSqXGkQIys21bS6wr979T+QnwfnpnnhceHx942B+132lB8DVpHixYIjgjVMm6LazrSui6exhVGDoeHh90kCHq7boIn37Y78itK/RA8EHL3JJ5enpmt9vJMY0kvDRpoxmGNuagaeKFNKFdDNapepy3VbGi1qrKQ16b3LhL3inAJbeCRqZOy3a98nh8Zr8/yKPiVJys28b5dGKcBvbTHh8C1+sF5xzn05lPHz4yNuXH9SK+WTcNeGOJRlLIWqFsCeNpFFJ5RuZtoe8nqlNew35/bB1ybTC6guscaVOOvHdBBF7jWBdhS5wPLPOJEAK7w4FhCMynN/76t194fHzkw4cP5KqDqncaa6VNaWa2dabW1ObvyTy/fNAOUvNfcqxEr1l1zBVvA/4wsh/3dJ0n5yR3dugoDmqsYISf2JqpVB3iZ+bLhf1xRzKSfe/H/d2fYEwW76i51p21OC8fTPGBGJV9YQJ3Sbs1jnHUTurmLTLG4jG8riuX04Xz6Uwp8Pj4wDSMfMVorBY879/e2e0k0Z2vF/a7CWcs06hdTokZawu1IUBEH2mQx/YOxy3K2d95DsdDe/aUCvft9ZX304nDbmK/1/8Po9hTj6TSdd0k/mndEtWQchIGpAuE0BGcRCShydy3FqZmjEb03ktl+PLhI3/95W/89V//je9ePmGccqpzzorVDeZuYahG6qUcN9FyndDypWicfTqfWK5XcIHnlydqhSH0pJKwRgbpsR8UhWydlQ77Jh90CoJZlsg0NridtTweD5izWsyuH+4VgtzRBlMqqWa89WzLRu0raStitbe4zlslWGtly7UF7gx437E7OKEvhol5vapj2e+pFta44Uti3Ilqmk0lxUzMVw6HI77rGJpk0xtDRESFVDRL9KEDq1HQ99/9oBczJ8URGoM3heTbyCkmcK4paCT5M1mRlTkL6ZCyKtxpmqg5E63a7bwl5mXTZ5YztakILstFhFUnKJ2pkNaV19c3rLV8//E7qVNu+59aebte+fb2jWXd+P7TJ7ZmPrPW8vZ+4nkYqDUxb83FbZsZb9uw3iuVbF0xPvD9999LrdDGSjQneU5RKIwQWIt+bkttAUpCNGyXK6HvtNxsc2k5Sytb1uFmjOH99KYlf9fReRkTS62kUklRqinf+UYPvcWeylRXs6qkUjI5yy3bt4vCG6MRR5aUOW8RPxl811GcLuecYqPsujvVNqdCN4hV04Wen//0Rynp2s5FmcoOH/Tdnd5PGOt5fHjQTsc6XXCNabOuUbsnr4XoZVn49uULruvYjcr+GNpCsxqoFDrncc3h/346s9spr6OUTNf31Jr+H54eoaDVvndjT9cFYspgkPzTSVixbQrGuXU7WEEzjbc6LARqJUDDQFQwlWno2nK1JQgaK5R4kaP8w+Mz20GO5jEETtcLb2+vfP/dD4DS1FxLxLNGhq1lvnB6f6fmyvFw5On5CVcMv/z9Fx4fHvj5x5/UGTjh+Uut1BzJVbyyYZzuGSfOKrd+i5FME0g0a7bEMi3mNFdy3ORUXjc+f/mN3bTj6fjIt91XTpeLul5T6bqgzmCLbFsSZ+5R6qllVYqf6zuKreSctMMJnr6XzPrr21f2+wO7caIPHZfrBec8X16/8l//v/8np8uJH3/+mX/68z/x9PQo6bUVbbmUwrotTRnq8c7CLUZ53di2yMvzoKV3G71ll+97xtvgX/h7jar/1//0n0XAAGzOuK6nVgskvHEkUtvTWIK1VKtcjVoFBvzy7St/+8tf7xTvUirTODD08niE6qE3dypE5wK+83L8FqSE6UMHGKahMC8r87LweNwzDCPPfS+Ojbll1LoWqNGyWevvlanDYnpPNY55eZfJygpPABDXWYym9n+XWtkd9gTfae7cLhOHvAiuBcar8nRkExs8TulUzitPN2fJQEst9MVrhOM93ioEx44iqm5xY1kXjbtCr1Ada5jjxi7stKBO4hHpZ1FuBAZ2u0mO7U3MKhttO9Q0Wqu50S2Batt8vVhy0sLIecfTxw8cnx7pQ0eqCmIPVjPW0+srnz9/5f39nUrl4eGB3TiK924qMa1czydC6Di9v1NK5ofvvsNhGHZ7Yoq4CqkanLPEokPx+HAkWN/Q4zLR1RqpRj9/uX3mjRVjS9F+wSlEZ8sirlIKl+VCsJ7DtMMYw/HwoMOtUz60p2VntOhG8bzAYYkoAEqGQIkg5nXB+8D7RcoQ5xzrulJ9wHvLuqycTu8Kf/JefoBtY77MjLtRoDzv74lxKS9454kxEvqO54ZYEOJb+7SSs16ODx/5y1/+wvV85eXDB0n9mwmx6wSidMawGya6Qal287yw5UxYN962jffXV/74pz+3alEHW0aLdhqcbb5qTp5ilKy1LZlv1NktRcZhgKILxgZHV4pEBW10k2oFY3l5eeF4eFDFi5aVrnYaefWuKZI0Pqy2skXJcXfj7e9tihrbmEUx0fUD3gVKFpRxuc7M11mXCoaN0gCMFbLBj0HIjqHHGhUpw9DzfnpnWxb+sa18+PjpLuHEKMlwSQlDVeyw8/fPoZQiM6Sx5Bix93TJqoIOjcVxFuND+1wL6/nKeb7w9PDAbr/nfJ0xztK7XnsAp5wVV+Hi9ffMaVFEgPfE2Ax4bWw5Wkc1hvPpwtvriYf9g9I1U+TL6yu9d/z9r39jiQshBF6enpimURdTO0fI2tONw8i6LeQcyRnW08rT0xNPT4+kmDBOOw0XOoIVAtC3tEeQSKDmrN9z2Xg8Hnh4ONDdRAel4L3FIBLFmjZFDVcryXajXqRtoxC5nC/KBqmayjinfJm+JVneoKAxRl5PbxyPR3zM2/9DznobUVjruVy/sc0L5aDIxNqMVtU6SoWaVN0WMpaiB7gWpt2Id514TCVTcpu1VmmVl2Xhuqjdqgh9fD2dMM7x8eWDWD80GLm1TJOqKNt4MLQXZZp2uqgA33TAtt6kglLNuIYbv5n2bsu/WyKUbQjzbCqXZcYUGKdJhNHY5GEGXIV/fPnKfj/x/PjAfhx52yLrtlFyxh808pChTwfkbe58mPYsy8IyLxwOO5yzTGbANLx0SYXQFtZvr2/88uuvxC3SjR3juGO3m+g6LZzXeSanzPly4enRczju7yqpWEoz0yDkRt9LadX2Qt60w9p7KSnQ6BDTlGwl33dJueFHFDdbmqzUKYejjUyq059bqPSjmFrGGEnwDKr8iioYBbPIiVxLJSNwW0qJr6/f2I87pmkkbQvG7Di9n/i3//FvDGPPhw8f6IaBaRLuwbfqvKZ0Lx7WeWUrG36amJzH9lVS5lrpQqAkVafeeazzkDOXVeH1wTvthqyMmd//8FOL1n2Taikl+rG/e4NqKYSh49OHTyzLlRgjp8uZNa10JbDFCDXTB0WfxpI57vZyEztL9Kqqc/tX3/fULM5RKcImAHSDdmYEXXZxS+x2I5fLmZITQ99hmrpl3SLWW/owKNSqKXHWORI6MZDev53ow8huGPUdk+9hO/JAJYU5WSOVYNdz2O/luB8GQmnO+JL0WVW1v97Zu3+gFFjOi0Z9LqjiLVUehKxOdtsUcNM18N2WhKFQOqV+d3UNeqeLqZze3zHWctzvMDdXvKlYbxmHiaHroFYO0w4+FWjqQe9c25tWtlrpO+UyrJs4WC4EvDVcF42FKm0C4SzTbqTrvqMfeqW+1cLz4QjO8YefDd/98AMlJb77/juGfmwdMngDscLlegFgHIQ+yrnydnrjr3//O999+siSIyxoT9kN7fkq9wx0aqWmrMx6Y7GDLvFaS/NMGXJtJrq2I+l9B1UycmeF/fBNWVmr4fDwAAbe396FAx8nfNDF6VxLNcRyvl5Zlo2no0WAFKM5Xh9ck1VKHeOMbXAvGd1qe/mF0i1crzOh93d+UnCB0LUPC4hpIzgvzTC0iEGlcgUnpG5NyjUYdxPruhHbDZprJXgdosFqP+Gc4XKa2daNw0HkVIpmldkBRbLBrg9yZjaJ3k1DboqAf5flKgu+dVqS+yAHY1PnlKzlufFOKYhVMrj30xt9cErYc8IydFXQvdRMKzkXXPAKM2l7gWqANtu9ERvvrPhWKQiaVzhdLuSU6frA99/9yOOjnNJvr2+8nd45n0+ELsi42DhG98vTQI56yGzwmnPSlrRO33OhtPSx+Ht+BZX1etXsvCnWeicMxzYv+E6VRm1u3nmeOb2f2R93mK7JHs3vQS+F+rtaLEUpebyQ1DVr3JFLQ2s7HWA+BILzPD08MviOX8+/8Pr2lTD3pJj56Y8/8/T0fK/2AIL32sXkzDCNxC2yriv9vqPve2KMdF6z4GXbRObtA9MwqYhw2rtsm0B7FXVdxgjkt2vPbS4t2br8PxPrfC9qbNpW/uN/+k/spolqDd4GulHZApKH13tEbCmFkjJ0OhBSQ564Bld8e/vG6e3E49MTU9+TQCNR5zCdOpzD4ahscbQAD10gRK+Ap9FQtqw435bHbrH4oG7KWmVv1IaIMe2SVG50JsXtjs+fxgEbAlvK2KaxX7eN5XphHA8tZzrdPS/ys1hijvTDxHefPjJ2gZIy27Jyww1P49Rw7m0S1pbVipoxXC/zXd3oxw7fcBnzfOG6OA67PeM48nQ4Uo3h4fGRsevv0vTdoam6bkqsdh7VEjHe433H9Tpzen8npczT4yNj33FdV7Z1pZbCNO3YTztckw7nIhruOAzgHX3fsS6LSABbpIQObwOpZtakhTsoVK3vlIbog+Pp40c+//ILS87aeaIEuMs8M47qIvO6qMBrcxapsozICMZoxFsrWMflcsX7ICRMk8JqUpLIZeF8PhO85/H4IP/POPJ4OHB6vDBfrwzD0KwIJ/YNPVRqZepHOq89pDfAOl/lJnTTzdQM1rE/TMRNS8KSs4J6FEbMLUbUYkVdLMqasCVjjMYywXmKEU/JIPrrul2pMeOCFkTLthBqIHS97PNN9ne5nO+UTutFq9xi4uvnz8zrwjD0gr15LZ1q1eETa2qkx/aQIB35tY2gQgicXt95/viiQ9u4BthTClkxlXm54rpw1x1bKwnt9x+/owvSRNfmu8DZ5ma8xRjqS0rNT+GbczTXyjRqLJKpDK29W9eV3gdsraRVecDDODAOA7vdjhA818usxeAy04XAYf+gQ3CN5FrZt3HFvG3tsmsZt40Ce7qcGceRbvTUrSihz3spgrZFlXBb1j4cjqSqea6z7n4RpZJ5fX1lXVcu5zPbugmQ5/XZBxewxmjhnRNV6e9aIpMhCSy4tfD3rpnZpn7g48ePDKFv0krLLdZ02u3VVpfE++sr3nl80NHrjGFOic+fP3M4HDk+HKhFhcu8rm13lKlRIzAhKjK//fbK8fjA49Nj87VchfvwQTPjqjwT1zqokjPtPic1yahGNEkNba7YLnAc+rspSclncvQ6o6yBWJQYdkNbOPj/F3Umy20cQRB9vc2CjQwRFCVLVDjCYf//H0nhsLUQlgQQmL0XH6oI3XECMD3VWZkvsVWlQELoxoHvhwOXvschdvQlJ4VhCqakjz1d3+uLWBPl6jBar9fy8kxFE9xWnTiWIlc5bNtSOcF8l1KuATCTrU7dXnD7XtAvzjhWztENA925A2NpmiDYGANxTkSVyCp1WeE9+/1r7vb3wpHKWXqfjWW32XI4nShGbncOkUSKuox8ETt4VQdOxyPzPHBfPWCDBDq9MUyLNLtVVeBuf69yklebayaWxPl8oVmJzm5eHFGI+6cYwzLLf7cAfX9mijNN1bDGaIPgzDD05LqmdhUxR7zq/CkXmIQr5auKlXNEHZ4W6xiHQaZy66QTJ3hOfcd2A61vaauG12/eXgc0i6GbJ75++ZcP7z9gvVeirJxfyXB9jo0VdDoGjA4/Xp1qgJ7TIm0WJSYcDodrFsuYTKgrggvcbLfsdlvIhX4aOB5PVNoc6YwTpaaqRKWRa1TB+/pqYy2pUIjUoaautZQ+Z/nBTydwjpvNhqI6HgaCrYTgOC8UZ/BOpn+bpT60qAQjU+0vj/XL4rsO9dW7HWPk6emJ7z9+8vj+kd0usJTM4XDg0nWkFHk6HPj98VG1YxD7moSxxmGimMK6aeWWQeZweNJrrGMaRjKFNw+viSRcFgSB845x6CXIst0SiywTkyuA+LilTnGBaSGbQk1FQnYx8yxIBJeFcDnNEze7W4buwrevX7m/v2NJ4viZ1IkzTxOVSkXd0HOz3VFXNbHId7ksgre42+/lD1gKm+2aEjPH5yPWOLarliVnlnHipbmqqPd/Gkf+/vSJN7+95aF+4HnsCVVg5VvGsedy6eS25MRdIwUqogtTMikrZwr4+PGTINOt5eHhQXVaWZRNWeStjLjIYkYtvI7j8SSsreAJtQwWc1wwMWEbS+XrKxEzLgt121DyS02s5FWmeZbRMslLvThHyoXa+6sLxVorS8plZhoHhR4uhEqaD5u6wW7F/TFNsrNoWoUpWo1G6U1WwrMShnTaWHh+vtDq4TNOC01dMWvX8sBLaBOsS9dJNqrsGHTh+/KZRetqhQTQ8/PHT54vF5FpVi3BOaZxph97dusN5+7C538+k4H3796y3WxYNORIzkyzJv+xLHEmp6KqrHAMUpJnzwYr+xxkR56s+O29cxSn3CcjFk+ZFguhCswp6Q3iFXUr8LtcEqt1K13Q2u8RnLCqnO59lqVIz7Ii0//78o1zd+H+/o4P797JIaQL+ZQyKWfWq5amrhjGEWERCuPIqOsuqpQS40LXSS5is9mKaSElYpqp/eZXAFAHuKzPhfdyQIcQ9LaogTMDlbNYZOeVU6K4TDAOCgq/hHmZOF8uQjr2nlotsUnl2qAav7WG6J2wm7LA/GLOrOpGh0zZBZUUub19Rd02gtzfbMTAkcUIFEsUY4N2nRhjZAHvHFinEqj8XsZb4kXOpnXb8tcff15lpO7SscoN6F5WAi4QrOduvxfJKqUrZXdOCecD/wO6KoanIvmT/gAAAABJRU5ErkJggg==", + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from PIL import Image\n", + "Image.open('demo/banana.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sRfAui8EkTDX" + }, + "source": [ + "### Prepare the config file and checkpoint file\n", + "\n", + "We configure a model with a config file and save weights with a checkpoint file.\n", + "\n", + "On GitHub, you can find all these pre-trained models in the config folder of MMClassification. For example, you can find the config files and checkpoints of Mobilenet V2 in [this link](https://github.com/open-mmlab/mmclassification/tree/master/configs/mobilenet_v2).\n", + "\n", + "We have integrated many config files for various models in the MMClassification repository. As for the checkpoint, we can download it in advance, or just pass an URL to API, and MMClassification will download it before load weights." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VvRoZpBGkgpC", + "outputId": "68282782-015e-4f5c-cef2-79be3bf6a9b7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py\n" + ] + } + ], + "source": [ + "# Confirm the config file exists\n", + "!ls configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py\n", + "\n", + "# Specify the path of the config file and checkpoint file.\n", + "config_file = 'configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py'\n", + "checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eiYdsHoIkpD1" + }, + "source": [ + "### Inference the model\n", + "\n", + "MMClassification provides high-level Python API to inference models.\n", + "\n", + "At first, we build the MobilenetV2 model and load the checkpoint." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 323, + "referenced_widgets": [ + "badf240bbb7d442fbd214e837edbffe2", + "520112917e0f4844995d418c5041d23a", + "9f3f6b72b4d14e2a96b9185331c8081b", + "a275bef3584b49ab9b680b528420d461", + "c4b2c6914a05497b8d2b691bd6dda6da", + "863d2a8cc4074f2e890ba6aea7c54384", + "be55ab36267d4dcab1d83dfaa8540270", + "31475aa888da4c8d844ba99a0b3397f5", + "e310c50e610248dd897fbbf5dd09dd7a", + "8a8ab7c27e404459951cffe7a32b8faa", + "e1a3dce90c1a4804a9ef0c687a9c0703" + ] + }, + "id": "KwJWlR2QkpiV", + "outputId": "982b365e-d3be-4e3d-dee7-c507a8020292" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/mmcv/cnn/bricks/transformer.py:28: UserWarning: Fail to import ``MultiScaleDeformableAttention`` from ``mmcv.ops.multi_scale_deform_attn``, You should install ``mmcv-full`` if you need this module. \n", + " warnings.warn('Fail to import ``MultiScaleDeformableAttention`` from '\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/local/lib/python3.7/dist-packages/yaml/constructor.py:126: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", + " if not isinstance(key, collections.Hashable):\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Use load_from_http loader\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\" to /root/.cache/torch/hub/checkpoints/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "badf240bbb7d442fbd214e837edbffe2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/13.5M [00:00" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "# Visualize the inference result\n", + "show_result_pyplot(model, img, result)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oDMr3Bx_lESy" + }, + "source": [ + "## Fine-tune a model with Python API\n", + "\n", + "Fine-tuning is to re-train a model which has been trained on another dataset (like ImageNet) to fit our target dataset. Compared with training from scratch, fine-tuning is much faster can avoid over-fitting problems during training on a small dataset.\n", + "\n", + "The basic steps of fine-tuning are as below:\n", + "\n", + "1. Prepare the target dataset and meet MMClassification's requirements.\n", + "2. Modify the training config.\n", + "3. Start training and validation.\n", + "\n", + "More details are in [the docs](https://mmclassification.readthedocs.io/en/latest/tutorials/finetune.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TJtKKwAvlHX_" + }, + "source": [ + "### Prepare the target dataset\n", + "\n", + "Here we download the cats & dogs dataset directly. You can find more introduction about the dataset in the [tools tutorial](https://colab.research.google.com/github/open-mmlab/mmclassification/blob/master/docs/tutorials/MMClassification_tools.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3vBfU8GGlFPS", + "outputId": "b12dadb4-ccbc-45b4-bb08-3d24977ed93c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2021-10-21 03:57:58-- https://www.dropbox.com/s/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip?dl=0\n", + "Resolving www.dropbox.com (www.dropbox.com)... 162.125.80.18, 2620:100:6018:18::a27d:312\n", + "Connecting to www.dropbox.com (www.dropbox.com)|162.125.80.18|:443... connected.\n", + "HTTP request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/raw/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip [following]\n", + "--2021-10-21 03:57:58-- https://www.dropbox.com/s/raw/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://ucfd8157272a6270e100392293da.dl.dropboxusercontent.com/cd/0/inline/BYbFG6Zo1S3l2kJtqLrJIne9lTLgQn-uoJxmUjhLSkp36V7AoiwlyR2gP0XVoUQt9WzF2ZsmeERagMy7rpsNoIYG4MjsYA90i_JsarFDs9PHhXHw9qwHpHqBvgd4YU_mwDQHuouJ_oCU1kft04QgCVRg/file# [following]\n", + "--2021-10-21 03:57:59-- https://ucfd8157272a6270e100392293da.dl.dropboxusercontent.com/cd/0/inline/BYbFG6Zo1S3l2kJtqLrJIne9lTLgQn-uoJxmUjhLSkp36V7AoiwlyR2gP0XVoUQt9WzF2ZsmeERagMy7rpsNoIYG4MjsYA90i_JsarFDs9PHhXHw9qwHpHqBvgd4YU_mwDQHuouJ_oCU1kft04QgCVRg/file\n", + "Resolving ucfd8157272a6270e100392293da.dl.dropboxusercontent.com (ucfd8157272a6270e100392293da.dl.dropboxusercontent.com)... 162.125.3.15, 2620:100:6018:15::a27d:30f\n", + "Connecting to ucfd8157272a6270e100392293da.dl.dropboxusercontent.com (ucfd8157272a6270e100392293da.dl.dropboxusercontent.com)|162.125.3.15|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: /cd/0/inline2/BYYSXb-0kWS7Lpk-cdrgBGzcOBfsvy7KjhqWEgjI5L9xfcaXohKlVeFMNFVyqvCwZLym2kWCD0nwURRpQ2mnHICrNsrvTvavbn24hk1Bd3_lXX08LBBe3C6YvD2U_iP8UMXROqm-B3JtnBjeMpk1R4YZ0O6aVLgKu0eET9RXsRaNCczD2lTK_i72zmbYhGmBvlRWmf_yQnnS5WKpGhSAobznIqKzw78yPzo5FsgGiEj5VXb91AElrKVAW8HFC9EhdUs7RrL3q9f0mQ9TbQpauoAp32TL3YQcuAp891Rv-EmDVxzfMwKVTGU8hxR2SiIWkse4u2QGhliqhdha7qBu7sIPcIoeI5-DdSoc6XG77vTYTRhrs_cf7rQuTPH2gTIUwTY/file [following]\n", + "--2021-10-21 03:57:59-- https://ucfd8157272a6270e100392293da.dl.dropboxusercontent.com/cd/0/inline2/BYYSXb-0kWS7Lpk-cdrgBGzcOBfsvy7KjhqWEgjI5L9xfcaXohKlVeFMNFVyqvCwZLym2kWCD0nwURRpQ2mnHICrNsrvTvavbn24hk1Bd3_lXX08LBBe3C6YvD2U_iP8UMXROqm-B3JtnBjeMpk1R4YZ0O6aVLgKu0eET9RXsRaNCczD2lTK_i72zmbYhGmBvlRWmf_yQnnS5WKpGhSAobznIqKzw78yPzo5FsgGiEj5VXb91AElrKVAW8HFC9EhdUs7RrL3q9f0mQ9TbQpauoAp32TL3YQcuAp891Rv-EmDVxzfMwKVTGU8hxR2SiIWkse4u2QGhliqhdha7qBu7sIPcIoeI5-DdSoc6XG77vTYTRhrs_cf7rQuTPH2gTIUwTY/file\n", + "Reusing existing connection to ucfd8157272a6270e100392293da.dl.dropboxusercontent.com:443.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 228802825 (218M) [application/zip]\n", + "Saving to: ‘cats_dogs_dataset.zip’\n", + "\n", + "cats_dogs_dataset.z 100%[===================>] 218.20M 86.3MB/s in 2.5s \n", + "\n", + "2021-10-21 03:58:02 (86.3 MB/s) - ‘cats_dogs_dataset.zip’ saved [228802825/228802825]\n", + "\n" + ] + } + ], + "source": [ + "# Download the cats & dogs dataset\n", + "!wget https://www.dropbox.com/s/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip?dl=0 -O cats_dogs_dataset.zip\n", + "!mkdir -p data\n", + "!unzip -qo cats_dogs_dataset.zip -d ./data/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "15iKNG0SlV9y" + }, + "source": [ + "### Read the config file and modify the config\n", + "\n", + "In the [tools tutorial](https://colab.research.google.com/github/open-mmlab/mmclassification/blob/master/docs/tutorials/MMClassification_tools.ipynb), we have introduced all parts of the config file, and here we can modify the loaded config by Python code." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "WCfnDavFlWrK" + }, + "outputs": [], + "source": [ + "# Load the base config file\n", + "from mmcv import Config\n", + "from mmcls.utils import auto_select_device\n", + "\n", + "cfg = Config.fromfile('configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py')\n", + "cfg.device = auto_select_device()\n", + "\n", + "# Modify the number of classes in the head.\n", + "cfg.model.head.num_classes = 2\n", + "cfg.model.head.topk = (1, )\n", + "\n", + "# Load the pre-trained model's checkpoint.\n", + "cfg.model.backbone.init_cfg = dict(type='Pretrained', checkpoint=checkpoint_file, prefix='backbone')\n", + "\n", + "# Specify sample size and number of workers.\n", + "cfg.data.samples_per_gpu = 32\n", + "cfg.data.workers_per_gpu = 2\n", + "\n", + "# Specify the path and meta files of training dataset\n", + "cfg.data.train.data_prefix = 'data/cats_dogs_dataset/training_set/training_set'\n", + "cfg.data.train.classes = 'data/cats_dogs_dataset/classes.txt'\n", + "\n", + "# Specify the path and meta files of validation dataset\n", + "cfg.data.val.data_prefix = 'data/cats_dogs_dataset/val_set/val_set'\n", + "cfg.data.val.ann_file = 'data/cats_dogs_dataset/val.txt'\n", + "cfg.data.val.classes = 'data/cats_dogs_dataset/classes.txt'\n", + "\n", + "# Specify the path and meta files of test dataset\n", + "cfg.data.test.data_prefix = 'data/cats_dogs_dataset/test_set/test_set'\n", + "cfg.data.test.ann_file = 'data/cats_dogs_dataset/test.txt'\n", + "cfg.data.test.classes = 'data/cats_dogs_dataset/classes.txt'\n", + "\n", + "# Specify the normalization parameters in data pipeline\n", + "normalize_cfg = dict(type='Normalize', mean=[124.508, 116.050, 106.438], std=[58.577, 57.310, 57.437], to_rgb=True)\n", + "cfg.data.train.pipeline[3] = normalize_cfg\n", + "cfg.data.val.pipeline[3] = normalize_cfg\n", + "cfg.data.test.pipeline[3] = normalize_cfg\n", + "\n", + "# Modify the evaluation metric\n", + "cfg.evaluation['metric_options']={'topk': (1, )}\n", + "\n", + "# Specify the optimizer\n", + "cfg.optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0001)\n", + "cfg.optimizer_config = dict(grad_clip=None)\n", + "\n", + "# Specify the learning rate scheduler\n", + "cfg.lr_config = dict(policy='step', step=1, gamma=0.1)\n", + "cfg.runner = dict(type='EpochBasedRunner', max_epochs=2)\n", + "\n", + "# Specify the work directory\n", + "cfg.work_dir = './work_dirs/cats_dogs_dataset'\n", + "\n", + "# Output logs for every 10 iterations\n", + "cfg.log_config.interval = 10\n", + "\n", + "# Set the random seed and enable the deterministic option of cuDNN\n", + "# to keep the results' reproducible.\n", + "from mmcls.apis import set_random_seed\n", + "cfg.seed = 0\n", + "set_random_seed(0, deterministic=True)\n", + "\n", + "cfg.gpu_ids = range(1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HDerVUPFmNR0" + }, + "source": [ + "### Fine-tune the model\n", + "\n", + "Use the API `train_model` to fine-tune our model on the cats & dogs dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "P7unq5cNmN8G", + "outputId": "bf32711b-7bdf-45ee-8db5-e8699d3eff91" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-10-21 04:04:12,758 - mmcv - INFO - initialize MobileNetV2 with init_cfg {'type': 'Pretrained', 'checkpoint': 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth', 'prefix': 'backbone'}\n", + "2021-10-21 04:04:12,759 - mmcv - INFO - load backbone in model from: https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\n", + "2021-10-21 04:04:12,815 - mmcv - INFO - initialize LinearClsHead with init_cfg {'type': 'Normal', 'layer': 'Linear', 'std': 0.01}\n", + "2021-10-21 04:04:12,818 - mmcv - INFO - \n", + "backbone.conv1.conv.weight - torch.Size([32, 3, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,821 - mmcv - INFO - \n", + "backbone.conv1.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,823 - mmcv - INFO - \n", + "backbone.conv1.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,824 - mmcv - INFO - \n", + "backbone.layer1.0.conv.0.conv.weight - torch.Size([32, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,826 - mmcv - INFO - \n", + "backbone.layer1.0.conv.0.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,827 - mmcv - INFO - \n", + "backbone.layer1.0.conv.0.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,829 - mmcv - INFO - \n", + "backbone.layer1.0.conv.1.conv.weight - torch.Size([16, 32, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,830 - mmcv - INFO - \n", + "backbone.layer1.0.conv.1.bn.weight - torch.Size([16]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,832 - mmcv - INFO - \n", + "backbone.layer1.0.conv.1.bn.bias - torch.Size([16]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,833 - mmcv - INFO - \n", + "backbone.layer2.0.conv.0.conv.weight - torch.Size([96, 16, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,835 - mmcv - INFO - \n", + "backbone.layer2.0.conv.0.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,836 - mmcv - INFO - \n", + "backbone.layer2.0.conv.0.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,838 - mmcv - INFO - \n", + "backbone.layer2.0.conv.1.conv.weight - torch.Size([96, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,839 - mmcv - INFO - \n", + "backbone.layer2.0.conv.1.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,841 - mmcv - INFO - \n", + "backbone.layer2.0.conv.1.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,842 - mmcv - INFO - \n", + "backbone.layer2.0.conv.2.conv.weight - torch.Size([24, 96, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,844 - mmcv - INFO - \n", + "backbone.layer2.0.conv.2.bn.weight - torch.Size([24]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,845 - mmcv - INFO - \n", + "backbone.layer2.0.conv.2.bn.bias - torch.Size([24]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,847 - mmcv - INFO - \n", + "backbone.layer2.1.conv.0.conv.weight - torch.Size([144, 24, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,848 - mmcv - INFO - \n", + "backbone.layer2.1.conv.0.bn.weight - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,850 - mmcv - INFO - \n", + "backbone.layer2.1.conv.0.bn.bias - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,851 - mmcv - INFO - \n", + "backbone.layer2.1.conv.1.conv.weight - torch.Size([144, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,853 - mmcv - INFO - \n", + "backbone.layer2.1.conv.1.bn.weight - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,854 - mmcv - INFO - \n", + "backbone.layer2.1.conv.1.bn.bias - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,856 - mmcv - INFO - \n", + "backbone.layer2.1.conv.2.conv.weight - torch.Size([24, 144, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,857 - mmcv - INFO - \n", + "backbone.layer2.1.conv.2.bn.weight - torch.Size([24]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,858 - mmcv - INFO - \n", + "backbone.layer2.1.conv.2.bn.bias - torch.Size([24]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,860 - mmcv - INFO - \n", + "backbone.layer3.0.conv.0.conv.weight - torch.Size([144, 24, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,861 - mmcv - INFO - \n", + "backbone.layer3.0.conv.0.bn.weight - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,863 - mmcv - INFO - \n", + "backbone.layer3.0.conv.0.bn.bias - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,864 - mmcv - INFO - \n", + "backbone.layer3.0.conv.1.conv.weight - torch.Size([144, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,866 - mmcv - INFO - \n", + "backbone.layer3.0.conv.1.bn.weight - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,867 - mmcv - INFO - \n", + "backbone.layer3.0.conv.1.bn.bias - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,869 - mmcv - INFO - \n", + "backbone.layer3.0.conv.2.conv.weight - torch.Size([32, 144, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,870 - mmcv - INFO - \n", + "backbone.layer3.0.conv.2.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,872 - mmcv - INFO - \n", + "backbone.layer3.0.conv.2.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,873 - mmcv - INFO - \n", + "backbone.layer3.1.conv.0.conv.weight - torch.Size([192, 32, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,875 - mmcv - INFO - \n", + "backbone.layer3.1.conv.0.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,876 - mmcv - INFO - \n", + "backbone.layer3.1.conv.0.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,878 - mmcv - INFO - \n", + "backbone.layer3.1.conv.1.conv.weight - torch.Size([192, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,879 - mmcv - INFO - \n", + "backbone.layer3.1.conv.1.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,882 - mmcv - INFO - \n", + "backbone.layer3.1.conv.1.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,883 - mmcv - INFO - \n", + "backbone.layer3.1.conv.2.conv.weight - torch.Size([32, 192, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,885 - mmcv - INFO - \n", + "backbone.layer3.1.conv.2.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,886 - mmcv - INFO - \n", + "backbone.layer3.1.conv.2.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,887 - mmcv - INFO - \n", + "backbone.layer3.2.conv.0.conv.weight - torch.Size([192, 32, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,889 - mmcv - INFO - \n", + "backbone.layer3.2.conv.0.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,890 - mmcv - INFO - \n", + "backbone.layer3.2.conv.0.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,892 - mmcv - INFO - \n", + "backbone.layer3.2.conv.1.conv.weight - torch.Size([192, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,894 - mmcv - INFO - \n", + "backbone.layer3.2.conv.1.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,895 - mmcv - INFO - \n", + "backbone.layer3.2.conv.1.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,896 - mmcv - INFO - \n", + "backbone.layer3.2.conv.2.conv.weight - torch.Size([32, 192, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,898 - mmcv - INFO - \n", + "backbone.layer3.2.conv.2.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,899 - mmcv - INFO - \n", + "backbone.layer3.2.conv.2.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,901 - mmcv - INFO - \n", + "backbone.layer4.0.conv.0.conv.weight - torch.Size([192, 32, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,903 - mmcv - INFO - \n", + "backbone.layer4.0.conv.0.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,907 - mmcv - INFO - \n", + "backbone.layer4.0.conv.0.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,908 - mmcv - INFO - \n", + "backbone.layer4.0.conv.1.conv.weight - torch.Size([192, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,910 - mmcv - INFO - \n", + "backbone.layer4.0.conv.1.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,911 - mmcv - INFO - \n", + "backbone.layer4.0.conv.1.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,913 - mmcv - INFO - \n", + "backbone.layer4.0.conv.2.conv.weight - torch.Size([64, 192, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,914 - mmcv - INFO - \n", + "backbone.layer4.0.conv.2.bn.weight - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,915 - mmcv - INFO - \n", + "backbone.layer4.0.conv.2.bn.bias - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,917 - mmcv - INFO - \n", + "backbone.layer4.1.conv.0.conv.weight - torch.Size([384, 64, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,918 - mmcv - INFO - \n", + "backbone.layer4.1.conv.0.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,920 - mmcv - INFO - \n", + "backbone.layer4.1.conv.0.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,921 - mmcv - INFO - \n", + "backbone.layer4.1.conv.1.conv.weight - torch.Size([384, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,923 - mmcv - INFO - \n", + "backbone.layer4.1.conv.1.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,924 - mmcv - INFO - \n", + "backbone.layer4.1.conv.1.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,925 - mmcv - INFO - \n", + "backbone.layer4.1.conv.2.conv.weight - torch.Size([64, 384, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,927 - mmcv - INFO - \n", + "backbone.layer4.1.conv.2.bn.weight - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,928 - mmcv - INFO - \n", + "backbone.layer4.1.conv.2.bn.bias - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,930 - mmcv - INFO - \n", + "backbone.layer4.2.conv.0.conv.weight - torch.Size([384, 64, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,932 - mmcv - INFO - \n", + "backbone.layer4.2.conv.0.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,933 - mmcv - INFO - \n", + "backbone.layer4.2.conv.0.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,935 - mmcv - INFO - \n", + "backbone.layer4.2.conv.1.conv.weight - torch.Size([384, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,936 - mmcv - INFO - \n", + "backbone.layer4.2.conv.1.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,938 - mmcv - INFO - \n", + "backbone.layer4.2.conv.1.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,939 - mmcv - INFO - \n", + "backbone.layer4.2.conv.2.conv.weight - torch.Size([64, 384, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,941 - mmcv - INFO - \n", + "backbone.layer4.2.conv.2.bn.weight - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,942 - mmcv - INFO - \n", + "backbone.layer4.2.conv.2.bn.bias - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,944 - mmcv - INFO - \n", + "backbone.layer4.3.conv.0.conv.weight - torch.Size([384, 64, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,945 - mmcv - INFO - \n", + "backbone.layer4.3.conv.0.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,946 - mmcv - INFO - \n", + "backbone.layer4.3.conv.0.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,948 - mmcv - INFO - \n", + "backbone.layer4.3.conv.1.conv.weight - torch.Size([384, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,949 - mmcv - INFO - \n", + "backbone.layer4.3.conv.1.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,951 - mmcv - INFO - \n", + "backbone.layer4.3.conv.1.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,952 - mmcv - INFO - \n", + "backbone.layer4.3.conv.2.conv.weight - torch.Size([64, 384, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,954 - mmcv - INFO - \n", + "backbone.layer4.3.conv.2.bn.weight - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,955 - mmcv - INFO - \n", + "backbone.layer4.3.conv.2.bn.bias - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,957 - mmcv - INFO - \n", + "backbone.layer5.0.conv.0.conv.weight - torch.Size([384, 64, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,958 - mmcv - INFO - \n", + "backbone.layer5.0.conv.0.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,959 - mmcv - INFO - \n", + "backbone.layer5.0.conv.0.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,961 - mmcv - INFO - \n", + "backbone.layer5.0.conv.1.conv.weight - torch.Size([384, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,963 - mmcv - INFO - \n", + "backbone.layer5.0.conv.1.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,964 - mmcv - INFO - \n", + "backbone.layer5.0.conv.1.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Use load_from_http loader\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-10-21 04:04:12,965 - mmcv - INFO - \n", + "backbone.layer5.0.conv.2.conv.weight - torch.Size([96, 384, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,967 - mmcv - INFO - \n", + "backbone.layer5.0.conv.2.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,969 - mmcv - INFO - \n", + "backbone.layer5.0.conv.2.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,970 - mmcv - INFO - \n", + "backbone.layer5.1.conv.0.conv.weight - torch.Size([576, 96, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,972 - mmcv - INFO - \n", + "backbone.layer5.1.conv.0.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,973 - mmcv - INFO - \n", + "backbone.layer5.1.conv.0.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,975 - mmcv - INFO - \n", + "backbone.layer5.1.conv.1.conv.weight - torch.Size([576, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,976 - mmcv - INFO - \n", + "backbone.layer5.1.conv.1.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,978 - mmcv - INFO - \n", + "backbone.layer5.1.conv.1.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,979 - mmcv - INFO - \n", + "backbone.layer5.1.conv.2.conv.weight - torch.Size([96, 576, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,981 - mmcv - INFO - \n", + "backbone.layer5.1.conv.2.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,982 - mmcv - INFO - \n", + "backbone.layer5.1.conv.2.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,984 - mmcv - INFO - \n", + "backbone.layer5.2.conv.0.conv.weight - torch.Size([576, 96, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,985 - mmcv - INFO - \n", + "backbone.layer5.2.conv.0.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,986 - mmcv - INFO - \n", + "backbone.layer5.2.conv.0.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,988 - mmcv - INFO - \n", + "backbone.layer5.2.conv.1.conv.weight - torch.Size([576, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,989 - mmcv - INFO - \n", + "backbone.layer5.2.conv.1.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,991 - mmcv - INFO - \n", + "backbone.layer5.2.conv.1.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,992 - mmcv - INFO - \n", + "backbone.layer5.2.conv.2.conv.weight - torch.Size([96, 576, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,994 - mmcv - INFO - \n", + "backbone.layer5.2.conv.2.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,995 - mmcv - INFO - \n", + "backbone.layer5.2.conv.2.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,997 - mmcv - INFO - \n", + "backbone.layer6.0.conv.0.conv.weight - torch.Size([576, 96, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,998 - mmcv - INFO - \n", + "backbone.layer6.0.conv.0.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,999 - mmcv - INFO - \n", + "backbone.layer6.0.conv.0.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,001 - mmcv - INFO - \n", + "backbone.layer6.0.conv.1.conv.weight - torch.Size([576, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,002 - mmcv - INFO - \n", + "backbone.layer6.0.conv.1.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,004 - mmcv - INFO - \n", + "backbone.layer6.0.conv.1.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,005 - mmcv - INFO - \n", + "backbone.layer6.0.conv.2.conv.weight - torch.Size([160, 576, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,007 - mmcv - INFO - \n", + "backbone.layer6.0.conv.2.bn.weight - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,008 - mmcv - INFO - \n", + "backbone.layer6.0.conv.2.bn.bias - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,010 - mmcv - INFO - \n", + "backbone.layer6.1.conv.0.conv.weight - torch.Size([960, 160, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,011 - mmcv - INFO - \n", + "backbone.layer6.1.conv.0.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,013 - mmcv - INFO - \n", + "backbone.layer6.1.conv.0.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,014 - mmcv - INFO - \n", + "backbone.layer6.1.conv.1.conv.weight - torch.Size([960, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,015 - mmcv - INFO - \n", + "backbone.layer6.1.conv.1.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,017 - mmcv - INFO - \n", + "backbone.layer6.1.conv.1.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,018 - mmcv - INFO - \n", + "backbone.layer6.1.conv.2.conv.weight - torch.Size([160, 960, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,021 - mmcv - INFO - \n", + "backbone.layer6.1.conv.2.bn.weight - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,022 - mmcv - INFO - \n", + "backbone.layer6.1.conv.2.bn.bias - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,024 - mmcv - INFO - \n", + "backbone.layer6.2.conv.0.conv.weight - torch.Size([960, 160, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,025 - mmcv - INFO - \n", + "backbone.layer6.2.conv.0.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,027 - mmcv - INFO - \n", + "backbone.layer6.2.conv.0.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,028 - mmcv - INFO - \n", + "backbone.layer6.2.conv.1.conv.weight - torch.Size([960, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,030 - mmcv - INFO - \n", + "backbone.layer6.2.conv.1.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,031 - mmcv - INFO - \n", + "backbone.layer6.2.conv.1.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,033 - mmcv - INFO - \n", + "backbone.layer6.2.conv.2.conv.weight - torch.Size([160, 960, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,034 - mmcv - INFO - \n", + "backbone.layer6.2.conv.2.bn.weight - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,036 - mmcv - INFO - \n", + "backbone.layer6.2.conv.2.bn.bias - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,037 - mmcv - INFO - \n", + "backbone.layer7.0.conv.0.conv.weight - torch.Size([960, 160, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,039 - mmcv - INFO - \n", + "backbone.layer7.0.conv.0.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,040 - mmcv - INFO - \n", + "backbone.layer7.0.conv.0.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,041 - mmcv - INFO - \n", + "backbone.layer7.0.conv.1.conv.weight - torch.Size([960, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,043 - mmcv - INFO - \n", + "backbone.layer7.0.conv.1.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,045 - mmcv - INFO - \n", + "backbone.layer7.0.conv.1.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,046 - mmcv - INFO - \n", + "backbone.layer7.0.conv.2.conv.weight - torch.Size([320, 960, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,048 - mmcv - INFO - \n", + "backbone.layer7.0.conv.2.bn.weight - torch.Size([320]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,049 - mmcv - INFO - \n", + "backbone.layer7.0.conv.2.bn.bias - torch.Size([320]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,051 - mmcv - INFO - \n", + "backbone.conv2.conv.weight - torch.Size([1280, 320, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,052 - mmcv - INFO - \n", + "backbone.conv2.bn.weight - torch.Size([1280]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,054 - mmcv - INFO - \n", + "backbone.conv2.bn.bias - torch.Size([1280]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,055 - mmcv - INFO - \n", + "head.fc.weight - torch.Size([2, 1280]): \n", + "NormalInit: mean=0, std=0.01, bias=0 \n", + " \n", + "2021-10-21 04:04:13,057 - mmcv - INFO - \n", + "head.fc.bias - torch.Size([2]): \n", + "NormalInit: mean=0, std=0.01, bias=0 \n", + " \n", + "2021-10-21 04:04:13,408 - mmcls - INFO - Start running, host: root@cc5b42005207, work_dir: /content/mmclassification/work_dirs/cats_dogs_dataset\n", + "2021-10-21 04:04:13,412 - mmcls - INFO - Hooks will be executed in the following order:\n", + "before_run:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_train_epoch:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_train_iter:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + " -------------------- \n", + "after_train_iter:\n", + "(ABOVE_NORMAL) OptimizerHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "after_train_epoch:\n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_val_epoch:\n", + "(LOW ) IterTimerHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_epoch:\n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "2021-10-21 04:04:13,417 - mmcls - INFO - workflow: [('train', 1)], max: 2 epochs\n", + "2021-10-21 04:04:18,924 - mmcls - INFO - Epoch [1][10/201]\tlr: 5.000e-03, eta: 0:03:29, time: 0.535, data_time: 0.259, memory: 1709, loss: 0.3917\n", + "2021-10-21 04:04:21,743 - mmcls - INFO - Epoch [1][20/201]\tlr: 5.000e-03, eta: 0:02:35, time: 0.281, data_time: 0.019, memory: 1709, loss: 0.3508\n", + "2021-10-21 04:04:24,552 - mmcls - INFO - Epoch [1][30/201]\tlr: 5.000e-03, eta: 0:02:15, time: 0.280, data_time: 0.020, memory: 1709, loss: 0.3955\n", + "2021-10-21 04:04:27,371 - mmcls - INFO - Epoch [1][40/201]\tlr: 5.000e-03, eta: 0:02:04, time: 0.282, data_time: 0.021, memory: 1709, loss: 0.2485\n", + "2021-10-21 04:04:30,202 - mmcls - INFO - Epoch [1][50/201]\tlr: 5.000e-03, eta: 0:01:56, time: 0.283, data_time: 0.021, memory: 1709, loss: 0.4196\n", + "2021-10-21 04:04:33,021 - mmcls - INFO - Epoch [1][60/201]\tlr: 5.000e-03, eta: 0:01:50, time: 0.282, data_time: 0.023, memory: 1709, loss: 0.4994\n", + "2021-10-21 04:04:35,800 - mmcls - INFO - Epoch [1][70/201]\tlr: 5.000e-03, eta: 0:01:45, time: 0.278, data_time: 0.020, memory: 1709, loss: 0.4372\n", + "2021-10-21 04:04:38,595 - mmcls - INFO - Epoch [1][80/201]\tlr: 5.000e-03, eta: 0:01:40, time: 0.280, data_time: 0.019, memory: 1709, loss: 0.3179\n", + "2021-10-21 04:04:41,351 - mmcls - INFO - Epoch [1][90/201]\tlr: 5.000e-03, eta: 0:01:36, time: 0.276, data_time: 0.018, memory: 1709, loss: 0.3175\n", + "2021-10-21 04:04:44,157 - mmcls - INFO - Epoch [1][100/201]\tlr: 5.000e-03, eta: 0:01:32, time: 0.280, data_time: 0.021, memory: 1709, loss: 0.3412\n", + "2021-10-21 04:04:46,974 - mmcls - INFO - Epoch [1][110/201]\tlr: 5.000e-03, eta: 0:01:28, time: 0.282, data_time: 0.019, memory: 1709, loss: 0.2985\n", + "2021-10-21 04:04:49,767 - mmcls - INFO - Epoch [1][120/201]\tlr: 5.000e-03, eta: 0:01:25, time: 0.280, data_time: 0.021, memory: 1709, loss: 0.2778\n", + "2021-10-21 04:04:52,553 - mmcls - INFO - Epoch [1][130/201]\tlr: 5.000e-03, eta: 0:01:21, time: 0.278, data_time: 0.021, memory: 1709, loss: 0.2229\n", + "2021-10-21 04:04:55,356 - mmcls - INFO - Epoch [1][140/201]\tlr: 5.000e-03, eta: 0:01:18, time: 0.280, data_time: 0.021, memory: 1709, loss: 0.2318\n", + "2021-10-21 04:04:58,177 - mmcls - INFO - Epoch [1][150/201]\tlr: 5.000e-03, eta: 0:01:14, time: 0.282, data_time: 0.022, memory: 1709, loss: 0.2333\n", + "2021-10-21 04:05:01,025 - mmcls - INFO - Epoch [1][160/201]\tlr: 5.000e-03, eta: 0:01:11, time: 0.285, data_time: 0.020, memory: 1709, loss: 0.2783\n", + "2021-10-21 04:05:03,833 - mmcls - INFO - Epoch [1][170/201]\tlr: 5.000e-03, eta: 0:01:08, time: 0.281, data_time: 0.022, memory: 1709, loss: 0.2132\n", + "2021-10-21 04:05:06,648 - mmcls - INFO - Epoch [1][180/201]\tlr: 5.000e-03, eta: 0:01:05, time: 0.281, data_time: 0.019, memory: 1709, loss: 0.2096\n", + "2021-10-21 04:05:09,472 - mmcls - INFO - Epoch [1][190/201]\tlr: 5.000e-03, eta: 0:01:02, time: 0.282, data_time: 0.020, memory: 1709, loss: 0.1729\n", + "2021-10-21 04:05:12,229 - mmcls - INFO - Epoch [1][200/201]\tlr: 5.000e-03, eta: 0:00:59, time: 0.275, data_time: 0.018, memory: 1709, loss: 0.1969\n", + "2021-10-21 04:05:12,275 - mmcls - INFO - Saving checkpoint at 1 epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[>>>>>>>>>>>>>>>>>>>>>>>>>>] 1601/1601, 104.1 task/s, elapsed: 15s, ETA: 0s" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-10-21 04:05:27,767 - mmcls - INFO - Epoch(val) [1][51]\taccuracy_top-1: 95.6277\n", + "2021-10-21 04:05:32,987 - mmcls - INFO - Epoch [2][10/201]\tlr: 5.000e-04, eta: 0:00:57, time: 0.505, data_time: 0.238, memory: 1709, loss: 0.1764\n", + "2021-10-21 04:05:35,779 - mmcls - INFO - Epoch [2][20/201]\tlr: 5.000e-04, eta: 0:00:54, time: 0.278, data_time: 0.020, memory: 1709, loss: 0.1514\n", + "2021-10-21 04:05:38,537 - mmcls - INFO - Epoch [2][30/201]\tlr: 5.000e-04, eta: 0:00:51, time: 0.276, data_time: 0.020, memory: 1709, loss: 0.1395\n", + "2021-10-21 04:05:41,283 - mmcls - INFO - Epoch [2][40/201]\tlr: 5.000e-04, eta: 0:00:48, time: 0.275, data_time: 0.020, memory: 1709, loss: 0.1508\n", + "2021-10-21 04:05:44,017 - mmcls - INFO - Epoch [2][50/201]\tlr: 5.000e-04, eta: 0:00:44, time: 0.274, data_time: 0.021, memory: 1709, loss: 0.1771\n", + "2021-10-21 04:05:46,800 - mmcls - INFO - Epoch [2][60/201]\tlr: 5.000e-04, eta: 0:00:41, time: 0.278, data_time: 0.020, memory: 1709, loss: 0.1438\n", + "2021-10-21 04:05:49,570 - mmcls - INFO - Epoch [2][70/201]\tlr: 5.000e-04, eta: 0:00:38, time: 0.277, data_time: 0.020, memory: 1709, loss: 0.1321\n", + "2021-10-21 04:05:52,314 - mmcls - INFO - Epoch [2][80/201]\tlr: 5.000e-04, eta: 0:00:35, time: 0.275, data_time: 0.021, memory: 1709, loss: 0.1629\n", + "2021-10-21 04:05:55,052 - mmcls - INFO - Epoch [2][90/201]\tlr: 5.000e-04, eta: 0:00:32, time: 0.273, data_time: 0.021, memory: 1709, loss: 0.1574\n", + "2021-10-21 04:05:57,791 - mmcls - INFO - Epoch [2][100/201]\tlr: 5.000e-04, eta: 0:00:29, time: 0.274, data_time: 0.019, memory: 1709, loss: 0.1220\n", + "2021-10-21 04:06:00,534 - mmcls - INFO - Epoch [2][110/201]\tlr: 5.000e-04, eta: 0:00:26, time: 0.274, data_time: 0.021, memory: 1709, loss: 0.2550\n", + "2021-10-21 04:06:03,295 - mmcls - INFO - Epoch [2][120/201]\tlr: 5.000e-04, eta: 0:00:23, time: 0.276, data_time: 0.019, memory: 1709, loss: 0.1528\n", + "2021-10-21 04:06:06,048 - mmcls - INFO - Epoch [2][130/201]\tlr: 5.000e-04, eta: 0:00:20, time: 0.275, data_time: 0.022, memory: 1709, loss: 0.1223\n", + "2021-10-21 04:06:08,811 - mmcls - INFO - Epoch [2][140/201]\tlr: 5.000e-04, eta: 0:00:17, time: 0.276, data_time: 0.021, memory: 1709, loss: 0.1734\n", + "2021-10-21 04:06:11,576 - mmcls - INFO - Epoch [2][150/201]\tlr: 5.000e-04, eta: 0:00:14, time: 0.277, data_time: 0.020, memory: 1709, loss: 0.1527\n", + "2021-10-21 04:06:14,330 - mmcls - INFO - Epoch [2][160/201]\tlr: 5.000e-04, eta: 0:00:11, time: 0.276, data_time: 0.020, memory: 1709, loss: 0.1910\n", + "2021-10-21 04:06:17,106 - mmcls - INFO - Epoch [2][170/201]\tlr: 5.000e-04, eta: 0:00:09, time: 0.277, data_time: 0.019, memory: 1709, loss: 0.1922\n", + "2021-10-21 04:06:19,855 - mmcls - INFO - Epoch [2][180/201]\tlr: 5.000e-04, eta: 0:00:06, time: 0.274, data_time: 0.023, memory: 1709, loss: 0.1760\n", + "2021-10-21 04:06:22,638 - mmcls - INFO - Epoch [2][190/201]\tlr: 5.000e-04, eta: 0:00:03, time: 0.278, data_time: 0.019, memory: 1709, loss: 0.1739\n", + "2021-10-21 04:06:25,367 - mmcls - INFO - Epoch [2][200/201]\tlr: 5.000e-04, eta: 0:00:00, time: 0.272, data_time: 0.020, memory: 1709, loss: 0.1654\n", + "2021-10-21 04:06:25,410 - mmcls - INFO - Saving checkpoint at 2 epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[>>>>>>>>>>>>>>>>>>>>>>>>>>] 1601/1601, 105.5 task/s, elapsed: 15s, ETA: 0s" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-10-21 04:06:40,694 - mmcls - INFO - Epoch(val) [2][51]\taccuracy_top-1: 97.5016\n" + ] + } + ], + "source": [ + "import time\n", + "import mmcv\n", + "import os.path as osp\n", + "\n", + "from mmcls.datasets import build_dataset\n", + "from mmcls.models import build_classifier\n", + "from mmcls.apis import train_model\n", + "\n", + "# Create the work directory\n", + "mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))\n", + "# Build the classifier\n", + "model = build_classifier(cfg.model)\n", + "model.init_weights()\n", + "# Build the dataset\n", + "datasets = [build_dataset(cfg.data.train)]\n", + "# Add `CLASSES` attributes to help visualization\n", + "model.CLASSES = datasets[0].CLASSES\n", + "# Start fine-tuning\n", + "train_model(\n", + " model,\n", + " datasets,\n", + " cfg,\n", + " distributed=False,\n", + " validate=True,\n", + " timestamp=time.strftime('%Y%m%d_%H%M%S', time.localtime()),\n", + " meta=dict())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 304 + }, + "id": "HsoGBZA3miui", + "outputId": "eb2e09f5-55ce-4165-b754-3b75dbc829ab" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "# Validate the fine-tuned model\n", + "\n", + "img = mmcv.imread('data/cats_dogs_dataset/training_set/training_set/cats/cat.1.jpg')\n", + "\n", + "model.cfg = cfg\n", + "result = inference_model(model, img)\n", + "\n", + "show_result_pyplot(model, img, result)" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "MMClassification_python.ipynb", + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.11" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "31475aa888da4c8d844ba99a0b3397f5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "520112917e0f4844995d418c5041d23a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "863d2a8cc4074f2e890ba6aea7c54384": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8a8ab7c27e404459951cffe7a32b8faa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9f3f6b72b4d14e2a96b9185331c8081b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_be55ab36267d4dcab1d83dfaa8540270", + "placeholder": "​", + "style": "IPY_MODEL_863d2a8cc4074f2e890ba6aea7c54384", + "value": "100%" + } + }, + "a275bef3584b49ab9b680b528420d461": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e310c50e610248dd897fbbf5dd09dd7a", + "max": 14206911, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_31475aa888da4c8d844ba99a0b3397f5", + "value": 14206911 + } + }, + "badf240bbb7d442fbd214e837edbffe2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9f3f6b72b4d14e2a96b9185331c8081b", + "IPY_MODEL_a275bef3584b49ab9b680b528420d461", + "IPY_MODEL_c4b2c6914a05497b8d2b691bd6dda6da" + ], + "layout": "IPY_MODEL_520112917e0f4844995d418c5041d23a" + } + }, + "be55ab36267d4dcab1d83dfaa8540270": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c4b2c6914a05497b8d2b691bd6dda6da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e1a3dce90c1a4804a9ef0c687a9c0703", + "placeholder": "​", + "style": "IPY_MODEL_8a8ab7c27e404459951cffe7a32b8faa", + "value": " 13.5M/13.5M [00:01<00:00, 9.60MB/s]" + } + }, + "e1a3dce90c1a4804a9ef0c687a9c0703": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e310c50e610248dd897fbbf5dd09dd7a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/en/tutorials/MMClassification_tools.ipynb b/docs/en/tutorials/MMClassification_tools.ipynb new file mode 100755 index 0000000..ee87e71 --- /dev/null +++ b/docs/en/tutorials/MMClassification_tools.ipynb @@ -0,0 +1,1249 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "MMClassification_tools.ipynb", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "XjQxmm04iTx4", + "tags": [] + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4z0JDgisPRr-" + }, + "source": [ + "# MMClassification tools tutorial on Colab\n", + "\n", + "In this tutorial, we will introduce the following content:\n", + "\n", + "* How to install MMCls\n", + "* Prepare data\n", + "* Prepare the config file\n", + "* Train and test model with shell command" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "inm7Ciy5PXrU" + }, + "source": [ + "## Install MMClassification\n", + "\n", + "Before using MMClassification, we need to prepare the environment with the following steps:\n", + "\n", + "1. Install Python, CUDA, C/C++ compiler and git\n", + "2. Install PyTorch (CUDA version)\n", + "3. Install mmcv\n", + "4. Clone mmcls source code from GitHub and install it\n", + "\n", + "Because this tutorial is on Google Colab, and the basic environment has been completed, we can skip the first two steps." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TDOxbcDvPbNk" + }, + "source": [ + "### Check environment" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "c6MbAw10iUJI", + "outputId": "8d3d6b53-c69b-4425-ce0c-bfb8d31ab971" + }, + "source": [ + "%cd /content" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/content\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4IyFL3MaiYRu", + "outputId": "c46dc718-27de-418b-da17-9d5a717e8424" + }, + "source": [ + "!pwd" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/content\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DMw7QwvpiiUO", + "outputId": "0d852285-07c4-48d3-e537-4a51dea04d10" + }, + "source": [ + "# Check nvcc version\n", + "!nvcc -V" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "nvcc: NVIDIA (R) Cuda compiler driver\n", + "Copyright (c) 2005-2020 NVIDIA Corporation\n", + "Built on Mon_Oct_12_20:09:46_PDT_2020\n", + "Cuda compilation tools, release 11.1, V11.1.105\n", + "Build cuda_11.1.TC455_06.29190527_0\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4VIBU7Fain4D", + "outputId": "fb34a7b6-8eda-4180-e706-1bf67d1a6fd4" + }, + "source": [ + "# Check GCC version\n", + "!gcc --version" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "Copyright (C) 2017 Free Software Foundation, Inc.\n", + "This is free software; see the source for copying conditions. There is NO\n", + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "24lDLCqFisZ9", + "outputId": "304ad2f7-a9bb-4441-d25b-09b5516ccd74" + }, + "source": [ + "# Check PyTorch installation\n", + "import torch, torchvision\n", + "print(torch.__version__)\n", + "print(torch.cuda.is_available())" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.9.0+cu111\n", + "True\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "R2aZNLUwizBs" + }, + "source": [ + "### Install MMCV\n", + "\n", + "MMCV is the basic package of all OpenMMLab packages. We have pre-built wheels on Linux, so we can download and install them directly.\n", + "\n", + "Please pay attention to PyTorch and CUDA versions to match the wheel.\n", + "\n", + "In the above steps, we have checked the version of PyTorch and CUDA, and they are 1.9.0 and 11.1 respectively, so we need to choose the corresponding wheel.\n", + "\n", + "In addition, we can also install the full version of mmcv (mmcv-full). It includes full features and various CUDA ops out of the box, but needs a longer time to build." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nla40LrLi7oo", + "outputId": "a17d50d6-05b7-45d6-c3fb-6a2507415cf5" + }, + "source": [ + "# Install mmcv\n", + "!pip install mmcv -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "# !pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in links: https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "Collecting mmcv\n", + " Downloading mmcv-1.3.15.tar.gz (352 kB)\n", + "\u001b[K |████████████████████████████████| 352 kB 12.8 MB/s \n", + "\u001b[?25hCollecting addict\n", + " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv) (1.19.5)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcv) (21.0)\n", + "Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv) (7.1.2)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv) (3.13)\n", + "Collecting yapf\n", + " Downloading yapf-0.31.0-py2.py3-none-any.whl (185 kB)\n", + "\u001b[K |████████████████████████████████| 185 kB 49.3 MB/s \n", + "\u001b[?25hRequirement already satisfied: pyparsing>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->mmcv) (2.4.7)\n", + "Building wheels for collected packages: mmcv\n", + " Building wheel for mmcv (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for mmcv: filename=mmcv-1.3.15-py2.py3-none-any.whl size=509835 sha256=13b8c5d70c29029916f661f2dc9b773b74a9ea4e0758491a7b5c15c798efaa61\n", + " Stored in directory: /root/.cache/pip/wheels/b2/f4/4e/8f6d2dd2bef6b7eb8c89aa0e5d61acd7bff60aaf3d4d4b29b0\n", + "Successfully built mmcv\n", + "Installing collected packages: yapf, addict, mmcv\n", + "Successfully installed addict-2.4.0 mmcv-1.3.15 yapf-0.31.0\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GDTUrYvXjlRb" + }, + "source": [ + "### Clone and install MMClassification\n", + "\n", + "Next, we clone the latest mmcls repository from GitHub and install it." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Bwme6tWHjl5s", + "outputId": "7e2d54c8-b134-405a-b014-194da1708776" + }, + "source": [ + "# Clone mmcls repository\n", + "!git clone https://github.com/open-mmlab/mmclassification.git\n", + "%cd mmclassification/\n", + "\n", + "# Install MMClassification from source\n", + "!pip install -e . " + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Cloning into 'mmclassification'...\n", + "remote: Enumerating objects: 4152, done.\u001b[K\n", + "remote: Counting objects: 100% (994/994), done.\u001b[K\n", + "remote: Compressing objects: 100% (579/579), done.\u001b[K\n", + "remote: Total 4152 (delta 476), reused 761 (delta 398), pack-reused 3158\u001b[K\n", + "Receiving objects: 100% (4152/4152), 8.21 MiB | 19.02 MiB/s, done.\n", + "Resolving deltas: 100% (2518/2518), done.\n", + "/content/mmclassification\n", + "Obtaining file:///content/mmclassification\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from mmcls==0.16.0) (3.2.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcls==0.16.0) (1.19.5)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcls==0.16.0) (21.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmcls==0.16.0) (0.10.0)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmcls==0.16.0) (1.3.2)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmcls==0.16.0) (2.4.7)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmcls==0.16.0) (2.8.2)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from cycler>=0.10->matplotlib->mmcls==0.16.0) (1.15.0)\n", + "Installing collected packages: mmcls\n", + " Running setup.py develop for mmcls\n", + "Successfully installed mmcls-0.16.0\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hFg_oSG4j3zB", + "outputId": "1cc74bac-f918-4f0e-bf56-9f13447dfce1" + }, + "source": [ + "# Check MMClassification installation\n", + "import mmcls\n", + "print(mmcls.__version__)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "0.16.0\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HCOHRp3iV5Xk" + }, + "source": [ + "## Prepare data" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XHCHnKb_Qd3P", + "outputId": "35496010-ee57-4e72-af00-2af55dc80f47" + }, + "source": [ + "# Download the dataset (cats & dogs dataset)\n", + "!wget https://www.dropbox.com/s/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip?dl=0 -O cats_dogs_dataset.zip\n", + "!mkdir -p data\n", + "!unzip -q cats_dogs_dataset.zip -d ./data/" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "--2021-10-21 02:47:54-- https://www.dropbox.com/s/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip?dl=0\n", + "Resolving www.dropbox.com (www.dropbox.com)... 162.125.67.18, 2620:100:6020:18::a27d:4012\n", + "Connecting to www.dropbox.com (www.dropbox.com)|162.125.67.18|:443... connected.\n", + "HTTP request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/raw/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip [following]\n", + "--2021-10-21 02:47:54-- https://www.dropbox.com/s/raw/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://uc88da1070f63f9a78ee48b59098.dl.dropboxusercontent.com/cd/0/inline/BYb26ayxWasysNPC1wSer1N9YqdOShCMIBzSIQ5NKaIoKQQ47lxZ3y7DkjKNLrYiSHkA_KgTE47_9jUHaHW79JqDtcSNEAO3unPfo8bPwsxaQUHqo97L_RjsSBhWg4HZStWRbLIJUl5WUOtpETbSQtvD/file# [following]\n", + "--2021-10-21 02:47:54-- https://uc88da1070f63f9a78ee48b59098.dl.dropboxusercontent.com/cd/0/inline/BYb26ayxWasysNPC1wSer1N9YqdOShCMIBzSIQ5NKaIoKQQ47lxZ3y7DkjKNLrYiSHkA_KgTE47_9jUHaHW79JqDtcSNEAO3unPfo8bPwsxaQUHqo97L_RjsSBhWg4HZStWRbLIJUl5WUOtpETbSQtvD/file\n", + "Resolving uc88da1070f63f9a78ee48b59098.dl.dropboxusercontent.com (uc88da1070f63f9a78ee48b59098.dl.dropboxusercontent.com)... 162.125.67.15, 2620:100:6020:15::a27d:400f\n", + "Connecting to uc88da1070f63f9a78ee48b59098.dl.dropboxusercontent.com (uc88da1070f63f9a78ee48b59098.dl.dropboxusercontent.com)|162.125.67.15|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: /cd/0/inline2/BYbEOCLrcXNg9qXvYXbyZZ0cgv3fSQ1vs-iqDCz24_84Fgz_2Z5SkserjAUpmYgty-eQkchAlzxQPbgzayZnie5yCipe42WVTChJJiIQ6m5x7GxgWJOn6_5QP3eRbFuYyrc1yV61BKlYuCJDHH0eyNaN8paR6bjevwMJ7Alip-gvf3c9JfjJmMgZrzcpknENyaI62FSgxFkX-Kc-FS41RYQadnMfUmhZCfMrFDSzTcmRprDiC9hQ-zJkcW_kbjI0whA1ZLQ-OG9-8Qf7jn8qd4g_tQLneL8X44qOUX4hRs2LE23g4n0jz8DeNt8KZ48WhGs8_20rBIgHH0dut3OjHF5DZMI8dVyHFAiJGyxOknZ5aCfImtz6MGgHDwbiipkICxk/file [following]\n", + "--2021-10-21 02:47:55-- https://uc88da1070f63f9a78ee48b59098.dl.dropboxusercontent.com/cd/0/inline2/BYbEOCLrcXNg9qXvYXbyZZ0cgv3fSQ1vs-iqDCz24_84Fgz_2Z5SkserjAUpmYgty-eQkchAlzxQPbgzayZnie5yCipe42WVTChJJiIQ6m5x7GxgWJOn6_5QP3eRbFuYyrc1yV61BKlYuCJDHH0eyNaN8paR6bjevwMJ7Alip-gvf3c9JfjJmMgZrzcpknENyaI62FSgxFkX-Kc-FS41RYQadnMfUmhZCfMrFDSzTcmRprDiC9hQ-zJkcW_kbjI0whA1ZLQ-OG9-8Qf7jn8qd4g_tQLneL8X44qOUX4hRs2LE23g4n0jz8DeNt8KZ48WhGs8_20rBIgHH0dut3OjHF5DZMI8dVyHFAiJGyxOknZ5aCfImtz6MGgHDwbiipkICxk/file\n", + "Reusing existing connection to uc88da1070f63f9a78ee48b59098.dl.dropboxusercontent.com:443.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 228802825 (218M) [application/zip]\n", + "Saving to: ‘cats_dogs_dataset.zip’\n", + "\n", + "cats_dogs_dataset.z 100%[===================>] 218.20M 16.9MB/s in 13s \n", + "\n", + "2021-10-21 02:48:08 (16.9 MB/s) - ‘cats_dogs_dataset.zip’ saved [228802825/228802825]\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e4t2P2aTQokX" + }, + "source": [ + "**After downloading and extraction,** we get \"Cats and Dogs Dataset\" and the file structure is as below:\n", + "```\n", + "data/cats_dogs_dataset\n", + "├── classes.txt\n", + "├── test.txt\n", + "├── val.txt\n", + "├── training_set\n", + "│ ├── training_set\n", + "│ │ ├── cats\n", + "│ │ │ ├── cat.1.jpg\n", + "│ │ │ ├── cat.2.jpg\n", + "│ │ │ ├── ...\n", + "│ │ ├── dogs\n", + "│ │ │ ├── dog.2.jpg\n", + "│ │ │ ├── dog.3.jpg\n", + "│ │ │ ├── ...\n", + "├── val_set\n", + "│ ├── val_set\n", + "│ │ ├── cats\n", + "│ │ │ ├── cat.3.jpg\n", + "│ │ │ ├── cat.5.jpg\n", + "│ │ │ ├── ...\n", + "│ │ ├── dogs\n", + "│ │ │ ├── dog.1.jpg\n", + "│ │ │ ├── dog.6.jpg\n", + "│ │ │ ├── ...\n", + "├── test_set\n", + "│ ├── test_set\n", + "│ │ ├── cats\n", + "│ │ │ ├── cat.4001.jpg\n", + "│ │ │ ├── cat.4002.jpg\n", + "│ │ │ ├── ...\n", + "│ │ ├── dogs\n", + "│ │ │ ├── dog.4001.jpg\n", + "│ │ │ ├── dog.4002.jpg\n", + "│ │ │ ├── ...\n", + "```\n", + "\n", + "You can use shell command `tree data/cats_dogs_dataset` to check the structure." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "46tyHTdtQy_Z", + "outputId": "6124a89e-03eb-4917-a0bf-df6a391eb280" + }, + "source": [ + "# Pick an image and visualize it\n", + "from PIL import Image\n", + "Image.open('data/cats_dogs_dataset/training_set/training_set/cats/cat.1.jpg')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "My5Z6p7pQ3UC" + }, + "source": [ + "### Support new dataset\n", + "\n", + "We have two methods to support a new dataset in MMClassification.\n", + "\n", + "The simplest method is to re-organize the new dataset as the format of a dataset supported officially (like ImageNet). And the other method is to create a new dataset class, and more details are in [the docs](https://mmclassification.readthedocs.io/en/latest/tutorials/new_dataset.html#an-example-of-customized-dataset).\n", + "\n", + "In this tutorial, for convenience, we have re-organized the cats & dogs dataset as the format of ImageNet." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "P335gKt9Q5U-" + }, + "source": [ + "Besides image files, it also includes the following files:\n", + "\n", + "1. A class list file, and every line is a class.\n", + " ```\n", + " cats\n", + " dogs\n", + " ```\n", + "2. Training / Validation / Test annotation files. And every line includes an file path and the corresponding label.\n", + "\n", + " ```\n", + " ...\n", + " cats/cat.3769.jpg 0\n", + " cats/cat.882.jpg 0\n", + " ...\n", + " dogs/dog.3881.jpg 1\n", + " dogs/dog.3377.jpg 1\n", + " ...\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BafQ7ijBQ8N_" + }, + "source": [ + "## Train and test model with shell commands\n", + "\n", + "You can use shell commands provided by MMClassification to do the following task:\n", + "\n", + "1. Train a model\n", + "2. Fine-tune a model\n", + "3. Test a model\n", + "4. Inference with a model\n", + "\n", + "The procedure to train and fine-tune a model is almost the same. And we have introduced how to do these tasks with Python API. In the following, we will introduce how to do them with shell commands. More details are in [the docs](https://mmclassification.readthedocs.io/en/latest/getting_started.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Aj5cGMihURrZ" + }, + "source": [ + "### Fine-tune a model\n", + "\n", + "The steps to fine-tune a model are as below:\n", + "\n", + "1. Prepare the custom dataset.\n", + "2. Create a new config file of the task.\n", + "3. Start training task by shell commands.\n", + "\n", + "We have finished the first step, and then we will introduce the next two steps.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WBBV3aG79ZH5" + }, + "source": [ + "#### Create a new config file\n", + "\n", + "To reuse the common parts of different config files, we support inheriting multiple base config files. For example, to fine-tune a MobileNetV2 model, the new config file can create the model's basic structure by inheriting `configs/_base_/models/mobilenet_v2_1x.py`.\n", + "\n", + "According to the common practice, we usually split whole configs into four parts: model, dataset, learning rate schedule, and runtime. Configs of each part are saved into one file in the `configs/_base_` folder. \n", + "\n", + "And then, when creating a new config file, we can select some parts to inherit and only override some different configs.\n", + "\n", + "The head of the final config file should look like:\n", + "\n", + "```python\n", + "_base_ = [\n", + " '../_base_/models/mobilenet_v2_1x.py',\n", + " '../_base_/schedules/imagenet_bs256_epochstep.py',\n", + " '../_base_/default_runtime.py'\n", + "]\n", + "```\n", + "\n", + "Here, because the dataset configs are almost brand new, we don't need to inherit any dataset config file.\n", + "\n", + "Of course, you can also create an entire config file without inheritance, like `configs/mnist/lenet5.py`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_UV3oBhLRG8B" + }, + "source": [ + "After that, we only need to set the part of configs we want to modify, because the inherited configs will be merged to the final configs." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8QfM4qBeWIQh", + "outputId": "a826f0cf-2633-4a9a-e49b-4be7eca5e3a0" + }, + "source": [ + "%%writefile configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py\n", + "_base_ = [\n", + " '../_base_/models/mobilenet_v2_1x.py',\n", + " '../_base_/schedules/imagenet_bs256_epochstep.py',\n", + " '../_base_/default_runtime.py'\n", + "]\n", + "\n", + "# ---- Model configs ----\n", + "# Here we use init_cfg to load pre-trained model.\n", + "# In this way, only the weights of backbone will be loaded.\n", + "# And modify the num_classes to match our dataset.\n", + "\n", + "model = dict(\n", + " backbone=dict(\n", + " init_cfg = dict(\n", + " type='Pretrained', \n", + " checkpoint='https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth', \n", + " prefix='backbone')\n", + " ),\n", + " head=dict(\n", + " num_classes=2,\n", + " topk = (1, )\n", + " ))\n", + "\n", + "# ---- Dataset configs ----\n", + "# We re-organized the dataset as ImageNet format.\n", + "dataset_type = 'ImageNet'\n", + "img_norm_cfg = dict(\n", + " mean=[124.508, 116.050, 106.438],\n", + " std=[58.577, 57.310, 57.437],\n", + " to_rgb=True)\n", + "train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='RandomResizedCrop', size=224, backend='pillow'),\n", + " dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),\n", + " dict(type='Normalize', **img_norm_cfg),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='ToTensor', keys=['gt_label']),\n", + " dict(type='Collect', keys=['img', 'gt_label'])\n", + "]\n", + "test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='Resize', size=(256, -1), backend='pillow'),\n", + " dict(type='CenterCrop', crop_size=224),\n", + " dict(type='Normalize', **img_norm_cfg),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + "]\n", + "data = dict(\n", + " # Specify the batch size and number of workers in each GPU.\n", + " # Please configure it according to your hardware.\n", + " samples_per_gpu=32,\n", + " workers_per_gpu=2,\n", + " # Specify the training dataset type and path\n", + " train=dict(\n", + " type=dataset_type,\n", + " data_prefix='data/cats_dogs_dataset/training_set/training_set',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=train_pipeline),\n", + " # Specify the validation dataset type and path\n", + " val=dict(\n", + " type=dataset_type,\n", + " data_prefix='data/cats_dogs_dataset/val_set/val_set',\n", + " ann_file='data/cats_dogs_dataset/val.txt',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=test_pipeline),\n", + " # Specify the test dataset type and path\n", + " test=dict(\n", + " type=dataset_type,\n", + " data_prefix='data/cats_dogs_dataset/test_set/test_set',\n", + " ann_file='data/cats_dogs_dataset/test.txt',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=test_pipeline))\n", + "\n", + "# Specify evaluation metric\n", + "evaluation = dict(metric='accuracy', metric_options={'topk': (1, )})\n", + "\n", + "# ---- Schedule configs ----\n", + "# Usually in fine-tuning, we need a smaller learning rate and less training epochs.\n", + "# Specify the learning rate\n", + "optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0001)\n", + "optimizer_config = dict(grad_clip=None)\n", + "# Set the learning rate scheduler\n", + "lr_config = dict(policy='step', step=1, gamma=0.1)\n", + "runner = dict(type='EpochBasedRunner', max_epochs=2)\n", + "\n", + "# ---- Runtime configs ----\n", + "# Output training log every 10 iterations.\n", + "log_config = dict(interval=10)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Writing configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "chLX7bL3RP2F" + }, + "source": [ + "#### Use shell command to start fine-tuning\n", + "\n", + "We use `tools/train.py` to fine-tune a model:\n", + "\n", + "```shell\n", + "python tools/train.py ${CONFIG_FILE} [optional arguments]\n", + "```\n", + "\n", + "And if you want to specify another folder to save log files and checkpoints, use the argument `--work_dir ${YOUR_WORK_DIR}`.\n", + "\n", + "If you want to ensure reproducibility, use the argument `--seed ${SEED}` to set a random seed. And the argument `--deterministic` can enable the deterministic option in cuDNN to further ensure reproducibility, but it may reduce the training speed.\n", + "\n", + "Here we use the `MobileNetV2` model and cats & dogs dataset as an example:\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gbFGR4SBRUYN", + "outputId": "3412752c-433f-43c5-82a9-3495d1cd797a" + }, + "source": [ + "!python tools/train.py \\\n", + " configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py \\\n", + " --work-dir work_dirs/mobilenet_v2_1x_cats_dogs \\\n", + " --seed 0 \\\n", + " --deterministic" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/usr/local/lib/python3.7/dist-packages/mmcv/cnn/bricks/transformer.py:28: UserWarning: Fail to import ``MultiScaleDeformableAttention`` from ``mmcv.ops.multi_scale_deform_attn``, You should install ``mmcv-full`` if you need this module. \n", + " warnings.warn('Fail to import ``MultiScaleDeformableAttention`` from '\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/local/lib/python3.7/dist-packages/yaml/constructor.py:126: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", + " if not isinstance(key, collections.Hashable):\n", + "2021-10-21 02:48:20,030 - mmcls - INFO - Environment info:\n", + "------------------------------------------------------------\n", + "sys.platform: linux\n", + "Python: 3.7.12 (default, Sep 10 2021, 00:21:48) [GCC 7.5.0]\n", + "CUDA available: True\n", + "GPU 0: Tesla K80\n", + "CUDA_HOME: /usr/local/cuda\n", + "NVCC: Build cuda_11.1.TC455_06.29190527_0\n", + "GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "PyTorch: 1.9.0+cu111\n", + "PyTorch compiling details: PyTorch built with:\n", + " - GCC 7.3\n", + " - C++ Version: 201402\n", + " - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n", + " - Intel(R) MKL-DNN v2.1.2 (Git Hash 98be7e8afa711dc9b66c8ff3504129cb82013cdb)\n", + " - OpenMP 201511 (a.k.a. OpenMP 4.5)\n", + " - NNPACK is enabled\n", + " - CPU capability usage: AVX2\n", + " - CUDA Runtime 11.1\n", + " - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86\n", + " - CuDNN 8.0.5\n", + " - Magma 2.5.2\n", + " - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.1, CUDNN_VERSION=8.0.5, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.9.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n", + "\n", + "TorchVision: 0.10.0+cu111\n", + "OpenCV: 4.1.2\n", + "MMCV: 1.3.15\n", + "MMCV Compiler: n/a\n", + "MMCV CUDA Compiler: n/a\n", + "MMClassification: 0.16.0+77a3834\n", + "------------------------------------------------------------\n", + "\n", + "2021-10-21 02:48:20,030 - mmcls - INFO - Distributed training: False\n", + "2021-10-21 02:48:20,688 - mmcls - INFO - Config:\n", + "model = dict(\n", + " type='ImageClassifier',\n", + " backbone=dict(\n", + " type='MobileNetV2',\n", + " widen_factor=1.0,\n", + " init_cfg=dict(\n", + " type='Pretrained',\n", + " checkpoint=\n", + " 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth',\n", + " prefix='backbone')),\n", + " neck=dict(type='GlobalAveragePooling'),\n", + " head=dict(\n", + " type='LinearClsHead',\n", + " num_classes=2,\n", + " in_channels=1280,\n", + " loss=dict(type='CrossEntropyLoss', loss_weight=1.0),\n", + " topk=(1, )))\n", + "optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0001)\n", + "optimizer_config = dict(grad_clip=None)\n", + "lr_config = dict(policy='step', gamma=0.1, step=1)\n", + "runner = dict(type='EpochBasedRunner', max_epochs=2)\n", + "checkpoint_config = dict(interval=1)\n", + "log_config = dict(interval=10, hooks=[dict(type='TextLoggerHook')])\n", + "dist_params = dict(backend='nccl')\n", + "log_level = 'INFO'\n", + "load_from = None\n", + "resume_from = None\n", + "workflow = [('train', 1)]\n", + "dataset_type = 'ImageNet'\n", + "img_norm_cfg = dict(\n", + " mean=[124.508, 116.05, 106.438], std=[58.577, 57.31, 57.437], to_rgb=True)\n", + "train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='RandomResizedCrop', size=224, backend='pillow'),\n", + " dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='ToTensor', keys=['gt_label']),\n", + " dict(type='Collect', keys=['img', 'gt_label'])\n", + "]\n", + "test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='Resize', size=(256, -1), backend='pillow'),\n", + " dict(type='CenterCrop', crop_size=224),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + "]\n", + "data = dict(\n", + " samples_per_gpu=32,\n", + " workers_per_gpu=2,\n", + " train=dict(\n", + " type='ImageNet',\n", + " data_prefix='data/cats_dogs_dataset/training_set/training_set',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='RandomResizedCrop', size=224, backend='pillow'),\n", + " dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='ToTensor', keys=['gt_label']),\n", + " dict(type='Collect', keys=['img', 'gt_label'])\n", + " ]),\n", + " val=dict(\n", + " type='ImageNet',\n", + " data_prefix='data/cats_dogs_dataset/val_set/val_set',\n", + " ann_file='data/cats_dogs_dataset/val.txt',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='Resize', size=(256, -1), backend='pillow'),\n", + " dict(type='CenterCrop', crop_size=224),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ]),\n", + " test=dict(\n", + " type='ImageNet',\n", + " data_prefix='data/cats_dogs_dataset/test_set/test_set',\n", + " ann_file='data/cats_dogs_dataset/test.txt',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='Resize', size=(256, -1), backend='pillow'),\n", + " dict(type='CenterCrop', crop_size=224),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ]))\n", + "evaluation = dict(metric='accuracy', metric_options=dict(topk=(1, )))\n", + "work_dir = 'work_dirs/mobilenet_v2_1x_cats_dogs'\n", + "gpu_ids = range(0, 1)\n", + "\n", + "2021-10-21 02:48:20,689 - mmcls - INFO - Set random seed to 0, deterministic: True\n", + "2021-10-21 02:48:20,854 - mmcls - INFO - initialize MobileNetV2 with init_cfg {'type': 'Pretrained', 'checkpoint': 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth', 'prefix': 'backbone'}\n", + "2021-10-21 02:48:20,855 - mmcv - INFO - load backbone in model from: https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\n", + "Use load_from_http loader\n", + "Downloading: \"https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\" to /root/.cache/torch/hub/checkpoints/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\n", + "100% 13.5M/13.5M [00:01<00:00, 9.54MB/s]\n", + "2021-10-21 02:48:23,564 - mmcls - INFO - initialize LinearClsHead with init_cfg {'type': 'Normal', 'layer': 'Linear', 'std': 0.01}\n", + "2021-10-21 02:48:38,767 - mmcls - INFO - Start running, host: root@992cc7e7be60, work_dir: /content/mmclassification/work_dirs/mobilenet_v2_1x_cats_dogs\n", + "2021-10-21 02:48:38,767 - mmcls - INFO - Hooks will be executed in the following order:\n", + "before_run:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_train_epoch:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_train_iter:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + " -------------------- \n", + "after_train_iter:\n", + "(ABOVE_NORMAL) OptimizerHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "after_train_epoch:\n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_val_epoch:\n", + "(LOW ) IterTimerHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_epoch:\n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "2021-10-21 02:48:38,768 - mmcls - INFO - workflow: [('train', 1)], max: 2 epochs\n", + "2021-10-21 02:48:44,261 - mmcls - INFO - Epoch [1][10/201]\tlr: 5.000e-03, eta: 0:03:29, time: 0.533, data_time: 0.257, memory: 1709, loss: 0.3917\n", + "2021-10-21 02:48:46,950 - mmcls - INFO - Epoch [1][20/201]\tlr: 5.000e-03, eta: 0:02:33, time: 0.269, data_time: 0.019, memory: 1709, loss: 0.3508\n", + "2021-10-21 02:48:49,618 - mmcls - INFO - Epoch [1][30/201]\tlr: 5.000e-03, eta: 0:02:12, time: 0.266, data_time: 0.021, memory: 1709, loss: 0.3955\n", + "2021-10-21 02:48:52,271 - mmcls - INFO - Epoch [1][40/201]\tlr: 5.000e-03, eta: 0:02:00, time: 0.266, data_time: 0.018, memory: 1709, loss: 0.2485\n", + "2021-10-21 02:48:54,984 - mmcls - INFO - Epoch [1][50/201]\tlr: 5.000e-03, eta: 0:01:53, time: 0.272, data_time: 0.019, memory: 1709, loss: 0.4196\n", + "2021-10-21 02:48:57,661 - mmcls - INFO - Epoch [1][60/201]\tlr: 5.000e-03, eta: 0:01:46, time: 0.266, data_time: 0.019, memory: 1709, loss: 0.4994\n", + "2021-10-21 02:49:00,341 - mmcls - INFO - Epoch [1][70/201]\tlr: 5.000e-03, eta: 0:01:41, time: 0.268, data_time: 0.018, memory: 1709, loss: 0.4372\n", + "2021-10-21 02:49:03,035 - mmcls - INFO - Epoch [1][80/201]\tlr: 5.000e-03, eta: 0:01:37, time: 0.270, data_time: 0.019, memory: 1709, loss: 0.3179\n", + "2021-10-21 02:49:05,731 - mmcls - INFO - Epoch [1][90/201]\tlr: 5.000e-03, eta: 0:01:32, time: 0.269, data_time: 0.020, memory: 1709, loss: 0.3175\n", + "2021-10-21 02:49:08,404 - mmcls - INFO - Epoch [1][100/201]\tlr: 5.000e-03, eta: 0:01:29, time: 0.268, data_time: 0.019, memory: 1709, loss: 0.3412\n", + "2021-10-21 02:49:11,106 - mmcls - INFO - Epoch [1][110/201]\tlr: 5.000e-03, eta: 0:01:25, time: 0.270, data_time: 0.016, memory: 1709, loss: 0.2985\n", + "2021-10-21 02:49:13,776 - mmcls - INFO - Epoch [1][120/201]\tlr: 5.000e-03, eta: 0:01:21, time: 0.267, data_time: 0.018, memory: 1709, loss: 0.2778\n", + "2021-10-21 02:49:16,478 - mmcls - INFO - Epoch [1][130/201]\tlr: 5.000e-03, eta: 0:01:18, time: 0.270, data_time: 0.021, memory: 1709, loss: 0.2229\n", + "2021-10-21 02:49:19,130 - mmcls - INFO - Epoch [1][140/201]\tlr: 5.000e-03, eta: 0:01:15, time: 0.266, data_time: 0.018, memory: 1709, loss: 0.2318\n", + "2021-10-21 02:49:21,812 - mmcls - INFO - Epoch [1][150/201]\tlr: 5.000e-03, eta: 0:01:12, time: 0.268, data_time: 0.019, memory: 1709, loss: 0.2333\n", + "2021-10-21 02:49:24,514 - mmcls - INFO - Epoch [1][160/201]\tlr: 5.000e-03, eta: 0:01:08, time: 0.270, data_time: 0.017, memory: 1709, loss: 0.2783\n", + "2021-10-21 02:49:27,184 - mmcls - INFO - Epoch [1][170/201]\tlr: 5.000e-03, eta: 0:01:05, time: 0.267, data_time: 0.017, memory: 1709, loss: 0.2132\n", + "2021-10-21 02:49:29,875 - mmcls - INFO - Epoch [1][180/201]\tlr: 5.000e-03, eta: 0:01:02, time: 0.269, data_time: 0.021, memory: 1709, loss: 0.2096\n", + "2021-10-21 02:49:32,546 - mmcls - INFO - Epoch [1][190/201]\tlr: 5.000e-03, eta: 0:00:59, time: 0.267, data_time: 0.019, memory: 1709, loss: 0.1729\n", + "2021-10-21 02:49:35,200 - mmcls - INFO - Epoch [1][200/201]\tlr: 5.000e-03, eta: 0:00:56, time: 0.265, data_time: 0.017, memory: 1709, loss: 0.1969\n", + "2021-10-21 02:49:35,247 - mmcls - INFO - Saving checkpoint at 1 epochs\n", + "[ ] 0/1601, elapsed: 0s, ETA:[W pthreadpool-cpp.cc:90] Warning: Leaking Caffe2 thread-pool after fork. (function pthreadpool)\n", + "[W pthreadpool-cpp.cc:90] Warning: Leaking Caffe2 thread-pool after fork. (function pthreadpool)\n", + "[>>] 1601/1601, 173.2 task/s, elapsed: 9s, ETA: 0s2021-10-21 02:49:44,587 - mmcls - INFO - Epoch(val) [1][51]\taccuracy_top-1: 95.6277\n", + "2021-10-21 02:49:49,625 - mmcls - INFO - Epoch [2][10/201]\tlr: 5.000e-04, eta: 0:00:55, time: 0.488, data_time: 0.237, memory: 1709, loss: 0.1764\n", + "2021-10-21 02:49:52,305 - mmcls - INFO - Epoch [2][20/201]\tlr: 5.000e-04, eta: 0:00:52, time: 0.270, data_time: 0.018, memory: 1709, loss: 0.1514\n", + "2021-10-21 02:49:55,060 - mmcls - INFO - Epoch [2][30/201]\tlr: 5.000e-04, eta: 0:00:49, time: 0.275, data_time: 0.016, memory: 1709, loss: 0.1395\n", + "2021-10-21 02:49:57,696 - mmcls - INFO - Epoch [2][40/201]\tlr: 5.000e-04, eta: 0:00:46, time: 0.262, data_time: 0.016, memory: 1709, loss: 0.1508\n", + "2021-10-21 02:50:00,430 - mmcls - INFO - Epoch [2][50/201]\tlr: 5.000e-04, eta: 0:00:43, time: 0.273, data_time: 0.018, memory: 1709, loss: 0.1771\n", + "2021-10-21 02:50:03,099 - mmcls - INFO - Epoch [2][60/201]\tlr: 5.000e-04, eta: 0:00:40, time: 0.268, data_time: 0.020, memory: 1709, loss: 0.1438\n", + "2021-10-21 02:50:05,745 - mmcls - INFO - Epoch [2][70/201]\tlr: 5.000e-04, eta: 0:00:37, time: 0.264, data_time: 0.018, memory: 1709, loss: 0.1321\n", + "2021-10-21 02:50:08,385 - mmcls - INFO - Epoch [2][80/201]\tlr: 5.000e-04, eta: 0:00:34, time: 0.264, data_time: 0.020, memory: 1709, loss: 0.1629\n", + "2021-10-21 02:50:11,025 - mmcls - INFO - Epoch [2][90/201]\tlr: 5.000e-04, eta: 0:00:31, time: 0.264, data_time: 0.019, memory: 1709, loss: 0.1574\n", + "2021-10-21 02:50:13,685 - mmcls - INFO - Epoch [2][100/201]\tlr: 5.000e-04, eta: 0:00:28, time: 0.266, data_time: 0.019, memory: 1709, loss: 0.1220\n", + "2021-10-21 02:50:16,329 - mmcls - INFO - Epoch [2][110/201]\tlr: 5.000e-04, eta: 0:00:25, time: 0.264, data_time: 0.021, memory: 1709, loss: 0.2550\n", + "2021-10-21 02:50:19,007 - mmcls - INFO - Epoch [2][120/201]\tlr: 5.000e-04, eta: 0:00:22, time: 0.268, data_time: 0.020, memory: 1709, loss: 0.1528\n", + "2021-10-21 02:50:21,750 - mmcls - INFO - Epoch [2][130/201]\tlr: 5.000e-04, eta: 0:00:20, time: 0.275, data_time: 0.021, memory: 1709, loss: 0.1223\n", + "2021-10-21 02:50:24,392 - mmcls - INFO - Epoch [2][140/201]\tlr: 5.000e-04, eta: 0:00:17, time: 0.264, data_time: 0.017, memory: 1709, loss: 0.1734\n", + "2021-10-21 02:50:27,049 - mmcls - INFO - Epoch [2][150/201]\tlr: 5.000e-04, eta: 0:00:14, time: 0.265, data_time: 0.020, memory: 1709, loss: 0.1527\n", + "2021-10-21 02:50:29,681 - mmcls - INFO - Epoch [2][160/201]\tlr: 5.000e-04, eta: 0:00:11, time: 0.265, data_time: 0.019, memory: 1709, loss: 0.1910\n", + "2021-10-21 02:50:32,318 - mmcls - INFO - Epoch [2][170/201]\tlr: 5.000e-04, eta: 0:00:08, time: 0.262, data_time: 0.017, memory: 1709, loss: 0.1922\n", + "2021-10-21 02:50:34,955 - mmcls - INFO - Epoch [2][180/201]\tlr: 5.000e-04, eta: 0:00:05, time: 0.264, data_time: 0.021, memory: 1709, loss: 0.1760\n", + "2021-10-21 02:50:37,681 - mmcls - INFO - Epoch [2][190/201]\tlr: 5.000e-04, eta: 0:00:03, time: 0.273, data_time: 0.019, memory: 1709, loss: 0.1739\n", + "2021-10-21 02:50:40,408 - mmcls - INFO - Epoch [2][200/201]\tlr: 5.000e-04, eta: 0:00:00, time: 0.272, data_time: 0.018, memory: 1709, loss: 0.1654\n", + "2021-10-21 02:50:40,443 - mmcls - INFO - Saving checkpoint at 2 epochs\n", + "[>>] 1601/1601, 170.9 task/s, elapsed: 9s, ETA: 0s2021-10-21 02:50:49,905 - mmcls - INFO - Epoch(val) [2][51]\taccuracy_top-1: 97.5016\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m_ZSkwB5Rflb" + }, + "source": [ + "### Test a model\n", + "\n", + "We use `tools/test.py` to test a model:\n", + "\n", + "```\n", + "python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [optional arguments]\n", + "```\n", + "\n", + "Here are some optional arguments:\n", + "\n", + "- `--metrics`: The evaluation metrics. The available choices are defined in the dataset class. Usually, you can specify \"accuracy\" to metric a single-label classification task.\n", + "- `--metric-options`: The extra options passed to metrics. For example, by specifying \"topk=1\", the \"accuracy\" metric will calculate top-1 accuracy.\n", + "\n", + "More details are in the help docs of `tools/test.py`.\n", + "\n", + "Here we still use the `MobileNetV2` model we fine-tuned." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Zd4EM00QRtyc", + "outputId": "8788264f-83df-4419-9748-822c20538aa7" + }, + "source": [ + "!python tools/test.py configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py work_dirs/mobilenet_v2_1x_cats_dogs/latest.pth --metrics accuracy --metric-options topk=1" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/usr/local/lib/python3.7/dist-packages/mmcv/cnn/bricks/transformer.py:28: UserWarning: Fail to import ``MultiScaleDeformableAttention`` from ``mmcv.ops.multi_scale_deform_attn``, You should install ``mmcv-full`` if you need this module. \n", + " warnings.warn('Fail to import ``MultiScaleDeformableAttention`` from '\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/local/lib/python3.7/dist-packages/yaml/constructor.py:126: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", + " if not isinstance(key, collections.Hashable):\n", + "Use load_from_local loader\n", + "[>>] 2023/2023, 168.4 task/s, elapsed: 12s, ETA: 0s\n", + "accuracy : 97.38\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IwThQkjaRwF7" + }, + "source": [ + "### Inference with a model\n", + "\n", + "Sometimes we want to save the inference results on a dataset, just use the command below.\n", + "\n", + "```shell\n", + "python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}]\n", + "```\n", + "\n", + "Arguments:\n", + "\n", + "- `--out`: The output filename. If not specified, the inference results won't be saved. It supports json, pkl and yml.\n", + "- `--out-items`: What items will be saved. You can choose some of \"class_scores\", \"pred_score\", \"pred_label\" and \"pred_class\", or use \"all\" to select all of them.\n", + "\n", + "These items mean:\n", + "- `class_scores`: The score of every class for each sample.\n", + "- `pred_score`: The score of predict class for each sample.\n", + "- `pred_label`: The label of predict class for each sample. It will read the label string of each class from the model, if the label strings are not saved, it will use ImageNet labels.\n", + "- `pred_class`: The id of predict class for each sample. It's a group of integers. \n", + "- `all`: Save all items above.\n", + "- `none`: Don't save any items above. Because the output file will save the metric besides inference results. If you want to save only metrics, you can use this option to reduce the output file size.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6GVKloPHR0Fn", + "outputId": "4f4cd414-1be6-4e17-985f-6449b8a3d9e8" + }, + "source": [ + "!python tools/test.py configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py work_dirs/mobilenet_v2_1x_cats_dogs/latest.pth --out results.json --out-items all" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/usr/local/lib/python3.7/dist-packages/mmcv/cnn/bricks/transformer.py:28: UserWarning: Fail to import ``MultiScaleDeformableAttention`` from ``mmcv.ops.multi_scale_deform_attn``, You should install ``mmcv-full`` if you need this module. \n", + " warnings.warn('Fail to import ``MultiScaleDeformableAttention`` from '\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/local/lib/python3.7/dist-packages/yaml/constructor.py:126: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", + " if not isinstance(key, collections.Hashable):\n", + "Use load_from_local loader\n", + "[>>] 2023/2023, 170.6 task/s, elapsed: 12s, ETA: 0s\n", + "dumping results to results.json\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "G0NJI1s6e3FD" + }, + "source": [ + "All inference results are saved in the output json file, and you can read it." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 370 + }, + "id": "HJdJeLUafFhX", + "outputId": "7614d546-7c2f-4bfd-ce63-4c2a5228620f" + }, + "source": [ + "import json\n", + "\n", + "with open(\"./results.json\", 'r') as f:\n", + " results = json.load(f)\n", + "\n", + "# Show the inference result of the first image.\n", + "print('class_scores:', results['class_scores'][0])\n", + "print('pred_class:', results['pred_class'][0])\n", + "print('pred_label:', results['pred_label'][0])\n", + "print('pred_score:', results['pred_score'][0])\n", + "Image.open('data/cats_dogs_dataset/training_set/training_set/cats/cat.1.jpg')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "class_scores: [1.0, 5.184615757547473e-13]\n", + "pred_class: cats\n", + "pred_label: 0\n", + "pred_score: 1.0\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 15 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1bEUwwzcVG8o" + }, + "source": [ + "You can also use the visualization API provided by MMClassification to show the inference result." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "BcSNyvAWRx20", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 304 + }, + "outputId": "0d68077f-2ec8-4f3d-8aaa-18d4021ca77b" + }, + "source": [ + "from mmcls.core.visualization import imshow_infos\n", + "\n", + "filepath = 'data/cats_dogs_dataset/training_set/training_set/cats/cat.1.jpg'\n", + "\n", + "result = {\n", + " 'pred_class': results['pred_class'][0],\n", + " 'pred_label': results['pred_label'][0],\n", + " 'pred_score': results['pred_score'][0],\n", + "}\n", + "\n", + "img = imshow_infos(filepath, result)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + } + } + ] + } + ] +} diff --git a/docs/en/tutorials/config.md b/docs/en/tutorials/config.md new file mode 100644 index 0000000..16e43ac --- /dev/null +++ b/docs/en/tutorials/config.md @@ -0,0 +1,417 @@ +# Tutorial 1: Learn about Configs + +MMClassification mainly uses python files as configs. The design of our configuration file system integrates modularity and inheritance, facilitating users to conduct various experiments. All configuration files are placed in the `configs` folder, which mainly contains the primitive configuration folder of `_base_` and many algorithm folders such as `resnet`, `swin_transformer`, `vision_transformer`, etc. + +If you wish to inspect the config file, you may run `python tools/misc/print_config.py /PATH/TO/CONFIG` to see the complete config. + + + +- [Config File and Checkpoint Naming Convention](#config-file-and-checkpoint-naming-convention) +- [Config File Structure](#config-file-structure) +- [Inherit and Modify Config File](#inherit-and-modify-config-file) + - [Use intermediate variables in configs](#use-intermediate-variables-in-configs) + - [Ignore some fields in the base configs](#ignore-some-fields-in-the-base-configs) + - [Use some fields in the base configs](#use-some-fields-in-the-base-configs) +- [Modify config through script arguments](#modify-config-through-script-arguments) +- [Import user-defined modules](#import-user-defined-modules) +- [FAQ](#faq) + + + +## Config File and Checkpoint Naming Convention + +We follow the below convention to name config files. Contributors are advised to follow the same style. The config file names are divided into four parts: algorithm info, module information, training information and data information. Logically, different parts are concatenated by underscores `'_'`, and words in the same part are concatenated by dashes `'-'`. + +``` +{algorithm info}_{module info}_{training info}_{data info}.py +``` + +- `algorithm info`:algorithm information, model name and neural network architecture, such as resnet, etc.; +- `module info`: module information is used to represent some special neck, head and pretrain information; +- `training info`:Training information, some training schedule, including batch size, lr schedule, data augment and the like; +- `data info`:Data information, dataset name, input size and so on, such as imagenet, cifar, etc.; + +### Algorithm information + +The main algorithm name and the corresponding branch architecture information. E.g: + +- `resnet50` +- `mobilenet-v3-large` +- `vit-small-patch32` : `patch32` represents the size of the partition in `ViT` algorithm; +- `seresnext101-32x4d` : `SeResNet101` network structure, `32x4d` means that `groups` and `width_per_group` are 32 and 4 respectively in `Bottleneck`; + +### Module information + +Some special `neck`, `head` and `pretrain` information. In classification tasks, `pretrain` information is the most commonly used: + +- `in21k-pre` : pre-trained on ImageNet21k; +- `in21k-pre-3rd-party` : pre-trained on ImageNet21k and the checkpoint is converted from a third-party repository; + +### Training information + +Training schedule, including training type, `batch size`, `lr schedule`, data augment, special loss functions and so on: + +- format `{gpu x batch_per_gpu}`, such as `8xb32` + +Training type (mainly seen in the transformer network, such as the `ViT` algorithm, which is usually divided into two training type: pre-training and fine-tuning): + +- `ft` : configuration file for fine-tuning +- `pt` : configuration file for pretraining + +Training recipe. Usually, only the part that is different from the original paper will be marked. These methods will be arranged in the order `{pipeline aug}-{train aug}-{loss trick}-{scheduler}-{epochs}`. + +- `coslr-200e` : use cosine scheduler to train 200 epochs +- `autoaug-mixup-lbs-coslr-50e` : use `autoaug`, `mixup`, `label smooth`, `cosine scheduler` to train 50 epochs + +### Data information + +- `in1k` : `ImageNet1k` dataset, default to use the input image size of 224x224; +- `in21k` : `ImageNet21k` dataset, also called `ImageNet22k` dataset, default to use the input image size of 224x224; +- `in1k-384px` : Indicates that the input image size is 384x384; +- `cifar100` + +### Config File Name Example + +``` +repvgg-D2se_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py +``` + +- `repvgg-D2se`: Algorithm information + - `repvgg`: The main algorithm. + - `D2se`: The architecture. +- `deploy`: Module information, means the backbone is in the deploy state. +- `4xb64-autoaug-lbs-mixup-coslr-200e`: Training information. + - `4xb64`: Use 4 GPUs and the size of batches per GPU is 64. + - `autoaug`: Use `AutoAugment` in training pipeline. + - `lbs`: Use label smoothing loss. + - `mixup`: Use `mixup` training augment method. + - `coslr`: Use cosine learning rate scheduler. + - `200e`: Train the model for 200 epochs. +- `in1k`: Dataset information. The config is for `ImageNet1k` dataset and the input size is `224x224`. + +```{note} +Some configuration files currently do not follow this naming convention, and related files will be updated in the near future. +``` + +### Checkpoint Naming Convention + +The naming of the weight mainly includes the configuration file name, date and hash value. + +``` +{config_name}_{date}-{hash}.pth +``` + +## Config File Structure + +There are four kinds of basic component file in the `configs/_base_` folders, namely: + +- [models](https://github.com/open-mmlab/mmclassification/tree/master/configs/_base_/models) +- [datasets](https://github.com/open-mmlab/mmclassification/tree/master/configs/_base_/datasets) +- [schedules](https://github.com/open-mmlab/mmclassification/tree/master/configs/_base_/schedules) +- [runtime](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/default_runtime.py) + +You can easily build your own training config file by inherit some base config files. And the configs that are composed by components from `_base_` are called _primitive_. + +For easy understanding, we use [ResNet50 primitive config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb32_in1k.py) as a example and comment the meaning of each line. For more detaile, please refer to the API documentation. + +```python +_base_ = [ + '../_base_/models/resnet50.py', # model + '../_base_/datasets/imagenet_bs32.py', # data + '../_base_/schedules/imagenet_bs256.py', # training schedule + '../_base_/default_runtime.py' # runtime setting +] +``` + +The four parts are explained separately below, and the above-mentioned ResNet50 primitive config are also used as an example. + +### model + +The parameter `"model"` is a python dictionary in the configuration file, which mainly includes information such as network structure and loss function: + +- `type` : Classifier name, MMCls supports `ImageClassifier`, refer to [API documentation](https://mmclassification.readthedocs.io/en/latest/api/models.html#classifier). +- `backbone` : Backbone configs, refer to [API documentation](https://mmclassification.readthedocs.io/en/latest/api/models.html#backbones) for available options. +- `neck` :Neck network name, MMCls supports `GlobalAveragePooling`, please refer to [API documentation](https://mmclassification.readthedocs.io/en/latest/api/models.html#necks). +- `head`: Head network name, MMCls supports single-label and multi-label classification head networks, available options refer to [API documentation](https://mmclassification.readthedocs.io/en/latest/api/models.html#heads). + - `loss`: Loss function type, supports `CrossEntropyLoss`, [`LabelSmoothLoss`](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/models/resnet50_label_smooth.py) etc., For available options, refer to [API documentation](https://mmclassification.readthedocs.io/en/latest/api/models.html#losses). +- `train_cfg` :Training augment config, MMCls supports [`mixup`](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/models/resnet50_mixup.py), [`cutmix`](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/models/resnet50_cutmix.py) and other augments. + +```{note} +The 'type' in the configuration file is not a constructed parameter, but a class name. +``` + +```python +model = dict( + type='ImageClassifier', # Classifier name + backbone=dict( + type='ResNet', # Backbones name + depth=50, # depth of backbone, ResNet has options of 18, 34, 50, 101, 152. + num_stages=4, # number of stages,The feature maps generated by these states are used as the input for the subsequent neck and head. + out_indices=(3, ), # The output index of the output feature maps. + frozen_stages=-1, # the stage to be frozen, '-1' means not be forzen + style='pytorch'), # The style of backbone, 'pytorch' means that stride 2 layers are in 3x3 conv, 'caffe' means stride 2 layers are in 1x1 convs. + neck=dict(type='GlobalAveragePooling'), # neck network name + head=dict( + type='LinearClsHead', # linear classification head, + num_classes=1000, # The number of output categories, consistent with the number of categories in the dataset + in_channels=2048, # The number of input channels, consistent with the output channel of the neck + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), # Loss function configuration information + topk=(1, 5), # Evaluation index, Top-k accuracy rate, here is the accuracy rate of top1 and top5 + )) +``` + +### data + +The parameter `"data"` is a python dictionary in the configuration file, which mainly includes information to construct dataloader: + +- `samples_per_gpu` : the BatchSize of each GPU when building the dataloader +- `workers_per_gpu` : the number of threads per GPU when building dataloader +- `train | val | test` : config to construct dataset + - `type`: Dataset name, MMCls supports `ImageNet`, `Cifar` etc., refer to [API documentation](https://mmclassification.readthedocs.io/en/latest/api/datasets.html) + - `data_prefix` : Dataset root directory + - `pipeline` : Data processing pipeline, refer to related tutorial [CUSTOM DATA PIPELINES](https://mmclassification.readthedocs.io/en/latest/tutorials/data_pipeline.html) + +The parameter `evaluation` is also a dictionary, which is the configuration information of `evaluation hook`, mainly including evaluation interval, evaluation index, etc.. + +```python +# dataset settings +dataset_type = 'ImageNet' # dataset name, +img_norm_cfg = dict( # Image normalization config to normalize the input images + mean=[123.675, 116.28, 103.53], # Mean values used to pre-training the pre-trained backbone models + std=[58.395, 57.12, 57.375], # Standard variance used to pre-training the pre-trained backbone models + to_rgb=True) # Whether to invert the color channel, rgb2bgr or bgr2rgb. +# train data pipeline +train_pipeline = [ + dict(type='LoadImageFromFile'), # First pipeline to load images from file path + dict(type='RandomResizedCrop', size=224), # RandomResizedCrop + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), # Randomly flip the picture horizontally with a probability of 0.5 + dict(type='Normalize', **img_norm_cfg), # normalization + dict(type='ImageToTensor', keys=['img']), # convert image from numpy into torch.Tensor + dict(type='ToTensor', keys=['gt_label']), # convert gt_label into torch.Tensor + dict(type='Collect', keys=['img', 'gt_label']) # Pipeline that decides which keys in the data should be passed to the detector +] +# test data pipeline +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) # do not pass gt_label while testing +] +data = dict( + samples_per_gpu=32, # Batch size of a single GPU + workers_per_gpu=2, # Worker to pre-fetch data for each single GPU + train=dict( # Train dataset config + train=dict( # train data config + type=dataset_type, # dataset name + data_prefix='data/imagenet/train', # Dataset root, when ann_file does not exist, the category information is automatically obtained from the root folder + pipeline=train_pipeline), # train data pipeline + val=dict( # val data config + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', # ann_file existes, the category information is obtained from file + pipeline=test_pipeline), + test=dict( # test data config + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict( # The config to build the evaluation hook, refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/evaluation/eval_hooks.py#L7 for more details. + interval=1, # Evaluation interval + metric='accuracy') # Metrics used during evaluation +``` + +### training schedule + +Mainly include optimizer settings, `optimizer hook` settings, learning rate schedule and `runner` settings: + +- `optimizer`: optimizer setting , support all optimizers in `pytorch`, refer to related [mmcv](https://mmcv.readthedocs.io/en/latest/_modules/mmcv/runner/optimizer/default_constructor.html#DefaultOptimizerConstructor) documentation. +- `optimizer_config`: `optimizer hook` configuration file, such as setting gradient limit, refer to related [mmcv](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py#L8) code. +- `lr_config`: Learning rate scheduler, supports "CosineAnnealing", "Step", "Cyclic", etc. refer to related [mmcv](https://mmcv.readthedocs.io/en/latest/_modules/mmcv/runner/hooks/lr_updater.html#LrUpdaterHook) documentation for more options. +- `runner`: For `runner`, please refer to `mmcv` for [`runner`](https://mmcv.readthedocs.io/en/latest/understand_mmcv/runner.html) introduction document. + +```python +# he configuration file used to build the optimizer, support all optimizers in PyTorch. +optimizer = dict(type='SGD', # Optimizer type + lr=0.1, # Learning rate of optimizers, see detail usages of the parameters in the documentation of PyTorch + momentum=0.9, # Momentum + weight_decay=0.0001) # Weight decay of SGD +# Config used to build the optimizer hook, refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py#L8 for implementation details. +optimizer_config = dict(grad_clip=None) # Most of the methods do not use gradient clip +# Learning rate scheduler config used to register LrUpdater hook +lr_config = dict(policy='step', # The policy of scheduler, also support CosineAnnealing, Cyclic, etc. Refer to details of supported LrUpdater from https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py#L9. + step=[30, 60, 90]) # Steps to decay the learning rate +runner = dict(type='EpochBasedRunner', # Type of runner to use (i.e. IterBasedRunner or EpochBasedRunner) + max_epochs=100) # Runner that runs the workflow in total max_epochs. For IterBasedRunner use `max_iters` +``` + +### runtime setting + +This part mainly includes saving the checkpoint strategy, log configuration, training parameters, breakpoint weight path, working directory, etc.. + +```python +# Config to set the checkpoint hook, Refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py for implementation. +checkpoint_config = dict(interval=1) # The save interval is 1 +# config to register logger hook +log_config = dict( + interval=100, # Interval to print the log + hooks=[ + dict(type='TextLoggerHook'), # The Tensorboard logger is also supported + # dict(type='TensorboardLoggerHook') + ]) + +dist_params = dict(backend='nccl') # Parameters to setup distributed training, the port can also be set. +log_level = 'INFO' # The output level of the log. +resume_from = None # Resume checkpoints from a given path, the training will be resumed from the epoch when the checkpoint's is saved. +workflow = [('train', 1)] # Workflow for runner. [('train', 1)] means there is only one workflow and the workflow named 'train' is executed once. +work_dir = 'work_dir' # Directory to save the model checkpoints and logs for the current experiments. +``` + +## Inherit and Modify Config File + +For easy understanding, we recommend contributors to inherit from existing methods. + +For all configs under the same folder, it is recommended to have only **one** _primitive_ config. All other configs should inherit from the _primitive_ config. In this way, the maximum of inheritance level is 3. + +For example, if your config file is based on ResNet with some other modification, you can first inherit the basic ResNet structure, dataset and other training setting by specifying `_base_ ='./resnet50_8xb32_in1k.py'` (The path relative to your config file), and then modify the necessary parameters in the config file. A more specific example, now we want to use almost all configs in `configs/resnet/resnet50_8xb32_in1k.py`, but change the number of training epochs from 100 to 300, modify when to decay the learning rate, and modify the dataset path, you can create a new config file `configs/resnet/resnet50_8xb32-300e_in1k.py` with content as below: + +```python +_base_ = './resnet50_8xb32_in1k.py' + +runner = dict(max_epochs=300) +lr_config = dict(step=[150, 200, 250]) + +data = dict( + train=dict(data_prefix='mydata/imagenet/train'), + val=dict(data_prefix='mydata/imagenet/train', ), + test=dict(data_prefix='mydata/imagenet/train', ) +) +``` + +### Use intermediate variables in configs + +Some intermediate variables are used in the configuration file. The intermediate variables make the configuration file clearer and easier to modify. + +For example, `train_pipeline` / `test_pipeline` is the intermediate variable of the data pipeline. We first need to define `train_pipeline` / `test_pipeline`, and then pass them to `data`. If you want to modify the size of the input image during training and testing, you need to modify the intermediate variables of `train_pipeline` / `test_pipeline`. + +```python +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=384, backend='pillow',), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=384, backend='pillow'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +``` + +### Ignore some fields in the base configs + +Sometimes, you need to set `_delete_=True` to ignore some domain content in the basic configuration file. You can refer to [mmcv](https://mmcv.readthedocs.io/en/latest/understand_mmcv/config.html#inherit-from-base-config-with-ignored-fields) for more instructions. + +The following is an example. If you want to use cosine schedule in the above ResNet50 case, just using inheritance and directly modify it will report `get unexcepected keyword'step'` error, because the `'step'` field of the basic config in `lr_config` domain information is reserved, and you need to add `_delete_ =True` to ignore the content of `lr_config` related fields in the basic configuration file: + +```python +_base_ = '../../configs/resnet/resnet50_8xb32_in1k.py' + +lr_config = dict( + _delete_=True, + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + by_epoch=True, + warmup_iters=5, + warmup_ratio=0.1 +) +``` + +### Use some fields in the base configs + +Sometimes, you may refer to some fields in the `_base_` config, so as to avoid duplication of definitions. You can refer to [mmcv](https://mmcv.readthedocs.io/en/latest/understand_mmcv/config.html#reference-variables-from-base) for some more instructions. + +The following is an example of using auto augment in the training data preprocessing pipeline, refer to [`configs/_base_/datasets/imagenet_bs64_autoaug.py`](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/datasets/imagenet_bs64_autoaug.py). When defining `train_pipeline`, just add the definition file name of auto augment to `_base_`, and then use `{{_base_.auto_increasing_policies}}` to reference the variables: + +```python +_base_ = ['./pipelines/auto_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='AutoAugment', policies={{_base_.auto_increasing_policies}}), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [...] +data = dict( + samples_per_gpu=64, + workers_per_gpu=2, + train=dict(..., pipeline=train_pipeline), + val=dict(..., pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') +``` + +## Modify config through script arguments + +When users use the script "tools/train.py" or "tools/test.py" to submit tasks or use some other tools, they can directly modify the content of the configuration file used by specifying the `--cfg-options` parameter. + +- Update config keys of dict chains. + + The config options can be specified following the order of the dict keys in the original config. + For example, `--cfg-options model.backbone.norm_eval=False` changes the all BN modules in model backbones to `train` mode. + +- Update keys inside a list of configs. + + Some config dicts are composed as a list in your config. For example, the training pipeline `data.train.pipeline` is normally a list + e.g. `[dict(type='LoadImageFromFile'), dict(type='TopDownRandomFlip', flip_prob=0.5), ...]`. If you want to change `'flip_prob=0.5'` to `'flip_prob=0.0'` in the pipeline, + you may specify `--cfg-options data.train.pipeline.1.flip_prob=0.0`. + +- Update values of list/tuples. + + If the value to be updated is a list or a tuple. For example, the config file normally sets `workflow=[('train', 1)]`. If you want to + change this key, you may specify `--cfg-options workflow="[(train,1),(val,1)]"`. Note that the quotation mark " is necessary to + support list/tuple data types, and that **NO** white space is allowed inside the quotation marks in the specified value. + +## Import user-defined modules + +```{note} +This part may only be used when using MMClassification as a third party library to build your own project, and beginners can skip it. +``` + +After studying the follow-up tutorials [ADDING NEW DATASET](https://mmclassification.readthedocs.io/en/latest/tutorials/new_dataset.html), [CUSTOM DATA PIPELINES](https://mmclassification.readthedocs.io/en/latest/tutorials/data_pipeline.html), [ADDING NEW MODULES](https://mmclassification.readthedocs.io/en/latest/tutorials/new_modules.html). You may use MMClassification to complete your project and create new classes of datasets, models, data enhancements, etc. in the project. In order to streamline the code, you can use MMClassification as a third-party library, you just need to keep your own extra code and import your own custom module in the configuration files. For examples, you may refer to [OpenMMLab Algorithm Competition Project](https://github.com/zhangrui-wolf/openmmlab-competition-2021) . + +Add the following code to your own configuration files: + +```python +custom_imports = dict( + imports=['your_dataset_class', + 'your_transforme_class', + 'your_model_class', + 'your_module_class'], + allow_failed_imports=False) +``` + +## FAQ + +- None diff --git a/docs/en/tutorials/data_pipeline.md b/docs/en/tutorials/data_pipeline.md new file mode 100644 index 0000000..4b32280 --- /dev/null +++ b/docs/en/tutorials/data_pipeline.md @@ -0,0 +1,150 @@ +# Tutorial 4: Custom Data Pipelines + +## Design of Data pipelines + +Following typical conventions, we use `Dataset` and `DataLoader` for data loading +with multiple workers. Indexing `Dataset` returns a dict of data items corresponding to +the arguments of models forward method. + +The data preparation pipeline and the dataset is decomposed. Usually a dataset +defines how to process the annotations and a data pipeline defines all the steps to prepare a data dict. +A pipeline consists of a sequence of operations. Each operation takes a dict as input and also output a dict for the next transform. + +The operations are categorized into data loading, pre-processing and formatting. + +Here is an pipeline example for ResNet-50 training on ImageNet. + +```python +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=256), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +``` + +For each operation, we list the related dict fields that are added/updated/removed. +At the end of the pipeline, we use `Collect` to only retain the necessary items for forward computation. + +### Data loading + +`LoadImageFromFile` + +- add: img, img_shape, ori_shape + +By default, `LoadImageFromFile` loads images from disk but it may lead to IO bottleneck for efficient small models. +Various backends are supported by mmcv to accelerate this process. For example, if the training machines have setup +[memcached](https://memcached.org/), we can revise the config as follows. + +``` +memcached_root = '/mnt/xxx/memcached_client/' +train_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args=dict( + backend='memcached', + server_list_cfg=osp.join(memcached_root, 'server_list.conf'), + client_cfg=osp.join(memcached_root, 'client.conf'))), +] +``` + +More supported backends can be found in [mmcv.fileio.FileClient](https://github.com/open-mmlab/mmcv/blob/master/mmcv/fileio/file_client.py). + +### Pre-processing + +`Resize` + +- add: scale, scale_idx, pad_shape, scale_factor, keep_ratio +- update: img, img_shape + +`RandomFlip` + +- add: flip, flip_direction +- update: img + +`RandomCrop` + +- update: img, pad_shape + +`Normalize` + +- add: img_norm_cfg +- update: img + +### Formatting + +`ToTensor` + +- update: specified by `keys`. + +`ImageToTensor` + +- update: specified by `keys`. + +`Collect` + +- remove: all other keys except for those specified by `keys` + +For more information about other data transformation classes, please refer to [Data Transformations](../api/transforms.rst) + +## Extend and use custom pipelines + +1. Write a new pipeline in any file, e.g., `my_pipeline.py`, and place it in + the folder `mmcls/datasets/pipelines/`. The pipeline class needs to override + the `__call__` method which takes a dict as input and returns a dict. + + ```python + from mmcls.datasets import PIPELINES + + @PIPELINES.register_module() + class MyTransform(object): + + def __call__(self, results): + # apply transforms on results['img'] + return results + ``` + +2. Import the new class in `mmcls/datasets/pipelines/__init__.py`. + + ```python + ... + from .my_pipeline import MyTransform + + __all__ = [ + ..., 'MyTransform' + ] + ``` + +3. Use it in config files. + + ```python + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='MyTransform'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) + ] + ``` + +## Pipeline visualization + +After designing data pipelines, you can use the [visualization tools](../tools/visualization.md) to view the performance. diff --git a/docs/en/tutorials/finetune.md b/docs/en/tutorials/finetune.md new file mode 100644 index 0000000..98538fb --- /dev/null +++ b/docs/en/tutorials/finetune.md @@ -0,0 +1,236 @@ +# Tutorial 2: Fine-tune Models + +Classification models pre-trained on the ImageNet dataset have been demonstrated to be effective for other datasets and other downstream tasks. +This tutorial provides instructions for users to use the models provided in the [Model Zoo](../model_zoo.md) for other datasets to obtain better performance. + +There are two steps to fine-tune a model on a new dataset. + +- Add support for the new dataset following [Tutorial 3: Customize Dataset](new_dataset.md). +- Modify the configs as will be discussed in this tutorial. + +Assume we have a ResNet-50 model pre-trained on the ImageNet-2012 dataset and want +to take the fine-tuning on the CIFAR-10 dataset, we need to modify five parts in the +config. + +## Inherit base configs + +At first, create a new config file +`configs/tutorial/resnet50_finetune_cifar.py` to store our configs. Of course, +the path can be customized by yourself. + +To reuse the common parts among different configs, we support inheriting +configs from multiple existing configs. To fine-tune a ResNet-50 model, the new +config needs to inherit `configs/_base_/models/resnet50.py` to build the basic +structure of the model. To use the CIFAR-10 dataset, the new config can also +simply inherit `configs/_base_/datasets/cifar10_bs16.py`. For runtime settings such as +training schedules, the new config needs to inherit +`configs/_base_/default_runtime.py`. + +To inherit all above configs, put the following code at the config file. + +```python +_base_ = [ + '../_base_/models/resnet50.py', + '../_base_/datasets/cifar10_bs16.py', '../_base_/default_runtime.py' +] +``` + +Besides, you can also choose to write the whole contents rather than use inheritance, +like [`configs/lenet/lenet5_mnist.py`](https://github.com/open-mmlab/mmclassification/blob/master/configs/lenet/lenet5_mnist.py). + +## Modify model + +When fine-tuning a model, usually we want to load the pre-trained backbone +weights and train a new classification head. + +To load the pre-trained backbone, we need to change the initialization config +of the backbone and use `Pretrained` initialization function. Besides, in the +`init_cfg`, we use `prefix='backbone'` to tell the initialization +function to remove the prefix of keys in the checkpoint, for example, it will +change `backbone.conv1` to `conv1`. And here we use an online checkpoint, it +will be downloaded during training, you can also download the model manually +and use a local path. + +And then we need to modify the head according to the class numbers of the new +datasets by just changing `num_classes` in the head. + +```python +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', + checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth', + prefix='backbone', + )), + head=dict(num_classes=10), +) +``` + +```{tip} +Here we only need to set the part of configs we want to modify, because the +inherited configs will be merged and get the entire configs. +``` + +Sometimes, we want to freeze the first several layers' parameters of the +backbone, that will help the network to keep ability to extract low-level +information learnt from pre-trained model. In MMClassification, you can simply +specify how many layers to freeze by `frozen_stages` argument. For example, to +freeze the first two layers' parameters, just use the following config: + +```python +model = dict( + backbone=dict( + frozen_stages=2, + init_cfg=dict( + type='Pretrained', + checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth', + prefix='backbone', + )), + head=dict(num_classes=10), +) +``` + +```{note} +Not all backbones support the `frozen_stages` argument by now. Please check +[the docs](https://mmclassification.readthedocs.io/en/latest/api/models.html#backbones) +to confirm if your backbone supports it. +``` + +## Modify dataset + +When fine-tuning on a new dataset, usually we need to modify some dataset +configs. Here, we need to modify the pipeline to resize the image from 32 to +224 to fit the input size of the model pre-trained on ImageNet, and some other +configs. + +```python +img_norm_cfg = dict( + mean=[125.307, 122.961, 113.8575], + std=[51.5865, 50.847, 51.255], + to_rgb=False, +) +train_pipeline = [ + dict(type='RandomCrop', size=32, padding=4), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Resize', size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']), +] +test_pipeline = [ + dict(type='Resize', size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) +``` + +## Modify training schedule + +The fine-tuning hyper parameters vary from the default schedule. It usually +requires smaller learning rate and less training epochs. + +```python +# lr is set for a batch size of 128 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=[15]) +runner = dict(type='EpochBasedRunner', max_epochs=200) +log_config = dict(interval=100) +``` + +## Start Training + +Now, we have finished the fine-tuning config file as following: + +```python +_base_ = [ + '../_base_/models/resnet50.py', + '../_base_/datasets/cifar10_bs16.py', '../_base_/default_runtime.py' +] + +# Model config +model = dict( + backbone=dict( + frozen_stages=2, + init_cfg=dict( + type='Pretrained', + checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth', + prefix='backbone', + )), + head=dict(num_classes=10), +) + +# Dataset config +img_norm_cfg = dict( + mean=[125.307, 122.961, 113.8575], + std=[51.5865, 50.847, 51.255], + to_rgb=False, +) +train_pipeline = [ + dict(type='RandomCrop', size=32, padding=4), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Resize', size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']), +] +test_pipeline = [ + dict(type='Resize', size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) + +# Training schedule config +# lr is set for a batch size of 128 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict(policy='step', step=[15]) +runner = dict(type='EpochBasedRunner', max_epochs=200) +log_config = dict(interval=100) +``` + +Here we use 8 GPUs on your computer to train the model with the following +command: + +```shell +bash tools/dist_train.sh configs/tutorial/resnet50_finetune_cifar.py 8 +``` + +Also, you can use only one GPU to train the model with the following command: + +```shell +python tools/train.py configs/tutorial/resnet50_finetune_cifar.py +``` + +But wait, an important config need to be changed if using one GPU. We need to +change the dataset config as following: + +```python +data = dict( + samples_per_gpu=128, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) +``` + +It's because our training schedule is for a batch size of 128. If using 8 GPUs, +just use `samples_per_gpu=16` config in the base config file, and the total batch +size will be 128. But if using one GPU, you need to change it to 128 manually to +match the training schedule. diff --git a/docs/en/tutorials/new_dataset.md b/docs/en/tutorials/new_dataset.md new file mode 100644 index 0000000..24e6fe9 --- /dev/null +++ b/docs/en/tutorials/new_dataset.md @@ -0,0 +1,239 @@ +# Tutorial 3: Customize Dataset + +We support many common public datasets for image classification task, you can find them in +[this page](https://mmclassification.readthedocs.io/en/latest/api/datasets.html). + +In this section, we demonstrate how to [use your own dataset](#use-your-own-dataset) +and [use dataset wrapper](#use-dataset-wrapper). + +## Use your own dataset + +### Reorganize dataset to existing format + +The simplest way to use your own dataset is to convert it to existing dataset formats. + +For multi-class classification task, we recommend to use the format of +[`CustomDataset`](https://mmclassification.readthedocs.io/en/latest/api/datasets.html#mmcls.datasets.CustomDataset). + +The `CustomDataset` supports two kinds of format: + +1. An annotation file is provided, and each line indicates a sample image. + + The sample images can be organized in any structure, like: + + ``` + train/ + ├── folder_1 + │ ├── xxx.png + │ ├── xxy.png + │ └── ... + ├── 123.png + ├── nsdf3.png + └── ... + ``` + + And an annotation file records all paths of samples and corresponding + category index. The first column is the image path relative to the folder + (in this example, `train`) and the second column is the index of category: + + ``` + folder_1/xxx.png 0 + folder_1/xxy.png 1 + 123.png 1 + nsdf3.png 2 + ... + ``` + + ```{note} + The value of the category indices should fall in range `[0, num_classes - 1]`. + ``` + +2. The sample images are arranged in the special structure: + + ``` + train/ + ├── cat + │ ├── xxx.png + │ ├── xxy.png + │ └── ... + │ └── xxz.png + ├── bird + │ ├── bird1.png + │ ├── bird2.png + │ └── ... + └── dog + ├── 123.png + ├── nsdf3.png + ├── ... + └── asd932_.png + ``` + + In this case, you don't need provide annotation file, and all images in the directory `cat` will be + recognized as samples of `cat`. + +Usually, we will split the whole dataset to three sub datasets: `train`, `val` +and `test` for training, validation and test. And **every** sub dataset should +be organized as one of the above structures. + +For example, the whole dataset is as below (using the first structure): + +``` +mmclassification +└── data + └── my_dataset + ├── meta + │ ├── train.txt + │ ├── val.txt + │ └── test.txt + ├── train + ├── val + └── test +``` + +And in your config file, you can modify the `data` field as below: + +```python +... +dataset_type = 'CustomDataset' +classes = ['cat', 'bird', 'dog'] # The category names of your dataset + +data = dict( + train=dict( + type=dataset_type, + data_prefix='data/my_dataset/train', + ann_file='data/my_dataset/meta/train.txt', + classes=classes, + pipeline=train_pipeline + ), + val=dict( + type=dataset_type, + data_prefix='data/my_dataset/val', + ann_file='data/my_dataset/meta/val.txt', + classes=classes, + pipeline=test_pipeline + ), + test=dict( + type=dataset_type, + data_prefix='data/my_dataset/test', + ann_file='data/my_dataset/meta/test.txt', + classes=classes, + pipeline=test_pipeline + ) +) +... +``` + +### Create a new dataset class + +You can write a new dataset class inherited from `BaseDataset`, and overwrite `load_annotations(self)`, +like [CIFAR10](https://github.com/open-mmlab/mmclassification/blob/master/mmcls/datasets/cifar.py) and +[CustomDataset](https://github.com/open-mmlab/mmclassification/blob/master/mmcls/datasets/custom.py). + +Typically, this function returns a list, where each sample is a dict, containing necessary data information, +e.g., `img` and `gt_label`. + +Assume we are going to implement a `Filelist` dataset, which takes filelists for both training and testing. +The format of annotation list is as follows: + +``` +000001.jpg 0 +000002.jpg 1 +``` + +We can create a new dataset in `mmcls/datasets/filelist.py` to load the data. + +```python +import mmcv +import numpy as np + +from .builder import DATASETS +from .base_dataset import BaseDataset + + +@DATASETS.register_module() +class Filelist(BaseDataset): + + def load_annotations(self): + assert isinstance(self.ann_file, str) + + data_infos = [] + with open(self.ann_file) as f: + samples = [x.strip().split(' ') for x in f.readlines()] + for filename, gt_label in samples: + info = {'img_prefix': self.data_prefix} + info['img_info'] = {'filename': filename} + info['gt_label'] = np.array(gt_label, dtype=np.int64) + data_infos.append(info) + return data_infos + +``` + +And add this dataset class in `mmcls/datasets/__init__.py` + +```python +from .base_dataset import BaseDataset +... +from .filelist import Filelist + +__all__ = [ + 'BaseDataset', ... ,'Filelist' +] +``` + +Then in the config, to use `Filelist` you can modify the config as the following + +```python +train = dict( + type='Filelist', + ann_file='image_list.txt', + pipeline=train_pipeline +) +``` + +## Use dataset wrapper + +The dataset wrapper is a kind of class to change the behavior of dataset class, such as repeat the dataset or +re-balance the samples of different categories. + +### Repeat dataset + +We use `RepeatDataset` as wrapper to repeat the dataset. For example, suppose the original dataset is +`Dataset_A`, to repeat it, the config looks like the following + +```python +data = dict( + train = dict( + type='RepeatDataset', + times=N, + dataset=dict( # This is the original config of Dataset_A + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) + ... +) +``` + +### Class balanced dataset + +We use `ClassBalancedDataset` as wrapper to repeat the dataset based on category frequency. The dataset to +repeat needs to implement method `get_cat_ids(idx)` to support `ClassBalancedDataset`. For example, to repeat +`Dataset_A` with `oversample_thr=1e-3`, the config looks like the following + +```python +data = dict( + train = dict( + type='ClassBalancedDataset', + oversample_thr=1e-3, + dataset=dict( # This is the original config of Dataset_A + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) + ... +) +``` + +You may refer to [API reference](https://mmclassification.readthedocs.io/en/latest/api/datasets.html#mmcls.datasets.ClassBalancedDataset) for details. diff --git a/docs/en/tutorials/new_modules.md b/docs/en/tutorials/new_modules.md new file mode 100644 index 0000000..5ac89de --- /dev/null +++ b/docs/en/tutorials/new_modules.md @@ -0,0 +1,272 @@ +# Tutorial 5: Adding New Modules + +## Develop new components + +We basically categorize model components into 3 types. + +- backbone: usually an feature extraction network, e.g., ResNet, MobileNet. +- neck: the component between backbones and heads, e.g., GlobalAveragePooling. +- head: the component for specific tasks, e.g., classification or regression. + +### Add new backbones + +Here we show how to develop new components with an example of ResNet_CIFAR. +As the input size of CIFAR is 32x32, this backbone replaces the `kernel_size=7, stride=2` to `kernel_size=3, stride=1` and remove the MaxPooling after stem, to avoid forwarding small feature maps to residual blocks. +It inherits from ResNet and only modifies the stem layers. + +1. Create a new file `mmcls/models/backbones/resnet_cifar.py`. + +```python +import torch.nn as nn + +from ..builder import BACKBONES +from .resnet import ResNet + + +@BACKBONES.register_module() +class ResNet_CIFAR(ResNet): + + """ResNet backbone for CIFAR. + + short description of the backbone + + Args: + depth(int): Network depth, from {18, 34, 50, 101, 152}. + ... + """ + + def __init__(self, depth, deep_stem, **kwargs): + # call ResNet init + super(ResNet_CIFAR, self).__init__(depth, deep_stem=deep_stem, **kwargs) + # other specific initialization + assert not self.deep_stem, 'ResNet_CIFAR do not support deep_stem' + + def _make_stem_layer(self, in_channels, base_channels): + # override ResNet method to modify the network structure + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + base_channels, + kernel_size=3, + stride=1, + padding=1, + bias=False) + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, base_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.relu = nn.ReLU(inplace=True) + + def forward(self, x): # should return a tuple + pass # implementation is ignored + + def init_weights(self, pretrained=None): + pass # override ResNet init_weights if necessary + + def train(self, mode=True): + pass # override ResNet train if necessary +``` + +2. Import the module in `mmcls/models/backbones/__init__.py`. + +```python +... +from .resnet_cifar import ResNet_CIFAR + +__all__ = [ + ..., 'ResNet_CIFAR' +] +``` + +3. Use it in your config file. + +```python +model = dict( + ... + backbone=dict( + type='ResNet_CIFAR', + depth=18, + other_arg=xxx), + ... +``` + +### Add new necks + +Here we take `GlobalAveragePooling` as an example. It is a very simple neck without any arguments. +To add a new neck, we mainly implement the `forward` function, which applies some operation on the output from backbone and forward the results to head. + +1. Create a new file in `mmcls/models/necks/gap.py`. + + ```python + import torch.nn as nn + + from ..builder import NECKS + + @NECKS.register_module() + class GlobalAveragePooling(nn.Module): + + def __init__(self): + self.gap = nn.AdaptiveAvgPool2d((1, 1)) + + def forward(self, inputs): + # we regard inputs as tensor for simplicity + outs = self.gap(inputs) + outs = outs.view(inputs.size(0), -1) + return outs + ``` + +2. Import the module in `mmcls/models/necks/__init__.py`. + + ```python + ... + from .gap import GlobalAveragePooling + + __all__ = [ + ..., 'GlobalAveragePooling' + ] + ``` + +3. Modify the config file. + + ```python + model = dict( + neck=dict(type='GlobalAveragePooling'), + ) + ``` + +### Add new heads + +Here we show how to develop a new head with the example of `LinearClsHead` as the following. +To implement a new head, basically we need to implement `forward_train`, which takes the feature maps from necks or backbones as input and compute loss based on ground-truth labels. + +1. Create a new file in `mmcls/models/heads/linear_head.py`. + + ```python + from ..builder import HEADS + from .cls_head import ClsHead + + + @HEADS.register_module() + class LinearClsHead(ClsHead): + + def __init__(self, + num_classes, + in_channels, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, )): + super(LinearClsHead, self).__init__(loss=loss, topk=topk) + self.in_channels = in_channels + self.num_classes = num_classes + + if self.num_classes <= 0: + raise ValueError( + f'num_classes={num_classes} must be a positive integer') + + self._init_layers() + + def _init_layers(self): + self.fc = nn.Linear(self.in_channels, self.num_classes) + + def init_weights(self): + normal_init(self.fc, mean=0, std=0.01, bias=0) + + def forward_train(self, x, gt_label): + cls_score = self.fc(x) + losses = self.loss(cls_score, gt_label) + return losses + + ``` + +2. Import the module in `mmcls/models/heads/__init__.py`. + + ```python + ... + from .linear_head import LinearClsHead + + __all__ = [ + ..., 'LinearClsHead' + ] + ``` + +3. Modify the config file. + +Together with the added GlobalAveragePooling neck, an entire config for a model is as follows. + +```python +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) + +``` + +### Add new loss + +To add a new loss function, we mainly implement the `forward` function in the loss module. +In addition, it is helpful to leverage the decorator `weighted_loss` to weight the loss for each element. +Assuming that we want to mimic a probabilistic distribution generated from another classification model, we implement a L1Loss to fulfil the purpose as below. + +1. Create a new file in `mmcls/models/losses/l1_loss.py`. + + ```python + import torch + import torch.nn as nn + + from ..builder import LOSSES + from .utils import weighted_loss + + @weighted_loss + def l1_loss(pred, target): + assert pred.size() == target.size() and target.numel() > 0 + loss = torch.abs(pred - target) + return loss + + @LOSSES.register_module() + class L1Loss(nn.Module): + + def __init__(self, reduction='mean', loss_weight=1.0): + super(L1Loss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss = self.loss_weight * l1_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss + ``` + +2. Import the module in `mmcls/models/losses/__init__.py`. + + ```python + ... + from .l1_loss import L1Loss, l1_loss + + __all__ = [ + ..., 'L1Loss', 'l1_loss' + ] + ``` + +3. Modify loss field in the config. + + ```python + loss=dict(type='L1Loss', loss_weight=1.0)) + ``` diff --git a/docs/en/tutorials/runtime.md b/docs/en/tutorials/runtime.md new file mode 100644 index 0000000..b212744 --- /dev/null +++ b/docs/en/tutorials/runtime.md @@ -0,0 +1,257 @@ +# Tutorial 7: Customize Runtime Settings + +In this tutorial, we will introduce some methods about how to customize workflow and hooks when running your own settings for the project. + + + +- [Customize Workflow](#customize-workflow) +- [Hooks](#hooks) + - [Default training hooks](#default-training-hooks) + - [Use other implemented hooks](#use-other-implemented-hooks) + - [Customize self-implemented hooks](#customize-self-implemented-hooks) +- [FAQ](#faq) + + + +## Customize Workflow + +Workflow is a list of (phase, duration) to specify the running order and duration. The meaning of "duration" depends on the runner's type. + +For example, we use epoch-based runner by default, and the "duration" means how many epochs the phase to be executed in a cycle. Usually, +we only want to execute training phase, just use the following config. + +```python +workflow = [('train', 1)] +``` + +Sometimes we may want to check some metrics (e.g. loss, accuracy) about the model on the validate set. +In such case, we can set the workflow as + +```python +[('train', 1), ('val', 1)] +``` + +so that 1 epoch for training and 1 epoch for validation will be run iteratively. + +By default, we recommend using **`EvalHook`** to do evaluation after the training epoch, but you can still use `val` workflow as an alternative. + +```{note} +1. The parameters of model will not be updated during the val epoch. +2. Keyword `max_epochs` in the config only controls the number of training epochs and will not affect the validation workflow. +3. Workflows `[('train', 1), ('val', 1)]` and `[('train', 1)]` will not change the behavior of `EvalHook` because `EvalHook` is called by `after_train_epoch` and validation workflow only affect hooks that are called through `after_val_epoch`. + Therefore, the only difference between `[('train', 1), ('val', 1)]` and ``[('train', 1)]`` is that the runner will calculate losses on the validation set after each training epoch. +``` + +## Hooks + +The hook mechanism is widely used in the OpenMMLab open-source algorithm library. Combined with the `Runner`, the entire life cycle of the training process can be managed easily. You can learn more about the hook through [related article](https://www.calltutors.com/blog/what-is-hook/). + +Hooks only work after being registered into the runner. At present, hooks are mainly divided into two categories: + +- default training hooks + +The default training hooks are registered by the runner by default. Generally, they are hooks for some basic functions, and have a certain priority, you don't need to modify the priority. + +- custom hooks + +The custom hooks are registered through `custom_hooks`. Generally, they are hooks with enhanced functions. The priority needs to be specified in the configuration file. If you do not specify the priority of the hook, it will be set to 'NORMAL' by default. + +**Priority list** + +| Level | Value | +| :-------------: | :---: | +| HIGHEST | 0 | +| VERY_HIGH | 10 | +| HIGH | 30 | +| ABOVE_NORMAL | 40 | +| NORMAL(default) | 50 | +| BELOW_NORMAL | 60 | +| LOW | 70 | +| VERY_LOW | 90 | +| LOWEST | 100 | + +The priority determines the execution order of the hooks. Before training, the log will print out the execution order of the hooks at each stage to facilitate debugging. + +### default training hooks + +Some common hooks are not registered through `custom_hooks`, they are + +| Hooks | Priority | +| :-------------------: | :---------------: | +| `LrUpdaterHook` | VERY_HIGH (10) | +| `MomentumUpdaterHook` | HIGH (30) | +| `OptimizerHook` | ABOVE_NORMAL (40) | +| `CheckpointHook` | NORMAL (50) | +| `IterTimerHook` | LOW (70) | +| `EvalHook` | LOW (70) | +| `LoggerHook(s)` | VERY_LOW (90) | + +`OptimizerHook`, `MomentumUpdaterHook` and `LrUpdaterHook` have been introduced in [sehedule strategy](./schedule.md). +`IterTimerHook` is used to record elapsed time and does not support modification. + +Here we reveal how to customize `CheckpointHook`, `LoggerHooks`, and `EvalHook`. + +#### CheckpointHook + +The MMCV runner will use `checkpoint_config` to initialize [`CheckpointHook`](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/hooks/checkpoint.py). + +```python +checkpoint_config = dict(interval=1) +``` + +We could set `max_keep_ckpts` to save only a small number of checkpoints or decide whether to store state dict of optimizer by `save_optimizer`. +More details of the arguments are [here](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.CheckpointHook) + +#### LoggerHooks + +The `log_config` wraps multiple logger hooks and enables to set intervals. Now MMCV supports `TextLoggerHook`, `WandbLoggerHook`, `MlflowLoggerHook`, `NeptuneLoggerHook`, `DvcliveLoggerHook` and `TensorboardLoggerHook`. +The detailed usages can be found in the [doc](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.LoggerHook). + +```python +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + dict(type='TensorboardLoggerHook') + ]) +``` + +#### EvalHook + +The config of `evaluation` will be used to initialize the [`EvalHook`](https://github.com/open-mmlab/mmclassification/blob/master/mmcls/core/evaluation/eval_hooks.py). + +The `EvalHook` has some reserved keys, such as `interval`, `save_best` and `start`, and the other arguments such as `metrics` will be passed to the `dataset.evaluate()` + +```python +evaluation = dict(interval=1, metric='accuracy', metric_options={'topk': (1, )}) +``` + +You can save the model weight when the best verification result is obtained by modifying the parameter `save_best`: + +```python +# "auto" means automatically select the metrics to compare. +# You can also use a specific key like "accuracy_top-1". +evaluation = dict(interval=1, save_best="auto", metric='accuracy', metric_options={'topk': (1, )}) +``` + +When running some large experiments, you can skip the validation step at the beginning of training by modifying the parameter `start` as below: + +```python +evaluation = dict(interval=1, start=200, metric='accuracy', metric_options={'topk': (1, )}) +``` + +This indicates that, before the 200th epoch, evaluations would not be executed. Since the 200th epoch, evaluations would be executed after the training process. + +```{note} +In the default configuration files of MMClassification, the evaluation field is generally placed in the datasets configs. +``` + +### Use other implemented hooks + +Some hooks have been already implemented in MMCV and MMClassification, they are: + +- [EMAHook](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/ema.py) +- [SyncBuffersHook](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/sync_buffer.py) +- [EmptyCacheHook](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/memory.py) +- [ProfilerHook](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/profiler.py) +- ...... + +If the hook is already implemented in MMCV, you can directly modify the config to use the hook as below + +```python +mmcv_hooks = [ + dict(type='MMCVHook', a=a_value, b=b_value, priority='NORMAL') +] +``` + +such as using `EMAHook`, interval is 100 iters: + +```python +custom_hooks = [ + dict(type='EMAHook', interval=100, priority='HIGH') +] +``` + +## Customize self-implemented hooks + +### 1. Implement a new hook + +Here we give an example of creating a new hook in MMClassification and using it in training. + +```python +from mmcv.runner import HOOKS, Hook + + +@HOOKS.register_module() +class MyHook(Hook): + + def __init__(self, a, b): + pass + + def before_run(self, runner): + pass + + def after_run(self, runner): + pass + + def before_epoch(self, runner): + pass + + def after_epoch(self, runner): + pass + + def before_iter(self, runner): + pass + + def after_iter(self, runner): + pass +``` + +Depending on the functionality of the hook, the users need to specify what the hook will do at each stage of the training in `before_run`, `after_run`, `before_epoch`, `after_epoch`, `before_iter`, and `after_iter`. + +### 2. Register the new hook + +Then we need to make `MyHook` imported. Assuming the file is in `mmcls/core/utils/my_hook.py` there are two ways to do that: + +- Modify `mmcls/core/utils/__init__.py` to import it. + + The newly defined module should be imported in `mmcls/core/utils/__init__.py` so that the registry will + find the new module and add it: + +```python +from .my_hook import MyHook +``` + +- Use `custom_imports` in the config to manually import it + +```python +custom_imports = dict(imports=['mmcls.core.utils.my_hook'], allow_failed_imports=False) +``` + +### 3. Modify the config + +```python +custom_hooks = [ + dict(type='MyHook', a=a_value, b=b_value) +] +``` + +You can also set the priority of the hook as below: + +```python +custom_hooks = [ + dict(type='MyHook', a=a_value, b=b_value, priority='ABOVE_NORMAL') +] +``` + +By default, the hook's priority is set as `NORMAL` during registration. + +## FAQ + +### 1. `resume_from` and `load_from` and `init_cfg.Pretrained` + +- `load_from` : only imports model weights, which is mainly used to load pre-trained or trained models; + +- `resume_from` : not only import model weights, but also optimizer information, current epoch information, mainly used to continue training from the checkpoint. + +- `init_cfg.Pretrained` : Load weights during weight initialization, and you can specify which module to load. This is usually used when fine-tuning a model, refer to [Tutorial 2: Fine-tune Models](./finetune.md). diff --git a/docs/en/tutorials/schedule.md b/docs/en/tutorials/schedule.md new file mode 100644 index 0000000..1afc4b7 --- /dev/null +++ b/docs/en/tutorials/schedule.md @@ -0,0 +1,341 @@ +# Tutorial 6: Customize Schedule + +In this tutorial, we will introduce some methods about how to construct optimizers, customize learning rate and momentum schedules, parameter-wise finely configuration, gradient clipping, gradient accumulation, and customize self-implemented methods for the project. + + + +- [Customize optimizer supported by PyTorch](#customize-optimizer-supported-by-pytorch) +- [Customize learning rate schedules](#customize-learning-rate-schedules) + - [Learning rate decay](#learning-rate-decay) + - [Warmup strategy](#warmup-strategy) +- [Customize momentum schedules](#customize-momentum-schedules) +- [Parameter-wise finely configuration](#parameter-wise-finely-configuration) +- [Gradient clipping and gradient accumulation](#gradient-clipping-and-gradient-accumulation) + - [Gradient clipping](#gradient-clipping) + - [Gradient accumulation](#gradient-accumulation) +- [Customize self-implemented methods](#customize-self-implemented-methods) + - [Customize self-implemented optimizer](#customize-self-implemented-optimizer) + - [Customize optimizer constructor](#customize-optimizer-constructor) + + + +## Customize optimizer supported by PyTorch + +We already support to use all the optimizers implemented by PyTorch, and to use and modify them, please change the `optimizer` field of config files. + +For example, if you want to use `SGD`, the modification could be as the following. + +```python +optimizer = dict(type='SGD', lr=0.0003, weight_decay=0.0001) +``` + +To modify the learning rate of the model, just modify the `lr` in the config of optimizer. +You can also directly set other arguments according to the [API doc](https://pytorch.org/docs/stable/optim.html?highlight=optim#module-torch.optim) of PyTorch. + +For example, if you want to use `Adam` with the setting like `torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)` in PyTorch, +the config should looks like. + +```python +optimizer = dict(type='Adam', lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False) +``` + +## Customize learning rate schedules + +### Learning rate decay + +Learning rate decay is widely used to improve performance. And to use learning rate decay, please set the `lr_confg` field in config files. + +For example, we use step policy as the default learning rate decay policy of ResNet, and the config is: + +```python +lr_config = dict(policy='step', step=[100, 150]) +``` + +Then during training, the program will call [`StepLRHook`](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/lr_updater.py#L153) periodically to update the learning rate. + +We also support many other learning rate schedules [here](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py), such as `CosineAnnealing` and `Poly` schedule. Here are some examples + +- ConsineAnnealing schedule: + + ```python + lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 10, + min_lr_ratio=1e-5) + ``` + +- Poly schedule: + + ```python + lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) + ``` + +### Warmup strategy + +In the early stage, training is easy to be volatile, and warmup is a technique +to reduce volatility. With warmup, the learning rate will increase gradually +from a minor value to the expected value. + +In MMClassification, we use `lr_config` to configure the warmup strategy, the main parameters are as follows: + +- `warmup`: The warmup curve type. Please choose one from 'constant', 'linear', 'exp' and `None`, and `None` means disable warmup. +- `warmup_by_epoch` : if warmup by epoch or not, default to be True, if set to be False, warmup by iter. +- `warmup_iters` : the number of warm-up iterations, when `warmup_by_epoch=True`, the unit is epoch; when `warmup_by_epoch=False`, the unit is the number of iterations (iter). +- `warmup_ratio` : warm-up initial learning rate will calculate as `lr = lr * warmup_ratio`。 + +Here are some examples + +1. linear & warmup by iter + + ```python + lr_config = dict( + policy='CosineAnnealing', + by_epoch=False, + min_lr_ratio=1e-2, + warmup='linear', + warmup_ratio=1e-3, + warmup_iters=20 * 1252, + warmup_by_epoch=False) + ``` + +2. exp & warmup by epoch + + ```python + lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='exp', + warmup_iters=5, + warmup_ratio=0.1, + warmup_by_epoch=True) + ``` + +```{tip} +After completing your configuration file,you could use [learning rate visualization tool](https://mmclassification.readthedocs.io/en/latest/tools/visualization.html#learning-rate-schedule-visualization) to draw the corresponding learning rate adjustment curve. +``` + +## Customize momentum schedules + +We support the momentum scheduler to modify the model's momentum according to learning rate, which could make the model converge in a faster way. + +Momentum scheduler is usually used with LR scheduler, for example, the following config is used to accelerate convergence. +For more details, please refer to the implementation of [CyclicLrUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/lr_updater.py#L327) +and [CyclicMomentumUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/momentum_updater.py#L130). + +Here is an example + +```python +lr_config = dict( + policy='cyclic', + target_ratio=(10, 1e-4), + cyclic_times=1, + step_ratio_up=0.4, +) +momentum_config = dict( + policy='cyclic', + target_ratio=(0.85 / 0.95, 1), + cyclic_times=1, + step_ratio_up=0.4, +) +``` + +## Parameter-wise finely configuration + +Some models may have some parameter-specific settings for optimization, for example, no weight decay to the BatchNorm layer or using different learning rates for different network layers. +To finely configuration them, we can use the `paramwise_cfg` option in `optimizer`. + +We provide some examples here and more usages refer to [DefaultOptimizerConstructor](https://mmcv.readthedocs.io/en/latest/_modules/mmcv/runner/optimizer/default_constructor.html#DefaultOptimizerConstructor). + +- Using specified options + + The `DefaultOptimizerConstructor` provides options including `bias_lr_mult`, `bias_decay_mult`, `norm_decay_mult`, `dwconv_decay_mult`, `dcn_offset_lr_mult` and `bypass_duplicate` to configure special optimizer behaviors of bias, normalization, depth-wise convolution, deformable convolution and duplicated parameter. E.g: + + 1. No weight decay to the BatchNorm layer + + ```python + optimizer = dict( + type='SGD', + lr=0.8, + weight_decay=1e-4, + paramwise_cfg=dict(norm_decay_mult=0.)) + ``` + +- Using `custom_keys` dict + + MMClassification can use `custom_keys` to specify different parameters to use different learning rates or weight decays, for example: + + 1. No weight decay for specific parameters + + ```python + paramwise_cfg = dict( + custom_keys={ + 'backbone.cls_token': dict(decay_mult=0.0), + 'backbone.pos_embed': dict(decay_mult=0.0) + }) + + optimizer = dict( + type='SGD', + lr=0.8, + weight_decay=1e-4, + paramwise_cfg=paramwise_cfg) + ``` + + 2. Using a smaller learning rate and a weight decay for the backbone layers + + ```python + optimizer = dict( + type='SGD', + lr=0.8, + weight_decay=1e-4, + # 'lr' for backbone and 'weight_decay' are 0.1 * lr and 0.9 * weight_decay + paramwise_cfg=dict( + custom_keys={'backbone': dict(lr_mult=0.1, decay_mult=0.9)})) + ``` + +## Gradient clipping and gradient accumulation + +Besides the basic function of PyTorch optimizers, we also provide some enhancement functions, such as gradient clipping, gradient accumulation, etc., refer to [MMCV](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py). + +### Gradient clipping + +During the training process, the loss function may get close to a cliffy region and cause gradient explosion. And gradient clipping is helpful to stabilize the training process. More introduction can be found in [this page](https://paperswithcode.com/method/gradient-clipping). + +Currently we support `grad_clip` option in `optimizer_config`, and the arguments refer to [PyTorch Documentation](https://pytorch.org/docs/stable/generated/torch.nn.utils.clip_grad_norm_.html). + +Here is an example: + +```python +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# norm_type: type of the used p-norm, here norm_type is 2. +``` + +When inheriting from base and modifying configs, if `grad_clip=None` in base, `_delete_=True` is needed. For more details about `_delete_` you can refer to [TUTORIAL 1: LEARN ABOUT CONFIGS](https://mmclassification.readthedocs.io/en/latest/tutorials/config.html#ignore-some-fields-in-the-base-configs). For example, + +```python +_base_ = [./_base_/schedules/imagenet_bs256_coslr.py] + +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2), _delete_=True, type='OptimizerHook') +# you can ignore type if type is 'OptimizerHook', otherwise you must add "type='xxxxxOptimizerHook'" here +``` + +### Gradient accumulation + +When computing resources are lacking, the batch size can only be set to a small value, which may affect the performance of models. Gradient accumulation can be used to solve this problem. + +Here is an example: + +```python +data = dict(samples_per_gpu=64) +optimizer_config = dict(type="GradientCumulativeOptimizerHook", cumulative_iters=4) +``` + +Indicates that during training, back-propagation is performed every 4 iters. And the above is equivalent to: + +```python +data = dict(samples_per_gpu=256) +optimizer_config = dict(type="OptimizerHook") +``` + +```{note} +When the optimizer hook type is not specified in `optimizer_config`, `OptimizerHook` is used by default. +``` + +## Customize self-implemented methods + +In academic research and industrial practice, it may be necessary to use optimization methods not implemented by MMClassification, and you can add them through the following methods. + +```{note} +This part will modify the MMClassification source code or add code to the MMClassification framework, beginners can skip it. +``` + +### Customize self-implemented optimizer + +#### 1. Define a new optimizer + +A customized optimizer could be defined as below. + +Assume you want to add an optimizer named `MyOptimizer`, which has arguments `a`, `b`, and `c`. +You need to create a new directory named `mmcls/core/optimizer`. +And then implement the new optimizer in a file, e.g., in `mmcls/core/optimizer/my_optimizer.py`: + +```python +from mmcv.runner import OPTIMIZERS +from torch.optim import Optimizer + + +@OPTIMIZERS.register_module() +class MyOptimizer(Optimizer): + + def __init__(self, a, b, c): + +``` + +#### 2. Add the optimizer to registry + +To find the above module defined above, this module should be imported into the main namespace at first. There are two ways to achieve it. + +- Modify `mmcls/core/optimizer/__init__.py` to import it into `optimizer` package, and then modify `mmcls/core/__init__.py` to import the new `optimizer` package. + + Create the `mmcls/core/optimizer` folder and the `mmcls/core/optimizer/__init__.py` file if they don't exist. The newly defined module should be imported in `mmcls/core/optimizer/__init__.py` and `mmcls/core/__init__.py` so that the registry will find the new module and add it: + +```python +# In mmcls/core/optimizer/__init__.py +from .my_optimizer import MyOptimizer # MyOptimizer maybe other class name + +__all__ = ['MyOptimizer'] +``` + +```python +# In mmcls/core/__init__.py +... +from .optimizer import * # noqa: F401, F403 +``` + +- Use `custom_imports` in the config to manually import it + +```python +custom_imports = dict(imports=['mmcls.core.optimizer.my_optimizer'], allow_failed_imports=False) +``` + +The module `mmcls.core.optimizer.my_optimizer` will be imported at the beginning of the program and the class `MyOptimizer` is then automatically registered. +Note that only the package containing the class `MyOptimizer` should be imported. `mmcls.core.optimizer.my_optimizer.MyOptimizer` **cannot** be imported directly. + +#### 3. Specify the optimizer in the config file + +Then you can use `MyOptimizer` in `optimizer` field of config files. +In the configs, the optimizers are defined by the field `optimizer` like the following: + +```python +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +``` + +To use your own optimizer, the field can be changed to + +```python +optimizer = dict(type='MyOptimizer', a=a_value, b=b_value, c=c_value) +``` + +### Customize optimizer constructor + +Some models may have some parameter-specific settings for optimization, e.g. weight decay for BatchNorm layers. + +Although our `DefaultOptimizerConstructor` is powerful, it may still not cover your need. If that, you can do those fine-grained parameter tuning through customizing optimizer constructor. + +```python +from mmcv.runner.optimizer import OPTIMIZER_BUILDERS + + +@OPTIMIZER_BUILDERS.register_module() +class MyOptimizerConstructor: + + def __init__(self, optimizer_cfg, paramwise_cfg=None): + pass + + def __call__(self, model): + ... # Construct your optimzier here. + return my_optimizer +``` + +The default optimizer constructor is implemented [here](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/optimizer/default_constructor.py#L11), which could also serve as a template for new optimizer constructor. diff --git a/docs/zh_CN/Makefile b/docs/zh_CN/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/docs/zh_CN/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/zh_CN/_static/css/readthedocs.css b/docs/zh_CN/_static/css/readthedocs.css new file mode 100644 index 0000000..577a67a --- /dev/null +++ b/docs/zh_CN/_static/css/readthedocs.css @@ -0,0 +1,27 @@ +.header-logo { + background-image: url("../image/mmcls-logo.png"); + background-size: 204px 40px; + height: 40px; + width: 204px; +} + +pre { + white-space: pre; +} + +article.pytorch-article section code { + padding: .2em .4em; + background-color: #f3f4f7; + border-radius: 5px; +} + +/* Disable the change in tables */ +article.pytorch-article section table code { + padding: unset; + background-color: unset; + border-radius: unset; +} + +table.autosummary td { + width: 50% +} diff --git a/docs/zh_CN/_static/image/mmcls-logo.png b/docs/zh_CN/_static/image/mmcls-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6e65420ab9b63bc8080d1156372e6822e0efe15a GIT binary patch literal 33009 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

qg0|u#M z%D5AQFNWtk51df17T`TF9ignrAkYEr^84rwJd!`=f+_p}>nVt}Hk;@sLmE>SX$zLg z&dG#m={XHipO{!ZQ2mnqa%_hvBFLPD%h21mR`o5h>BTm%CEn|nXU-1V+E7&u7r z`N-JAF$1CBB-&d2!*x&*2{@0n_YvA>&}*rf?|S|Hb`%(DdfeaP z_NXO(33IR=h4gpzMhUM!|qPNLhljH6EBs`5w6h| z$)3v0|0~jLSXg{QJm>AJ3%!?IGu~Z?Hlk9emDKRYJP1*VJwGN3i8yw|(>44ELF>1v zL7MUVl=4Cp2x-s7J7aW*(GI)Q6JLZ~^Rgn%$<$I9e^~)jzDuU9u~j-JV?&YOXIGBz76>2R64S0GR!u zs!-$U9oYx9V;wax;@Z9YObK4ff#NSN_4cqJ__5UO;9cdLz#n`bLNhMNCNA;ni%xmyZ9P(F%O99O3CtYdheMvG)}51RbtIk#?+liX6w)b*W^kzyYQ@)3S!h;y-6xDy`0oGS7`8-Yn=U3N6Tf^~P7=7c zC6Z$KC5YZY3ezGeRF&sx4Qk)l+@H)n!!RPPNX$`)1ar+yeCVgILp-2$64fG~YSPpe z>&}#s-{lsmuJaQ%``=UeF|pS3U?=|cops`z9Y|K-w{XZJ=ecS{Lr0OWgq z3l;ZK^vC0VQCSmm8vei%nanH$&R>~?;$ zg%1oQNFjC4u&wl1q*k=%un*s@3^v?@XeTwIPcR{*GtVr^tSZeV;WwG`aN`S@a(u2d zbjdVlX2VUTWd;*0mLqc*EgD1M<3W6mqSx@fz4mRi|F5X8V2A>0q9vuJSvr;y=>{n& zkycP(Vd?G#q#KbA$)ynlG1jF7mhKW*y1To(-+u4&d+#6IJ9qA!xifdp;oUP&NSPuzzFWk?vUO7V*yrJ0LyD(#j%oo ziNpw7V%6XUVxIia`=BY54;|B+Q`3_Hg#Ny~R zRnTxChbPBdYPIT@d&)KgF65;Kz)iO2cR)EyKv*M%BeZ6J^h^Y1y!w~w-7jDM1ziN9 zLE2LX%ZF_9XC~O!80$Hu)u^PBgZwv{h6xrg#rg4S)rRSuc=MBqhU69Wu;4F)wV|i# z{mtT|`XjkjwE%Fehg)`Epq^j5V@R|4g_V@?HfIOj8DsGW=CwzBsD_;ZP4}l{uvp^Y zsK&FFVUx~7i&A)u1=xOJwaI9DQ?2QHb5ekGUvA za8o;FI_bE1Tziul)uUeC(D~cvH&rHUlyufkT?V+RWo&g17O$CM#PR1VE*&Y&AaZW{ zTWaWSyGUC+ZlZWJ;CM&KGl+p7`nkJU*tx-Oz;BxGNhv@O)CieO-N6(pSh{(U-3=_Rx4vk}kI53D z&e1PQMefmH|iG(m|q4D=!>)2OcfVT6}B>Gyfc=jKKAs~Ts#$v1E=TB025&E$1 zTKM4Pi^4(i$@vB@`L*={5iaHvwjNm}r&)!?0bmbv#qi`ntd*V94C)^SmAQ<!UitHHevl6M6bD9RkLmd+eEbT14g(PA@?ka9wIAbgkC*U%6#BWbVFe|wds)U z{L5>ir8!@pIe<`QXMBm9AZJbgu`KueDc}sb?)J?mvN;H~7q)T?eMnHX8_}t_Y7V*y z(Hj@3BoPkt3j3DYb{SlEe1mt766K5;(fu%VXq&e%vZ_NYnqCDDP*d~dnYf%kI2pyxTgt!?D*s zAGK5&#^$t4?ZJjn=dRfNm%;kb^4x{G$N6{<^V-(n$fvi1+z2JY`g_G=(KGQ*KgJ6R z@FCmLtwi5n#Rtg>a$9qMeH`GPb4xJtqwHlC(~}^ci)m+UrIr#q)1ajek^q%OaQ5r- zsMQu*i0a#emd-Cs@fu|5SBE=KbNcSpw`5~CH$(GVI!kwDe#$g&H@o z^Q-d0g`Y0AgJAxxye-X`i!HwN^ym4BSGOJ4h?)G-gJIcVn$6I&B@&rgZS=>z?&Z85 zYFPU?T>u@#llbBkxJ2A{j_0+RGRS$S_=DwS<$1T#rjvMOeSsyiXL{W2Y^#}x_F9Vu?FpAJJum{M5o*d`;5qolJ{daNuR1J$1Gm@LBG z^b944>EIrEbv#M>%3`iqmI5{N*k4(F{e<>iV-jy1Sv9v9kas%T`bp#5Nqzk8#q<@R z_@1n9f}#&1*vS`OEb?r#1th)*!?bmb-F;gx3b}mlJN!mB(Q9eA%b31!x+H!80YLvu z?v8EezNJ|B!=58P?3Ch&UhZw&2}15-5iN+pM>~7}P69b#D|=QunRD@bR&__@=!?5MxQ_C|4t=`U8c1CUFiNa zOY?*&Zh$Ls_37JSxm&$1A(fD9H@vv#5`*Ey81;2ihuQ;qkwh#M3HO;-`PSduL;T?P8?+wnB3}FWW?k1`o(fIZ*O8OrHFRz`T$QMUBQv*67gN!SN*_*`zZnYc ztg+)4b(2cY05d8&K3kHO5t#F^CoSQ&Q8~2ss|xx=_nJElD3O=YtE@Rj{jToHveqa( z?bu98E#t7hF2YRnD*w><+-%`@kE3p1DTpM!+)EtzYt|$TND3WDU?db@t#JMpnE4dL z+xn0$Ux~xxF5PUO5oT;S2sHG5`#V~uH_2dB$zgo}(PLB$blvh5pSRwT!UCh;DFSA3 z-PVQR$m=&d>?H&+4}Iji>@w&0vE_~9V}z&dIf$#vA}7{TJb(g<_DetWjcW&}N;dg8 z@If&rcKr}Qk%~$sOr@DNUw~3)-J%0!XFJ7EfptMYximnJmMNpv?N3W~gWY~O4rE%R zJ`>j^E?T-LzhAKh^qx^GKZhe-_y{C6t)$!fm*Z14l~tp5OY%F{#Ez^WUJRlTPSU2e zlv0X(C0mmJgd%Q5XpbFN|zFCxuj}1=oovlSsgs6 zeUosBFtrW!9?8N!)LZu&nR!iy(F7aq8pS*v&xB6eo{#}R&_9o?a5Z!>~9Lle^++wmyBKT zHK^}Pqp=(P_U-eh)gJioAR}kVj~o#bqki%b zL`Q98Z4C%UD3Zz%QN(tCB_=0h&+K#C&W~+64-jqCE(n(5+pv8DIG)Fz@a2b-_;7Zg zIXsdCVs7W5d(;l9ZBo~%i=70!!Sn7ZHk%{V!#qmz=b9>(&VQiNmOk3xeTwBMx$edw z!8`27u;OQjS)pzXn1K2jqUOcUy1tL;w2N*8?{1?P1920p(o170M_t~l^+6u0Yr0yV00`VA>Ukxw!xicmKTYmo6DhNh0~N=OeR<5wDlCV+-#SzL!=Y zr)f7c;x;l<-O_QPXR7DBWb?|zEbhA1+13v1XIQP-x*_ZrDkF}y-Isz+(fWlGKhu>Y zhr_l-%bhX9_oHBa>qzPsu_ibgD|675iQ>u!qU8sTWusYBuVyMsYpDM=iE4$8ROs9L z{63)J+1hyy`OO`z1DqGJfZ1|*QR~_qcN(`PK8iRS$<=AA{W*WgN$bnF<;8dj+RmAz z0=ts=aL;$Qc`7u+KA~d5ZGcMaxh&{Nb_!2U-Y;U5XJUzrf+!{sk<8q9#Tfi`sgB@d zzZFyO3QX|WdtY$z1@D>hD=SW5EO~N;lZq9aD4s^W#hQz6Y!AAUOMe==aAJ>ReLP_j zwAv&u@I!9Fu-7Ck{_eS;_`s0SA3L61SRh^bMY5QnYrKtf3E-X=L96>#Ynd!uI;+-( zmE2CP(##rjO2({jpgg{M{BO1`b)?D~WfdCF(5A^Em##GXRq06ZWutJ5E3qAq>|AHv zF2uzRHEW%TJ!4y}(onJF7u*6F-x={wP42=)S{R3$(!YFs`Z>?+I|D!6lEj0l-=)Gq zb>ZS9vnZ>TwCd|v>SztxPnftPS??=;9~lwDqM}}Y?D1nNoz!AWp7w^?t)l^nt)XVj zeL9&=(S4|K(hlW1<^chozeggw^W3v(AIlcT->wzX94aP?IJ za}26YgHC>q_VU8Q!hhYXN4d9W(R9UR%|7kCcw;r0!-H6$4ZJwdm1!{uJIsc#Rg0Sx&xtTj(Ht?N>)Z}*MG5qQY18k`lWn)JXtqE z^hr4WobElg(Ur$>sa$QP_Hik5w|*b&MaIi^D@55Xl3scBf17bTU({zsb!fi)ma^OG zE(iDezoXK(+`=6=Kgr|hd;ir?d7|`{nCp?MzJ|L;cQu*0rAM62jA#<4Z~RNU7ve=1 zc_jpJZ@BF34bscaft4+`a8t03We)EX~qF^Ou4LGLMVCLw?%RX=6yE_LhtT5>ji_&ly-Lm6nLk2B7b zc_Vp71bB(*{h@|I2fwbQcH!;It17qiy%)!7{PUvGQSa^Vr@M@$_VGIo(785uoXlP{ z1|4E2+~jMoVAM0Yaud%cPP;3KnHP`gyeiBy7v?d;6BA}k=43+b;daKvxP0+p@hom8 z|L*z}kuOdRF>U@>X?LFd%PsTiWAw_8rA@>9w2M8Ij}oE6#3<@yUM207muwr)w>Qk` zKpJ^5w~R{F!zuVwNdLs6JMf1oFr|1izh7d*X9#%vVLCc(JSxN-uSYAKxf0j^c1<89 zYA&&-X{A@~B&yk~kU#NgwL!6~on5!gkkoga#!r@Hjv;u&9a(Xs7 zi{{oI98pJDS$)j+ZCp&%%!<4%{hJW8FeTG8(*-41n-}li+P?MtN$${c0s4V@i1$!_ zoU`j0d5X7vei}WDw+xvnt8sP4C<^|+8-UjO+ds{v+3;v^K@0RR?4Fg<{m{v*;+`s< zGGK|6AsaP>H8|__61}NhD}QPpSb+!~yRrP;eH7k|HbSWg@2#>jII^P>{p>nj#FLZR z=Ve4_tOMqeitDUQBEuh+kc+m>gLO`UNI;=I?+v7e#p-RU@PY8xzCTh?C20lLCx={* z%$ZuF-Y%xqfjJg-;;df&9{b9(WoiUwnvVMo($*9aifj9*P#$}JJ*l5gVX%qyu{6`m zs^vDjjq>p!Qr5|zl#gJhyFQ}@nT9Ho0VIe~Xk{|@b%Tr?1@=x)ZhR3-egw7!JyP$% zYogI5Y=TNRR>C`scsL}IY5NxG&lb8Ma5MEXrw$#LEDiM;v5M*elL{E6FXvz~hdXG>WSjN46W9MthRv}@aoDum(H01O+hz{Y+k?D8bj6gf!v^XQM0Jq;J^<}dl1ku z%guZiBSU_h(>6}yFL#fp7sv~z8oodkxY=_%u_q+qm*0Io60-*Rg|(0`uk8@f*Ad ztUOsAL9<|kdR^l=dky`!+&a<+$dR22d)D&o-W69o;3lh3mZRw?19aGTta)8REq&45 z&V1X#Km>hUK;2Fc+@()7mN+R!>F4UHK4APV$nF_!X&H@Ax-91HtE3Ot#l9l4VZW+8 zdEt6GrPFu;ln6-PB}nyK4*^`*!-)`;W)c##2N+MAPn!%Gmhko}CwZluk|e3Pm1B(0 zWxk+ea>4P%>w%xGu?|Oz;<>qb=3&*&pO?fsQ6*axsL#0C1TY@gh2gnm;mxL*L`fg& zJTr&Vy!g6K)^=8bFQ$4ojfa{RtLh8v8pzRWpQFce=>)lQ3NsCgPQDRZeLAST*R`QT zI`V>Q;^L+BU`G9hJ}TvvxpCU2Q`U*o?tduT)be3-cQNyP+l<49~SDD@paz2lvXl1;FV?L zATBU=JF9#4BId}f9X#>XitU4;T&eN#Ic$HVeL{WM+_Gw!O>zTveaG{1Ei=kEnn)8~ zxJ7PBvKC~1CBP?hS~DBd06va(X9POZZL+f*l<8^7D*!Gtpe&@mC!u|e#XdqI;;TG| zYKL4a$%5!SbP&18r@aRExR4}(M57hv(O{sDt~A{(Oyt=L20{l_7QbK=HR7@eG!e(V z=gG3ZTKgQNee>+ZkSv&j3}2hI0+8fjg8`l3h=M7u0Uy5mgN9|$TlYf|1 z+*QjPAy8K1V-`*s5cHNrt4RDhjB2N0OjvkOys8PC|MT>f%8B6_BbMw(5BYu{-0ZUv z$^qvZbu!thOic7K83kpI|R$!mp_0pX*tA6t?^R%n5h?G*!GGQJcFf?VFHHwlfKFT1BS zQ~NjM^LkzfMM2(`r|i=` zMu=R#hHgjv#N=0Xb++MZ6QkG$UyP)Wo}JU%O4TXrMstk3X2h%)E**@{`P*eL z18aGPpB!_k(c!)al%;188K)o-B*jw;(nXi}6D1Gf4>_P$w@edBEKXP3PSRG_} z4y1EP^jIE~!su0e(700?N!@dCm0tP~E~8`3rWjNgxno)Q^WPPM6#YTCxhD7xh^g49 z4S|bVA{67_t2K-^2HrR895QN)m;6eZ%$V|VV0>i@@t8aL4CyJ;dvJSQi_#O@D<9f5 z#?QjMv*pHyM-?6KEHfi}SH&0K)6-H^Us+Qcs|fJ~5vs0GMqBOf+2slWp+I*&a|0J6 zY8k>@{r#PF}IwRrlgmAY_rB;6aPN7Or|NoY~aW+;oYqUZ#@n`2C<=yFoiy1w zXb24`rjSqvzf~aknzliP-}^hP3IMEVV0pso(tG~GdqIb$3cOK}{US0@K^8K7PodqS zvw9c;csd=p{|PnFB3eH9=+xp$7prj;+hudlQ&u#1Z}jADiYEXm6XOB6g@*0Qso%nU z;QWY%QX#3iSyTZ!rx?+>3w<)wtX}7n5Nv}Y0%Ic`tu141D25UnmTu?#2{Fp z%mE~huI)4A&c++=gJG+{#4{n>fzBu7;Y`=q2K>q<{By#N)9kx#5j}^bZ_`B=4lZ+} zU_JAf4wN8)1fHB{dK%JydMcEIjLhp->6H=RA4u@YcP_?LF0X9taOeA}p8jGdUJ|bZ z2UA?JwUc8WGcHxKmFztY38q(gOS@i)J!yn~=a+wbQGl*7a??q1Bod=&;>J8lNDh+xKn0%$XRwvKRp#577-P0FY$}{jTAA`%{imNDb+_av-**LIT}iZO2kx(;8m{e#HHP~o&wg0_ zuh#KUe-*&21VKRA(%OfnGf?kF3dJwh2)V?Mel!;*!LEyim(PmP9>+Qf*H{A^9s|%2 z6-#v}rj*XVL|SWAsjRQRkON*xL__4-roolt>2jQuvaU5Sv^nj1A8E@vdUz_0&pYu6 zvL9BLqVC}2p#Da?p};3S9KXN{I+@?mk`WTg-z8?`sSj8P0c$aRl~mup&Aqe#lf0P4 ziTuma2Nh8QiCKsLW>((~bbY}j76?8um>rq(i&R=im&5sxz5H!Yc|uMYfp$v^SOG_! z#PoMc)WkC=`e+B?Ug-gLAB_RTts?NV*<4lB{1P9yVTRbNJQwKlx^MGsewve(j6%I27C7Y zIBOWHXTL&>0#vl~QQYN1znI+A%|=hO(TIU~AepZN)U=+c#gyt&B|pV-oBia^b)w-) z7B2Fe3GiWrXKUsBI?M5#7iaoYPuQI3%{N{l*%%(s*2?LL8DVPQo7@X{azWx(b?4a6 z5aKp!3t9z1jY_OZp1}u0{Ng}5mn3hxBTku_3GZbxiiX?=oM!%x+Ux~|P0w4sm7UaF z;qc3KxdV%Nyd{qo0>3dR;A(%sN`CVaU5+vHSuph#X3lxF?gW)V_kSAB*PZ@vyY4Ty zc>}j5sgG33Z@Ym@r6GwUM!PX6E66sFcGl^yHu$HXf9IE5D_t!Nz=w+1F~&&0u0bZX zTbI43&2y>qS9OlEL^iV7wkR`xQ8`Ngrt zPMds}PI)s_|5}|qKvQ{yoX02mOuU+zp}|@VF;$l&QU{H1t{2;V3!yzhN^MOgf3zvGY1(-BY^ddYpEYYsNAiF`xUWAC;6b}NHejvgC)?mWSIutKT`LGat<#HE#>V5kLE zf&}17JfZ!J>PiFZ`qq*B%VOL3g`Xx4aSs`v$29LlPMQsbJ`eNG`PCvnMpHyAQ|+^E zpSy(M?IEtn4WIlpQo89hx!46lY zOBLYxkH4IKsi9^VIa0G2b94u}K`ZW(d4%=siMirF5lYv77O6<9u9(Y;eAUz?PS0uzZg$@b)>9cc1&AE~~3{RTcm!`5@og zG$$H)3!_*y0ng29f2hs<6a>5`4TrqBI2R4Cy5wzZv0`UXbpdZ#p|qp;w%nJ0#9}X z9rv*`{$f>UqS|4nKCawc`=vUvxqvMk z$4jpEH%PHetmUtm(u>Q2(%f4euG&0i34;8p+_*t^n3H_b9Gl**;13#jHbbY6P=~L6 z7H;TaSEp+~&O<8!@(0WQY%{Xbb_9#>bx_~uvrUc}fBOC|RD0fo%$DdEa^xWqt$Clb z?LQ|ffg7;Mvv;X^*37r+MCO~!M-oFZN9BvQRz9)Db(~ShHmu}mky3>9JW3gX#~oP? z-2bFj5(czgKGBNJsWE8RNuEAq<0!?!;HS+7bRoT|wTH;=rJINx`ruvcjn8aMDCE0T z==4Om1$5+}TbrIqdlzPsO~AYV@;wS`ik=km@_8wPCy=$ACumwrJCZUI-G{-!aj~&@ zk%+`YbjEDX!LMX+tZspEfxAA*DcfT2Io!K3p8S@_riHJmVgZFXlfBHoWSdV-a}PQB z?1}<4vNTef#X#JbKzbLX*0c>39i=z#I$7Zu7Pc;~IHvYm9+|gQ0qa+0|FaB>S(lna zLj{W7XHj`qkqR~qjO;nlw$U)>rVB|Tmd$hT(G$&H(4G*i5!Vq4=)15_a{s|{^qhU~ zDvGHE+-At4sLH_kj?v4?h7s*JOZpA!Q(FYhFI&Vumt1tjQC zf*3p5*(Ici^HfTom`Ez!`w~LY-Qee-ZQfwCyKU4FxaAlpgklC8J3hshU6Q#Dd4A z*C~?SIW5Ynz>)VmrAIbA!kWM7a07}Li?`1n?uGeYy+DisSd7L6{ahZyUq#}T zrTGV|0=>`1RIPxeD@*yuuK#`I)$&w;GeZ3to7)gU-^VyQYB_^_qi*d2Q3d`{N`P;s#n%?4 zcWZ<|VpgGC2Zp{m8$DjxmlCl(;-MuTn(6Ue0j%J)BE!vX9RWWi7y z^|W|UjYE1v`nq#S*=%^lfYq^wGIHvP+yo}IlUM21;zO$Di2+AH>_D&CNKLy zGAePaWTLqx1Av}8S641F^~oXInjTsCW>?CjU*Cpa;hga*LgF5=@2=_hD@XG2j_7Qn zhoqi1&|ejz9P6nhQ3D~=(_<>*35whq$lujSmT#j)=^)~TaUsW z3ZUtQh0YB*c^dG9tTR)U$^~QrPq8M*{a9qhGA}lRaC;?}2qT{$s~D3rjaAPyYG|?c zR_HADB!`o3Mg+x$L0myIb6W0% z;ax_}66>6#-u*{?AvK>DP5n^KiftL)mfes?;f}z$$Y1MM>?rp!#%KQhcG9S5?GaRansjo;&Dmq1}TN7CS=h3gU9V!1n}C7q=RmaRVBmU@WjeIBZ6Gs23sIe!`u%#?*!a4ip> zZ^SwOP!!#O_~HP_PEY?PSIeNZ_VU|oQ5weix(|NREab<6he^Ubf|CQc7IxLpam>;# zG>sCMQeRT;FrpsJ0CA_ibcC50hercEs~)p?AX4QO)8XkBzkQ_h%Y|an;tfEvGly*A zlNqlGtkI5B6>njFGupK9FTpNy^JM`2+k+WN>FY)S0w3`ds_`vf;abP0>)xL1DhT|1 zFUTnIu`_YA@w9AEEf|3Vz`Tdi5>eVz> zQbx5C|F-U)!BaPvfWE8QC#*uc*x}toPC`KW6*o{X;%RiP(?z-70_0Tlk?IipVPIe5 zGz5@ee~;w@*FAR?^2P{OcI}gw#%&<-A%#2=GHt5dOWqTKN1{yJ#rYC;>LFB#*K@YT zm$-1VE54<3!mf%-iKA?jxqE748w~Z<%-2{Ex^=+_BCrMRi%!T*mL4q@-+q|#h?eGX zx6bHS8_ws@AY_(~=&}5PoW6#; zEO%hn3XE7EbJnd~!*sV`OETLzXt{HPkKq0Hbbgfq#!iG_2qx?;L_cL z=$lsnBk^s4&F-V0axcOKcZIE(TkP4c2;n|QU!yJH6h*m(wxM?%8JjokUuT_jUO}v% z?$E{EwPswYJ{l1oc4ge9)av|5aRU+E5gqAZjLr=D0W@cPlq;OGdMri)0^~=$K5pTZ zwA^tYAr*)}GKY|tERAtpdf28y@StFMWDc zhni5~j371(I~91Kry;SlyK|xC6*!Ox>#@Zm$yjY+y6px3t?7S>;+`p4opdL249!Om zqL<)!T=a)toIimWn<{W%JXY_&mw@*6-Jg$fGj`Q(1VAi>yqRr@b(VE0ZTh1f0 zM}~!U&UAwNSju46WxSm8Q>~@uMuXr6?bSErGL2Tee56CgE!Qo2k8O6UR+*LvjAef} z(N>qU%bd*D_<~M>ChwN~r?<}=GLXX0v~}mm1fnc=*jFE<{MeBv)zdZaTb`A*@B?mc z=L8oomSOr;yQ_I1iN_qr%kT2COg5vQvdg9};Qde6Px+^)l#rqi4UAnNyTg;obN!6z zaGkUs?=o_&WO38iLFsI<2^z@MP-65!G%*&Z*5WExJJMqzB_W-6YF%(5mHUCM>6f)l zW;$VNi2-k7?z#FH5-?a!^E8p1!Z2chOilJ%3Pmhh6Sw;!F zj!e@*H1cQyF+90Zm#@SY{m$p97tYv>jj_%SvsF>4{;hn>33MY;L28dMjOWCgCg)gX!0AR!p(<@FDr0O$49U;8xWy{)te%ih zOoEdG7C2^pNgZE*Bv>36)N2{UdeA(qppAWQ?F7SB$tpeDizwr2CRFF$Rb{-0Q#LCS z6P96WMgP+hKuuRzlR#CSEh)29}}ye}5Poz7D6{dtT{{vNR-q*t;@Af)m|Oe~I3vIzLRKffzK zfte~spWG+Z9&uVtNA(r>KbpCxNq|i@&?ty|8aQbEx{lVWP4oNL30_5ao#dH89dhYQ zOyc$GJnGd72dXS^H)URL`FA$9g6RGFgBM&hc#gpB>+KOTP;Bq+E1nC}Y*+{APiUN9sGTagHj5v*xrF>uOF}^b1Wq zhkOf_N_tu;I2|@GhL;kQ!VD~)f6ZR&&=o9poz4qHI=FeXJ1fziw>h%&eS+^VTHEU_ zTcCB%@^LX2^fiFghn~w@HFpIwU&9qKX|w(b*AS-lI0{c9a~ktnI0`CEs^0}CmjogL&DuiG42l|$gnd`a z$#yWR)mMPIHs?JO5z}9}IYNFxJcl?=85$7k2x0A>D&}9b*{;p*GQROY(hPAM(l4LO z^!W3+=Ms`9C9wL%{*Rdd{aPru-JMZX0I5D;-(pER4)j^VTU;>d*&L?(_mB~;XP=`w z2$FeZof9+)s+`#rIy}IubD~CRjkBjXVerQl*+#IxT`LYe^n zo0#<>zYXfESzNOESvg5vl-J&<6n19Vk-V2rnuLjFhre{rWJ3q!&efbrvL~s7&peIg z3mijjslnBsNptEq@RyRnD*Vh}SKrVKc*7#n3_wZ-feLLqpf(6T9)Ma(#-SsD*&MrQ zEN4T6h2=A)DWUNR$V1A15kjTkw&q7|#sT_A@}_J8-Mic$jpFID)@vX`P)y;$P~RTo z*QiTE>q9wlI6r83HJFJg+KfJEJS~6r+d@PW_rupwnA}62waIq=5|MqWb3rfii&FUJ)=#+&_(_A=W%H|;|0=lvyPfSeEu<6Ak6j0D}{=wl&QwtZ0 zLD`;x^N(dzoH#vngLLwi@r!KPrx^?w)X z6cu?h&i3uWZRupd5~-Q6<4->cI8A!(1083SQDg>sXXmf)K%rl-($wC5&BjJX^>8`a zm77NqseCbf)t1ZxGbbMnN%1DLnJwfyyD4=aMbmS3H;1Iuso zzlZvEBey5kJ*FYSMHTpk+afO-sQQ-=)E~VD2ukKSsH4=xC`NnrS6PhxC8ZDT^0Vsj zaJ@1wigH#1qgOvE%P5NsBg(9@lG8JQ-DZ$zeX(V-a*Z0}uR0OK_~Fi68}+Omnt*%zh($|{ntN*JsY#&iCoO67p!m6ekj zqZ6JZtO6pub~gp71F-0Bp$lOWo`P#D`7Omn0*M+Prwi|dmK3+yHr9K8oj93j(a0ZJ zI4@4XqEwcg=Li23R{9;2CRt1j&eUkXfo4XME7!OJw6b=;J!Wq!vv?2`lclP-Q+YTR z;7dpMkitY$*;@X7uMB!CA4baab?O9nLa$>6{~dR@7nUwVrv@~BN(ebmr7?#i_MX}p z%c-k&Cn6K*8bIIm%Dm#YUDlI4He4+ozC??5H#QjPpbJm^s{u``8lEH3gkf8mnpp{M z+o*v@*mF+O%&rXkI6OfPEMcN=Gnt(_^P>NcY90F>s0OGlq(*1eF;?vBUL7Sy?uIVv zoX+cqOZ5tang-pdM;Suv^EbAkMfCU}D=zFEn9xXI1$!jw4P!wEZuQO%avFm5Loa~G z6gw$d5G&IX7l3ILO4s|m_zj=sK_d=w@gt8RMv84k_}42eS=|7W*o(FJGm$+ z=lsiJfUeZr@v+}pN&XCkaoOKOC&q>5U$C1`6CO|Ynqh^;8tsDD@K6-zf`?rOZ8LAp z2pze#*3w=jLB?Vmge+8YajhtJc>{FdX3p4BI`VC#cZidI)coEm6Nds8F~ z^8~tDv1woQvgOo&OT#BiFR$L46KN-P@*RtomWoN8dqmcWhY5sLHTB|JsDSVC;+R{b z!YL0IX!Od)1yMok9cP)>+-r%QN^KLgJ@kWa5XC5xJTAURwu@DlSj+$!$}JeSV71DjPHgbgSmR_Lr)bta`P_!&&?K^V1kS%=AcWlL7Js8W z1)VH%inWTuM8Cc!A@!AbYx^UK9l!C(m&$ zn-Ugqfk@BF>KsSQsLZyRN&`2LxVo59zpB&GpV!xJ< zzx7N1=Nj6oYa~ZpOMc+cgVPXO^g-n{A#k}%Y2OKj^x+>8zpjfD3q^gxMjgJoT>GVG zz!I>t^lm5Zf&wS&!>Q23)u0X@g#}X3Bc+qaWb=3~p&~@qpnb5RK zTo#4#L;qwL8UEYnloDsu9E3>(gCDsl{r{VCqQoKDIg%im4BD95C;>=U^v5STu|1!t zJxEdb>}V(gN-zxeq{hs_ChVftw}o>J zz4`RN+l*5C^EBZ9fLz(Bl|c(=#gnQ=A3SpAF2he+e~FzGF(o8IPpSD1fZe!lUc914 zAYH+v2agcg8!!JA^-oLyrH|*4m$f8CIENj;U=Ulml}qd{34fSx~0ni+BqvQ4Z`{+w)_2c z_*($X^Am5-)YvnAwymm|Edw>R{y7^;b2ODv0B>%YE((UjhmOSYLN^k$5iX-jI?j^b z?UlsGka(bw79ko$jC5}NfBR`~b0uC~aDBl5hxK@baEInfK#}-eueEtxIUp8?do;Gw z|JxU8Z6o5}LbC&mqWVUzb(Vyb7(*Fro$_8_d(YuR!EnCpe?BLqa{Y*dmJOwT4(ldbF*aO~>e*o-0EiKsTonVi_yFI|q0XpWLEJsgY zpl8)GXE^4-cE&68?JmBH*;VY?9XS58w;UhuW<1Ejd5G)y2?0SNVF^ho>2or&mo6(^ zQNF68s&hkEPv5}M$l|u;9V=@a+xt$=4<5R>x_LkG@%4M^9}pJ)A|f*CWpqq@LSj;K z%DdF}Ik|cH1%*Y$CDk>xb@dG&8=E@2x_f&2KKBn`$Hu=-OioSD%;J|Z#i}_9^{w69>;$h+TTX@#|HNJKQyxcH?V(D<&C=8QBxdSd#Tw#~cF z)0+CkI~RxMR-4ze38G^m1JdjEcyuLo3I781d6ps zGaI{nZiT!l)eyk1tnVi9;8WI>dNH?yAvL|c+#kwt>26ni(hX)D%C_V`9P@ZKb4u&Y z+epFNv~H27$M3aT(|#gJ67@WXF}z|VOFUxToS=hSx`BguQ;v)f?$lJ547GeR+6d6s zC?y_W>*h$lotI4>)A-tOQX9d%Z}F8c51e>|G7LK`uY?zZRWz1P)Ap`;a zTB3(l1LY8bhiGm)yp!OHSF2^6GdqK;3-Pr;YZsQ4+%VqglDs6V5HfJl-mc@i*3j^o zCpa2WzlBo#tvM{y0&IMfbULoa11F;2n}HO#yPnHdY^PcU>lH?T ze!sy=1t<9f%8n@rowwm#v4eEHOOeaQ?Li7rkpLf)_IJh{nBnqiu2WcB=qay@DAOFO zm&&P5mU^J5r93pbq*+jLk_uFvuHbV?9v|CyLSdrxMValziPsNmBdxH-^4z>ht~^~f zp*Ee(a1YU@JcpLO%)7P5Lt7!uVaKYXIz4xL){Wp&6cugIhf!Edlr22D7J?Dv&Dw^LFye2!tClTBH;Ky)P85(4qM zC<_#TJXeexsfMyh`|)>?Y>tn1BTdt)YJCv&oTuQ+P zm7?=@$7@?p6q%Zy$O*e@s8x7bS6>FIMUq4CLTkwTC_+@=4yyW^le@*((fC??f8df3 zk_sHX{m?S-(@@^o>^(u*@_h{`PRt!sxpf~Z@Hhy`+b)6fF_X*2QGv<~E){v$xTss} zjV^f=wp;ac${zw|wXdg~)bBXnRrJw6BS~NG>-fR|AQ&I;Kjvz|-zk2GU4RfT*4NAV z$IR~H3os0_H8RvbrMB}HARg$B=@R*Zpck zw%DCuB;IB!@Ua_xlK{4SNh|`K@Iopuo`<YhZ3B;12e%ZXC~ zK3zN3+F@wlDqP*Mt=dSn#`SJ^Z4Nw)p0SD3>fl!^hTilFH2y#;Lv0C+kK%=(0u8ok zUlMe@g|DVpRu}D`*TtTn=%9qT<~XQ({*WTVgb^quzs2)Wd`vm007DKHSeAqgKv@cy2VJ#bmyRGy*O?7eCa%^%!+ld+Pc5n*t~`{PIR zs@DD1JD3)j{2{Bt(-?w66cq@4w|x-{1>^QY|99TA{}zOmK(VtQzo4<(M$tJxPv>KU zakz~kmy#w^|H|w7{_&zT)c4b?1evNXftqNe1HjC@RC=ptJ6dAhYGs6e_W4()@=m_9=8e!vd`ZQG#?LYV2ez zOBsHDf^)jffViK$T*{|VwfD188xDp8#=H49kLktS9^$+A^w0-~$28MU`b~W(oEGe< zEG*b~{caEHPT+0Ah*-ImMGApyq+!pA2nVbCmdGnJ( zM96#{omSUeYAe0Jmb zjj%Y{_usFAOD^S7EH9|Y(oi$-a6UDel@`LvwxC}19V7=) zf$4>cLsS6!5OhB9v#Vq8M_ey#1;`gsfvFgZZWqJjuO|2i(rY_HU2Y_tr*-rA9;Xt} zN#4!x>Q64fSja;N%`jgS!E}ZSkld1SQ49BpLN4*d>$pN+j7^r`*0U53{s-$u&LKhR zma$`Zj_OGSTb^800R-v79L%0|G0 zJuLU2d{LxO1>_+R8|XmgEmfikLOzqPa4WUE+&vlcD!7emHx3_p(TtgmR69G5)Hyew z52Z2Ii|bjD?adPD&+TIb;|jSCA;&k~xaco{L#3k-REXD*nt@{@f%0}^WXO$>3wd3; zaKlMEOTw+(Hr6?8muQ>WTQa&sP9j+2Q#9!eZVjIqYDKVqH(WkWwYj&Qe7;t z75R9vhWg=sAG-2i8H>y*9HauOc)GqweCztc{gdlm7bJaJ*H)7D2Kcyoq)nUcz+)DK z@RX6Ul=)~p?U;Sk=m@Wih<0auF@B>a<4~kX`3cI-B11d7rKH#WLu_g*c0#&ZN9FO9Y6N;0t#O6v;mwY;0X&o4xG zf%NpP@44{+iOT_k2};15(&(3uT-!)2+5%um^!Pqf__1;0;vtDcx+x_u8&4*hUYC~R zH4M?#;17cjk_5hq;{hu0Sr@e$EBuihTR~6IScenN#*y~n#1h^O%_#EZ!`(%KjjX>G zJKOMHG)=gy?KlJ>h%$5c_V6Uab2K>fF;|I#=cTVz$RVuJ4#Fa(% zx{F%18?ygnio(EC6ny4}FJ@kX3T!FgH;&lm^3fFkL4C7BBg(UJIC2?RNShHm&nJ|G>rRh9bQP)~8e!K)0k83q_bfKQt`#Jvh4u8>qmQq239A zO-tz~m#%$&IoHQf_q2g(WtbFJ9}=DV0=v^y&TaaJg;1#ytUX`pzS~H>#uGDcFd*|D z3-L?$pDvXBw5#Fsj(&j|Lo}|P3hc2OSMHWHy@4(z2V&ER?ITxw55gMGWim$B>!>2b zYcD8%!6O#0YvANkCuA}VRxUmnSZe04SdYiB7RDE$38q&NF*R6$;7qnv#Qf3ysNHXN zkM^UkM1hEep$p*?N-fN0?~qz!g<5< z#e2`}3*>Nr7~4#iQ63dgIa`np{kK?w0S5PiLhSuSOz4+gA9Ex_f5~Olno_ zQ}jecYE@%*N{a1s#Mj7-P2NByHvL4`Do}p@OJw5*`El7;7#~g3;GukS8;)|u&D9Q{ zfU94+)-Adq&x$PA8hQ~q;8QmD&Sw52Hgn;DNAkG>v}7Ff&84b!EGXZtuRb4EzCI0%`+a=diS!eOn1-%8!N(i2og^Z%YfL<9@ zrIQq$MKRDVr&JEJ;3Lskji)enq|IoHMoku8d@M6<%;W6E-i08J-bg0){5RP}PgeHk zDBTI?d^M?YP6ViWv=JakizY-Pct(6#diCz*%nrDnes(d4ru50ZrVBcY`<1Nb6j?e~ zLzt~u2Zn6L+EQgh@27pacKWNT3yTbZ@4jz@26fI?S_ZOj-V*twZ^%K^$NM!S>+A@! zK;$FIiYkVUNh*L@qDXi=W?E{Y0;mxZoTIKJs!mOWFpd-OcG`EPyLxY~?J$3AlTx_A z#BQF~RZ*OBg|uN;&NVhshRE@l=|}>Iz3gemP;~py`e%}^BzUK24Zcs2s!+FX-7<7m z?e6YTwI%ahOn;ap$67ZM92QbxwL4EiswYst7eT4+0*-9KV9alMqNbdw6yW#FtR z98oAzS_tPif_V+}V71$YEtEv$yXW zIc%y+9`=6POc);pLj8B%NRNm3E|u*YL;32XEIabvs7UzxkgH9`rDC81Ms)B%^)#Nr zNc{_w=KwM-L2f+c08$fIHhdIsRVB_z*fA+GRjAHUFJ0n3r0T`|WY%eLuBa@>;N2&$ z6>dvlz;HnNNnSau)`+yBZxnFG_G+B5?Z$y1S7zSJ_B8Tq@_iv7vUm<@l}V^MPY5W1 z)MmKXkL+`z0uafq+Af6si~Cb-8v{Y=IfPNODoebXQL;W#kER3bX% zB>^u+INw~J(Oaw*eXzjB$`#9gn@0Hqz&QW)w?MXS3$lG(;f?`7&5vuFux(xcmJ#@? zsXsPX!pVhM(`H;BJoIbbdXmv_$VhQ{u|WbX?KE(s^d)NI{Xqqq zn1(d8`AI86yR+mK#4<9KPK4hHRmW0+{ll=!6Ss@`{muOo8a|yG{NP$O+S^7FZDScB zRqznl$L8YQRGcCoID}-O?`3TsRqUBW*-dDSzE7gCg9*`@17Rdjt0Zz@jQF$g5W;J7 zDv;DFj@#t^0~YRRAJkgGIFQM2_)sV43O1W+)Sfl@2wiv~HH+Ci=ruYLJb-S?K-%VI zw~=yj8$RP92omG0S`hi3;tQ0mDypicCyHDWSFsfqLJ5QPhx*|i*v6>+bsibSF zAuojLJkQ=oJ!Z5=sF!P*By{qq&{#(8IR2J3^Vz>eoko)NPzw8*c_+-}s}fal!v8{Z}5DG1H8 zt}$}4wb`(BBpp|TRmB=pfxX1>(hvfP98c1KWUae0Q_SEhdh;kN&SO=*o>It5-5Pk; zVL@xq5vsf$$UeQQMGlU_1gpZvQne`i<6)051*hjm9YP4^>Yl={Q2tXu>wP%J+SNV8j+~SAsrIE0G zDIV$4C{21EDNk$P#E!x*LO6@S^AP~U%`}Ql{`}gnpmh9VRk;keYeYv1_*q82RDsMszkgsHpsxEKG zOl{l%efYWtD!`!zs=f_y%FsjlU?!deLNW#Hr7x|%b6O(c{3ylZ%jvF)5NmVJz#;t< zGQAj-Q1S^U?Jd!wUuAS9#r>Uauw?x!x||O^DTnR^vD|~uhM(sNX7~G{QP3B4f^L#~ zP&fw%FfMGTSFR87s$eC|*kIG32WMr2O9;mGZV3Opl@xWZLt^umE4Ngn6DE&+ImK=8 zET|lwn+_%Dmq19ASq$ME2-%KJgBI5PE$BThf?dR7vV+VCY$>|Av z-4_mibFtjtqS_Wg*1+HH$y*KPR&T%Si%v3n8o$>dxHi(F@z!-U)>+rMJvV*|GyMWR znS-G3vbH3QxZ^X3BM+8*NmqbURIh-KzG)00b3ZhG@mnz7ckk;#0#RQTuvx@?P)g{R z-U)L;A?4CAC@vqmK-0j}@=pQ5?^+5&r6D%dZ;?R%GVCGfM1JNSqykE!c0YsY{%ux) zJ$y`@*9B6|e28Q?t{|eObhsknUEMB7;D_|t-h_+$oo~lS>2<=~Z9GrBNY%}fWOQ&u z#H(Y9Pk@%xC}50fVK;7)xZ%kZu7l@KSrqV-@LvqYEaYT`B@Df0W)azme;KcZ_nk;t*Y{cd^qD9-FTldk%)B~8BR zdUprH0!fh46I8*-4w41#4Unt^-=Zv=pggu(RG`S8!WVsQ@l@^bvz(|Q=>C5iUNcJq5 zR%V!!N21@Fd_`>jX`#)Ftl`9okHI6XBo%`5Xej!S%Z5@XDBu@FwFRN8QtVN7#Pdk{ zvO{@v7jc^X%PEqweG!9bwB()k(1;~UL(O(WG(Q)NRk?SA5nJ{rH7 zY}_1MaaVZclh)m}IXAVY9@sdT6rMSX47IV%YF+Ka+Ms5Xxjdy({6j)<-c^MZK>?rc zc5?VN7%E@&v@o$UhYY$K{g}M#Szu&tCW4E6>bG<}GSmTeWJ`s=J!{MYs=81K+}umk z&M0X3;6y>u>&t@+4D;gzGel1-&90MK6ZxqU?f=e@+R@)^0 z2$4*LX$(So1fo$Ndf$M)+jDReZ?iaGeq{#J@c%r37zigDqe|c$*ep_bIRm9~ePm0> zn$|u*FmA_x;@bNi^b3Og-x~$TM~s5;k61L;>?kwous_vm)quL|YoaY?eP=cm=qPk9 zHuxUW|6?@abm&2lo#tKxTjxTN`HC}|eu$s{KCeHiz^Lt|oIpzBx|5lhN#{ExHaV7# zFJ|n$?76o(C&SE__i)dh_|nG2iuF#Cx{YSm(QIrE&!ES!Cn1(&>CTmb&uB-KrHcA|P^=srxKe|Y*~ozHLJAPvN8yD%@=)wM-?zeJ9!3iTlgs9m zq1vP*)Z4q7bCYX%DOV&&Q(b7GyYGFgRJ7{>iktn)Ge^#8iuIDb7OVt!6 zf>pwxi^au)9OE~#yEB8Bfv%>GR2zQ#%-Xd({GD)l^x|L&WGV9wMKdCT^yQ1b)rYRe zqf1HJurJ6|

+QtDunL^!o}~Li3Tm=p7HN@`eQq={z2!F*QqIaM4Hvq8N9*64j@{ zafG7DweT*5j1HI!Ox*zW*u-rzYERc5jU~{NXx@Kh7Ls>8=YbIcQ7y~p#A-VGkSm;w zOne5q@S#v)DAs^`5mRgx*TZy0{35m4#x4$0k4+L0*plll(8 zqUTXiG14;;_t}hW8Sb;!1`uWY^?84P7?7v^_vfwfQGwXN&GsD~|9>@e3sjEZyXD-w zSt$pvynh(7No%k{1(FMOOMe|w+|Ky$Uq+?;%a9%&4AA&xRJ^}Ag*4WQzmBToPj9BU zjfHfRpgua7U@OofJ9A+{&~4gA&v z2v=SFOfb=<%68bf851)5QGUvf>@szH>D7wfGN@FaJ#hVyXf!lySR$uTl_6eau+2RZPS=(LL40Cej{yqgbuO=105^F%+1AD`Y8%jZpG zw;1-2Zah|x(YvWI6AugVJgIoAG0x>;-}{DR1*tAIofP z-Ql3uc?-i@lpezALaeF)vehru^ByhCR)JZTIZ9a;p%#_6CMFQ;nyd>Z8ziA5KgtEr zOv%F$;3}|UrJze&3N|iKEX<3a*!PIl;ua zDRz&~TEWt!&X_Q>(8uZ+efFWp2`{uaQjByc^Ebyv(vt_&I#kxL+#`&qG)WsFCGmN2 zt5hIBZ%iHxJt~Vx-=bLbI9X=`hpDu4^_p?W7%?(b+T4Bn1!@G-T8j8ih*3J9k`nP6 zl%W)LX!#1|!rG@2*#<_;!fZHv5nT1UeeUalus0PPE|OkTH}Q4tmg^u~VnhFY7Mf@F z4q1d08eQOYTAAw2%%?@eMD0d7sel(ncW~Pt?;uBOP2+X#D1upa+8T?uD4ogq2DTuA zuopc#o4=6|z`KVqpvd{Ht8#X;#?NIMMeIiC@GyDQUe;mG22qSEcxyCQ;^vMs7 zL!=$Yyo55a4{ZLbxcoHVd@K9|?|2WpPt!0b{ z3`|WdHrk##mzJ&}2z1LiH1ljswqM#QTu2$*r;AMc2(*{GIy`3$Z8U2cM&FCTztaH) z2@#eqt}9({cZ!j+F%-J4D9SY}V~J054UtK%`GYZf#BePT%(=jK^*O&ayYl%2K)Z9> zRP?!4{t=}}^HUpF8>T!_xWus-yB3V=y$spEdc*|vk#`V7K4S!Y`4`hyzo$KGe~1I5 zSOiEXgKsQBmg%#XsDQeC+Qa`Dc13hsOgH$eMD}vj3LTg}W!^yYby}nXtDE}(#P8co zmY-uacUAa3jXm+6GfM_k;7@XL*vDaosA_~iinD@FIgWI))6O|?LArX}x?6LN~P|8Y8+?{t=B{3FGk;1b?}4uo7JXC{NeMIb?LUEfZi zx%X%u;xW!8N;OcsEZalOU9Cl@<=Op|q`6Obl_Tv>;SBb5rbTG2X3Z<(qQ(Sjpner6 z@X~cHEF)L(;yt?q#>$cP8-dF2kai`afzENYM z>=3TlmkVN}Dz~Eax;hOKHFdj(FYY?BM)x2Ug*76{fmKbcpnFnv7e-PSsD*9!?6&2Z$l{VMoZjVxW{gw?K#zZXfUmdvzMReS8pHh9?gdX!lP5>tPDS zDJKf1+8O7-%90qJbc|l2IZ^%ldzyW9LdCeiS+s zWL8gOv_-InH~bF1_AcK*dZ&r+5ewjXTKI_dY6kj;`BMKdK6d532ASq>3`(uu3OVFK z+}g^FQCl5~>B7T9HT`dl_|A|m_8PBdBCns_?Hv$#Eb%7VQ1vviI0n-+bp^6Ju&%M* zM@Bs}G$;v7RizLP=KLBPEk)Og7?iTVrxsd;vXCi8X-KEUwUT*NYy4J*kAUk)_uY)#% z8JPp6w!+J9S6FFJUOTR>t@-5Pi!69~e3*Ixk$*lsJjZAayCAX;uIB#7)zM3AGJm#&vf@{&k>t3kJ>HtJ6-ZQnWXB$?<) z0-ff>D`{95)1We$7k*_%O)%78;-%3|&VN zxRce_(_l}`4xim9dZp}Zs6pD-olTlv?{CrY4dSB+2V+VO6jIbzm@LA(2x-@0*vD#1 zua^kO;5{&aB#wDvVnC3)6mz!oYWh)2=u@^0f&*?$LR`Qr&r(xHH03e?az)@LmeySe z><>?uKz2*)I)Ny6uuN7)fPtY`Ejz~OmS-!Jrf|1d1dqX|nZ=l-%JR|GvK;3dhWDP1m%DwlqRxLq!5Ye_cywC8qreNd zQ5*UU8CXt}SL_*U%k2Z*nAcC$(jf9NL9pGa9243ITzCvh0y5AuK~i=4S~gSVd0G?x zwM_)EhcIXc?cdUvCt`VM8dz=Jy0cB|nbI`}-{&QeH~gk;)nNS^m2NN6-0}O@$4y?z zNa3%3!L}PS^p?xa!EA%V zAm%C_?*C~9w$qboT62#bHx}WSq2+dxOJ0QVT3lcl1iOATOXb2htlN{{stTVr<_}Zr z;Ex)0U9;`U(rQh7ow#9FFw*iZvASKYgFGY(gupUlgd?4DIjedZt>+Z2U44olmSZBt zbU5h!Yd5bM)1>VwChI%m+a(`lrhI3}dWYC({I?skZ$Zd+=2fy#3ApuxiT%Nl*>#-f z`~w@`*h!OK;Qv6!%o}li*w4XFaVJ7RyYWd1wCp*a5RxM9_=cB+adR8JjdqJzg#B{! z2{iZF>|hoC&@h!H)1aS1VGREV=IdWp!WO z@?q5J$aCd;>JPT%&8%sDh&=u?p80+aU(Ej6yUJb?o_-YbZ!yaE=(e%;&qGDPuH&~0 zg}&nj{3fQqEgkrQ0y+=>237uBEzzG)#L>_HjO~otvG>o?8vwm4sd#SeqHpkt{PA+G z7EQ~6xf=ne5=QRt)zgKyzvb?U30Sf5wBzc0YgU?nP6o<9@-;eF>E06Y67o#xPNabQ zJD0Falni;vgfB2Yw1%w2Y4M&n`ojsvkYLyW1I5&L0*@sMWDZ8|V;@cxTy-^&I7pcd z6j}{ccWslY*4?-ll_A!i3zM0l!z@e^Pq^(7tn1py)=Pja4MAT>zCx|fu2?ULaMz;_ zAR)M|Cb>5DIjuo%zkZv$PdiOap&LhiXk3lSFSOxwq~mzxB{J>0A3o8{YpgQ~vdL15 z?#&||!lhK3F_wp$6b5))GAvRrbX(7m9uPkP8CqfbqH(odcz=_iOVDs(@%6`GI342{ z6t)^98NO^UQaa7(tE)VcYS;~H=4=w(YI0L@O%mvLK06PV)vf3-yf2SslFpBs=HUSxUI`3?t_LStb0OWX`y?3~8rAL!80g&jOro)| z`WJp*%; z_Z9JK?PD8xi_z%liaVf(^2BlR^dV?9KhXj~o4gPhTf`$M3t6DaK#S<$m;9WrD$`95 zoQyhKSQIvBnZ3H$X#21WSy_X1InjcRY>l==q=!MbB zi>8Cj2kk681&iJQaRFL0w2;0^YdQxS~RuK=7fNUs`0}(@fJU z%7|ECpJ8uiUk>>sa<v-{I%R@>2`Z4A2qSMvBLXuLmG=J;(oIe#Z1`fI5p|IeJgKWZ5)UE1nB zA-Mfs;!jB`4?3#2g_RF$MMb(AV2=eeoVohxyzb#JxNN?SW|D9Oe*$M(!K#Y*+}2!@ zur9nOSk}Q_z5jSAs&8%Zy3N}{|4gyt2IER67Z)DIIrGOpE(*Rhp5^B(gjOQxS_uT^ zt4~U*^M_mRd3bjCX3YVfN>KsJEAqN_eAwW=+EO&(T7}GX`xlNQGiIzs=90~d????ekH+l;S3Z%fqmfhjgSKe9#@H4(+I1h|6E|1H1L3nK+B&g31*e957 znkMX7d{O*0uS{n{KSj{;b%+`|6@-%?NYH z(E*5(s$>moZndtJ0q%z%AI#qgzaKkDGa$Q99Q&|Ffw@ zA`b$FeRU$+kxeg5N}5zu?KbX*IU***`UTVY82d9VOdU&dv}QO9Igj^W5mgcoN2DP% z0h&i3WoT7H{@)UZ{srhT-!X3fYiLM&xA7k%eyCRd8{z01>FA$c-)~IGVuSDZ$Rp{$ zPp!&NxwQpgvh=4Xp$z^?!uknW=)2kZ$>+`Z3h#76LbZ{fUzx(VhjPuszQ`8#%<{x4 zJJFWF*s%I2&6Yi<=J|vBdei}1Em&+9(vqBul*U8rxS(FpyICv*bd5BI#VOdnv2=R8g;_wZ2AIhJ0O4L4fhq_~&H^Cjl|W+W3kWcM^e8r*D8v~k#eU$@XB>;K{oxBKz6U5Mhz8s zsz{fOI}vE*I<6or6yKQv0{Y#2dRLg=9eM1yOW_@D&L4Z|bh-w?5cUoAcK?QYTY{)J zyE5ry7KnN)OoOQR84&djhy!U{VBTLJgyVTvQKUoPI-!3W&pN*3lc$BiqG<^sSGwgd zq)yyTh|<)^9XLYllitfc;g2faNW3e&cH9+j@cx{vScZP`fbF0gf8?V2blA|kN`8k= zb#J}ijnoX}s*0#F;&xb1Vc{zqg)DB8<_BCw0>sBjLD&OPtAE-xvV~cnt$To!&S-N^5TZ#RA!@=Dr6+kZngHLT@Oyb~Ey6 z>!pztN(hFdJZC_p1$%oY#y15eJs|n!)|{4KYsKpzj=NIq=V^2qngVt_i@<gakys%E|5)&crZ&rDS^dY!)!N>HcOZfBTLvZq%)t1SgBcilEfoF+>OU%Kf2eCe zTlF71MkDcknWR341)jFjf1IqkMzTuUb-VL!r;Iwu-7r!utn%>a^Fxku_PqJI|8vIo zFFWynv}4R8|}#i#YDGu z1{)<1uh^#8eo$&)9BqK!uGm6;&@Uj#Ob^Ulf3IV}Qysq3FPij2>>x_|{XTrRz4JG~ z6Mgf zc6A@PAVbI7P1CRS*E;>GL;o8DXot->R)7oa3j?Tjsd15_XL1mMfSA;gs|o~%ty|GTB3H#_|-!5tR811 zGwkRoQ@h)Bdexw(IeQ)Geete0LqsPqd|92M60Mtc@rmpEMkUugj8uqHeA#u>U?J8l zO{joifrYTU^+_bJEh-n(6-2>3T zRfX0f4K7L-CU>c3L4yb$bipBUxkqL&zJDk%ZKGks?&io@&t32!SU(k5zuXNVcnHyD z<{+MDgoKZmX6VT@9 z?MF&GM#XEv0>eqPuTIBy1SuGY6T<>X*Jy~>hiAthdZF&L`EQLCZlyB$nRiAsSbXD4 zEEpY{M`K{$^b8)qUlJG;$atUz70xM0t|lEqQlHEgIS|E*e_p@ zum|ruMHbg2=OIx%9kUWc95s03tegh1Xb}tYl*N)M=J)is*4k{^XpqIsF3S6Bif@%j zjxWls#5?K^Um&pK<6&P+C+q^fFaKpi@&w|K&$Y8v2=t>lWf$PNz-dEuUu07Tyvidg7FcWXqR3=N~JvA_i0!6a$GTNe2jNqahrm z^Mncf;!;gbJ&f5IE@Z!o+5M%>A;m^YN-xk34nMrXtaQ8vl^HQ%J-#zV_y8Rp@i-fe z4}LFg-1%Kp;AQJCl|oZd5Yh^)DO+(H^uEK@0VHfolHM(kg9K{$rgq2qy^y8 z*Fbg!SG^y0_=zghChgz@kkPDW?D$(rf*;%2J<&h~VoQ4ptNs4lh))jw=nQytD=|z$?E!Ki!{rzTWyv?~#)gODVRDq{M!g)tlduI!g zMZX*l=%2FfD7Htezf7p|FMWv&05pE-4(~60F%qQtdv|^vRH}6x-LLDb_3NS}#s60~ zWA2h8K^eyNeT05JL&nUsP8Oyy)nS%-aeZW8u>S4pqBSkzf5brkF|A?BkjRlzSc$uy zbd5nfNv_@h0=Qo8_9Lr}aQmOp^!8=_E3V8x2K1wx?B(9o^{t3O3f%GrAU*qA5yP({ zlP)5Cwc^-p=T)q(lN!sX27pOwDP}?vJwRNCcjT+&NfL^aXZ3rRa>kl#=1!zYXprmG zBqAa({d|f&8N%#y1*ug{L*b~XISa1OL5e&AdbZMwoy5$wO_SAM_tUQ(Tkaz2P7kCs zk7_)Iv69YDE$%AY?VOxO=I_~=?y@lya0NfLU@_MA#YKPggb&twBx55Osh8V)fC^-p zDjYXtDjd*6B;h? zE(Lj!;Ga0t*GDTAqjR0Vyco1edL4@~Fv1S5NsakUJa;`tx*jZ$sx^8cPAR;MbF!#e z-#06LzRgYfE_XWfKnZxR17v3fEAnVz~opq^^(kn~1!6z}a8N>?uH zoN{iJHeqs-sAPy5)g~X~?c&iNef)Sy07S(eHLQg;ph0Bp0LgqA$wiJXQ-4=a1!mV! zoNTzYsBDpYT&r$)TNe^YNj3BAt~j?@hQK#m#RaE1cadn~`1^$AyxrgV>ypnDWQWeh z#%3r%jGsV#uAg4=R3?0~dJ&WQ>Px@Nkv!M*DP>yIIa)ETQL=GtPYKwlu*{PGm za($W3S5?;Yqg!%3SdOy~yXas?Ks;@Su}5GfWoJj8wL^%AYS*zs6SrHEI|>BTXUFim z3C%JErKW?69iH@gA6^=c^e}b^=+!qR92S*r z)rHGx`@D`B8d2h;0&ePtPAaMzSNo@tqV4%}3u-!q)NuvL^n6iQ^JiV^FD6zO6pz$% z9$sD9BOliIj8>)a&7;`X01*@3gPiiRNe71)3d<6QCIlu2D`G@hI`|Ho3A;2cCaByE zGZsv;u5;zj$js7Py9*-ovoeo=qh$F{%MWZjMeEBpv?y+0)9y%$YA|CYIAAx+^zpQH1NQ#O#-N7mmV|c~`Y6ymJaT)TNBy1<@iu91 zG+hB=ocra=J2LYW&bbxkBl92e{p`*PmxPWyyO6=Olky3|ND>*_g>=X?8Ybk{wjZt= zLvarCTwG@TQdQ>q;1LygFmw!NyDIyzQm3;M{bp0Y(MV&dFfQzqFx;i4>C4jO68i?M zd%1?FV>sv6NU+3-jA{5M$?uRqDi(S`ad~#K<0?;65W915T{FnCW~S2A^ZCjuN`$(;7NI$Du-7Z+p?`= z_WNPqi19GhxJf3XE$vHh=4KZf#0R+v3j$1W=?mW<-VqUDa{X9|YT_%k6s75iuuVSO zb0$(eh1YjWm(G%nOHoo_UFl8xe_mXw1hD^(Hu=Zl9$`Os;D7hr(zXYkNA~Pr9b!C$&_0E@up>|7{AcU*rx6VPyU%fPO->`;qI{C&&2mn#9pRF&=Fcv&7F*=iBT6`CjRbw!xm+lO zjq<$l^)Pe5v+?x~a>Qlk3O{^b4dqDeJwGU{dTvGN0)e2J4^QFklb@` zfav?9W>UsRolYIn7L1zhZ9!kqnAHiv z3vg~VN^dAf2hO!e;jlt(N=X~d5xl7e!zT&BxQ$9pa!P}lTt}V(9(`7?=U9P>+vFAY zYNmd^$}KEWxef+#8LZDmS2!=RYwRmt1GAYqQtOz_Jp%EuaIKJLVekHJv z$=j3v(%4-3f^T!x!JN4>pEfI%h{rz0O$B8$%7y_a-UefAQGv_5$HGRi*PnP=_rw?W zNNzURRTcL46Ens9*DjfT2u-}o=fC59knp?89g*nXQ>z$n4YOrim}5@JaH4qHEn6zU zmHa0Dwdck|@#5NL@ZZLn>T6Eb!SXihL~o$WgWdWx7{EfN^#TG(5QLp%3F3~>G53e# zb|&a@axPxZv;?#()_J6h)*7f)YoX zQbeTJpooBo2uK&AA~ix(dX0+o5(NbXBmx2=B`Cc{x`1>c5=sbIXn}+pNQnQZ&YU|i zo*B=%p8wu^jTZUP=v<%eXyEd9(p0L!(S)NgPAl{rx3TyYEG|T^#7My`-iBTkELM z`yN6#@)C;zwXq0+}wpfKMP*9xR=`7)5iuA^YyzEQ`yiT?OpCEO{^$7Fx^a zHvuX;Wl|%bBoyf&9-D0?E;7hnpKMtc&97f8cKOKCrU12lX`ju(wzB}2b`&!V@ZIZg zr_1OM&~!+HX%%rEvhg*VY+QHyYq2*(Zbs`(XUayG^XQiI^Aa#LU@Kv*fReY-?XAm^ z$GUloW9+$K*LEa4%ut_vhtAm7>VFe;)Gs z`7XS4&MN_)sdZ7vdfjB`WvLiFl(LBI&A?C&Y4{>_6kya-X)=X!uPP5wQQ;A&*8?ee z0KB?3e18lb`s^HYvnb2D03s=--Yhf<3`#jOgdjfyl)c~67I3uvKiSgyd^@Mj=p#;L zzf3D$aSQ8lS^LNKCN?+C4r@0rdog_A7Pv4MF+2+7j@Ax2xr2b=+nT7Y>$UG4yZ_-0 z<~rRNzeV|Z)7~A4 zm*+QiFv2u00?Cb9z;L_P9Qek4?h`2TGtpx0ELP*aXAGu^sW8%gWzaNXIE2yzCgsh8 zmq~zY_oL6QyXOGj<-d1JF7d(jdRrZ2TYa7(9Qu!AykU_{L=HdgaL#5JzQ}H>mSCR* zm{nMJUD+)eCl}Q@N?*}8H%v9pDmZ{ofzO_9PIHttn$XtlNn0-PcHBC%DSQNOan2U>TQ{`Xtd{ z?s|^}O}x0%%@RlN!+_Ah{qeS@1y)(F#DBbke|XT)C`#|RKw)vTGNQng#T!bo$MZO1 zBmxkZXF?T2Anrb|qz7dsr)y>x4}n%r>J_?Yk{N0{A4jPunHlK^>JwUCf`Ix0=P>I= zZeRxAmcit#2%Jm$1G0pQz zp%d~+U&_s7%h=7AONB+>zhilD;ch^iR6ry!X8wbY1m8DGe&~T`Eye+OL9E@rjOC(y zT~Y?e^6EKbv$ytS?|mpOTEJ~l@?f^}X5vmpgR5J#H{MV(|6vEP(r?n29}3rrZ)&KW z;%Qg^1UmZV@SXAF^4}&Xe}F@>7)RCd6^xoFhwI#hyg=@dapre3KzG_PCKqfT^Xq`m_*?i|wGnbuV@KfcNxMHXCXN zoVnHZ;kAR^DY=Ll=W#C=(dXrC4@*Eb*D6M}9%~>tBu=b649$$=_7skK}UMWx4_+%>M#E`&#enA5&~x2ZIYmA4v?O zL*M856-$kEoA;r#KR|^bG{4@ml@V3>PoRvq6j)6qqL5~n!7s5CJEZPgJ6_b2PmG_F z$~>i@;l`B}9=7o4F=kIvtS)zp%;R?j1_u6jD)0mbbXP&Y6R%EDmsrdd*`o0sqGQjJ z)o6jHfFvN5yGBIPSVz6>UYde}_F!I0*rAZ$nC##B`adKZc&94l>qXHgMZx@(8io#s zshpW-&#*T>(&Uk8^$CRCuEqHwZsMuhw1%akk*HpDqJ>{Q3)yZ4YNWb|D$t zX=RM!#@Hh{_Q$=1zDTQ2JnFK!J&I=GlpbXD`ci>K(^(JPSkBu(<;^_8L=+nEGMK58 z2e8@}M0=MtEnmj_CD+8(L76TLM$YVy}UdefHQe&~XNc+Fxi# zd*7Q-GSQUO#=FUz#guJEwmE0JO!PXuz^PA@WtFUjkQZ+w>wzOJAp%9e-yG0CDoE-q zrlbL8VNd3cI+-k%Q3Q9VsRj(UTI-XO(wsjiO!;n4J?}_A9q>#?=7sbTxu>xw>W^b~ zLmZH-wxiXk7f+03KdzdQ+oPQ3mo4xu&x5G;i+&W z<|Q}>l+%F^>@ZS(*#g#M1mYP#`9U#zNrLl|Dir^C_yl zt67!@Kh7dE;i|vT*EoEee;oMxid`7rT$G4%iOWX4=QDimI`bAVmNVX9QmJq!j8M{v)oBO{M>eYppUYnQc$Fc&LP+kAx4f5{CUPx`y z&?9Ts`B*b&TflSfz)(dt79Yt3X*UMDT08~rmAAbgLQ6$@5V48$Wx>sW)n0yaN|DVnD3$qOjv%s-B^o97xeyqq@YyiM9g&fc^Sv^j(rFmzGLb{d z77k#v+slN=a|cC?63k5d-sLxnw-`yW37lOy?J;ddxT>Vd%qHAg?n?bg3&=-MX5j zya7N2htkr|SYsuEo{70WlEKcXEu|}Lic_fwx!a6dNZ)@<(vsd(CY$DrJA)?Ij@W#- zFS~n5tCSoO$vNOR;w8IGU^%{9L*O#|tz+|u9iGryeXDVR>Fv;6G?O`Bi`5KY%cl)^#Ay=x{$q0=Le9+!aAYUFu!kl? z5hi63HkmLGu(!nK$7d|ulb?dRhOCO0GD`0hbQf1dHI&7Rh*(R?TzvK3e$iNGS{wTD z`uK3(n~b(pFAt}t)mbO>eSiayYyI?F$C`hUXz#zdZ2Zn>eLdmhkIa?d=mkHHKJXpI zK-OMf{-BC1{<5h4gTl@dWB`gR*`w?*lG?tAjBq{>iFsQX#H-A5VR06m39R_+R0S5f z;i}+g#X~)p5)ALGRKDpt|D1L@y&_w0M#@(i5-TH2Ik_Du{A-sPygFnQf|@&(h}Z*I zq>mpYK1~T*&=dRC82J6O?>*+uDq+IFT=XNJZ9q|r)r3OG&bRie`{H#hE$Wj5I_=(w zFYG&J0qZl@WNt0B3Ev@DGIUNmq{l2)H=(n(t#YbM$9-O>ShK20pr4ouW1@tdec@2F zsAEhWcYD!O)MdG#z4D&(J?6@4;rz@10BEX^icQ@O~hg`ZHIq3?j9ga1k-W&&M8V0m8 zJk5D6cfO6Hc=E#vX@@;m<}4w#pGzO8vMOUCEUMt~6}R_Tn*T(Se(d7ZN~_B+4(Y1X zQ}&CVB8a^M6)D*m(jou5EDljwB*U|FG39{KiS^2>4-i7C@5K>R3;{gVGwNi+yK0q& z#x*`R8-0G!x5+Jl-db*mA;A4RaUQfF%w>!IY`+ zpJsWL$}J8012lb|9<0Y~1RFK`6G*BVI6LRk!S;+Tl+t0KnvCbRMtoeo|GqnB8M%{_ zhB6Omw%LB_4Llh{4?l_9{_LL77J5M)T9?RNkp)@NXmlQ7O1ke3nT6Eq8Qd#>hB&K9 zy!SRGY-`=whNodio~45PIrZxZnLhL5IKRWwaq+rVtGPIfi7p}2^SaRMIXbmDsm=Hp z2V8qjG~9{Zj$s7S2VL|f%c3&O&eO!Y#h!E$*{~}A6g`zY23woxc{f=4h3r-M6CVc{#+)o&)JQEf&`rN^+ZIap> zN57W_zaJjUz<9{=cssQiD5Eusc+@W5jj(OOuzH4d*P*~wLROxnaf9qKp%}09T8DJp z>x={Mi7Cs@!i>{Rhc5DMh}3`4_~vQKi=2=w%UqA5mJ@L)#yah~-UGNOzNmew8dWpK z_$&{2i>0FJA=z9a^`u(EwYEd{*}AvZWBEYtbRC)Z`rlz=ZCv+!)3=<#9lyz*E&EP- z)sgwNGE3t>6xaa$ekJ&O->)}`|DP|fAzF(WPQ~x65~5kHMk$+-@(IGVqa%-?b?oD@ zQua{XF7uq8fC=N2Wpj(5b4FA!Zd;r77z2A4Xo*L34yr+ldkHx0y`=-|<}FXpghgJG zT}`-bRXJI%4!+4#%|bVsQq?EjfAfj9ScgSFZ%M38m2Gi6XTM;4^gj2P1r{26aBGJu zn5ItAuy#=zgR;;iVRSGl(S(advap+Vq$H@vvdMby7Q(QaHty~LSA8`;>^iR>fJYk| z-NYEg=9!aZt81ZW6Lge8f$J(Q^%{e4h5*Yo14NA(8qq1!i&#uW}SLDVw3a zoB(tCexTao`^wJ^e$j)oPa4xVbv_O!&~p@p?mK5m8=7yvvlaV+H-nK8y&vodnsA%^ z1e&Vcxnw8|wk?Q0{|QtED9%rPtYR=l*!b=wImer9!Pk`eUiJyMug=DY56SgT0cAN- zR`h~#6{0M`@XHQKFx}@j86GvV$K1r;(6y&%p2xZ(w~c$Br8s4eV9(t8B{Z8n+mK54 zp_;^z?UL?c=AU6!GskHP!a309IG|dMTLF;5TK9K?NwF~eysjIX3J@!R6B_3P-^H(a ztTj;s5@PEj_BA2)7p-ypniKm`ZMnq9A!npv+X^kAFUuaKwEG?~g9wqaV7X*O(V6J=2#t|O3$BGKBFvBVWYce>W1w`ijb7&pCCGl>HGw?KDG`=u@+8G{b= zSVR3*t}OBMedMELClEarZ>^?WK8IlN%zCNH@Q{Idwf;OHJZDM>G=}|MRO@aaHbWUZ#{Ap7Z ztJ%aNWcq=OLawX?^+Ntc0Pd6rND9!cq)Xh zl}607cqReV=mHc%U2sY=b+3CHAhCJLkBF=IY@-w#N;UJ|Hk5^WN7FK6>=54^IxX%*0ItORa@8P6exJgCtHCWCW8D(%utA7GI=IzyN$ zwo0d3VM^MuuOH>>5BN8LH(pW0P`pyCC{iZj2~LO_^Lw#z*H9U+AwhSW1T zYD8{`;V9xE!y^bQ|SC>h*%cs4IuBJq>thTQv>0)6w1m}8e*&>A*uVD9f5G4C@Q|g?c}q{-JG)IuSC3>Q4)5C8` zb}s#)Ex?2ZAfv47v-LCbE0yYJOMe-sZ;7^?|k!mO_Su>;cwxZWowMjuhS9C7EUJwxI5{Zl}O z{4e*A{%>429ilz+t!De_;zju#fM&o4IK=$O)b}3p+_1?lh&?_i4zfepOE%TXN&J1< zLTp;9RRU~KcBOYjDcqvmOHK8Br!I%{lUqkiE;OG4L{OmRW++7nRV$j2(4dHHz=s0D zJd{;YPco%c2z|M1wIFt}8>g|!N36HW={A>~WCG&Fg9IX*l&Hdx3T#;TC1x|d4YTtX ziqmlTqm$FW__-mTPT+bz;v@=nsF_0}A7($CXF2L%b9XRg!^z{%o;`ay1=Mx;(WM(D zAr5R7!@}V?=jPlV512rWX1^pqJbXY1beHa_yuSBkgqm1*gMUzAEQr_-+V! zg_zZxHe+Xma&*PwMWR&{tEP1|JTmoHJ2Q5DN#?x#TQa8v843aWa+2`SfND+MUf_7g zI%w|q3}2hX-6c?2HY?}E)>O>ef6|nb?F>0}mzqF8)b)v_#T-f@c+m+Nd_|SZelGF6 zqlb5dVp19Z^z&nEg^wzNAKy(Y*&aj9zX8kTR(uhbh>L)lDLK3=i~-b8O@_Ruq^{m_ zi5}W$TgAu6Q}C=H*|87 zE#WozfGQA0DNQfKQ&h_}X$1~3?twe=jZh6y+*0QUv`)uBt~{6DdyomVPs1?tRyvW# z+5fr|ls*{M((RcF5e&cx9LG-z~jh~Um3hF4NL06}S zs~5VXihKMB%t{%XV%s_YFfl}Im=QL?6;V+S+rtm3=O2-7kp&!R!FyyTSy(fwF}GH9 ztDcXBx7Z{db1R=xWX@tsSzM00^CW0?*g)XXy+GWvSs`>a;9JNeTm$26!S)<>L$ksR zvgv~4GwB?I6EQb$SlHKH+b?Jxc;qgcNkL%AFinqTv+;|{g$SSJs!p2Cix(A9Oofh@ zgvL7Di=yM;2bbaq`vwP7B&yK?Wp*`|eA7CSR(`NL#h#btWX(|Yo$ZkZlg@IxnwzLpL;Ye008sVEqYnrk^@-4)GY^ z+)N~0FhS9rDCJq6vKB1CkR9`{WZ?TeBQ0I`$-1j*Wb52Koa}CLuQ2$kFt@|rC)#uJ z{G~lIx=JUy54+`9Eh@ouwD^3oLK8(acn;aR3qJ<2=@ohfPZg$EQi3&mAodszhn(H{ z13Trkt2m`Q;rcHy1sQ&Sg?c|l)+}$JcE`sac;1WAmv%> zKyIc`?q%ypfWfS9>BM28aw;ZAzs;HW2?WL3q$nOT$T%5)n=_h@Aq)`*D?f9Nw%pYC zqiS}`A953aNKAf_#Qv2B_U83eil1)UIhaA2wF!a3!f%njI<^e{W=Z}Je>I7u52E(c z>`1)BdsncvkG5NsVhab2`_;Q;#JOrb%CL*P=VJjb1k7efzBXrtjzIZwR)O%nC(sW| zKps3xjqNx6caxIPqj+|j11a`VvM0hI<_xwl3pmE&fQ;P`|7IUpXp-8U=IrJj&gvUq zvbMrKVRb{iIeWwGXk(gIxd4w_%&7zFM>Ws+^r=;N>VCprAxg42e!{93R%*BUT~z zq-kqcPMv{H_N$1N_qp5joz>)tF-Su-W+1PmwVGNm1b9G^be9Mpt;`W*WLLT4-1hA= z-~pgSb3Qt#AVwx5z?JmM?V;?mRu8X$@~P#fBT15Pue&tbttONC>4BD9pFoTN$UQ6L zWoC>qjq?U*0$TLojECb>{J8s&#w2Lwmo$yNuNGizY@z|kJf|?UNK*uBmB=KNNqL{w zD0;7hqIf#WHmf8zUpZQr|A;9eOr}s=Ecd-W|5>xXTQ{`PR=XZ)KdrZ{y!-yl)eJ_3 za>1-CA2AMbh>)`2V1(^Hg(g0!QXeG86l9_T;;4^i@ZL5!oWEp|!9UHjaQj5$rfZJ@ zS&0!h$lD}}2Hcn$CfnI35qwn#C@k8~dujS`82n;Nd#*yviLT)to#sknJJM~V&C>5> z_LpfKD>;$v2d1izXs$AqNzhqr0Ib+?qW;to{bVk;eZ>42d@oJ|BJ9Lh@j$EjdhCHy zZ9c+fVH7`!?D#p89*1xJ@tTXlb;uP?S166I<#Ts6xF-Ojt+fx|Al60f3m)`;?VT;a z0alRT=o2XK*E7dRHoC$WkRd91!nLLL3BA_d(|ehT>vbtk-47)YQ_j!8y*H7ZzkX-| zrVXYD9GDFiAarpC<2JG;Va|8kcB zWMV(x`IBAvJL2;VJ=*;xWH7Q&SdV#J$offND8J(Co5z>ql(gXa@1i{}U$AC~Ns>hr zs0tuDvH*wX;YBF@A*x~&KD^Of(6%X<8M-DET!Qm7)&jpc>6Gmjrc;d(bod%up* z@yiuY-7;|10+jSJCLrQVYVwE7h3`ALy#XlBnAtP)U@AjDVk`~t*8fi8*SE@hD5L99 z&o!r7M-faD{yWJmwGVl^jmb}{4woc#TUHg72Uy&3@|lD^wbLdFir#T^X}k~rmcsE?IqJ_z|Dz) zW&P=QUFq(DFZzM+C%o;@+lqMN>q^e~2o*imNpzu)mB)dXc^7hVC8!|GIGBxoz{-u4 za;xnPcuBfkTM{@xXBD9(gt6NWd1L~|jrV5g)q?psKgnxIdjsh5831f{W+J0+drPAV zgd;xFF9N;~ zeN;pG0MzRC%(r^`JPM2Q^DT$jBNk&ti*kjBAu|hs9PcIPq7@&->9OO zWzu2o*K`s&D}c&cN~081X|@mhQQC^#i`Ue#N>qx*~p!#n-`(f6N>s;pk7nFAT(m_99 z%g_tn`J5)-@y_K&nap$H4lf-wZcKh-J1MDo4oIpppPW>!a+;t0_z48g4QL!XoJV53 z>4xTWeBu{(qRSaRef=7>o5O9{p^!$GB__i42ZlVUo*09BW=7#CZF z^(osB!}80BJ&t8|K^4zw`i@*3xOU1`frrQ!@gsz=Q$?1yZWrA}@xejr2Cvt)#XWEQ=AUJOwdEmn6$(wd#tQkzPsa6s(Wh z1~nsYhQ}NxY3A8kz4tXM5)eM{1?3fv)Z@1uH0_^My^9+IEcGrs{zv%g{ShqQ@H+tc z#{tJQfai2)2Y8XE8#Dic2XHkFLCkIlpx2sv&|}pBz(rpJ^f})Dty+NJ?}rPN3^N?b zsKwv10==m^z$%KLkh2I&|7hBI{HfUV^jJvPcBQgsw_a};6Af8?Oc(a$ zqZ}hGLiYK(TiB4Mcx6~~n!aQk1B#jkKXIorHCz!60txF}uFxbZG`;Kt755|o4B zsW{=P(9siXCl}`t*U_GC&U|~?YcIx_fex=cDC%j`FphxMz#tmQZPc z|9#otm^Y1>j&;zFe#5EP9{!xUT{_TBd_d?|JqB)pF#HFiik zKA*=)DfKCd9+>WFq4u2A77BmY=g@o29CzY;(W_LokW%HugABs)bBIU;*}&I>qB9J- zerHlKF7)syxRLpOcz>>6U_*|QIyNb{4dy>|cZ|NaQyh49X4)kZ z?|1$k9(}kfqX>ZG0QCWY$2kIcoCbi$33RTa05~`(2Y`b&831sw?)68ufPi8BQ}DW9 z14^C#$G@~8V_jW?k}Od$@Smerl0esqTJ8L!TCNUE_va3~-@w?v+CSaY)TYU>7oca_ z(LQ79S)Va=4h${kD?*F_pkIE9|9Xmifo<1Kh(FAu zpD*ctUkLt=5bB>=k`FQzd?sG5T}uD36?`H1|9t1~Zk68?AE0}d5AmQ^Z(c#nI}JLU zaN1apj*b$w+3Vu99yrL_YVVBv#h}Wjt%HlWXVbnu1%+3`){juY;s+#8W$ZDO13>aL z+Ws@|pWgmCd8%$44ru%i0Xr}9=S%-=2-XSm*KgXra#2@&edEQ1=IY{gG8PMOZ0CzS za0d?ycW5e6-crq9vgxwj{;$;KA22(<&07XYI&8{C?O_GZ!SoA&d}vk|LO|1EDjDf7 z7x62H?18$MzjGM)N4|dsE87`761jV()?cVIM`oWQeQ>xc4^wQGToM|@qrh5iVz6zq z*8TwFvBx`kx)(35#%HVU)*~HlT=XJIt8Od1*WxxjRv~CxcCO7-(zbxrOUy$g@qU|{ zO4c(HCa^+s7|CKr(X960o7W}%NOAB&_k88yR&gTnl73*6{OAUKwXw$_k=1{R5topZy0_IoN|LUlfS+m*piEc#S056}d38(1-}k2g1iXE@I*V9qiK(>FoL}@5 zt8TBH<-=UDDQq15XiY}zgAOvKf?PM2^F8$S{Q#7HNn1(OU&`O(b%mBOWHdA z0s;KVB>l-GrKUgk=K*e7N*#zP7C>;H5_>})iJMuKBBX~Cs<9@NNCM25?|Gzio0;Y) zhk;3^Ni4k+KTemTXcLm#`{}}({Aj8y&N$5j^%&+#(?T2MHsdag<M|c9o<#MI<#Wji8bB^RdQpyNikz6^$O2RA4GfOQLYST|5%ZcCr%zn{VDO~* zo!F_IU*y%*_PU}-28bZzOCM|E8>^uqy^vkW*s1w&`0XVg-53})-_kG4MfZ?0Ni6>Tn#FiSrrQ^ z7DZ7Wa>P(B?hkuUueM+M zQ{%l9izi=qOA4l&erfD74MJ)tyf&=M<5{)ev4elycq*@+IoY&2(qF%9<5k7$+Dngj zfWrWfsMQQr4*R$5eHXC{SG>K9pPK`T4B_V#Y^F(=qZM~=p+vvb$zsSZ8CxeXA@<3L zHFNqqs%`S6Bamwm;O8EDmOc3sR}ky|6!%L787EZ$7gazxa<~3=Z<>Qg0*!w&{WDSr z?0`uCB~(N7v(?CM1P!UV?w7AUO8=hMzAIe+z72f?%#+wLsXIzMHQ=k(6ObEY+bSQ_ z?Ghl^#z7zD1`01Q%%k}-oE!;e7_!y#LFGy_#L#l6b8ta%%6~|?-bcZ;} z$savW(3_ULdFvzyBH5&DZTE9=`&VrM>(RWm^I#!z6t!dWtbJYuW|xe^&7N!yfjcL05MS?8%v7eWB zQIzppm8U9-hvR6c{gr$#V--V`_0z^r4W;bc-8_t}M)Q(ez3;nQ7vyj+MsU$jp(d_f zkV!q{aSu;Fjiuv&zu?-VZLx~b$=9t#WMQcvv_~L1Q&IzOUnCIvf&6hrYS7+T& z?4AKe;;RIY?4bdM2!XYFTaw!{9+YGR?=kxaZ}$PX>s+4LrkGnlt{*YAZJskbM%hJoo?vpri|~;vuU( zl1a*P8Yap+_QtVtMDrFEpM1DSPo(DfaKNhrl}urx<_nhIbI+Dy;4@D2^mB(aS&nnW zc53@INpt{!*sC|+;)wqK*^fesb^{lGpIYc54`P+S^e12RU&Q$SjaB=%ui1K`U{>FK zq?niS8FlCop3>)?1+bH)Zw?1m#2h^dDc|eZ&d;W{HOvffn$+Sf2CC+uhtZTnwrOM& z0ywC`gw(Ql{mnaaTqIp^vT7FzeN$N{`xD6aRAict=i%JKZ4qp|oLX0&c=5BI9_N3e zrl6Gd7Go=c{J0oQ+PoAZ1Kr#TRO(bCb1vQ-X=iTtj?>hAlOxb408`v-Hew^$viGKm z>-A)jC-=dEp2CDrpn75mdKb3SZA7{Z%aKLSU!Sqc)Q%~)u0l( zSW+xYI(B}?qn8nGtv0Kv!!xTK>40xr7lIB^+gHh1=eOpOCQfxH0Aihj)5L{=M9ch! zer@_UcEwvuU`F@7zS_>Hc?ICm);K9wEkzUIW9~YcMg~=1l^#>3APC|~65@+Ha;uMQ z3ux%rq6o;P4~LDYc9J~kVTK5T0|cPxrV_!7fZ|1tzB>l+gI)m<$8!1CK3e%Fb*-JTo35IF^1xl66CsPRLyE2qpl0oSp}ScY5q5qyhTISJzM`P|G~|y*AdjM z3)PDXbx2KWmVHq7$cAXi%wimr&enu#(aYBjYI-oWTohRg_Sv(Xr>1iB=lK3@eE*2K zj{AnOdNx-HMJaD|M8_52QMLi=pjp*66yYq%Ia)>{WXtxO8OJ`>0*2C8$X@U~8~1HD zPV>p$knHBzFz#x?x`+(G%o`*C1!n*-ow5qHrzipF`5_Fc0LTa+I~d^_*VaAjT=y#= z_xYdA{2H%6#KsA@{m&Z6K&czwegcj4mkpq$3Qz3c7;MszTy>;H)0e&6B4hmg!j=nX)w`~dmv zXR#&g{qq;^v5sl*okz^IB1Fs&Zcr`(jH~16=e(`~)!Jofnf8x2&5nKoCBc^U-!}rr zQP^2DXth|TefQ*$B1MKOOL1xB!3ItF3sM#*uyre#V3|W=Xn-;5d(#3qYli`ttNY+LYW+V}}Gcd>V)^hGldUtx)Jken5 z^kMMFBrQw<4_LCvUF%M{)a5%YKI=Y7TFMRf79`yZ{a!N;Oq+u?$A*FQ4nvkdVDA4T zf6%|InF{sAMv^Kj%gl_XLn)=|PC{8!IX&f0yn)j$f`gUST~Y>y22lIWTZEEf2TtEP ze(U2B>mA!z)BF;l2GHWnn!kkBz4~ZD4~JfSO1U`NG82vgs|tBS%z?6s&24ipTWoTg z(k)xAx#AuH?xWf2yUtZ6zST&361&9IxrK{2b?6>T%h z(B>xSbBRqgKijt7|K0;=NQ$TcKPl53QRK)skw8=cuji910$ znVK@ew;MyY&6iDkYL0U>7Sha*o_2R|-mO6V;Ob!ZWV^gUod~w$&HrHF{;6&>`3R}k z!4|9x)~9Nvy}}q+E%cAuKmpB^aBDV@m)Q9 zrx~LU1-{uabNv~B5kLW54MbJcvwzfN%4--2_SNn=nLNVyyd!^c^ZNEdrtOKKBL^AY(*AOX_?IoH|J3r1P6VWG&v0nsA;QdC#E4ut1gNhbYVHv* z?JBWhvaG6bgzJ`>47U?edVG4fD04&>$E@;2)sEH&M&T*>fuirLl%Zjm0%#;%)WV$J zVI@zxOHn5!94jMTr0ve<4?3*nx^P(2*01$NOl<2>s&PM67&B`^Hme?ULk1Nso61 zuiq5mU#CkVNWV}GpoD&(?)z^D)t|6L8D1kC+WS79qs*jxLd{5ebrO^l71qO0_Vh}i zP#2qQbTQfD{A#?9c1qIQraej9a&mJIxSH|96OWd?2r!_(hUOF7r&b9n&Md5+6M7t; zsQRIUWn``h<&(JUeQAryM>Td|DmJ;cNwRu#1#5%lD=ib3a<;}U`#&ky`8!s8mB%Uo zH(Be2qY5SJpuu!;5~>l-Y>yMZDPj8tL)by~s2yKul{?p?s_*2ZsGivehh5;VLsoLW zlepC!=pT}DL-jnleM*?B?)hQKf-FMEme~g8`W_=i`14Sndk|)VhAgYl4m*kwwk6#o zC2xeBj*`XE0>x6waat6U*?Z3dS2U}WSb@Sy6o@tne0yqhZd{5(o~c98GwogdwLFbH z8@=R>7)UuH-=*ni*gj%X3l4_vQD*leVMp3;7NFTEK8ELbqC#^`HCg@&RwNzd%0L9m67)YaZ7Z_o6!tCsDA+@3CIj4~|P zvfX9#>rQ^%o%}mX&rjE)-*TK~jP-AY<`;*k?tpq?8u4s&!HfuB_-N}TUZ7_u7jgT$ zo!l+@HJzMbPL6^PsyFFt-r+IZm!!Qfar)(g;_tfQ3&(I7^%7NxB%;Wub7Vh!HM|c@ z=$Q^6Ai*#zu7I;-a6{Ih>I8XyvQON~y*OO0#5CZ+(&jlRXjEo$g^MUog}|!hiz#{z zV@i4cR)(YglG?L-Cmq{zd<3_X9P@iAgNccctlCJ@ATCprDH}u zfi_YuQO$aMS*%AA;KYMnxGndx^Rkrlw!E|??r9jl>b;9aH>ILw(PuTspV7b5YI`Bp zcOO~3CT5b=)4Tl~84@(#&e3mmp5oiSvH4QjxeMegVkWL34{>K0PmR%c`?^pB$=!P8 zJyqL$FOkp@PSR9lK7IgLQe<(r-Migp-@!btM$((AAMbqjJ4P(agQ}y5Y9%*JsQ&>n z{U!m0YzIKuU@%vqkEPB?@GT61E9%1t-IGWpI;+$xmNNSZ#LBp;QE`ql&W_H z$r`?Aj6SxDbH4IVMGk)xK$zU8cZ2hjipfPw)m2IqFR}z3ASvx!YH~1j4O3ThOMl& zJ)^6T{nLiE&{y1E%|zz10wRcl#zlDkc3zuexT5Z}TtW8bNPtuZR6b-U6;F+l3~Qkb z6I}Z!_tM$4n;9JeyqaW;>(kcZ;OqrfdZh8!u>l5PmWTs@Vmd-W%Tt|Cc>?+&;62D3X`Ks zooZ5?((2QX}q1*|h_TN$XT%phyM`nk52);x<~0#SskA=_wvZ~}OPe~YC5>m>0aN(KRmQ}8tzVF{J; zJaew=U7p^qmZz2zli8fR24sd3Tb&lK{eqI?Gi-QvJA}qQtYW9O8cT%OR9Y)mCv)grs_zSvWnemobn4jJ77%_)`=azBbf6#w>ar+0=R;$ zXeXAx7#N1IaRjF{KEhwb(xN6w;Ek^+*DYxuCGcL_amvXmRx%fA6ZRKruNqAzM}3RB k_w}!@9uPg%%%|H2w*9aC^5^X8&;NhM;NNi!fIs#9KYW7SbN~PV literal 0 HcmV?d00001 diff --git a/docs/zh_CN/_static/image/tools/visualization/lr_schedule1.png b/docs/zh_CN/_static/image/tools/visualization/lr_schedule1.png new file mode 100644 index 0000000000000000000000000000000000000000..31fca35bb525280af6f83b755aef3f2495f07ed2 GIT binary patch literal 30065 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 JE;56U{Rxs2h5P^j literal 0 HcmV?d00001 diff --git a/docs/zh_CN/_static/js/custom.js b/docs/zh_CN/_static/js/custom.js new file mode 100644 index 0000000..44a4057 --- /dev/null +++ b/docs/zh_CN/_static/js/custom.js @@ -0,0 +1 @@ +var collapsedSections = ['Model zoo']; diff --git a/docs/zh_CN/api b/docs/zh_CN/api new file mode 120000 index 0000000..0ef434a --- /dev/null +++ b/docs/zh_CN/api @@ -0,0 +1 @@ +../en/api \ No newline at end of file diff --git a/docs/zh_CN/changelog.md b/docs/zh_CN/changelog.md new file mode 120000 index 0000000..6b731cd --- /dev/null +++ b/docs/zh_CN/changelog.md @@ -0,0 +1 @@ +../en/changelog.md \ No newline at end of file diff --git a/docs/zh_CN/community/CONTRIBUTING.md b/docs/zh_CN/community/CONTRIBUTING.md new file mode 100644 index 0000000..5554800 --- /dev/null +++ b/docs/zh_CN/community/CONTRIBUTING.md @@ -0,0 +1,62 @@ +# 参与贡献 OpenMMLab + +欢迎任何类型的贡献,包括但不限于 + +- 修改拼写错误或代码错误 +- 添加文档或将文档翻译成其他语言 +- 添加新功能和新组件 + +## 工作流程 + +1. fork 并 pull 最新的 OpenMMLab 仓库 (MMClassification) +2. 签出到一个新分支(不要使用 master 分支提交 PR) +3. 进行修改并提交至 fork 出的自己的远程仓库 +4. 在我们的仓库中创建一个 PR + +```{note} +如果你计划添加一些新的功能,并引入大量改动,请尽量首先创建一个 issue 来进行讨论。 +``` + +## 代码风格 + +### Python + +我们采用 [PEP8](https://www.python.org/dev/peps/pep-0008/) 作为统一的代码风格。 + +我们使用下列工具来进行代码风格检查与格式化: + +- [flake8](https://github.com/PyCQA/flake8): Python 官方发布的代码规范检查工具,是多个检查工具的封装 +- [isort](https://github.com/timothycrosley/isort): 自动调整模块导入顺序的工具 +- [yapf](https://github.com/google/yapf): 一个 Python 文件的格式化工具。 +- [codespell](https://github.com/codespell-project/codespell): 检查单词拼写是否有误 +- [mdformat](https://github.com/executablebooks/mdformat): 检查 markdown 文件的工具 +- [docformatter](https://github.com/myint/docformatter): 一个 docstring 格式化工具。 + +yapf 和 isort 的格式设置位于 [setup.cfg](https://github.com/open-mmlab/mmclassification/blob/master/setup.cfg) + +我们使用 [pre-commit hook](https://pre-commit.com/) 来保证每次提交时自动进行代 +码检查和格式化,启用的功能包括 `flake8`, `yapf`, `isort`, `trailing whitespaces`, `markdown files`, 修复 `end-of-files`, `double-quoted-strings`, +`python-encoding-pragma`, `mixed-line-ending`, 对 `requirments.txt`的排序等。 +pre-commit hook 的配置文件位于 [.pre-commit-config](https://github.com/open-mmlab/mmclassification/blob/master/.pre-commit-config.yaml) + +在你克隆仓库后,你需要按照如下步骤安装并初始化 pre-commit hook。 + +```shell +pip install -U pre-commit +``` + +在仓库文件夹中执行 + +```shell +pre-commit install +``` + +在此之后,每次提交,代码规范检查和格式化工具都将被强制执行。 + +```{important} +在创建 PR 之前,请确保你的代码完成了代码规范检查,并经过了 yapf 的格式化。 +``` + +### C++ 和 CUDA + +C++ 和 CUDA 的代码规范遵从 [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) diff --git a/docs/zh_CN/compatibility.md b/docs/zh_CN/compatibility.md new file mode 100644 index 0000000..178e555 --- /dev/null +++ b/docs/zh_CN/compatibility.md @@ -0,0 +1,7 @@ +# 0.x 相关兼容性问题 + +## MMClassification 0.20.1 + +### MMCV 兼容性 + +在 Twins 骨干网络中,我们使用了 MMCV 提供的 `PatchEmbed` 模块,该模块是在 MMCV 1.4.2 版本加入的,因此我们需要将 MMCV 依赖版本升至 1.4.2。 diff --git a/docs/zh_CN/conf.py b/docs/zh_CN/conf.py new file mode 100644 index 0000000..31d94e5 --- /dev/null +++ b/docs/zh_CN/conf.py @@ -0,0 +1,241 @@ +# flake8: noqa +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import subprocess +import sys + +import pytorch_sphinx_theme +from sphinx.builders.html import StandaloneHTMLBuilder + +sys.path.insert(0, os.path.abspath('../..')) + +# -- Project information ----------------------------------------------------- + +project = 'MMClassification' +copyright = '2020, OpenMMLab' +author = 'MMClassification Authors' + +# The full version, including alpha/beta/rc tags +version_file = '../../mmcls/version.py' + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +release = get_version() + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'myst_parser', + 'sphinx_copybutton', +] + +autodoc_mock_imports = ['mmcv._ext', 'matplotlib'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} + +language = 'zh_CN' + +# The master toctree document. +master_doc = 'index' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'pytorch_sphinx_theme' +html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# yapf: disable +html_theme_options = { + 'logo_url': 'https://mmclassification.readthedocs.io/zh_CN/latest/', + 'menu': [ + { + 'name': 'GitHub', + 'url': 'https://github.com/open-mmlab/mmclassification' + }, + { + 'name': 'Colab 教程', + 'children': [ + { + 'name': '用命令行工具训练和推理', + 'url': 'https://colab.research.google.com/github/open-mmlab/mmclassification/blob/master/docs/zh_CN/tutorials/MMClassification_tools_cn.ipynb', + }, + { + 'name': '用 Python API 训练和推理', + 'url': 'https://colab.research.google.com/github/open-mmlab/mmclassification/blob/master/docs/zh_CN/tutorials/MMClassification_python_cn.ipynb', + }, + ] + }, + { + 'name': '版本', + 'children': [ + { + 'name': 'MMClassification 0.x', + 'url': 'https://mmclassification.readthedocs.io/zh_CN/latest/', + 'description': 'master 分支' + }, + { + 'name': 'MMClassification 1.x', + 'url': 'https://mmclassification.readthedocs.io/zh_CN/dev-1.x/', + 'description': '1.x 分支' + }, + ], + } + ], + # Specify the language of shared menu + 'menu_lang': 'cn', + 'header_note': { + 'content': + '您正在阅读 MMClassification 0.x 版本的文档。MMClassification 0.x 会在 2022 年末' + '被切换为次要分支。建议您升级到 MMClassification 1.0 版本,体验更多新特性和新功能。' + '请查阅 MMClassification 1.0 的' + '安装教程、' + '迁移教程' + '以及更新日志。', + } +} +# yapf: enable + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files = ['css/readthedocs.css'] +html_js_files = ['js/custom.js'] + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'mmclsdoc' + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'mmcls.tex', 'MMClassification Documentation', author, + 'manual'), +] + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [(master_doc, 'mmcls', 'MMClassification Documentation', [author], + 1)] + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'mmcls', 'MMClassification Documentation', author, 'mmcls', + 'OpenMMLab image classification toolbox and benchmark.', 'Miscellaneous'), +] + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# set priority when building html +StandaloneHTMLBuilder.supported_image_types = [ + 'image/svg+xml', 'image/gif', 'image/png', 'image/jpeg' +] + +# -- Extension configuration ------------------------------------------------- +# Ignore >>> when copying code +copybutton_prompt_text = r'>>> |\.\.\. ' +copybutton_prompt_is_regexp = True +# Auto-generated header anchors +myst_heading_anchors = 3 +# Configuration for intersphinx +intersphinx_mapping = { + 'python': ('https://docs.python.org/3', None), + 'numpy': ('https://numpy.org/doc/stable', None), + 'torch': ('https://pytorch.org/docs/stable/', None), + 'mmcv': ('https://mmcv.readthedocs.io/zh_CN/latest/', None), +} + + +def builder_inited_handler(app): + subprocess.run(['./stat.py']) + + +def setup(app): + app.add_config_value('no_underscore_emphasis', False, 'env') + app.connect('builder-inited', builder_inited_handler) diff --git a/docs/zh_CN/device/npu.md b/docs/zh_CN/device/npu.md new file mode 100644 index 0000000..7adcf0e --- /dev/null +++ b/docs/zh_CN/device/npu.md @@ -0,0 +1,34 @@ +# NPU (华为昇腾) + +## 使用方法 + +首先,请参考 {external+mmcv:doc}`教程 ` 安装带有 NPU 支持的 MMCV。 + +使用如下命令,可以利用 8 个 NPU 在机器上训练模型(以 ResNet 为例): + +```shell +bash tools/dist_train.sh configs/cspnet/resnet50_8xb32_in1k.py 8 --device npu +``` + +或者,使用如下命令,在一个 NPU 上训练模型(以 ResNet 为例): + +```shell +python tools/train.py configs/cspnet/resnet50_8xb32_in1k.py --device npu +``` + +## 经过验证的模型 + +| 模型 | Top-1 (%) | Top-5 (%) | 配置文件 | 相关下载 | +| :--------------------------------------------------------: | :-------: | :-------: | :------------------------------------------------------------: | :------------------------------------------------------------: | +| [CSPResNeXt50](../papers/cspnet.md) | 77.10 | 93.55 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/cspnet/cspresnext50_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/cspresnext50_8xb32_in1k.log.json) | +| [DenseNet121](../papers/densenet.md) | 72.62 | 91.04 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/densenet/densenet121_4xb256_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/densenet121_4xb256_in1k.log.json) | +| [EfficientNet-B4(AA + AdvProp)](../papers/efficientnet.md) | 75.55 | 92.86 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/efficientnet/efficientnet-b4_8xb32-01norm_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/efficientnet-b4_8xb32-01norm_in1k.log.json) | +| [HRNet-W18](../papers/hrnet.md) | 77.01 | 93.46 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/hrnet/hrnet-w18_4xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/hrnet-w18_4xb32_in1k.log.json) | +| [ResNetV1D-152](../papers/resnet.md) | 77.11 | 94.54 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnetv1d152_8xb32_in1k.py) | [model](<>) \| [log](<>) | +| [ResNet-50](../papers/resnet.md) | 76.40 | - | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb32_in1k.py) | [model](<>) \| [log](<>) | +| [ResNetXt-32x4d-50](../papers/resnext.md) | 77.55 | 93.75 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnext/resnext50-32x4d_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/resnext50-32x4d_8xb32_in1k.log.json) | +| [SE-ResNet-50](../papers/seresnet.md) | 77.64 | 93.76 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/seresnet/seresnet50_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/seresnet50_8xb32_in1k.log.json) | +| [VGG-11](../papers/vgg.md) | 68.92 | 88.83 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/vgg/vgg11_8xb32_in1k.py) | [model](<>) \| [log](https://download.openmmlab.com/mmclassification/v0/device/npu/vgg11_8xb32_in1k.log.json) | +| [ShuffleNetV2 1.0x](../papers/shufflenet_v2.md) | 69.53 | 88.82 | [config](https://github.com/open-mmlab/mmclassification/blob/master/configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py) | [model](<>) \| [log](<>) | + +**以上所有模型权重及训练日志均由华为昇腾团队提供** diff --git a/docs/zh_CN/docutils.conf b/docs/zh_CN/docutils.conf new file mode 100644 index 0000000..0c00c84 --- /dev/null +++ b/docs/zh_CN/docutils.conf @@ -0,0 +1,2 @@ +[html writers] +table_style: colwidths-auto diff --git a/docs/zh_CN/faq.md b/docs/zh_CN/faq.md new file mode 100644 index 0000000..03243a2 --- /dev/null +++ b/docs/zh_CN/faq.md @@ -0,0 +1,74 @@ +# 常见问题 + +我们在这里列出了一些常见问题及其相应的解决方案。如果您发现任何常见问题并有方法 +帮助解决,欢迎随时丰富列表。如果这里的内容没有涵盖您的问题,请按照 +[提问模板](https://github.com/open-mmlab/mmclassification/issues/new/choose) +在 GitHub 上提出问题,并补充模板中需要的信息。 + +## 安装 + +- MMCV 与 MMClassification 的兼容问题。如遇到 + "AssertionError: MMCV==xxx is used but incompatible. Please install mmcv>=xxx, \<=xxx." + + 这里我们列举了各版本 MMClassification 对 MMCV 版本的依赖,请选择合适的 MMCV + 版本来避免安装和使用中的问题。 + + | MMClassification version | MMCV version | + | :----------------------: | :--------------------: | + | dev | mmcv>=1.7.0, \<1.9.0 | + | 0.25.0 (master) | mmcv>=1.4.2, \<1.9.0 | + | 0.24.1 | mmcv>=1.4.2, \<1.9.0 | + | 0.23.2 | mmcv>=1.4.2, \<1.7.0 | + | 0.22.1 | mmcv>=1.4.2, \<1.6.0 | + | 0.21.0 | mmcv>=1.4.2, \<=1.5.0 | + | 0.20.1 | mmcv>=1.4.2, \<=1.5.0 | + | 0.19.0 | mmcv>=1.3.16, \<=1.5.0 | + | 0.18.0 | mmcv>=1.3.16, \<=1.5.0 | + | 0.17.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.16.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.15.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.15.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.14.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.13.0 | mmcv>=1.3.8, \<=1.5.0 | + | 0.12.0 | mmcv>=1.3.1, \<=1.5.0 | + | 0.11.1 | mmcv>=1.3.1, \<=1.5.0 | + | 0.11.0 | mmcv>=1.3.0 | + | 0.10.0 | mmcv>=1.3.0 | + | 0.9.0 | mmcv>=1.1.4 | + | 0.8.0 | mmcv>=1.1.4 | + | 0.7.0 | mmcv>=1.1.4 | + | 0.6.0 | mmcv>=1.1.4 | + + ```{note} + 由于 `dev` 分支处于频繁开发中,MMCV 版本依赖可能不准确。如果您在使用 + `dev` 分支时遇到问题,请尝试更新 MMCV 到最新版。 + ``` + +- 使用 Albumentations + + 如果你希望使用 `albumentations` 相关的功能,我们建议使用 `pip install -r requirements/optional.txt` 或者 + `pip install -U albumentations>=0.3.2 --no-binary qudida,albumentations` 命令进行安装。 + + 如果你直接使用 `pip install albumentations>=0.3.2` 来安装,它会同时安装 `opencv-python-headless` + (即使你已经安装了 `opencv-python`)。具体细节可参阅 + [官方文档](https://albumentations.ai/docs/getting_started/installation/#note-on-opencv-dependencies)。 + +## 开发 + +- 如果我对源码进行了改动,需要重新安装以使改动生效吗? + + 如果你遵照[最佳实践](install.md)的指引,从源码安装 mmcls,那么任何本地修改都不需要重新安装即可生效。 + +- 如何在多个 MMClassification 版本下进行开发? + + 通常来说,我们推荐通过不同虚拟环境来管理多个开发目录下的 MMClassification。 + 但如果你希望在不同目录(如 mmcls-0.21, mmcls-0.23 等)使用同一个环境进行开发, + 我们提供的训练和测试 shell 脚本会自动使用当前目录的 mmcls,其他 Python 脚本 + 则可以在命令前添加 `` PYTHONPATH=`pwd` `` 来使用当前目录的代码。 + + 反过来,如果你希望 shell 脚本使用环境中安装的 MMClassification,而不是当前目录的, + 则可以去掉 shell 脚本中如下一行代码: + + ```shell + PYTHONPATH="$(dirname $0)/..":$PYTHONPATH + ``` diff --git a/docs/zh_CN/getting_started.md b/docs/zh_CN/getting_started.md new file mode 100644 index 0000000..d3e9899 --- /dev/null +++ b/docs/zh_CN/getting_started.md @@ -0,0 +1,266 @@ +# 基础教程 + +本文档提供 MMClassification 相关用法的基本教程。 + +## 准备数据集 + +MMClassification 建议用户将数据集根目录链接到 `$MMCLASSIFICATION/data` 下。 +如果用户的文件夹结构与默认结构不同,则需要在配置文件中进行对应路径的修改。 + +``` +mmclassification +├── mmcls +├── tools +├── configs +├── docs +├── data +│ ├── imagenet +│ │ ├── meta +│ │ ├── train +│ │ ├── val +│ ├── cifar +│ │ ├── cifar-10-batches-py +│ ├── mnist +│ │ ├── train-images-idx3-ubyte +│ │ ├── train-labels-idx1-ubyte +│ │ ├── t10k-images-idx3-ubyte +│ │ ├── t10k-labels-idx1-ubyte + +``` + +对于 ImageNet,其存在多个版本,但最为常用的一个是 [ILSVRC 2012](http://www.image-net.org/challenges/LSVRC/2012/),可以通过以下步骤获取该数据集。 + +1. 注册账号并登录 [下载页面](http://www.image-net.org/download-images) +2. 获取 ILSVRC2012 下载链接并下载以下文件 + - ILSVRC2012_img_train.tar (~138GB) + - ILSVRC2012_img_val.tar (~6.3GB) +3. 解压下载的文件 +4. 使用 [该脚本](https://github.com/BVLC/caffe/blob/master/data/ilsvrc12/get_ilsvrc_aux.sh) 获取元数据 + +对于 MNIST,CIFAR10 和 CIFAR100,程序将会在需要的时候自动下载数据集。 + +对于用户自定义数据集的准备,请参阅 [教程 3:如何自定义数据集 +](tutorials/new_dataset.md) + +## 使用预训练模型进行推理 + +MMClassification 提供了一些脚本用于进行单张图像的推理、数据集的推理和数据集的测试(如 ImageNet 等) + +### 单张图像的推理 + +```shell +python demo/image_demo.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} + +# Example +python demo/image_demo.py demo/demo.JPEG configs/resnet/resnet50_8xb32_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth +``` + +### 数据集的推理与测试 + +- 支持单 GPU +- 支持 CPU +- 支持单节点多 GPU +- 支持多节点 + +用户可使用以下命令进行数据集的推理: + +```shell +# 单 GPU +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--metrics ${METRICS}] [--out ${RESULT_FILE}] + +# CPU: 禁用 GPU 并运行单 GPU 测试脚本 +export CUDA_VISIBLE_DEVICES=-1 +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--metrics ${METRICS}] [--out ${RESULT_FILE}] + +# 多 GPU +./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--metrics ${METRICS}] [--out ${RESULT_FILE}] + +# 基于 slurm 分布式环境的多节点 +python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--metrics ${METRICS}] [--out ${RESULT_FILE}] --launcher slurm +``` + +可选参数: + +- `RESULT_FILE`:输出结果的文件名。如果未指定,结果将不会保存到文件中。支持 json, yaml, pickle 格式。 +- `METRICS`:数据集测试指标,如准确率 (accuracy), 精确率 (precision), 召回率 (recall) 等 + +例子: + +在 ImageNet 验证集上,使用 ResNet-50 进行推理并获得预测标签及其对应的预测得分。 + +```shell +python tools/test.py configs/resnet/resnet50_8xb16_cifar10.py \ + https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_b16x8_cifar10_20210528-f54bfad9.pth \ + --out result.pkl +``` + +## 模型训练 + +MMClassification 使用 `MMDistributedDataParallel` 进行分布式训练,使用 `MMDataParallel` 进行非分布式训练。 + +所有的输出(日志文件和模型权重文件)会被将保存到工作目录下。工作目录通过配置文件中的参数 `work_dir` 指定。 + +默认情况下,MMClassification 在每个周期后会在验证集上评估模型,可以通过在训练配置中修改 `interval` 参数来更改评估间隔 + +```python +evaluation = dict(interval=12) # 每进行 12 轮训练后评估一次模型 +``` + +### 使用单个 GPU 进行训练 + +```shell +python tools/train.py ${CONFIG_FILE} [optional arguments] +``` + +如果用户想在命令中指定工作目录,则需要增加参数 `--work-dir ${YOUR_WORK_DIR}` + +### 使用 CPU 训练 + +使用 CPU 训练的流程和使用单 GPU 训练的流程一致,我们仅需要在训练流程开始前禁用 GPU。 + +```shell +export CUDA_VISIBLE_DEVICES=-1 +``` + +之后运行单 GPU 训练脚本即可。 + +```{warning} +我们不推荐用户使用 CPU 进行训练,这太过缓慢。我们支持这个功能是为了方便用户在没有 GPU 的机器上进行调试。 +``` + +### 使用单台机器多个 GPU 进行训练 + +```shell +./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments] +``` + +可选参数为: + +- `--no-validate` (**不建议**): 默认情况下,程序将会在训练期间的每 k (默认为 1) 个周期进行一次验证。要禁用这一功能,使用 `--no-validate` +- `--work-dir ${WORK_DIR}`:覆盖配置文件中指定的工作目录。 +- `--resume-from ${CHECKPOINT_FILE}`:从以前的模型权重文件恢复训练。 + +`resume-from` 和 `load-from` 的不同点: +`resume-from` 加载模型参数和优化器状态,并且保留检查点所在的周期数,常被用于恢复意外被中断的训练。 +`load-from` 只加载模型参数,但周期数从 0 开始计数,常被用于微调模型。 + +### 使用多台机器进行训练 + +如果您想使用由 ethernet 连接起来的多台机器, 您可以使用以下命令: + +在第一台机器上: + +```shell +NNODES=2 NODE_RANK=0 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS +``` + +在第二台机器上: + +```shell +NNODES=2 NODE_RANK=1 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS +``` + +但是,如果您不使用高速网路连接这几台机器的话,训练将会非常慢。 + +如果用户在 [slurm](https://slurm.schedmd.com/) 集群上运行 MMClassification,可使用 `slurm_train.sh` 脚本。(该脚本也支持单台机器上进行训练) + +```shell +[GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR} +``` + +用户可以在 [slurm_train.sh](https://github.com/open-mmlab/mmclassification/blob/master/tools/slurm_train.sh) 中检查所有的参数和环境变量 + +如果用户的多台机器通过 Ethernet 连接,则可以参考 pytorch [launch utility](https://pytorch.org/docs/stable/distributed.html#launch-utility)。如果用户没有高速网络,如 InfiniBand,速度将会非常慢。 + +### 使用单台机器启动多个任务 + +如果用使用单台机器启动多个任务,如在有 8 块 GPU 的单台机器上启动 2 个需要 4 块 GPU 的训练任务,则需要为每个任务指定不同端口,以避免通信冲突。 + +如果用户使用 `dist_train.sh` 脚本启动训练任务,则可以通过以下命令指定端口 + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 +CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4 +``` + +如果用户在 slurm 集群下启动多个训练任务,则需要修改配置文件中的 `dist_params` 变量,以设置不同的通信端口。 + +在 `config1.py` 中, + +```python +dist_params = dict(backend='nccl', port=29500) +``` + +在 `config2.py` 中, + +```python +dist_params = dict(backend='nccl', port=29501) +``` + +之后便可启动两个任务,分别对应 `config1.py` 和 `config2.py`。 + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} +CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} +``` + +## 实用工具 + +我们在 `tools/` 目录下提供的一些对训练和测试十分有用的工具 + +### 计算 FLOPs 和参数量(试验性的) + +我们根据 [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) 提供了一个脚本用于计算给定模型的 FLOPs 和参数量 + +```shell +python tools/analysis_tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +用户将获得如下结果: + +``` +============================== +Input shape: (3, 224, 224) +Flops: 4.12 GFLOPs +Params: 25.56 M +============================== +``` + +```{warning} +此工具仍处于试验阶段,我们不保证该数字正确无误。您最好将结果用于简单比较,但在技术报告或论文中采用该结果之前,请仔细检查。 +- FLOPs 与输入的尺寸有关,而参数量与输入尺寸无关。默认输入尺寸为 (1, 3, 224, 224) +- 一些运算不会被计入 FLOPs 的统计中,例如 GN 和自定义运算。详细信息请参考 [`mmcv.cnn.get_model_complexity_info()`](https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/utils/flops_counter.py) +``` + +### 模型发布 + +在发布模型之前,你也许会需要 + +1. 转换模型权重至 CPU 张量 +2. 删除优化器状态 +3. 计算模型权重文件的哈希值,并添加至文件名之后 + +```shell +python tools/convert_models/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME} +``` + +例如: + +```shell +python tools/convert_models/publish_model.py work_dirs/resnet50/latest.pth imagenet_resnet50.pth +``` + +最终输出的文件名将会是 `imagenet_resnet50_{date}-{hash id}.pth` + +## 详细教程 + +目前,MMClassification 提供以下几种更详细的教程: + +- [如何编写配置文件](tutorials/config.md) +- [如何微调模型](tutorials/finetune.md) +- [如何增加新数据集](tutorials/new_dataset.md) +- [如何设计数据处理流程](tutorials/data_pipeline.md) +- [如何增加新模块](tutorials/new_modules.md) +- [如何自定义优化策略](tutorials/schedule.md) +- [如何自定义运行参数](tutorials/runtime.md)。 diff --git a/docs/zh_CN/imgs/qq_group_qrcode.jpg b/docs/zh_CN/imgs/qq_group_qrcode.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c6b04f561da283ae622f4219ea9b8cabf8f301a GIT binary patch literal 71955 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�z}kBy(lpECAp?2$3?2Ce?C@=QTLjJV^{=f7xK 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 `>)#!#P|5Ci-PrOOx&3?kH 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

BleOu!O-<4iCWZ(G;i3}JnJvDT7{oZRkt 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

1*>=a5&H={)y-VSw4<4g%(qQgPf)0Dvi<^JD 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ֽUZ#?zv6#s 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 Q5e+X_`$G&2^w+8X1u%?H6#xJL literal 0 HcmV?d00001 diff --git a/docs/zh_CN/index.rst b/docs/zh_CN/index.rst new file mode 100644 index 0000000..1de4b82 --- /dev/null +++ b/docs/zh_CN/index.rst @@ -0,0 +1,99 @@ +欢迎来到 MMClassification 中文教程! +========================================== + +You can switch between Chinese and English documentation in the lower-left corner of the layout. + +您可以在页面左下角切换中英文文档。 + +.. toctree:: + :maxdepth: 1 + :caption: 开始你的第一步 + + install.md + getting_started.md + + +.. toctree:: + :maxdepth: 1 + :caption: 教程 + + tutorials/config.md + tutorials/finetune.md + tutorials/new_dataset.md + tutorials/data_pipeline.md + tutorials/new_modules.md + tutorials/schedule.md + tutorials/runtime.md + + +.. toctree:: + :maxdepth: 1 + :caption: 模型库 + :glob: + + modelzoo_statistics.md + model_zoo.md + papers/* + + +.. toctree:: + :maxdepth: 1 + :caption: 实用工具 + + tools/pytorch2onnx.md + tools/onnx2tensorrt.md + tools/pytorch2torchscript.md + tools/model_serving.md + tools/visualization.md + tools/analysis.md + tools/miscellaneous.md + + +.. toctree:: + :maxdepth: 1 + :caption: 社区 + + community/CONTRIBUTING.md + + +.. toctree:: + :caption: API 参考文档 + + mmcls.apis + mmcls.core + mmcls.models + mmcls.models.utils + mmcls.datasets + 数据转换 + 批数据增强 + mmcls.utils + + +.. toctree:: + :maxdepth: 1 + :caption: 其他说明 + + changelog.md + compatibility.md + faq.md + + +.. toctree:: + :maxdepth: 1 + :caption: 设备支持 + + device/npu.md + + +.. toctree:: + :caption: 语言切换 + + English + 简体中文 + + +索引与表格 +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/docs/zh_CN/install.md b/docs/zh_CN/install.md new file mode 100644 index 0000000..e881586 --- /dev/null +++ b/docs/zh_CN/install.md @@ -0,0 +1,210 @@ +# 依赖环境 + +在本节中,我们将演示如何准备 PyTorch 相关的依赖环境。 + +MMClassification 适用于 Linux、Windows 和 macOS。它需要 Python 3.6+、CUDA 9.2+ 和 PyTorch 1.5+。 + +```{note} +如果你对配置 PyTorch 环境已经很熟悉,并且已经完成了配置,可以直接进入[下一节](#安装)。 +否则的话,请依照以下步骤完成配置。 +``` + +**第 1 步** 从[官网](https://docs.conda.io/en/latest/miniconda.html)下载并安装 Miniconda。 + +**第 2 步** 创建一个 conda 虚拟环境并激活它。 + +```shell +conda create --name openmmlab python=3.8 -y +conda activate openmmlab +``` + +**第 3 步** 按照[官方指南](https://pytorch.org/get-started/locally/)安装 PyTorch。例如: + +在 GPU 平台: + +```shell +conda install pytorch torchvision -c pytorch +``` + +```{warning} +以上命令会自动安装最新版的 PyTorch 与对应的 cudatoolkit,请检查它们是否与你的环境匹配。 +``` + +在 CPU 平台: + +```shell +conda install pytorch torchvision cpuonly -c pytorch +``` + +# 安装 + +我们推荐用户按照我们的最佳实践来安装 MMClassification。但除此之外,如果你想根据 +你的习惯完成安装流程,也可以参见[自定义安装](#自定义安装)一节来获取更多信息。 + +## 最佳实践 + +**第 1 步** 使用 [MIM](https://github.com/open-mmlab/mim) 安装 [MMCV](https://github.com/open-mmlab/mmcv) + +```shell +pip install -U openmim +mim install mmcv-full +``` + +**第 2 步** 安装 MMClassification + +根据具体需求,我们支持两种安装模式: + +- [从源码安装(推荐)](#从源码安装):希望基于 MMClassification 框架开发自己的图像分类任务,需要添加新的功能,比如新的模型或是数据集,或者使用我们提供的各种工具。 +- [作为 Python 包安装](#作为-python-包安装):只是希望调用 MMClassification 的 API 接口,或者在自己的项目中导入 MMClassification 中的模块。 + +### 从源码安装 + +这种情况下,从源码按如下方式安装 mmcls: + +```shell +git clone https://github.com/open-mmlab/mmclassification.git +cd mmclassification +pip install -v -e . +# "-v" 表示输出更多安装相关的信息 +# "-e" 表示以可编辑形式安装,这样可以在不重新安装的情况下,让本地修改直接生效 +``` + +另外,如果你希望向 MMClassification 贡献代码,或者使用试验中的功能,请签出到 `dev` 分支。 + +```shell +git checkout dev +``` + +### 作为 Python 包安装 + +直接使用 pip 安装即可。 + +```shell +pip install mmcls +``` + +## 验证安装 + +为了验证 MMClassification 的安装是否正确,我们提供了一些示例代码来执行模型推理。 + +**第 1 步** 我们需要下载配置文件和模型权重文件 + +```shell +mim download mmcls --config resnet50_8xb32_in1k --dest . +``` + +**第 2 步** 验证示例的推理流程 + +如果你是**从源码安装**的 mmcls,那么直接运行以下命令进行验证: + +```shell +python demo/image_demo.py demo/demo.JPEG resnet50_8xb32_in1k.py resnet50_8xb32_in1k_20210831-ea4938fc.pth --device cpu +``` + +你可以看到命令行中输出了结果字典,包括 `pred_label`,`pred_score` 和 `pred_class` 三个字段。另外如果你拥有图形 +界面(而不是使用远程终端),那么可以启用 `--show` 选项,将示例图像和对应的预测结果在窗口中进行显示。 + +如果你是**作为 PyThon 包安装**,那么可以打开你的 Python 解释器,并粘贴如下代码: + +```python +from mmcls.apis import init_model, inference_model + +config_file = 'resnet50_8xb32_in1k.py' +checkpoint_file = 'resnet50_8xb32_in1k_20210831-ea4938fc.pth' +model = init_model(config_file, checkpoint_file, device='cpu') # 或者 device='cuda:0' +inference_model(model, 'demo/demo.JPEG') +``` + +你会看到输出一个字典,包含预测的标签、得分及类别名。 + +## 自定义安装 + +### CUDA 版本 + +安装 PyTorch 时,需要指定 CUDA 版本。如果您不清楚选择哪个,请遵循我们的建议: + +- 对于 Ampere 架构的 NVIDIA GPU,例如 GeForce 30 series 以及 NVIDIA A100,CUDA 11 是必需的。 +- 对于更早的 NVIDIA GPU,CUDA 11 是向前兼容的,但 CUDA 10.2 能够提供更好的兼容性,也更加轻量。 + +请确保你的 GPU 驱动版本满足最低的版本需求,参阅[这张表](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions)。 + +```{note} +如果按照我们的最佳实践进行安装,CUDA 运行时库就足够了,因为我们提供相关 CUDA 代码的预编译,你不需要进行本地编译。 +但如果你希望从源码进行 MMCV 的编译,或是进行其他 CUDA 算子的开发,那么就必须安装完整的 CUDA 工具链,参见 +[NVIDIA 官网](https://developer.nvidia.com/cuda-downloads),另外还需要确保该 CUDA 工具链的版本与 PyTorch 安装时 +的配置相匹配(如用 `conda install` 安装 PyTorch 时指定的 cudatoolkit 版本)。 +``` + +### 不使用 MIM 安装 MMCV + +MMCV 包含 C++ 和 CUDA 扩展,因此其对 PyTorch 的依赖比较复杂。MIM 会自动解析这些 +依赖,选择合适的 MMCV 预编译包,使安装更简单,但它并不是必需的。 + +要使用 pip 而不是 MIM 来安装 MMCV,请遵照 [MMCV 安装指南](https://mmcv.readthedocs.io/zh_CN/latest/get_started/installation.html)。 +它需要你用指定 url 的形式手动指定对应的 PyTorch 和 CUDA 版本。 + +举个例子,如下命令将会安装基于 PyTorch 1.10.x 和 CUDA 11.3 编译的 mmcv-full。 + +```shell +pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.10/index.html +``` + +### 在 CPU 环境中安装 + +MMClassification 可以仅在 CPU 环境中安装,在 CPU 模式下,你可以完成训练(需要 MMCV 版本 >= 1.4.4)、测试和模型推理等所有操作。 + +在 CPU 模式下,MMCV 的部分功能将不可用,通常是一些 GPU 编译的算子。不过不用担心, +MMClassification 中几乎所有的模型都不会依赖这些算子。 + +### 在 Google Colab 中安装 + +[Google Colab](https://research.google.com/) 通常已经包含了 PyTorch 环境,因此我们只需要安装 MMCV 和 MMClassification 即可,命令如下: + +**第 1 步** 使用 [MIM](https://github.com/open-mmlab/mim) 安装 [MMCV](https://github.com/open-mmlab/mmcv) + +```shell +!pip3 install openmim +!mim install mmcv-full +``` + +**第 2 步** 从源码安装 MMClassification + +```shell +!git clone https://github.com/open-mmlab/mmclassification.git +%cd mmclassification +!pip install -e . +``` + +**第 3 步** 验证 + +```python +import mmcls +print(mmcls.__version__) +# 预期输出: 0.23.0 或更新的版本号 +``` + +```{note} +在 Jupyter 中,感叹号 `!` 用于执行外部命令,而 `%cd` 是一个[魔术命令](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-cd),用于切换 Python 的工作路径。 +``` + +### 通过 Docker 使用 MMClassification + +MMClassification 提供 [Dockerfile](https://github.com/open-mmlab/mmclassification/blob/master/docker/Dockerfile) +用于构建镜像。请确保你的 [Docker 版本](https://docs.docker.com/engine/install/) >=19.03。 + +```shell +# 构建默认的 PyTorch 1.8.1,CUDA 10.2 版本镜像 +# 如果你希望使用其他版本,请修改 Dockerfile +docker build -t mmclassification docker/ +``` + +用以下命令运行 Docker 镜像: + +```shell +docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmclassification/data mmclassification +``` + +## 故障解决 + +如果你在安装过程中遇到了什么问题,请先查阅[常见问题](faq.md)。如果没有找到解决方法,可以在 GitHub +上[提出 issue](https://github.com/open-mmlab/mmclassification/issues/new/choose)。 diff --git a/docs/zh_CN/model_zoo.md b/docs/zh_CN/model_zoo.md new file mode 120000 index 0000000..013a9ac --- /dev/null +++ b/docs/zh_CN/model_zoo.md @@ -0,0 +1 @@ +../en/model_zoo.md \ No newline at end of file diff --git a/docs/zh_CN/stat.py b/docs/zh_CN/stat.py new file mode 100755 index 0000000..f6d5b3a --- /dev/null +++ b/docs/zh_CN/stat.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +import functools as func +import glob +import os +import re +from pathlib import Path + +import numpy as np + +MMCLS_ROOT = Path(__file__).absolute().parents[1] +url_prefix = 'https://github.com/open-mmlab/mmclassification/blob/master/' + +papers_root = Path('papers') +papers_root.mkdir(exist_ok=True) +files = [Path(f) for f in sorted(glob.glob('../../configs/*/README.md'))] + +stats = [] +titles = [] +num_ckpts = 0 +num_configs = 0 + +for f in files: + with open(f, 'r') as content_file: + content = content_file.read() + + # Extract checkpoints + ckpts = set(x.lower().strip() + for x in re.findall(r'\[model\]\((https?.*)\)', content)) + if len(ckpts) == 0: + continue + num_ckpts += len(ckpts) + + # Extract paper title + match_res = list(re.finditer(r'> \[(.*)\]\((.*)\)', content)) + if len(match_res) > 0: + title, paperlink = match_res[0].groups() + else: + title = content.split('\n')[0].replace('# ', '').strip() + paperlink = None + titles.append(title) + + # Replace paper link to a button + if paperlink is not None: + start = match_res[0].start() + end = match_res[0].end() + link_button = f'[{title}]({paperlink})' + content = content[:start] + link_button + content[end:] + + # Extract paper type + _papertype = [x for x in re.findall(r'\[([A-Z]+)\]', content)] + assert len(_papertype) > 0 + papertype = _papertype[0] + paper = set([(papertype, title)]) + + # Write a copy of README + copy = papers_root / (f.parent.name + '.md') + if copy.exists(): + os.remove(copy) + + def replace_link(matchobj): + # Replace relative link to GitHub link. + name = matchobj.group(1) + link = matchobj.group(2) + if not link.startswith('http') and (f.parent / link).exists(): + rel_link = (f.parent / link).absolute().relative_to(MMCLS_ROOT) + link = url_prefix + str(rel_link) + return f'[{name}]({link})' + + content = re.sub(r'\[([^\]]+)\]\(([^)]+)\)', replace_link, content) + + with open(copy, 'w') as copy_file: + copy_file.write(content) + + statsmsg = f""" +\t* [{papertype}] [{title}]({copy}) ({len(ckpts)} ckpts) +""" + stats.append(dict(paper=paper, ckpts=ckpts, statsmsg=statsmsg, copy=copy)) + +allpapers = func.reduce(lambda a, b: a.union(b), + [stat['paper'] for stat in stats]) +msglist = '\n'.join(stat['statsmsg'] for stat in stats) + +papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) +countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + +modelzoo = f""" +# 模型库统计 + +* 论文数量: {len(set(titles))} +{countstr} + +* 模型权重文件数量: {num_ckpts} +{msglist} +""" + +with open('modelzoo_statistics.md', 'w') as f: + f.write(modelzoo) diff --git a/docs/zh_CN/tools/analysis.md b/docs/zh_CN/tools/analysis.md new file mode 100644 index 0000000..840ff39 --- /dev/null +++ b/docs/zh_CN/tools/analysis.md @@ -0,0 +1,211 @@ +# 分析 + + + +- [日志分析](#日志分析) + - [绘制曲线图](#绘制曲线图) + - [统计训练时间](#统计训练时间) +- [结果分析](#结果分析) + - [评估结果](#查看典型结果) + - [查看典型结果](#查看典型结果) +- [模型复杂度分析](#模型复杂度分析) +- [常见问题](#常见问题) + + + +## 日志分析 + +### 绘制曲线图 + +指定一个训练日志文件,可通过 `tools/analysis_tools/analyze_logs.py` 脚本绘制指定键值的变化曲线 + +

+ +```shell +python tools/analysis_tools/analyze_logs.py plot_curve \ + ${JSON_LOGS} \ + [--keys ${KEYS}] \ + [--title ${TITLE}] \ + [--legend ${LEGEND}] \ + [--backend ${BACKEND}] \ + [--style ${STYLE}] \ + [--out ${OUT_FILE}] \ + [--window-size ${WINDOW_SIZE}] +``` + +所有参数的说明 + +- `json_logs` :模型配置文件的路径(可同时传入多个,使用空格分开)。 +- `--keys` :分析日志的关键字段,数量为 `len(${JSON_LOGS}) * len(${KEYS})` 默认为 'loss'。 +- `--title` :分析日志的图片名称,默认使用配置文件名, 默认为空。 +- `--legend` :图例名(可同时传入多个,使用空格分开,数目与 `${JSON_LOGS} * ${KEYS}` 数目一致)。默认使用 `"${JSON_LOG}-${KEYS}"`。 +- `--backend` :matplotlib 的绘图后端,默认由 matplotlib 自动选择。 +- `--style` :绘图配色风格,默认为 `whitegrid`。 +- `--out` :保存分析图片的路径,如不指定则不保存。 +- `--window-size`: 可视化窗口大小,如果没有指定,默认为 `12*7`。如果需要指定,需按照格式 `'W*H'`。 + +```{note} +`--style` 选项依赖于第三方库 `seaborn`,需要设置绘图风格请现安装该库。 +``` + +例如: + +- 绘制某日志文件对应的损失曲线图。 + + ```shell + python tools/analysis_tools/analyze_logs.py plot_curve your_log_json --keys loss --legend loss + ``` + +- 绘制某日志文件对应的 top-1 和 top-5 准确率曲线图,并将曲线图导出为 results.jpg 文件。 + + ```shell + python tools/analysis_tools/analyze_logs.py plot_curve your_log_json --keys accuracy_top-1 accuracy_top-5 --legend top1 top5 --out results.jpg + ``` + +- 在同一图像内绘制两份日志文件对应的 top-1 准确率曲线图。 + + ```shell + python tools/analysis_tools/analyze_logs.py plot_curve log1.json log2.json --keys accuracy_top-1 --legend run1 run2 + ``` + +```{note} +本工具会自动根据关键字段选择从日志的训练部分还是验证部分读取,因此如果你添加了 +自定义的验证指标,请把相对应的关键字段加入到本工具的 `TEST_METRICS` 变量中。 +``` + +### 统计训练时间 + +`tools/analysis_tools/analyze_logs.py` 也可以根据日志文件统计训练耗时。 + +```shell +python tools/analysis_tools/analyze_logs.py cal_train_time \ + ${JSON_LOGS} + [--include-outliers] +``` + +**所有参数的说明**: + +- `json_logs` :模型配置文件的路径(可同时传入多个,使用空格分开)。 +- `--include-outliers` :如果指定,将不会排除每个轮次中第一轮迭代的记录(有时第一轮迭代会耗时较长) + +**示例**: + +```shell +python tools/analysis_tools/analyze_logs.py cal_train_time work_dirs/some_exp/20200422_153324.log.json +``` + +预计输出结果如下所示: + +```text +-----Analyze train time of work_dirs/some_exp/20200422_153324.log.json----- +slowest epoch 68, average time is 0.3818 +fastest epoch 1, average time is 0.3694 +time std over epochs is 0.0020 +average iter time: 0.3777 s/iter +``` + +## 结果分析 + +利用 `tools/test.py` 的 `--out` 参数,我们可以将所有的样本的推理结果保存到输出 +文件中。利用这一文件,我们可以进行进一步的分析。 + +### 评估结果 + +`tools/analysis_tools/eval_metric.py` 可以用来再次计算评估结果。 + +```shell +python tools/analysis_tools/eval_metric.py \ + ${CONFIG} \ + ${RESULT} \ + [--metrics ${METRICS}] \ + [--cfg-options ${CFG_OPTIONS}] \ + [--metric-options ${METRIC_OPTIONS}] +``` + +**所有参数说明**: + +- `config` :配置文件的路径。 +- `result` : `tools/test.py` 的输出结果文件。 +- `metrics` : 评估的衡量指标,可接受的值取决于数据集类。 +- `--cfg-options`: 额外的配置选项,会被合入配置文件,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 +- `--metric-options`: 如果指定了,这些选项将被传递给数据集 `evaluate` 函数的 `metric_options` 参数。 + +```{note} +在 `tools/test.py` 中,我们支持使用 `--out-items` 选项来选择保存哪些结果。为了使用本工具,请确保结果文件中包含 "class_scores"。 +``` + +**示例**: + +```shell +python tools/analysis_tools/eval_metric.py configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py ./result.pkl --metrics accuracy --metric-options "topk=(1,5)" +``` + +### 查看典型结果 + +`tools/analysis_tools/analyze_results.py` 可以保存预测成功/失败,同时得分最高的 k 个图像。 + +```shell +python tools/analysis_tools/analyze_results.py \ + ${CONFIG} \ + ${RESULT} \ + [--out-dir ${OUT_DIR}] \ + [--topk ${TOPK}] \ + [--cfg-options ${CFG_OPTIONS}] +``` + +**所有参数说明**: + +- `config` :配置文件的路径。 +- `result` : `tools/test.py` 的输出结果文件。 +- `--out-dir` :保存结果分析的文件夹路径。 +- `--topk` :分别保存多少张预测成功/失败的图像。如果不指定,默认为 `20`。 +- `--cfg-options`: 额外的配置选项,会被合入配置文件,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 + +```{note} +在 `tools/test.py` 中,我们支持使用 `--out-items` 选项来选择保存哪些结果。为了使用本工具,请确保结果文件中包含 "pred_score"、"pred_label" 和 "pred_class"。 +``` + +**示例**: + +```shell +python tools/analysis_tools/analyze_results.py \ + configs/resnet/resnet50_xxxx.py \ + result.pkl \ + --out-dir results \ + --topk 50 +``` + +## 模型复杂度分析 + +### 计算 FLOPs 和参数量(试验性的) + +我们根据 [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) 提供了一个脚本用于计算给定模型的 FLOPs 和参数量。 + +```shell +python tools/analysis_tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +**所有参数说明**: + +- `config` :配置文件的路径。 +- `--shape`: 输入尺寸,支持单值或者双值, 如: `--shape 256`、`--shape 224 256`。默认为`224 224`。 + +用户将获得如下结果: + +```text +============================== +Input shape: (3, 224, 224) +Flops: 4.12 GFLOPs +Params: 25.56 M +============================== +``` + +```{warning} +此工具仍处于试验阶段,我们不保证该数字正确无误。您最好将结果用于简单比较,但在技术报告或论文中采用该结果之前,请仔细检查。 +- FLOPs 与输入的尺寸有关,而参数量与输入尺寸无关。默认输入尺寸为 (1, 3, 224, 224) +- 一些运算不会被计入 FLOPs 的统计中,例如 GN 和自定义运算。详细信息请参考 [`mmcv.cnn.get_model_complexity_info()`](https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/utils/flops_counter.py) +``` + +## 常见问题 + +- 无 diff --git a/docs/zh_CN/tools/miscellaneous.md b/docs/zh_CN/tools/miscellaneous.md new file mode 100644 index 0000000..a2cb625 --- /dev/null +++ b/docs/zh_CN/tools/miscellaneous.md @@ -0,0 +1,59 @@ +# 其他工具 + + + +- [打印完整配置](#打印完整配置) +- [检查数据集](#检查数据集) +- [常见问题](#常见问题) + + + +## 打印完整配置 + +`tools/misc/print_config.py` 脚本会解析所有输入变量,并打印完整配置信息。 + +```shell +python tools/misc/print_config.py ${CONFIG} [--cfg-options ${CFG_OPTIONS}] +``` + +**所有参数说明**: + +- `config` :配置文件的路径。 +- `--cfg-options`: 额外的配置选项,会被合入配置文件,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 + +**示例**: + +```shell +python tools/misc/print_config.py configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py +``` + +## 检查数据集 + +`tools/misc/verify_dataset.py` 脚本会检查数据集的所有图片,查看是否有已经损坏的图片。 + +```shell +python tools/print_config.py \ + ${CONFIG} \ + [--out-path ${OUT-PATH}] \ + [--phase ${PHASE}] \ + [--num-process ${NUM-PROCESS}] + [--cfg-options ${CFG_OPTIONS}] +``` + +**所有参数说明**: + +- `config` : 配置文件的路径。 +- `--out-path` : 输出结果路径,默认为 'brokenfiles.log'。 +- `--phase` : 检查哪个阶段的数据集,可用值为 "train" 、"test" 或者 "val", 默认为 "train"。 +- `--num-process` : 指定的进程数,默认为1。 +- `--cfg-options`: 额外的配置选项,会被合入配置文件,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 + +**示例**: + +```shell +python tools/misc/verify_dataset.py configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py --out-path broken_imgs.log --phase val --num-process 8 +``` + +## 常见问题 + +- 无 diff --git a/docs/zh_CN/tools/model_serving.md b/docs/zh_CN/tools/model_serving.md new file mode 100644 index 0000000..4eed488 --- /dev/null +++ b/docs/zh_CN/tools/model_serving.md @@ -0,0 +1,87 @@ +# 模型部署至 TorchServe + +为了使用 [`TorchServe`](https://pytorch.org/serve/) 部署一个 `MMClassification` 模型,需要进行以下几步: + +## 1. 转换 MMClassification 模型至 TorchServe + +```shell +python tools/deployment/mmcls2torchserve.py ${CONFIG_FILE} ${CHECKPOINT_FILE} \ +--output-folder ${MODEL_STORE} \ +--model-name ${MODEL_NAME} +``` + +```{note} +${MODEL_STORE} 需要是一个文件夹的绝对路径。 +``` + +示例: + +```shell +python tools/deployment/mmcls2torchserve.py \ + configs/resnet/resnet18_8xb32_in1k.py \ + checkpoints/resnet18_8xb32_in1k_20210831-fbbb1da6.pth \ + --output-folder ./checkpoints \ + --model-name resnet18_in1k +``` + +## 2. 构建 `mmcls-serve` docker 镜像 + +```shell +docker build -t mmcls-serve:latest docker/serve/ +``` + +## 3. 运行 `mmcls-serve` 镜像 + +请参考官方文档 [基于 docker 运行 TorchServe](https://github.com/pytorch/serve/blob/master/docker/README.md#running-torchserve-in-a-production-docker-environment). + +为了使镜像能够使用 GPU 资源,需要安装 [nvidia-docker](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html)。之后可以传递 `--gpus` 参数以在 GPU 上运。 + +示例: + +```shell +docker run --rm \ +--cpus 8 \ +--gpus device=0 \ +-p8080:8080 -p8081:8081 -p8082:8082 \ +--mount type=bind,source=`realpath ./checkpoints`,target=/home/model-server/model-store \ +mmcls-serve:latest +``` + +```{note} +`realpath ./checkpoints` 是 "./checkpoints" 的绝对路径,你可以将其替换为你保存 TorchServe 模型的目录的绝对路径。 +``` + +参考 [该文档](https://github.com/pytorch/serve/blob/master/docs/rest_api.md) 了解关于推理 (8080),管理 (8081) 和指标 (8082) 等 API 的信息。 + +## 4. 测试部署 + +```shell +curl http://127.0.0.1:8080/predictions/${MODEL_NAME} -T demo/demo.JPEG +``` + +您应该获得类似于以下内容的响应: + +```json +{ + "pred_label": 58, + "pred_score": 0.38102269172668457, + "pred_class": "water snake" +} +``` + +另外,你也可以使用 `test_torchserver.py` 来比较 TorchServe 和 PyTorch 的结果,并进行可视化。 + +```shell +python tools/deployment/test_torchserver.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} ${MODEL_NAME} +[--inference-addr ${INFERENCE_ADDR}] [--device ${DEVICE}] +``` + +示例: + +```shell +python tools/deployment/test_torchserver.py \ + demo/demo.JPEG \ + configs/resnet/resnet18_8xb32_in1k.py \ + checkpoints/resnet18_8xb32_in1k_20210831-fbbb1da6.pth \ + resnet18_in1k +``` diff --git a/docs/zh_CN/tools/onnx2tensorrt.md b/docs/zh_CN/tools/onnx2tensorrt.md new file mode 100644 index 0000000..f6a25fa --- /dev/null +++ b/docs/zh_CN/tools/onnx2tensorrt.md @@ -0,0 +1,75 @@ +# ONNX 转 TensorRT(试验性的) + + + +- [如何将模型从 ONNX 转换到 TensorRT](#如何将模型从-onnx-转换到-tensorrt) + - [准备工作](#准备工作) + - [使用方法](#使用方法) +- [支持转换至 TensorRT 的模型列表](#支持转换至-tensorrt-的模型列表) +- [提示](#提示) +- [常见问题](#常见问题) + + + +## 如何将模型从 ONNX 转换到 TensorRT + +### 准备工作 + +1. 请参照 [安装指南](https://mmclassification.readthedocs.io/zh_CN/latest/install.html#mmclassification) 从源码安装 MMClassification。 +2. 使用我们的工具 [pytorch2onnx.md](./pytorch2onnx.md) 将 PyTorch 模型转换至 ONNX。 + +### 使用方法 + +```bash +python tools/deployment/onnx2tensorrt.py \ + ${MODEL} \ + --trt-file ${TRT_FILE} \ + --shape ${IMAGE_SHAPE} \ + --workspace-size {WORKSPACE_SIZE} \ + --show \ + --verify \ +``` + +所有参数的说明: + +- `model` : ONNX 模型的路径。 +- `--trt-file`: TensorRT 引擎文件的输出路径。如果没有指定,默认为当前脚本执行路径下的 `tmp.trt`。 +- `--shape`: 模型输入的高度和宽度。如果没有指定,默认为 `224 224`。 +- `--workspace-size` : 构建 TensorRT 引擎所需要的 GPU 空间大小,单位为 GiB。如果没有指定,默认为 `1` GiB。 +- `--show`: 是否展示模型的输出。如果没有指定,默认为 `False`。 +- `--verify`: 是否使用 ONNXRuntime 和 TensorRT 验证模型转换的正确性。如果没有指定,默认为`False`。 + +示例: + +```bash +python tools/deployment/onnx2tensorrt.py \ + checkpoints/resnet/resnet18_b16x8_cifar10.onnx \ + --trt-file checkpoints/resnet/resnet18_b16x8_cifar10.trt \ + --shape 224 224 \ + --show \ + --verify \ +``` + +## 支持转换至 TensorRT 的模型列表 + +下表列出了保证可转换为 TensorRT 的模型。 + +| 模型 | 配置文件 | 状态 | +| :----------: | :-----------------------------------------------------: | :--: | +| MobileNetV2 | `configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py` | Y | +| ResNet | `configs/resnet/resnet18_8xb16_cifar10.py` | Y | +| ResNeXt | `configs/resnext/resnext50-32x4d_8xb32_in1k.py` | Y | +| ShuffleNetV1 | `configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py` | Y | +| ShuffleNetV2 | `configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py` | Y | + +注: + +- *以上所有模型转换测试基于 Pytorch==1.6.0 和 TensorRT-7.2.1.6.Ubuntu-16.04.x86_64-gnu.cuda-10.2.cudnn8.0 进行* + +## 提示 + +- 如果你在上述模型的转换中遇到问题,请在 GitHub 中创建一个 issue,我们会尽快处理。未在上表中列出的模型,由于资源限制,我们可能无法提供很多帮助,如果遇到问题,请尝试自行解决。 + +## 常见问题 + +- 无 diff --git a/docs/zh_CN/tools/pytorch2onnx.md b/docs/zh_CN/tools/pytorch2onnx.md new file mode 100644 index 0000000..c66991a --- /dev/null +++ b/docs/zh_CN/tools/pytorch2onnx.md @@ -0,0 +1,88 @@ +# Pytorch 转 ONNX (试验性的) + + + +- [如何将模型从 PyTorch 转换到 ONNX](#如何将模型从-pytorch-转换到-onnx) + - [准备工作](#准备工作) + - [使用方法](#使用方法) +- [支持导出至 ONNX 的模型列表](#支持导出至-onnx-的模型列表) +- [提示](#提示) +- [常见问题](#常见问题) + + + +## 如何将模型从 PyTorch 转换到 ONNX + +### 准备工作 + +1. 请参照 [安装指南](https://mmclassification.readthedocs.io/zh_CN/latest/install.html#mmclassification) 从源码安装 MMClassification。 +2. 安装 onnx 和 onnxruntime。 + +```shell +pip install onnx onnxruntime==1.5.1 +``` + +### 使用方法 + +```bash +python tools/deployment/pytorch2onnx.py \ + ${CONFIG_FILE} \ + --checkpoint ${CHECKPOINT_FILE} \ + --output-file ${OUTPUT_FILE} \ + --shape ${IMAGE_SHAPE} \ + --opset-version ${OPSET_VERSION} \ + --dynamic-shape \ + --show \ + --simplify \ + --verify \ +``` + +所有参数的说明: + +- `config` : 模型配置文件的路径。 +- `--checkpoint` : 模型权重文件的路径。 +- `--output-file`: ONNX 模型的输出路径。如果没有指定,默认为当前脚本执行路径下的 `tmp.onnx`。 +- `--shape`: 模型输入的高度和宽度。如果没有指定,默认为 `224 224`。 +- `--opset-version` : ONNX 的 opset 版本。如果没有指定,默认为 `11`。 +- `--dynamic-shape` : 是否以动态输入尺寸导出 ONNX。 如果没有指定,默认为 `False`。 +- `--show`: 是否打印导出模型的架构。如果没有指定,默认为 `False`。 +- `--simplify`: 是否精简导出的 ONNX 模型。如果没有指定,默认为 `False`。 +- `--verify`: 是否验证导出模型的正确性。如果没有指定,默认为`False`。 + +示例: + +```bash +python tools/deployment/pytorch2onnx.py \ + configs/resnet/resnet18_8xb16_cifar10.py \ + --checkpoint checkpoints/resnet/resnet18_b16x8_cifar10.pth \ + --output-file checkpoints/resnet/resnet18_b16x8_cifar10.onnx \ + --dynamic-shape \ + --show \ + --simplify \ + --verify \ +``` + +## 支持导出至 ONNX 的模型列表 + +下表列出了保证可导出至 ONNX,并在 ONNX Runtime 中运行的模型。 + +| 模型 | 配置文件 | 批推理 | 动态输入尺寸 | 备注 | +| :----------: | :-----------------------------------------------------: | :----: | :----------: | ---- | +| MobileNetV2 | `configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py` | Y | Y | | +| ResNet | `configs/resnet/resnet18_8xb16_cifar10.py` | Y | Y | | +| ResNeXt | `configs/resnext/resnext50-32x4d_8xb32_in1k.py` | Y | Y | | +| SE-ResNet | `configs/seresnet/seresnet50_8xb32_in1k.py` | Y | Y | | +| ShuffleNetV1 | `configs/shufflenet_v1/shufflenet-v1-1x_16xb64_in1k.py` | Y | Y | | +| ShuffleNetV2 | `configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py` | Y | Y | | + +注: + +- *以上所有模型转换测试基于 Pytorch==1.6.0 进行* + +## 提示 + +- 如果你在上述模型的转换中遇到问题,请在 GitHub 中创建一个 issue,我们会尽快处理。未在上表中列出的模型,由于资源限制,我们可能无法提供很多帮助,如果遇到问题,请尝试自行解决。 + +## 常见问题 + +- 无 diff --git a/docs/zh_CN/tools/pytorch2torchscript.md b/docs/zh_CN/tools/pytorch2torchscript.md new file mode 100644 index 0000000..9ef846f --- /dev/null +++ b/docs/zh_CN/tools/pytorch2torchscript.md @@ -0,0 +1,54 @@ +# Pytorch 转 TorchScript (试验性的) + + + +- [如何将 PyTorch 模型转换至 TorchScript](#如何将-pytorch-模型转换至-torchscript) + - [使用方法](#使用方法) +- [提示](#提示) +- [常见问题](#常见问题) + + + +## 如何将 PyTorch 模型转换至 TorchScript + +### 使用方法 + +```bash +python tools/deployment/pytorch2torchscript.py \ + ${CONFIG_FILE} \ + --checkpoint ${CHECKPOINT_FILE} \ + --output-file ${OUTPUT_FILE} \ + --shape ${IMAGE_SHAPE} \ + --verify \ +``` + +所有参数的说明: + +- `config` : 模型配置文件的路径。 +- `--checkpoint` : 模型权重文件的路径。 +- `--output-file`: TorchScript 模型的输出路径。如果没有指定,默认为当前脚本执行路径下的 `tmp.pt`。 +- `--shape`: 模型输入的高度和宽度。如果没有指定,默认为 `224 224`。 +- `--verify`: 是否验证导出模型的正确性。如果没有指定,默认为`False`。 + +示例: + +```bash +python tools/deployment/pytorch2torchscript.py \ + configs/resnet/resnet18_8xb16_cifar10.py \ + --checkpoint checkpoints/resnet/resnet18_b16x8_cifar10.pth \ + --output-file checkpoints/resnet/resnet18_b16x8_cifar10.pt \ + --verify \ +``` + +注: + +- *所有模型基于 Pytorch==1.8.1 通过了转换测试* + +## 提示 + +- 由于 `torch.jit.is_tracing()` 只在 PyTorch 1.6 之后的版本中得到支持,对于 PyTorch 1.3-1.5 的用户,我们建议手动提前返回结果。 +- 如果你在本仓库的模型转换中遇到问题,请在 GitHub 中创建一个 issue,我们会尽快处理。 + +## 常见问题 + +- 无 diff --git a/docs/zh_CN/tools/visualization.md b/docs/zh_CN/tools/visualization.md new file mode 100644 index 0000000..75d8142 --- /dev/null +++ b/docs/zh_CN/tools/visualization.md @@ -0,0 +1,302 @@ +# 可视化 + + + +- [数据流水线可视化](#数据流水线可视化) +- [学习率策略可视化](#学习率策略可视化) +- [类别激活图可视化](#类别激活图可视化) +- [常见问题](#常见问题) + + + +## 数据流水线可视化 + +```bash +python tools/visualizations/vis_pipeline.py \ + ${CONFIG_FILE} \ + [--output-dir ${OUTPUT_DIR}] \ + [--phase ${DATASET_PHASE}] \ + [--number ${BUNBER_IMAGES_DISPLAY}] \ + [--skip-type ${SKIP_TRANSFORM_TYPE}] \ + [--mode ${DISPLAY_MODE}] \ + [--show] \ + [--adaptive] \ + [--min-edge-length ${MIN_EDGE_LENGTH}] \ + [--max-edge-length ${MAX_EDGE_LENGTH}] \ + [--bgr2rgb] \ + [--window-size ${WINDOW_SIZE}] \ + [--cfg-options ${CFG_OPTIONS}] +``` + +**所有参数的说明**: + +- `config` : 模型配置文件的路径。 +- `--output-dir`: 保存图片文件夹,如果没有指定,默认为 `''`,表示不保存。 +- `--phase`: 可视化数据集的阶段,只能为 `[train, val, test]` 之一,默认为 `train`。 +- `--number`: 可视化样本数量。如果没有指定,默认展示数据集的所有图片。 +- `--skip-type`: 预设跳过的数据流水线过程。如果没有指定,默认为 `['ToTensor', 'Normalize', 'ImageToTensor', 'Collect']`。 +- `--mode`: 可视化的模式,只能为 `[original, transformed, concat, pipeline]` 之一,如果没有指定,默认为 `concat`。 +- `--show`: 将可视化图片以弹窗形式展示。 +- `--adaptive`: 自动调节可视化图片的大小。 +- `--min-edge-length`: 最短边长度,当使用了 `--adaptive` 时有效。 当图片任意边小于 `${MIN_EDGE_LENGTH}` 时,会保持长宽比不变放大图片,短边对齐至 `${MIN_EDGE_LENGTH}`,默认为200。 +- `--max-edge-length`: 最长边长度,当使用了 `--adaptive` 时有效。 当图片任意边大于 `${MAX_EDGE_LENGTH}` 时,会保持长宽比不变缩小图片,短边对齐至 `${MAX_EDGE_LENGTH}`,默认为1000。 +- `--bgr2rgb`: 将图片的颜色通道翻转。 +- `--window-size`: 可视化窗口大小,如果没有指定,默认为 `12*7`。如果需要指定,按照格式 `'W*H'`。 +- `--cfg-options` : 对配置文件的修改,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 + +```{note} + +1. 如果不指定 `--mode`,默认设置为 `concat`,获取原始图片和预处理后图片拼接的图片;如果 `--mode` 设置为 `original`,则获取原始图片;如果 `--mode` 设置为 `transformed`,则获取预处理后的图片;如果 `--mode` 设置为 `pipeline`,则获得数据流水线所有中间过程图片。 + +2. 当指定了 `--adaptive` 选项时,会自动的调整尺寸过大和过小的图片,你可以通过设定 `--min-edge-length` 与 `--max-edge-length` 来指定自动调整的图片尺寸。 +``` + +**示例**: + +1. **'original'** 模式,可视化 `CIFAR100` 验证集中的100张原始图片,显示并保存在 `./tmp` 文件夹下: + +```shell +python ./tools/visualizations/vis_pipeline.py configs/resnet/resnet50_8xb16_cifar100.py --phase val --output-dir tmp --mode original --number 100 --show --adaptive --bgr2rgb +``` + +
+ +2. **'transformed'** 模式,可视化 `ImageNet` 训练集的所有经过预处理的图片,并以弹窗形式显示: + +```shell +python ./tools/visualizations/vis_pipeline.py ./configs/resnet/resnet50_8xb32_in1k.py --show --mode transformed +``` + +
+ +3. **'concat'** 模式,可视化 `ImageNet` 训练集的10张原始图片与预处理后图片对比图,保存在 `./tmp` 文件夹下: + +```shell +python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --output-dir tmp --number 10 --adaptive +``` + +
+ +4. **'pipeline'** 模式,可视化 `ImageNet` 训练集经过数据流水线的过程图像: + +```shell +python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --adaptive --mode pipeline --show +``` + +
+ +## 学习率策略可视化 + +```bash +python tools/visualizations/vis_lr.py \ + ${CONFIG_FILE} \ + [--dataset-size ${Dataset_Size}] \ + [--ngpus ${NUM_GPUs}] \ + [--save-path ${SAVE_PATH}] \ + [--title ${TITLE}] \ + [--style ${STYLE}] \ + [--window-size ${WINDOW_SIZE}] \ + [--cfg-options ${CFG_OPTIONS}] \ +``` + +**所有参数的说明**: + +- `config` : 模型配置文件的路径。 +- `--dataset-size` : 数据集的大小。如果指定,`build_dataset` 将被跳过并使用这个大小作为数据集大小,默认使用 `build_dataset` 所得数据集的大小。 +- `--ngpus` : 使用 GPU 的数量。 +- `--save-path` : 保存的可视化图片的路径,默认不保存。 +- `--title` : 可视化图片的标题,默认为配置文件名。 +- `--style` : 可视化图片的风格,默认为 `whitegrid`。 +- `--window-size`: 可视化窗口大小,如果没有指定,默认为 `12*7`。如果需要指定,按照格式 `'W*H'`。 +- `--cfg-options` : 对配置文件的修改,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 + +```{note} + +部分数据集在解析标注阶段比较耗时,可直接将 `dataset-size` 指定数据集的大小,以节约时间。 + +``` + +**示例**: + +```bash +python tools/visualizations/vis_lr.py configs/resnet/resnet50_b16x8_cifar100.py +``` + +
+ +当数据集为 ImageNet 时,通过直接指定数据集大小来节约时间,并保存图片: + +```bash +python tools/visualizations/vis_lr.py configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py --dataset-size 1281167 --ngpus 4 --save-path ./repvgg-B3g4_4xb64-lr.jpg +``` + +
+ +## 类别激活图可视化 + +MMClassification 提供 `tools\visualizations\vis_cam.py` 工具来可视化类别激活图。请使用 `pip install "grad-cam>=1.3.6"` 安装依赖的 [pytorch-grad-cam](https://github.com/jacobgil/pytorch-grad-cam)。 + +目前支持的方法有: + +| Method | What it does | +| :----------: | :-----------------------------------------------------------------------------------------------: | +| GradCAM | 使用平均梯度对 2D 激活进行加权 | +| GradCAM++ | 类似 GradCAM,但使用了二阶梯度 | +| XGradCAM | 类似 GradCAM,但通过归一化的激活对梯度进行了加权 | +| EigenCAM | 使用 2D 激活的第一主成分(无法区分类别,但效果似乎不错) | +| EigenGradCAM | 类似 EigenCAM,但支持类别区分,使用了激活 * 梯度的第一主成分,看起来和 GradCAM 差不多,但是更干净 | +| LayerCAM | 使用正梯度对激活进行空间加权,对于浅层有更好的效果 | + +**命令行**: + +```bash +python tools/visualizations/vis_cam.py \ + ${IMG} \ + ${CONFIG_FILE} \ + ${CHECKPOINT} \ + [--target-layers ${TARGET-LAYERS}] \ + [--preview-model] \ + [--method ${METHOD}] \ + [--target-category ${TARGET-CATEGORY}] \ + [--save-path ${SAVE_PATH}] \ + [--vit-like] \ + [--num-extra-tokens ${NUM-EXTRA-TOKENS}] + [--aug_smooth] \ + [--eigen_smooth] \ + [--device ${DEVICE}] \ + [--cfg-options ${CFG-OPTIONS}] +``` + +**所有参数的说明**: + +- `img`:目标图片路径。 +- `config`:模型配置文件的路径。 +- `checkpoint`:权重路径。 +- `--target-layers`:所查看的网络层名称,可输入一个或者多个网络层, 如果不设置,将使用最后一个`block`中的`norm`层。 +- `--preview-model`:是否查看模型所有网络层。 +- `--method`:类别激活图图可视化的方法,目前支持 `GradCAM`, `GradCAM++`, `XGradCAM`, `EigenCAM`, `EigenGradCAM`, `LayerCAM`,不区分大小写。如果不设置,默认为 `GradCAM`。 +- `--target-category`:查看的目标类别,如果不设置,使用模型检测出来的类别做为目标类别。 +- `--save-path`:保存的可视化图片的路径,默认不保存。 +- `--eigen-smooth`:是否使用主成分降低噪音,默认不开启。 +- `--vit-like`: 是否为 `ViT` 类似的 Transformer-based 网络 +- `--num-extra-tokens`: `ViT` 类网络的额外的 tokens 通道数,默认使用主干网络的 `num_extra_tokens`。 +- `--aug-smooth`:是否使用测试时增强 +- `--device`:使用的计算设备,如果不设置,默认为'cpu'。 +- `--cfg-options`:对配置文件的修改,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 + +```{note} +在指定 `--target-layers` 时,如果不知道模型有哪些网络层,可使用命令行添加 `--preview-model` 查看所有网络层名称; +``` + +**示例(CNN)**: + +`--target-layers` 在 `Resnet-50` 中的一些示例如下: + +- `'backbone.layer4'`,表示第四个 `ResLayer` 层的输出。 +- `'backbone.layer4.2'` 表示第四个 `ResLayer` 层中第三个 `BottleNeck` 块的输出。 +- `'backbone.layer4.2.conv1'` 表示上述 `BottleNeck` 块中 `conv1` 层的输出。 + +```{note} +对于 `ModuleList` 或者 `Sequential` 类型的网络层,可以直接使用索引的方式指定子模块。比如 `backbone.layer4[-1]` 和 `backbone.layer4.2` 是相同的,因为 `layer4` 是一个拥有三个子模块的 `Sequential`。 +``` + +1. 使用不同方法可视化 `ResNet50`,默认 `target-category` 为模型检测的结果,使用默认推导的 `target-layers`。 + + ```shell + python tools/visualizations/vis_cam.py \ + demo/bird.JPEG \ + configs/resnet/resnet50_8xb32_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_batch256_imagenet_20200708-cfb998bf.pth \ + --method GradCAM + # GradCAM++, XGradCAM, EigenCAM, EigenGradCAM, LayerCAM + ``` + + | Image | GradCAM | GradCAM++ | EigenGradCAM | LayerCAM | + | ------------------------------------ | --------------------------------------- | ----------------------------------------- | -------------------------------------------- | ---------------------------------------- | + |
|
|
|
|
| + +2. 同一张图不同类别的激活图效果图,在 `ImageNet` 数据集中,类别238为 'Greater Swiss Mountain dog',类别281为 'tabby, tabby cat'。 + + ```shell + python tools/visualizations/vis_cam.py \ + demo/cat-dog.png configs/resnet/resnet50_8xb32_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_batch256_imagenet_20200708-cfb998bf.pth \ + --target-layers 'backbone.layer4.2' \ + --method GradCAM \ + --target-category 238 + # --target-category 281 + ``` + + | Category | Image | GradCAM | XGradCAM | LayerCAM | + | -------- | ---------------------------------------------- | ------------------------------------------------ | ------------------------------------------------- | ------------------------------------------------- | + | Dog |
|
|
|
| + | Cat |
|
|
|
| + +3. 使用 `--eigen-smooth` 以及 `--aug-smooth` 获取更好的可视化效果。 + + ```shell + python tools/visualizations/vis_cam.py \ + demo/dog.jpg \ + configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_large-3ea3c186.pth \ + --target-layers 'backbone.layer16' \ + --method LayerCAM \ + --eigen-smooth --aug-smooth + ``` + + | Image | LayerCAM | eigen-smooth | aug-smooth | eigen&aug | + | ------------------------------------ | --------------------------------------- | ------------------------------------------- | ----------------------------------------- | ----------------------------------------- | + |
|
|
|
|
| + +**示例(Transformer)**: + +`--target-layers` 在 Transformer-based 网络中的一些示例如下: + +- Swin-Transformer 中:`'backbone.norm3'` +- ViT 中:`'backbone.layers[-1].ln1'` + +对于 Transformer-based 的网络,比如 ViT、T2T-ViT 和 Swin-Transformer,特征是被展平的。为了绘制 CAM 图,我们需要指定 `--vit-like` 选项,从而让被展平的特征恢复方形的特征图。 + +除了特征被展平之外,一些类 ViT 的网络还会添加额外的 tokens。比如 ViT 和 T2T-ViT 中添加了分类 token,DeiT 中还添加了蒸馏 token。在这些网络中,分类计算在最后一个注意力模块之后就已经完成了,分类得分也只和这些额外的 tokens 有关,与特征图无关,也就是说,分类得分对这些特征图的导数为 0。因此,我们不能使用最后一个注意力模块的输出作为 CAM 绘制的目标层。 + +另外,为了去除这些额外的 toekns 以获得特征图,我们需要知道这些额外 tokens 的数量。MMClassification 中几乎所有 Transformer-based 的网络都拥有 `num_extra_tokens` 属性。而如果你希望将此工具应用于新的,或者第三方的网络,而且该网络没有指定 `num_extra_tokens` 属性,那么可以使用 `--num-extra-tokens` 参数手动指定其数量。 + +1. 对 `Swin Transformer` 使用默认 `target-layers` 进行 CAM 可视化: + + ```shell + python tools/visualizations/vis_cam.py \ + demo/bird.JPEG \ + configs/swin_transformer/swin-tiny_16xb64_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_tiny_224_b16x64_300e_imagenet_20210616_090925-66df6be6.pth \ + --vit-like + ``` + +2. 对 `Vision Transformer(ViT)` 进行 CAM 可视化: + + ```shell + python tools/visualizations/vis_cam.py \ + demo/bird.JPEG \ + configs/vision_transformer/vit-base-p16_ft-64xb64_in1k-384.py \ + https://download.openmmlab.com/mmclassification/v0/vit/finetune/vit-base-p16_in21k-pre-3rdparty_ft-64xb64_in1k-384_20210928-98e8652b.pth \ + --vit-like \ + --target-layers 'backbone.layers[-1].ln1' + ``` + +3. 对 `T2T-ViT` 进行 CAM 可视化: + + ```shell + python tools/visualizations/vis_cam.py \ + demo/bird.JPEG \ + configs/t2t_vit/t2t-vit-t-14_8xb64_in1k.py \ + https://download.openmmlab.com/mmclassification/v0/t2t-vit/t2t-vit-t-14_3rdparty_8xb64_in1k_20210928-b7c09b62.pth \ + --vit-like \ + --target-layers 'backbone.encoder[-1].ln1' + ``` + +| Image | ResNet50 | ViT | Swin | T2T-ViT | +| --------------------------------------- | ------------------------------------------ | -------------------------------------- | --------------------------------------- | ------------------------------------------ | +|
|
|
|
|
| + +## 常见问题 + +- 无 diff --git a/docs/zh_CN/tutorials/MMClassification_python_cn.ipynb b/docs/zh_CN/tutorials/MMClassification_python_cn.ipynb new file mode 100755 index 0000000..b81bf87 --- /dev/null +++ b/docs/zh_CN/tutorials/MMClassification_python_cn.ipynb @@ -0,0 +1,2041 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "XjQxmm04iTx4" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UdMfIsMpiODD" + }, + "source": [ + "# MMClassification Python API 教程\n", + "\n", + "在本教程中会介绍如下内容:\n", + "\n", + "* 如何安装 MMClassification\n", + "* 使用 Python API 进行模型推理\n", + "* 使用 Python API 进行模型微调" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iOl0X9UEiRvE" + }, + "source": [ + "## 安装 MMClassification\n", + "\n", + "在使用 MMClassification 之前,我们需要配置环境,步骤如下:\n", + "\n", + "- 安装 Python, CUDA, C/C++ compiler 和 git\n", + "- 安装 PyTorch (CUDA 版)\n", + "- 安装 mmcv\n", + "- 克隆 mmcls github 代码库然后安装\n", + "\n", + "因为我们在 Google Colab 进行实验,Colab 已经帮我们完成了基本的配置,我们可以直接跳过前面两个步骤 。" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_i7cjqS_LtoP" + }, + "source": [ + "### 检查环境" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "c6MbAw10iUJI", + "outputId": "dd37cdf5-7bcf-4a03-f5b5-4b17c3ca16de" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/content\n" + ] + } + ], + "source": [ + "%cd /content" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4IyFL3MaiYRu", + "outputId": "5008efdf-0356-4d93-ba9d-e51787036213" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/content\n" + ] + } + ], + "source": [ + "!pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DMw7QwvpiiUO", + "outputId": "33fa5eb8-d083-4a1f-d094-ab0f59e2818e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nvcc: NVIDIA (R) Cuda compiler driver\n", + "Copyright (c) 2005-2020 NVIDIA Corporation\n", + "Built on Mon_Oct_12_20:09:46_PDT_2020\n", + "Cuda compilation tools, release 11.1, V11.1.105\n", + "Build cuda_11.1.TC455_06.29190527_0\n" + ] + } + ], + "source": [ + "# 检查 nvcc 版本\n", + "!nvcc -V" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4VIBU7Fain4D", + "outputId": "ec20652d-ca24-4b82-b407-e90354d728f8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "Copyright (C) 2017 Free Software Foundation, Inc.\n", + "This is free software; see the source for copying conditions. There is NO\n", + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", + "\n" + ] + } + ], + "source": [ + "# 检查 GCC 版本\n", + "!gcc --version" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "24lDLCqFisZ9", + "outputId": "30ec9a1c-cdb3-436c-cdc8-f2a22afe254f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.9.0+cu111\n", + "True\n" + ] + } + ], + "source": [ + "# 检查 PyTorch 的安装情况\n", + "import torch, torchvision\n", + "print(torch.__version__)\n", + "print(torch.cuda.is_available())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "R2aZNLUwizBs" + }, + "source": [ + "### 安装 MMCV\n", + "\n", + "MMCV 是 OpenMMLab 代码库的基础库。Linux 环境的安装 whl 包已经提前打包好,大家可以直接下载安装。\n", + "\n", + "需要注意 PyTorch 和 CUDA 版本,确保能够正常安装。\n", + "\n", + "在前面的步骤中,我们输出了环境中 CUDA 和 PyTorch 的版本,分别是 11.1 和 1.9.0,我们需要选择相应的 MMCV 版本。\n", + "\n", + "另外,也可以安装完整版的 MMCV-full,它包含所有的特性以及丰富的开箱即用的 CUDA 算子。需要注意的是完整版本可能需要更长时间来编译。" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nla40LrLi7oo", + "outputId": "162bf14d-0d3e-4540-e85e-a46084a786b1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in links: https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "Collecting mmcv\n", + " Downloading mmcv-1.3.15.tar.gz (352 kB)\n", + "\u001b[K |████████████████████████████████| 352 kB 5.2 MB/s \n", + "\u001b[?25hCollecting addict\n", + " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv) (1.19.5)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcv) (21.0)\n", + "Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv) (7.1.2)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv) (3.13)\n", + "Collecting yapf\n", + " Downloading yapf-0.31.0-py2.py3-none-any.whl (185 kB)\n", + "\u001b[K |████████████████████████████████| 185 kB 49.9 MB/s \n", + "\u001b[?25hRequirement already satisfied: pyparsing>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->mmcv) (2.4.7)\n", + "Building wheels for collected packages: mmcv\n", + " Building wheel for mmcv (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for mmcv: filename=mmcv-1.3.15-py2.py3-none-any.whl size=509835 sha256=793fe3796421336ca7a7740a1397a54016ba71ce95fd80cb80a116644adb4070\n", + " Stored in directory: /root/.cache/pip/wheels/b2/f4/4e/8f6d2dd2bef6b7eb8c89aa0e5d61acd7bff60aaf3d4d4b29b0\n", + "Successfully built mmcv\n", + "Installing collected packages: yapf, addict, mmcv\n", + "Successfully installed addict-2.4.0 mmcv-1.3.15 yapf-0.31.0\n" + ] + } + ], + "source": [ + "# 安装 mmcv\n", + "!pip install mmcv -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "# !pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.9.0/index.html" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GDTUrYvXjlRb" + }, + "source": [ + "### 克隆并安装 MMClassification\n", + "\n", + "接着,我们从 github 上克隆下 mmcls 最新代码库并进行安装。" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Bwme6tWHjl5s", + "outputId": "eae20624-4695-4cd9-c3e5-9c59596d150a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cloning into 'mmclassification'...\n", + "remote: Enumerating objects: 4152, done.\u001b[K\n", + "remote: Counting objects: 100% (994/994), done.\u001b[K\n", + "remote: Compressing objects: 100% (576/576), done.\u001b[K\n", + "remote: Total 4152 (delta 476), reused 765 (delta 401), pack-reused 3158\u001b[K\n", + "Receiving objects: 100% (4152/4152), 8.20 MiB | 21.00 MiB/s, done.\n", + "Resolving deltas: 100% (2524/2524), done.\n" + ] + } + ], + "source": [ + "# 下载 mmcls 代码库\n", + "!git clone https://github.com/open-mmlab/mmclassification.git\n", + "%cd mmclassification/\n", + "\n", + "# 从源码安装 MMClassification\n", + "!pip install -e . " + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hFg_oSG4j3zB", + "outputId": "05a91f9b-d41c-4ae7-d4fe-c30a30d3f639" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.16.0\n" + ] + } + ], + "source": [ + "# 检查 MMClassification 的安装情况\n", + "import mmcls\n", + "print(mmcls.__version__)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4Mi3g6yzj96L" + }, + "source": [ + "## 使用 Python API 进行模型推理\n", + "\n", + "MMClassification 提供很多预训练好的模型,可以访问链接查看[模型库](https://mmclassification.readthedocs.io/zh_CN/latest/model_zoo.html)。\n", + "绝大部分模型都能够复现原始论文的精度,或者达到更高的精度。\n", + "我们能够直接使用这些模型进行推理计算。\n", + "\n", + "在使用预训练模型之前,我们需要进行如下操作:\n", + "\n", + "- 准备模型\n", + " - 准备 config 配置文件 \n", + " - 准备模型权重参数文件\n", + "- 构建模型\n", + "- 进行推理计算" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nDQchz8CkJaT", + "outputId": "9805bd7d-cc2a-4269-b43d-257412f1df93" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2021-10-21 03:52:36-- https://www.dropbox.com/s/k5fsqi6qha09l1v/banana.png?dl=0\n", + "Resolving www.dropbox.com (www.dropbox.com)... 162.125.3.18, 2620:100:601b:18::a27d:812\n", + "Connecting to www.dropbox.com (www.dropbox.com)|162.125.3.18|:443... connected.\n", + "HTTP request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/raw/k5fsqi6qha09l1v/banana.png [following]\n", + "--2021-10-21 03:52:36-- https://www.dropbox.com/s/raw/k5fsqi6qha09l1v/banana.png\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com/cd/0/inline/BYYklQk6LNPXNm7o5xE_fxE2GA9reePyNajQgoe9roPlSrtsJd4WN6RVww7zrtNZWFq8iZv349MNQJlm7vVaqRBxTcd0ufxkqbcJYJvOrORpxOPV7mHmhMjKYUncez8YNqELGwDd-aeZqLGKBC8spSnx/file# [following]\n", + "--2021-10-21 03:52:36-- https://uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com/cd/0/inline/BYYklQk6LNPXNm7o5xE_fxE2GA9reePyNajQgoe9roPlSrtsJd4WN6RVww7zrtNZWFq8iZv349MNQJlm7vVaqRBxTcd0ufxkqbcJYJvOrORpxOPV7mHmhMjKYUncez8YNqELGwDd-aeZqLGKBC8spSnx/file\n", + "Resolving uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com (uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com)... 162.125.3.15, 2620:100:601b:15::a27d:80f\n", + "Connecting to uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com (uc10f85c3c33c4b5233bac4d074e.dl.dropboxusercontent.com)|162.125.3.15|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 297299 (290K) [image/png]\n", + "Saving to: ‘demo/banana.png’\n", + "\n", + "demo/banana.png 100%[===================>] 290.33K --.-KB/s in 0.08s \n", + "\n", + "2021-10-21 03:52:36 (3.47 MB/s) - ‘demo/banana.png’ saved [297299/297299]\n", + "\n" + ] + } + ], + "source": [ + "# 获取示例图片\n", + "!wget https://www.dropbox.com/s/k5fsqi6qha09l1v/banana.png?dl=0 -O demo/banana.png" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 420 + }, + "id": "o2eiitWnkQq_", + "outputId": "192b3ebb-202b-4d6e-e178-561223024318" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from PIL import Image\n", + "Image.open('demo/banana.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sRfAui8EkTDX" + }, + "source": [ + "### 准备配置文件和模型权重文件\n", + "\n", + "预训练模型通过配置文件和模型权重文件来定义。配置文件定义了模型结构,模型权重文件保存了训练好的模型参数。\n", + "\n", + "在 GitHub 上 MMClassification 通过不同的页面来提供预训练模型。\n", + "比如, MobileNetV2 的配置文件和模型权重文件就在这个[链接](https://github.com/open-mmlab/mmclassification/tree/master/configs/mobilenet_v2)下。\n", + "\n", + "我们在 MMClassification 库中已经内置了大量模型训练所需要的配置文件,可以直接读取。而模型权重文件则需要下载,方便的是,我们的 API 提供了读取模型权重 url 的功能,因此可以直接以 url 的方式指定模型权重文件。" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VvRoZpBGkgpC", + "outputId": "68282782-015e-4f5c-cef2-79be3bf6a9b7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py\n" + ] + } + ], + "source": [ + "# 检查确保配置文件存在\n", + "!ls configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py\n", + "\n", + "# 指明配置文件和权重参数文件的路径\n", + "# 其中,权重参数文件的路径可以是一个 url,会在加载权重时自动下载。\n", + "config_file = 'configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py'\n", + "checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eiYdsHoIkpD1" + }, + "source": [ + "### 进行模型推理\n", + "\n", + "MMClassification 提供了 high level 的 Python API 用来进行推理计算. \n", + "\n", + "首先,我们构建模型。" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 323, + "referenced_widgets": [ + "badf240bbb7d442fbd214e837edbffe2", + "520112917e0f4844995d418c5041d23a", + "9f3f6b72b4d14e2a96b9185331c8081b", + "a275bef3584b49ab9b680b528420d461", + "c4b2c6914a05497b8d2b691bd6dda6da", + "863d2a8cc4074f2e890ba6aea7c54384", + "be55ab36267d4dcab1d83dfaa8540270", + "31475aa888da4c8d844ba99a0b3397f5", + "e310c50e610248dd897fbbf5dd09dd7a", + "8a8ab7c27e404459951cffe7a32b8faa", + "e1a3dce90c1a4804a9ef0c687a9c0703" + ] + }, + "id": "KwJWlR2QkpiV", + "outputId": "982b365e-d3be-4e3d-dee7-c507a8020292" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/mmcv/cnn/bricks/transformer.py:28: UserWarning: Fail to import ``MultiScaleDeformableAttention`` from ``mmcv.ops.multi_scale_deform_attn``, You should install ``mmcv-full`` if you need this module. \n", + " warnings.warn('Fail to import ``MultiScaleDeformableAttention`` from '\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/local/lib/python3.7/dist-packages/yaml/constructor.py:126: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", + " if not isinstance(key, collections.Hashable):\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Use load_from_http loader\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: \"https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\" to /root/.cache/torch/hub/checkpoints/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "badf240bbb7d442fbd214e837edbffe2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/13.5M [00:00" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "# 可视化分类结果\n", + "show_result_pyplot(model, img, result)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oDMr3Bx_lESy" + }, + "source": [ + "## 使用 Python API 进行模型微调\n", + "\n", + "模型微调是将预训练好的模型在特定的数据集上对模型参数进行非常精细调整的过程,最终让预训练的模型能够适配新的数据集及对应的任务。相比于模型的训练过程,模型微调大大降低了训练的时间,并减少了数据量很小的数据集在训练过程中会出现的过拟合问题。\n", + "\n", + "模型微调的基本步骤如下:\n", + "\n", + "1. 准备新数据集并满足 MMClassification 的要求\n", + "2. 根据数据集修改训练配置 \n", + "3. 进行训练和验证\n", + "\n", + "更多细节可以查看 [文档](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/finetune.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TJtKKwAvlHX_" + }, + "source": [ + "### 准备数据集并满足 MMClassification 的要求\n", + "\n", + "这里我们下载猫狗分类数据集,关于数据集格式的详细介绍参考 [tools 教程](https://colab.research.google.com/github/open-mmlab/mmclassification/blob/master/docs_zh-CN/tutorials/MMClassification_tools_cn.ipynb)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3vBfU8GGlFPS", + "outputId": "b12dadb4-ccbc-45b4-bb08-3d24977ed93c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2021-10-21 03:57:58-- https://www.dropbox.com/s/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip?dl=0\n", + "Resolving www.dropbox.com (www.dropbox.com)... 162.125.80.18, 2620:100:6018:18::a27d:312\n", + "Connecting to www.dropbox.com (www.dropbox.com)|162.125.80.18|:443... connected.\n", + "HTTP request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/raw/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip [following]\n", + "--2021-10-21 03:57:58-- https://www.dropbox.com/s/raw/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://ucfd8157272a6270e100392293da.dl.dropboxusercontent.com/cd/0/inline/BYbFG6Zo1S3l2kJtqLrJIne9lTLgQn-uoJxmUjhLSkp36V7AoiwlyR2gP0XVoUQt9WzF2ZsmeERagMy7rpsNoIYG4MjsYA90i_JsarFDs9PHhXHw9qwHpHqBvgd4YU_mwDQHuouJ_oCU1kft04QgCVRg/file# [following]\n", + "--2021-10-21 03:57:59-- https://ucfd8157272a6270e100392293da.dl.dropboxusercontent.com/cd/0/inline/BYbFG6Zo1S3l2kJtqLrJIne9lTLgQn-uoJxmUjhLSkp36V7AoiwlyR2gP0XVoUQt9WzF2ZsmeERagMy7rpsNoIYG4MjsYA90i_JsarFDs9PHhXHw9qwHpHqBvgd4YU_mwDQHuouJ_oCU1kft04QgCVRg/file\n", + "Resolving ucfd8157272a6270e100392293da.dl.dropboxusercontent.com (ucfd8157272a6270e100392293da.dl.dropboxusercontent.com)... 162.125.3.15, 2620:100:6018:15::a27d:30f\n", + "Connecting to ucfd8157272a6270e100392293da.dl.dropboxusercontent.com (ucfd8157272a6270e100392293da.dl.dropboxusercontent.com)|162.125.3.15|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: /cd/0/inline2/BYYSXb-0kWS7Lpk-cdrgBGzcOBfsvy7KjhqWEgjI5L9xfcaXohKlVeFMNFVyqvCwZLym2kWCD0nwURRpQ2mnHICrNsrvTvavbn24hk1Bd3_lXX08LBBe3C6YvD2U_iP8UMXROqm-B3JtnBjeMpk1R4YZ0O6aVLgKu0eET9RXsRaNCczD2lTK_i72zmbYhGmBvlRWmf_yQnnS5WKpGhSAobznIqKzw78yPzo5FsgGiEj5VXb91AElrKVAW8HFC9EhdUs7RrL3q9f0mQ9TbQpauoAp32TL3YQcuAp891Rv-EmDVxzfMwKVTGU8hxR2SiIWkse4u2QGhliqhdha7qBu7sIPcIoeI5-DdSoc6XG77vTYTRhrs_cf7rQuTPH2gTIUwTY/file [following]\n", + "--2021-10-21 03:57:59-- https://ucfd8157272a6270e100392293da.dl.dropboxusercontent.com/cd/0/inline2/BYYSXb-0kWS7Lpk-cdrgBGzcOBfsvy7KjhqWEgjI5L9xfcaXohKlVeFMNFVyqvCwZLym2kWCD0nwURRpQ2mnHICrNsrvTvavbn24hk1Bd3_lXX08LBBe3C6YvD2U_iP8UMXROqm-B3JtnBjeMpk1R4YZ0O6aVLgKu0eET9RXsRaNCczD2lTK_i72zmbYhGmBvlRWmf_yQnnS5WKpGhSAobznIqKzw78yPzo5FsgGiEj5VXb91AElrKVAW8HFC9EhdUs7RrL3q9f0mQ9TbQpauoAp32TL3YQcuAp891Rv-EmDVxzfMwKVTGU8hxR2SiIWkse4u2QGhliqhdha7qBu7sIPcIoeI5-DdSoc6XG77vTYTRhrs_cf7rQuTPH2gTIUwTY/file\n", + "Reusing existing connection to ucfd8157272a6270e100392293da.dl.dropboxusercontent.com:443.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 228802825 (218M) [application/zip]\n", + "Saving to: ‘cats_dogs_dataset.zip’\n", + "\n", + "cats_dogs_dataset.z 100%[===================>] 218.20M 86.3MB/s in 2.5s \n", + "\n", + "2021-10-21 03:58:02 (86.3 MB/s) - ‘cats_dogs_dataset.zip’ saved [228802825/228802825]\n", + "\n" + ] + } + ], + "source": [ + "# 下载分类数据集文件\n", + "!wget https://www.dropbox.com/s/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip?dl=0 -O cats_dogs_dataset.zip\n", + "!mkdir -p data\n", + "!unzip -qo cats_dogs_dataset.zip -d ./data/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "15iKNG0SlV9y" + }, + "source": [ + "### 读取配置文件并进行修改\n", + "\n", + "在 [tools 教程](https://colab.research.google.com/github/open-mmlab/mmclassification/blob/master/docs_zh-CN/tutorials/MMClassification_tools_cn.ipynb) 中,我们详细介绍了模型微调所需要修改的各部分配置文件,这里我们可以以 Python 代码的方式修改基础配置文件如下:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "id": "WCfnDavFlWrK" + }, + "outputs": [], + "source": [ + "# 载入已经存在的配置文件\n", + "from mmcv import Config\n", + "from mmcls.utils import auto_select_device\n", + "\n", + "cfg = Config.fromfile('configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py')\n", + "cfg.device = auto_select_device()\n", + "\n", + "# 修改模型分类头中的类别数目\n", + "cfg.model.head.num_classes = 2\n", + "cfg.model.head.topk = (1, )\n", + "\n", + "# 加载预训练权重\n", + "cfg.model.backbone.init_cfg = dict(type='Pretrained', checkpoint=checkpoint_file, prefix='backbone')\n", + "\n", + "# 根据你的电脑情况设置 sample size 和 workers \n", + "cfg.data.samples_per_gpu = 32\n", + "cfg.data.workers_per_gpu = 2\n", + "\n", + "# 指定训练集路径\n", + "cfg.data.train.data_prefix = 'data/cats_dogs_dataset/training_set/training_set'\n", + "cfg.data.train.classes = 'data/cats_dogs_dataset/classes.txt'\n", + "\n", + "# 指定验证集路径\n", + "cfg.data.val.data_prefix = 'data/cats_dogs_dataset/val_set/val_set'\n", + "cfg.data.val.ann_file = 'data/cats_dogs_dataset/val.txt'\n", + "cfg.data.val.classes = 'data/cats_dogs_dataset/classes.txt'\n", + "\n", + "# 指定测试集路径\n", + "cfg.data.test.data_prefix = 'data/cats_dogs_dataset/test_set/test_set'\n", + "cfg.data.test.ann_file = 'data/cats_dogs_dataset/test.txt'\n", + "cfg.data.test.classes = 'data/cats_dogs_dataset/classes.txt'\n", + "\n", + "# 设定数据集归一化参数\n", + "normalize_cfg = dict(type='Normalize', mean=[124.508, 116.050, 106.438], std=[58.577, 57.310, 57.437], to_rgb=True)\n", + "cfg.data.train.pipeline[3] = normalize_cfg\n", + "cfg.data.val.pipeline[3] = normalize_cfg\n", + "cfg.data.test.pipeline[3] = normalize_cfg\n", + "\n", + "# 修改评价指标选项\n", + "cfg.evaluation['metric_options']={'topk': (1, )}\n", + "\n", + "# 设置优化器\n", + "cfg.optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0001)\n", + "cfg.optimizer_config = dict(grad_clip=None)\n", + "\n", + "# 设置学习率策略\n", + "cfg.lr_config = dict(policy='step', step=1, gamma=0.1)\n", + "cfg.runner = dict(type='EpochBasedRunner', max_epochs=2)\n", + "\n", + "# 设置工作目录以保存模型和日志\n", + "cfg.work_dir = './work_dirs/cats_dogs_dataset'\n", + "\n", + "# 设置每 10 个训练批次输出一次日志\n", + "cfg.log_config.interval = 10\n", + "\n", + "# 设置随机种子,并启用 cudnn 确定性选项以保证结果的可重复性\n", + "from mmcls.apis import set_random_seed\n", + "cfg.seed = 0\n", + "set_random_seed(0, deterministic=True)\n", + "\n", + "cfg.gpu_ids = range(1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HDerVUPFmNR0" + }, + "source": [ + "### 模型微调\n", + "\n", + "基于我们修改的训练配置,开始对我们的数据集进行模型微调计算。 我们调用 `train_model` API 进行计算. " + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "P7unq5cNmN8G", + "outputId": "bf32711b-7bdf-45ee-8db5-e8699d3eff91" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-10-21 04:04:12,758 - mmcv - INFO - initialize MobileNetV2 with init_cfg {'type': 'Pretrained', 'checkpoint': 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth', 'prefix': 'backbone'}\n", + "2021-10-21 04:04:12,759 - mmcv - INFO - load backbone in model from: https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\n", + "2021-10-21 04:04:12,815 - mmcv - INFO - initialize LinearClsHead with init_cfg {'type': 'Normal', 'layer': 'Linear', 'std': 0.01}\n", + "2021-10-21 04:04:12,818 - mmcv - INFO - \n", + "backbone.conv1.conv.weight - torch.Size([32, 3, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,821 - mmcv - INFO - \n", + "backbone.conv1.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,823 - mmcv - INFO - \n", + "backbone.conv1.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,824 - mmcv - INFO - \n", + "backbone.layer1.0.conv.0.conv.weight - torch.Size([32, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,826 - mmcv - INFO - \n", + "backbone.layer1.0.conv.0.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,827 - mmcv - INFO - \n", + "backbone.layer1.0.conv.0.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,829 - mmcv - INFO - \n", + "backbone.layer1.0.conv.1.conv.weight - torch.Size([16, 32, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,830 - mmcv - INFO - \n", + "backbone.layer1.0.conv.1.bn.weight - torch.Size([16]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,832 - mmcv - INFO - \n", + "backbone.layer1.0.conv.1.bn.bias - torch.Size([16]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,833 - mmcv - INFO - \n", + "backbone.layer2.0.conv.0.conv.weight - torch.Size([96, 16, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,835 - mmcv - INFO - \n", + "backbone.layer2.0.conv.0.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,836 - mmcv - INFO - \n", + "backbone.layer2.0.conv.0.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,838 - mmcv - INFO - \n", + "backbone.layer2.0.conv.1.conv.weight - torch.Size([96, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,839 - mmcv - INFO - \n", + "backbone.layer2.0.conv.1.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,841 - mmcv - INFO - \n", + "backbone.layer2.0.conv.1.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,842 - mmcv - INFO - \n", + "backbone.layer2.0.conv.2.conv.weight - torch.Size([24, 96, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,844 - mmcv - INFO - \n", + "backbone.layer2.0.conv.2.bn.weight - torch.Size([24]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,845 - mmcv - INFO - \n", + "backbone.layer2.0.conv.2.bn.bias - torch.Size([24]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,847 - mmcv - INFO - \n", + "backbone.layer2.1.conv.0.conv.weight - torch.Size([144, 24, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,848 - mmcv - INFO - \n", + "backbone.layer2.1.conv.0.bn.weight - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,850 - mmcv - INFO - \n", + "backbone.layer2.1.conv.0.bn.bias - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,851 - mmcv - INFO - \n", + "backbone.layer2.1.conv.1.conv.weight - torch.Size([144, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,853 - mmcv - INFO - \n", + "backbone.layer2.1.conv.1.bn.weight - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,854 - mmcv - INFO - \n", + "backbone.layer2.1.conv.1.bn.bias - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,856 - mmcv - INFO - \n", + "backbone.layer2.1.conv.2.conv.weight - torch.Size([24, 144, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,857 - mmcv - INFO - \n", + "backbone.layer2.1.conv.2.bn.weight - torch.Size([24]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,858 - mmcv - INFO - \n", + "backbone.layer2.1.conv.2.bn.bias - torch.Size([24]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,860 - mmcv - INFO - \n", + "backbone.layer3.0.conv.0.conv.weight - torch.Size([144, 24, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,861 - mmcv - INFO - \n", + "backbone.layer3.0.conv.0.bn.weight - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,863 - mmcv - INFO - \n", + "backbone.layer3.0.conv.0.bn.bias - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,864 - mmcv - INFO - \n", + "backbone.layer3.0.conv.1.conv.weight - torch.Size([144, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,866 - mmcv - INFO - \n", + "backbone.layer3.0.conv.1.bn.weight - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,867 - mmcv - INFO - \n", + "backbone.layer3.0.conv.1.bn.bias - torch.Size([144]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,869 - mmcv - INFO - \n", + "backbone.layer3.0.conv.2.conv.weight - torch.Size([32, 144, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,870 - mmcv - INFO - \n", + "backbone.layer3.0.conv.2.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,872 - mmcv - INFO - \n", + "backbone.layer3.0.conv.2.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,873 - mmcv - INFO - \n", + "backbone.layer3.1.conv.0.conv.weight - torch.Size([192, 32, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,875 - mmcv - INFO - \n", + "backbone.layer3.1.conv.0.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,876 - mmcv - INFO - \n", + "backbone.layer3.1.conv.0.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,878 - mmcv - INFO - \n", + "backbone.layer3.1.conv.1.conv.weight - torch.Size([192, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,879 - mmcv - INFO - \n", + "backbone.layer3.1.conv.1.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,882 - mmcv - INFO - \n", + "backbone.layer3.1.conv.1.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,883 - mmcv - INFO - \n", + "backbone.layer3.1.conv.2.conv.weight - torch.Size([32, 192, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,885 - mmcv - INFO - \n", + "backbone.layer3.1.conv.2.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,886 - mmcv - INFO - \n", + "backbone.layer3.1.conv.2.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,887 - mmcv - INFO - \n", + "backbone.layer3.2.conv.0.conv.weight - torch.Size([192, 32, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,889 - mmcv - INFO - \n", + "backbone.layer3.2.conv.0.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,890 - mmcv - INFO - \n", + "backbone.layer3.2.conv.0.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,892 - mmcv - INFO - \n", + "backbone.layer3.2.conv.1.conv.weight - torch.Size([192, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,894 - mmcv - INFO - \n", + "backbone.layer3.2.conv.1.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,895 - mmcv - INFO - \n", + "backbone.layer3.2.conv.1.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,896 - mmcv - INFO - \n", + "backbone.layer3.2.conv.2.conv.weight - torch.Size([32, 192, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,898 - mmcv - INFO - \n", + "backbone.layer3.2.conv.2.bn.weight - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,899 - mmcv - INFO - \n", + "backbone.layer3.2.conv.2.bn.bias - torch.Size([32]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,901 - mmcv - INFO - \n", + "backbone.layer4.0.conv.0.conv.weight - torch.Size([192, 32, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,903 - mmcv - INFO - \n", + "backbone.layer4.0.conv.0.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,907 - mmcv - INFO - \n", + "backbone.layer4.0.conv.0.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,908 - mmcv - INFO - \n", + "backbone.layer4.0.conv.1.conv.weight - torch.Size([192, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,910 - mmcv - INFO - \n", + "backbone.layer4.0.conv.1.bn.weight - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,911 - mmcv - INFO - \n", + "backbone.layer4.0.conv.1.bn.bias - torch.Size([192]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,913 - mmcv - INFO - \n", + "backbone.layer4.0.conv.2.conv.weight - torch.Size([64, 192, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,914 - mmcv - INFO - \n", + "backbone.layer4.0.conv.2.bn.weight - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,915 - mmcv - INFO - \n", + "backbone.layer4.0.conv.2.bn.bias - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,917 - mmcv - INFO - \n", + "backbone.layer4.1.conv.0.conv.weight - torch.Size([384, 64, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,918 - mmcv - INFO - \n", + "backbone.layer4.1.conv.0.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,920 - mmcv - INFO - \n", + "backbone.layer4.1.conv.0.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,921 - mmcv - INFO - \n", + "backbone.layer4.1.conv.1.conv.weight - torch.Size([384, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,923 - mmcv - INFO - \n", + "backbone.layer4.1.conv.1.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,924 - mmcv - INFO - \n", + "backbone.layer4.1.conv.1.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,925 - mmcv - INFO - \n", + "backbone.layer4.1.conv.2.conv.weight - torch.Size([64, 384, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,927 - mmcv - INFO - \n", + "backbone.layer4.1.conv.2.bn.weight - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,928 - mmcv - INFO - \n", + "backbone.layer4.1.conv.2.bn.bias - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,930 - mmcv - INFO - \n", + "backbone.layer4.2.conv.0.conv.weight - torch.Size([384, 64, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,932 - mmcv - INFO - \n", + "backbone.layer4.2.conv.0.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,933 - mmcv - INFO - \n", + "backbone.layer4.2.conv.0.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,935 - mmcv - INFO - \n", + "backbone.layer4.2.conv.1.conv.weight - torch.Size([384, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,936 - mmcv - INFO - \n", + "backbone.layer4.2.conv.1.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,938 - mmcv - INFO - \n", + "backbone.layer4.2.conv.1.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,939 - mmcv - INFO - \n", + "backbone.layer4.2.conv.2.conv.weight - torch.Size([64, 384, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,941 - mmcv - INFO - \n", + "backbone.layer4.2.conv.2.bn.weight - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,942 - mmcv - INFO - \n", + "backbone.layer4.2.conv.2.bn.bias - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,944 - mmcv - INFO - \n", + "backbone.layer4.3.conv.0.conv.weight - torch.Size([384, 64, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,945 - mmcv - INFO - \n", + "backbone.layer4.3.conv.0.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,946 - mmcv - INFO - \n", + "backbone.layer4.3.conv.0.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,948 - mmcv - INFO - \n", + "backbone.layer4.3.conv.1.conv.weight - torch.Size([384, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,949 - mmcv - INFO - \n", + "backbone.layer4.3.conv.1.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,951 - mmcv - INFO - \n", + "backbone.layer4.3.conv.1.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,952 - mmcv - INFO - \n", + "backbone.layer4.3.conv.2.conv.weight - torch.Size([64, 384, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,954 - mmcv - INFO - \n", + "backbone.layer4.3.conv.2.bn.weight - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,955 - mmcv - INFO - \n", + "backbone.layer4.3.conv.2.bn.bias - torch.Size([64]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,957 - mmcv - INFO - \n", + "backbone.layer5.0.conv.0.conv.weight - torch.Size([384, 64, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,958 - mmcv - INFO - \n", + "backbone.layer5.0.conv.0.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,959 - mmcv - INFO - \n", + "backbone.layer5.0.conv.0.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,961 - mmcv - INFO - \n", + "backbone.layer5.0.conv.1.conv.weight - torch.Size([384, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,963 - mmcv - INFO - \n", + "backbone.layer5.0.conv.1.bn.weight - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,964 - mmcv - INFO - \n", + "backbone.layer5.0.conv.1.bn.bias - torch.Size([384]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Use load_from_http loader\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-10-21 04:04:12,965 - mmcv - INFO - \n", + "backbone.layer5.0.conv.2.conv.weight - torch.Size([96, 384, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,967 - mmcv - INFO - \n", + "backbone.layer5.0.conv.2.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,969 - mmcv - INFO - \n", + "backbone.layer5.0.conv.2.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,970 - mmcv - INFO - \n", + "backbone.layer5.1.conv.0.conv.weight - torch.Size([576, 96, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,972 - mmcv - INFO - \n", + "backbone.layer5.1.conv.0.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,973 - mmcv - INFO - \n", + "backbone.layer5.1.conv.0.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,975 - mmcv - INFO - \n", + "backbone.layer5.1.conv.1.conv.weight - torch.Size([576, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,976 - mmcv - INFO - \n", + "backbone.layer5.1.conv.1.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,978 - mmcv - INFO - \n", + "backbone.layer5.1.conv.1.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,979 - mmcv - INFO - \n", + "backbone.layer5.1.conv.2.conv.weight - torch.Size([96, 576, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,981 - mmcv - INFO - \n", + "backbone.layer5.1.conv.2.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,982 - mmcv - INFO - \n", + "backbone.layer5.1.conv.2.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,984 - mmcv - INFO - \n", + "backbone.layer5.2.conv.0.conv.weight - torch.Size([576, 96, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,985 - mmcv - INFO - \n", + "backbone.layer5.2.conv.0.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,986 - mmcv - INFO - \n", + "backbone.layer5.2.conv.0.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,988 - mmcv - INFO - \n", + "backbone.layer5.2.conv.1.conv.weight - torch.Size([576, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,989 - mmcv - INFO - \n", + "backbone.layer5.2.conv.1.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,991 - mmcv - INFO - \n", + "backbone.layer5.2.conv.1.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,992 - mmcv - INFO - \n", + "backbone.layer5.2.conv.2.conv.weight - torch.Size([96, 576, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,994 - mmcv - INFO - \n", + "backbone.layer5.2.conv.2.bn.weight - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,995 - mmcv - INFO - \n", + "backbone.layer5.2.conv.2.bn.bias - torch.Size([96]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,997 - mmcv - INFO - \n", + "backbone.layer6.0.conv.0.conv.weight - torch.Size([576, 96, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,998 - mmcv - INFO - \n", + "backbone.layer6.0.conv.0.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:12,999 - mmcv - INFO - \n", + "backbone.layer6.0.conv.0.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,001 - mmcv - INFO - \n", + "backbone.layer6.0.conv.1.conv.weight - torch.Size([576, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,002 - mmcv - INFO - \n", + "backbone.layer6.0.conv.1.bn.weight - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,004 - mmcv - INFO - \n", + "backbone.layer6.0.conv.1.bn.bias - torch.Size([576]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,005 - mmcv - INFO - \n", + "backbone.layer6.0.conv.2.conv.weight - torch.Size([160, 576, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,007 - mmcv - INFO - \n", + "backbone.layer6.0.conv.2.bn.weight - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,008 - mmcv - INFO - \n", + "backbone.layer6.0.conv.2.bn.bias - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,010 - mmcv - INFO - \n", + "backbone.layer6.1.conv.0.conv.weight - torch.Size([960, 160, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,011 - mmcv - INFO - \n", + "backbone.layer6.1.conv.0.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,013 - mmcv - INFO - \n", + "backbone.layer6.1.conv.0.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,014 - mmcv - INFO - \n", + "backbone.layer6.1.conv.1.conv.weight - torch.Size([960, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,015 - mmcv - INFO - \n", + "backbone.layer6.1.conv.1.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,017 - mmcv - INFO - \n", + "backbone.layer6.1.conv.1.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,018 - mmcv - INFO - \n", + "backbone.layer6.1.conv.2.conv.weight - torch.Size([160, 960, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,021 - mmcv - INFO - \n", + "backbone.layer6.1.conv.2.bn.weight - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,022 - mmcv - INFO - \n", + "backbone.layer6.1.conv.2.bn.bias - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,024 - mmcv - INFO - \n", + "backbone.layer6.2.conv.0.conv.weight - torch.Size([960, 160, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,025 - mmcv - INFO - \n", + "backbone.layer6.2.conv.0.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,027 - mmcv - INFO - \n", + "backbone.layer6.2.conv.0.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,028 - mmcv - INFO - \n", + "backbone.layer6.2.conv.1.conv.weight - torch.Size([960, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,030 - mmcv - INFO - \n", + "backbone.layer6.2.conv.1.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,031 - mmcv - INFO - \n", + "backbone.layer6.2.conv.1.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,033 - mmcv - INFO - \n", + "backbone.layer6.2.conv.2.conv.weight - torch.Size([160, 960, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,034 - mmcv - INFO - \n", + "backbone.layer6.2.conv.2.bn.weight - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,036 - mmcv - INFO - \n", + "backbone.layer6.2.conv.2.bn.bias - torch.Size([160]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,037 - mmcv - INFO - \n", + "backbone.layer7.0.conv.0.conv.weight - torch.Size([960, 160, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,039 - mmcv - INFO - \n", + "backbone.layer7.0.conv.0.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,040 - mmcv - INFO - \n", + "backbone.layer7.0.conv.0.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,041 - mmcv - INFO - \n", + "backbone.layer7.0.conv.1.conv.weight - torch.Size([960, 1, 3, 3]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,043 - mmcv - INFO - \n", + "backbone.layer7.0.conv.1.bn.weight - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,045 - mmcv - INFO - \n", + "backbone.layer7.0.conv.1.bn.bias - torch.Size([960]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,046 - mmcv - INFO - \n", + "backbone.layer7.0.conv.2.conv.weight - torch.Size([320, 960, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,048 - mmcv - INFO - \n", + "backbone.layer7.0.conv.2.bn.weight - torch.Size([320]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,049 - mmcv - INFO - \n", + "backbone.layer7.0.conv.2.bn.bias - torch.Size([320]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,051 - mmcv - INFO - \n", + "backbone.conv2.conv.weight - torch.Size([1280, 320, 1, 1]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,052 - mmcv - INFO - \n", + "backbone.conv2.bn.weight - torch.Size([1280]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,054 - mmcv - INFO - \n", + "backbone.conv2.bn.bias - torch.Size([1280]): \n", + "PretrainedInit: load from https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth \n", + " \n", + "2021-10-21 04:04:13,055 - mmcv - INFO - \n", + "head.fc.weight - torch.Size([2, 1280]): \n", + "NormalInit: mean=0, std=0.01, bias=0 \n", + " \n", + "2021-10-21 04:04:13,057 - mmcv - INFO - \n", + "head.fc.bias - torch.Size([2]): \n", + "NormalInit: mean=0, std=0.01, bias=0 \n", + " \n", + "2021-10-21 04:04:13,408 - mmcls - INFO - Start running, host: root@cc5b42005207, work_dir: /content/mmclassification/work_dirs/cats_dogs_dataset\n", + "2021-10-21 04:04:13,412 - mmcls - INFO - Hooks will be executed in the following order:\n", + "before_run:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_train_epoch:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_train_iter:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + " -------------------- \n", + "after_train_iter:\n", + "(ABOVE_NORMAL) OptimizerHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "after_train_epoch:\n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_val_epoch:\n", + "(LOW ) IterTimerHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_epoch:\n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "2021-10-21 04:04:13,417 - mmcls - INFO - workflow: [('train', 1)], max: 2 epochs\n", + "2021-10-21 04:04:18,924 - mmcls - INFO - Epoch [1][10/201]\tlr: 5.000e-03, eta: 0:03:29, time: 0.535, data_time: 0.259, memory: 1709, loss: 0.3917\n", + "2021-10-21 04:04:21,743 - mmcls - INFO - Epoch [1][20/201]\tlr: 5.000e-03, eta: 0:02:35, time: 0.281, data_time: 0.019, memory: 1709, loss: 0.3508\n", + "2021-10-21 04:04:24,552 - mmcls - INFO - Epoch [1][30/201]\tlr: 5.000e-03, eta: 0:02:15, time: 0.280, data_time: 0.020, memory: 1709, loss: 0.3955\n", + "2021-10-21 04:04:27,371 - mmcls - INFO - Epoch [1][40/201]\tlr: 5.000e-03, eta: 0:02:04, time: 0.282, data_time: 0.021, memory: 1709, loss: 0.2485\n", + "2021-10-21 04:04:30,202 - mmcls - INFO - Epoch [1][50/201]\tlr: 5.000e-03, eta: 0:01:56, time: 0.283, data_time: 0.021, memory: 1709, loss: 0.4196\n", + "2021-10-21 04:04:33,021 - mmcls - INFO - Epoch [1][60/201]\tlr: 5.000e-03, eta: 0:01:50, time: 0.282, data_time: 0.023, memory: 1709, loss: 0.4994\n", + "2021-10-21 04:04:35,800 - mmcls - INFO - Epoch [1][70/201]\tlr: 5.000e-03, eta: 0:01:45, time: 0.278, data_time: 0.020, memory: 1709, loss: 0.4372\n", + "2021-10-21 04:04:38,595 - mmcls - INFO - Epoch [1][80/201]\tlr: 5.000e-03, eta: 0:01:40, time: 0.280, data_time: 0.019, memory: 1709, loss: 0.3179\n", + "2021-10-21 04:04:41,351 - mmcls - INFO - Epoch [1][90/201]\tlr: 5.000e-03, eta: 0:01:36, time: 0.276, data_time: 0.018, memory: 1709, loss: 0.3175\n", + "2021-10-21 04:04:44,157 - mmcls - INFO - Epoch [1][100/201]\tlr: 5.000e-03, eta: 0:01:32, time: 0.280, data_time: 0.021, memory: 1709, loss: 0.3412\n", + "2021-10-21 04:04:46,974 - mmcls - INFO - Epoch [1][110/201]\tlr: 5.000e-03, eta: 0:01:28, time: 0.282, data_time: 0.019, memory: 1709, loss: 0.2985\n", + "2021-10-21 04:04:49,767 - mmcls - INFO - Epoch [1][120/201]\tlr: 5.000e-03, eta: 0:01:25, time: 0.280, data_time: 0.021, memory: 1709, loss: 0.2778\n", + "2021-10-21 04:04:52,553 - mmcls - INFO - Epoch [1][130/201]\tlr: 5.000e-03, eta: 0:01:21, time: 0.278, data_time: 0.021, memory: 1709, loss: 0.2229\n", + "2021-10-21 04:04:55,356 - mmcls - INFO - Epoch [1][140/201]\tlr: 5.000e-03, eta: 0:01:18, time: 0.280, data_time: 0.021, memory: 1709, loss: 0.2318\n", + "2021-10-21 04:04:58,177 - mmcls - INFO - Epoch [1][150/201]\tlr: 5.000e-03, eta: 0:01:14, time: 0.282, data_time: 0.022, memory: 1709, loss: 0.2333\n", + "2021-10-21 04:05:01,025 - mmcls - INFO - Epoch [1][160/201]\tlr: 5.000e-03, eta: 0:01:11, time: 0.285, data_time: 0.020, memory: 1709, loss: 0.2783\n", + "2021-10-21 04:05:03,833 - mmcls - INFO - Epoch [1][170/201]\tlr: 5.000e-03, eta: 0:01:08, time: 0.281, data_time: 0.022, memory: 1709, loss: 0.2132\n", + "2021-10-21 04:05:06,648 - mmcls - INFO - Epoch [1][180/201]\tlr: 5.000e-03, eta: 0:01:05, time: 0.281, data_time: 0.019, memory: 1709, loss: 0.2096\n", + "2021-10-21 04:05:09,472 - mmcls - INFO - Epoch [1][190/201]\tlr: 5.000e-03, eta: 0:01:02, time: 0.282, data_time: 0.020, memory: 1709, loss: 0.1729\n", + "2021-10-21 04:05:12,229 - mmcls - INFO - Epoch [1][200/201]\tlr: 5.000e-03, eta: 0:00:59, time: 0.275, data_time: 0.018, memory: 1709, loss: 0.1969\n", + "2021-10-21 04:05:12,275 - mmcls - INFO - Saving checkpoint at 1 epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[>>>>>>>>>>>>>>>>>>>>>>>>>>] 1601/1601, 104.1 task/s, elapsed: 15s, ETA: 0s" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-10-21 04:05:27,767 - mmcls - INFO - Epoch(val) [1][51]\taccuracy_top-1: 95.6277\n", + "2021-10-21 04:05:32,987 - mmcls - INFO - Epoch [2][10/201]\tlr: 5.000e-04, eta: 0:00:57, time: 0.505, data_time: 0.238, memory: 1709, loss: 0.1764\n", + "2021-10-21 04:05:35,779 - mmcls - INFO - Epoch [2][20/201]\tlr: 5.000e-04, eta: 0:00:54, time: 0.278, data_time: 0.020, memory: 1709, loss: 0.1514\n", + "2021-10-21 04:05:38,537 - mmcls - INFO - Epoch [2][30/201]\tlr: 5.000e-04, eta: 0:00:51, time: 0.276, data_time: 0.020, memory: 1709, loss: 0.1395\n", + "2021-10-21 04:05:41,283 - mmcls - INFO - Epoch [2][40/201]\tlr: 5.000e-04, eta: 0:00:48, time: 0.275, data_time: 0.020, memory: 1709, loss: 0.1508\n", + "2021-10-21 04:05:44,017 - mmcls - INFO - Epoch [2][50/201]\tlr: 5.000e-04, eta: 0:00:44, time: 0.274, data_time: 0.021, memory: 1709, loss: 0.1771\n", + "2021-10-21 04:05:46,800 - mmcls - INFO - Epoch [2][60/201]\tlr: 5.000e-04, eta: 0:00:41, time: 0.278, data_time: 0.020, memory: 1709, loss: 0.1438\n", + "2021-10-21 04:05:49,570 - mmcls - INFO - Epoch [2][70/201]\tlr: 5.000e-04, eta: 0:00:38, time: 0.277, data_time: 0.020, memory: 1709, loss: 0.1321\n", + "2021-10-21 04:05:52,314 - mmcls - INFO - Epoch [2][80/201]\tlr: 5.000e-04, eta: 0:00:35, time: 0.275, data_time: 0.021, memory: 1709, loss: 0.1629\n", + "2021-10-21 04:05:55,052 - mmcls - INFO - Epoch [2][90/201]\tlr: 5.000e-04, eta: 0:00:32, time: 0.273, data_time: 0.021, memory: 1709, loss: 0.1574\n", + "2021-10-21 04:05:57,791 - mmcls - INFO - Epoch [2][100/201]\tlr: 5.000e-04, eta: 0:00:29, time: 0.274, data_time: 0.019, memory: 1709, loss: 0.1220\n", + "2021-10-21 04:06:00,534 - mmcls - INFO - Epoch [2][110/201]\tlr: 5.000e-04, eta: 0:00:26, time: 0.274, data_time: 0.021, memory: 1709, loss: 0.2550\n", + "2021-10-21 04:06:03,295 - mmcls - INFO - Epoch [2][120/201]\tlr: 5.000e-04, eta: 0:00:23, time: 0.276, data_time: 0.019, memory: 1709, loss: 0.1528\n", + "2021-10-21 04:06:06,048 - mmcls - INFO - Epoch [2][130/201]\tlr: 5.000e-04, eta: 0:00:20, time: 0.275, data_time: 0.022, memory: 1709, loss: 0.1223\n", + "2021-10-21 04:06:08,811 - mmcls - INFO - Epoch [2][140/201]\tlr: 5.000e-04, eta: 0:00:17, time: 0.276, data_time: 0.021, memory: 1709, loss: 0.1734\n", + "2021-10-21 04:06:11,576 - mmcls - INFO - Epoch [2][150/201]\tlr: 5.000e-04, eta: 0:00:14, time: 0.277, data_time: 0.020, memory: 1709, loss: 0.1527\n", + "2021-10-21 04:06:14,330 - mmcls - INFO - Epoch [2][160/201]\tlr: 5.000e-04, eta: 0:00:11, time: 0.276, data_time: 0.020, memory: 1709, loss: 0.1910\n", + "2021-10-21 04:06:17,106 - mmcls - INFO - Epoch [2][170/201]\tlr: 5.000e-04, eta: 0:00:09, time: 0.277, data_time: 0.019, memory: 1709, loss: 0.1922\n", + "2021-10-21 04:06:19,855 - mmcls - INFO - Epoch [2][180/201]\tlr: 5.000e-04, eta: 0:00:06, time: 0.274, data_time: 0.023, memory: 1709, loss: 0.1760\n", + "2021-10-21 04:06:22,638 - mmcls - INFO - Epoch [2][190/201]\tlr: 5.000e-04, eta: 0:00:03, time: 0.278, data_time: 0.019, memory: 1709, loss: 0.1739\n", + "2021-10-21 04:06:25,367 - mmcls - INFO - Epoch [2][200/201]\tlr: 5.000e-04, eta: 0:00:00, time: 0.272, data_time: 0.020, memory: 1709, loss: 0.1654\n", + "2021-10-21 04:06:25,410 - mmcls - INFO - Saving checkpoint at 2 epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[>>>>>>>>>>>>>>>>>>>>>>>>>>] 1601/1601, 105.5 task/s, elapsed: 15s, ETA: 0s" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2021-10-21 04:06:40,694 - mmcls - INFO - Epoch(val) [2][51]\taccuracy_top-1: 97.5016\n" + ] + } + ], + "source": [ + "import time\n", + "import mmcv\n", + "import os.path as osp\n", + "\n", + "from mmcls.datasets import build_dataset\n", + "from mmcls.models import build_classifier\n", + "from mmcls.apis import train_model\n", + "\n", + "# 创建工作目录\n", + "mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))\n", + "# 创建分类器\n", + "model = build_classifier(cfg.model)\n", + "model.init_weights()\n", + "# 创建数据集\n", + "datasets = [build_dataset(cfg.data.train)]\n", + "# 添加类别属性以方便可视化\n", + "model.CLASSES = datasets[0].CLASSES\n", + "# 开始微调\n", + "train_model(\n", + " model,\n", + " datasets,\n", + " cfg,\n", + " distributed=False,\n", + " validate=True,\n", + " timestamp=time.strftime('%Y%m%d_%H%M%S', time.localtime()),\n", + " meta=dict())" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 304 + }, + "id": "HsoGBZA3miui", + "outputId": "eb2e09f5-55ce-4165-b754-3b75dbc829ab" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "# 验证训练好的模型\n", + "\n", + "img = mmcv.imread('data/cats_dogs_dataset/training_set/training_set/cats/cat.1.jpg')\n", + "\n", + "model.cfg = cfg\n", + "result = inference_model(model, img)\n", + "\n", + "show_result_pyplot(model, img, result)" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "MMClassification_python_cn.ipynb", + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.11" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "31475aa888da4c8d844ba99a0b3397f5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "520112917e0f4844995d418c5041d23a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "863d2a8cc4074f2e890ba6aea7c54384": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8a8ab7c27e404459951cffe7a32b8faa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9f3f6b72b4d14e2a96b9185331c8081b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_be55ab36267d4dcab1d83dfaa8540270", + "placeholder": "​", + "style": "IPY_MODEL_863d2a8cc4074f2e890ba6aea7c54384", + "value": "100%" + } + }, + "a275bef3584b49ab9b680b528420d461": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e310c50e610248dd897fbbf5dd09dd7a", + "max": 14206911, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_31475aa888da4c8d844ba99a0b3397f5", + "value": 14206911 + } + }, + "badf240bbb7d442fbd214e837edbffe2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9f3f6b72b4d14e2a96b9185331c8081b", + "IPY_MODEL_a275bef3584b49ab9b680b528420d461", + "IPY_MODEL_c4b2c6914a05497b8d2b691bd6dda6da" + ], + "layout": "IPY_MODEL_520112917e0f4844995d418c5041d23a" + } + }, + "be55ab36267d4dcab1d83dfaa8540270": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c4b2c6914a05497b8d2b691bd6dda6da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e1a3dce90c1a4804a9ef0c687a9c0703", + "placeholder": "​", + "style": "IPY_MODEL_8a8ab7c27e404459951cffe7a32b8faa", + "value": " 13.5M/13.5M [00:01<00:00, 9.60MB/s]" + } + }, + "e1a3dce90c1a4804a9ef0c687a9c0703": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e310c50e610248dd897fbbf5dd09dd7a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/zh_CN/tutorials/MMClassification_tools_cn.ipynb b/docs/zh_CN/tutorials/MMClassification_tools_cn.ipynb new file mode 100755 index 0000000..1914956 --- /dev/null +++ b/docs/zh_CN/tutorials/MMClassification_tools_cn.ipynb @@ -0,0 +1,1247 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "MMClassification_tools_cn.ipynb", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "XjQxmm04iTx4", + "tags": [] + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4z0JDgisPRr-" + }, + "source": [ + "# MMClassification 命令行工具教程\n", + "\n", + "在本教程中会介绍如下内容:\n", + "\n", + "* 如何安装 MMClassification\n", + "* 准备数据\n", + "* 准备配置文件\n", + "* 使用 shell 命令进行模型训练和测试" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "inm7Ciy5PXrU" + }, + "source": [ + "## 安装 MMClassification\n", + "\n", + "在使用 MMClassification 之前,我们需要配置环境,步骤如下:\n", + "\n", + "- 安装 Python, CUDA, C/C++ compiler 和 git\n", + "- 安装 PyTorch (CUDA 版)\n", + "- 安装 mmcv\n", + "- 克隆 mmcls github 代码库然后安装\n", + "\n", + "因为我们在 Google Colab 进行实验,Colab 已经帮我们完成了基本的配置,我们可以直接跳过前面两个步骤 。" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TDOxbcDvPbNk" + }, + "source": [ + "### 检查环境" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "c6MbAw10iUJI", + "outputId": "5f95ad09-7b96-4d27-dfa8-17f31caba50d" + }, + "source": [ + "%cd /content" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/content\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4IyFL3MaiYRu", + "outputId": "b0ab6848-12ea-49a1-98ec-691e2c9814e1" + }, + "source": [ + "!pwd" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/content\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DMw7QwvpiiUO", + "outputId": "d699b9d2-22e5-431c-83d8-9317a694cb0e" + }, + "source": [ + "# 检查 nvcc 版本\n", + "!nvcc -V" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "nvcc: NVIDIA (R) Cuda compiler driver\n", + "Copyright (c) 2005-2020 NVIDIA Corporation\n", + "Built on Mon_Oct_12_20:09:46_PDT_2020\n", + "Cuda compilation tools, release 11.1, V11.1.105\n", + "Build cuda_11.1.TC455_06.29190527_0\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4VIBU7Fain4D", + "outputId": "7eb1d91f-86c7-43cf-d335-3d37ae014060" + }, + "source": [ + "# 检查 GCC 版本\n", + "!gcc --version" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "Copyright (C) 2017 Free Software Foundation, Inc.\n", + "This is free software; see the source for copying conditions. There is NO\n", + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "24lDLCqFisZ9", + "outputId": "3c553c42-e7ac-4c6a-863e-13ad158bac22" + }, + "source": [ + "# 检查 PyTorch 的安装情况\n", + "import torch, torchvision\n", + "print(torch.__version__)\n", + "print(torch.cuda.is_available())" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.9.0+cu111\n", + "True\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "R2aZNLUwizBs" + }, + "source": [ + "### 安装 MMCV\n", + "\n", + "MMCV 是 OpenMMLab 代码库的基础库。Linux 环境的安装 whl 包已经提前打包好,大家可以直接下载安装。\n", + "\n", + "需要注意 PyTorch 和 CUDA 版本,确保能够正常安装。\n", + "\n", + "在前面的步骤中,我们输出了环境中 CUDA 和 PyTorch 的版本,分别是 11.1 和 1.9.0,我们需要选择相应的 MMCV 版本。\n", + "\n", + "另外,也可以安装完整版的 MMCV-full,它包含所有的特性以及丰富的开箱即用的 CUDA 算子。需要注意的是完整版本可能需要更长时间来编译。" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nla40LrLi7oo", + "outputId": "475dcd11-0b58-45d3-ad81-a3b7772d3132" + }, + "source": [ + "# 安装 mmcv\n", + "!pip install mmcv -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "# !pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in links: https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "Collecting mmcv\n", + " Downloading mmcv-1.3.15.tar.gz (352 kB)\n", + "\u001b[K |████████████████████████████████| 352 kB 5.2 MB/s \n", + "\u001b[?25hCollecting addict\n", + " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv) (1.19.5)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcv) (21.0)\n", + "Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv) (7.1.2)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv) (3.13)\n", + "Collecting yapf\n", + " Downloading yapf-0.31.0-py2.py3-none-any.whl (185 kB)\n", + "\u001b[K |████████████████████████████████| 185 kB 45.4 MB/s \n", + "\u001b[?25hRequirement already satisfied: pyparsing>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->mmcv) (2.4.7)\n", + "Building wheels for collected packages: mmcv\n", + " Building wheel for mmcv (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for mmcv: filename=mmcv-1.3.15-py2.py3-none-any.whl size=509835 sha256=0296cfd1e3e858ece30623050be2953941a442daf0575389030aa25603e5c205\n", + " Stored in directory: /root/.cache/pip/wheels/b2/f4/4e/8f6d2dd2bef6b7eb8c89aa0e5d61acd7bff60aaf3d4d4b29b0\n", + "Successfully built mmcv\n", + "Installing collected packages: yapf, addict, mmcv\n", + "Successfully installed addict-2.4.0 mmcv-1.3.15 yapf-0.31.0\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GDTUrYvXjlRb" + }, + "source": [ + "### 克隆并安装 MMClassification\n", + "\n", + "接着,我们从 github 上克隆下 mmcls 最新代码库并进行安装。" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Bwme6tWHjl5s", + "outputId": "07c0ca6f-8a10-4ac3-a6bc-afabff6aba51" + }, + "source": [ + "# 下载 mmcls 代码库\n", + "!git clone https://github.com/open-mmlab/mmclassification.git\n", + "%cd mmclassification/\n", + "\n", + "# 从源码安装 MMClassification\n", + "!pip install -e . " + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Cloning into 'mmclassification'...\n", + "remote: Enumerating objects: 4152, done.\u001b[K\n", + "remote: Counting objects: 100% (994/994), done.\u001b[K\n", + "remote: Compressing objects: 100% (574/574), done.\u001b[K\n", + "remote: Total 4152 (delta 476), reused 764 (delta 403), pack-reused 3158\u001b[K\n", + "Receiving objects: 100% (4152/4152), 8.20 MiB | 20.90 MiB/s, done.\n", + "Resolving deltas: 100% (2525/2525), done.\n", + "/content/mmclassification\n", + "Obtaining file:///content/mmclassification\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from mmcls==0.16.0) (3.2.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcls==0.16.0) (1.19.5)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcls==0.16.0) (21.0)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmcls==0.16.0) (2.8.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmcls==0.16.0) (1.3.2)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmcls==0.16.0) (0.10.0)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmcls==0.16.0) (2.4.7)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from cycler>=0.10->matplotlib->mmcls==0.16.0) (1.15.0)\n", + "Installing collected packages: mmcls\n", + " Running setup.py develop for mmcls\n", + "Successfully installed mmcls-0.16.0\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hFg_oSG4j3zB", + "outputId": "521a6a75-2dbb-4ff2-ab9f-4fbe785b4400" + }, + "source": [ + "# 检查 MMClassification 的安装情况\n", + "import mmcls\n", + "print(mmcls.__version__)" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "0.16.0\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "arpM46CZOPtR" + }, + "source": [ + "## 准备数据" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XHCHnKb_Qd3P", + "outputId": "4f6eaa3f-7b96-46e4-e75b-aae28c8ec42d" + }, + "source": [ + "# 下载分类数据集文件 (猫狗数据集)\n", + "!wget https://www.dropbox.com/s/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip?dl=0 -O cats_dogs_dataset.zip\n", + "!mkdir data\n", + "!unzip -q cats_dogs_dataset.zip -d ./data/" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "--2021-10-21 02:53:27-- https://www.dropbox.com/s/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip?dl=0\n", + "Resolving www.dropbox.com (www.dropbox.com)... 162.125.3.18, 2620:100:6018:18::a27d:312\n", + "Connecting to www.dropbox.com (www.dropbox.com)|162.125.3.18|:443... connected.\n", + "HTTP request sent, awaiting response... 301 Moved Permanently\n", + "Location: /s/raw/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip [following]\n", + "--2021-10-21 02:53:27-- https://www.dropbox.com/s/raw/wml49yrtdo53mie/cats_dogs_dataset_reorg.zip\n", + "Reusing existing connection to www.dropbox.com:443.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://uc2e142222b11f678e96f89b0223.dl.dropboxusercontent.com/cd/0/inline/BYaBa5-WWfPf_jhSt9A5JMet_BB55MzZhB2D3RXLo53VGHSIYbVMnFTdccihcsD-kwc9FxBG8qOwqA50z7XD6-3yUXWK9iA0x4L8IV5wegYKilKuDauDKWiNAsbgZoEBg4nC1UWR5pLSiH3j0Dn68b2V/file# [following]\n", + "--2021-10-21 02:53:27-- https://uc2e142222b11f678e96f89b0223.dl.dropboxusercontent.com/cd/0/inline/BYaBa5-WWfPf_jhSt9A5JMet_BB55MzZhB2D3RXLo53VGHSIYbVMnFTdccihcsD-kwc9FxBG8qOwqA50z7XD6-3yUXWK9iA0x4L8IV5wegYKilKuDauDKWiNAsbgZoEBg4nC1UWR5pLSiH3j0Dn68b2V/file\n", + "Resolving uc2e142222b11f678e96f89b0223.dl.dropboxusercontent.com (uc2e142222b11f678e96f89b0223.dl.dropboxusercontent.com)... 162.125.3.15, 2620:100:6018:15::a27d:30f\n", + "Connecting to uc2e142222b11f678e96f89b0223.dl.dropboxusercontent.com (uc2e142222b11f678e96f89b0223.dl.dropboxusercontent.com)|162.125.3.15|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: /cd/0/inline2/BYZCXE2D0HPaLzwKVyTyfirCsVVcpsp0-D9eMfo9OFpQdWubKX08yUdUJz2CZ7dn6Vm4ZF22V2hf_4XTw41KZRj5m3Dm_1Z8gH9h_kawyi4bsKn5EYJ6b89lfhXhoxgBa0Fa8h7V39gPRaIfaWDiUE0tzYAM_aEVwT30FVU4uWisNXBvjz5-yS6_XYzJIiMZ1CUrFU8DwqBis4RwPmLA7rzdCsVV7a6VV0NiTcNgOKMwLP0lMYx4bYpDDmnOtF-m-GBVArV_2Xd0akIDKSXy4LY-4ovbTNI13uvUX5U3UcjpR0UPjGtBcgm3LR4Iqcvw5D6Wt14g3PCmBMIPgdTp_IN9RnLl9AK_mfl4v1kmJ_C-BfoEr43qQP-6uqBavD3Xhz8/file [following]\n", + "--2021-10-21 02:53:27-- https://uc2e142222b11f678e96f89b0223.dl.dropboxusercontent.com/cd/0/inline2/BYZCXE2D0HPaLzwKVyTyfirCsVVcpsp0-D9eMfo9OFpQdWubKX08yUdUJz2CZ7dn6Vm4ZF22V2hf_4XTw41KZRj5m3Dm_1Z8gH9h_kawyi4bsKn5EYJ6b89lfhXhoxgBa0Fa8h7V39gPRaIfaWDiUE0tzYAM_aEVwT30FVU4uWisNXBvjz5-yS6_XYzJIiMZ1CUrFU8DwqBis4RwPmLA7rzdCsVV7a6VV0NiTcNgOKMwLP0lMYx4bYpDDmnOtF-m-GBVArV_2Xd0akIDKSXy4LY-4ovbTNI13uvUX5U3UcjpR0UPjGtBcgm3LR4Iqcvw5D6Wt14g3PCmBMIPgdTp_IN9RnLl9AK_mfl4v1kmJ_C-BfoEr43qQP-6uqBavD3Xhz8/file\n", + "Reusing existing connection to uc2e142222b11f678e96f89b0223.dl.dropboxusercontent.com:443.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 228802825 (218M) [application/zip]\n", + "Saving to: ‘cats_dogs_dataset.zip’\n", + "\n", + "cats_dogs_dataset.z 100%[===================>] 218.20M 73.2MB/s in 3.0s \n", + "\n", + "2021-10-21 02:53:31 (73.2 MB/s) - ‘cats_dogs_dataset.zip’ saved [228802825/228802825]\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e4t2P2aTQokX" + }, + "source": [ + "完成下载和解压之后, \"Cats and Dogs Dataset\" 文件夹下的文件结构如下:\n", + "```\n", + "data/cats_dogs_dataset\n", + "├── classes.txt\n", + "├── test.txt\n", + "├── val.txt\n", + "├── training_set\n", + "│ ├── training_set\n", + "│ │ ├── cats\n", + "│ │ │ ├── cat.1.jpg\n", + "│ │ │ ├── cat.2.jpg\n", + "│ │ │ ├── ...\n", + "│ │ ├── dogs\n", + "│ │ │ ├── dog.2.jpg\n", + "│ │ │ ├── dog.3.jpg\n", + "│ │ │ ├── ...\n", + "├── val_set\n", + "│ ├── val_set\n", + "│ │ ├── cats\n", + "│ │ │ ├── cat.3.jpg\n", + "│ │ │ ├── cat.5.jpg\n", + "│ │ │ ├── ...\n", + "│ │ ├── dogs\n", + "│ │ │ ├── dog.1.jpg\n", + "│ │ │ ├── dog.6.jpg\n", + "│ │ │ ├── ...\n", + "├── test_set\n", + "│ ├── test_set\n", + "│ │ ├── cats\n", + "│ │ │ ├── cat.4001.jpg\n", + "│ │ │ ├── cat.4002.jpg\n", + "│ │ │ ├── ...\n", + "│ │ ├── dogs\n", + "│ │ │ ├── dog.4001.jpg\n", + "│ │ │ ├── dog.4002.jpg\n", + "│ │ │ ├── ...\n", + "```\n", + "\n", + "可以通过 shell 命令 `tree data/cats_dogs_dataset` 查看文件结构。" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "46tyHTdtQy_Z", + "outputId": "a6e89ddb-431e-4ba0-f1f5-3581a702fd2a" + }, + "source": [ + "# 获取一张图像可视化\n", + "from PIL import Image\n", + "Image.open('data/cats_dogs_dataset/training_set/training_set/cats/cat.1.jpg')" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "My5Z6p7pQ3UC" + }, + "source": [ + "### 支持新的数据集\n", + "\n", + "MMClassification 要求数据集必须将图像和标签放在同级目录下。有两种方式可以支持自定义数据集。\n", + "\n", + "最简单的方式就是将数据集转换成现有的数据集格式(比如 ImageNet)。另一种方式就是新建一个新的数据集类。细节可以查看 [文档](https://github.com/open-mmlab/mmclassification/blob/master/docs_zh-CN/tutorials/new_dataset.md).\n", + "\n", + "在这个教程中,为了方便学习,我们已经将 “猫狗分类数据集” 按照 ImageNet 的数据集格式进行了整理。" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "P335gKt9Q5U-" + }, + "source": [ + "除了图片文件外,数据集还包括以下文件:\n", + "\n", + "1. 类别列表。每行代表一个类别。\n", + " ```\n", + " cats\n", + " dogs\n", + " ```\n", + "2. 训练/验证/测试标签。\n", + "每行包括一个文件名和其相对应的标签。\n", + " ```\n", + " ...\n", + " cats/cat.3769.jpg 0\n", + " cats/cat.882.jpg 0\n", + " ...\n", + " dogs/dog.3881.jpg 1\n", + " dogs/dog.3377.jpg 1\n", + " ...\n", + " ```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BafQ7ijBQ8N_" + }, + "source": [ + "## 使用 shell 命令进行模型训练和测试\n", + "\n", + "MMCls 同样提供了命令行工具,提供如下功能:\n", + "\n", + "1. 模型训练\n", + "2. 模型微调\n", + "3. 模型测试\n", + "4. 推理计算\n", + "\n", + "模型训练的过程与模型微调的过程一致,我们已经看到 Python API 的推理和模型微调过程。接下来我们将会看到如何使用命令行工具完成这些任务。更过细节可以参考 [文档](https://github.com/open-mmlab/mmclassification/blob/master/docs_zh-CN/getting_started.md)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Aj5cGMihURrZ" + }, + "source": [ + "### 模型微调\n", + "\n", + "通过命令行进行模型微调步骤如下:\n", + "\n", + "1. 准备自定义数据集\n", + "2. 在 py 脚本中修改配置文件\n", + "3. 使用命令行工具进行模型微调\n", + "\n", + "第 1 步与之前的介绍一致,我们将会介绍后面两个步骤的内容。" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wl-FNFP8O0dh" + }, + "source": [ + "#### 创建一个新的配置文件\n", + "\n", + "为了能够复用不同配置文件中常用的部分,我们支持多配置文件继承。比如模型微调 MobileNetV2 ,新的配置文件可以通过继承 `configs/_base_/models/mobilenet_v2_1x.py` 来创建模型的基本结构。\n", + "\n", + "根据以往的实践,我们通常把完整的配置拆分成四个部分:模型、数据集、优化器、运行设置。每个部分的配置单独保存到一个文件,并放在 `config/_base_` 的对应目录下。\n", + "\n", + "这样一来,在创建新的配置文件时,我们就可以选择继承若干个需要的配置文件,然后覆盖其中需要修改的部分内容。\n", + "\n", + "我们的新配置文件开头的继承部分为:\n", + "\n", + "```python\n", + "_base_ = [\n", + " '../_base_/models/mobilenet_v2_1x.py',\n", + " '../_base_/schedules/imagenet_bs256_epochstep.py',\n", + " '../_base_/default_runtime.py'\n", + "]\n", + "```\n", + "\n", + "这里,因为我们使用了一个新的数据集,所以没有继承任何数据集相关的配置。\n", + "\n", + "此外,也可以不使用这种继承的方式,而直接构建完整的配置文件,比如 `configs/mnist/lenet5.py`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_UV3oBhLRG8B" + }, + "source": [ + "之后,我们只需要设定配置文件中我们希望修改的部分,其他部分的设置会自动从继承的配置文件中读取。" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8QfM4qBeWIQh", + "outputId": "0e658dca-722e-4bed-dd0b-601731b00457" + }, + "source": [ + "%%writefile configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py\n", + "_base_ = [\n", + " '../_base_/models/mobilenet_v2_1x.py',\n", + " '../_base_/schedules/imagenet_bs256_epochstep.py',\n", + " '../_base_/default_runtime.py'\n", + "]\n", + "\n", + "# ---- 模型配置 ----\n", + "# 这里使用 init_cfg 来加载预训练模型,通过这种方式,只有主干网络的权重会被加载。\n", + "# 另外还修改了分类头部的 num_classes 来匹配我们的数据集。\n", + "\n", + "model = dict(\n", + " backbone=dict(\n", + " init_cfg = dict(\n", + " type='Pretrained', \n", + " checkpoint='https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth', \n", + " prefix='backbone')\n", + " ),\n", + " head=dict(\n", + " num_classes=2,\n", + " topk = (1, )\n", + " ))\n", + "\n", + "# ---- 数据集配置 ----\n", + "# 我们已经将数据集重新组织为 ImageNet 格式\n", + "dataset_type = 'ImageNet'\n", + "img_norm_cfg = dict(\n", + " mean=[124.508, 116.050, 106.438],\n", + " std=[58.577, 57.310, 57.437],\n", + " to_rgb=True)\n", + "train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='RandomResizedCrop', size=224, backend='pillow'),\n", + " dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),\n", + " dict(type='Normalize', **img_norm_cfg),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='ToTensor', keys=['gt_label']),\n", + " dict(type='Collect', keys=['img', 'gt_label'])\n", + "]\n", + "test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='Resize', size=(256, -1), backend='pillow'),\n", + " dict(type='CenterCrop', crop_size=224),\n", + " dict(type='Normalize', **img_norm_cfg),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + "]\n", + "data = dict(\n", + " # 设置每个 GPU 上的 batch size 和 workers 数, 根据你的硬件来修改这些选项。\n", + " samples_per_gpu=32,\n", + " workers_per_gpu=2,\n", + " # 指定训练集类型和路径\n", + " train=dict(\n", + " type=dataset_type,\n", + " data_prefix='data/cats_dogs_dataset/training_set/training_set',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=train_pipeline),\n", + " # 指定验证集类型和路径\n", + " val=dict(\n", + " type=dataset_type,\n", + " data_prefix='data/cats_dogs_dataset/val_set/val_set',\n", + " ann_file='data/cats_dogs_dataset/val.txt',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=test_pipeline),\n", + " # 指定测试集类型和路径\n", + " test=dict(\n", + " type=dataset_type,\n", + " data_prefix='data/cats_dogs_dataset/test_set/test_set',\n", + " ann_file='data/cats_dogs_dataset/test.txt',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=test_pipeline))\n", + "\n", + "# 设置验证指标\n", + "evaluation = dict(metric='accuracy', metric_options={'topk': (1, )})\n", + "\n", + "# ---- 优化器设置 ----\n", + "# 通常在微调任务中,我们需要一个较小的学习率,训练轮次可以较短。\n", + "# 设置学习率\n", + "optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0001)\n", + "optimizer_config = dict(grad_clip=None)\n", + "# 设置学习率调度器\n", + "lr_config = dict(policy='step', step=1, gamma=0.1)\n", + "runner = dict(type='EpochBasedRunner', max_epochs=2)\n", + "\n", + "# ---- 运行设置 ----\n", + "# 每 10 个训练批次输出一次日志\n", + "log_config = dict(interval=10)" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Writing configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "chLX7bL3RP2F" + }, + "source": [ + "#### 使用命令行进行模型微调\n", + "\n", + "我们使用 `tools/train.py` 进行模型微调:\n", + "\n", + "```\n", + "python tools/train.py ${CONFIG_FILE} [optional arguments]\n", + "```\n", + "\n", + "如果你希望指定训练过程中相关文件的保存位置,可以增加一个参数 `--work_dir ${YOUR_WORK_DIR}`.\n", + "\n", + "通过增加参数 `--seed ${SEED}`,设置随机种子以保证结果的可重复性,而参数 `--deterministic`则会启用 cudnn 的确定性选项,进一步保证可重复性,但可能降低些许效率。\n", + "\n", + "这里我们使用 `MobileNetV2` 和数据集 `CatsDogsDataset` 作为示例" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gbFGR4SBRUYN", + "outputId": "66019f0f-2ded-4fae-9a5f-ece9729a7c2d" + }, + "source": [ + "!python tools/train.py \\\n", + " configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py \\\n", + " --work-dir work_dirs/mobilenet_v2_1x_cats_dogs \\\n", + " --seed 0 \\\n", + " --deterministic" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/usr/local/lib/python3.7/dist-packages/mmcv/cnn/bricks/transformer.py:28: UserWarning: Fail to import ``MultiScaleDeformableAttention`` from ``mmcv.ops.multi_scale_deform_attn``, You should install ``mmcv-full`` if you need this module. \n", + " warnings.warn('Fail to import ``MultiScaleDeformableAttention`` from '\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/local/lib/python3.7/dist-packages/yaml/constructor.py:126: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", + " if not isinstance(key, collections.Hashable):\n", + "2021-10-21 02:53:42,465 - mmcls - INFO - Environment info:\n", + "------------------------------------------------------------\n", + "sys.platform: linux\n", + "Python: 3.7.12 (default, Sep 10 2021, 00:21:48) [GCC 7.5.0]\n", + "CUDA available: True\n", + "GPU 0: Tesla K80\n", + "CUDA_HOME: /usr/local/cuda\n", + "NVCC: Build cuda_11.1.TC455_06.29190527_0\n", + "GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "PyTorch: 1.9.0+cu111\n", + "PyTorch compiling details: PyTorch built with:\n", + " - GCC 7.3\n", + " - C++ Version: 201402\n", + " - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n", + " - Intel(R) MKL-DNN v2.1.2 (Git Hash 98be7e8afa711dc9b66c8ff3504129cb82013cdb)\n", + " - OpenMP 201511 (a.k.a. OpenMP 4.5)\n", + " - NNPACK is enabled\n", + " - CPU capability usage: AVX2\n", + " - CUDA Runtime 11.1\n", + " - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86\n", + " - CuDNN 8.0.5\n", + " - Magma 2.5.2\n", + " - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.1, CUDNN_VERSION=8.0.5, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.9.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n", + "\n", + "TorchVision: 0.10.0+cu111\n", + "OpenCV: 4.1.2\n", + "MMCV: 1.3.15\n", + "MMCV Compiler: n/a\n", + "MMCV CUDA Compiler: n/a\n", + "MMClassification: 0.16.0+77a3834\n", + "------------------------------------------------------------\n", + "\n", + "2021-10-21 02:53:42,465 - mmcls - INFO - Distributed training: False\n", + "2021-10-21 02:53:43,086 - mmcls - INFO - Config:\n", + "model = dict(\n", + " type='ImageClassifier',\n", + " backbone=dict(\n", + " type='MobileNetV2',\n", + " widen_factor=1.0,\n", + " init_cfg=dict(\n", + " type='Pretrained',\n", + " checkpoint=\n", + " 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth',\n", + " prefix='backbone')),\n", + " neck=dict(type='GlobalAveragePooling'),\n", + " head=dict(\n", + " type='LinearClsHead',\n", + " num_classes=2,\n", + " in_channels=1280,\n", + " loss=dict(type='CrossEntropyLoss', loss_weight=1.0),\n", + " topk=(1, )))\n", + "optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0001)\n", + "optimizer_config = dict(grad_clip=None)\n", + "lr_config = dict(policy='step', gamma=0.1, step=1)\n", + "runner = dict(type='EpochBasedRunner', max_epochs=2)\n", + "checkpoint_config = dict(interval=1)\n", + "log_config = dict(interval=10, hooks=[dict(type='TextLoggerHook')])\n", + "dist_params = dict(backend='nccl')\n", + "log_level = 'INFO'\n", + "load_from = None\n", + "resume_from = None\n", + "workflow = [('train', 1)]\n", + "dataset_type = 'ImageNet'\n", + "img_norm_cfg = dict(\n", + " mean=[124.508, 116.05, 106.438], std=[58.577, 57.31, 57.437], to_rgb=True)\n", + "train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='RandomResizedCrop', size=224, backend='pillow'),\n", + " dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='ToTensor', keys=['gt_label']),\n", + " dict(type='Collect', keys=['img', 'gt_label'])\n", + "]\n", + "test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='Resize', size=(256, -1), backend='pillow'),\n", + " dict(type='CenterCrop', crop_size=224),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + "]\n", + "data = dict(\n", + " samples_per_gpu=32,\n", + " workers_per_gpu=2,\n", + " train=dict(\n", + " type='ImageNet',\n", + " data_prefix='data/cats_dogs_dataset/training_set/training_set',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='RandomResizedCrop', size=224, backend='pillow'),\n", + " dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='ToTensor', keys=['gt_label']),\n", + " dict(type='Collect', keys=['img', 'gt_label'])\n", + " ]),\n", + " val=dict(\n", + " type='ImageNet',\n", + " data_prefix='data/cats_dogs_dataset/val_set/val_set',\n", + " ann_file='data/cats_dogs_dataset/val.txt',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='Resize', size=(256, -1), backend='pillow'),\n", + " dict(type='CenterCrop', crop_size=224),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ]),\n", + " test=dict(\n", + " type='ImageNet',\n", + " data_prefix='data/cats_dogs_dataset/test_set/test_set',\n", + " ann_file='data/cats_dogs_dataset/test.txt',\n", + " classes='data/cats_dogs_dataset/classes.txt',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='Resize', size=(256, -1), backend='pillow'),\n", + " dict(type='CenterCrop', crop_size=224),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[124.508, 116.05, 106.438],\n", + " std=[58.577, 57.31, 57.437],\n", + " to_rgb=True),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ]))\n", + "evaluation = dict(metric='accuracy', metric_options=dict(topk=(1, )))\n", + "work_dir = 'work_dirs/mobilenet_v2_1x_cats_dogs'\n", + "gpu_ids = range(0, 1)\n", + "\n", + "2021-10-21 02:53:43,086 - mmcls - INFO - Set random seed to 0, deterministic: True\n", + "2021-10-21 02:53:43,251 - mmcls - INFO - initialize MobileNetV2 with init_cfg {'type': 'Pretrained', 'checkpoint': 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth', 'prefix': 'backbone'}\n", + "2021-10-21 02:53:43,252 - mmcv - INFO - load backbone in model from: https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\n", + "Use load_from_http loader\n", + "Downloading: \"https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\" to /root/.cache/torch/hub/checkpoints/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth\n", + "100% 13.5M/13.5M [00:01<00:00, 9.62MB/s]\n", + "2021-10-21 02:53:46,164 - mmcls - INFO - initialize LinearClsHead with init_cfg {'type': 'Normal', 'layer': 'Linear', 'std': 0.01}\n", + "2021-10-21 02:54:01,365 - mmcls - INFO - Start running, host: root@3a8df14fab46, work_dir: /content/mmclassification/work_dirs/mobilenet_v2_1x_cats_dogs\n", + "2021-10-21 02:54:01,365 - mmcls - INFO - Hooks will be executed in the following order:\n", + "before_run:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_train_epoch:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_train_iter:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + " -------------------- \n", + "after_train_iter:\n", + "(ABOVE_NORMAL) OptimizerHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "after_train_epoch:\n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_val_epoch:\n", + "(LOW ) IterTimerHook \n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "before_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_epoch:\n", + "(VERY_LOW ) TextLoggerHook \n", + " -------------------- \n", + "2021-10-21 02:54:01,365 - mmcls - INFO - workflow: [('train', 1)], max: 2 epochs\n", + "2021-10-21 02:54:07,010 - mmcls - INFO - Epoch [1][10/201]\tlr: 5.000e-03, eta: 0:03:34, time: 0.548, data_time: 0.260, memory: 1709, loss: 0.3917\n", + "2021-10-21 02:54:09,888 - mmcls - INFO - Epoch [1][20/201]\tlr: 5.000e-03, eta: 0:02:39, time: 0.288, data_time: 0.021, memory: 1709, loss: 0.3508\n", + "2021-10-21 02:54:12,795 - mmcls - INFO - Epoch [1][30/201]\tlr: 5.000e-03, eta: 0:02:19, time: 0.291, data_time: 0.020, memory: 1709, loss: 0.3955\n", + "2021-10-21 02:54:15,744 - mmcls - INFO - Epoch [1][40/201]\tlr: 5.000e-03, eta: 0:02:08, time: 0.295, data_time: 0.019, memory: 1709, loss: 0.2485\n", + "2021-10-21 02:54:18,667 - mmcls - INFO - Epoch [1][50/201]\tlr: 5.000e-03, eta: 0:02:00, time: 0.292, data_time: 0.021, memory: 1709, loss: 0.4196\n", + "2021-10-21 02:54:21,590 - mmcls - INFO - Epoch [1][60/201]\tlr: 5.000e-03, eta: 0:01:54, time: 0.293, data_time: 0.022, memory: 1709, loss: 0.4994\n", + "2021-10-21 02:54:24,496 - mmcls - INFO - Epoch [1][70/201]\tlr: 5.000e-03, eta: 0:01:48, time: 0.291, data_time: 0.021, memory: 1709, loss: 0.4372\n", + "2021-10-21 02:54:27,400 - mmcls - INFO - Epoch [1][80/201]\tlr: 5.000e-03, eta: 0:01:44, time: 0.290, data_time: 0.020, memory: 1709, loss: 0.3179\n", + "2021-10-21 02:54:30,313 - mmcls - INFO - Epoch [1][90/201]\tlr: 5.000e-03, eta: 0:01:39, time: 0.292, data_time: 0.020, memory: 1709, loss: 0.3175\n", + "2021-10-21 02:54:33,208 - mmcls - INFO - Epoch [1][100/201]\tlr: 5.000e-03, eta: 0:01:35, time: 0.289, data_time: 0.020, memory: 1709, loss: 0.3412\n", + "2021-10-21 02:54:36,129 - mmcls - INFO - Epoch [1][110/201]\tlr: 5.000e-03, eta: 0:01:31, time: 0.292, data_time: 0.021, memory: 1709, loss: 0.2985\n", + "2021-10-21 02:54:39,067 - mmcls - INFO - Epoch [1][120/201]\tlr: 5.000e-03, eta: 0:01:28, time: 0.294, data_time: 0.021, memory: 1709, loss: 0.2778\n", + "2021-10-21 02:54:41,963 - mmcls - INFO - Epoch [1][130/201]\tlr: 5.000e-03, eta: 0:01:24, time: 0.289, data_time: 0.020, memory: 1709, loss: 0.2229\n", + "2021-10-21 02:54:44,861 - mmcls - INFO - Epoch [1][140/201]\tlr: 5.000e-03, eta: 0:01:21, time: 0.290, data_time: 0.021, memory: 1709, loss: 0.2318\n", + "2021-10-21 02:54:47,782 - mmcls - INFO - Epoch [1][150/201]\tlr: 5.000e-03, eta: 0:01:17, time: 0.293, data_time: 0.020, memory: 1709, loss: 0.2333\n", + "2021-10-21 02:54:50,682 - mmcls - INFO - Epoch [1][160/201]\tlr: 5.000e-03, eta: 0:01:14, time: 0.290, data_time: 0.020, memory: 1709, loss: 0.2783\n", + "2021-10-21 02:54:53,595 - mmcls - INFO - Epoch [1][170/201]\tlr: 5.000e-03, eta: 0:01:11, time: 0.291, data_time: 0.019, memory: 1709, loss: 0.2132\n", + "2021-10-21 02:54:56,499 - mmcls - INFO - Epoch [1][180/201]\tlr: 5.000e-03, eta: 0:01:07, time: 0.290, data_time: 0.021, memory: 1709, loss: 0.2096\n", + "2021-10-21 02:54:59,381 - mmcls - INFO - Epoch [1][190/201]\tlr: 5.000e-03, eta: 0:01:04, time: 0.288, data_time: 0.023, memory: 1709, loss: 0.1729\n", + "2021-10-21 02:55:02,270 - mmcls - INFO - Epoch [1][200/201]\tlr: 5.000e-03, eta: 0:01:01, time: 0.288, data_time: 0.020, memory: 1709, loss: 0.1969\n", + "2021-10-21 02:55:02,313 - mmcls - INFO - Saving checkpoint at 1 epochs\n", + "[ ] 0/1601, elapsed: 0s, ETA:[W pthreadpool-cpp.cc:90] Warning: Leaking Caffe2 thread-pool after fork. (function pthreadpool)\n", + "[W pthreadpool-cpp.cc:90] Warning: Leaking Caffe2 thread-pool after fork. (function pthreadpool)\n", + "[>>] 1601/1601, 171.8 task/s, elapsed: 9s, ETA: 0s2021-10-21 02:55:11,743 - mmcls - INFO - Epoch(val) [1][51]\taccuracy_top-1: 95.6277\n", + "2021-10-21 02:55:16,920 - mmcls - INFO - Epoch [2][10/201]\tlr: 5.000e-04, eta: 0:00:59, time: 0.501, data_time: 0.237, memory: 1709, loss: 0.1764\n", + "2021-10-21 02:55:19,776 - mmcls - INFO - Epoch [2][20/201]\tlr: 5.000e-04, eta: 0:00:56, time: 0.286, data_time: 0.021, memory: 1709, loss: 0.1514\n", + "2021-10-21 02:55:22,637 - mmcls - INFO - Epoch [2][30/201]\tlr: 5.000e-04, eta: 0:00:52, time: 0.286, data_time: 0.019, memory: 1709, loss: 0.1395\n", + "2021-10-21 02:55:25,497 - mmcls - INFO - Epoch [2][40/201]\tlr: 5.000e-04, eta: 0:00:49, time: 0.286, data_time: 0.020, memory: 1709, loss: 0.1508\n", + "2021-10-21 02:55:28,338 - mmcls - INFO - Epoch [2][50/201]\tlr: 5.000e-04, eta: 0:00:46, time: 0.284, data_time: 0.018, memory: 1709, loss: 0.1771\n", + "2021-10-21 02:55:31,214 - mmcls - INFO - Epoch [2][60/201]\tlr: 5.000e-04, eta: 0:00:43, time: 0.287, data_time: 0.019, memory: 1709, loss: 0.1438\n", + "2021-10-21 02:55:34,075 - mmcls - INFO - Epoch [2][70/201]\tlr: 5.000e-04, eta: 0:00:40, time: 0.286, data_time: 0.020, memory: 1709, loss: 0.1321\n", + "2021-10-21 02:55:36,921 - mmcls - INFO - Epoch [2][80/201]\tlr: 5.000e-04, eta: 0:00:36, time: 0.285, data_time: 0.023, memory: 1709, loss: 0.1629\n", + "2021-10-21 02:55:39,770 - mmcls - INFO - Epoch [2][90/201]\tlr: 5.000e-04, eta: 0:00:33, time: 0.285, data_time: 0.018, memory: 1709, loss: 0.1574\n", + "2021-10-21 02:55:42,606 - mmcls - INFO - Epoch [2][100/201]\tlr: 5.000e-04, eta: 0:00:30, time: 0.284, data_time: 0.019, memory: 1709, loss: 0.1220\n", + "2021-10-21 02:55:45,430 - mmcls - INFO - Epoch [2][110/201]\tlr: 5.000e-04, eta: 0:00:27, time: 0.282, data_time: 0.021, memory: 1709, loss: 0.2550\n", + "2021-10-21 02:55:48,280 - mmcls - INFO - Epoch [2][120/201]\tlr: 5.000e-04, eta: 0:00:24, time: 0.285, data_time: 0.021, memory: 1709, loss: 0.1528\n", + "2021-10-21 02:55:51,131 - mmcls - INFO - Epoch [2][130/201]\tlr: 5.000e-04, eta: 0:00:21, time: 0.285, data_time: 0.020, memory: 1709, loss: 0.1223\n", + "2021-10-21 02:55:53,983 - mmcls - INFO - Epoch [2][140/201]\tlr: 5.000e-04, eta: 0:00:18, time: 0.285, data_time: 0.019, memory: 1709, loss: 0.1734\n", + "2021-10-21 02:55:56,823 - mmcls - INFO - Epoch [2][150/201]\tlr: 5.000e-04, eta: 0:00:15, time: 0.284, data_time: 0.022, memory: 1709, loss: 0.1527\n", + "2021-10-21 02:55:59,645 - mmcls - INFO - Epoch [2][160/201]\tlr: 5.000e-04, eta: 0:00:12, time: 0.283, data_time: 0.021, memory: 1709, loss: 0.1910\n", + "2021-10-21 02:56:02,514 - mmcls - INFO - Epoch [2][170/201]\tlr: 5.000e-04, eta: 0:00:09, time: 0.287, data_time: 0.019, memory: 1709, loss: 0.1922\n", + "2021-10-21 02:56:05,375 - mmcls - INFO - Epoch [2][180/201]\tlr: 5.000e-04, eta: 0:00:06, time: 0.286, data_time: 0.018, memory: 1709, loss: 0.1760\n", + "2021-10-21 02:56:08,241 - mmcls - INFO - Epoch [2][190/201]\tlr: 5.000e-04, eta: 0:00:03, time: 0.287, data_time: 0.019, memory: 1709, loss: 0.1739\n", + "2021-10-21 02:56:11,081 - mmcls - INFO - Epoch [2][200/201]\tlr: 5.000e-04, eta: 0:00:00, time: 0.282, data_time: 0.019, memory: 1709, loss: 0.1654\n", + "2021-10-21 02:56:11,125 - mmcls - INFO - Saving checkpoint at 2 epochs\n", + "[>>] 1601/1601, 170.9 task/s, elapsed: 9s, ETA: 0s2021-10-21 02:56:20,592 - mmcls - INFO - Epoch(val) [2][51]\taccuracy_top-1: 97.5016\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m_ZSkwB5Rflb" + }, + "source": [ + "### 测试模型\n", + "\n", + "使用 `tools/test.py` 对模型进行测试:\n", + "\n", + "```\n", + "python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [optional arguments]\n", + "```\n", + "\n", + "这里有一些可选参数可以进行配置:\n", + "\n", + "- `--metrics`: 评价指标。可以在数据集类中找到所有可用的选择,一般对单标签分类任务,我们都可以使用 \"accuracy\" 进行评价。\n", + "- `--metric-options`: 传递给评价指标的自定义参数。比如指定了 \"topk=1\",那么就会计算 \"top-1 accuracy\"。\n", + "\n", + "更多细节请参看 `tools/test.py` 的帮助文档。\n", + "\n", + "这里使用我们微调好的 `MobileNetV2` 模型进行测试" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Zd4EM00QRtyc", + "outputId": "e0be9ba6-47f5-45d9-cca2-d2c5a38b1407" + }, + "source": [ + "!python tools/test.py configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py work_dirs/mobilenet_v2_1x_cats_dogs/latest.pth --metrics accuracy --metric-options topk=1" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/usr/local/lib/python3.7/dist-packages/mmcv/cnn/bricks/transformer.py:28: UserWarning: Fail to import ``MultiScaleDeformableAttention`` from ``mmcv.ops.multi_scale_deform_attn``, You should install ``mmcv-full`` if you need this module. \n", + " warnings.warn('Fail to import ``MultiScaleDeformableAttention`` from '\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/local/lib/python3.7/dist-packages/yaml/constructor.py:126: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", + " if not isinstance(key, collections.Hashable):\n", + "Use load_from_local loader\n", + "[>>] 2023/2023, 169.7 task/s, elapsed: 12s, ETA: 0s\n", + "accuracy : 97.38\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IwThQkjaRwF7" + }, + "source": [ + "### 推理计算\n", + "\n", + "有时我们会希望保存模型在数据集上的推理结果,可以使用如下命令:\n", + "\n", + "```shell\n", + "python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}]\n", + "```\n", + "\n", + "参数:\n", + "\n", + "- `--out`: 输出结果的文件名。如果不指定,计算结果不会被保存。支持的格式包括json, pkl 和 yml\n", + "- `--out-items`: 哪些推理结果需要被保存,可以从 \"class_scores\", \"pred_score\", \"pred_label\" 和 \"pred_class\" 中选择若干个,或者使用 \"all\" 来保存所有推理结果。\n", + "\n", + "这些项的具体含义:\n", + "- `class_scores`: 各个样本在每个类上的分类得分。\n", + "- `pred_score`: 各个样本在预测类上的分类得分。\n", + "- `pred_label`: 各个样本预测类的标签。标签文本将会从模型权重文件中读取,如果模型权重文件中没有标签文本,则会使用 ImageNet 的标签文本。\n", + "- `pred_class`: 各个样本预测类的 id,为一组整数。\n", + "- `all`: 保存以上所有项。\n", + "- `none`: 不保存以上任何项。因为输出文件除了推理结果,还会保存评价指标,如果你只希望保存总体评价指标,可以设置不保存任何项,可以大幅减小输出文件大小。" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6GVKloPHR0Fn", + "outputId": "1efde0e4-97cd-4e62-ce98-1cbc79da3a6c" + }, + "source": [ + "!python tools/test.py configs/mobilenet_v2/mobilenet_v2_1x_cats_dogs.py work_dirs/mobilenet_v2_1x_cats_dogs/latest.pth --out results.json --out-items all" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/usr/local/lib/python3.7/dist-packages/mmcv/cnn/bricks/transformer.py:28: UserWarning: Fail to import ``MultiScaleDeformableAttention`` from ``mmcv.ops.multi_scale_deform_attn``, You should install ``mmcv-full`` if you need this module. \n", + " warnings.warn('Fail to import ``MultiScaleDeformableAttention`` from '\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", + " return f(*args, **kwds)\n", + "/usr/local/lib/python3.7/dist-packages/yaml/constructor.py:126: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", + " if not isinstance(key, collections.Hashable):\n", + "Use load_from_local loader\n", + "[>>] 2023/2023, 170.3 task/s, elapsed: 12s, ETA: 0s\n", + "dumping results to results.json\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "G0NJI1s6e3FD" + }, + "source": [ + "导出的json 文件中保存了所有样本的推理结果、分类结果和分类得分" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 370 + }, + "id": "HJdJeLUafFhX", + "outputId": "486c0652-2124-419a-ec7d-fd3583baedb1" + }, + "source": [ + "import json\n", + "\n", + "with open(\"./results.json\", 'r') as f:\n", + " results = json.load(f)\n", + "\n", + "# 展示第一张图片的结果信息\n", + "print('class_scores:', results['class_scores'][0])\n", + "print('pred_class:', results['pred_class'][0])\n", + "print('pred_label:', results['pred_label'][0])\n", + "print('pred_score:', results['pred_score'][0])\n", + "Image.open('data/cats_dogs_dataset/training_set/training_set/cats/cat.1.jpg')" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "class_scores: [1.0, 5.184615757547473e-13]\n", + "pred_class: cats\n", + "pred_label: 0\n", + "pred_score: 1.0\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 15 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1bEUwwzcVG8o" + }, + "source": [ + "也可以使用 MMClassification 提供的可视化函数 imshow_infos 更好地展示预测结果。" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "BcSNyvAWRx20", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 304 + }, + "outputId": "1db811f7-9637-44c4-8aec-330f5765e20c" + }, + "source": [ + "from mmcls.core.visualization import imshow_infos\n", + "\n", + "filepath = 'data/cats_dogs_dataset/training_set/training_set/cats/cat.1.jpg'\n", + "\n", + "result = {\n", + " 'pred_class': results['pred_class'][0],\n", + " 'pred_label': results['pred_label'][0],\n", + " 'pred_score': results['pred_score'][0],\n", + "}\n", + "\n", + "img = imshow_infos(filepath, result)" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + } + } + ] + } + ] +} diff --git a/docs/zh_CN/tutorials/config.md b/docs/zh_CN/tutorials/config.md new file mode 100644 index 0000000..9e9c87e --- /dev/null +++ b/docs/zh_CN/tutorials/config.md @@ -0,0 +1,417 @@ +# 教程 1:如何编写配置文件 + +MMClassification 主要使用 python 文件作为配置文件。其配置文件系统的设计将模块化与继承整合进来,方便用户进行各种实验。所有配置文件都放置在 `configs` 文件夹下,主要包含 `_base_` 原始配置文件夹 以及 `resnet`, `swin_transformer`,`vision_transformer` 等诸多算法文件夹。 + +可以使用 `python tools/misc/print_config.py /PATH/TO/CONFIG` 命令来查看完整的配置信息,从而方便检查所对应的配置文件。 + + + +- [配置文件以及权重命名规则](#配置文件以及权重命名规则) +- [配置文件结构](#配置文件结构) +- [继承并修改配置文件](#继承并修改配置文件) + - [使用配置文件里的中间变量](#使用配置文件里的中间变量) + - [忽略基础配置文件里的部分内容](#忽略基础配置文件里的部分内容) + - [引用基础配置文件里的变量](#引用基础配置文件里的变量) +- [通过命令行参数修改配置信息](#通过命令行参数修改配置信息) +- [导入用户自定义模块](#导入用户自定义模块) +- [常见问题](#常见问题) + + + +## 配置文件以及权重命名规则 + +MMClassification 按照以下风格进行配置文件命名,代码库的贡献者需要遵循相同的命名规则。文件名总体分为四部分:算法信息,模块信息,训练信息和数据信息。逻辑上属于不同部分的单词之间用下划线 `'_'` 连接,同一部分有多个单词用短横线 `'-'` 连接。 + +``` +{algorithm info}_{module info}_{training info}_{data info}.py +``` + +- `algorithm info`:算法信息,算法名称或者网络架构,如 resnet 等; +- `module info`: 模块信息,因任务而异,用以表示一些特殊的 neck、head 和 pretrain 信息; +- `training info`:一些训练信息,训练策略设置,包括 batch size,schedule 数据增强等; +- `data info`:数据信息,数据集名称、模态、输入尺寸等,如 imagenet, cifar 等; + +### 算法信息 + +指论文中的算法名称缩写,以及相应的分支架构信息。例如: + +- `resnet50` +- `mobilenet-v3-large` +- `vit-small-patch32` : `patch32` 表示 `ViT` 切分的分块大小 +- `seresnext101-32x4d` : `SeResNet101` 基本网络结构,`32x4d` 表示在 `Bottleneck` 中 `groups` 和 `width_per_group` 分别为32和4 + +### 模块信息 + +指一些特殊的 `neck` 、`head` 或者 `pretrain` 的信息, 在分类中常见为预训练信息,比如: + +- `in21k-pre` : 在 `ImageNet21k` 上预训练 +- `in21k-pre-3rd-party` : 在 `ImageNet21k` 上预训练,其权重来自其他仓库 + +### 训练信息 + +训练策略的一些设置,包括训练类型、 `batch size`、 `lr schedule`、 数据增强以及特殊的损失函数等等,比如: +Batch size 信息: + +- 格式为`{gpu x batch_per_gpu}`, 如 `8xb32` + +训练类型(主要见于 transformer 网络,如 `ViT` 算法,这类算法通常分为预训练和微调两种模式): + +- `ft` : Finetune config,用于微调的配置文件 +- `pt` : Pretrain config,用于预训练的配置文件 + +训练策略信息,训练策略以复现配置文件为基础,此基础不必标注训练策略。但如果在此基础上进行改进,则需注明训练策略,按照应用点位顺序排列,如:`{pipeline aug}-{train aug}-{loss trick}-{scheduler}-{epochs}` + +- `coslr-200e` : 使用 cosine scheduler, 训练 200 个 epoch +- `autoaug-mixup-lbs-coslr-50e` : 使用了 `autoaug`、`mixup`、`label smooth`、`cosine scheduler`, 训练了 50 个轮次 + +### 数据信息 + +- `in1k` : `ImageNet1k` 数据集,默认使用 `224x224` 大小的图片 +- `in21k` : `ImageNet21k` 数据集,有些地方也称为 `ImageNet22k` 数据集,默认使用 `224x224` 大小的图片 +- `in1k-384px` : 表示训练的输出图片大小为 `384x384` +- `cifar100` + +### 配置文件命名案例: + +``` +repvgg-D2se_deploy_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py +``` + +- `repvgg-D2se`: 算法信息 + - `repvgg`: 主要算法名称。 + - `D2se`: 模型的结构。 +- `deploy`:模块信息,该模型为推理状态。 +- `4xb64-autoaug-lbs-mixup-coslr-200e`: 训练信息 + - `4xb64`: 使用4块 GPU 并且 每块 GPU 的批大小为64。 + - `autoaug`: 使用 `AutoAugment` 数据增强方法。 + - `lbs`: 使用 `label smoothing` 损失函数。 + - `mixup`: 使用 `mixup` 训练增强方法。 + - `coslr`: 使用 `cosine scheduler` 优化策略。 + - `200e`: 训练 200 轮次。 +- `in1k`: 数据信息。 配置文件用于 `ImageNet1k` 数据集上使用 `224x224` 大小图片训练。 + +```{note} +部分配置文件目前还没有遵循此命名规范,相关文件命名近期会更新。 +``` + +### 权重命名规则 + +权重的命名主要包括配置文件名,日期和哈希值。 + +``` +{config_name}_{date}-{hash}.pth +``` + +## 配置文件结构 + +在 `configs/_base_` 文件夹下有 4 个基本组件类型,分别是: + +- [模型(model)](https://github.com/open-mmlab/mmclassification/tree/master/configs/_base_/models) +- [数据(data)](https://github.com/open-mmlab/mmclassification/tree/master/configs/_base_/datasets) +- [训练策略(schedule)](https://github.com/open-mmlab/mmclassification/tree/master/configs/_base_/schedules) +- [运行设置(runtime)](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/default_runtime.py) + +你可以通过继承一些基本配置文件轻松构建自己的训练配置文件。由来自`_base_` 的组件组成的配置称为 _primitive_。 + +为了帮助用户对 MMClassification 检测系统中的完整配置和模块有一个基本的了解,我们使用 [ResNet50 原始配置文件](https://github.com/open-mmlab/mmclassification/blob/master/configs/resnet/resnet50_8xb32_in1k.py) 作为案例进行说明并注释每一行含义。更详细的用法和各个模块对应的替代方案,请参考 API 文档。 + +```python +_base_ = [ + '../_base_/models/resnet50.py', # 模型 + '../_base_/datasets/imagenet_bs32.py', # 数据 + '../_base_/schedules/imagenet_bs256.py', # 训练策略 + '../_base_/default_runtime.py' # 默认运行设置 +] +``` + +下面对这四个部分分别进行说明,仍然以上述 ResNet50 原始配置文件作为案例。 + +### 模型 + +模型参数 `model` 在配置文件中为一个 `python` 字典,主要包括网络结构、损失函数等信息: + +- `type` : 分类器名称, 目前 MMClassification 只支持 `ImageClassifier`, 参考 [API 文档](https://mmclassification.readthedocs.io/zh_CN/latest/api/models.html#classifier)。 +- `backbone` : 主干网类型,可用选项参考 [API 文档](https://mmclassification.readthedocs.io/zh_CN/latest/api/models.html#backbones)。 +- `neck` : 颈网络类型,目前 MMClassification 只支持 `GlobalAveragePooling`, 参考 [API 文档](https://mmclassification.readthedocs.io/zh_CN/latest/api/models.html#necks)。 +- `head` : 头网络类型, 包括单标签分类与多标签分类头网络,可用选项参考 [API 文档](https://mmclassification.readthedocs.io/zh_CN/latest/api/models.html#heads)。 + - `loss` : 损失函数类型, 支持 `CrossEntropyLoss`, [`LabelSmoothLoss`](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/models/resnet50_label_smooth.py) 等,可用选项参考 [API 文档](https://mmclassification.readthedocs.io/zh_CN/latest/api/models.html#losses)。 +- `train_cfg` :训练配置, 支持 [`mixup`](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/models/resnet50_mixup.py), [`cutmix`](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/models/resnet50_cutmix.py) 等训练增强。 + +```{note} +配置文件中的 'type' 不是构造时的参数,而是类名。 +``` + +```python +model = dict( + type='ImageClassifier', # 分类器类型 + backbone=dict( + type='ResNet', # 主干网络类型 + depth=50, # 主干网网络深度, ResNet 一般有18, 34, 50, 101, 152 可以选择 + num_stages=4, # 主干网络状态(stages)的数目,这些状态产生的特征图作为后续的 head 的输入。 + out_indices=(3, ), # 输出的特征图输出索引。越远离输入图像,索引越大 + frozen_stages=-1, # 网络微调时,冻结网络的stage(训练时不执行反相传播算法),若num_stages=4,backbone包含stem 与 4 个 stages。frozen_stages为-1时,不冻结网络; 为0时,冻结 stem; 为1时,冻结 stem 和 stage1; 为4时,冻结整个backbone + style='pytorch'), # 主干网络的风格,'pytorch' 意思是步长为2的层为 3x3 卷积, 'caffe' 意思是步长为2的层为 1x1 卷积。 + neck=dict(type='GlobalAveragePooling'), # 颈网络类型 + head=dict( + type='LinearClsHead', # 线性分类头, + num_classes=1000, # 输出类别数,这与数据集的类别数一致 + in_channels=2048, # 输入通道数,这与 neck 的输出通道一致 + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), # 损失函数配置信息 + topk=(1, 5), # 评估指标,Top-k 准确率, 这里为 top1 与 top5 准确率 + )) +``` + +### 数据 + +数据参数 `data` 在配置文件中为一个 `python` 字典,主要包含构造数据集加载器(dataloader)配置信息: + +- `samples_per_gpu` : 构建 dataloader 时,每个 GPU 的 Batch Size +- `workers_per_gpu` : 构建 dataloader 时,每个 GPU 的 线程数 +- `train | val | test` : 构造数据集 + - `type` : 数据集类型, MMClassification 支持 `ImageNet`、 `Cifar` 等 ,参考[API 文档](https://mmclassification.readthedocs.io/zh_CN/latest/api/datasets.html) + - `data_prefix` : 数据集根目录 + - `pipeline` : 数据处理流水线,参考相关教程文档 [如何设计数据处理流水线](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/data_pipeline.html) + +评估参数 `evaluation` 也是一个字典, 为 `evaluation hook` 的配置信息, 主要包括评估间隔、评估指标等。 + +```python +# dataset settings +dataset_type = 'ImageNet' # 数据集名称, +img_norm_cfg = dict( #图像归一化配置,用来归一化输入的图像。 + mean=[123.675, 116.28, 103.53], # 预训练里用于预训练主干网络模型的平均值。 + std=[58.395, 57.12, 57.375], # 预训练里用于预训练主干网络模型的标准差。 + to_rgb=True) # 是否反转通道,使用 cv2, mmcv 读取图片默认为 BGR 通道顺序,这里 Normalize 均值方差数组的数值是以 RGB 通道顺序, 因此需要反转通道顺序。 +# 训练数据流水线 +train_pipeline = [ + dict(type='LoadImageFromFile'), # 读取图片 + dict(type='RandomResizedCrop', size=224), # 随机缩放抠图 + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), # 以概率为0.5随机水平翻转图片 + dict(type='Normalize', **img_norm_cfg), # 归一化 + dict(type='ImageToTensor', keys=['img']), # image 转为 torch.Tensor + dict(type='ToTensor', keys=['gt_label']), # gt_label 转为 torch.Tensor + dict(type='Collect', keys=['img', 'gt_label']) # 决定数据中哪些键应该传递给检测器的流程 +] +# 测试数据流水线 +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=(256, -1)), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) # test 时不传递 gt_label +] +data = dict( + samples_per_gpu=32, # 单个 GPU 的 Batch size + workers_per_gpu=2, # 单个 GPU 的 线程数 + train=dict( # 训练数据信息 + type=dataset_type, # 数据集名称 + data_prefix='data/imagenet/train', # 数据集目录,当不存在 ann_file 时,类别信息从文件夹自动获取 + pipeline=train_pipeline), # 数据集需要经过的 数据流水线 + val=dict( # 验证数据集信息 + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', # 标注文件路径,存在 ann_file 时,不通过文件夹自动获取类别信息 + pipeline=test_pipeline), + test=dict( # 测试数据集信息 + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) +evaluation = dict( # evaluation hook 的配置 + interval=1, # 验证期间的间隔,单位为 epoch 或者 iter, 取决于 runner 类型。 + metric='accuracy') # 验证期间使用的指标。 +``` + +### 训练策略 + +主要包含 优化器设置、 `optimizer hook` 设置、学习率策略和 `runner`设置: + +- `optimizer` : 优化器设置信息, 支持 `pytorch` 所有的优化器,参考相关 [mmcv](https://mmcv.readthedocs.io/zh_CN/latest/_modules/mmcv/runner/optimizer/default_constructor.html#DefaultOptimizerConstructor) 文档 +- `optimizer_config` : `optimizer hook` 的配置文件,如设置梯度限制,参考相关 [mmcv](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py#L8) 代码 +- `lr_config` : 学习率策略,支持 "CosineAnnealing"、 "Step"、 "Cyclic" 等等,参考相关 [mmcv](https://mmcv.readthedocs.io/zh_CN/latest/_modules/mmcv/runner/hooks/lr_updater.html#LrUpdaterHook) 文档 +- `runner` : 有关 `runner` 可以参考 `mmcv` 对于 [`runner`](https://mmcv.readthedocs.io/zh_CN/latest/understand_mmcv/runner.html) 介绍文档 + +```python +# 用于构建优化器的配置文件。支持 PyTorch 中的所有优化器,同时它们的参数与 PyTorch 里的优化器参数一致。 +optimizer = dict(type='SGD', # 优化器类型 + lr=0.1, # 优化器的学习率,参数的使用细节请参照对应的 PyTorch 文档。 + momentum=0.9, # 动量(Momentum) + weight_decay=0.0001) # 权重衰减系数(weight decay)。 + # optimizer hook 的配置文件 +optimizer_config = dict(grad_clip=None) # 大多数方法不使用梯度限制(grad_clip)。 +# 学习率调整配置,用于注册 LrUpdater hook。 +lr_config = dict(policy='step', # 调度流程(scheduler)的策略,也支持 CosineAnnealing, Cyclic, 等。 + step=[30, 60, 90]) # 在 epoch 为 30, 60, 90 时, lr 进行衰减 +runner = dict(type='EpochBasedRunner', # 将使用的 runner 的类别,如 IterBasedRunner 或 EpochBasedRunner。 + max_epochs=100) # runner 总回合数, 对于 IterBasedRunner 使用 `max_iters` +``` + +### 运行设置 + +本部分主要包括保存权重策略、日志配置、训练参数、断点权重路径和工作目录等等。 + +```python +# Checkpoint hook 的配置文件。 +checkpoint_config = dict(interval=1) # 保存的间隔是 1,单位会根据 runner 不同变动,可以为 epoch 或者 iter。 +# 日志配置信息。 +log_config = dict( + interval=100, # 打印日志的间隔, 单位 iters + hooks=[ + dict(type='TextLoggerHook'), # 用于记录训练过程的文本记录器(logger)。 + # dict(type='TensorboardLoggerHook') # 同样支持 Tensorboard 日志 + ]) + +dist_params = dict(backend='nccl') # 用于设置分布式训练的参数,端口也同样可被设置。 +log_level = 'INFO' # 日志的输出级别。 +resume_from = None # 从给定路径里恢复检查点(checkpoints),训练模式将从检查点保存的轮次开始恢复训练。 +workflow = [('train', 1)] # runner 的工作流程,[('train', 1)] 表示只有一个工作流且工作流仅执行一次。 +work_dir = 'work_dir' # 用于保存当前实验的模型检查点和日志的目录文件地址。 +``` + +## 继承并修改配置文件 + +为了精简代码、更快的修改配置文件以及便于理解,我们建议继承现有方法。 + +对于在同一算法文件夹下的所有配置文件,MMClassification 推荐只存在 **一个** 对应的 _原始配置_ 文件。 +所有其他的配置文件都应该继承 _原始配置_ 文件,这样就能保证配置文件的最大继承深度为 3。 + +例如,如果在 ResNet 的基础上做了一些修改,用户首先可以通过指定 `_base_ = './resnet50_8xb32_in1k.py'`(相对于你的配置文件的路径),来继承基础的 ResNet 结构、数据集以及其他训练配置信息,然后修改配置文件中的必要参数以完成继承。如想在基础 resnet50 的基础上将训练轮数由 100 改为 300 和修改学习率衰减轮数,同时修改数据集路径,可以建立新的配置文件 `configs/resnet/resnet50_8xb32-300e_in1k.py`, 文件中写入以下内容: + +```python +_base_ = './resnet50_8xb32_in1k.py' + +runner = dict(max_epochs=300) +lr_config = dict(step=[150, 200, 250]) + +data = dict( + train=dict(data_prefix='mydata/imagenet/train'), + val=dict(data_prefix='mydata/imagenet/train', ), + test=dict(data_prefix='mydata/imagenet/train', ) +) +``` + +### 使用配置文件里的中间变量 + +用一些中间变量,中间变量让配置文件更加清晰,也更容易修改。 + +例如数据集里的 `train_pipeline` / `test_pipeline` 是作为数据流水线的中间变量。我们首先要定义 `train_pipeline` / `test_pipeline`,然后将它们传递到 `data` 中。如果想修改训练或测试时输入图片的大小,就需要修改 `train_pipeline` / `test_pipeline` 这些中间变量。 + +```python +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=384, backend='pillow',), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=384, backend='pillow'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +``` + +### 忽略基础配置文件里的部分内容 + +有时,您需要设置 `_delete_=True` 去忽略基础配置文件里的一些域内容。 可以参照 [mmcv](https://mmcv.readthedocs.io/zh_CN/latest/understand_mmcv/config.html#inherit-from-base-config-with-ignored-fields) 来获得一些简单的指导。 + +以下是一个简单应用案例。 如果在上述 ResNet50 案例中 使用 cosine schedule ,使用继承并直接修改会报 `get unexcepected keyword 'step'` 错, 因为基础配置文件 lr_config 域信息的 `'step'` 字段被保留下来了,需要加入 `_delete_=True` 去忽略基础配置文件里的 `lr_config` 相关域内容: + +```python +_base_ = '../../configs/resnet/resnet50_8xb32_in1k.py' + +lr_config = dict( + _delete_=True, + policy='CosineAnnealing', + min_lr=0, + warmup='linear', + by_epoch=True, + warmup_iters=5, + warmup_ratio=0.1 +) +``` + +### 引用基础配置文件里的变量 + +有时,您可以引用 `_base_` 配置信息的一些域内容,这样可以避免重复定义。 可以参照 [mmcv](https://mmcv.readthedocs.io/zh_CN/latest/understand_mmcv/config.html#reference-variables-from-base) 来获得一些简单的指导。 + +以下是一个简单应用案例,在训练数据预处理流水线中使用 auto augment 数据增强,参考配置文件 [`configs/_base_/datasets/imagenet_bs64_autoaug.py`](https://github.com/open-mmlab/mmclassification/blob/master/configs/_base_/datasets/imagenet_bs64_autoaug.py)。 在定义 `train_pipeline` 时,可以直接在 `_base_` 中加入定义 auto augment 数据增强的文件命名,再通过 `{{_base_.auto_increasing_policies}}` 引用变量: + +```python +_base_ = ['./pipelines/auto_aug.py'] + +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='AutoAugment', policies={{_base_.auto_increasing_policies}}), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [...] +data = dict( + samples_per_gpu=64, + workers_per_gpu=2, + train=dict(..., pipeline=train_pipeline), + val=dict(..., pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='accuracy') +``` + +## 通过命令行参数修改配置信息 + +当用户使用脚本 "tools/train.py" 或者 "tools/test.py" 提交任务,以及使用一些工具脚本时,可以通过指定 `--cfg-options` 参数来直接修改所使用的配置文件内容。 + +- 更新配置文件内的字典 + + 可以按照原始配置文件中字典的键的顺序指定配置选项。 + 例如,`--cfg-options model.backbone.norm_eval=False` 将主干网络中的所有 BN 模块更改为 `train` 模式。 + +- 更新配置文件内列表的键 + + 一些配置字典在配置文件中会形成一个列表。例如,训练流水线 `data.train.pipeline` 通常是一个列表。 + 例如,`[dict(type='LoadImageFromFile'), dict(type='TopDownRandomFlip', flip_prob=0.5), ...]` 。如果要将流水线中的 `'flip_prob=0.5'` 更改为 `'flip_prob=0.0'`,您可以这样指定 `--cfg-options data.train.pipeline.1.flip_prob=0.0` 。 + +- 更新列表/元组的值。 + + 当配置文件中需要更新的是一个列表或者元组,例如,配置文件通常会设置 `workflow=[('train', 1)]`,用户如果想更改, + 需要指定 `--cfg-options workflow="[(train,1),(val,1)]"`。注意这里的引号 " 对于列表以及元组数据类型的修改是必要的, + 并且 **不允许** 引号内所指定的值的书写存在空格。 + +## 导入用户自定义模块 + +```{note} +本部分仅在当将 MMClassification 当作库构建自己项目时可能用到,初学者可跳过。 +``` + +在学习完后续教程 [如何添加新数据集](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/new_dataset.html)、[如何设计数据处理流程](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/data_pipeline.html) 、[如何增加新模块](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/new_modules.html) 后,您可能使用 MMClassification 完成自己的项目并在项目中自定义了数据集、模型、数据增强等。为了精简代码,可以将 MMClassification 作为一个第三方库,只需要保留自己的额外的代码,并在配置文件中导入自定义的模块。案例可以参考 [OpenMMLab 算法大赛项目](https://github.com/zhangrui-wolf/openmmlab-competition-2021)。 + +只需要在你的配置文件中添加以下代码: + +```python +custom_imports = dict( + imports=['your_dataset_class', + 'your_transforme_class', + 'your_model_class', + 'your_module_class'], + allow_failed_imports=False) +``` + +## 常见问题 + +- 无 diff --git a/docs/zh_CN/tutorials/data_pipeline.md b/docs/zh_CN/tutorials/data_pipeline.md new file mode 100644 index 0000000..bbcf9d5 --- /dev/null +++ b/docs/zh_CN/tutorials/data_pipeline.md @@ -0,0 +1,148 @@ +# 教程 4:如何设计数据处理流程 + +## 设计数据流水线 + +按照典型的用法,我们通过 `Dataset` 和 `DataLoader` 来使用多个 worker 进行数据加 +载。对 `Dataset` 的索引操作将返回一个与模型的 `forward` 方法的参数相对应的字典。 + +数据流水线和数据集在这里是解耦的。通常,数据集定义如何处理标注文件,而数据流水 +线定义所有准备数据字典的步骤。流水线由一系列操作组成。每个操作都将一个字典作为 +输入,并输出一个字典。 + +这些操作分为数据加载,预处理和格式化。 + +这里使用 ResNet-50 在 ImageNet 数据集上的数据流水线作为示例。 + +```python +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', size=256), + dict(type='CenterCrop', crop_size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] +``` + +对于每个操作,我们列出了添加、更新、删除的相关字典字段。在流水线的最后,我们使 +用 `Collect` 仅保留进行模型 `forward` 方法所需的项。 + +### 数据加载 + +`LoadImageFromFile` - 从文件中加载图像 + +- 添加:img, img_shape, ori_shape + +默认情况下,`LoadImageFromFile` 将会直接从硬盘加载图像,但对于一些效率较高、规 +模较小的模型,这可能会导致 IO 瓶颈。MMCV 支持多种数据加载后端来加速这一过程。例 +如,如果训练设备上配置了 [memcached](https://memcached.org/),那么我们按照如下 +方式修改配置文件。 + +``` +memcached_root = '/mnt/xxx/memcached_client/' +train_pipeline = [ + dict( + type='LoadImageFromFile', + file_client_args=dict( + backend='memcached', + server_list_cfg=osp.join(memcached_root, 'server_list.conf'), + client_cfg=osp.join(memcached_root, 'client.conf'))), +] +``` + +更多支持的数据加载后端,可以参见 [mmcv.fileio.FileClient](https://github.com/open-mmlab/mmcv/blob/master/mmcv/fileio/file_client.py)。 + +### 预处理 + +`Resize` - 缩放图像尺寸 + +- 添加:scale, scale_idx, pad_shape, scale_factor, keep_ratio +- 更新:img, img_shape + +`RandomFlip` - 随机翻转图像 + +- 添加:flip, flip_direction +- 更新:img + +`RandomCrop` - 随机裁剪图像 + +- 更新:img, pad_shape + +`Normalize` - 图像数据归一化 + +- 添加:img_norm_cfg +- 更新:img + +### 格式化 + +`ToTensor` - 转换(标签)数据至 `torch.Tensor` + +- 更新:根据参数 `keys` 指定 + +`ImageToTensor` - 转换图像数据至 `torch.Tensor` + +- 更新:根据参数 `keys` 指定 + +`Collect` - 保留指定键值 + +- 删除:除了参数 `keys` 指定以外的所有键值对 + +## 扩展及使用自定义流水线 + +1. 编写一个新的数据处理操作,并放置在 `mmcls/datasets/pipelines/` 目录下的任何 + 一个文件中,例如 `my_pipeline.py`。这个类需要重载 `__call__` 方法,接受一个 + 字典作为输入,并返回一个字典。 + + ```python + from mmcls.datasets import PIPELINES + + @PIPELINES.register_module() + class MyTransform(object): + + def __call__(self, results): + # 对 results['img'] 进行变换操作 + return results + ``` + +2. 在 `mmcls/datasets/pipelines/__init__.py` 中导入这个新的类。 + + ```python + ... + from .my_pipeline import MyTransform + + __all__ = [ + ..., 'MyTransform' + ] + ``` + +3. 在数据流水线的配置中添加这一操作。 + + ```python + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', size=224), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='MyTransform'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) + ] + ``` + +## 流水线可视化 + +设计好数据流水线后,可以使用[可视化工具](../tools/visualization.md)查看具体的效果。 diff --git a/docs/zh_CN/tutorials/finetune.md b/docs/zh_CN/tutorials/finetune.md new file mode 100644 index 0000000..efaa88f --- /dev/null +++ b/docs/zh_CN/tutorials/finetune.md @@ -0,0 +1,222 @@ +# 教程 2:如何微调模型 + +已经证明,在 ImageNet 数据集上预先训练的分类模型对于其他数据集和其他下游任务有很好的效果。 + +该教程提供了如何将 [Model Zoo](https://github.com/open-mmlab/mmclassification/blob/master/docs/model_zoo.md) 中提供的预训练模型用于其他数据集,已获得更好的效果。 + +在新数据集上微调模型分为两步: + +- 按照 [教程 3:如何自定义数据集](new_dataset.md) 添加对新数据集的支持。 +- 按照本教程中讨论的内容修改配置文件 + +假设我们现在有一个在 ImageNet-2012 数据集上训练好的 ResNet-50 模型,并且希望在 +CIFAR-10 数据集上进行模型微调,我们需要修改配置文件中的五个部分。 + +## 继承基础配置 + +首先,创建一个新的配置文件 `configs/tutorial/resnet50_finetune_cifar.py` 来保存我们的配置,当然,这个文件名可以自由设定。 + +为了重用不同配置之间的通用部分,我们支持从多个现有配置中继承配置。要微调 +ResNet-50 模型,新配置需要继承 `_base_/models/resnet50.py` 来搭建模型的基本结构。 +为了使用 CIFAR10 数据集,新的配置文件可以直接继承 `_base_/datasets/cifar10.py`。 +而为了保留运行相关设置,比如训练调整器,新的配置文件需要继承 +`_base_/default_runtime.py`。 + +要继承以上这些配置文件,只需要把下面一段代码放在我们的配置文件开头。 + +```python +_base_ = [ + '../_base_/models/resnet50.py', + '../_base_/datasets/cifar10.py', '../_base_/default_runtime.py' +] +``` + +除此之外,你也可以不使用继承,直接编写完整的配置文件,例如 +[`configs/lenet/lenet5_mnist.py`](https://github.com/open-mmlab/mmclassification/blob/master/configs/lenet/lenet5_mnist.py)。 + +## 修改模型 + +在进行模型微调是,我们通常希望在主干网络(backbone)加载预训练模型,再用我们的数据集训练一个新的分类头(head)。 + +为了在主干网络加载预训练模型,我们需要修改主干网络的初始化设置,使用 +`Pretrained` 类型的初始化函数。另外,在初始化设置中,我们使用 +`prefix='backbone'` 来告诉初始化函数移除权重文件中键值名称的前缀,比如把 +`backbone.conv1` 变成 `conv1`。方便起见,我们这里使用一个在线的权重文件链接,它 +会在训练前自动下载对应的文件,你也可以提前下载这个模型,然后使用本地路径。 + +接下来,新的配置文件需要按照新数据集的类别数目来修改分类头的配置。只需要修改分 +类头中的 `num_classes` 设置即可。 + +```python +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', + checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth', + prefix='backbone', + )), + head=dict(num_classes=10), +) +``` + +```{tip} +这里我们只需要设定我们想要修改的部分配置,其他配置将会自动从我们的父配置文件中获取。 +``` + +另外,有时我们在进行微调时会希望冻结主干网络前面几层的参数,这么做有助于在后续 +训练中,保持网络从预训练权重中获得的提取低阶特征的能力。在 MMClassification 中, +这一功能可以通过简单的一个 `frozen_stages` 参数来实现。比如我们需要冻结前两层网 +络的参数,只需要在上面的配置中添加一行: + +```python +model = dict( + backbone=dict( + frozen_stages=2, + init_cfg=dict( + type='Pretrained', + checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth', + prefix='backbone', + )), + head=dict(num_classes=10), +) +``` + +```{note} +目前还不是所有的网络都支持 `frozen_stages` 参数,在使用之前,请先检查 +[文档](https://mmclassification.readthedocs.io/zh_CN/latest/api/models.html#backbones) +以确认你所使用的主干网络是否支持。 +``` + +## 修改数据集 + +当针对一个新的数据集进行微调时,我们通常都需要修改一些数据集相关的配置。比如这 +里,我们就需要把 CIFAR-10 数据集中的图像大小从 32 缩放到 224 来配合 ImageNet 上 +预训练模型的输入。这一需要可以通过修改数据集的预处理流水线(pipeline)来实现。 + +```python +img_norm_cfg = dict( + mean=[125.307, 122.961, 113.8575], + std=[51.5865, 50.847, 51.255], + to_rgb=False, +) +train_pipeline = [ + dict(type='RandomCrop', size=32, padding=4), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Resize', size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']), +] +test_pipeline = [ + dict(type='Resize', size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) +``` + +## 修改训练策略设置 + +用于微调任务的超参数与默认配置不同,通常只需要较小的学习率和较少的训练时间。 + +```python +# 用于批大小为 128 的优化器学习率 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# 学习率衰减策略 +lr_config = dict(policy='step', step=[15]) +runner = dict(type='EpochBasedRunner', max_epochs=200) +log_config = dict(interval=100) +``` + +## 开始训练 + +现在,我们完成了用于微调的配置文件,完整的文件如下: + +```python +_base_ = [ + '../_base_/models/resnet50.py', + '../_base_/datasets/cifar10_bs16.py', '../_base_/default_runtime.py' +] + +# 模型设置 +model = dict( + backbone=dict( + frozen_stages=2, + init_cfg=dict( + type='Pretrained', + checkpoint='https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb32_in1k_20210831-ea4938fc.pth', + prefix='backbone', + )), + head=dict(num_classes=10), +) + +# 数据集设置 +img_norm_cfg = dict( + mean=[125.307, 122.961, 113.8575], + std=[51.5865, 50.847, 51.255], + to_rgb=False, +) +train_pipeline = [ + dict(type='RandomCrop', size=32, padding=4), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + dict(type='Resize', size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']), +] +test_pipeline = [ + dict(type='Resize', size=224), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) + +# 训练策略设置 +# 用于批大小为 128 的优化器学习率 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# 学习率衰减策略 +lr_config = dict(policy='step', step=[15]) +runner = dict(type='EpochBasedRunner', max_epochs=200) +log_config = dict(interval=100) +``` + +接下来,我们使用一台 8 张 GPU 的电脑来训练我们的模型,指令如下: + +```shell +bash tools/dist_train.sh configs/tutorial/resnet50_finetune_cifar.py 8 +``` + +当然,我们也可以使用单张 GPU 来进行训练,使用如下命令: + +```shell +python tools/train.py configs/tutorial/resnet50_finetune_cifar.py +``` + +但是如果我们使用单张 GPU 进行训练的话,需要在数据集设置部分作如下修改: + +```python +data = dict( + samples_per_gpu=128, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline), +) +``` + +这是因为我们的训练策略是针对批次大小(batch size)为 128 设置的。在父配置文件中, +设置了 `samples_per_gpu=16`,如果使用 8 张 GPU,总的批次大小就是 128。而如果使 +用单张 GPU,就必须手动修改 `samples_per_gpu=128` 来匹配训练策略。 diff --git a/docs/zh_CN/tutorials/new_dataset.md b/docs/zh_CN/tutorials/new_dataset.md new file mode 100644 index 0000000..86782a1 --- /dev/null +++ b/docs/zh_CN/tutorials/new_dataset.md @@ -0,0 +1,230 @@ +# 教程 3:如何自定义数据集 + +我们支持许多常用的图像分类领域公开数据集,你可以在 +[此页面](https://mmclassification.readthedocs.io/zh_CN/latest/api/datasets.html)中找到它们。 + +在本节中,我们将介绍如何[使用自己的数据集](#使用自己的数据集)以及如何[使用数据集包装](#使用数据集包装)。 + +## 使用自己的数据集 + +### 将数据集重新组织为已有格式 + +想要使用自己的数据集,最简单的方法就是将数据集转换为现有的数据集格式。 + +对于多分类任务,我们推荐使用 [`CustomDataset`](https://mmclassification.readthedocs.io/zh_CN/latest/api/datasets.html#mmcls.datasets.CustomDataset) 格式。 + +`CustomDataset` 支持两种类型的数据格式: + +1. 提供一个标注文件,其中每一行表示一张样本图片。 + + 样本图片可以以任意的结构进行组织,比如: + + ``` + train/ + ├── folder_1 + │ ├── xxx.png + │ ├── xxy.png + │ └── ... + ├── 123.png + ├── nsdf3.png + └── ... + ``` + + 而标注文件则记录了所有样本图片的文件路径以及相应的类别序号。其中第一列表示图像 + 相对于主目录(本例中为 `train` 目录)的路径,第二列表示类别序号: + + ``` + folder_1/xxx.png 0 + folder_1/xxy.png 1 + 123.png 1 + nsdf3.png 2 + ... + ``` + + ```{note} + 类别序号的值应当属于 `[0, num_classes - 1]` 范围。 + ``` + +2. 将所有样本文件按如下结构进行组织: + + ``` + train/ + ├── cat + │ ├── xxx.png + │ ├── xxy.png + │ └── ... + │ └── xxz.png + ├── bird + │ ├── bird1.png + │ ├── bird2.png + │ └── ... + └── dog + ├── 123.png + ├── nsdf3.png + ├── ... + └── asd932_.png + ``` + + 这种情况下,你不需要提供标注文件,所有位于 `cat` 目录下的图片文件都会被视为 `cat` 类别的样本。 + +通常而言,我们会将整个数据集分为三个子数据集:`train`,`val` 和 `test`,分别用于训练、验证和测试。**每一个**子 +数据集都需要被组织成如上的一种结构。 + +举个例子,完整的数据集结构如下所示(使用第一种组织结构): + +``` +mmclassification +└── data + └── my_dataset + ├── meta + │ ├── train.txt + │ ├── val.txt + │ └── test.txt + ├── train + ├── val + └── test +``` + +之后在你的配置文件中,可以修改其中的 `data` 字段为如下格式: + +```python +... +dataset_type = 'CustomDataset' +classes = ['cat', 'bird', 'dog'] # 数据集中各类别的名称 + +data = dict( + train=dict( + type=dataset_type, + data_prefix='data/my_dataset/train', + ann_file='data/my_dataset/meta/train.txt', + classes=classes, + pipeline=train_pipeline + ), + val=dict( + type=dataset_type, + data_prefix='data/my_dataset/val', + ann_file='data/my_dataset/meta/val.txt', + classes=classes, + pipeline=test_pipeline + ), + test=dict( + type=dataset_type, + data_prefix='data/my_dataset/test', + ann_file='data/my_dataset/meta/test.txt', + classes=classes, + pipeline=test_pipeline + ) +) +... +``` + +### 创建一个新的数据集类 + +用户可以编写一个继承自 `BasesDataset` 的新数据集类,并重载 `load_annotations(self)` 方法, +类似 [CIFAR10](https://github.com/open-mmlab/mmclassification/blob/master/mmcls/datasets/cifar.py) +和 [ImageNet](https://github.com/open-mmlab/mmclassification/blob/master/mmcls/datasets/imagenet.py)。 + +通常,此方法返回一个包含所有样本的列表,其中的每个样本都是一个字典。字典中包含了必要的数据信息,例如 `img` 和 `gt_label`。 + +假设我们将要实现一个 `Filelist` 数据集,该数据集将使用文件列表进行训练和测试。注释列表的格式如下: + +``` +000001.jpg 0 +000002.jpg 1 +``` + +我们可以在 `mmcls/datasets/filelist.py` 中创建一个新的数据集类以加载数据。 + +```python +import mmcv +import numpy as np + +from .builder import DATASETS +from .base_dataset import BaseDataset + + +@DATASETS.register_module() +class Filelist(BaseDataset): + + def load_annotations(self): + assert isinstance(self.ann_file, str) + + data_infos = [] + with open(self.ann_file) as f: + samples = [x.strip().split(' ') for x in f.readlines()] + for filename, gt_label in samples: + info = {'img_prefix': self.data_prefix} + info['img_info'] = {'filename': filename} + info['gt_label'] = np.array(gt_label, dtype=np.int64) + data_infos.append(info) + return data_infos + +``` + +将新的数据集类加入到 `mmcls/datasets/__init__.py` 中: + +```python +from .base_dataset import BaseDataset +... +from .filelist import Filelist + +__all__ = [ + 'BaseDataset', ... ,'Filelist' +] +``` + +然后在配置文件中,为了使用 `Filelist`,用户可以按以下方式修改配置 + +```python +train = dict( + type='Filelist', + ann_file = 'image_list.txt', + pipeline=train_pipeline +) +``` + +## 使用数据集包装 + +数据集包装是一种可以改变数据集类行为的类,比如将数据集中的样本进行重复,或是将不同类别的数据进行再平衡。 + +### 重复数据集 + +我们使用 `RepeatDataset` 作为一个重复数据集的封装。举个例子,假设原始数据集是 `Dataset_A`,为了重复它,我们需要如下的配置文件: + +```python +data = dict( + train=dict( + type='RepeatDataset', + times=N, + dataset=dict( # 这里是 Dataset_A 的原始配置 + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) + ... +) +``` + +### 类别平衡数据集 + +我们使用 `ClassBalancedDataset` 作为根据类别频率对数据集进行重复采样的封装类。进行重复采样的数据集需要实现函数 `self.get_cat_ids(idx)` 以支持 `ClassBalancedDataset`。 + +举个例子,按照 `oversample_thr=1e-3` 对 `Dataset_A` 进行重复采样,需要如下的配置文件: + +```python +data = dict( + train = dict( + type='ClassBalancedDataset', + oversample_thr=1e-3, + dataset=dict( # 这里是 Dataset_A 的原始配置 + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) + ... +) +``` + +更加具体的细节,请参考 [API 文档](https://mmclassification.readthedocs.io/zh_CN/latest/api/datasets.html#mmcls.datasets.ClassBalancedDataset)。 diff --git a/docs/zh_CN/tutorials/new_modules.md b/docs/zh_CN/tutorials/new_modules.md new file mode 100644 index 0000000..14ee32c --- /dev/null +++ b/docs/zh_CN/tutorials/new_modules.md @@ -0,0 +1,280 @@ +# 教程 5:如何增加新模块 + +## 开发新组件 + +我们基本上将模型组件分为 3 种类型。 + +- 主干网络:通常是一个特征提取网络,例如 ResNet、MobileNet +- 颈部:用于连接主干网络和头部的组件,例如 GlobalAveragePooling +- 头部:用于执行特定任务的组件,例如分类和回归 + +### 添加新的主干网络 + +这里,我们以 ResNet_CIFAR 为例,展示了如何开发一个新的主干网络组件。 + +ResNet_CIFAR 针对 CIFAR 32x32 的图像输入,将 ResNet 中 `kernel_size=7, stride=2` 的设置替换为 `kernel_size=3, stride=1`,并移除了 stem 层之后的 +`MaxPooling`,以避免传递过小的特征图到残差块中。 + +它继承自 `ResNet` 并只修改了 stem 层。 + +1. 创建一个新文件 `mmcls/models/backbones/resnet_cifar.py`。 + +```python +import torch.nn as nn + +from ..builder import BACKBONES +from .resnet import ResNet + + +@BACKBONES.register_module() +class ResNet_CIFAR(ResNet): + + """ResNet backbone for CIFAR. + + (对这个主干网络的简短描述) + + Args: + depth(int): Network depth, from {18, 34, 50, 101, 152}. + ... + (参数文档) + """ + + def __init__(self, depth, deep_stem=False, **kwargs): + # 调用基类 ResNet 的初始化函数 + super(ResNet_CIFAR, self).__init__(depth, deep_stem=deep_stem **kwargs) + # 其他特殊的初始化流程 + assert not self.deep_stem, 'ResNet_CIFAR do not support deep_stem' + + def _make_stem_layer(self, in_channels, base_channels): + # 重载基类的方法,以实现对网络结构的修改 + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + base_channels, + kernel_size=3, + stride=1, + padding=1, + bias=False) + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, base_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.relu = nn.ReLU(inplace=True) + + def forward(self, x): # 需要返回一个元组 + pass # 此处省略了网络的前向实现 + + def init_weights(self, pretrained=None): + pass # 如果有必要的话,重载基类 ResNet 的参数初始化函数 + + def train(self, mode=True): + pass # 如果有必要的话,重载基类 ResNet 的训练状态函数 +``` + +2. 在 `mmcls/models/backbones/__init__.py` 中导入新模块 + +```python +... +from .resnet_cifar import ResNet_CIFAR + +__all__ = [ + ..., 'ResNet_CIFAR' +] +``` + +3. 在配置文件中使用新的主干网络 + +```python +model = dict( + ... + backbone=dict( + type='ResNet_CIFAR', + depth=18, + other_arg=xxx), + ... +``` + +### 添加新的颈部组件 + +这里我们以 `GlobalAveragePooling` 为例。这是一个非常简单的颈部组件,没有任何参数。 + +要添加新的颈部组件,我们主要需要实现 `forward` 函数,该函数对主干网络的输出进行 +一些操作并将结果传递到头部。 + +1. 创建一个新文件 `mmcls/models/necks/gap.py` + + ```python + import torch.nn as nn + + from ..builder import NECKS + + @NECKS.register_module() + class GlobalAveragePooling(nn.Module): + + def __init__(self): + self.gap = nn.AdaptiveAvgPool2d((1, 1)) + + def forward(self, inputs): + # 简单起见,我们默认输入是一个张量 + outs = self.gap(inputs) + outs = outs.view(inputs.size(0), -1) + return outs + ``` + +2. 在 `mmcls/models/necks/__init__.py` 中导入新模块 + + ```python + ... + from .gap import GlobalAveragePooling + + __all__ = [ + ..., 'GlobalAveragePooling' + ] + ``` + +3. 修改配置文件以使用新的颈部组件 + + ```python + model = dict( + neck=dict(type='GlobalAveragePooling'), + ) + ``` + +### 添加新的头部组件 + +在此,我们以 `LinearClsHead` 为例,说明如何开发新的头部组件。 + +要添加一个新的头部组件,基本上我们需要实现 `forward_train` 函数,它接受来自颈部 +或主干网络的特征图作为输入,并基于真实标签计算。 + +1. 创建一个文件 `mmcls/models/heads/linear_head.py`. + + ```python + from ..builder import HEADS + from .cls_head import ClsHead + + + @HEADS.register_module() + class LinearClsHead(ClsHead): + + def __init__(self, + num_classes, + in_channels, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, )): + super(LinearClsHead, self).__init__(loss=loss, topk=topk) + self.in_channels = in_channels + self.num_classes = num_classes + + if self.num_classes <= 0: + raise ValueError( + f'num_classes={num_classes} must be a positive integer') + + self._init_layers() + + def _init_layers(self): + self.fc = nn.Linear(self.in_channels, self.num_classes) + + def init_weights(self): + normal_init(self.fc, mean=0, std=0.01, bias=0) + + def forward_train(self, x, gt_label): + cls_score = self.fc(x) + losses = self.loss(cls_score, gt_label) + return losses + + ``` + +2. 在 `mmcls/models/heads/__init__.py` 中导入这个模块 + + ```python + ... + from .linear_head import LinearClsHead + + __all__ = [ + ..., 'LinearClsHead' + ] + ``` + +3. 修改配置文件以使用新的头部组件。 + +连同 `GlobalAveragePooling` 颈部组件,完整的模型配置如下: + +```python +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) + +``` + +### 添加新的损失函数 + +要添加新的损失函数,我们主要需要在损失函数模块中 `forward` 函数。另外,利用装饰器 `weighted_loss` 可以方便的实现对每个元素的损失进行加权平均。 + +假设我们要模拟从另一个分类模型生成的概率分布,需要添加 `L1loss` 来实现该目的。 + +1. 创建一个新文件 `mmcls/models/losses/l1_loss.py` + + ```python + import torch + import torch.nn as nn + + from ..builder import LOSSES + from .utils import weighted_loss + + @weighted_loss + def l1_loss(pred, target): + assert pred.size() == target.size() and target.numel() > 0 + loss = torch.abs(pred - target) + return loss + + @LOSSES.register_module() + class L1Loss(nn.Module): + + def __init__(self, reduction='mean', loss_weight=1.0): + super(L1Loss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss = self.loss_weight * l1_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss + ``` + +2. 在文件 `mmcls/models/losses/__init__.py` 中导入这个模块 + + ```python + ... + from .l1_loss import L1Loss, l1_loss + + __all__ = [ + ..., 'L1Loss', 'l1_loss' + ] + ``` + +3. 修改配置文件中的 `loss` 字段以使用新的损失函数 + + ```python + loss=dict(type='L1Loss', loss_weight=1.0)) + ``` diff --git a/docs/zh_CN/tutorials/runtime.md b/docs/zh_CN/tutorials/runtime.md new file mode 100644 index 0000000..0be7999 --- /dev/null +++ b/docs/zh_CN/tutorials/runtime.md @@ -0,0 +1,260 @@ +# 教程 7:如何自定义模型运行参数 + +在本教程中,我们将介绍如何在运行自定义模型时,进行自定义工作流和钩子的方法。 + + + +- [定制工作流](#定制工作流) +- [钩子](#钩子) + - [默认训练钩子](#默认训练钩子) + - [使用内置钩子](#使用内置钩子) + - [自定义钩子](#自定义钩子) +- [常见问题](#常见问题) + + + +## 定制工作流 + +工作流是一个形如 (任务名,周期数) 的列表,用于指定运行顺序和周期。这里“周期数”的单位由执行器的类型来决定。 + +比如在 MMClassification 中,我们默认使用基于**轮次**的执行器(`EpochBasedRunner`),那么“周期数”指的就是对应的任务在一个周期中 +要执行多少个轮次。通常,我们只希望执行训练任务,那么只需要使用以下设置: + +```python +workflow = [('train', 1)] +``` + +有时我们可能希望在训练过程中穿插检查模型在验证集上的一些指标(例如,损失,准确性)。 + +在这种情况下,可以将工作流程设置为: + +```python +[('train', 1), ('val', 1)] +``` + +这样一来,程序会一轮训练一轮测试地反复执行。 + +需要注意的是,默认情况下,我们并不推荐用这种方式来进行模型验证,而是推荐在训练中使用 **`EvalHook`** 进行模型验证。使用上述工作流的方式进行模型验证只是一个替代方案。 + +```{note} +1. 在验证周期时不会更新模型参数。 +2. 配置文件内的关键词 `max_epochs` 控制训练时期数,并且不会影响验证工作流程。 +3. 工作流 `[('train', 1), ('val', 1)]` 和 `[('train', 1)]` 不会改变 `EvalHook` 的行为。 + 因为 `EvalHook` 由 `after_train_epoch` 调用,而验证工作流只会影响 `after_val_epoch` 调用的钩子。 + 因此,`[('train', 1), ('val', 1)]` 和 ``[('train', 1)]`` 的区别在于,runner 在完成每一轮训练后,会计算验证集上的损失。 +``` + +## 钩子 + +钩子机制在 OpenMMLab 开源算法库中应用非常广泛,结合执行器可以实现对训练过程的整个生命周期进行管理,可以通过[相关文章](https://zhuanlan.zhihu.com/p/355272220)进一步理解钩子。 + +钩子只有在构造器中被注册才起作用,目前钩子主要分为两类: + +- 默认训练钩子 + +默认训练钩子由运行器默认注册,一般为一些基础型功能的钩子,已经有确定的优先级,一般不需要修改优先级。 + +- 定制钩子 + +定制钩子通过 `custom_hooks` 注册,一般为一些增强型功能的钩子,需要在配置文件中指定优先级,不指定该钩子的优先级将默被设定为 'NORMAL'。 + +**优先级列表** + +| Level | Value | +| :-------------: | :---: | +| HIGHEST | 0 | +| VERY_HIGH | 10 | +| HIGH | 30 | +| ABOVE_NORMAL | 40 | +| NORMAL(default) | 50 | +| BELOW_NORMAL | 60 | +| LOW | 70 | +| VERY_LOW | 90 | +| LOWEST | 100 | + +优先级确定钩子的执行顺序,每次训练前,日志会打印出各个阶段钩子的执行顺序,方便调试。 + +### 默认训练钩子 + +有一些常见的钩子未通过 `custom_hooks` 注册,但会在运行器(`Runner`)中默认注册,它们是: + +| Hooks | Priority | +| :-------------------: | :---------------: | +| `LrUpdaterHook` | VERY_HIGH (10) | +| `MomentumUpdaterHook` | HIGH (30) | +| `OptimizerHook` | ABOVE_NORMAL (40) | +| `CheckpointHook` | NORMAL (50) | +| `IterTimerHook` | LOW (70) | +| `EvalHook` | LOW (70) | +| `LoggerHook(s)` | VERY_LOW (90) | + +`OptimizerHook`,`MomentumUpdaterHook`和 `LrUpdaterHook` 在 [优化策略](./schedule.md) 部分进行了介绍, +`IterTimerHook` 用于记录所用时间,目前不支持修改; + +下面介绍如何使用去定制 `CheckpointHook`、`LoggerHooks` 以及 `EvalHook`。 + +#### 权重文件钩子(CheckpointHook) + +MMCV 的 runner 使用 `checkpoint_config` 来初始化 [`CheckpointHook`](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/hooks/checkpoint.py#L9)。 + +```python +checkpoint_config = dict(interval=1) +``` + +用户可以设置 “max_keep_ckpts” 来仅保存少量模型权重文件,或者通过 “save_optimizer” 决定是否存储优化器的状态字典。 +更多细节可参考 [这里](https://mmcv.readthedocs.io/zh_CN/latest/api.html#mmcv.runner.CheckpointHook)。 + +#### 日志钩子(LoggerHooks) + +`log_config` 包装了多个记录器钩子,并可以设置间隔。 +目前,MMCV 支持 `TextLoggerHook`、 `WandbLoggerHook`、`MlflowLoggerHook` 和 `TensorboardLoggerHook`。 +更多细节可参考[这里](https://mmcv.readthedocs.io/zh_CN/latest/api.html#mmcv.runner.LoggerHook)。 + +```python +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + dict(type='TensorboardLoggerHook') + ]) +``` + +#### 验证钩子(EvalHook) + +配置中的 `evaluation` 字段将用于初始化 [`EvalHook`](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/evaluation.py)。 + +`EvalHook` 有一些保留参数,如 `interval`,`save_best` 和 `start` 等。其他的参数,如“metrics”将被传递给 `dataset.evaluate()`。 + +```python +evaluation = dict(interval=1, metric='accuracy', metric_options={'topk': (1, )}) +``` + +我们可以通过参数 `save_best` 保存取得最好验证结果时的模型权重: + +```python +# "auto" 表示自动选择指标来进行模型的比较。也可以指定一个特定的 key 比如 "accuracy_top-1"。 +evaluation = dict(interval=1, save_best=True, metric='accuracy', metric_options={'topk': (1, )}) +``` + +在跑一些大型实验时,可以通过修改参数 `start` 跳过训练靠前轮次时的验证步骤,以节约时间。如下: + +```python +evaluation = dict(interval=1, start=200, metric='accuracy', metric_options={'topk': (1, )}) +``` + +表示在第 200 轮之前,只执行训练流程,不执行验证;从轮次 200 开始,在每一轮训练之后进行验证。 + +```{note} +在 MMClassification 的默认配置文件中,evaluation 字段一般被放在 datasets 基础配置文件中。 +``` + +### 使用内置钩子 + +一些钩子已在 MMCV 和 MMClassification 中实现: + +- [EMAHook](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/ema.py) +- [SyncBuffersHook](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/sync_buffer.py) +- [EmptyCacheHook](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/memory.py) +- [ProfilerHook](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/profiler.py) +- ...... + +可以直接修改配置以使用该钩子,如下格式: + +```python +custom_hooks = [ + dict(type='MMCVHook', a=a_value, b=b_value, priority='NORMAL') +] +``` + +例如使用 `EMAHook`,进行一次 EMA 的间隔是100个迭代: + +```python +custom_hooks = [ + dict(type='EMAHook', interval=100, priority='HIGH') +] +``` + +## 自定义钩子 + +### 创建一个新钩子 + +这里举一个在 MMClassification 中创建一个新钩子,并在训练中使用它的示例: + +```python +from mmcv.runner import HOOKS, Hook + + +@HOOKS.register_module() +class MyHook(Hook): + + def __init__(self, a, b): + pass + + def before_run(self, runner): + pass + + def after_run(self, runner): + pass + + def before_epoch(self, runner): + pass + + def after_epoch(self, runner): + pass + + def before_iter(self, runner): + pass + + def after_iter(self, runner): + pass +``` + +根据钩子的功能,用户需要指定钩子在训练的每个阶段将要执行的操作,比如 `before_run`,`after_run`,`before_epoch`,`after_epoch`,`before_iter` 和 `after_iter`。 + +### 注册新钩子 + +之后,需要导入 `MyHook`。假设该文件在 `mmcls/core/utils/my_hook.py`,有两种办法导入它: + +- 修改 `mmcls/core/utils/__init__.py` 进行导入 + + 新定义的模块应导入到 `mmcls/core/utils/__init__py` 中,以便注册器能找到并添加新模块: + +```python +from .my_hook import MyHook + +__all__ = ['MyHook'] +``` + +- 使用配置文件中的 `custom_imports` 变量手动导入 + +```python +custom_imports = dict(imports=['mmcls.core.utils.my_hook'], allow_failed_imports=False) +``` + +### 修改配置 + +```python +custom_hooks = [ + dict(type='MyHook', a=a_value, b=b_value) +] +``` + +还可通过 `priority` 参数设置钩子优先级,如下所示: + +```python +custom_hooks = [ + dict(type='MyHook', a=a_value, b=b_value, priority='NORMAL') +] +``` + +默认情况下,在注册过程中,钩子的优先级设置为“NORMAL”。 + +## 常见问题 + +### 1. resume_from, load_from,init_cfg.Pretrained 区别 + +- `load_from` :仅仅加载模型权重,主要用于加载预训练或者训练好的模型; + +- `resume_from` :不仅导入模型权重,还会导入优化器信息,当前轮次(epoch)信息,主要用于从断点继续训练。 + +- `init_cfg.Pretrained` :在权重初始化期间加载权重,您可以指定要加载的模块。 这通常在微调模型时使用,请参阅[教程 2:如何微调模型](./finetune.md) diff --git a/docs/zh_CN/tutorials/schedule.md b/docs/zh_CN/tutorials/schedule.md new file mode 100644 index 0000000..931edd0 --- /dev/null +++ b/docs/zh_CN/tutorials/schedule.md @@ -0,0 +1,333 @@ +# 教程 6:如何自定义优化策略 + +在本教程中,我们将介绍如何在运行自定义模型时,进行构造优化器、定制学习率及动量调整策略、梯度裁剪、梯度累计以及用户自定义优化方法等。 + + + +- [构造 PyTorch 内置优化器](#构造-pytorch-内置优化器) +- [定制学习率调整策略](#定制学习率调整策略) + - [学习率衰减曲线](#定制学习率衰减曲线) + - [学习率预热策略](#定制学习率预热策略) +- [定制动量调整策略](#定制动量调整策略) +- [参数化精细配置](#参数化精细配置) +- [梯度裁剪与梯度累计](#梯度裁剪与梯度累计) + - [梯度裁剪](#梯度裁剪) + - [梯度累计](#梯度累计) +- [用户自定义优化方法](#用户自定义优化方法) + - [自定义优化器](#自定义优化器) + - [自定义优化器构造器](#自定义优化器构造器) + + + +## 构造 PyTorch 内置优化器 + +MMClassification 支持 PyTorch 实现的所有优化器,仅需在配置文件中,指定 “optimizer” 字段。 +例如,如果要使用 “SGD”,则修改如下。 + +```python +optimizer = dict(type='SGD', lr=0.0003, weight_decay=0.0001) +``` + +要修改模型的学习率,只需要在优化器的配置中修改 `lr` 即可。 +要配置其他参数,可直接根据 [PyTorch API 文档](https://pytorch.org/docs/stable/optim.html?highlight=optim#module-torch.optim) 进行。 + +```{note} +配置文件中的 'type' 不是构造时的参数,而是 PyTorch 内置优化器的类名。 +``` + +例如,如果想使用 `Adam` 并设置参数为 `torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)`, +则需要进行如下修改 + +```python +optimizer = dict(type='Adam', lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False) +``` + +## 定制学习率调整策略 + +### 定制学习率衰减曲线 + +深度学习研究中,广泛应用学习率衰减来提高网络的性能。要使用学习率衰减,可以在配置中设置 `lr_confg` 字段。 + +比如在默认的 ResNet 网络训练中,我们使用阶梯式的学习率衰减策略,配置文件为: + +```python +lr_config = dict(policy='step', step=[100, 150]) +``` + +在训练过程中,程序会周期性地调用 MMCV 中的 [`StepLRHook`](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/lr_updater.py#L153) 来进行学习率更新。 + +此外,我们也支持其他学习率调整方法,如 `CosineAnnealing` 和 `Poly` 等。详情可见 [这里](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py) + +- ConsineAnnealing: + + ```python + lr_config = dict(policy='CosineAnnealing', min_lr_ratio=1e-5) + ``` + +- Poly: + + ```python + lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) + ``` + +### 定制学习率预热策略 + +在训练的早期阶段,网络容易不稳定,而学习率的预热就是为了减少这种不稳定性。通过预热,学习率将会从一个很小的值逐步提高到预定值。 + +在 MMClassification 中,我们同样使用 `lr_config` 配置学习率预热策略,主要的参数有以下几个: + +- `warmup` : 学习率预热曲线类别,必须为 'constant'、 'linear', 'exp' 或者 `None` 其一, 如果为 `None`, 则不使用学习率预热策略。 +- `warmup_by_epoch` : 是否以轮次(epoch)为单位进行预热。 +- `warmup_iters` : 预热的迭代次数,当 `warmup_by_epoch=True` 时,单位为轮次(epoch);当 `warmup_by_epoch=False` 时,单位为迭代次数(iter)。 +- `warmup_ratio` : 预测的初始学习率 `lr = lr * warmup_ratio`。 + +例如: + +1. 逐**迭代次数**地**线性**预热 + + ```python + lr_config = dict( + policy='CosineAnnealing', + by_epoch=False, + min_lr_ratio=1e-2, + warmup='linear', + warmup_ratio=1e-3, + warmup_iters=20 * 1252, + warmup_by_epoch=False) + ``` + +2. 逐**轮次**地**指数**预热 + + ```python + lr_config = dict( + policy='CosineAnnealing', + min_lr=0, + warmup='exp', + warmup_iters=5, + warmup_ratio=0.1, + warmup_by_epoch=True) + ``` + +```{tip} +配置完成后,可以使用 MMClassification 提供的 [学习率可视化工具](https://mmclassification.readthedocs.io/zh_CN/latest/tools/visualization.html#id3) 画出对应学习率调整曲线。 +``` + +## 定制动量调整策略 + +MMClassification 支持动量调整器根据学习率修改模型的动量,从而使模型收敛更快。 + +动量调整程序通常与学习率调整器一起使用,例如,以下配置用于加速收敛。 +更多细节可参考 [CyclicLrUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/lr_updater.py#L327) 和 [CyclicMomentumUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/momentum_updater.py#L130)。 + +这里是一个用例: + +```python +lr_config = dict( + policy='cyclic', + target_ratio=(10, 1e-4), + cyclic_times=1, + step_ratio_up=0.4, +) +momentum_config = dict( + policy='cyclic', + target_ratio=(0.85 / 0.95, 1), + cyclic_times=1, + step_ratio_up=0.4, +) +``` + +## 参数化精细配置 + +一些模型可能具有一些特定于参数的设置以进行优化,例如 BatchNorm 层不添加权重衰减或者对不同的网络层使用不同的学习率。 +在 MMClassification 中,我们通过 `optimizer` 的 `paramwise_cfg` 参数进行配置,可以参考[MMCV](https://mmcv.readthedocs.io/en/latest/_modules/mmcv/runner/optimizer/default_constructor.html#DefaultOptimizerConstructor)。 + +- 使用指定选项 + + MMClassification 提供了包括 `bias_lr_mult`、 `bias_decay_mult`、 `norm_decay_mult`、 `dwconv_decay_mult`、 `dcn_offset_lr_mult` 和 `bypass_duplicate` 选项,指定相关所有的 `bais`、 `norm`、 `dwconv`、 `dcn` 和 `bypass` 参数。例如令模型中所有的 BN 不进行参数衰减: + + ```python + optimizer = dict( + type='SGD', + lr=0.8, + weight_decay=1e-4, + paramwise_cfg=dict(norm_decay_mult=0.) + ) + ``` + +- 使用 `custom_keys` 指定参数 + + MMClassification 可通过 `custom_keys` 指定不同的参数使用不同的学习率或者权重衰减,例如对特定的参数不使用权重衰减: + + ```python + paramwise_cfg = dict( + custom_keys={ + 'backbone.cls_token': dict(decay_mult=0.0), + 'backbone.pos_embed': dict(decay_mult=0.0) + }) + + optimizer = dict( + type='SGD', + lr=0.8, + weight_decay=1e-4, + paramwise_cfg=paramwise_cfg) + ``` + + 对 backbone 使用更小的学习率与衰减系数: + + ```python + optimizer = dict( + type='SGD', + lr=0.8, + weight_decay=1e-4, + # backbone 的 'lr' and 'weight_decay' 分别为 0.1 * lr 和 0.9 * weight_decay + paramwise_cfg = dict(custom_keys={'backbone': dict(lr_mult=0.1, decay_mult=0.9)})) + ``` + +## 梯度裁剪与梯度累计 + +除了 PyTorch 优化器的基本功能,我们还提供了一些对优化器的增强功能,例如梯度裁剪、梯度累计等,参考 [MMCV](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py)。 + +### 梯度裁剪 + +在训练过程中,损失函数可能接近于一些异常陡峭的区域,从而导致梯度爆炸。而梯度裁剪可以帮助稳定训练过程,更多介绍可以参见[该页面](https://paperswithcode.com/method/gradient-clipping)。 + +目前我们支持在 `optimizer_config` 字段中添加 `grad_clip` 参数来进行梯度裁剪,更详细的参数可参考 [PyTorch 文档](https://pytorch.org/docs/stable/generated/torch.nn.utils.clip_grad_norm_.html)。 + +用例如下: + +```python +# norm_type: 使用的范数类型,此处使用范数2。 +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +``` + +当使用继承并修改基础配置方式时,如果基础配置中 `grad_clip=None`,需要添加 `_delete_=True`。有关 `_delete_` 可以参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html#id16)。案例如下: + +```python +_base_ = [./_base_/schedules/imagenet_bs256_coslr.py] + +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2), _delete_=True, type='OptimizerHook') +# 当 type 为 'OptimizerHook',可以省略 type;其他情况下,此处必须指明 type='xxxOptimizerHook'。 +``` + +### 梯度累计 + +计算资源缺乏缺乏时,每个训练批次的大小(batch size)只能设置为较小的值,这可能会影响模型的性能。 + +可以使用梯度累计来规避这一问题。 + +用例如下: + +```python +data = dict(samples_per_gpu=64) +optimizer_config = dict(type="GradientCumulativeOptimizerHook", cumulative_iters=4) +``` + +表示训练时,每 4 个 iter 执行一次反向传播。由于此时单张 GPU 上的批次大小为 64,也就等价于单张 GPU 上一次迭代的批次大小为 256,也即: + +```python +data = dict(samples_per_gpu=256) +optimizer_config = dict(type="OptimizerHook") +``` + +```{note} +当在 `optimizer_config` 不指定优化器钩子类型时,默认使用 `OptimizerHook`。 +``` + +## 用户自定义优化方法 + +在学术研究和工业实践中,可能需要使用 MMClassification 未实现的优化方法,可以通过以下方法添加。 + +```{note} +本部分将修改 MMClassification 源码或者向 MMClassification 框架添加代码,初学者可跳过。 +``` + +### 自定义优化器 + +#### 1. 定义一个新的优化器 + +一个自定义的优化器可根据如下规则进行定制 + +假设我们想添加一个名为 `MyOptimzer` 的优化器,其拥有参数 `a`, `b` 和 `c`。 +可以创建一个名为 `mmcls/core/optimizer` 的文件夹,并在目录下的一个文件,如 `mmcls/core/optimizer/my_optimizer.py` 中实现该自定义优化器: + +```python +from mmcv.runner import OPTIMIZERS +from torch.optim import Optimizer + + +@OPTIMIZERS.register_module() +class MyOptimizer(Optimizer): + + def __init__(self, a, b, c): + +``` + +#### 2. 注册优化器 + +要注册上面定义的上述模块,首先需要将此模块导入到主命名空间中。有两种方法可以实现它。 + +- 修改 `mmcls/core/optimizer/__init__.py`,将其导入至 `optimizer` 包;再修改 `mmcls/core/__init__.py` 以导入 `optimizer` 包 + + 创建 `mmcls/core/optimizer/__init__.py` 文件。 + 新定义的模块应导入到 `mmcls/core/optimizer/__init__.py` 中,以便注册器能找到新模块并将其添加: + +```python +# 在 mmcls/core/optimizer/__init__.py 中 +from .my_optimizer import MyOptimizer # MyOptimizer 是我们自定义的优化器的名字 + +__all__ = ['MyOptimizer'] +``` + +```python +# 在 mmcls/core/__init__.py 中 +... +from .optimizer import * # noqa: F401, F403 +``` + +- 在配置中使用 `custom_imports` 手动导入 + +```python +custom_imports = dict(imports=['mmcls.core.optimizer.my_optimizer'], allow_failed_imports=False) +``` + +`mmcls.core.optimizer.my_optimizer` 模块将会在程序开始阶段被导入,`MyOptimizer` 类会随之自动被注册。 +注意,只有包含 `MyOptmizer` 类的包会被导入。`mmcls.core.optimizer.my_optimizer.MyOptimizer` **不会** 被直接导入。 + +#### 3. 在配置文件中指定优化器 + +之后,用户便可在配置文件的 `optimizer` 域中使用 `MyOptimizer`。 +在配置中,优化器由 “optimizer” 字段定义,如下所示: + +```python +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +``` + +要使用自定义的优化器,可以将该字段更改为 + +```python +optimizer = dict(type='MyOptimizer', a=a_value, b=b_value, c=c_value) +``` + +### 自定义优化器构造器 + +某些模型可能具有一些特定于参数的设置以进行优化,例如 BatchNorm 层的权重衰减。 + +虽然我们的 `DefaultOptimizerConstructor` 已经提供了这些强大的功能,但可能仍然无法覆盖需求。 +此时我们可以通过自定义优化器构造函数来进行其他细粒度的参数调整。 + +```python +from mmcv.runner.optimizer import OPTIMIZER_BUILDERS + + +@OPTIMIZER_BUILDERS.register_module() +class MyOptimizerConstructor: + + def __init__(self, optimizer_cfg, paramwise_cfg=None): + pass + + def __call__(self, model): + ... # 在这里实现自己的优化器构造器。 + return my_optimizer +``` + +[这里](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/optimizer/default_constructor.py#L11)是我们默认的优化器构造器的实现,可以作为新优化器构造器实现的模板。 diff --git a/downstream/mmdetection/.circleci/config.yml b/downstream/mmdetection/.circleci/config.yml new file mode 100644 index 0000000..da7cd35 --- /dev/null +++ b/downstream/mmdetection/.circleci/config.yml @@ -0,0 +1,162 @@ +version: 2.1 + +jobs: + lint: + docker: + - image: cimg/python:3.7.4 + steps: + - checkout + - run: + name: Install pre-commit hook + command: | + pip install pre-commit + pre-commit install + - run: + name: Linting + command: pre-commit run --all-files + - run: + name: Check docstring coverage + command: | + pip install interrogate + interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-regex "__repr__" --fail-under 50 mmdet + + build_cpu: + parameters: + # The python version must match available image tags in + # https://circleci.com/developer/images/image/cimg/python + python: + type: string + default: "3.7.4" + torch: + type: string + torchvision: + type: string + docker: + - image: cimg/python:<< parameters.python >> + resource_class: large + steps: + - checkout + - run: + name: Install Libraries + command: | + sudo apt-get update + sudo apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx libjpeg-dev zlib1g-dev libtinfo-dev libncurses5 + - run: + name: Configure Python & pip + command: | + pip install --upgrade pip + pip install wheel + - run: + name: Install PyTorch + command: | + python -V + pip install torch==<< parameters.torch >>+cpu torchvision==<< parameters.torchvision >>+cpu -f https://download.pytorch.org/whl/torch_stable.html + - when: + condition: + equal: [ "3.9.0", << parameters.python >> ] + steps: + - run: pip install "protobuf <= 3.20.1" && sudo apt-get update && sudo apt-get -y install libprotobuf-dev protobuf-compiler cmake + - run: + name: Install mmdet dependencies + command: | + pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cpu/torch<< parameters.torch >>/index.html + pip install -r requirements/tests.txt -r requirements/optional.txt + pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + pip install git+https://github.com/cocodataset/panopticapi.git + - run: + name: Build and install + command: | + pip install -e . + - run: + name: Run unittests + command: | + coverage run --branch --source mmdet -m pytest tests/ + coverage xml + coverage report -m + + build_cu101: + machine: + image: ubuntu-1604-cuda-10.1:201909-23 + resource_class: gpu.nvidia.small + steps: + - checkout + - run: + name: Install Libraries + command: | + sudo apt-get update + sudo apt-get install -y git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx + - run: + name: Configure Python & pip + command: | + pyenv global 3.7.0 + pip install --upgrade pip + pip install wheel + - run: + name: Install PyTorch + command: | + python -V + pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html + - run: + name: Install mmdet dependencies + # pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu101/torch${{matrix.torch_version}}/index.html + command: | + pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.6.0/index.html + pip install -r requirements/tests.txt -r requirements/optional.txt + pip install pycocotools + pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + pip install git+https://github.com/cocodataset/panopticapi.git + python -c 'import mmcv; print(mmcv.__version__)' + - run: + name: Build and install + command: | + python setup.py check -m -s + TORCH_CUDA_ARCH_LIST=7.0 pip install -e . + - run: + name: Run unittests + command: | + pytest tests/ + +workflows: + unit_tests: + jobs: + - lint + - build_cpu: + name: build_cpu_th1.6 + torch: 1.6.0 + torchvision: 0.7.0 + requires: + - lint + - build_cpu: + name: build_cpu_th1.7 + torch: 1.7.0 + torchvision: 0.8.1 + requires: + - lint + - build_cpu: + name: build_cpu_th1.8_py3.9 + torch: 1.8.0 + torchvision: 0.9.0 + python: "3.9.0" + requires: + - lint + - build_cpu: + name: build_cpu_th1.9_py3.8 + torch: 1.9.0 + torchvision: 0.10.0 + python: "3.8.12" + requires: + - lint + - build_cpu: + name: build_cpu_th1.9_py3.9 + torch: 1.9.0 + torchvision: 0.10.0 + python: "3.9.0" + requires: + - lint + - build_cu101: + requires: + - build_cpu_th1.6 + - build_cpu_th1.7 + - build_cpu_th1.8_py3.9 + - build_cpu_th1.9_py3.8 + - build_cpu_th1.9_py3.9 diff --git a/downstream/mmdetection/.dev_scripts/batch_test_list.py b/downstream/mmdetection/.dev_scripts/batch_test_list.py new file mode 100644 index 0000000..1e74ce2 --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/batch_test_list.py @@ -0,0 +1,359 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# yapf: disable +atss = dict( + config='configs/atss/atss_r50_fpn_1x_coco.py', + checkpoint='atss_r50_fpn_1x_coco_20200209-985f7bd0.pth', + eval='bbox', + metric=dict(bbox_mAP=39.4), +) +autoassign = dict( + config='configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py', + checkpoint='auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.pth', + eval='bbox', + metric=dict(bbox_mAP=40.4), +) +carafe = dict( + config='configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.386_20200504_175733-385a75b7.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=38.6), +) +cascade_rcnn = [ + dict( + config='configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py', + checkpoint='cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth', + eval='bbox', + metric=dict(bbox_mAP=40.3), + ), + dict( + config='configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py', + checkpoint='cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=41.2, segm_mAP=35.9), + ), +] +cascade_rpn = dict( + config='configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py', + checkpoint='crpn_faster_rcnn_r50_caffe_fpn_1x_coco-c8283cca.pth', + eval='bbox', + metric=dict(bbox_mAP=40.4), +) +centripetalnet = dict( + config='configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py', # noqa + checkpoint='centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804-3ccc61e5.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=44.7), +) +cornernet = dict( + config='configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py', + checkpoint='cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618-79b44c30.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=41.2), +) +dcn = dict( + config='configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-d68aed1e.pth', + eval='bbox', + metric=dict(bbox_mAP=41.3), +) +deformable_detr = dict( + config='configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py', + checkpoint='deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=44.5), +) +detectors = dict( + config='configs/detectors/detectors_htc_r50_1x_coco.py', + checkpoint='detectors_htc_r50_1x_coco-329b1453.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=49.1, segm_mAP=42.6), +) +detr = dict( + config='configs/detr/detr_r50_8x2_150e_coco.py', + checkpoint='detr_r50_8x2_150e_coco_20201130_194835-2c4b8974.pth', + eval='bbox', + metric=dict(bbox_mAP=40.1), +) +double_heads = dict( + config='configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='dh_faster_rcnn_r50_fpn_1x_coco_20200130-586b67df.pth', + eval='bbox', + metric=dict(bbox_mAP=40.0), +) +dynamic_rcnn = dict( + config='configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py', + checkpoint='dynamic_rcnn_r50_fpn_1x-62a3f276.pth', + eval='bbox', + metric=dict(bbox_mAP=38.9), +) +empirical_attention = dict( + config='configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py', # noqa + checkpoint='faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130-403cccba.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=40.0), +) +faster_rcnn = dict( + config='configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth', + eval='bbox', + metric=dict(bbox_mAP=37.4), +) +fcos = dict( + config='configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py', # noqa + checkpoint='fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco-0a0d75a8.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=38.7), +) +foveabox = dict( + config='configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py', + checkpoint='fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203-8987880d.pth', + eval='bbox', + metric=dict(bbox_mAP=37.9), +) +free_anchor = dict( + config='configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py', + checkpoint='retinanet_free_anchor_r50_fpn_1x_coco_20200130-0f67375f.pth', + eval='bbox', + metric=dict(bbox_mAP=38.7), +) +fsaf = dict( + config='configs/fsaf/fsaf_r50_fpn_1x_coco.py', + checkpoint='fsaf_r50_fpn_1x_coco-94ccc51f.pth', + eval='bbox', + metric=dict(bbox_mAP=37.4), +) +gcnet = dict( + config='configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py', # noqa + checkpoint='mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202-587b99aa.pth', # noqa + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=40.4, segm_mAP=36.2), +) +gfl = dict( + config='configs/gfl/gfl_r50_fpn_1x_coco.py', + checkpoint='gfl_r50_fpn_1x_coco_20200629_121244-25944287.pth', + eval='bbox', + metric=dict(bbox_mAP=40.2), +) +gn = dict( + config='configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py', + checkpoint='mask_rcnn_r50_fpn_gn-all_2x_coco_20200206-8eee02a6.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=40.1, segm_mAP=36.4), +) +gn_ws = dict( + config='configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130-613d9fe2.pth', + eval='bbox', + metric=dict(bbox_mAP=39.7), +) +grid_rcnn = dict( + config='configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py', + checkpoint='grid_rcnn_r50_fpn_gn-head_2x_coco_20200130-6cca8223.pth', + eval='bbox', + metric=dict(bbox_mAP=40.4), +) +groie = dict( + config='configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715-66ee9516.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=38.3), +) +guided_anchoring = [ + dict( + config='configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py', # noqa + checkpoint='ga_retinanet_r50_caffe_fpn_1x_coco_20201020-39581c6f.pth', + eval='bbox', + metric=dict(bbox_mAP=36.9), + ), + dict( + config='configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py', + checkpoint='ga_faster_r50_caffe_fpn_1x_coco_20200702_000718-a11ccfe6.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=39.6), + ), +] +hrnet = dict( + config='configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py', + checkpoint='faster_rcnn_hrnetv2p_w18_1x_coco_20200130-56651a6d.pth', + eval='bbox', + metric=dict(bbox_mAP=36.9), +) +htc = dict( + config='configs/htc/htc_r50_fpn_1x_coco.py', + checkpoint='htc_r50_fpn_1x_coco_20200317-7332cf16.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=42.3, segm_mAP=37.4), +) +libra_rcnn = dict( + config='configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='libra_faster_rcnn_r50_fpn_1x_coco_20200130-3afee3a9.pth', + eval='bbox', + metric=dict(bbox_mAP=38.3), +) +mask_rcnn = dict( + config='configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py', + checkpoint='mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=38.2, segm_mAP=34.7), +) +ms_rcnn = dict( + config='configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py', + checkpoint='ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848-61c9355e.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=38.2, segm_mAP=36.0), +) +nas_fcos = dict( + config='configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py', # noqa + checkpoint='nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520-1bdba3ce.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=39.4), +) +nas_fpn = dict( + config='configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py', + checkpoint='retinanet_r50_nasfpn_crop640_50e_coco-0ad1f644.pth', + eval='bbox', + metric=dict(bbox_mAP=40.5), +) +paa = dict( + config='configs/paa/paa_r50_fpn_1x_coco.py', + checkpoint='paa_r50_fpn_1x_coco_20200821-936edec3.pth', + eval='bbox', + metric=dict(bbox_mAP=40.4), +) +pafpn = dict( + config='configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py', + checkpoint='faster_rcnn_r50_pafpn_1x_coco_bbox_mAP-0.375_20200503_105836-b7b4b9bd.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=37.5), +) +pisa = dict( + config='configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='pisa_faster_rcnn_r50_fpn_1x_coco-dea93523.pth', + eval='bbox', + metric=dict(bbox_mAP=38.4), +) +point_rend = dict( + config='configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py', + checkpoint='point_rend_r50_caffe_fpn_mstrain_1x_coco-1bcb5fb4.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=38.4, segm_mAP=36.3), +) +regnet = dict( + config='configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py', + checkpoint='mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141-2a9d1814.pth', # noqa + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=40.4, segm_mAP=36.7), +) +reppoints = dict( + config='configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py', + checkpoint='reppoints_moment_r50_fpn_1x_coco_20200330-b73db8d1.pth', + eval='bbox', + metric=dict(bbox_mAP=37.0), +) +res2net = dict( + config='configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py', + checkpoint='faster_rcnn_r2_101_fpn_2x_coco-175f1da6.pth', + eval='bbox', + metric=dict(bbox_mAP=43.0), +) +resnest = dict( + config='configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py', # noqa + checkpoint='faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco_20200926_125502-20289c16.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=42.0), +) +retinanet = dict( + config='configs/retinanet/retinanet_r50_fpn_1x_coco.py', + checkpoint='retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth', + eval='bbox', + metric=dict(bbox_mAP=36.5), +) +rpn = dict( + config='configs/rpn/rpn_r50_fpn_1x_coco.py', + checkpoint='rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth', + eval='proposal_fast', + metric=dict(AR_1000=58.2), +) +sabl = [ + dict( + config='configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py', + checkpoint='sabl_retinanet_r50_fpn_1x_coco-6c54fd4f.pth', + eval='bbox', + metric=dict(bbox_mAP=37.7), + ), + dict( + config='configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='sabl_faster_rcnn_r50_fpn_1x_coco-e867595b.pth', + eval='bbox', + metric=dict(bbox_mAP=39.9), + ), +] +scnet = dict( + config='configs/scnet/scnet_r50_fpn_1x_coco.py', + checkpoint='scnet_r50_fpn_1x_coco-c3f09857.pth', + eval='bbox', + metric=dict(bbox_mAP=43.5), +) +sparse_rcnn = dict( + config='configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py', + checkpoint='sparse_rcnn_r50_fpn_1x_coco_20201222_214453-dc79b137.pth', + eval='bbox', + metric=dict(bbox_mAP=37.9), +) +ssd = [ + dict( + config='configs/ssd/ssd300_coco.py', + checkpoint='ssd300_coco_20210803_015428-d231a06e.pth', + eval='bbox', + metric=dict(bbox_mAP=25.5), + ), + dict( + config='configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py', + checkpoint='ssdlite_mobilenetv2_scratch_600e_coco_20210629_110627-974d9307.pth',# noqa + eval='bbox', + metric=dict(bbox_mAP=21.3), + ), +] +tridentnet = dict( + config='configs/tridentnet/tridentnet_r50_caffe_1x_coco.py', + checkpoint='tridentnet_r50_caffe_1x_coco_20201230_141838-2ec0b530.pth', + eval='bbox', + metric=dict(bbox_mAP=37.6), +) +vfnet = dict( + config='configs/vfnet/vfnet_r50_fpn_1x_coco.py', + checkpoint='vfnet_r50_fpn_1x_coco_20201027-38db6f58.pth', + eval='bbox', + metric=dict(bbox_mAP=41.6), +) +yolact = dict( + config='configs/yolact/yolact_r50_1x8_coco.py', + checkpoint='yolact_r50_1x8_coco_20200908-f38d58df.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=31.2, segm_mAP=29.0), +) +yolo = dict( + config='configs/yolo/yolov3_d53_320_273e_coco.py', + checkpoint='yolov3_d53_320_273e_coco-421362b6.pth', + eval='bbox', + metric=dict(bbox_mAP=27.9), +) +yolof = dict( + config='configs/yolof/yolof_r50_c5_8x8_1x_coco.py', + checkpoint='yolof_r50_c5_8x8_1x_coco_20210425_024427-8e864411.pth', + eval='bbox', + metric=dict(bbox_mAP=37.5), +) +centernet = dict( + config='configs/centernet/centernet_resnet18_dcnv2_140e_coco.py', + checkpoint='centernet_resnet18_dcnv2_140e_coco_20210702_155131-c8cd631f.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=29.5), +) +yolox = dict( + config='configs/yolox/yolox_tiny_8x8_300e_coco.py', + checkpoint='yolox_tiny_8x8_300e_coco_20210806_234250-4ff3b67e.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=31.5), +) +# yapf: enable diff --git a/downstream/mmdetection/.dev_scripts/batch_train_list.txt b/downstream/mmdetection/.dev_scripts/batch_train_list.txt new file mode 100644 index 0000000..a7004d7 --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/batch_train_list.txt @@ -0,0 +1,66 @@ +configs/atss/atss_r50_fpn_1x_coco.py +configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py +configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py +configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py +configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py +configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py +configs/detectors/detectors_htc_r50_1x_coco.py +configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py +configs/detr/detr_r50_8x2_150e_coco.py +configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py +configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py +configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py +configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py +configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py +configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py +configs/fsaf/fsaf_r50_fpn_1x_coco.py +configs/gfl/gfl_r50_fpn_1x_coco.py +configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py +configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py +configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py +configs/htc/htc_r50_fpn_1x_coco.py +configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py +configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py +configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py +configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py +configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py +configs/paa/paa_r50_fpn_1x_coco.py +configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py +configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py +configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py +configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py +configs/rpn/rpn_r50_fpn_1x_coco.py +configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py +configs/ssd/ssd300_coco.py +configs/tridentnet/tridentnet_r50_caffe_1x_coco.py +configs/vfnet/vfnet_r50_fpn_1x_coco.py +configs/yolact/yolact_r50_8x8_coco.py +configs/yolo/yolov3_d53_320_273e_coco.py +configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py +configs/scnet/scnet_r50_fpn_1x_coco.py +configs/yolof/yolof_r50_c5_8x8_1x_coco.py +configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py +configs/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco.py +configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py +configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py +configs/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py +configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py +configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py +configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py +configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py +configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py +configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py +configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py +configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py +configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py +configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py +configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py +configs/centernet/centernet_resnet18_dcnv2_140e_coco.py +configs/yolox/yolox_tiny_8x8_300e_coco.py +configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py +configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py diff --git a/downstream/mmdetection/.dev_scripts/benchmark_filter.py b/downstream/mmdetection/.dev_scripts/benchmark_filter.py new file mode 100644 index 0000000..178cd9c --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/benchmark_filter.py @@ -0,0 +1,167 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + + +def parse_args(): + parser = argparse.ArgumentParser(description='Filter configs to train') + parser.add_argument( + '--basic-arch', + action='store_true', + help='to train models in basic arch') + parser.add_argument( + '--datasets', action='store_true', help='to train models in dataset') + parser.add_argument( + '--data-pipeline', + action='store_true', + help='to train models related to data pipeline, e.g. augmentations') + parser.add_argument( + '--nn-module', + action='store_true', + help='to train models related to neural network modules') + parser.add_argument( + '--model-options', + nargs='+', + help='custom options to special model benchmark') + parser.add_argument( + '--out', + type=str, + default='batch_train_list.txt', + help='output path of gathered metrics to be stored') + args = parser.parse_args() + return args + + +basic_arch_root = [ + 'atss', 'autoassign', 'cascade_rcnn', 'cascade_rpn', 'centripetalnet', + 'cornernet', 'detectors', 'deformable_detr', 'detr', 'double_heads', + 'dynamic_rcnn', 'faster_rcnn', 'fcos', 'foveabox', 'fp16', 'free_anchor', + 'fsaf', 'gfl', 'ghm', 'grid_rcnn', 'guided_anchoring', 'htc', 'ld', + 'libra_rcnn', 'mask_rcnn', 'ms_rcnn', 'nas_fcos', 'paa', 'pisa', + 'point_rend', 'reppoints', 'retinanet', 'rpn', 'sabl', 'ssd', 'tridentnet', + 'vfnet', 'yolact', 'yolo', 'sparse_rcnn', 'scnet', 'yolof', 'centernet' +] + +datasets_root = [ + 'wider_face', 'pascal_voc', 'cityscapes', 'lvis', 'deepfashion' +] + +data_pipeline_root = ['albu_example', 'instaboost'] + +nn_module_root = [ + 'carafe', 'dcn', 'empirical_attention', 'gcnet', 'gn', 'gn+ws', 'hrnet', + 'pafpn', 'nas_fpn', 'regnet', 'resnest', 'res2net', 'groie' +] + +benchmark_pool = [ + 'configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py', + 'configs/atss/atss_r50_fpn_1x_coco.py', + 'configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py', + 'configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py', + 'configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py', + 'configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py', + 'configs/centernet/centernet_resnet18_dcnv2_140e_coco.py', + 'configs/centripetalnet/' + 'centripetalnet_hourglass104_mstest_16x6_210e_coco.py', + 'configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py', + 'configs/cornernet/' + 'cornernet_hourglass104_mstest_8x6_210e_coco.py', + 'configs/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py', + 'configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py', + 'configs/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco.py', + 'configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py', + 'configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py', + 'configs/detectors/detectors_htc_r50_1x_coco.py', + 'configs/detr/detr_r50_8x2_150e_coco.py', + 'configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py', + 'configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py', + 'configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py', # noqa + 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py', + 'configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py', + 'configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py', + 'configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py', + 'configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py', + 'configs/fcos/fcos_center_r50_caffe_fpn_gn-head_4x4_1x_coco.py', + 'configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py', + 'configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py', + 'configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py', + 'configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py', + 'configs/fsaf/fsaf_r50_fpn_1x_coco.py', + 'configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py', + 'configs/gfl/gfl_r50_fpn_1x_coco.py', + 'configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py', + 'configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py', + 'configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py', + 'configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py', + 'configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py', + 'configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py', + 'configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py', + 'configs/htc/htc_r50_fpn_1x_coco.py', + 'configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py', + 'configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py', + 'configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py', + 'configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py', + 'configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py', + 'configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py', + 'configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py', + 'configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py', + 'configs/paa/paa_r50_fpn_1x_coco.py', + 'configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py', + 'configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py', + 'configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py', + 'configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py', + 'configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py', + 'configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py', + 'configs/resnest/' + 'mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py', + 'configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py', + 'configs/rpn/rpn_r50_fpn_1x_coco.py', + 'configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py', + 'configs/ssd/ssd300_coco.py', + 'configs/tridentnet/tridentnet_r50_caffe_1x_coco.py', + 'configs/vfnet/vfnet_r50_fpn_1x_coco.py', + 'configs/yolact/yolact_r50_1x8_coco.py', + 'configs/yolo/yolov3_d53_320_273e_coco.py', + 'configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py', + 'configs/scnet/scnet_r50_fpn_1x_coco.py', + 'configs/yolof/yolof_r50_c5_8x8_1x_coco.py', +] + + +def main(): + args = parse_args() + + benchmark_type = [] + if args.basic_arch: + benchmark_type += basic_arch_root + if args.datasets: + benchmark_type += datasets_root + if args.data_pipeline: + benchmark_type += data_pipeline_root + if args.nn_module: + benchmark_type += nn_module_root + + special_model = args.model_options + if special_model is not None: + benchmark_type += special_model + + config_dpath = 'configs/' + benchmark_configs = [] + for cfg_root in benchmark_type: + cfg_dir = osp.join(config_dpath, cfg_root) + configs = os.scandir(cfg_dir) + for cfg in configs: + config_path = osp.join(cfg_dir, cfg.name) + if (config_path in benchmark_pool + and config_path not in benchmark_configs): + benchmark_configs.append(config_path) + + print(f'Totally found {len(benchmark_configs)} configs to benchmark') + with open(args.out, 'w') as f: + for config in benchmark_configs: + f.write(config + '\n') + + +if __name__ == '__main__': + main() diff --git a/downstream/mmdetection/.dev_scripts/benchmark_inference_fps.py b/downstream/mmdetection/.dev_scripts/benchmark_inference_fps.py new file mode 100644 index 0000000..81dcd6b --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/benchmark_inference_fps.py @@ -0,0 +1,170 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + +import mmcv +from mmcv import Config, DictAction +from mmcv.runner import init_dist +from terminaltables import GithubFlavoredMarkdownTable + +from tools.analysis_tools.benchmark import repeat_measure_inference_speed + + +def parse_args(): + parser = argparse.ArgumentParser( + description='MMDet benchmark a model of FPS') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint_root', help='Checkpoint file root path') + parser.add_argument( + '--round-num', + type=int, + default=1, + help='round a number to a given precision in decimal digits') + parser.add_argument( + '--repeat-num', + type=int, + default=1, + help='number of repeat times of measurement for averaging the results') + parser.add_argument( + '--out', type=str, help='output path of gathered fps to be stored') + parser.add_argument( + '--max-iter', type=int, default=2000, help='num of max iter') + parser.add_argument( + '--log-interval', type=int, default=50, help='interval of logging') + parser.add_argument( + '--fuse-conv-bn', + action='store_true', + help='Whether to fuse conv and bn, this will slightly increase' + 'the inference speed') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + return args + + +def results2markdown(result_dict): + table_data = [] + is_multiple_results = False + for cfg_name, value in result_dict.items(): + name = cfg_name.replace('configs/', '') + fps = value['fps'] + ms_times_pre_image = value['ms_times_pre_image'] + if isinstance(fps, list): + is_multiple_results = True + mean_fps = value['mean_fps'] + mean_times_pre_image = value['mean_times_pre_image'] + fps_str = ','.join([str(s) for s in fps]) + ms_times_pre_image_str = ','.join( + [str(s) for s in ms_times_pre_image]) + table_data.append([ + name, fps_str, mean_fps, ms_times_pre_image_str, + mean_times_pre_image + ]) + else: + table_data.append([name, fps, ms_times_pre_image]) + + if is_multiple_results: + table_data.insert(0, [ + 'model', 'fps', 'mean_fps', 'times_pre_image(ms)', + 'mean_times_pre_image(ms)' + ]) + + else: + table_data.insert(0, ['model', 'fps', 'times_pre_image(ms)']) + table = GithubFlavoredMarkdownTable(table_data) + print(table.table, flush=True) + + +if __name__ == '__main__': + args = parse_args() + assert args.round_num >= 0 + assert args.repeat_num >= 1 + + config = Config.fromfile(args.config) + + if args.launcher == 'none': + raise NotImplementedError('Only supports distributed mode') + else: + init_dist(args.launcher) + + result_dict = {} + for model_key in config: + model_infos = config[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + record_metrics = model_info['metric'] + cfg_path = model_info['config'].strip() + cfg = Config.fromfile(cfg_path) + checkpoint = osp.join(args.checkpoint_root, + model_info['checkpoint'].strip()) + try: + fps = repeat_measure_inference_speed(cfg, checkpoint, + args.max_iter, + args.log_interval, + args.fuse_conv_bn, + args.repeat_num) + if args.repeat_num > 1: + fps_list = [round(fps_, args.round_num) for fps_ in fps] + times_pre_image_list = [ + round(1000 / fps_, args.round_num) for fps_ in fps + ] + mean_fps = round( + sum(fps_list) / len(fps_list), args.round_num) + mean_times_pre_image = round( + sum(times_pre_image_list) / len(times_pre_image_list), + args.round_num) + print( + f'{cfg_path} ' + f'Overall fps: {fps_list}[{mean_fps}] img / s, ' + f'times per image: ' + f'{times_pre_image_list}[{mean_times_pre_image}] ' + f'ms / img', + flush=True) + result_dict[cfg_path] = dict( + fps=fps_list, + mean_fps=mean_fps, + ms_times_pre_image=times_pre_image_list, + mean_times_pre_image=mean_times_pre_image) + else: + print( + f'{cfg_path} fps : {fps:.{args.round_num}f} img / s, ' + f'times per image: {1000 / fps:.{args.round_num}f} ' + f'ms / img', + flush=True) + result_dict[cfg_path] = dict( + fps=round(fps, args.round_num), + ms_times_pre_image=round(1000 / fps, args.round_num)) + except Exception as e: + print(f'{cfg_path} error: {repr(e)}') + if args.repeat_num > 1: + result_dict[cfg_path] = dict( + fps=[0], + mean_fps=0, + ms_times_pre_image=[0], + mean_times_pre_image=0) + else: + result_dict[cfg_path] = dict(fps=0, ms_times_pre_image=0) + + if args.out: + mmcv.mkdir_or_exist(args.out) + mmcv.dump(result_dict, osp.join(args.out, 'batch_inference_fps.json')) + + results2markdown(result_dict) diff --git a/downstream/mmdetection/.dev_scripts/benchmark_test_image.py b/downstream/mmdetection/.dev_scripts/benchmark_test_image.py new file mode 100644 index 0000000..75f7576 --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/benchmark_test_image.py @@ -0,0 +1,102 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +import os.path as osp +from argparse import ArgumentParser + +from mmcv import Config + +from mmdet.apis import inference_detector, init_detector, show_result_pyplot +from mmdet.utils import get_root_logger + + +def parse_args(): + parser = ArgumentParser() + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint_root', help='Checkpoint file root path') + parser.add_argument('--img', default='demo/demo.jpg', help='Image file') + parser.add_argument('--aug', action='store_true', help='aug test') + parser.add_argument('--model-name', help='model name to inference') + parser.add_argument('--show', action='store_true', help='show results') + parser.add_argument( + '--wait-time', + type=float, + default=1, + help='the interval of show (s), 0 is block') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--score-thr', type=float, default=0.3, help='bbox score threshold') + args = parser.parse_args() + return args + + +def inference_model(config_name, checkpoint, args, logger=None): + cfg = Config.fromfile(config_name) + if args.aug: + if 'flip' in cfg.data.test.pipeline[1]: + cfg.data.test.pipeline[1].flip = True + else: + if logger is not None: + logger.error(f'{config_name}: unable to start aug test') + else: + print(f'{config_name}: unable to start aug test', flush=True) + + model = init_detector(cfg, checkpoint, device=args.device) + # test a single image + result = inference_detector(model, args.img) + + # show the results + if args.show: + show_result_pyplot( + model, + args.img, + result, + score_thr=args.score_thr, + wait_time=args.wait_time) + return result + + +# Sample test whether the inference code is correct +def main(args): + config = Config.fromfile(args.config) + + # test single model + if args.model_name: + if args.model_name in config: + model_infos = config[args.model_name] + if not isinstance(model_infos, list): + model_infos = [model_infos] + model_info = model_infos[0] + config_name = model_info['config'].strip() + print(f'processing: {config_name}', flush=True) + checkpoint = osp.join(args.checkpoint_root, + model_info['checkpoint'].strip()) + # build the model from a config file and a checkpoint file + inference_model(config_name, checkpoint, args) + return + else: + raise RuntimeError('model name input error.') + + # test all model + logger = get_root_logger( + log_file='benchmark_test_image.log', log_level=logging.ERROR) + + for model_key in config: + model_infos = config[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + print('processing: ', model_info['config'], flush=True) + config_name = model_info['config'].strip() + checkpoint = osp.join(args.checkpoint_root, + model_info['checkpoint'].strip()) + try: + # build the model from a config file and a checkpoint file + inference_model(config_name, checkpoint, args, logger) + except Exception as e: + logger.error(f'{config_name} " : {repr(e)}') + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/downstream/mmdetection/.dev_scripts/check_links.py b/downstream/mmdetection/.dev_scripts/check_links.py new file mode 100755 index 0000000..b195d2a --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/check_links.py @@ -0,0 +1,157 @@ +# Modified from: +# https://github.com/allenai/allennlp/blob/main/scripts/check_links.py + +import argparse +import logging +import os +import pathlib +import re +import sys +from multiprocessing.dummy import Pool +from typing import NamedTuple, Optional, Tuple + +import requests +from mmcv.utils import get_logger + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Goes through all the inline-links ' + 'in markdown files and reports the breakages') + parser.add_argument( + '--num-threads', + type=int, + default=100, + help='Number of processes to confirm the link') + parser.add_argument('--https-proxy', type=str, help='https proxy') + parser.add_argument( + '--out', + type=str, + default='link_reports.txt', + help='output path of reports') + args = parser.parse_args() + return args + + +OK_STATUS_CODES = ( + 200, + 401, # the resource exists but may require some sort of login. + 403, # ^ same + 405, # HEAD method not allowed. + # the resource exists, but our default 'Accept-' header may not + # match what the server can provide. + 406, +) + + +class MatchTuple(NamedTuple): + source: str + name: str + link: str + + +def check_link( + match_tuple: MatchTuple, + http_session: requests.Session, + logger: logging = None) -> Tuple[MatchTuple, bool, Optional[str]]: + reason: Optional[str] = None + if match_tuple.link.startswith('http'): + result_ok, reason = check_url(match_tuple, http_session) + else: + result_ok = check_path(match_tuple) + if logger is None: + print(f" {'✓' if result_ok else '✗'} {match_tuple.link}") + else: + logger.info(f" {'✓' if result_ok else '✗'} {match_tuple.link}") + return match_tuple, result_ok, reason + + +def check_url(match_tuple: MatchTuple, + http_session: requests.Session) -> Tuple[bool, str]: + """Check if a URL is reachable.""" + try: + result = http_session.head( + match_tuple.link, timeout=5, allow_redirects=True) + return ( + result.ok or result.status_code in OK_STATUS_CODES, + f'status code = {result.status_code}', + ) + except (requests.ConnectionError, requests.Timeout): + return False, 'connection error' + + +def check_path(match_tuple: MatchTuple) -> bool: + """Check if a file in this repository exists.""" + relative_path = match_tuple.link.split('#')[0] + full_path = os.path.join( + os.path.dirname(str(match_tuple.source)), relative_path) + return os.path.exists(full_path) + + +def main(): + args = parse_args() + + # setup logger + logger = get_logger(name='mmdet', log_file=args.out) + + # setup https_proxy + if args.https_proxy: + os.environ['https_proxy'] = args.https_proxy + + # setup http_session + http_session = requests.Session() + for resource_prefix in ('http://', 'https://'): + http_session.mount( + resource_prefix, + requests.adapters.HTTPAdapter( + max_retries=5, + pool_connections=20, + pool_maxsize=args.num_threads), + ) + + logger.info('Finding all markdown files in the current directory...') + + project_root = (pathlib.Path(__file__).parent / '..').resolve() + markdown_files = project_root.glob('**/*.md') + + all_matches = set() + url_regex = re.compile(r'\[([^!][^\]]+)\]\(([^)(]+)\)') + for markdown_file in markdown_files: + with open(markdown_file) as handle: + for line in handle.readlines(): + matches = url_regex.findall(line) + for name, link in matches: + if 'localhost' not in link: + all_matches.add( + MatchTuple( + source=str(markdown_file), + name=name, + link=link)) + + logger.info(f' {len(all_matches)} markdown files found') + logger.info('Checking to make sure we can retrieve each link...') + + with Pool(processes=args.num_threads) as pool: + results = pool.starmap(check_link, [(match, http_session, logger) + for match in list(all_matches)]) + + # collect unreachable results + unreachable_results = [(match_tuple, reason) + for match_tuple, success, reason in results + if not success] + + if unreachable_results: + logger.info('================================================') + logger.info(f'Unreachable links ({len(unreachable_results)}):') + for match_tuple, reason in unreachable_results: + logger.info(' > Source: ' + match_tuple.source) + logger.info(' Name: ' + match_tuple.name) + logger.info(' Link: ' + match_tuple.link) + if reason is not None: + logger.info(' Reason: ' + reason) + sys.exit(1) + logger.info('No Unreachable link found.') + + +if __name__ == '__main__': + main() diff --git a/downstream/mmdetection/.dev_scripts/convert_test_benchmark_script.py b/downstream/mmdetection/.dev_scripts/convert_test_benchmark_script.py new file mode 100644 index 0000000..c31cad4 --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/convert_test_benchmark_script.py @@ -0,0 +1,119 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + +from mmcv import Config + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert benchmark model list to script') + parser.add_argument('config', help='test config file path') + parser.add_argument('--port', type=int, default=29666, help='dist port') + parser.add_argument( + '--work-dir', + default='tools/batch_test', + help='the dir to save metric') + parser.add_argument( + '--run', action='store_true', help='run script directly') + parser.add_argument( + '--out', type=str, help='path to save model benchmark script') + + args = parser.parse_args() + return args + + +def process_model_info(model_info, work_dir): + config = model_info['config'].strip() + fname, _ = osp.splitext(osp.basename(config)) + job_name = fname + work_dir = osp.join(work_dir, fname) + checkpoint = model_info['checkpoint'].strip() + if not isinstance(model_info['eval'], list): + evals = [model_info['eval']] + else: + evals = model_info['eval'] + eval = ' '.join(evals) + return dict( + config=config, + job_name=job_name, + work_dir=work_dir, + checkpoint=checkpoint, + eval=eval) + + +def create_test_bash_info(commands, model_test_dict, port, script_name, + partition): + config = model_test_dict['config'] + job_name = model_test_dict['job_name'] + checkpoint = model_test_dict['checkpoint'] + work_dir = model_test_dict['work_dir'] + eval = model_test_dict['eval'] + + echo_info = f' \necho \'{config}\' &' + commands.append(echo_info) + commands.append('\n') + + command_info = f'GPUS=8 GPUS_PER_NODE=8 ' \ + f'CPUS_PER_TASK=2 {script_name} ' + + command_info += f'{partition} ' + command_info += f'{job_name} ' + command_info += f'{config} ' + command_info += f'$CHECKPOINT_DIR/{checkpoint} ' + command_info += f'--work-dir {work_dir} ' + + command_info += f'--eval {eval} ' + command_info += f'--cfg-option dist_params.port={port} ' + command_info += ' &' + + commands.append(command_info) + + +def main(): + args = parse_args() + if args.out: + out_suffix = args.out.split('.')[-1] + assert args.out.endswith('.sh'), \ + f'Expected out file path suffix is .sh, but get .{out_suffix}' + assert args.out or args.run, \ + ('Please specify at least one operation (save/run/ the ' + 'script) with the argument "--out" or "--run"') + + commands = [] + partition_name = 'PARTITION=$1 ' + commands.append(partition_name) + commands.append('\n') + + checkpoint_root = 'CHECKPOINT_DIR=$2 ' + commands.append(checkpoint_root) + commands.append('\n') + + script_name = osp.join('tools', 'slurm_test.sh') + port = args.port + work_dir = args.work_dir + + cfg = Config.fromfile(args.config) + + for model_key in cfg: + model_infos = cfg[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + print('processing: ', model_info['config']) + model_test_dict = process_model_info(model_info, work_dir) + create_test_bash_info(commands, model_test_dict, port, script_name, + '$PARTITION') + port += 1 + + command_str = ''.join(commands) + if args.out: + with open(args.out, 'w') as f: + f.write(command_str) + if args.run: + os.system(command_str) + + +if __name__ == '__main__': + main() diff --git a/downstream/mmdetection/.dev_scripts/convert_train_benchmark_script.py b/downstream/mmdetection/.dev_scripts/convert_train_benchmark_script.py new file mode 100644 index 0000000..1ccd8e9 --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/convert_train_benchmark_script.py @@ -0,0 +1,99 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert benchmark model json to script') + parser.add_argument( + 'txt_path', type=str, help='txt path output by benchmark_filter') + parser.add_argument( + '--partition', + type=str, + default='openmmlab', + help='slurm partition name') + parser.add_argument( + '--max-keep-ckpts', + type=int, + default=1, + help='The maximum checkpoints to keep') + parser.add_argument( + '--run', action='store_true', help='run script directly') + parser.add_argument( + '--out', type=str, help='path to save model benchmark script') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + if args.out: + out_suffix = args.out.split('.')[-1] + assert args.out.endswith('.sh'), \ + f'Expected out file path suffix is .sh, but get .{out_suffix}' + assert args.out or args.run, \ + ('Please specify at least one operation (save/run/ the ' + 'script) with the argument "--out" or "--run"') + + partition = args.partition # cluster name + + root_name = './tools' + train_script_name = osp.join(root_name, 'slurm_train.sh') + # stdout is no output + stdout_cfg = '>/dev/null' + + max_keep_ckpts = args.max_keep_ckpts + + commands = [] + with open(args.txt_path, 'r') as f: + model_cfgs = f.readlines() + for i, cfg in enumerate(model_cfgs): + cfg = cfg.strip() + if len(cfg) == 0: + continue + # print cfg name + echo_info = f'echo \'{cfg}\' &' + commands.append(echo_info) + commands.append('\n') + + fname, _ = osp.splitext(osp.basename(cfg)) + out_fname = osp.join(root_name, 'work_dir', fname) + # default setting + if cfg.find('16x') >= 0: + command_info = f'GPUS=16 GPUS_PER_NODE=8 ' \ + f'CPUS_PER_TASK=2 {train_script_name} ' + elif cfg.find('gn-head_4x4_1x_coco.py') >= 0 or \ + cfg.find('gn-head_4x4_2x_coco.py') >= 0: + command_info = f'GPUS=4 GPUS_PER_NODE=4 ' \ + f'CPUS_PER_TASK=2 {train_script_name} ' + else: + command_info = f'GPUS=8 GPUS_PER_NODE=8 ' \ + f'CPUS_PER_TASK=2 {train_script_name} ' + command_info += f'{partition} ' + command_info += f'{fname} ' + command_info += f'{cfg} ' + command_info += f'{out_fname} ' + if max_keep_ckpts: + command_info += f'--cfg-options ' \ + f'checkpoint_config.max_keep_ckpts=' \ + f'{max_keep_ckpts}' + ' ' + command_info += f'{stdout_cfg} &' + + commands.append(command_info) + + if i < len(model_cfgs): + commands.append('\n') + + command_str = ''.join(commands) + if args.out: + with open(args.out, 'w') as f: + f.write(command_str) + if args.run: + os.system(command_str) + + +if __name__ == '__main__': + main() diff --git a/downstream/mmdetection/.dev_scripts/gather_models.py b/downstream/mmdetection/.dev_scripts/gather_models.py new file mode 100644 index 0000000..42e615c --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/gather_models.py @@ -0,0 +1,340 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import glob +import json +import os.path as osp +import shutil +import subprocess +from collections import OrderedDict + +import mmcv +import torch +import yaml + + +def ordered_yaml_dump(data, stream=None, Dumper=yaml.SafeDumper, **kwds): + + class OrderedDumper(Dumper): + pass + + def _dict_representer(dumper, data): + return dumper.represent_mapping( + yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, data.items()) + + OrderedDumper.add_representer(OrderedDict, _dict_representer) + return yaml.dump(data, stream, OrderedDumper, **kwds) + + +def process_checkpoint(in_file, out_file): + checkpoint = torch.load(in_file, map_location='cpu') + # remove optimizer for smaller file size + if 'optimizer' in checkpoint: + del checkpoint['optimizer'] + + # remove ema state_dict + for key in list(checkpoint['state_dict']): + if key.startswith('ema_'): + checkpoint['state_dict'].pop(key) + + # if it is necessary to remove some sensitive data in checkpoint['meta'], + # add the code here. + if torch.__version__ >= '1.6': + torch.save(checkpoint, out_file, _use_new_zipfile_serialization=False) + else: + torch.save(checkpoint, out_file) + sha = subprocess.check_output(['sha256sum', out_file]).decode() + final_file = out_file.rstrip('.pth') + '-{}.pth'.format(sha[:8]) + subprocess.Popen(['mv', out_file, final_file]) + return final_file + + +def is_by_epoch(config): + cfg = mmcv.Config.fromfile('./configs/' + config) + return cfg.runner.type == 'EpochBasedRunner' + + +def get_final_epoch_or_iter(config): + cfg = mmcv.Config.fromfile('./configs/' + config) + if cfg.runner.type == 'EpochBasedRunner': + return cfg.runner.max_epochs + else: + return cfg.runner.max_iters + + +def get_best_epoch_or_iter(exp_dir): + best_epoch_iter_full_path = list( + sorted(glob.glob(osp.join(exp_dir, 'best_*.pth'))))[-1] + best_epoch_or_iter_model_path = best_epoch_iter_full_path.split('/')[-1] + best_epoch_or_iter = best_epoch_or_iter_model_path.\ + split('_')[-1].split('.')[0] + return best_epoch_or_iter_model_path, int(best_epoch_or_iter) + + +def get_real_epoch_or_iter(config): + cfg = mmcv.Config.fromfile('./configs/' + config) + if cfg.runner.type == 'EpochBasedRunner': + epoch = cfg.runner.max_epochs + if cfg.data.train.type == 'RepeatDataset': + epoch *= cfg.data.train.times + return epoch + else: + return cfg.runner.max_iters + + +def get_final_results(log_json_path, + epoch_or_iter, + results_lut, + by_epoch=True): + result_dict = dict() + last_val_line = None + last_train_line = None + last_val_line_idx = -1 + last_train_line_idx = -1 + with open(log_json_path, 'r') as f: + for i, line in enumerate(f.readlines()): + log_line = json.loads(line) + if 'mode' not in log_line.keys(): + continue + + if by_epoch: + if (log_line['mode'] == 'train' + and log_line['epoch'] == epoch_or_iter): + result_dict['memory'] = log_line['memory'] + + if (log_line['mode'] == 'val' + and log_line['epoch'] == epoch_or_iter): + result_dict.update({ + key: log_line[key] + for key in results_lut if key in log_line + }) + return result_dict + else: + if log_line['mode'] == 'train': + last_train_line_idx = i + last_train_line = log_line + + if log_line and log_line['mode'] == 'val': + last_val_line_idx = i + last_val_line = log_line + + # bug: max_iters = 768, last_train_line['iter'] = 750 + assert last_val_line_idx == last_train_line_idx + 1, \ + 'Log file is incomplete' + result_dict['memory'] = last_train_line['memory'] + result_dict.update({ + key: last_val_line[key] + for key in results_lut if key in last_val_line + }) + + return result_dict + + +def get_dataset_name(config): + # If there are more dataset, add here. + name_map = dict( + CityscapesDataset='Cityscapes', + CocoDataset='COCO', + CocoPanopticDataset='COCO', + DeepFashionDataset='Deep Fashion', + LVISV05Dataset='LVIS v0.5', + LVISV1Dataset='LVIS v1', + VOCDataset='Pascal VOC', + WIDERFaceDataset='WIDER Face', + OpenImagesDataset='OpenImagesDataset', + OpenImagesChallengeDataset='OpenImagesChallengeDataset') + cfg = mmcv.Config.fromfile('./configs/' + config) + return name_map[cfg.dataset_type] + + +def convert_model_info_to_pwc(model_infos): + pwc_files = {} + for model in model_infos: + cfg_folder_name = osp.split(model['config'])[-2] + pwc_model_info = OrderedDict() + pwc_model_info['Name'] = osp.split(model['config'])[-1].split('.')[0] + pwc_model_info['In Collection'] = 'Please fill in Collection name' + pwc_model_info['Config'] = osp.join('configs', model['config']) + + # get metadata + memory = round(model['results']['memory'] / 1024, 1) + meta_data = OrderedDict() + meta_data['Training Memory (GB)'] = memory + if 'epochs' in model: + meta_data['Epochs'] = get_real_epoch_or_iter(model['config']) + else: + meta_data['Iterations'] = get_real_epoch_or_iter(model['config']) + pwc_model_info['Metadata'] = meta_data + + # get dataset name + dataset_name = get_dataset_name(model['config']) + + # get results + results = [] + # if there are more metrics, add here. + if 'bbox_mAP' in model['results']: + metric = round(model['results']['bbox_mAP'] * 100, 1) + results.append( + OrderedDict( + Task='Object Detection', + Dataset=dataset_name, + Metrics={'box AP': metric})) + if 'segm_mAP' in model['results']: + metric = round(model['results']['segm_mAP'] * 100, 1) + results.append( + OrderedDict( + Task='Instance Segmentation', + Dataset=dataset_name, + Metrics={'mask AP': metric})) + if 'PQ' in model['results']: + metric = round(model['results']['PQ'], 1) + results.append( + OrderedDict( + Task='Panoptic Segmentation', + Dataset=dataset_name, + Metrics={'PQ': metric})) + pwc_model_info['Results'] = results + + link_string = 'https://download.openmmlab.com/mmdetection/v2.0/' + link_string += '{}/{}'.format(model['config'].rstrip('.py'), + osp.split(model['model_path'])[-1]) + pwc_model_info['Weights'] = link_string + if cfg_folder_name in pwc_files: + pwc_files[cfg_folder_name].append(pwc_model_info) + else: + pwc_files[cfg_folder_name] = [pwc_model_info] + return pwc_files + + +def parse_args(): + parser = argparse.ArgumentParser(description='Gather benchmarked models') + parser.add_argument( + 'root', + type=str, + help='root path of benchmarked models to be gathered') + parser.add_argument( + 'out', type=str, help='output path of gathered models to be stored') + parser.add_argument( + '--best', + action='store_true', + help='whether to gather the best model.') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + models_root = args.root + models_out = args.out + mmcv.mkdir_or_exist(models_out) + + # find all models in the root directory to be gathered + raw_configs = list(mmcv.scandir('./configs', '.py', recursive=True)) + + # filter configs that is not trained in the experiments dir + used_configs = [] + for raw_config in raw_configs: + if osp.exists(osp.join(models_root, raw_config)): + used_configs.append(raw_config) + print(f'Find {len(used_configs)} models to be gathered') + + # find final_ckpt and log file for trained each config + # and parse the best performance + model_infos = [] + for used_config in used_configs: + exp_dir = osp.join(models_root, used_config) + by_epoch = is_by_epoch(used_config) + # check whether the exps is finished + if args.best is True: + final_model, final_epoch_or_iter = get_best_epoch_or_iter(exp_dir) + else: + final_epoch_or_iter = get_final_epoch_or_iter(used_config) + final_model = '{}_{}.pth'.format('epoch' if by_epoch else 'iter', + final_epoch_or_iter) + + model_path = osp.join(exp_dir, final_model) + # skip if the model is still training + if not osp.exists(model_path): + continue + + # get the latest logs + log_json_path = list( + sorted(glob.glob(osp.join(exp_dir, '*.log.json'))))[-1] + log_txt_path = list(sorted(glob.glob(osp.join(exp_dir, '*.log'))))[-1] + cfg = mmcv.Config.fromfile('./configs/' + used_config) + results_lut = cfg.evaluation.metric + if not isinstance(results_lut, list): + results_lut = [results_lut] + # case when using VOC, the evaluation key is only 'mAP' + # when using Panoptic Dataset, the evaluation key is 'PQ'. + for i, key in enumerate(results_lut): + if 'mAP' not in key and 'PQ' not in key: + results_lut[i] = key + '_mAP' + model_performance = get_final_results(log_json_path, + final_epoch_or_iter, results_lut, + by_epoch) + + if model_performance is None: + continue + + model_time = osp.split(log_txt_path)[-1].split('.')[0] + model_info = dict( + config=used_config, + results=model_performance, + model_time=model_time, + final_model=final_model, + log_json_path=osp.split(log_json_path)[-1]) + model_info['epochs' if by_epoch else 'iterations'] =\ + final_epoch_or_iter + model_infos.append(model_info) + + # publish model for each checkpoint + publish_model_infos = [] + for model in model_infos: + model_publish_dir = osp.join(models_out, model['config'].rstrip('.py')) + mmcv.mkdir_or_exist(model_publish_dir) + + model_name = osp.split(model['config'])[-1].split('.')[0] + + model_name += '_' + model['model_time'] + publish_model_path = osp.join(model_publish_dir, model_name) + trained_model_path = osp.join(models_root, model['config'], + model['final_model']) + + # convert model + final_model_path = process_checkpoint(trained_model_path, + publish_model_path) + + # copy log + shutil.copy( + osp.join(models_root, model['config'], model['log_json_path']), + osp.join(model_publish_dir, f'{model_name}.log.json')) + shutil.copy( + osp.join(models_root, model['config'], + model['log_json_path'].rstrip('.json')), + osp.join(model_publish_dir, f'{model_name}.log')) + + # copy config to guarantee reproducibility + config_path = model['config'] + config_path = osp.join( + 'configs', + config_path) if 'configs' not in config_path else config_path + target_config_path = osp.split(config_path)[-1] + shutil.copy(config_path, osp.join(model_publish_dir, + target_config_path)) + + model['model_path'] = final_model_path + publish_model_infos.append(model) + + models = dict(models=publish_model_infos) + print(f'Totally gathered {len(publish_model_infos)} models') + mmcv.dump(models, osp.join(models_out, 'model_info.json')) + + pwc_files = convert_model_info_to_pwc(publish_model_infos) + for name in pwc_files: + with open(osp.join(models_out, name + '_metafile.yml'), 'w') as f: + ordered_yaml_dump(pwc_files[name], f, encoding='utf-8') + + +if __name__ == '__main__': + main() diff --git a/downstream/mmdetection/.dev_scripts/gather_test_benchmark_metric.py b/downstream/mmdetection/.dev_scripts/gather_test_benchmark_metric.py new file mode 100644 index 0000000..07c6bf4 --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/gather_test_benchmark_metric.py @@ -0,0 +1,96 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import glob +import os.path as osp + +import mmcv +from mmcv import Config + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Gather benchmarked models metric') + parser.add_argument('config', help='test config file path') + parser.add_argument( + 'root', + type=str, + help='root path of benchmarked models to be gathered') + parser.add_argument( + '--out', type=str, help='output path of gathered metrics to be stored') + parser.add_argument( + '--not-show', action='store_true', help='not show metrics') + parser.add_argument( + '--show-all', action='store_true', help='show all model metrics') + + args = parser.parse_args() + return args + + +if __name__ == '__main__': + args = parse_args() + + root_path = args.root + metrics_out = args.out + result_dict = {} + + cfg = Config.fromfile(args.config) + + for model_key in cfg: + model_infos = cfg[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + record_metrics = model_info['metric'] + config = model_info['config'].strip() + fname, _ = osp.splitext(osp.basename(config)) + metric_json_dir = osp.join(root_path, fname) + if osp.exists(metric_json_dir): + json_list = glob.glob(osp.join(metric_json_dir, '*.json')) + if len(json_list) > 0: + log_json_path = list(sorted(json_list))[-1] + + metric = mmcv.load(log_json_path) + if config in metric.get('config', {}): + + new_metrics = dict() + for record_metric_key in record_metrics: + record_metric_key_bk = record_metric_key + old_metric = record_metrics[record_metric_key] + if record_metric_key == 'AR_1000': + record_metric_key = 'AR@1000' + if record_metric_key not in metric['metric']: + raise KeyError( + 'record_metric_key not exist, please ' + 'check your config') + new_metric = round( + metric['metric'][record_metric_key] * 100, 1) + new_metrics[record_metric_key_bk] = new_metric + + if args.show_all: + result_dict[config] = dict( + before=record_metrics, after=new_metrics) + else: + for record_metric_key in record_metrics: + old_metric = record_metrics[record_metric_key] + new_metric = new_metrics[record_metric_key] + if old_metric != new_metric: + result_dict[config] = dict( + before=record_metrics, + after=new_metrics) + break + else: + print(f'{config} not included in: {log_json_path}') + else: + print(f'{config} not exist file: {metric_json_dir}') + else: + print(f'{config} not exist dir: {metric_json_dir}') + + if metrics_out: + mmcv.mkdir_or_exist(metrics_out) + mmcv.dump(result_dict, + osp.join(metrics_out, 'batch_test_metric_info.json')) + if not args.not_show: + print('===================================') + for config_name, metrics in result_dict.items(): + print(config_name, metrics) + print('===================================') diff --git a/downstream/mmdetection/.dev_scripts/gather_train_benchmark_metric.py b/downstream/mmdetection/.dev_scripts/gather_train_benchmark_metric.py new file mode 100644 index 0000000..f9c6c80 --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/gather_train_benchmark_metric.py @@ -0,0 +1,150 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import glob +import os.path as osp + +import mmcv +from gather_models import get_final_results + +try: + import xlrd +except ImportError: + xlrd = None +try: + import xlutils + from xlutils.copy import copy +except ImportError: + xlutils = None + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Gather benchmarked models metric') + parser.add_argument( + 'root', + type=str, + help='root path of benchmarked models to be gathered') + parser.add_argument( + 'txt_path', type=str, help='txt path output by benchmark_filter') + parser.add_argument( + '--out', type=str, help='output path of gathered metrics to be stored') + parser.add_argument( + '--not-show', action='store_true', help='not show metrics') + parser.add_argument( + '--excel', type=str, help='input path of excel to be recorded') + parser.add_argument( + '--ncol', type=int, help='Number of column to be modified or appended') + + args = parser.parse_args() + return args + + +if __name__ == '__main__': + args = parse_args() + + if args.excel: + assert args.ncol, 'Please specify "--excel" and "--ncol" ' \ + 'at the same time' + if xlrd is None: + raise RuntimeError( + 'xlrd is not installed,' + 'Please use “pip install xlrd==1.2.0” to install') + if xlutils is None: + raise RuntimeError( + 'xlutils is not installed,' + 'Please use “pip install xlutils==2.0.0” to install') + readbook = xlrd.open_workbook(args.excel) + sheet = readbook.sheet_by_name('Sheet1') + sheet_info = {} + total_nrows = sheet.nrows + for i in range(3, sheet.nrows): + sheet_info[sheet.row_values(i)[0]] = i + xlrw = copy(readbook) + table = xlrw.get_sheet(0) + + root_path = args.root + metrics_out = args.out + + result_dict = {} + with open(args.txt_path, 'r') as f: + model_cfgs = f.readlines() + for i, config in enumerate(model_cfgs): + config = config.strip() + if len(config) == 0: + continue + + config_name = osp.split(config)[-1] + config_name = osp.splitext(config_name)[0] + result_path = osp.join(root_path, config_name) + if osp.exists(result_path): + # 1 read config + cfg = mmcv.Config.fromfile(config) + total_epochs = cfg.runner.max_epochs + final_results = cfg.evaluation.metric + if not isinstance(final_results, list): + final_results = [final_results] + final_results_out = [] + for key in final_results: + if 'proposal_fast' in key: + final_results_out.append('AR@1000') # RPN + elif 'mAP' not in key: + final_results_out.append(key + '_mAP') + + # 2 determine whether total_epochs ckpt exists + ckpt_path = f'epoch_{total_epochs}.pth' + if osp.exists(osp.join(result_path, ckpt_path)): + log_json_path = list( + sorted(glob.glob(osp.join(result_path, + '*.log.json'))))[-1] + + # 3 read metric + model_performance = get_final_results( + log_json_path, total_epochs, final_results_out) + if model_performance is None: + print(f'log file error: {log_json_path}') + continue + for performance in model_performance: + if performance in ['AR@1000', 'bbox_mAP', 'segm_mAP']: + metric = round( + model_performance[performance] * 100, 1) + model_performance[performance] = metric + result_dict[config] = model_performance + + # update and append excel content + if args.excel: + if 'AR@1000' in model_performance: + metrics = f'{model_performance["AR@1000"]}' \ + f'(AR@1000)' + elif 'segm_mAP' in model_performance: + metrics = f'{model_performance["bbox_mAP"]}/' \ + f'{model_performance["segm_mAP"]}' + else: + metrics = f'{model_performance["bbox_mAP"]}' + + row_num = sheet_info.get(config, None) + if row_num: + table.write(row_num, args.ncol, metrics) + else: + table.write(total_nrows, 0, config) + table.write(total_nrows, args.ncol, metrics) + total_nrows += 1 + + else: + print(f'{config} not exist: {ckpt_path}') + else: + print(f'not exist: {config}') + + # 4 save or print results + if metrics_out: + mmcv.mkdir_or_exist(metrics_out) + mmcv.dump(result_dict, + osp.join(metrics_out, 'model_metric_info.json')) + if not args.not_show: + print('===================================') + for config_name, metrics in result_dict.items(): + print(config_name, metrics) + print('===================================') + if args.excel: + filename, sufflx = osp.splitext(args.excel) + xlrw.save(f'{filename}_o{sufflx}') + print(f'>>> Output {filename}_o{sufflx}') diff --git a/downstream/mmdetection/.dev_scripts/linter.sh b/downstream/mmdetection/.dev_scripts/linter.sh new file mode 100644 index 0000000..b0fe0ac --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/linter.sh @@ -0,0 +1,3 @@ +yapf -r -i mmdet/ configs/ tests/ tools/ +isort -rc mmdet/ configs/ tests/ tools/ +flake8 . diff --git a/downstream/mmdetection/.dev_scripts/test_benchmark.sh b/downstream/mmdetection/.dev_scripts/test_benchmark.sh new file mode 100644 index 0000000..cb79950 --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/test_benchmark.sh @@ -0,0 +1,119 @@ +PARTITION=$1 +CHECKPOINT_DIR=$2 + +echo 'configs/atss/atss_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION atss_r50_fpn_1x_coco configs/atss/atss_r50_fpn_1x_coco.py $CHECKPOINT_DIR/atss_r50_fpn_1x_coco_20200209-985f7bd0.pth --work-dir tools/batch_test/atss_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29666 & +echo 'configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION autoassign_r50_fpn_8x2_1x_coco configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py $CHECKPOINT_DIR/auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.pth --work-dir tools/batch_test/autoassign_r50_fpn_8x2_1x_coco --eval bbox --cfg-option dist_params.port=29667 & +echo 'configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_carafe_1x_coco configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.386_20200504_175733-385a75b7.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_carafe_1x_coco --eval bbox --cfg-option dist_params.port=29668 & +echo 'configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION cascade_rcnn_r50_fpn_1x_coco configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth --work-dir tools/batch_test/cascade_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29669 & +echo 'configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION cascade_mask_rcnn_r50_fpn_1x_coco configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth --work-dir tools/batch_test/cascade_mask_rcnn_r50_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29670 & +echo 'configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION crpn_faster_rcnn_r50_caffe_fpn_1x_coco configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py $CHECKPOINT_DIR/crpn_faster_rcnn_r50_caffe_fpn_1x_coco-c8283cca.pth --work-dir tools/batch_test/crpn_faster_rcnn_r50_caffe_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29671 & +echo 'configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION centripetalnet_hourglass104_mstest_16x6_210e_coco configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py $CHECKPOINT_DIR/centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804-3ccc61e5.pth --work-dir tools/batch_test/centripetalnet_hourglass104_mstest_16x6_210e_coco --eval bbox --cfg-option dist_params.port=29672 & +echo 'configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION cornernet_hourglass104_mstest_8x6_210e_coco configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py $CHECKPOINT_DIR/cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618-79b44c30.pth --work-dir tools/batch_test/cornernet_hourglass104_mstest_8x6_210e_coco --eval bbox --cfg-option dist_params.port=29673 & +echo 'configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-d68aed1e.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco --eval bbox --cfg-option dist_params.port=29674 & +echo 'configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION deformable_detr_r50_16x2_50e_coco configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py $CHECKPOINT_DIR/deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.pth --work-dir tools/batch_test/deformable_detr_r50_16x2_50e_coco --eval bbox --cfg-option dist_params.port=29675 & +echo 'configs/detectors/detectors_htc_r50_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION detectors_htc_r50_1x_coco configs/detectors/detectors_htc_r50_1x_coco.py $CHECKPOINT_DIR/detectors_htc_r50_1x_coco-329b1453.pth --work-dir tools/batch_test/detectors_htc_r50_1x_coco --eval bbox segm --cfg-option dist_params.port=29676 & +echo 'configs/detr/detr_r50_8x2_150e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION detr_r50_8x2_150e_coco configs/detr/detr_r50_8x2_150e_coco.py $CHECKPOINT_DIR/detr_r50_8x2_150e_coco_20201130_194835-2c4b8974.pth --work-dir tools/batch_test/detr_r50_8x2_150e_coco --eval bbox --cfg-option dist_params.port=29677 & +echo 'configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION dh_faster_rcnn_r50_fpn_1x_coco configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/dh_faster_rcnn_r50_fpn_1x_coco_20200130-586b67df.pth --work-dir tools/batch_test/dh_faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29678 & +echo 'configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION dynamic_rcnn_r50_fpn_1x_coco configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/dynamic_rcnn_r50_fpn_1x-62a3f276.pth --work-dir tools/batch_test/dynamic_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29679 & +echo 'configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_attention_1111_1x_coco configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130-403cccba.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_attention_1111_1x_coco --eval bbox --cfg-option dist_params.port=29680 & +echo 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_1x_coco configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29681 & +echo 'configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py $CHECKPOINT_DIR/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco-0a0d75a8.pth --work-dir tools/batch_test/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco --eval bbox --cfg-option dist_params.port=29682 & +echo 'configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fovea_align_r50_fpn_gn-head_4x4_2x_coco configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py $CHECKPOINT_DIR/fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203-8987880d.pth --work-dir tools/batch_test/fovea_align_r50_fpn_gn-head_4x4_2x_coco --eval bbox --cfg-option dist_params.port=29683 & +echo 'configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION retinanet_free_anchor_r50_fpn_1x_coco configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py $CHECKPOINT_DIR/retinanet_free_anchor_r50_fpn_1x_coco_20200130-0f67375f.pth --work-dir tools/batch_test/retinanet_free_anchor_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29684 & +echo 'configs/fsaf/fsaf_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fsaf_r50_fpn_1x_coco configs/fsaf/fsaf_r50_fpn_1x_coco.py $CHECKPOINT_DIR/fsaf_r50_fpn_1x_coco-94ccc51f.pth --work-dir tools/batch_test/fsaf_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29685 & +echo 'configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py $CHECKPOINT_DIR/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202-587b99aa.pth --work-dir tools/batch_test/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco --eval bbox segm --cfg-option dist_params.port=29686 & +echo 'configs/gfl/gfl_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION gfl_r50_fpn_1x_coco configs/gfl/gfl_r50_fpn_1x_coco.py $CHECKPOINT_DIR/gfl_r50_fpn_1x_coco_20200629_121244-25944287.pth --work-dir tools/batch_test/gfl_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29687 & +echo 'configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION mask_rcnn_r50_fpn_gn-all_2x_coco configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py $CHECKPOINT_DIR/mask_rcnn_r50_fpn_gn-all_2x_coco_20200206-8eee02a6.pth --work-dir tools/batch_test/mask_rcnn_r50_fpn_gn-all_2x_coco --eval bbox segm --cfg-option dist_params.port=29688 & +echo 'configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_gn_ws-all_1x_coco configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130-613d9fe2.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_gn_ws-all_1x_coco --eval bbox --cfg-option dist_params.port=29689 & +echo 'configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION grid_rcnn_r50_fpn_gn-head_2x_coco configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py $CHECKPOINT_DIR/grid_rcnn_r50_fpn_gn-head_2x_coco_20200130-6cca8223.pth --work-dir tools/batch_test/grid_rcnn_r50_fpn_gn-head_2x_coco --eval bbox --cfg-option dist_params.port=29690 & +echo 'configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_groie_1x_coco configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715-66ee9516.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_groie_1x_coco --eval bbox --cfg-option dist_params.port=29691 & +echo 'configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ga_retinanet_r50_caffe_fpn_1x_coco configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py $CHECKPOINT_DIR/ga_retinanet_r50_caffe_fpn_1x_coco_20201020-39581c6f.pth --work-dir tools/batch_test/ga_retinanet_r50_caffe_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29692 & +echo 'configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ga_faster_r50_caffe_fpn_1x_coco configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py $CHECKPOINT_DIR/ga_faster_r50_caffe_fpn_1x_coco_20200702_000718-a11ccfe6.pth --work-dir tools/batch_test/ga_faster_r50_caffe_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29693 & +echo 'configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_hrnetv2p_w18_1x_coco configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_hrnetv2p_w18_1x_coco_20200130-56651a6d.pth --work-dir tools/batch_test/faster_rcnn_hrnetv2p_w18_1x_coco --eval bbox --cfg-option dist_params.port=29694 & +echo 'configs/htc/htc_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION htc_r50_fpn_1x_coco configs/htc/htc_r50_fpn_1x_coco.py $CHECKPOINT_DIR/htc_r50_fpn_1x_coco_20200317-7332cf16.pth --work-dir tools/batch_test/htc_r50_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29695 & +echo 'configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION libra_faster_rcnn_r50_fpn_1x_coco configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/libra_faster_rcnn_r50_fpn_1x_coco_20200130-3afee3a9.pth --work-dir tools/batch_test/libra_faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29696 & +echo 'configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION mask_rcnn_r50_fpn_1x_coco configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth --work-dir tools/batch_test/mask_rcnn_r50_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29697 & +echo 'configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ms_rcnn_r50_caffe_fpn_1x_coco configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py $CHECKPOINT_DIR/ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848-61c9355e.pth --work-dir tools/batch_test/ms_rcnn_r50_caffe_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29698 & +echo 'configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py $CHECKPOINT_DIR/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520-1bdba3ce.pth --work-dir tools/batch_test/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco --eval bbox --cfg-option dist_params.port=29699 & +echo 'configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION retinanet_r50_nasfpn_crop640_50e_coco configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py $CHECKPOINT_DIR/retinanet_r50_nasfpn_crop640_50e_coco-0ad1f644.pth --work-dir tools/batch_test/retinanet_r50_nasfpn_crop640_50e_coco --eval bbox --cfg-option dist_params.port=29700 & +echo 'configs/paa/paa_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION paa_r50_fpn_1x_coco configs/paa/paa_r50_fpn_1x_coco.py $CHECKPOINT_DIR/paa_r50_fpn_1x_coco_20200821-936edec3.pth --work-dir tools/batch_test/paa_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29701 & +echo 'configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_pafpn_1x_coco configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_pafpn_1x_coco_bbox_mAP-0.375_20200503_105836-b7b4b9bd.pth --work-dir tools/batch_test/faster_rcnn_r50_pafpn_1x_coco --eval bbox --cfg-option dist_params.port=29702 & +echo 'configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION pisa_faster_rcnn_r50_fpn_1x_coco configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/pisa_faster_rcnn_r50_fpn_1x_coco-dea93523.pth --work-dir tools/batch_test/pisa_faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29703 & +echo 'configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION point_rend_r50_caffe_fpn_mstrain_1x_coco configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py $CHECKPOINT_DIR/point_rend_r50_caffe_fpn_mstrain_1x_coco-1bcb5fb4.pth --work-dir tools/batch_test/point_rend_r50_caffe_fpn_mstrain_1x_coco --eval bbox segm --cfg-option dist_params.port=29704 & +echo 'configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION mask_rcnn_regnetx-3.2GF_fpn_1x_coco configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py $CHECKPOINT_DIR/mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141-2a9d1814.pth --work-dir tools/batch_test/mask_rcnn_regnetx-3.2GF_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29705 & +echo 'configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION reppoints_moment_r50_fpn_1x_coco configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py $CHECKPOINT_DIR/reppoints_moment_r50_fpn_1x_coco_20200330-b73db8d1.pth --work-dir tools/batch_test/reppoints_moment_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29706 & +echo 'configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r2_101_fpn_2x_coco configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py $CHECKPOINT_DIR/faster_rcnn_r2_101_fpn_2x_coco-175f1da6.pth --work-dir tools/batch_test/faster_rcnn_r2_101_fpn_2x_coco --eval bbox --cfg-option dist_params.port=29707 & +echo 'configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco_20200926_125502-20289c16.pth --work-dir tools/batch_test/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco --eval bbox --cfg-option dist_params.port=29708 & +echo 'configs/retinanet/retinanet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION retinanet_r50_fpn_1x_coco configs/retinanet/retinanet_r50_fpn_1x_coco.py $CHECKPOINT_DIR/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth --work-dir tools/batch_test/retinanet_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29709 & +echo 'configs/rpn/rpn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION rpn_r50_fpn_1x_coco configs/rpn/rpn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth --work-dir tools/batch_test/rpn_r50_fpn_1x_coco --eval proposal_fast --cfg-option dist_params.port=29710 & +echo 'configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION sabl_retinanet_r50_fpn_1x_coco configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py $CHECKPOINT_DIR/sabl_retinanet_r50_fpn_1x_coco-6c54fd4f.pth --work-dir tools/batch_test/sabl_retinanet_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29711 & +echo 'configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION sabl_faster_rcnn_r50_fpn_1x_coco configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/sabl_faster_rcnn_r50_fpn_1x_coco-e867595b.pth --work-dir tools/batch_test/sabl_faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29712 & +echo 'configs/scnet/scnet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION scnet_r50_fpn_1x_coco configs/scnet/scnet_r50_fpn_1x_coco.py $CHECKPOINT_DIR/scnet_r50_fpn_1x_coco-c3f09857.pth --work-dir tools/batch_test/scnet_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29713 & +echo 'configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION sparse_rcnn_r50_fpn_1x_coco configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/sparse_rcnn_r50_fpn_1x_coco_20201222_214453-dc79b137.pth --work-dir tools/batch_test/sparse_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29714 & +echo 'configs/ssd/ssd300_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ssd300_coco configs/ssd/ssd300_coco.py $CHECKPOINT_DIR/ssd300_coco_20210803_015428-d231a06e.pth --work-dir tools/batch_test/ssd300_coco --eval bbox --cfg-option dist_params.port=29715 & +echo 'configs/tridentnet/tridentnet_r50_caffe_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION tridentnet_r50_caffe_1x_coco configs/tridentnet/tridentnet_r50_caffe_1x_coco.py $CHECKPOINT_DIR/tridentnet_r50_caffe_1x_coco_20201230_141838-2ec0b530.pth --work-dir tools/batch_test/tridentnet_r50_caffe_1x_coco --eval bbox --cfg-option dist_params.port=29716 & +echo 'configs/vfnet/vfnet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION vfnet_r50_fpn_1x_coco configs/vfnet/vfnet_r50_fpn_1x_coco.py $CHECKPOINT_DIR/vfnet_r50_fpn_1x_coco_20201027-38db6f58.pth --work-dir tools/batch_test/vfnet_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29717 & +echo 'configs/yolact/yolact_r50_1x8_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION yolact_r50_1x8_coco configs/yolact/yolact_r50_1x8_coco.py $CHECKPOINT_DIR/yolact_r50_1x8_coco_20200908-f38d58df.pth --work-dir tools/batch_test/yolact_r50_1x8_coco --eval bbox segm --cfg-option dist_params.port=29718 & +echo 'configs/yolo/yolov3_d53_320_273e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION yolov3_d53_320_273e_coco configs/yolo/yolov3_d53_320_273e_coco.py $CHECKPOINT_DIR/yolov3_d53_320_273e_coco-421362b6.pth --work-dir tools/batch_test/yolov3_d53_320_273e_coco --eval bbox --cfg-option dist_params.port=29719 & +echo 'configs/yolof/yolof_r50_c5_8x8_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION yolof_r50_c5_8x8_1x_coco configs/yolof/yolof_r50_c5_8x8_1x_coco.py $CHECKPOINT_DIR/yolof_r50_c5_8x8_1x_coco_20210425_024427-8e864411.pth --work-dir tools/batch_test/yolof_r50_c5_8x8_1x_coco --eval bbox --cfg-option dist_params.port=29720 & +echo 'configs/centernet/centernet_resnet18_dcnv2_140e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION centernet_resnet18_dcnv2_140e_coco configs/centernet/centernet_resnet18_dcnv2_140e_coco.py $CHECKPOINT_DIR/centernet_resnet18_dcnv2_140e_coco_20210702_155131-c8cd631f.pth --work-dir tools/batch_test/centernet_resnet18_dcnv2_140e_coco --eval bbox --cfg-option dist_params.port=29721 & +echo 'configs/yolox/yolox_tiny_8x8_300e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION yolox_tiny_8x8_300e_coco configs/yolox/yolox_tiny_8x8_300e_coco.py $CHECKPOINT_DIR/yolox_tiny_8x8_300e_coco_20210806_234250-4ff3b67e.pth --work-dir tools/batch_test/yolox_tiny_8x8_300e_coco --eval bbox --cfg-option dist_params.port=29722 & +echo 'configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ssdlite_mobilenetv2_scratch_600e_coco configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py $CHECKPOINT_DIR/ssdlite_mobilenetv2_scratch_600e_coco_20210629_110627-974d9307.pth --work-dir tools/batch_test/ssdlite_mobilenetv2_scratch_600e_coco --eval bbox --cfg-option dist_params.port=29723 & diff --git a/downstream/mmdetection/.dev_scripts/test_init_backbone.py b/downstream/mmdetection/.dev_scripts/test_init_backbone.py new file mode 100644 index 0000000..862f4af --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/test_init_backbone.py @@ -0,0 +1,181 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Check out backbone whether successfully load pretrained checkpoint.""" +import copy +import os +from os.path import dirname, exists, join + +import pytest +from mmcv import Config, ProgressBar +from mmcv.runner import _load_checkpoint + +from mmdet.models import build_detector + + +def _get_config_directory(): + """Find the predefined detector config directory.""" + try: + # Assume we are running in the source mmdetection repo + repo_dpath = dirname(dirname(__file__)) + except NameError: + # For IPython development when this __file__ is not defined + import mmdet + repo_dpath = dirname(dirname(mmdet.__file__)) + config_dpath = join(repo_dpath, 'configs') + if not exists(config_dpath): + raise Exception('Cannot find config path') + return config_dpath + + +def _get_config_module(fname): + """Load a configuration as a python module.""" + from mmcv import Config + config_dpath = _get_config_directory() + config_fpath = join(config_dpath, fname) + config_mod = Config.fromfile(config_fpath) + return config_mod + + +def _get_detector_cfg(fname): + """Grab configs necessary to create a detector. + + These are deep copied to allow for safe modification of parameters without + influencing other tests. + """ + config = _get_config_module(fname) + model = copy.deepcopy(config.model) + return model + + +def _traversed_config_file(): + """We traversed all potential config files under the `config` file. If you + need to print details or debug code, you can use this function. + + If the `backbone.init_cfg` is None (do not use `Pretrained` init way), you + need add the folder name in `ignores_folder` (if the config files in this + folder all set backbone.init_cfg is None) or add config name in + `ignores_file` (if the config file set backbone.init_cfg is None) + """ + config_path = _get_config_directory() + check_cfg_names = [] + + # `base`, `legacy_1.x` and `common` ignored by default. + ignores_folder = ['_base_', 'legacy_1.x', 'common'] + # 'ld' need load teacher model, if want to check 'ld', + # please check teacher_config path first. + ignores_folder += ['ld'] + # `selfsup_pretrain` need convert model, if want to check this model, + # need to convert the model first. + ignores_folder += ['selfsup_pretrain'] + + # the `init_cfg` in 'centripetalnet', 'cornernet', 'cityscapes', + # 'scratch' is None. + # the `init_cfg` in ssdlite(`ssdlite_mobilenetv2_scratch_600e_coco.py`) + # is None + # Please confirm `bockbone.init_cfg` is None first. + ignores_folder += ['centripetalnet', 'cornernet', 'cityscapes', 'scratch'] + ignores_file = ['ssdlite_mobilenetv2_scratch_600e_coco.py'] + + for config_file_name in os.listdir(config_path): + if config_file_name not in ignores_folder: + config_file = join(config_path, config_file_name) + if os.path.isdir(config_file): + for config_sub_file in os.listdir(config_file): + if config_sub_file.endswith('py') and \ + config_sub_file not in ignores_file: + name = join(config_file, config_sub_file) + check_cfg_names.append(name) + return check_cfg_names + + +def _check_backbone(config, print_cfg=True): + """Check out backbone whether successfully load pretrained model, by using + `backbone.init_cfg`. + + First, using `mmcv._load_checkpoint` to load the checkpoint without + loading models. + Then, using `build_detector` to build models, and using + `model.init_weights()` to initialize the parameters. + Finally, assert weights and bias of each layer loaded from pretrained + checkpoint are equal to the weights and bias of original checkpoint. + For the convenience of comparison, we sum up weights and bias of + each loaded layer separately. + + Args: + config (str): Config file path. + print_cfg (bool): Whether print logger and return the result. + + Returns: + results (str or None): If backbone successfully load pretrained + checkpoint, return None; else, return config file path. + """ + if print_cfg: + print('-' * 15 + 'loading ', config) + cfg = Config.fromfile(config) + init_cfg = None + try: + init_cfg = cfg.model.backbone.init_cfg + init_flag = True + except AttributeError: + init_flag = False + if init_cfg is None or init_cfg.get('type') != 'Pretrained': + init_flag = False + if init_flag: + checkpoint = _load_checkpoint(init_cfg.checkpoint) + if 'state_dict' in checkpoint: + state_dict = checkpoint['state_dict'] + else: + state_dict = checkpoint + + model = build_detector( + cfg.model, + train_cfg=cfg.get('train_cfg'), + test_cfg=cfg.get('test_cfg')) + model.init_weights() + + checkpoint_layers = state_dict.keys() + for name, value in model.backbone.state_dict().items(): + if name in checkpoint_layers: + assert value.equal(state_dict[name]) + + if print_cfg: + print('-' * 10 + 'Successfully load checkpoint' + '-' * 10 + + '\n', ) + return None + else: + if print_cfg: + print(config + '\n' + '-' * 10 + + 'config file do not have init_cfg' + '-' * 10 + '\n') + return config + + +@pytest.mark.parametrize('config', _traversed_config_file()) +def test_load_pretrained(config): + """Check out backbone whether successfully load pretrained model by using + `backbone.init_cfg`. + + Details please refer to `_check_backbone` + """ + _check_backbone(config, print_cfg=False) + + +def _test_load_pretrained(): + """We traversed all potential config files under the `config` file. If you + need to print details or debug code, you can use this function. + + Returns: + check_cfg_names (list[str]): Config files that backbone initialized + from pretrained checkpoint might be problematic. Need to recheck + the config file. The output including the config files that the + backbone.init_cfg is None + """ + check_cfg_names = _traversed_config_file() + need_check_cfg = [] + + prog_bar = ProgressBar(len(check_cfg_names)) + for config in check_cfg_names: + init_cfg_name = _check_backbone(config) + if init_cfg_name is not None: + need_check_cfg.append(init_cfg_name) + prog_bar.update() + print('These config files need to be checked again') + print(need_check_cfg) diff --git a/downstream/mmdetection/.dev_scripts/train_benchmark.sh b/downstream/mmdetection/.dev_scripts/train_benchmark.sh new file mode 100644 index 0000000..dc30be9 --- /dev/null +++ b/downstream/mmdetection/.dev_scripts/train_benchmark.sh @@ -0,0 +1,134 @@ +echo 'configs/atss/atss_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab atss_r50_fpn_1x_coco configs/atss/atss_r50_fpn_1x_coco.py ./tools/work_dir/atss_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab autoassign_r50_fpn_8x2_1x_coco configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py ./tools/work_dir/autoassign_r50_fpn_8x2_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab cascade_mask_rcnn_r50_fpn_1x_coco configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/cascade_mask_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab crpn_faster_rcnn_r50_caffe_fpn_1x_coco configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py ./tools/work_dir/crpn_faster_rcnn_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/centernet/centernet_resnet18_dcnv2_140e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab centernet_resnet18_dcnv2_140e_coco configs/centernet/centernet_resnet18_dcnv2_140e_coco.py ./tools/work_dir/centernet_resnet18_dcnv2_140e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py' & +GPUS=16 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab centripetalnet_hourglass104_mstest_16x6_210e_coco configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py ./tools/work_dir/centripetalnet_hourglass104_mstest_16x6_210e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab cornernet_hourglass104_mstest_8x6_210e_coco configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py ./tools/work_dir/cornernet_hourglass104_mstest_8x6_210e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/detectors/detectors_htc_r50_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab detectors_htc_r50_1x_coco configs/detectors/detectors_htc_r50_1x_coco.py ./tools/work_dir/detectors_htc_r50_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py' & +GPUS=16 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab deformable_detr_r50_16x2_50e_coco configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py ./tools/work_dir/deformable_detr_r50_16x2_50e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/detr/detr_r50_8x2_150e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab detr_r50_8x2_150e_coco configs/detr/detr_r50_8x2_150e_coco.py ./tools/work_dir/detr_r50_8x2_150e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab dh_faster_rcnn_r50_fpn_1x_coco configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/dh_faster_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab dynamic_rcnn_r50_fpn_1x_coco configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/dynamic_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_1x_coco configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_caffe_dc5_mstrain_1x_coco configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py ./tools/work_dir/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_caffe_fpn_mstrain_1x_coco configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py ./tools/work_dir/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_caffe_fpn_1x_coco configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py ./tools/work_dir/faster_rcnn_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_ohem_1x_coco configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_ohem_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab fovea_align_r50_fpn_gn-head_4x4_2x_coco configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py ./tools/work_dir/fovea_align_r50_fpn_gn-head_4x4_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_fp16_1x_coco configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_fp16_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_r50_fpn_fp16_1x_coco configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py ./tools/work_dir/retinanet_r50_fpn_fp16_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_free_anchor_r50_fpn_1x_coco configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py ./tools/work_dir/retinanet_free_anchor_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/fsaf/fsaf_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab fsaf_r50_fpn_1x_coco configs/fsaf/fsaf_r50_fpn_1x_coco.py ./tools/work_dir/fsaf_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/gfl/gfl_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab gfl_r50_fpn_1x_coco configs/gfl/gfl_r50_fpn_1x_coco.py ./tools/work_dir/gfl_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_ghm_r50_fpn_1x_coco configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py ./tools/work_dir/retinanet_ghm_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab grid_rcnn_r50_fpn_gn-head_2x_coco configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py ./tools/work_dir/grid_rcnn_r50_fpn_gn-head_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ga_faster_r50_caffe_fpn_1x_coco configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py ./tools/work_dir/ga_faster_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/htc/htc_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab htc_r50_fpn_1x_coco configs/htc/htc_r50_fpn_1x_coco.py ./tools/work_dir/htc_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ld_r18_gflv1_r101_fpn_coco_1x configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py ./tools/work_dir/ld_r18_gflv1_r101_fpn_coco_1x --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab libra_faster_rcnn_r50_fpn_1x_coco configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/libra_faster_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py ./tools/work_dir/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ms_rcnn_r50_caffe_fpn_1x_coco configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py ./tools/work_dir/ms_rcnn_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py ./tools/work_dir/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/paa/paa_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab paa_r50_fpn_1x_coco configs/paa/paa_r50_fpn_1x_coco.py ./tools/work_dir/paa_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab pisa_mask_rcnn_r50_fpn_1x_coco configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/pisa_mask_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab point_rend_r50_caffe_fpn_mstrain_1x_coco configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py ./tools/work_dir/point_rend_r50_caffe_fpn_mstrain_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab reppoints_moment_r50_fpn_gn-neck+head_1x_coco configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py ./tools/work_dir/reppoints_moment_r50_fpn_gn-neck+head_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_r50_caffe_fpn_1x_coco configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py ./tools/work_dir/retinanet_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/rpn/rpn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab rpn_r50_fpn_1x_coco configs/rpn/rpn_r50_fpn_1x_coco.py ./tools/work_dir/rpn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab sabl_retinanet_r50_fpn_1x_coco configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py ./tools/work_dir/sabl_retinanet_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ssd/ssd300_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ssd300_coco configs/ssd/ssd300_coco.py ./tools/work_dir/ssd300_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/tridentnet/tridentnet_r50_caffe_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab tridentnet_r50_caffe_1x_coco configs/tridentnet/tridentnet_r50_caffe_1x_coco.py ./tools/work_dir/tridentnet_r50_caffe_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/vfnet/vfnet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab vfnet_r50_fpn_1x_coco configs/vfnet/vfnet_r50_fpn_1x_coco.py ./tools/work_dir/vfnet_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/yolact/yolact_r50_8x8_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab yolact_r50_8x8_coco configs/yolact/yolact_r50_8x8_coco.py ./tools/work_dir/yolact_r50_8x8_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/yolo/yolov3_d53_320_273e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab yolov3_d53_320_273e_coco configs/yolo/yolov3_d53_320_273e_coco.py ./tools/work_dir/yolov3_d53_320_273e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab sparse_rcnn_r50_fpn_1x_coco configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/sparse_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/scnet/scnet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab scnet_r50_fpn_1x_coco configs/scnet/scnet_r50_fpn_1x_coco.py ./tools/work_dir/scnet_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/yolof/yolof_r50_c5_8x8_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab yolof_r50_c5_8x8_1x_coco configs/yolof/yolof_r50_c5_8x8_1x_coco.py ./tools/work_dir/yolof_r50_c5_8x8_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_carafe_1x_coco configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_carafe_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_mdpool_1x_coco configs/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_mdpool_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_dpool_1x_coco configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_dpool_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco configs/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_gn-all_2x_coco configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_gn-all_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_gn_ws-all_2x_coco configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_gn_ws-all_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_hrnetv2p_w18_1x_coco configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py ./tools/work_dir/mask_rcnn_hrnetv2p_w18_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_pafpn_1x_coco configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py ./tools/work_dir/faster_rcnn_r50_pafpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_r50_nasfpn_crop640_50e_coco configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py ./tools/work_dir/retinanet_r50_nasfpn_crop640_50e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_regnetx-3.2GF_fpn_1x_coco configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py ./tools/work_dir/mask_rcnn_regnetx-3.2GF_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py ./tools/work_dir/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r2_101_fpn_2x_coco configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py ./tools/work_dir/faster_rcnn_r2_101_fpn_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_groie_1x_coco configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_groie_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_1x_cityscapes configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py ./tools/work_dir/mask_rcnn_r50_fpn_1x_cityscapes --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab panoptic_fpn_r50_fpn_1x_coco configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py ./tools/work_dir/panoptic_fpn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/yolox/yolox_tiny_8x8_300e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab yolox_tiny_8x8_300e_coco configs/yolox/yolox_tiny_8x8_300e_coco.py ./tools/work_dir/yolox_tiny_8x8_300e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ssdlite_mobilenetv2_scratch_600e_coco configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py ./tools/work_dir/ssdlite_mobilenetv2_scratch_600e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & diff --git a/downstream/mmdetection/.github/CODE_OF_CONDUCT.md b/downstream/mmdetection/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..92afad1 --- /dev/null +++ b/downstream/mmdetection/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at chenkaidev@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq + +[homepage]: https://www.contributor-covenant.org diff --git a/downstream/mmdetection/.github/CONTRIBUTING.md b/downstream/mmdetection/.github/CONTRIBUTING.md new file mode 100644 index 0000000..c669626 --- /dev/null +++ b/downstream/mmdetection/.github/CONTRIBUTING.md @@ -0,0 +1 @@ +We appreciate all contributions to improve MMDetection. Please refer to [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/blob/master/CONTRIBUTING.md) in MMCV for more details about the contributing guideline. diff --git a/downstream/mmdetection/.github/ISSUE_TEMPLATE/config.yml b/downstream/mmdetection/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..56bbd88 --- /dev/null +++ b/downstream/mmdetection/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,9 @@ +blank_issues_enabled: false + +contact_links: + - name: Common Issues + url: https://mmdetection.readthedocs.io/en/latest/faq.html + about: Check if your issue already has solutions + - name: MMDetection Documentation + url: https://mmdetection.readthedocs.io/en/latest/ + about: Check if your question is answered in docs diff --git a/downstream/mmdetection/.github/ISSUE_TEMPLATE/error-report.md b/downstream/mmdetection/.github/ISSUE_TEMPLATE/error-report.md new file mode 100644 index 0000000..9dbd3ff --- /dev/null +++ b/downstream/mmdetection/.github/ISSUE_TEMPLATE/error-report.md @@ -0,0 +1,46 @@ +--- +name: Error report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' +--- + +Thanks for your error report and we appreciate it a lot. + +**Checklist** + +1. I have searched related issues but cannot get the expected help. +2. I have read the [FAQ documentation](https://mmdetection.readthedocs.io/en/latest/faq.html) but cannot get the expected help. +3. The bug has not been fixed in the latest version. + +**Describe the bug** +A clear and concise description of what the bug is. + +**Reproduction** + +1. What command or script did you run? + +```none +A placeholder for the command. +``` + +2. Did you make any modifications on the code or config? Did you understand what you have modified? +3. What dataset did you use? + +**Environment** + +1. Please run `python mmdet/utils/collect_env.py` to collect necessary environment information and paste it here. +2. You may add addition that may be helpful for locating the problem, such as + - How you installed PyTorch \[e.g., pip, conda, source\] + - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) + +**Error traceback** +If applicable, paste the error trackback here. + +```none +A placeholder for trackback. +``` + +**Bug fix** +If you have already identified the reason, you can provide the information here. If you are willing to create a PR to fix it, please also leave a comment here and that would be much appreciated! diff --git a/downstream/mmdetection/.github/ISSUE_TEMPLATE/feature_request.md b/downstream/mmdetection/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..7bf92e8 --- /dev/null +++ b/downstream/mmdetection/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,21 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' +--- + +**Describe the feature** + +**Motivation** +A clear and concise description of the motivation of the feature. +Ex1. It is inconvenient when \[....\]. +Ex2. There is a recent paper \[....\], which is very helpful for \[....\]. + +**Related resources** +If there is an official code release or third-party implementations, please also provide the information here, which would be very helpful. + +**Additional context** +Add any other context or screenshots about the feature request here. +If you would like to implement the feature and create a PR, please leave a comment here and that would be much appreciated. diff --git a/downstream/mmdetection/.github/ISSUE_TEMPLATE/general_questions.md b/downstream/mmdetection/.github/ISSUE_TEMPLATE/general_questions.md new file mode 100644 index 0000000..f02dd63 --- /dev/null +++ b/downstream/mmdetection/.github/ISSUE_TEMPLATE/general_questions.md @@ -0,0 +1,7 @@ +--- +name: General questions +about: Ask general questions to get help +title: '' +labels: '' +assignees: '' +--- diff --git a/downstream/mmdetection/.github/ISSUE_TEMPLATE/reimplementation_questions.md b/downstream/mmdetection/.github/ISSUE_TEMPLATE/reimplementation_questions.md new file mode 100644 index 0000000..83607ac --- /dev/null +++ b/downstream/mmdetection/.github/ISSUE_TEMPLATE/reimplementation_questions.md @@ -0,0 +1,67 @@ +--- +name: Reimplementation Questions +about: Ask about questions during model reimplementation +title: '' +labels: reimplementation +assignees: '' +--- + +**Notice** + +There are several common situations in the reimplementation issues as below + +1. Reimplement a model in the model zoo using the provided configs +2. Reimplement a model in the model zoo on other dataset (e.g., custom datasets) +3. Reimplement a custom model but all the components are implemented in MMDetection +4. Reimplement a custom model with new modules implemented by yourself + +There are several things to do for different cases as below. + +- For case 1 & 3, please follow the steps in the following sections thus we could help to quick identify the issue. +- For case 2 & 4, please understand that we are not able to do much help here because we usually do not know the full code and the users should be responsible to the code they write. +- One suggestion for case 2 & 4 is that the users should first check whether the bug lies in the self-implemented code or the original code. For example, users can first make sure that the same model runs well on supported datasets. If you still need help, please describe what you have done and what you obtain in the issue, and follow the steps in the following sections and try as clear as possible so that we can better help you. + +**Checklist** + +1. I have searched related issues but cannot get the expected help. +2. The issue has not been fixed in the latest version. + +**Describe the issue** + +A clear and concise description of what the problem you meet and what have you done. + +**Reproduction** + +1. What command or script did you run? + +```none +A placeholder for the command. +``` + +2. What config dir you run? + +```none +A placeholder for the config. +``` + +3. Did you make any modifications on the code or config? Did you understand what you have modified? +4. What dataset did you use? + +**Environment** + +1. Please run `python mmdet/utils/collect_env.py` to collect necessary environment information and paste it here. +2. You may add addition that may be helpful for locating the problem, such as + 1. How you installed PyTorch \[e.g., pip, conda, source\] + 2. Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) + +**Results** + +If applicable, paste the related results here, e.g., what you expect and what you get. + +```none +A placeholder for results comparison +``` + +**Issue fix** + +If you have already identified the reason, you can provide the information here. If you are willing to create a PR to fix it, please also leave a comment here and that would be much appreciated! diff --git a/downstream/mmdetection/.github/pull_request_template.md b/downstream/mmdetection/.github/pull_request_template.md new file mode 100644 index 0000000..8f8e289 --- /dev/null +++ b/downstream/mmdetection/.github/pull_request_template.md @@ -0,0 +1,25 @@ +Thanks for your contribution and we appreciate it a lot. The following instructions would make your pull request more healthy and more easily get feedback. If you do not understand some items, don't worry, just make the pull request and seek help from maintainers. + +## Motivation + +Please describe the motivation of this PR and the goal you want to achieve through this PR. + +## Modification + +Please briefly describe what modification is made in this PR. + +## BC-breaking (Optional) + +Does the modification introduce changes that break the backward-compatibility of the downstream repos? +If so, please describe how it breaks the compatibility and how the downstream projects should modify their code to keep compatibility with this PR. + +## Use cases (Optional) + +If this PR introduces a new feature, it is better to list some use cases here, and update the documentation. + +## Checklist + +1. Pre-commit or other linting tools are used to fix the potential lint issues. +2. The modification is covered by complete unit tests. If not, please add more unit test to ensure the correctness. +3. If the modification has potential influence on downstream projects, this PR should be tested with downstream projects, like MMDet or MMCls. +4. The documentation has been modified accordingly, like docstring or example tutorials. diff --git a/downstream/mmdetection/.github/workflows/build.yml b/downstream/mmdetection/.github/workflows/build.yml new file mode 100644 index 0000000..918ce92 --- /dev/null +++ b/downstream/mmdetection/.github/workflows/build.yml @@ -0,0 +1,288 @@ +name: build + +on: + push: + paths-ignore: + - ".dev_scripts/**" + - ".github/**.md" + - "demo/**" + - "docker/**" + - "tools/**" + - "README.md" + - "README_zh-CN.md" + + pull_request: + paths-ignore: + - ".dev_scripts/**" + - ".github/**.md" + - "demo/**" + - "docker/**" + - "docs/**" + - "docs_zh-CN/**" + - "tools/**" + - "README.md" + - "README_zh-CN.md" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build_cpu: + runs-on: ubuntu-18.04 + strategy: + matrix: + python-version: [3.7] + torch: [1.5.1, 1.6.0, 1.7.0, 1.8.0, 1.9.0, 1.10.1] + include: + - torch: 1.5.1 + torchvision: 0.6.1 + mmcv: 1.5 + - torch: 1.6.0 + torchvision: 0.7.0 + mmcv: 1.6 + - torch: 1.7.0 + torchvision: 0.8.1 + mmcv: 1.7 + - torch: 1.8.0 + torchvision: 0.9.0 + mmcv: 1.8 + - torch: 1.9.0 + torchvision: 0.10.0 + mmcv: 1.9 + - torch: 1.10.1 + torchvision: 0.11.2 + mmcv: "1.10" + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install Pillow + run: pip install Pillow==6.2.2 + if: ${{matrix.torchvision == '0.4.2'}} + - name: Install PyTorch + run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install MMCV + run: | + pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cpu/torch${{matrix.mmcv}}/index.html + python -c 'import mmcv; print(mmcv.__version__)' + - name: Install unittest dependencies + run: | + pip install -r requirements/tests.txt -r requirements/optional.txt + pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + pip install git+https://github.com/cocodataset/panopticapi.git + - name: Build and install + run: rm -rf .eggs && pip install -e . + - name: Run unittests and generate coverage report + run: | + coverage run --branch --source mmdet -m pytest tests/ + coverage xml + coverage report -m + + build_cuda101: + runs-on: ubuntu-18.04 + container: + image: pytorch/pytorch:1.6.0-cuda10.1-cudnn7-devel + + strategy: + matrix: + python-version: [3.7] + torch: [1.5.1+cu101, 1.6.0+cu101, 1.7.0+cu101, 1.8.0+cu101] + include: + - torch: 1.5.1+cu101 + torch_version: torch1.5.1 + torchvision: 0.6.1+cu101 + mmcv: 1.5 + - torch: 1.6.0+cu101 + torch_version: torch1.6.0 + torchvision: 0.7.0+cu101 + mmcv: 1.6 + - torch: 1.7.0+cu101 + torch_version: torch1.7.0 + torchvision: 0.8.1+cu101 + mmcv: 1.7 + - torch: 1.8.0+cu101 + torch_version: torch1.8.0 + torchvision: 0.9.0+cu101 + mmcv: 1.8 + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + - name: Install system dependencies + run: | + apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 python${{matrix.python-version}}-dev + apt-get clean + rm -rf /var/lib/apt/lists/* + - name: Install Pillow + run: python -m pip install Pillow==6.2.2 + if: ${{matrix.torchvision < 0.5}} + - name: Install PyTorch + run: python -m pip install torch==${{matrix.torch}} torchvision==${{matrix.torchvision}} -f https://download.pytorch.org/whl/torch_stable.html + - name: Install dependencies for compiling onnx when python=3.9 + run: python -m pip install "protobuf <= 3.20.1" && apt-get install libprotobuf-dev protobuf-compiler + if: ${{matrix.python-version == '3.9'}} + - name: Install mmdet dependencies + run: | + python -V + python -m pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu101/torch${{matrix.mmcv}}/index.html + python -m pip install pycocotools + python -m pip install -r requirements/tests.txt -r requirements/optional.txt + python -m pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + python -m pip install git+https://github.com/cocodataset/panopticapi.git + python -c 'import mmcv; print(mmcv.__version__)' + - name: Build and install + run: | + rm -rf .eggs + python setup.py check -m -s + TORCH_CUDA_ARCH_LIST=7.0 pip install . + - name: Run unittests and generate coverage report + run: | + coverage run --branch --source mmdet -m pytest tests/ + coverage xml + coverage report -m + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1.0.10 + with: + file: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false + + build_cuda102: + runs-on: ubuntu-18.04 + container: + image: pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel + + strategy: + matrix: + python-version: [3.6, 3.7, 3.8, 3.9] + torch: [1.9.0+cu102, 1.10.1+cu102] + include: + - torch: 1.9.0+cu102 + torch_version: torch1.9.0 + torchvision: 0.10.0+cu102 + mmcv: 1.9 + - torch: 1.10.1+cu102 + torch_version: torch1.10.1 + torchvision: 0.11.2+cu102 + mmcv: "1.10" + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + # Add ppa source repo for python3.9. + - name: Add python3.9 source + run: | + apt-get update && apt-get install -y software-properties-common + add-apt-repository -y ppa:deadsnakes/ppa + if: ${{matrix.python-version == '3.9'}} + # Install python-dev for some packages which require libpython3.Xm. + # Github's setup-python cannot install python3.9-dev, so we have to use apt install. + # Set DEBIAN_FRONTEND=noninteractive to avoid some interactions. + - name: Install python-dev + run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends python${{matrix.python-version}}-dev + - name: Install system dependencies + run: | + apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 + apt-get clean + rm -rf /var/lib/apt/lists/* + - name: Install Pillow + run: python -m pip install Pillow==6.2.2 + if: ${{matrix.torchvision < 0.5}} + - name: Install PyTorch + run: python -m pip install torch==${{matrix.torch}} torchvision==${{matrix.torchvision}} -f https://download.pytorch.org/whl/torch_stable.html + - name: Install dependencies for compiling onnx when python=3.9 + run: python -m pip install "protobuf <= 3.20.1" && apt-get update && apt-get -y install libprotobuf-dev protobuf-compiler cmake + if: ${{matrix.python-version == '3.9'}} + - name: Install mmdet dependencies + run: | + python -V + python -m pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu102/torch${{matrix.mmcv}}/index.html + python -m pip install pycocotools + python -m pip install -r requirements/tests.txt -r requirements/optional.txt + python -m pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + python -m pip install git+https://github.com/cocodataset/panopticapi.git + python -c 'import mmcv; print(mmcv.__version__)' + - name: Build and install + run: | + rm -rf .eggs + python setup.py check -m -s + TORCH_CUDA_ARCH_LIST=7.0 pip install . + - name: Run unittests and generate coverage report + run: | + coverage run --branch --source mmdet -m pytest tests/ + coverage xml + coverage report -m + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v2 + with: + files: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false + + build_windows: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-2022] + python: [3.8] + platform: [cpu, cu111] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python }} + - name: Upgrade pip + run: python -m pip install pip --upgrade --user + - name: Install PyTorch + # As a complement to Linux CI, we test on PyTorch LTS version + run: pip install torch==1.8.2+${{ matrix.platform }} torchvision==0.9.2+${{ matrix.platform }} -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html + - name: Install MMCV + run: pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cpu/torch1.8/index.html --only-binary mmcv-full + - name: Install unittest dependencies + run: | + python -V + python -m pip install pycocotools + python -m pip install -r requirements/tests.txt -r requirements/optional.txt + python -m pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + python -m pip install git+https://github.com/cocodataset/panopticapi.git + python -c 'import mmcv; print(mmcv.__version__)' + - name: Show pip list + run: pip list + - name: Build and install + run: pip install -e . + - name: Run unittests + run: coverage run --branch --source mmdet -m pytest tests + - name: Generate coverage report + run: | + coverage xml + coverage report -m + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v2 + with: + file: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false diff --git a/downstream/mmdetection/.github/workflows/build_pat.yml b/downstream/mmdetection/.github/workflows/build_pat.yml new file mode 100644 index 0000000..438e27e --- /dev/null +++ b/downstream/mmdetection/.github/workflows/build_pat.yml @@ -0,0 +1,28 @@ +name: build_pat + +on: push + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build_parrots: + runs-on: ubuntu-latest + container: + image: ghcr.io/zhouzaida/parrots-mmcv:1.3.4 + credentials: + username: zhouzaida + password: ${{ secrets.CR_PAT }} + + steps: + - uses: actions/checkout@v2 + - name: Install mmdet dependencies + run: | + git clone https://github.com/open-mmlab/mmcv.git && cd mmcv + MMCV_WITH_OPS=1 python setup.py install + cd .. && rm -rf mmcv + python -c 'import mmcv; print(mmcv.__version__)' + pip install -r requirements.txt + - name: Build and install + run: rm -rf .eggs && pip install -e . diff --git a/downstream/mmdetection/.github/workflows/deploy.yml b/downstream/mmdetection/.github/workflows/deploy.yml new file mode 100644 index 0000000..f575061 --- /dev/null +++ b/downstream/mmdetection/.github/workflows/deploy.yml @@ -0,0 +1,28 @@ +name: deploy + +on: push + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-n-publish: + runs-on: ubuntu-latest + if: startsWith(github.event.ref, 'refs/tags') + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 + with: + python-version: 3.7 + - name: Install torch + run: pip install torch + - name: Install wheel + run: pip install wheel + - name: Build MMDetection + run: python setup.py sdist bdist_wheel + - name: Publish distribution to PyPI + run: | + pip install twine + twine upload dist/* -u __token__ -p ${{ secrets.pypi_password }} diff --git a/downstream/mmdetection/.github/workflows/lint.yml b/downstream/mmdetection/.github/workflows/lint.yml new file mode 100644 index 0000000..91565fe --- /dev/null +++ b/downstream/mmdetection/.github/workflows/lint.yml @@ -0,0 +1,27 @@ +name: lint + +on: [push, pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 + with: + python-version: 3.7 + - name: Install pre-commit hook + run: | + pip install pre-commit + pre-commit install + - name: Linting + run: pre-commit run --all-files + - name: Check docstring coverage + run: | + pip install interrogate + interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-regex "__repr__" --fail-under 80 mmdet diff --git a/downstream/mmdetection/.gitignore b/downstream/mmdetection/.gitignore new file mode 100644 index 0000000..892731d --- /dev/null +++ b/downstream/mmdetection/.gitignore @@ -0,0 +1,124 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/en/_build/ +docs/zh_cn/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +data/ +data +.vscode +.idea +.DS_Store + +# custom +*.pkl +*.pkl.json +*.log.json +docs/modelzoo_statistics.md +mmdet/.mim +work_dirs/ + +# Pytorch +*.pth +*.py~ +*.sh~ diff --git a/downstream/mmdetection/.owners.yml b/downstream/mmdetection/.owners.yml new file mode 100644 index 0000000..97296aa --- /dev/null +++ b/downstream/mmdetection/.owners.yml @@ -0,0 +1,14 @@ +assign: + strategy: + # random + daily-shift-based + scedule: + '*/1 * * * *' + assignees: + - Czm369 + - hhaAndroid + - jbwang1997 + - RangiLyu + - BIGWangYuDong + - chhluo + - ZwwWayne diff --git a/downstream/mmdetection/.pre-commit-config.yaml b/downstream/mmdetection/.pre-commit-config.yaml new file mode 100644 index 0000000..82dd58c --- /dev/null +++ b/downstream/mmdetection/.pre-commit-config.yaml @@ -0,0 +1,50 @@ +repos: + - repo: https://github.com/PyCQA/flake8 + rev: 3.8.3 + hooks: + - id: flake8 + - repo: https://github.com/PyCQA/isort + rev: 5.10.1 + hooks: + - id: isort + - repo: https://github.com/pre-commit/mirrors-yapf + rev: v0.30.0 + hooks: + - id: yapf + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.1.0 + hooks: + - id: trailing-whitespace + - id: check-yaml + - id: end-of-file-fixer + - id: requirements-txt-fixer + - id: double-quote-string-fixer + - id: check-merge-conflict + - id: fix-encoding-pragma + args: ["--remove"] + - id: mixed-line-ending + args: ["--fix=lf"] + - repo: https://github.com/codespell-project/codespell + rev: v2.1.0 + hooks: + - id: codespell + - repo: https://github.com/executablebooks/mdformat + rev: 0.7.14 + hooks: + - id: mdformat + args: ["--number"] + additional_dependencies: + - mdformat-gfm + - mdformat_frontmatter + - linkify-it-py + - repo: https://github.com/myint/docformatter + rev: v1.3.1 + hooks: + - id: docformatter + args: ["--in-place", "--wrap-descriptions", "79"] + - repo: https://github.com/open-mmlab/pre-commit-hooks + rev: v0.2.0 # Use the ref you want to point at + hooks: + - id: check-algo-readme + - id: check-copyright + args: ["mmdet"] # replace the dir_to_check with your expected directory to check diff --git a/downstream/mmdetection/.readthedocs.yml b/downstream/mmdetection/.readthedocs.yml new file mode 100644 index 0000000..6cfbf5d --- /dev/null +++ b/downstream/mmdetection/.readthedocs.yml @@ -0,0 +1,9 @@ +version: 2 + +formats: all + +python: + version: 3.7 + install: + - requirements: requirements/docs.txt + - requirements: requirements/readthedocs.txt diff --git a/downstream/mmdetection/CITATION.cff b/downstream/mmdetection/CITATION.cff new file mode 100644 index 0000000..aac9313 --- /dev/null +++ b/downstream/mmdetection/CITATION.cff @@ -0,0 +1,8 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: + - name: "MMDetection Contributors" +title: "OpenMMLab Detection Toolbox and Benchmark" +date-released: 2018-08-22 +url: "https://github.com/open-mmlab/mmdetection" +license: Apache-2.0 diff --git a/downstream/mmdetection/LICENSE b/downstream/mmdetection/LICENSE new file mode 100644 index 0000000..1bfc23e --- /dev/null +++ b/downstream/mmdetection/LICENSE @@ -0,0 +1,203 @@ +Copyright 2018-2023 OpenMMLab. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018-2023 OpenMMLab. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/downstream/mmdetection/MANIFEST.in b/downstream/mmdetection/MANIFEST.in new file mode 100644 index 0000000..6300b22 --- /dev/null +++ b/downstream/mmdetection/MANIFEST.in @@ -0,0 +1,6 @@ +include requirements/*.txt +include mmdet/VERSION +include mmdet/.mim/model-index.yml +include mmdet/.mim/demo/*/* +recursive-include mmdet/.mim/configs *.py *.yml +recursive-include mmdet/.mim/tools *.sh *.py diff --git a/downstream/mmdetection/README.md b/downstream/mmdetection/README.md new file mode 100644 index 0000000..522cfb8 --- /dev/null +++ b/downstream/mmdetection/README.md @@ -0,0 +1,357 @@ +
+ +
 
+
+ OpenMMLab website + + + HOT + + +      + OpenMMLab platform + + + TRY IT OUT + + +
+
 
+ +[![PyPI](https://img.shields.io/pypi/v/mmdet)](https://pypi.org/project/mmdet) +[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmdetection.readthedocs.io/en/latest/) +[![badge](https://github.com/open-mmlab/mmdetection/workflows/build/badge.svg)](https://github.com/open-mmlab/mmdetection/actions) +[![codecov](https://codecov.io/gh/open-mmlab/mmdetection/branch/master/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmdetection) +[![license](https://img.shields.io/github/license/open-mmlab/mmdetection.svg)](https://github.com/open-mmlab/mmdetection/blob/master/LICENSE) +[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmdetection.svg)](https://github.com/open-mmlab/mmdetection/issues) +[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmdetection.svg)](https://github.com/open-mmlab/mmdetection/issues) + +[📘Documentation](https://mmdetection.readthedocs.io/en/stable/) | +[🛠️Installation](https://mmdetection.readthedocs.io/en/stable/get_started.html) | +[👀Model Zoo](https://mmdetection.readthedocs.io/en/stable/model_zoo.html) | +[🆕Update News](https://mmdetection.readthedocs.io/en/stable/changelog.html) | +[🚀Ongoing Projects](https://github.com/open-mmlab/mmdetection/projects) | +[🤔Reporting Issues](https://github.com/open-mmlab/mmdetection/issues/new/choose) + +
+ +
+ +English | [简体中文](README_zh-CN.md) + +
+ +## Introduction + +MMDetection is an open source object detection toolbox based on PyTorch. It is +a part of the [OpenMMLab](https://openmmlab.com/) project. + +The master branch works with **PyTorch 1.5+**. + + + +
+Major features + +- **Modular Design** + + We decompose the detection framework into different components and one can easily construct a customized object detection framework by combining different modules. + +- **Support of multiple frameworks out of box** + + The toolbox directly supports popular and contemporary detection frameworks, *e.g.* Faster RCNN, Mask RCNN, RetinaNet, etc. + +- **High efficiency** + + All basic bbox and mask operations run on GPUs. The training speed is faster than or comparable to other codebases, including [Detectron2](https://github.com/facebookresearch/detectron2), [maskrcnn-benchmark](https://github.com/facebookresearch/maskrcnn-benchmark) and [SimpleDet](https://github.com/TuSimple/simpledet). + +- **State of the art** + + The toolbox stems from the codebase developed by the *MMDet* team, who won [COCO Detection Challenge](http://cocodataset.org/#detection-leaderboard) in 2018, and we keep pushing it forward. + +
+ +Apart from MMDetection, we also released a library [mmcv](https://github.com/open-mmlab/mmcv) for computer vision research, which is heavily depended on by this toolbox. + +## What's New + +**2.25.0** was released in 1/6/2022: + +- Support dedicated `MMDetWandbHook` hook +- Support [ConvNeXt](configs/convnext), [DDOD](configs/ddod), [SOLOv2](configs/solov2) +- Support [Mask2Former](configs/mask2former) for instance segmentation +- Rename [config files of Mask2Former](configs/mask2former) + +Please refer to [changelog.md](docs/en/changelog.md) for details and release history. + +For compatibility changes between different versions of MMDetection, please refer to [compatibility.md](docs/en/compatibility.md). + +## Installation + +Please refer to [Installation](docs/en/get_started.md/#Installation) for installation instructions. + +## Getting Started + +Please see [get_started.md](docs/en/get_started.md) for the basic usage of MMDetection. We provide [colab tutorial](demo/MMDet_Tutorial.ipynb) and [instance segmentation colab tutorial](demo/MMDet_InstanceSeg_Tutorial.ipynb), and other tutorials for: + +- [with existing dataset](docs/en/1_exist_data_model.md) +- [with new dataset](docs/en/2_new_data_model.md) +- [with existing dataset_new_model](docs/en/3_exist_data_new_model.md) +- [learn about configs](docs/en/tutorials/config.md) +- [customize_datasets](docs/en/tutorials/customize_dataset.md) +- [customize data pipelines](docs/en/tutorials/data_pipeline.md) +- [customize_models](docs/en/tutorials/customize_models.md) +- [customize runtime settings](docs/en/tutorials/customize_runtime.md) +- [customize_losses](docs/en/tutorials/customize_losses.md) +- [finetuning models](docs/en/tutorials/finetune.md) +- [export a model to ONNX](docs/en/tutorials/pytorch2onnx.md) +- [export ONNX to TRT](docs/en/tutorials/onnx2tensorrt.md) +- [weight initialization](docs/en/tutorials/init_cfg.md) +- [how to xxx](docs/en/tutorials/how_to.md) + +## Overview of Benchmark and Model Zoo + +Results and models are available in the [model zoo](docs/en/model_zoo.md). + +
+ Architectures +
+ + + + + + + + + + + + + + + + + +
+ Object Detection + + Instance Segmentation + + Panoptic Segmentation + + Other +
+ + + + + + + +
  • Contrastive Learning
  • + + +
  • Distillation
  • + + +
    + +
    + Components +
    + + + + + + + + + + + + + + + + + +
    + Backbones + + Necks + + Loss + + Common +
    + + + + + + + +
    + +Some other methods are also supported in [projects using MMDetection](./docs/en/projects.md). + +## FAQ + +Please refer to [FAQ](docs/en/faq.md) for frequently asked questions. + +## Contributing + +We appreciate all contributions to improve MMDetection. Ongoing projects can be found in out [GitHub Projects](https://github.com/open-mmlab/mmdetection/projects). Welcome community users to participate in these projects. Please refer to [CONTRIBUTING.md](.github/CONTRIBUTING.md) for the contributing guideline. + +## Acknowledgement + +MMDetection is an open source project that is contributed by researchers and engineers from various colleges and companies. We appreciate all the contributors who implement their methods or add new features, as well as users who give valuable feedbacks. +We wish that the toolbox and benchmark could serve the growing research community by providing a flexible toolkit to reimplement existing methods and develop their own new detectors. + +## Citation + +If you use this toolbox or benchmark in your research, please cite this project. + +``` +@article{mmdetection, + title = {{MMDetection}: Open MMLab Detection Toolbox and Benchmark}, + author = {Chen, Kai and Wang, Jiaqi and Pang, Jiangmiao and Cao, Yuhang and + Xiong, Yu and Li, Xiaoxiao and Sun, Shuyang and Feng, Wansen and + Liu, Ziwei and Xu, Jiarui and Zhang, Zheng and Cheng, Dazhi and + Zhu, Chenchen and Cheng, Tianheng and Zhao, Qijie and Li, Buyu and + Lu, Xin and Zhu, Rui and Wu, Yue and Dai, Jifeng and Wang, Jingdong + and Shi, Jianping and Ouyang, Wanli and Loy, Chen Change and Lin, Dahua}, + journal= {arXiv preprint arXiv:1906.07155}, + year={2019} +} +``` + +## License + +This project is released under the [Apache 2.0 license](LICENSE). + +## Projects in OpenMMLab + +- [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab foundational library for computer vision. +- [MIM](https://github.com/open-mmlab/mim): MIM installs OpenMMLab packages. +- [MMClassification](https://github.com/open-mmlab/mmclassification): OpenMMLab image classification toolbox and benchmark. +- [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab detection toolbox and benchmark. +- [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab's next-generation platform for general 3D object detection. +- [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab rotated object detection toolbox and benchmark. +- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation): OpenMMLab semantic segmentation toolbox and benchmark. +- [MMOCR](https://github.com/open-mmlab/mmocr): OpenMMLab text detection, recognition, and understanding toolbox. +- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab pose estimation toolbox and benchmark. +- [MMHuman3D](https://github.com/open-mmlab/mmhuman3d): OpenMMLab 3D human parametric model toolbox and benchmark. +- [MMSelfSup](https://github.com/open-mmlab/mmselfsup): OpenMMLab self-supervised learning toolbox and benchmark. +- [MMRazor](https://github.com/open-mmlab/mmrazor): OpenMMLab model compression toolbox and benchmark. +- [MMFewShot](https://github.com/open-mmlab/mmfewshot): OpenMMLab fewshot learning toolbox and benchmark. +- [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab's next-generation action understanding toolbox and benchmark. +- [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab video perception toolbox and benchmark. +- [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab optical flow toolbox and benchmark. +- [MMEditing](https://github.com/open-mmlab/mmediting): OpenMMLab image and video editing toolbox. +- [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab image and video generative models toolbox. +- [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab model deployment framework. diff --git a/downstream/mmdetection/configs/_base_/datasets/cityscapes_detection.py b/downstream/mmdetection/configs/_base_/datasets/cityscapes_detection.py new file mode 100644 index 0000000..e341b59 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/cityscapes_detection.py @@ -0,0 +1,56 @@ +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', img_scale=[(2048, 800), (2048, 1024)], keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=8, + dataset=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_train.json', + img_prefix=data_root + 'leftImg8bit/train/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_val.json', + img_prefix=data_root + 'leftImg8bit/val/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_test.json', + img_prefix=data_root + 'leftImg8bit/test/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') diff --git a/downstream/mmdetection/configs/_base_/datasets/cityscapes_instance.py b/downstream/mmdetection/configs/_base_/datasets/cityscapes_instance.py new file mode 100644 index 0000000..4e3c34e --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/cityscapes_instance.py @@ -0,0 +1,56 @@ +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', img_scale=[(2048, 800), (2048, 1024)], keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=8, + dataset=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_train.json', + img_prefix=data_root + 'leftImg8bit/train/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_val.json', + img_prefix=data_root + 'leftImg8bit/val/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_test.json', + img_prefix=data_root + 'leftImg8bit/test/', + pipeline=test_pipeline)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/downstream/mmdetection/configs/_base_/datasets/coco_detection.py b/downstream/mmdetection/configs/_base_/datasets/coco_detection.py new file mode 100644 index 0000000..149f590 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/coco_detection.py @@ -0,0 +1,49 @@ +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') diff --git a/downstream/mmdetection/configs/_base_/datasets/coco_instance.py b/downstream/mmdetection/configs/_base_/datasets/coco_instance.py new file mode 100644 index 0000000..9901a85 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/coco_instance.py @@ -0,0 +1,49 @@ +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/downstream/mmdetection/configs/_base_/datasets/coco_instance_semantic.py b/downstream/mmdetection/configs/_base_/datasets/coco_instance_semantic.py new file mode 100644 index 0000000..6c8bf07 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/coco_instance_semantic.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', with_bbox=True, with_mask=True, with_seg=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 8), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + seg_prefix=data_root + 'stuffthingmaps/train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/downstream/mmdetection/configs/_base_/datasets/coco_panoptic.py b/downstream/mmdetection/configs/_base_/datasets/coco_panoptic.py new file mode 100644 index 0000000..dbade7c --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/coco_panoptic.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'CocoPanopticDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 4), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/panoptic_train2017.json', + img_prefix=data_root + 'train2017/', + seg_prefix=data_root + 'annotations/panoptic_train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/panoptic_val2017.json', + img_prefix=data_root + 'val2017/', + seg_prefix=data_root + 'annotations/panoptic_val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/panoptic_val2017.json', + img_prefix=data_root + 'val2017/', + seg_prefix=data_root + 'annotations/panoptic_val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric=['PQ']) diff --git a/downstream/mmdetection/configs/_base_/datasets/deepfashion.py b/downstream/mmdetection/configs/_base_/datasets/deepfashion.py new file mode 100644 index 0000000..308b4b2 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/deepfashion.py @@ -0,0 +1,53 @@ +# dataset settings +dataset_type = 'DeepFashionDataset' +data_root = 'data/DeepFashion/In-shop/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(750, 1101), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(750, 1101), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + imgs_per_gpu=2, + workers_per_gpu=1, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/DeepFashion_segmentation_query.json', + img_prefix=data_root + 'Img/', + pipeline=train_pipeline, + data_root=data_root), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/DeepFashion_segmentation_query.json', + img_prefix=data_root + 'Img/', + pipeline=test_pipeline, + data_root=data_root), + test=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/DeepFashion_segmentation_gallery.json', + img_prefix=data_root + 'Img/', + pipeline=test_pipeline, + data_root=data_root)) +evaluation = dict(interval=5, metric=['bbox', 'segm']) diff --git a/downstream/mmdetection/configs/_base_/datasets/lvis_v0.5_instance.py b/downstream/mmdetection/configs/_base_/datasets/lvis_v0.5_instance.py new file mode 100644 index 0000000..207e005 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/lvis_v0.5_instance.py @@ -0,0 +1,24 @@ +# dataset settings +_base_ = 'coco_instance.py' +dataset_type = 'LVISV05Dataset' +data_root = 'data/lvis_v0.5/' +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + _delete_=True, + type='ClassBalancedDataset', + oversample_thr=1e-3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v0.5_train.json', + img_prefix=data_root + 'train2017/')), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v0.5_val.json', + img_prefix=data_root + 'val2017/'), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v0.5_val.json', + img_prefix=data_root + 'val2017/')) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/downstream/mmdetection/configs/_base_/datasets/lvis_v1_instance.py b/downstream/mmdetection/configs/_base_/datasets/lvis_v1_instance.py new file mode 100644 index 0000000..be791ed --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/lvis_v1_instance.py @@ -0,0 +1,24 @@ +# dataset settings +_base_ = 'coco_instance.py' +dataset_type = 'LVISV1Dataset' +data_root = 'data/lvis_v1/' +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + _delete_=True, + type='ClassBalancedDataset', + oversample_thr=1e-3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_train.json', + img_prefix=data_root)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_val.json', + img_prefix=data_root), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_val.json', + img_prefix=data_root)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/downstream/mmdetection/configs/_base_/datasets/openimages_detection.py b/downstream/mmdetection/configs/_base_/datasets/openimages_detection.py new file mode 100644 index 0000000..a65d306 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/openimages_detection.py @@ -0,0 +1,65 @@ +# dataset settings +dataset_type = 'OpenImagesDataset' +data_root = 'data/OpenImages/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, denorm_bbox=True), + dict(type='Resize', img_scale=(1024, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1024, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ], + ), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=0, # workers_per_gpu > 0 may occur out of memory + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/oidv6-train-annotations-bbox.csv', + img_prefix=data_root + 'OpenImages/train/', + label_file=data_root + 'annotations/class-descriptions-boxable.csv', + hierarchy_file=data_root + + 'annotations/bbox_labels_600_hierarchy.json', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/validation-annotations-bbox.csv', + img_prefix=data_root + 'OpenImages/validation/', + label_file=data_root + 'annotations/class-descriptions-boxable.csv', + hierarchy_file=data_root + + 'annotations/bbox_labels_600_hierarchy.json', + meta_file=data_root + 'annotations/validation-image-metas.pkl', + image_level_ann_file=data_root + + 'annotations/validation-annotations-human-imagelabels-boxable.csv', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/validation-annotations-bbox.csv', + img_prefix=data_root + 'OpenImages/validation/', + label_file=data_root + 'annotations/class-descriptions-boxable.csv', + hierarchy_file=data_root + + 'annotations/bbox_labels_600_hierarchy.json', + meta_file=data_root + 'annotations/validation-image-metas.pkl', + image_level_ann_file=data_root + + 'annotations/validation-annotations-human-imagelabels-boxable.csv', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='mAP') diff --git a/downstream/mmdetection/configs/_base_/datasets/voc0712.py b/downstream/mmdetection/configs/_base_/datasets/voc0712.py new file mode 100644 index 0000000..ae09acd --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/voc0712.py @@ -0,0 +1,55 @@ +# dataset settings +dataset_type = 'VOCDataset' +data_root = 'data/VOCdevkit/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1000, 600), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1000, 600), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=[ + data_root + 'VOC2007/ImageSets/Main/trainval.txt', + data_root + 'VOC2012/ImageSets/Main/trainval.txt' + ], + img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'], + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'VOC2007/ImageSets/Main/test.txt', + img_prefix=data_root + 'VOC2007/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'VOC2007/ImageSets/Main/test.txt', + img_prefix=data_root + 'VOC2007/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='mAP') diff --git a/downstream/mmdetection/configs/_base_/datasets/wider_face.py b/downstream/mmdetection/configs/_base_/datasets/wider_face.py new file mode 100644 index 0000000..d1d649b --- /dev/null +++ b/downstream/mmdetection/configs/_base_/datasets/wider_face.py @@ -0,0 +1,63 @@ +# dataset settings +dataset_type = 'WIDERFaceDataset' +data_root = 'data/WIDERFace/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=60, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=2, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'train.txt', + img_prefix=data_root + 'WIDER_train/', + min_size=17, + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'val.txt', + img_prefix=data_root + 'WIDER_val/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'val.txt', + img_prefix=data_root + 'WIDER_val/', + pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/_base_/default_runtime.py b/downstream/mmdetection/configs/_base_/default_runtime.py new file mode 100644 index 0000000..5b0b145 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/default_runtime.py @@ -0,0 +1,27 @@ +checkpoint_config = dict(interval=1) +# yapf:disable +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + # dict(type='TensorboardLoggerHook') + ]) +# yapf:enable +custom_hooks = [dict(type='NumClassCheckHook')] + +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] + +# disable opencv multithreading to avoid system being overloaded +opencv_num_threads = 0 +# set multi-process start method as `fork` to speed up the training +mp_start_method = 'fork' + +# Default setting for scaling LR automatically +# - `enable` means enable scaling LR automatically +# or not by default. +# - `base_batch_size` = (8 GPUs) x (2 samples per GPU). +auto_scale_lr = dict(enable=False, base_batch_size=16) diff --git a/downstream/mmdetection/configs/_base_/models/cascade_mask_rcnn_r50_fpn.py b/downstream/mmdetection/configs/_base_/models/cascade_mask_rcnn_r50_fpn.py new file mode 100644 index 0000000..2902cca --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/cascade_mask_rcnn_r50_fpn.py @@ -0,0 +1,196 @@ +# model settings +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='CascadeRoIHead', + num_stages=3, + stage_loss_weights=[1, 0.5, 0.25], + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=[ + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.6, + neg_iou_thr=0.6, + min_pos_iou=0.6, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.7, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False) + ]), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) diff --git a/downstream/mmdetection/configs/_base_/models/cascade_rcnn_r50_fpn.py b/downstream/mmdetection/configs/_base_/models/cascade_rcnn_r50_fpn.py new file mode 100644 index 0000000..42f74ae --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/cascade_rcnn_r50_fpn.py @@ -0,0 +1,179 @@ +# model settings +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='CascadeRoIHead', + num_stages=3, + stage_loss_weights=[1, 0.5, 0.25], + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ]), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=[ + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.6, + neg_iou_thr=0.6, + min_pos_iou=0.6, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.7, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False) + ]), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/downstream/mmdetection/configs/_base_/models/fast_rcnn_r50_fpn.py b/downstream/mmdetection/configs/_base_/models/fast_rcnn_r50_fpn.py new file mode 100644 index 0000000..9982fe0 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/fast_rcnn_r50_fpn.py @@ -0,0 +1,62 @@ +# model settings +model = dict( + type='FastRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False)), + test_cfg=dict( + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_caffe_c4.py b/downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_caffe_c4.py new file mode 100644 index 0000000..dbf965a --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_caffe_c4.py @@ -0,0 +1,117 @@ +# model settings +norm_cfg = dict(type='BN', requires_grad=False) +model = dict( + type='FasterRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=3, + strides=(1, 2, 2), + dilations=(1, 1, 1), + out_indices=(2, ), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + rpn_head=dict( + type='RPNHead', + in_channels=1024, + feat_channels=1024, + anchor_generator=dict( + type='AnchorGenerator', + scales=[2, 4, 8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[16]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + shared_head=dict( + type='ResLayer', + depth=50, + stage=3, + stride=2, + dilation=1, + style='caffe', + norm_cfg=norm_cfg, + norm_eval=True, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=1024, + featmap_strides=[16]), + bbox_head=dict( + type='BBoxHead', + with_avg_pool=True, + roi_feat_size=7, + in_channels=2048, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=12000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=6000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_caffe_dc5.py b/downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_caffe_dc5.py new file mode 100644 index 0000000..a377a6f --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_caffe_dc5.py @@ -0,0 +1,105 @@ +# model settings +norm_cfg = dict(type='BN', requires_grad=False) +model = dict( + type='FasterRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + strides=(1, 2, 2, 1), + dilations=(1, 1, 1, 2), + out_indices=(3, ), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + rpn_head=dict( + type='RPNHead', + in_channels=2048, + feat_channels=2048, + anchor_generator=dict( + type='AnchorGenerator', + scales=[2, 4, 8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[16]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=2048, + featmap_strides=[16]), + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=2048, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=12000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms=dict(type='nms', iou_threshold=0.7), + nms_pre=6000, + max_per_img=1000, + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_fpn.py b/downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_fpn.py new file mode 100644 index 0000000..1ef8e7b --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/faster_rcnn_r50_fpn.py @@ -0,0 +1,108 @@ +# model settings +model = dict( + type='FasterRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100) + # soft-nms is also supported for rcnn testing + # e.g., nms=dict(type='soft_nms', iou_threshold=0.5, min_score=0.05) + )) diff --git a/downstream/mmdetection/configs/_base_/models/mask_rcnn_r50_caffe_c4.py b/downstream/mmdetection/configs/_base_/models/mask_rcnn_r50_caffe_c4.py new file mode 100644 index 0000000..122202e --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/mask_rcnn_r50_caffe_c4.py @@ -0,0 +1,125 @@ +# model settings +norm_cfg = dict(type='BN', requires_grad=False) +model = dict( + type='MaskRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=3, + strides=(1, 2, 2), + dilations=(1, 1, 1), + out_indices=(2, ), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + rpn_head=dict( + type='RPNHead', + in_channels=1024, + feat_channels=1024, + anchor_generator=dict( + type='AnchorGenerator', + scales=[2, 4, 8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[16]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + shared_head=dict( + type='ResLayer', + depth=50, + stage=3, + stride=2, + dilation=1, + style='caffe', + norm_cfg=norm_cfg, + norm_eval=True), + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=1024, + featmap_strides=[16]), + bbox_head=dict( + type='BBoxHead', + with_avg_pool=True, + roi_feat_size=7, + in_channels=2048, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=None, + mask_head=dict( + type='FCNMaskHead', + num_convs=0, + in_channels=2048, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=12000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=14, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=6000, + nms=dict(type='nms', iou_threshold=0.7), + max_per_img=1000, + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) diff --git a/downstream/mmdetection/configs/_base_/models/mask_rcnn_r50_fpn.py b/downstream/mmdetection/configs/_base_/models/mask_rcnn_r50_fpn.py new file mode 100644 index 0000000..d903e55 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/mask_rcnn_r50_fpn.py @@ -0,0 +1,120 @@ +# model settings +model = dict( + type='MaskRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) diff --git a/downstream/mmdetection/configs/_base_/models/retinanet_r50_fpn.py b/downstream/mmdetection/configs/_base_/models/retinanet_r50_fpn.py new file mode 100644 index 0000000..56e43fa --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/retinanet_r50_fpn.py @@ -0,0 +1,60 @@ +# model settings +model = dict( + type='RetinaNet', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_input', + num_outs=5), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) diff --git a/downstream/mmdetection/configs/_base_/models/rpn_r50_caffe_c4.py b/downstream/mmdetection/configs/_base_/models/rpn_r50_caffe_c4.py new file mode 100644 index 0000000..8b32ca9 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/rpn_r50_caffe_c4.py @@ -0,0 +1,58 @@ +# model settings +model = dict( + type='RPN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=3, + strides=(1, 2, 2), + dilations=(1, 1, 1), + out_indices=(2, ), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=None, + rpn_head=dict( + type='RPNHead', + in_channels=1024, + feat_channels=1024, + anchor_generator=dict( + type='AnchorGenerator', + scales=[2, 4, 8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[16]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=12000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/downstream/mmdetection/configs/_base_/models/rpn_r50_fpn.py b/downstream/mmdetection/configs/_base_/models/rpn_r50_fpn.py new file mode 100644 index 0000000..edaf4d4 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/rpn_r50_fpn.py @@ -0,0 +1,58 @@ +# model settings +model = dict( + type='RPN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/downstream/mmdetection/configs/_base_/models/ssd300.py b/downstream/mmdetection/configs/_base_/models/ssd300.py new file mode 100644 index 0000000..f17df01 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/models/ssd300.py @@ -0,0 +1,56 @@ +# model settings +input_size = 300 +model = dict( + type='SingleStageDetector', + backbone=dict( + type='SSDVGG', + depth=16, + with_last_pool=False, + ceil_mode=True, + out_indices=(3, 4), + out_feature_indices=(22, 34), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://vgg16_caffe')), + neck=dict( + type='SSDNeck', + in_channels=(512, 1024), + out_channels=(512, 1024, 512, 256, 256, 256), + level_strides=(2, 2, 1, 1), + level_paddings=(1, 1, 0, 0), + l2_norm_scale=20), + bbox_head=dict( + type='SSDHead', + in_channels=(512, 1024, 512, 256, 256, 256), + num_classes=80, + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=input_size, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2])), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False), + test_cfg=dict( + nms_pre=1000, + nms=dict(type='nms', iou_threshold=0.45), + min_bbox_size=0, + score_thr=0.02, + max_per_img=200)) +cudnn_benchmark = True diff --git a/downstream/mmdetection/configs/_base_/schedules/schedule_1x.py b/downstream/mmdetection/configs/_base_/schedules/schedule_1x.py new file mode 100644 index 0000000..13b3783 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/schedules/schedule_1x.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[8, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/downstream/mmdetection/configs/_base_/schedules/schedule_20e.py b/downstream/mmdetection/configs/_base_/schedules/schedule_20e.py new file mode 100644 index 0000000..00e8590 --- /dev/null +++ b/downstream/mmdetection/configs/_base_/schedules/schedule_20e.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/downstream/mmdetection/configs/_base_/schedules/schedule_2x.py b/downstream/mmdetection/configs/_base_/schedules/schedule_2x.py new file mode 100644 index 0000000..69dc9ee --- /dev/null +++ b/downstream/mmdetection/configs/_base_/schedules/schedule_2x.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/albu_example/README.md b/downstream/mmdetection/configs/albu_example/README.md new file mode 100644 index 0000000..9a180f0 --- /dev/null +++ b/downstream/mmdetection/configs/albu_example/README.md @@ -0,0 +1,31 @@ +# Albu Example + +> [Albumentations: fast and flexible image augmentations](https://arxiv.org/abs/1809.06839) + + + +## Abstract + +Data augmentation is a commonly used technique for increasing both the size and the diversity of labeled training sets by leveraging input transformations that preserve output labels. In computer vision domain, image augmentations have become a common implicit regularization technique to combat overfitting in deep convolutional neural networks and are ubiquitously used to improve performance. While most deep learning frameworks implement basic image transformations, the list is typically limited to some variations and combinations of flipping, rotating, scaling, and cropping. Moreover, the image processing speed varies in existing tools for image augmentation. We present Albumentations, a fast and flexible library for image augmentations with many various image transform operations available, that is also an easy-to-use wrapper around other augmentation libraries. We provide examples of image augmentations for different computer vision tasks and show that Albumentations is faster than other commonly used image augmentation tools on the most of commonly used image transformations. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | 4.4 | 16.6 | 38.0 | 34.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/albu_example/mask_rcnn_r50_fpn_albu_1x_coco/mask_rcnn_r50_fpn_albu_1x_coco_20200208-ab203bcd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/albu_example/mask_rcnn_r50_fpn_albu_1x_coco/mask_rcnn_r50_fpn_albu_1x_coco_20200208_225520.log.json) | + +## Citation + +```latex +@article{2018arXiv180906839B, + author = {A. Buslaev, A. Parinov, E. Khvedchenya, V.~I. Iglovikov and A.~A. Kalinin}, + title = "{Albumentations: fast and flexible image augmentations}", + journal = {ArXiv e-prints}, + eprint = {1809.06839}, + year = 2018 +} +``` diff --git a/downstream/mmdetection/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py b/downstream/mmdetection/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py new file mode 100644 index 0000000..b3f879a --- /dev/null +++ b/downstream/mmdetection/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py @@ -0,0 +1,73 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +albu_train_transforms = [ + dict( + type='ShiftScaleRotate', + shift_limit=0.0625, + scale_limit=0.0, + rotate_limit=0, + interpolation=1, + p=0.5), + dict( + type='RandomBrightnessContrast', + brightness_limit=[0.1, 0.3], + contrast_limit=[0.1, 0.3], + p=0.2), + dict( + type='OneOf', + transforms=[ + dict( + type='RGBShift', + r_shift_limit=10, + g_shift_limit=10, + b_shift_limit=10, + p=1.0), + dict( + type='HueSaturationValue', + hue_shift_limit=20, + sat_shift_limit=30, + val_shift_limit=20, + p=1.0) + ], + p=0.1), + dict(type='JpegCompression', quality_lower=85, quality_upper=95, p=0.2), + dict(type='ChannelShuffle', p=0.1), + dict( + type='OneOf', + transforms=[ + dict(type='Blur', blur_limit=3, p=1.0), + dict(type='MedianBlur', blur_limit=3, p=1.0) + ], + p=0.1), +] +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='Pad', size_divisor=32), + dict( + type='Albu', + transforms=albu_train_transforms, + bbox_params=dict( + type='BboxParams', + format='pascal_voc', + label_fields=['gt_labels'], + min_visibility=0.0, + filter_lost_elements=True), + keymap={ + 'img': 'image', + 'gt_masks': 'masks', + 'gt_bboxes': 'bboxes' + }, + update_pad_shape=False, + skip_img_without_anno=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'img_norm_cfg', + 'pad_shape', 'scale_factor')) +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/downstream/mmdetection/configs/atss/README.md b/downstream/mmdetection/configs/atss/README.md new file mode 100644 index 0000000..055ed05 --- /dev/null +++ b/downstream/mmdetection/configs/atss/README.md @@ -0,0 +1,31 @@ +# ATSS + +> [Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection](https://arxiv.org/abs/1912.02424) + + + +## Abstract + +Object detection has been dominated by anchor-based detectors for several years. Recently, anchor-free detectors have become popular due to the proposal of FPN and Focal Loss. In this paper, we first point out that the essential difference between anchor-based and anchor-free detection is actually how to define positive and negative training samples, which leads to the performance gap between them. If they adopt the same definition of positive and negative samples during training, there is no obvious difference in the final performance, no matter regressing from a box or a point. This shows that how to select positive and negative training samples is important for current object detectors. Then, we propose an Adaptive Training Sample Selection (ATSS) to automatically select positive and negative samples according to statistical characteristics of object. It significantly improves the performance of anchor-based and anchor-free detectors and bridges the gap between them. Finally, we discuss the necessity of tiling multiple anchors per location on the image to detect objects. Extensive experiments conducted on MS COCO support our aforementioned analysis and conclusions. With the newly introduced ATSS, we improve state-of-the-art detectors by a large margin to 50.7% AP without introducing any overhead. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | 3.7 | 19.7 | 39.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss/atss_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r50_fpn_1x_coco/atss_r50_fpn_1x_coco_20200209-985f7bd0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r50_fpn_1x_coco/atss_r50_fpn_1x_coco_20200209_102539.log.json) | +| R-101 | pytorch | 1x | 5.6 | 12.3 | 41.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss/atss_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r101_fpn_1x_coco/atss_r101_fpn_1x_20200825-dfcadd6f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r101_fpn_1x_coco/atss_r101_fpn_1x_20200825-dfcadd6f.log.json) | + +## Citation + +```latex +@article{zhang2019bridging, + title = {Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection}, + author = {Zhang, Shifeng and Chi, Cheng and Yao, Yongqiang and Lei, Zhen and Li, Stan Z.}, + journal = {arXiv preprint arXiv:1912.02424}, + year = {2019} +} +``` diff --git a/downstream/mmdetection/configs/atss/atss_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/atss/atss_r101_fpn_1x_coco.py new file mode 100644 index 0000000..5225d2a --- /dev/null +++ b/downstream/mmdetection/configs/atss/atss_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './atss_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/atss/atss_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/atss/atss_r50_fpn_1x_coco.py new file mode 100644 index 0000000..42ff4c5 --- /dev/null +++ b/downstream/mmdetection/configs/atss/atss_r50_fpn_1x_coco.py @@ -0,0 +1,62 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/atss/metafile.yml b/downstream/mmdetection/configs/atss/metafile.yml new file mode 100644 index 0000000..f4c567e --- /dev/null +++ b/downstream/mmdetection/configs/atss/metafile.yml @@ -0,0 +1,60 @@ +Collections: + - Name: ATSS + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ATSS + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1912.02424 + Title: 'Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection' + README: configs/atss/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/atss.py#L6 + Version: v2.0.0 + +Models: + - Name: atss_r50_fpn_1x_coco + In Collection: ATSS + Config: configs/atss/atss_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.7 + inference time (ms/im): + - value: 50.76 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r50_fpn_1x_coco/atss_r50_fpn_1x_coco_20200209-985f7bd0.pth + + - Name: atss_r101_fpn_1x_coco + In Collection: ATSS + Config: configs/atss/atss_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.6 + inference time (ms/im): + - value: 81.3 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r101_fpn_1x_coco/atss_r101_fpn_1x_20200825-dfcadd6f.pth diff --git a/downstream/mmdetection/configs/autoassign/README.md b/downstream/mmdetection/configs/autoassign/README.md new file mode 100644 index 0000000..1297206 --- /dev/null +++ b/downstream/mmdetection/configs/autoassign/README.md @@ -0,0 +1,35 @@ +# AutoAssign + +> [AutoAssign: Differentiable Label Assignment for Dense Object Detection](https://arxiv.org/abs/2007.03496) + + + +## Abstract + +Determining positive/negative samples for object detection is known as label assignment. Here we present an anchor-free detector named AutoAssign. It requires little human knowledge and achieves appearance-aware through a fully differentiable weighting mechanism. During training, to both satisfy the prior distribution of data and adapt to category characteristics, we present Center Weighting to adjust the category-specific prior distributions. To adapt to object appearances, Confidence Weighting is proposed to adjust the specific assign strategy of each instance. The two weighting modules are then combined to generate positive and negative weights to adjust each location's confidence. Extensive experiments on the MS COCO show that our method steadily surpasses other best sampling strategies by large margins with various backbones. Moreover, our best model achieves 52.1% AP, outperforming all existing one-stage detectors. Besides, experiments on other datasets, e.g., PASCAL VOC, Objects365, and WiderFace, demonstrate the broad applicability of AutoAssign. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | box AP | Config | Download | +| :------: | :---: | :-----: | :------: | :----: | :------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | caffe | 1x | 4.08 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/autoassign/auto_assign_r50_fpn_1x_coco/auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/autoassign/auto_assign_r50_fpn_1x_coco/auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.log.json) | + +**Note**: + +1. We find that the performance is unstable with 1x setting and may fluctuate by about 0.3 mAP. mAP 40.3 ~ 40.6 is acceptable. Such fluctuation can also be found in the original implementation. +2. You can get a more stable results ~ mAP 40.6 with a schedule total 13 epoch, and learning rate is divided by 10 at 10th and 13th epoch. + +## Citation + +```latex +@article{zhu2020autoassign, + title={AutoAssign: Differentiable Label Assignment for Dense Object Detection}, + author={Zhu, Benjin and Wang, Jianfeng and Jiang, Zhengkai and Zong, Fuhang and Liu, Songtao and Li, Zeming and Sun, Jian}, + journal={arXiv preprint arXiv:2007.03496}, + year={2020} +} +``` diff --git a/downstream/mmdetection/configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py b/downstream/mmdetection/configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py new file mode 100644 index 0000000..db548dc --- /dev/null +++ b/downstream/mmdetection/configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py @@ -0,0 +1,85 @@ +# We follow the original implementation which +# adopts the Caffe pre-trained backbone. +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='AutoAssign', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs=True, + num_outs=5, + relu_before_extra_convs=True, + init_cfg=dict(type='Caffe2Xavier', layer='Conv2d')), + bbox_head=dict( + type='AutoAssignHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + loss_bbox=dict(type='GIoULoss', loss_weight=5.0)), + train_cfg=None, + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(lr=0.01, paramwise_cfg=dict(norm_decay_mult=0.)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 1000, + step=[8, 11]) +total_epochs = 12 diff --git a/downstream/mmdetection/configs/autoassign/metafile.yml b/downstream/mmdetection/configs/autoassign/metafile.yml new file mode 100644 index 0000000..f1e9051 --- /dev/null +++ b/downstream/mmdetection/configs/autoassign/metafile.yml @@ -0,0 +1,33 @@ +Collections: + - Name: AutoAssign + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - AutoAssign + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/2007.03496 + Title: 'AutoAssign: Differentiable Label Assignment for Dense Object Detection' + README: configs/autoassign/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.12.0/mmdet/models/detectors/autoassign.py#L6 + Version: v2.12.0 + +Models: + - Name: autoassign_r50_fpn_8x2_1x_coco + In Collection: AutoAssign + Config: configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py + Metadata: + Training Memory (GB): 4.08 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/autoassign/auto_assign_r50_fpn_1x_coco/auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.pth diff --git a/downstream/mmdetection/configs/carafe/README.md b/downstream/mmdetection/configs/carafe/README.md new file mode 100644 index 0000000..803abe0 --- /dev/null +++ b/downstream/mmdetection/configs/carafe/README.md @@ -0,0 +1,42 @@ +# CARAFE + +> [CARAFE: Content-Aware ReAssembly of FEatures](https://arxiv.org/abs/1905.02188) + + + +## Abstract + +Feature upsampling is a key operation in a number of modern convolutional network architectures, e.g. feature pyramids. Its design is critical for dense prediction tasks such as object detection and semantic/instance segmentation. In this work, we propose Content-Aware ReAssembly of FEatures (CARAFE), a universal, lightweight and highly effective operator to fulfill this goal. CARAFE has several appealing properties: (1) Large field of view. Unlike previous works (e.g. bilinear interpolation) that only exploit sub-pixel neighborhood, CARAFE can aggregate contextual information within a large receptive field. (2) Content-aware handling. Instead of using a fixed kernel for all samples (e.g. deconvolution), CARAFE enables instance-specific content-aware handling, which generates adaptive kernels on-the-fly. (3) Lightweight and fast to compute. CARAFE introduces little computational overhead and can be readily integrated into modern network architectures. We conduct comprehensive evaluations on standard benchmarks in object detection, instance/semantic segmentation and inpainting. CARAFE shows consistent and substantial gains across all the tasks (1.2%, 1.3%, 1.8%, 1.1db respectively) with negligible computational overhead. It has great potential to serve as a strong building block for future research. It has great potential to serve as a strong building block for future research. + +
    + +
    + +## Results and Models + +The results on COCO 2017 val is shown in the below table. + +| Method | Backbone | Style | Lr schd | Test Proposal Num | Inf time (fps) | Box AP | Mask AP | Config | Download | +| :--------------------: | :------: | :-----: | :-----: | :---------------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN w/ CARAFE | R-50-FPN | pytorch | 1x | 1000 | 16.5 | 38.6 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/carafe/faster_rcnn_r50_fpn_carafe_1x_coco/faster_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.386_20200504_175733-385a75b7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/carafe/faster_rcnn_r50_fpn_carafe_1x_coco/faster_rcnn_r50_fpn_carafe_1x_coco_20200504_175733.log.json) | +| - | - | - | - | 2000 | | | | | | +| Mask R-CNN w/ CARAFE | R-50-FPN | pytorch | 1x | 1000 | 14.0 | 39.3 | 35.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/carafe/mask_rcnn_r50_fpn_carafe_1x_coco/mask_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.393__segm_mAP-0.358_20200503_135957-8687f195.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/carafe/mask_rcnn_r50_fpn_carafe_1x_coco/mask_rcnn_r50_fpn_carafe_1x_coco_20200503_135957.log.json) | +| - | - | - | - | 2000 | | | | | | + +## Implementation + +The CUDA implementation of CARAFE can be find at https://github.com/myownskyW7/CARAFE. + +## Citation + +We provide config files to reproduce the object detection & instance segmentation results in the ICCV 2019 Oral paper for [CARAFE: Content-Aware ReAssembly of FEatures](https://arxiv.org/abs/1905.02188). + +```latex +@inproceedings{Wang_2019_ICCV, + title = {CARAFE: Content-Aware ReAssembly of FEatures}, + author = {Wang, Jiaqi and Chen, Kai and Xu, Rui and Liu, Ziwei and Loy, Chen Change and Lin, Dahua}, + booktitle = {The IEEE International Conference on Computer Vision (ICCV)}, + month = {October}, + year = {2019} +} +``` diff --git a/downstream/mmdetection/configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py b/downstream/mmdetection/configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py new file mode 100644 index 0000000..dedac3f --- /dev/null +++ b/downstream/mmdetection/configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py @@ -0,0 +1,50 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + neck=dict( + type='FPN_CARAFE', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5, + start_level=0, + end_level=-1, + norm_cfg=None, + act_cfg=None, + order=('conv', 'norm', 'act'), + upsample_cfg=dict( + type='carafe', + up_kernel=5, + up_group=1, + encoder_kernel=3, + encoder_dilation=1, + compressed_channels=64))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py b/downstream/mmdetection/configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py new file mode 100644 index 0000000..668c023 --- /dev/null +++ b/downstream/mmdetection/configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py @@ -0,0 +1,60 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + neck=dict( + type='FPN_CARAFE', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5, + start_level=0, + end_level=-1, + norm_cfg=None, + act_cfg=None, + order=('conv', 'norm', 'act'), + upsample_cfg=dict( + type='carafe', + up_kernel=5, + up_group=1, + encoder_kernel=3, + encoder_dilation=1, + compressed_channels=64)), + roi_head=dict( + mask_head=dict( + upsample_cfg=dict( + type='carafe', + scale_factor=2, + up_kernel=5, + up_group=1, + encoder_kernel=3, + encoder_dilation=1, + compressed_channels=64)))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/carafe/metafile.yml b/downstream/mmdetection/configs/carafe/metafile.yml new file mode 100644 index 0000000..b58a3f6 --- /dev/null +++ b/downstream/mmdetection/configs/carafe/metafile.yml @@ -0,0 +1,55 @@ +Collections: + - Name: CARAFE + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RPN + - FPN_CARAFE + - ResNet + - RoIPool + Paper: + URL: https://arxiv.org/abs/1905.02188 + Title: 'CARAFE: Content-Aware ReAssembly of FEatures' + README: configs/carafe/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.12.0/mmdet/models/necks/fpn_carafe.py#L11 + Version: v2.12.0 + +Models: + - Name: faster_rcnn_r50_fpn_carafe_1x_coco + In Collection: CARAFE + Config: configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py + Metadata: + Training Memory (GB): 4.26 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/carafe/faster_rcnn_r50_fpn_carafe_1x_coco/faster_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.386_20200504_175733-385a75b7.pth + + - Name: mask_rcnn_r50_fpn_carafe_1x_coco + In Collection: CARAFE + Config: configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py + Metadata: + Training Memory (GB): 4.31 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/carafe/mask_rcnn_r50_fpn_carafe_1x_coco/mask_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.393__segm_mAP-0.358_20200503_135957-8687f195.pth diff --git a/downstream/mmdetection/configs/cascade_rcnn/README.md b/downstream/mmdetection/configs/cascade_rcnn/README.md new file mode 100644 index 0000000..5a9e817 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/README.md @@ -0,0 +1,79 @@ +# Cascade R-CNN + +> [Cascade R-CNN: High Quality Object Detection and Instance Segmentation](https://arxiv.org/abs/1906.09756) + + + +## Abstract + +In object detection, the intersection over union (IoU) threshold is frequently used to define positives/negatives. The threshold used to train a detector defines its quality. While the commonly used threshold of 0.5 leads to noisy (low-quality) detections, detection performance frequently degrades for larger thresholds. This paradox of high-quality detection has two causes: 1) overfitting, due to vanishing positive samples for large thresholds, and 2) inference-time quality mismatch between detector and test hypotheses. A multi-stage object detection architecture, the Cascade R-CNN, composed of a sequence of detectors trained with increasing IoU thresholds, is proposed to address these problems. The detectors are trained sequentially, using the output of a detector as training set for the next. This resampling progressively improves hypotheses quality, guaranteeing a positive training set of equivalent size for all detectors and minimizing overfitting. The same cascade is applied at inference, to eliminate quality mismatches between hypotheses and detectors. An implementation of the Cascade R-CNN without bells or whistles achieves state-of-the-art performance on the COCO dataset, and significantly improves high-quality detection on generic and specific object detection datasets, including VOC, KITTI, CityPerson, and WiderFace. Finally, the Cascade R-CNN is generalized to instance segmentation, with nontrivial improvements over the Mask R-CNN. + +
    + +
    + +## Results and Models + +### Cascade R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 4.2 | | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco/cascade_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.404_20200504_174853-b857be87.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco/cascade_rcnn_r50_caffe_fpn_1x_coco_20200504_174853.log.json) | +| R-50-FPN | pytorch | 1x | 4.4 | 16.1 | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco/cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco/cascade_rcnn_r50_fpn_1x_coco_20200316_214748.log.json) | +| R-50-FPN | pytorch | 20e | - | - | 41.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco/cascade_rcnn_r50_fpn_20e_coco_bbox_mAP-0.41_20200504_175131-e9872a90.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco/cascade_rcnn_r50_fpn_20e_coco_20200504_175131.log.json) | +| R-101-FPN | caffe | 1x | 6.2 | | 42.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco/cascade_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.423_20200504_175649-cab8dbd5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco/cascade_rcnn_r101_caffe_fpn_1x_coco_20200504_175649.log.json) | +| R-101-FPN | pytorch | 1x | 6.4 | 13.5 | 42.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco/cascade_rcnn_r101_fpn_1x_coco_20200317-0b6a2fbf.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco/cascade_rcnn_r101_fpn_1x_coco_20200317_101744.log.json) | +| R-101-FPN | pytorch | 20e | - | - | 42.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco/cascade_rcnn_r101_fpn_20e_coco_bbox_mAP-0.425_20200504_231812-5057dcc5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco/cascade_rcnn_r101_fpn_20e_coco_20200504_231812.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.6 | 10.9 | 43.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco/cascade_rcnn_x101_32x4d_fpn_1x_coco_20200316-95c2deb6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco/cascade_rcnn_x101_32x4d_fpn_1x_coco_20200316_055608.log.json) | +| X-101-32x4d-FPN | pytorch | 20e | 7.6 | | 43.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco/cascade_rcnn_x101_32x4d_fpn_20e_coco_20200906_134608-9ae0a720.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco/cascade_rcnn_x101_32x4d_fpn_20e_coco_20200906_134608.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.7 | | 44.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco/cascade_rcnn_x101_64x4d_fpn_1x_coco_20200515_075702-43ce6a30.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco/cascade_rcnn_x101_64x4d_fpn_1x_coco_20200515_075702.log.json) | +| X-101-64x4d-FPN | pytorch | 20e | 10.7 | | 44.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco/cascade_rcnn_x101_64x4d_fpn_20e_coco_20200509_224357-051557b1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco/cascade_rcnn_x101_64x4d_fpn_20e_coco_20200509_224357.log.json) | + +### Cascade Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 5.9 | | 41.2 | 36.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco/cascade_mask_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.412__segm_mAP-0.36_20200504_174659-5004b251.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco/cascade_mask_rcnn_r50_caffe_fpn_1x_coco_20200504_174659.log.json) | +| R-50-FPN | pytorch | 1x | 6.0 | 11.2 | 41.2 | 35.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203_170449.log.json) | +| R-50-FPN | pytorch | 20e | - | - | 41.9 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco/cascade_mask_rcnn_r50_fpn_20e_coco_bbox_mAP-0.419__segm_mAP-0.365_20200504_174711-4af8e66e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco/cascade_mask_rcnn_r50_fpn_20e_coco_20200504_174711.log.json) | +| R-101-FPN | caffe | 1x | 7.8 | | 43.2 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco/cascade_mask_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.432__segm_mAP-0.376_20200504_174813-5c1e9599.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco/cascade_mask_rcnn_r101_caffe_fpn_1x_coco_20200504_174813.log.json) | +| R-101-FPN | pytorch | 1x | 7.9 | 9.8 | 42.9 | 37.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco/cascade_mask_rcnn_r101_fpn_1x_coco_20200203-befdf6ee.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco/cascade_mask_rcnn_r101_fpn_1x_coco_20200203_092521.log.json) | +| R-101-FPN | pytorch | 20e | - | - | 43.4 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco/cascade_mask_rcnn_r101_fpn_20e_coco_bbox_mAP-0.434__segm_mAP-0.378_20200504_174836-005947da.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco/cascade_mask_rcnn_r101_fpn_20e_coco_20200504_174836.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 9.2 | 8.6 | 44.3 | 38.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco_20200201-0f411b1f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco_20200201_052416.log.json) | +| X-101-32x4d-FPN | pytorch | 20e | 9.2 | - | 45.0 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco_20200528_083917-ed1f4751.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco_20200528_083917.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 12.2 | 6.7 | 45.3 | 39.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco_20200203-9a2db89d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco_20200203_044059.log.json) | +| X-101-64x4d-FPN | pytorch | 20e | 12.2 | | 45.6 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco_20200512_161033-bdb5126a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco_20200512_161033.log.json) | + +**Notes:** + +- The `20e` schedule in Cascade (Mask) R-CNN indicates decreasing the lr at 16 and 19 epochs, with a total of 20 epochs. + +## Pre-trained Models + +We also train some models with longer schedules and multi-scale training for Cascade Mask R-CNN. The users could finetune them for downstream tasks. + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 3x | 5.7 | | 44.0 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210707_002651-6e29b3a6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210707_002651.log.json) | +| R-50-FPN | pytorch | 3x | 5.9 | | 44.3 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco_20210628_164719-5bdc3824.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco_20210628_164719.log.json) | +| R-101-FPN | caffe | 3x | 7.7 | | 45.4 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210707_002620-a5bd2389.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210707_002620.log.json) | +| R-101-FPN | pytorch | 3x | 7.8 | | 45.5 | 39.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco_20210628_165236-51a2d363.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco_20210628_165236.log.json) | +| X-101-32x4d-FPN | pytorch | 3x | 9.0 | | 46.3 | 40.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210706_225234-40773067.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210706_225234.log.json) | +| X-101-32x8d-FPN | pytorch | 3x | 12.1 | | 46.1 | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210719_180640-9ff7e76f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210719_180640.log.json) | +| X-101-64x4d-FPN | pytorch | 3x | 12.0 | | 46.6 | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210719_210311-d3e64ba0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210719_210311.log.json) | + +## Citation + +```latex +@article{Cai_2019, + title={Cascade R-CNN: High Quality Object Detection and Instance Segmentation}, + ISSN={1939-3539}, + url={http://dx.doi.org/10.1109/tpami.2019.2956516}, + DOI={10.1109/tpami.2019.2956516}, + journal={IEEE Transactions on Pattern Analysis and Machine Intelligence}, + publisher={Institute of Electrical and Electronics Engineers (IEEE)}, + author={Cai, Zhaowei and Vasconcelos, Nuno}, + year={2019}, + pages={1–1} +} +``` diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..5ee6231 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..1df87fc --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..f59c155 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py new file mode 100644 index 0000000..45ab7ed --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..1b20f16 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..12d37ef --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,41 @@ +_base_ = ['./cascade_mask_rcnn_r50_fpn_1x_coco.py'] + +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..9fb817e --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,49 @@ +_base_ = ['./cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py'] +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..49ab539 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py new file mode 100644 index 0000000..1296dc4 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_20e.py', '../_base_/default_runtime.py' +] diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..ed0c6d1 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = [ + '../common/mstrain_3x_coco_instance.py', + '../_base_/models/cascade_mask_rcnn_r50_fpn.py' +] diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..06cbbe7 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py new file mode 100644 index 0000000..4e35236 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..7d37d17 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..eeec1aa --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py @@ -0,0 +1,60 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py' + +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +# ResNeXt-101-32x8d model trained with Caffe2 at FB, +# so the mean and std need to be changed. +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..7dbef5f --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py new file mode 100644 index 0000000..579b1ac --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..ed6cf4b --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..1e90f4b --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..5c07776 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py new file mode 100644 index 0000000..b1719c2 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..696bcfb --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,42 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..87e21fb --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py new file mode 100644 index 0000000..6f886e1 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py @@ -0,0 +1,4 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..5ac02c1 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py new file mode 100644 index 0000000..486e45e --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..78229f0 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,15 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py new file mode 100644 index 0000000..58812de --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py @@ -0,0 +1,15 @@ +_base_ = './cascade_rcnn_r50_fpn_20e_coco.py' +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/cascade_rcnn/metafile.yml b/downstream/mmdetection/configs/cascade_rcnn/metafile.yml new file mode 100644 index 0000000..1007f2e --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rcnn/metafile.yml @@ -0,0 +1,525 @@ +Collections: + - Name: Cascade R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Cascade R-CNN + - FPN + - RPN + - ResNet + - RoIAlign + Paper: + URL: http://dx.doi.org/10.1109/tpami.2019.2956516 + Title: 'Cascade R-CNN: Delving into High Quality Object Detection' + README: configs/cascade_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/cascade_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: cascade_rcnn_r50_caffe_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco/cascade_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.404_20200504_174853-b857be87.pth + + - Name: cascade_rcnn_r50_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 62.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco/cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth + + - Name: cascade_rcnn_r50_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 62.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco/cascade_rcnn_r50_fpn_20e_coco_bbox_mAP-0.41_20200504_175131-e9872a90.pth + + - Name: cascade_rcnn_r101_caffe_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.2 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco/cascade_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.423_20200504_175649-cab8dbd5.pth + + - Name: cascade_rcnn_r101_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 74.07 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco/cascade_rcnn_r101_fpn_1x_coco_20200317-0b6a2fbf.pth + + - Name: cascade_rcnn_r101_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 74.07 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco/cascade_rcnn_r101_fpn_20e_coco_bbox_mAP-0.425_20200504_231812-5057dcc5.pth + + - Name: cascade_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 91.74 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco/cascade_rcnn_x101_32x4d_fpn_1x_coco_20200316-95c2deb6.pth + + - Name: cascade_rcnn_x101_32x4d_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py + Metadata: + Training Memory (GB): 7.6 + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco/cascade_rcnn_x101_32x4d_fpn_20e_coco_20200906_134608-9ae0a720.pth + + - Name: cascade_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.7 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco/cascade_rcnn_x101_64x4d_fpn_1x_coco_20200515_075702-43ce6a30.pth + + - Name: cascade_rcnn_x101_64x4d_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py + Metadata: + Training Memory (GB): 10.7 + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco/cascade_rcnn_x101_64x4d_fpn_20e_coco_20200509_224357-051557b1.pth + + - Name: cascade_mask_rcnn_r50_caffe_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.9 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco/cascade_mask_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.412__segm_mAP-0.36_20200504_174659-5004b251.pth + + - Name: cascade_mask_rcnn_r50_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 89.29 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth + + - Name: cascade_mask_rcnn_r50_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 89.29 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco/cascade_mask_rcnn_r50_fpn_20e_coco_bbox_mAP-0.419__segm_mAP-0.365_20200504_174711-4af8e66e.pth + + - Name: cascade_mask_rcnn_r101_caffe_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.8 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco/cascade_mask_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.432__segm_mAP-0.376_20200504_174813-5c1e9599.pth + + - Name: cascade_mask_rcnn_r101_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.9 + inference time (ms/im): + - value: 102.04 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco/cascade_mask_rcnn_r101_fpn_1x_coco_20200203-befdf6ee.pth + + - Name: cascade_mask_rcnn_r101_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 7.9 + inference time (ms/im): + - value: 102.04 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco/cascade_mask_rcnn_r101_fpn_20e_coco_bbox_mAP-0.434__segm_mAP-0.378_20200504_174836-005947da.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 9.2 + inference time (ms/im): + - value: 116.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco_20200201-0f411b1f.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py + Metadata: + Training Memory (GB): 9.2 + inference time (ms/im): + - value: 116.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco_20200528_083917-ed1f4751.pth + + - Name: cascade_mask_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 12.2 + inference time (ms/im): + - value: 149.25 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco_20200203-9a2db89d.pth + + - Name: cascade_mask_rcnn_x101_64x4d_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py + Metadata: + Training Memory (GB): 12.2 + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco_20200512_161033-bdb5126a.pth + + - Name: cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.7 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210707_002651-6e29b3a6.pth + + - Name: cascade_mask_rcnn_r50_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.9 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco_20210628_164719-5bdc3824.pth + + - Name: cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 7.7 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210707_002620-a5bd2389.pth + + - Name: cascade_mask_rcnn_r101_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 7.8 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco_20210628_165236-51a2d363.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 9.0 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210706_225234-40773067.pth + + - Name: cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 12.1 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210719_180640-9ff7e76f.pth + + - Name: cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 12.0 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210719_210311-d3e64ba0.pth diff --git a/downstream/mmdetection/configs/cascade_rpn/README.md b/downstream/mmdetection/configs/cascade_rpn/README.md new file mode 100644 index 0000000..fb2b482 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rpn/README.md @@ -0,0 +1,41 @@ +# Cascade RPN + +> [Cascade RPN: Delving into High-Quality Region Proposal Network with Adaptive Convolution](https://arxiv.org/abs/1909.06720) + + + +## Abstract + +This paper considers an architecture referred to as Cascade Region Proposal Network (Cascade RPN) for improving the region-proposal quality and detection performance by systematically addressing the limitation of the conventional RPN that heuristically defines the anchors and aligns the features to the anchors. First, instead of using multiple anchors with predefined scales and aspect ratios, Cascade RPN relies on a single anchor per location and performs multi-stage refinement. Each stage is progressively more stringent in defining positive samples by starting out with an anchor-free metric followed by anchor-based metrics in the ensuing stages. Second, to attain alignment between the features and the anchors throughout the stages, adaptive convolution is proposed that takes the anchors in addition to the image features as its input and learns the sampled features guided by the anchors. A simple implementation of a two-stage Cascade RPN achieves AR 13.4 points higher than that of the conventional RPN, surpassing any existing region proposal methods. When adopting to Fast R-CNN and Faster R-CNN, Cascade RPN can improve the detection mAP by 3.1 and 3.5 points, respectively. + +
    + +
    + +## Results and Models + +### Region proposal performance + +| Method | Backbone | Style | Mem (GB) | Train time (s/iter) | Inf time (fps) | AR 1000 | Config | Download | +| :----: | :------: | :---: | :------: | :-----------------: | :------------: | :-----: | :---------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | +| CRPN | R-50-FPN | caffe | - | - | - | 72.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_r50_caffe_fpn_1x_coco/cascade_rpn_r50_caffe_fpn_1x_coco-7aa93cef.pth) | + +### Detection performance + +| Method | Proposal | Backbone | Style | Schedule | Mem (GB) | Train time (s/iter) | Inf time (fps) | box AP | Config | Download | +| :----------: | :---------: | :------: | :---: | :------: | :------: | :-----------------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Fast R-CNN | Cascade RPN | R-50-FPN | caffe | 1x | - | - | - | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco/crpn_fast_rcnn_r50_caffe_fpn_1x_coco-cb486e66.pth) | +| Faster R-CNN | Cascade RPN | R-50-FPN | caffe | 1x | - | - | - | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco/crpn_faster_rcnn_r50_caffe_fpn_1x_coco-c8283cca.pth) | + +## Citation + +We provide the code for reproducing experiment results of [Cascade RPN](https://arxiv.org/abs/1909.06720). + +```latex +@inproceedings{vu2019cascade, + title={Cascade RPN: Delving into High-Quality Region Proposal Network with Adaptive Convolution}, + author={Vu, Thang and Jang, Hyunjun and Pham, Trung X and Yoo, Chang D}, + booktitle={Conference on Neural Information Processing Systems (NeurIPS)}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..29f5d07 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,77 @@ +_base_ = '../fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + roi_head=dict( + bbox_head=dict( + bbox_coder=dict(target_stds=[0.04, 0.04, 0.08, 0.08]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.5), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + assigner=dict( + pos_iou_thr=0.65, neg_iou_thr=0.65, min_pos_iou=0.65), + sampler=dict(num=256))), + test_cfg=dict(rcnn=dict(score_thr=1e-3))) +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=300), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=300), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['proposals']), + dict( + type='ToDataContainer', + fields=[dict(key='proposals', stack=False)]), + dict(type='Collect', keys=['img', 'proposals']), + ]) +] +data = dict( + train=dict( + proposal_file=data_root + + 'proposals/crpn_r50_caffe_fpn_1x_train2017.pkl', + pipeline=train_pipeline), + val=dict( + proposal_file=data_root + + 'proposals/crpn_r50_caffe_fpn_1x_val2017.pkl', + pipeline=test_pipeline), + test=dict( + proposal_file=data_root + + 'proposals/crpn_r50_caffe_fpn_1x_val2017.pkl', + pipeline=test_pipeline)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..bad86e6 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,92 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py' +rpn_weight = 0.7 +model = dict( + rpn_head=dict( + _delete_=True, + type='CascadeRPNHead', + num_stages=2, + stages=[ + dict( + type='StageCascadeRPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[1.0], + strides=[4, 8, 16, 32, 64]), + adapt_cfg=dict(type='dilation', dilation=3), + bridged_feature=True, + sampling=False, + with_cls=False, + reg_decoded_bbox=True, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=(.0, .0, .0, .0), + target_stds=(0.1, 0.1, 0.5, 0.5)), + loss_bbox=dict( + type='IoULoss', linear=True, + loss_weight=10.0 * rpn_weight)), + dict( + type='StageCascadeRPNHead', + in_channels=256, + feat_channels=256, + adapt_cfg=dict(type='offset'), + bridged_feature=False, + sampling=True, + with_cls=True, + reg_decoded_bbox=True, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=(.0, .0, .0, .0), + target_stds=(0.05, 0.05, 0.1, 0.1)), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0 * rpn_weight), + loss_bbox=dict( + type='IoULoss', linear=True, + loss_weight=10.0 * rpn_weight)) + ]), + roi_head=dict( + bbox_head=dict( + bbox_coder=dict(target_stds=[0.04, 0.04, 0.08, 0.08]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.5), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=[ + dict( + assigner=dict( + type='RegionAssigner', center_ratio=0.2, ignore_ratio=0.5), + allowed_border=-1, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False) + ], + rpn_proposal=dict(max_per_img=300, nms=dict(iou_threshold=0.8)), + rcnn=dict( + assigner=dict( + pos_iou_thr=0.65, neg_iou_thr=0.65, min_pos_iou=0.65), + sampler=dict(type='RandomSampler', num=256))), + test_cfg=dict( + rpn=dict(max_per_img=300, nms=dict(iou_threshold=0.8)), + rcnn=dict(score_thr=1e-3))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..5562e69 --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,77 @@ +_base_ = '../rpn/rpn_r50_caffe_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='CascadeRPNHead', + num_stages=2, + stages=[ + dict( + type='StageCascadeRPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[1.0], + strides=[4, 8, 16, 32, 64]), + adapt_cfg=dict(type='dilation', dilation=3), + bridged_feature=True, + sampling=False, + with_cls=False, + reg_decoded_bbox=True, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=(.0, .0, .0, .0), + target_stds=(0.1, 0.1, 0.5, 0.5)), + loss_bbox=dict(type='IoULoss', linear=True, loss_weight=10.0)), + dict( + type='StageCascadeRPNHead', + in_channels=256, + feat_channels=256, + adapt_cfg=dict(type='offset'), + bridged_feature=False, + sampling=True, + with_cls=True, + reg_decoded_bbox=True, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=(.0, .0, .0, .0), + target_stds=(0.05, 0.05, 0.1, 0.1)), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', linear=True, loss_weight=10.0)) + ]), + train_cfg=dict(rpn=[ + dict( + assigner=dict( + type='RegionAssigner', center_ratio=0.2, ignore_ratio=0.5), + allowed_border=-1, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.3, + ignore_iof_thr=-1, + iou_calculator=dict(type='BboxOverlaps2D')), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False) + ]), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.8), + min_bbox_size=0))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/cascade_rpn/metafile.yml b/downstream/mmdetection/configs/cascade_rpn/metafile.yml new file mode 100644 index 0000000..335b2bc --- /dev/null +++ b/downstream/mmdetection/configs/cascade_rpn/metafile.yml @@ -0,0 +1,44 @@ +Collections: + - Name: Cascade RPN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Cascade RPN + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1909.06720 + Title: 'Cascade RPN: Delving into High-Quality Region Proposal Network with Adaptive Convolution' + README: configs/cascade_rpn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.8.0/mmdet/models/dense_heads/cascade_rpn_head.py#L538 + Version: v2.8.0 + +Models: + - Name: crpn_fast_rcnn_r50_caffe_fpn_1x_coco + In Collection: Cascade RPN + Config: configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco/crpn_fast_rcnn_r50_caffe_fpn_1x_coco-cb486e66.pth + + - Name: crpn_faster_rcnn_r50_caffe_fpn_1x_coco + In Collection: Cascade RPN + Config: configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco/crpn_faster_rcnn_r50_caffe_fpn_1x_coco-c8283cca.pth diff --git a/downstream/mmdetection/configs/centernet/README.md b/downstream/mmdetection/configs/centernet/README.md new file mode 100644 index 0000000..0f951a0 --- /dev/null +++ b/downstream/mmdetection/configs/centernet/README.md @@ -0,0 +1,40 @@ +# CenterNet + +> [Objects as Points](https://arxiv.org/abs/1904.07850) + + + +## Abstract + +Detection identifies objects as axis-aligned boxes in an image. Most successful object detectors enumerate a nearly exhaustive list of potential object locations and classify each. This is wasteful, inefficient, and requires additional post-processing. In this paper, we take a different approach. We model an object as a single point --- the center point of its bounding box. Our detector uses keypoint estimation to find center points and regresses to all other object properties, such as size, 3D location, orientation, and even pose. Our center point based approach, CenterNet, is end-to-end differentiable, simpler, faster, and more accurate than corresponding bounding box based detectors. CenterNet achieves the best speed-accuracy trade-off on the MS COCO dataset, with 28.1% AP at 142 FPS, 37.4% AP at 52 FPS, and 45.1% AP with multi-scale testing at 1.4 FPS. We use the same approach to estimate 3D bounding box in the KITTI benchmark and human pose on the COCO keypoint dataset. Our method performs competitively with sophisticated multi-stage methods and runs in real-time. + +
    + +
    + +## Results and Models + +| Backbone | DCN | Mem (GB) | Box AP | Flip box AP | Config | Download | +| :-------: | :-: | :------: | :----: | :---------: | :---------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ResNet-18 | N | 3.45 | 25.9 | 27.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/centernet/centernet_resnet18_140e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_140e_coco/centernet_resnet18_140e_coco_20210705_093630-bb5b3bf7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_140e_coco/centernet_resnet18_140e_coco_20210705_093630.log.json) | +| ResNet-18 | Y | 3.47 | 29.5 | 30.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/centernet/centernet_resnet18_dcnv2_140e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_dcnv2_140e_coco/centernet_resnet18_dcnv2_140e_coco_20210702_155131-c8cd631f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_dcnv2_140e_coco/centernet_resnet18_dcnv2_140e_coco_20210702_155131.log.json) | + +Note: + +- Flip box AP setting is single-scale and `flip=True`. +- Due to complex data enhancement, we find that the performance is unstable and may fluctuate by about 0.4 mAP. mAP 29.4 ~ 29.8 is acceptable in ResNet-18-DCNv2. +- Compared to the source code, we refer to [CenterNet-Better](https://github.com/FateScript/CenterNet-better), and make the following changes + - fix wrong image mean and variance in image normalization to be compatible with the pre-trained backbone. + - Use SGD rather than ADAM optimizer and add warmup and grad clip. + - Use DistributedDataParallel as other models in MMDetection rather than using DataParallel. + +## Citation + +```latex +@article{zhou2019objects, + title={Objects as Points}, + author={Zhou, Xingyi and Wang, Dequan and Kr{\"a}henb{\"u}hl, Philipp}, + booktitle={arXiv preprint arXiv:1904.07850}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/centernet/centernet_resnet18_140e_coco.py b/downstream/mmdetection/configs/centernet/centernet_resnet18_140e_coco.py new file mode 100644 index 0000000..52c86a5 --- /dev/null +++ b/downstream/mmdetection/configs/centernet/centernet_resnet18_140e_coco.py @@ -0,0 +1,3 @@ +_base_ = './centernet_resnet18_dcnv2_140e_coco.py' + +model = dict(neck=dict(use_dcn=False)) diff --git a/downstream/mmdetection/configs/centernet/centernet_resnet18_dcnv2_140e_coco.py b/downstream/mmdetection/configs/centernet/centernet_resnet18_dcnv2_140e_coco.py new file mode 100644 index 0000000..b8a0bb1 --- /dev/null +++ b/downstream/mmdetection/configs/centernet/centernet_resnet18_dcnv2_140e_coco.py @@ -0,0 +1,127 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='CenterNet', + backbone=dict( + type='ResNet', + depth=18, + norm_eval=False, + norm_cfg=dict(type='BN'), + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet18')), + neck=dict( + type='CTResNetNeck', + in_channel=512, + num_deconv_filters=(256, 128, 64), + num_deconv_kernels=(4, 4, 4), + use_dcn=True), + bbox_head=dict( + type='CenterNetHead', + num_classes=80, + in_channel=64, + feat_channel=64, + loss_center_heatmap=dict(type='GaussianFocalLoss', loss_weight=1.0), + loss_wh=dict(type='L1Loss', loss_weight=0.1), + loss_offset=dict(type='L1Loss', loss_weight=1.0)), + train_cfg=None, + test_cfg=dict(topk=100, local_maximum_kernel=3, max_per_img=100)) + +# We fixed the incorrect img_norm_cfg problem in the source code. +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True, color_type='color'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(512, 512), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + mean=[0, 0, 0], + std=[1, 1, 1], + to_rgb=True, + test_pad_mode=None), + dict(type='Resize', img_scale=(512, 512), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict( + type='RandomCenterCropPad', + ratios=None, + border=None, + mean=[0, 0, 0], + std=[1, 1, 1], + to_rgb=True, + test_mode=True, + test_pad_mode=['logical_or', 31], + test_pad_add_pix=1), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + meta_keys=('filename', 'ori_filename', 'ori_shape', + 'img_shape', 'pad_shape', 'scale_factor', 'flip', + 'flip_direction', 'img_norm_cfg', 'border'), + keys=['img']) + ]) +] + +dataset_type = 'CocoDataset' +data_root = 'data/coco/' + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=16, + workers_per_gpu=4, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +# Based on the default settings of modern detectors, the SGD effect is better +# than the Adam in the source code, so we use SGD default settings and +# if you use adam+lr5e-4, the map is 29.1. +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) + +# learning policy +# Based on the default settings of modern detectors, we added warmup settings. +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 1000, + step=[18, 24]) # the real step is [18*5, 24*5] +runner = dict(max_epochs=28) # the real epoch is 28*5=140 + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (16 samples per GPU) +auto_scale_lr = dict(base_batch_size=128) diff --git a/downstream/mmdetection/configs/centernet/metafile.yml b/downstream/mmdetection/configs/centernet/metafile.yml new file mode 100644 index 0000000..e86e57b --- /dev/null +++ b/downstream/mmdetection/configs/centernet/metafile.yml @@ -0,0 +1,46 @@ +Collections: + - Name: CenterNet + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x TITANXP GPUs + Architecture: + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.07850 + Title: 'Objects as Points' + README: configs/centernet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.13.0/mmdet/models/detectors/centernet.py#L10 + Version: v2.13.0 + +Models: + - Name: centernet_resnet18_dcnv2_140e_coco + In Collection: CenterNet + Config: configs/centernet/centernet_resnet18_dcnv2_140e_coco.py + Metadata: + Batch Size: 128 + Training Memory (GB): 3.47 + Epochs: 140 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 29.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_dcnv2_140e_coco/centernet_resnet18_dcnv2_140e_coco_20210702_155131-c8cd631f.pth + + - Name: centernet_resnet18_140e_coco + In Collection: CenterNet + Config: configs/centernet/centernet_resnet18_140e_coco.py + Metadata: + Batch Size: 128 + Training Memory (GB): 3.45 + Epochs: 140 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 25.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_140e_coco/centernet_resnet18_140e_coco_20210705_093630-bb5b3bf7.pth diff --git a/downstream/mmdetection/configs/centripetalnet/README.md b/downstream/mmdetection/configs/centripetalnet/README.md new file mode 100644 index 0000000..b01b00a --- /dev/null +++ b/downstream/mmdetection/configs/centripetalnet/README.md @@ -0,0 +1,36 @@ +# CentripetalNet + +> [CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection](https://arxiv.org/abs/2003.09119) + + + +## Abstract + +Keypoint-based detectors have achieved pretty-well performance. However, incorrect keypoint matching is still widespread and greatly affects the performance of the detector. In this paper, we propose CentripetalNet which uses centripetal shift to pair corner keypoints from the same instance. CentripetalNet predicts the position and the centripetal shift of the corner points and matches corners whose shifted results are aligned. Combining position information, our approach matches corner points more accurately than the conventional embedding approaches do. Corner pooling extracts information inside the bounding boxes onto the border. To make this information more aware at the corners, we design a cross-star deformable convolution network to conduct feature adaption. Furthermore, we explore instance segmentation on anchor-free detectors by equipping our CentripetalNet with a mask prediction module. On MS-COCO test-dev, our CentripetalNet not only outperforms all existing anchor-free detectors with an AP of 48.0% but also achieves comparable performance to the state-of-the-art instance segmentation approaches with a 40.2% MaskAP. + +
    + +
    + +## Results and Models + +| Backbone | Batch Size | Step/Total Epochs | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :--------------: | :--------------------------------------------------------------: | :---------------: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HourglassNet-104 | [16 x 6](./centripetalnet_hourglass104_mstest_16x6_210e_coco.py) | 190/210 | 16.7 | 3.7 | 44.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco/centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804-3ccc61e5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco/centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804.log.json) | + +Note: + +- TTA setting is single-scale and `flip=True`. +- The model we released is the best checkpoint rather than the latest checkpoint (box AP 44.8 vs 44.6 in our experiment). + +## Citation + +```latex +@InProceedings{Dong_2020_CVPR, +author = {Dong, Zhiwei and Li, Guoxuan and Liao, Yue and Wang, Fei and Ren, Pengju and Qian, Chen}, +title = {CentripetalNet: Pursuing High-Quality Keypoint Pairs for Object Detection}, +booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, +month = {June}, +year = {2020} +} +``` diff --git a/downstream/mmdetection/configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py b/downstream/mmdetection/configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py new file mode 100644 index 0000000..5281c5b --- /dev/null +++ b/downstream/mmdetection/configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py @@ -0,0 +1,110 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/coco_detection.py' +] + +# model settings +model = dict( + type='CornerNet', + backbone=dict( + type='HourglassNet', + downsample_times=5, + num_stacks=2, + stage_channels=[256, 256, 384, 384, 384, 512], + stage_blocks=[2, 2, 2, 2, 2, 4], + norm_cfg=dict(type='BN', requires_grad=True)), + neck=None, + bbox_head=dict( + type='CentripetalHead', + num_classes=80, + in_channels=256, + num_feat_levels=2, + corner_emb_channels=0, + loss_heatmap=dict( + type='GaussianFocalLoss', alpha=2.0, gamma=4.0, loss_weight=1), + loss_offset=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1), + loss_guiding_shift=dict( + type='SmoothL1Loss', beta=1.0, loss_weight=0.05), + loss_centripetal_shift=dict( + type='SmoothL1Loss', beta=1.0, loss_weight=1)), + # training and testing settings + train_cfg=None, + test_cfg=dict( + corner_topk=100, + local_maximum_kernel=3, + distance_threshold=0.5, + score_thr=0.05, + max_per_img=100, + nms=dict(type='soft_nms', iou_threshold=0.5, method='gaussian'))) +# data settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + test_mode=False, + test_pad_mode=None, + **img_norm_cfg), + dict(type='Resize', img_scale=(511, 511), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=True, + transforms=[ + dict(type='Resize'), + dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + test_mode=True, + test_pad_mode=['logical_or', 127], + **img_norm_cfg), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict( + type='Collect', + keys=['img'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'pad_shape', + 'scale_factor', 'flip', 'img_norm_cfg', 'border')), + ]) +] +data = dict( + samples_per_gpu=6, + workers_per_gpu=3, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='Adam', lr=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[190]) +runner = dict(type='EpochBasedRunner', max_epochs=210) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (16 GPUs) x (6 samples per GPU) +auto_scale_lr = dict(base_batch_size=96) diff --git a/downstream/mmdetection/configs/centripetalnet/metafile.yml b/downstream/mmdetection/configs/centripetalnet/metafile.yml new file mode 100644 index 0000000..61aed3e --- /dev/null +++ b/downstream/mmdetection/configs/centripetalnet/metafile.yml @@ -0,0 +1,39 @@ +Collections: + - Name: CentripetalNet + Metadata: + Training Data: COCO + Training Techniques: + - Adam + Training Resources: 16x V100 GPUs + Architecture: + - Corner Pooling + - Stacked Hourglass Network + Paper: + URL: https://arxiv.org/abs/2003.09119 + Title: 'CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection' + README: configs/centripetalnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.5.0/mmdet/models/detectors/cornernet.py#L9 + Version: v2.5.0 + +Models: + - Name: centripetalnet_hourglass104_mstest_16x6_210e_coco + In Collection: CentripetalNet + Config: configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py + Metadata: + Batch Size: 96 + Training Memory (GB): 16.7 + inference time (ms/im): + - value: 270.27 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 210 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco/centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804-3ccc61e5.pth diff --git a/downstream/mmdetection/configs/cityscapes/README.md b/downstream/mmdetection/configs/cityscapes/README.md new file mode 100644 index 0000000..c52a79f --- /dev/null +++ b/downstream/mmdetection/configs/cityscapes/README.md @@ -0,0 +1,46 @@ +# Cityscapes + +> [The Cityscapes Dataset for Semantic Urban Scene Understanding](https://arxiv.org/abs/1604.01685) + + + +## Abstract + +Visual understanding of complex urban street scenes is an enabling factor for a wide range of applications. Object detection has benefited enormously from large-scale datasets, especially in the context of deep learning. For semantic urban scene understanding, however, no current dataset adequately captures the complexity of real-world urban scenes. +To address this, we introduce Cityscapes, a benchmark suite and large-scale dataset to train and test approaches for pixel-level and instance-level semantic labeling. Cityscapes is comprised of a large, diverse set of stereo video sequences recorded in streets from 50 different cities. 5000 of these images have high quality pixel-level annotations; 20000 additional images have coarse annotations to enable methods that leverage large volumes of weakly-labeled data. Crucially, our effort exceeds previous attempts in terms of dataset size, annotation richness, scene variability, and complexity. Our accompanying empirical study provides an in-depth analysis of the dataset characteristics, as well as a performance evaluation of several state-of-the-art approaches based on our benchmark. + +
    + +
    + +## Common settings + +- All baselines were trained using 8 GPU with a batch size of 8 (1 images per GPU) using the [linear scaling rule](https://arxiv.org/abs/1706.02677) to scale the learning rate. +- All models were trained on `cityscapes_train`, and tested on `cityscapes_val`. +- 1x training schedule indicates 64 epochs which corresponds to slightly less than the 24k iterations reported in the original schedule from the [Mask R-CNN paper](https://arxiv.org/abs/1703.06870) +- COCO pre-trained weights are used to initialize. +- A conversion [script](../../tools/dataset_converters/cityscapes.py) is provided to convert Cityscapes into COCO format. Please refer to [install.md](../../docs/1_exist_data_model.md#prepare-datasets) for details. +- `CityscapesDataset` implemented three evaluation methods. `bbox` and `segm` are standard COCO bbox/mask AP. `cityscapes` is the cityscapes dataset official evaluation, which may be slightly higher than COCO. + +### Faster R-CNN + +| Backbone | Style | Lr schd | Scale | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 800-1024 | 5.2 | - | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes_20200502-829424c0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes_20200502_114915.log.json) | + +### Mask R-CNN + +| Backbone | Style | Lr schd | Scale | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 800-1024 | 5.3 | - | 40.9 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes/mask_rcnn_r50_fpn_1x_cityscapes_20201211_133733-d2858245.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes/mask_rcnn_r50_fpn_1x_cityscapes_20201211_133733.log.json) | + +## Citation + +```latex +@inproceedings{Cordts2016Cityscapes, + title={The Cityscapes Dataset for Semantic Urban Scene Understanding}, + author={Cordts, Marius and Omran, Mohamed and Ramos, Sebastian and Rehfeld, Timo and Enzweiler, Markus and Benenson, Rodrigo and Franke, Uwe and Roth, Stefan and Schiele, Bernt}, + booktitle={Proc. of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2016} +} +``` diff --git a/downstream/mmdetection/configs/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes.py b/downstream/mmdetection/configs/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes.py new file mode 100644 index 0000000..ca636bd --- /dev/null +++ b/downstream/mmdetection/configs/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes.py @@ -0,0 +1,44 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/cityscapes_detection.py', + '../_base_/default_runtime.py' +] +model = dict( + backbone=dict(init_cfg=None), + roi_head=dict( + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)))) +# optimizer +# lr is set for a batch size of 8 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + # [7] yields higher performance than [6] + step=[7]) +runner = dict( + type='EpochBasedRunner', max_epochs=8) # actual epoch = 8 * 8 = 64 +log_config = dict(interval=100) +# For better, more stable performance initialize from COCO +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' # noqa + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (1 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/downstream/mmdetection/configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py b/downstream/mmdetection/configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py new file mode 100644 index 0000000..83ea058 --- /dev/null +++ b/downstream/mmdetection/configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py @@ -0,0 +1,51 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/cityscapes_instance.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict(init_cfg=None), + roi_head=dict( + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=8, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)))) +# optimizer +# lr is set for a batch size of 8 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + # [7] yields higher performance than [6] + step=[7]) +runner = dict( + type='EpochBasedRunner', max_epochs=8) # actual epoch = 8 * 8 = 64 +log_config = dict(interval=100) +# For better, more stable performance initialize from COCO +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth' # noqa + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (1 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/downstream/mmdetection/configs/common/lsj_100e_coco_instance.py b/downstream/mmdetection/configs/common/lsj_100e_coco_instance.py new file mode 100644 index 0000000..cacf23d --- /dev/null +++ b/downstream/mmdetection/configs/common/lsj_100e_coco_instance.py @@ -0,0 +1,90 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +image_size = (1024, 1024) + +file_client_args = dict(backend='disk') +# comment out the code below to use different file client +# file_client_args = dict( +# backend='petrel', +# path_mapping=dict({ +# './data/': 's3://openmmlab/datasets/detection/', +# 'data/': 's3://openmmlab/datasets/detection/' +# })) + +train_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.1, 2.0), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=image_size, + recompute_bbox=True, + allow_negative_crop=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1e-2, 1e-2)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=image_size), # padding to image_size leads 0.5+ mAP + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=4, # simply change this from 2 to 16 for 50e - 400e training. + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=5, metric=['bbox', 'segm']) + +# optimizer assumes bs=64 +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.00004) +optimizer_config = dict(grad_clip=None) + +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.067, + step=[22, 24]) +runner = dict(type='EpochBasedRunner', max_epochs=25) diff --git a/downstream/mmdetection/configs/common/mstrain-poly_3x_coco_instance.py b/downstream/mmdetection/configs/common/mstrain-poly_3x_coco_instance.py new file mode 100644 index 0000000..c22ed94 --- /dev/null +++ b/downstream/mmdetection/configs/common/mstrain-poly_3x_coco_instance.py @@ -0,0 +1,80 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric=['bbox', 'segm']) + +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +# learning policy +# Experiments show that using step=[9, 11] has higher performance +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[9, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/downstream/mmdetection/configs/common/mstrain_3x_coco.py b/downstream/mmdetection/configs/common/mstrain_3x_coco.py new file mode 100644 index 0000000..80ec8b8 --- /dev/null +++ b/downstream/mmdetection/configs/common/mstrain_3x_coco.py @@ -0,0 +1,76 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') + +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +# learning policy +# Experiments show that using step=[9, 11] has higher performance +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[9, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/downstream/mmdetection/configs/common/mstrain_3x_coco_instance.py b/downstream/mmdetection/configs/common/mstrain_3x_coco_instance.py new file mode 100644 index 0000000..50f39be --- /dev/null +++ b/downstream/mmdetection/configs/common/mstrain_3x_coco_instance.py @@ -0,0 +1,76 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric=['bbox', 'segm']) + +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +# learning policy +# Experiments show that using step=[9, 11] has higher performance +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[9, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/downstream/mmdetection/configs/common/ssj_270k_coco_instance.py b/downstream/mmdetection/configs/common/ssj_270k_coco_instance.py new file mode 100644 index 0000000..851098f --- /dev/null +++ b/downstream/mmdetection/configs/common/ssj_270k_coco_instance.py @@ -0,0 +1,91 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +image_size = (1024, 1024) + +file_client_args = dict(backend='disk') + +# Standard Scale Jittering (SSJ) resizes and crops an image +# with a resize range of 0.8 to 1.25 of the original image size. +train_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.8, 1.25), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=image_size, + recompute_bbox=True, + allow_negative_crop=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1e-2, 1e-2)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=image_size), # padding to image_size leads 0.5+ mAP + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) + +evaluation = dict(interval=6000, metric=['bbox', 'segm']) + +# optimizer assumes batch_size = (32 GPUs) x (2 samples per GPU) +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.00004) +optimizer_config = dict(grad_clip=None) + +# lr steps at [0.9, 0.95, 0.975] of the maximum iterations +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.001, + step=[243000, 256500, 263250]) +checkpoint_config = dict(interval=6000) +# The model is trained by 270k iterations with batch_size 64, +# which is roughly equivalent to 144 epochs. +runner = dict(type='IterBasedRunner', max_iters=270000) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/common/ssj_scp_270k_coco_instance.py b/downstream/mmdetection/configs/common/ssj_scp_270k_coco_instance.py new file mode 100644 index 0000000..540839f --- /dev/null +++ b/downstream/mmdetection/configs/common/ssj_scp_270k_coco_instance.py @@ -0,0 +1,97 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +image_size = (1024, 1024) + +file_client_args = dict(backend='disk') + +# Standard Scale Jittering (SSJ) resizes and crops an image +# with a resize range of 0.8 to 1.25 of the original image size. +load_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.8, 1.25), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=image_size, + recompute_bbox=True, + allow_negative_crop=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1e-2, 1e-2)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Pad', size=image_size), +] +train_pipeline = [ + dict(type='CopyPaste', max_num_pasted=100), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=load_pipeline), + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) + +evaluation = dict(interval=6000, metric=['bbox', 'segm']) + +# optimizer assumes batch_size = (32 GPUs) x (2 samples per GPU) +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.00004) +optimizer_config = dict(grad_clip=None) + +# lr steps at [0.9, 0.95, 0.975] of the maximum iterations +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.001, + step=[243000, 256500, 263250]) +checkpoint_config = dict(interval=6000) +# The model is trained by 270k iterations with batch_size 64, +# which is roughly equivalent to 144 epochs. +runner = dict(type='IterBasedRunner', max_iters=270000) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/convnext/README.md b/downstream/mmdetection/configs/convnext/README.md new file mode 100644 index 0000000..edf72e8 --- /dev/null +++ b/downstream/mmdetection/configs/convnext/README.md @@ -0,0 +1,40 @@ +# ConvNeXt + +> [A ConvNet for the 2020s](https://arxiv.org/abs/2201.03545) + +## Abstract + +The "Roaring 20s" of visual recognition began with the introduction of Vision Transformers (ViTs), which quickly superseded ConvNets as the state-of-the-art image classification model. A vanilla ViT, on the other hand, faces difficulties when applied to general computer vision tasks such as object detection and semantic segmentation. It is the hierarchical Transformers (e.g., Swin Transformers) that reintroduced several ConvNet priors, making Transformers practically viable as a generic vision backbone and demonstrating remarkable performance on a wide variety of vision tasks. However, the effectiveness of such hybrid approaches is still largely credited to the intrinsic superiority of Transformers, rather than the inherent inductive biases of convolutions. In this work, we reexamine the design spaces and test the limits of what a pure ConvNet can achieve. We gradually "modernize" a standard ResNet toward the design of a vision Transformer, and discover several key components that contribute to the performance difference along the way. The outcome of this exploration is a family of pure ConvNet models dubbed ConvNeXt. Constructed entirely from standard ConvNet modules, ConvNeXts compete favorably with Transformers in terms of accuracy and scalability, achieving 87.8% ImageNet top-1 accuracy and outperforming Swin Transformers on COCO detection and ADE20K segmentation, while maintaining the simplicity and efficiency of standard ConvNets. + +
    + +
    + +## Results and models + +| Method | Backbone | Pretrain | Lr schd | Multi-scale crop | FP16 | Mem (GB) | box AP | mask AP | Config | Download | +| :----------------: | :--------: | :---------: | :-----: | :--------------: | :--: | :------: | :----: | :-----: | :-------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Mask R-CNN | ConvNeXt-T | ImageNet-1K | 3x | yes | yes | 7.3 | 46.2 | 41.7 | [config](./mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco_20220426_154953-050731f4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco_20220426_154953.log.json) | +| Cascade Mask R-CNN | ConvNeXt-T | ImageNet-1K | 3x | yes | yes | 9.0 | 50.3 | 43.6 | [config](./cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220509_204200-8f07c40b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220509_204200.log.json) | +| Cascade Mask R-CNN | ConvNeXt-S | ImageNet-1K | 3x | yes | yes | 12.3 | 51.8 | 44.8 | [config](./cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220510_201004-3d24f5a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220510_201004.log.json) | + +**Note**: + +- ConvNeXt backbone needs to install [MMClassification](https://github.com/open-mmlab/mmclassification) first, which has abundant backbones for downstream tasks. + +```shell +pip install mmcls>=0.22.0 +``` + +- The performance is unstable. `Cascade Mask R-CNN` may fluctuate about 0.2 mAP. + +## Citation + +```bibtex +@article{liu2022convnet, + title={A ConvNet for the 2020s}, + author={Liu, Zhuang and Mao, Hanzi and Wu, Chao-Yuan and Feichtenhofer, Christoph and Darrell, Trevor and Xie, Saining}, + journal={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2022} +} +``` diff --git a/downstream/mmdetection/configs/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py b/downstream/mmdetection/configs/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py new file mode 100644 index 0000000..0ccc31d --- /dev/null +++ b/downstream/mmdetection/configs/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py @@ -0,0 +1,32 @@ +_base_ = './cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py' # noqa + +# please install mmcls>=0.22.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-small_3rdparty_32xb128-noema_in1k_20220301-303e75e3.pth' # noqa + +model = dict( + backbone=dict( + _delete_=True, + type='mmcls.ConvNeXt', + arch='small', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.6, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.'))) + +optimizer = dict( + _delete_=True, + constructor='LearningRateDecayOptimizerConstructor', + type='AdamW', + lr=0.0002, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg={ + 'decay_rate': 0.7, + 'decay_type': 'layer_wise', + 'num_layers': 12 + }) diff --git a/downstream/mmdetection/configs/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py b/downstream/mmdetection/configs/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py new file mode 100644 index 0000000..93304c0 --- /dev/null +++ b/downstream/mmdetection/configs/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py @@ -0,0 +1,149 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# please install mmcls>=0.22.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-tiny_3rdparty_32xb128-noema_in1k_20220301-795e9634.pth' # noqa + +model = dict( + backbone=dict( + _delete_=True, + type='mmcls.ConvNeXt', + arch='tiny', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.4, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + neck=dict(in_channels=[96, 192, 384, 768]), + roi_head=dict(bbox_head=[ + dict( + type='ConvFCBBoxHead', + num_shared_convs=4, + num_shared_fcs=1, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + reg_decoded_bbox=True, + norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=10.0)), + dict( + type='ConvFCBBoxHead', + num_shared_convs=4, + num_shared_fcs=1, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=False, + reg_decoded_bbox=True, + norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=10.0)), + dict( + type='ConvFCBBoxHead', + num_shared_convs=4, + num_shared_fcs=1, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=False, + reg_decoded_bbox=True, + norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=10.0)) + ])) + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline), persistent_workers=True) + +optimizer = dict( + _delete_=True, + constructor='LearningRateDecayOptimizerConstructor', + type='AdamW', + lr=0.0002, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg={ + 'decay_rate': 0.7, + 'decay_type': 'layer_wise', + 'num_layers': 6 + }) + +lr_config = dict(warmup_iters=1000, step=[27, 33]) +runner = dict(max_epochs=36) + +# you need to set mode='dynamic' if you are using pytorch<=1.5.0 +fp16 = dict(loss_scale=dict(init_scale=512)) diff --git a/downstream/mmdetection/configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py b/downstream/mmdetection/configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py new file mode 100644 index 0000000..e8a283f --- /dev/null +++ b/downstream/mmdetection/configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py @@ -0,0 +1,90 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# please install mmcls>=0.22.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-tiny_3rdparty_32xb128-noema_in1k_20220301-795e9634.pth' # noqa + +model = dict( + backbone=dict( + _delete_=True, + type='mmcls.ConvNeXt', + arch='tiny', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.4, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + neck=dict(in_channels=[96, 192, 384, 768])) + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline), persistent_workers=True) + +optimizer = dict( + _delete_=True, + constructor='LearningRateDecayOptimizerConstructor', + type='AdamW', + lr=0.0001, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg={ + 'decay_rate': 0.95, + 'decay_type': 'layer_wise', + 'num_layers': 6 + }) + +lr_config = dict(warmup_iters=1000, step=[27, 33]) +runner = dict(max_epochs=36) + +# you need to set mode='dynamic' if you are using pytorch<=1.5.0 +fp16 = dict(loss_scale=dict(init_scale=512)) diff --git a/downstream/mmdetection/configs/convnext/metafile.yml b/downstream/mmdetection/configs/convnext/metafile.yml new file mode 100644 index 0000000..20425bf --- /dev/null +++ b/downstream/mmdetection/configs/convnext/metafile.yml @@ -0,0 +1,93 @@ +Models: + - Name: mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco + In Collection: Mask R-CNN + Config: configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco + Metadata: + Training Memory (GB): 7.3 + Epochs: 36 + Training Data: COCO + Training Techniques: + - AdamW + - Mixed Precision Training + Training Resources: 8x A100 GPUs + Architecture: + - ConvNeXt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco_20220426_154953-050731f4.pth + Paper: + URL: https://arxiv.org/abs/2201.03545 + Title: 'A ConvNet for the 2020s' + README: configs/convnext/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.16.0 + + - Name: cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py + Metadata: + Training Memory (GB): 9.0 + Epochs: 36 + Training Data: COCO + Training Techniques: + - AdamW + - Mixed Precision Training + Training Resources: 8x A100 GPUs + Architecture: + - ConvNeXt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 43.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220509_204200-8f07c40b.pth + Paper: + URL: https://arxiv.org/abs/2201.03545 + Title: 'A ConvNet for the 2020s' + README: configs/convnext/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.25.0 + + - Name: cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py + Metadata: + Training Memory (GB): 12.3 + Epochs: 36 + Training Data: COCO + Training Techniques: + - AdamW + - Mixed Precision Training + Training Resources: 8x A100 GPUs + Architecture: + - ConvNeXt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 51.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220510_201004-3d24f5a4.pth + Paper: + URL: https://arxiv.org/abs/2201.03545 + Title: 'A ConvNet for the 2020s' + README: configs/convnext/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.25.0 diff --git a/downstream/mmdetection/configs/cornernet/README.md b/downstream/mmdetection/configs/cornernet/README.md new file mode 100644 index 0000000..d0b9e98 --- /dev/null +++ b/downstream/mmdetection/configs/cornernet/README.md @@ -0,0 +1,43 @@ +# CornerNet + +> [Cornernet: Detecting objects as paired keypoints](https://arxiv.org/abs/1808.01244) + + + +## Abstract + +We propose CornerNet, a new approach to object detection where we detect an object bounding box as a pair of keypoints, the top-left corner and the bottom-right corner, using a single convolution neural network. By detecting objects as paired keypoints, we eliminate the need for designing a set of anchor boxes commonly used in prior single-stage detectors. In addition to our novel formulation, we introduce corner pooling, a new type of pooling layer that helps the network better localize corners. Experiments show that CornerNet achieves a 42.2% AP on MS COCO, outperforming all existing one-stage detectors. + +
    + +
    + +## Results and Models + +| Backbone | Batch Size | Step/Total Epochs | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :--------------: | :---------------------------------------------------------: | :---------------: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HourglassNet-104 | [10 x 5](./cornernet_hourglass104_mstest_10x5_210e_coco.py) | 180/210 | 13.9 | 4.2 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco/cornernet_hourglass104_mstest_10x5_210e_coco_20200824_185720-5fefbf1c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco/cornernet_hourglass104_mstest_10x5_210e_coco_20200824_185720.log.json) | +| HourglassNet-104 | [8 x 6](./cornernet_hourglass104_mstest_8x6_210e_coco.py) | 180/210 | 15.9 | 4.2 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco/cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618-79b44c30.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco/cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618.log.json) | +| HourglassNet-104 | [32 x 3](./cornernet_hourglass104_mstest_32x3_210e_coco.py) | 180/210 | 9.5 | 3.9 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco/cornernet_hourglass104_mstest_32x3_210e_coco_20200819_203110-1efaea91.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco/cornernet_hourglass104_mstest_32x3_210e_coco_20200819_203110.log.json) | + +Note: + +- TTA setting is single-scale and `flip=True`. +- Experiments with `images_per_gpu=6` are conducted on Tesla V100-SXM2-32GB, `images_per_gpu=3` are conducted on GeForce GTX 1080 Ti. +- Here are the descriptions of each experiment setting: + - 10 x 5: 10 GPUs with 5 images per gpu. This is the same setting as that reported in the original paper. + - 8 x 6: 8 GPUs with 6 images per gpu. The total batchsize is similar to paper and only need 1 node to train. + - 32 x 3: 32 GPUs with 3 images per gpu. The default setting for 1080TI and need 4 nodes to train. + +## Citation + +```latex +@inproceedings{law2018cornernet, + title={Cornernet: Detecting objects as paired keypoints}, + author={Law, Hei and Deng, Jia}, + booktitle={15th European Conference on Computer Vision, ECCV 2018}, + pages={765--781}, + year={2018}, + organization={Springer Verlag} +} +``` diff --git a/downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py b/downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py new file mode 100644 index 0000000..6cb05a7 --- /dev/null +++ b/downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py @@ -0,0 +1,110 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/coco_detection.py' +] + +# model settings +model = dict( + type='CornerNet', + backbone=dict( + type='HourglassNet', + downsample_times=5, + num_stacks=2, + stage_channels=[256, 256, 384, 384, 384, 512], + stage_blocks=[2, 2, 2, 2, 2, 4], + norm_cfg=dict(type='BN', requires_grad=True)), + neck=None, + bbox_head=dict( + type='CornerHead', + num_classes=80, + in_channels=256, + num_feat_levels=2, + corner_emb_channels=1, + loss_heatmap=dict( + type='GaussianFocalLoss', alpha=2.0, gamma=4.0, loss_weight=1), + loss_embedding=dict( + type='AssociativeEmbeddingLoss', + pull_weight=0.10, + push_weight=0.10), + loss_offset=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1)), + # training and testing settings + train_cfg=None, + test_cfg=dict( + corner_topk=100, + local_maximum_kernel=3, + distance_threshold=0.5, + score_thr=0.05, + max_per_img=100, + nms=dict(type='soft_nms', iou_threshold=0.5, method='gaussian'))) +# data settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + test_mode=False, + test_pad_mode=None, + **img_norm_cfg), + dict(type='Resize', img_scale=(511, 511), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=True, + transforms=[ + dict(type='Resize'), + dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + test_mode=True, + test_pad_mode=['logical_or', 127], + **img_norm_cfg), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict( + type='Collect', + keys=['img'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'pad_shape', + 'scale_factor', 'flip', 'img_norm_cfg', 'border')), + ]) +] +data = dict( + samples_per_gpu=5, + workers_per_gpu=3, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='Adam', lr=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[180]) +runner = dict(type='EpochBasedRunner', max_epochs=210) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (10 GPUs) x (5 samples per GPU) +auto_scale_lr = dict(base_batch_size=50) diff --git a/downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py b/downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py new file mode 100644 index 0000000..f539cdb --- /dev/null +++ b/downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py @@ -0,0 +1,110 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/coco_detection.py' +] + +# model settings +model = dict( + type='CornerNet', + backbone=dict( + type='HourglassNet', + downsample_times=5, + num_stacks=2, + stage_channels=[256, 256, 384, 384, 384, 512], + stage_blocks=[2, 2, 2, 2, 2, 4], + norm_cfg=dict(type='BN', requires_grad=True)), + neck=None, + bbox_head=dict( + type='CornerHead', + num_classes=80, + in_channels=256, + num_feat_levels=2, + corner_emb_channels=1, + loss_heatmap=dict( + type='GaussianFocalLoss', alpha=2.0, gamma=4.0, loss_weight=1), + loss_embedding=dict( + type='AssociativeEmbeddingLoss', + pull_weight=0.10, + push_weight=0.10), + loss_offset=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1)), + # training and testing settings + train_cfg=None, + test_cfg=dict( + corner_topk=100, + local_maximum_kernel=3, + distance_threshold=0.5, + score_thr=0.05, + max_per_img=100, + nms=dict(type='soft_nms', iou_threshold=0.5, method='gaussian'))) +# data settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + test_mode=False, + test_pad_mode=None, + **img_norm_cfg), + dict(type='Resize', img_scale=(511, 511), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=True, + transforms=[ + dict(type='Resize'), + dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + test_mode=True, + test_pad_mode=['logical_or', 127], + **img_norm_cfg), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict( + type='Collect', + keys=['img'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'pad_shape', + 'scale_factor', 'flip', 'img_norm_cfg', 'border')), + ]) +] +data = dict( + samples_per_gpu=3, + workers_per_gpu=3, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='Adam', lr=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[180]) +runner = dict(type='EpochBasedRunner', max_epochs=210) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (3 samples per GPU) +auto_scale_lr = dict(base_batch_size=96) diff --git a/downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py b/downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py new file mode 100644 index 0000000..9b115d7 --- /dev/null +++ b/downstream/mmdetection/configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py @@ -0,0 +1,110 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/coco_detection.py' +] + +# model settings +model = dict( + type='CornerNet', + backbone=dict( + type='HourglassNet', + downsample_times=5, + num_stacks=2, + stage_channels=[256, 256, 384, 384, 384, 512], + stage_blocks=[2, 2, 2, 2, 2, 4], + norm_cfg=dict(type='BN', requires_grad=True)), + neck=None, + bbox_head=dict( + type='CornerHead', + num_classes=80, + in_channels=256, + num_feat_levels=2, + corner_emb_channels=1, + loss_heatmap=dict( + type='GaussianFocalLoss', alpha=2.0, gamma=4.0, loss_weight=1), + loss_embedding=dict( + type='AssociativeEmbeddingLoss', + pull_weight=0.10, + push_weight=0.10), + loss_offset=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1)), + # training and testing settings + train_cfg=None, + test_cfg=dict( + corner_topk=100, + local_maximum_kernel=3, + distance_threshold=0.5, + score_thr=0.05, + max_per_img=100, + nms=dict(type='soft_nms', iou_threshold=0.5, method='gaussian'))) +# data settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + test_mode=False, + test_pad_mode=None, + **img_norm_cfg), + dict(type='Resize', img_scale=(511, 511), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=True, + transforms=[ + dict(type='Resize'), + dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + test_mode=True, + test_pad_mode=['logical_or', 127], + **img_norm_cfg), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict( + type='Collect', + keys=['img'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'pad_shape', + 'scale_factor', 'flip', 'img_norm_cfg', 'border')), + ]) +] +data = dict( + samples_per_gpu=6, + workers_per_gpu=3, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='Adam', lr=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[180]) +runner = dict(type='EpochBasedRunner', max_epochs=210) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (6 samples per GPU) +auto_scale_lr = dict(base_batch_size=48) diff --git a/downstream/mmdetection/configs/cornernet/metafile.yml b/downstream/mmdetection/configs/cornernet/metafile.yml new file mode 100644 index 0000000..c2f6143 --- /dev/null +++ b/downstream/mmdetection/configs/cornernet/metafile.yml @@ -0,0 +1,83 @@ +Collections: + - Name: CornerNet + Metadata: + Training Data: COCO + Training Techniques: + - Adam + Training Resources: 8x V100 GPUs + Architecture: + - Corner Pooling + - Stacked Hourglass Network + Paper: + URL: https://arxiv.org/abs/1808.01244 + Title: 'CornerNet: Detecting Objects as Paired Keypoints' + README: configs/cornernet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.3.0/mmdet/models/detectors/cornernet.py#L9 + Version: v2.3.0 + +Models: + - Name: cornernet_hourglass104_mstest_10x5_210e_coco + In Collection: CornerNet + Config: configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py + Metadata: + Training Resources: 10x V100 GPUs + Batch Size: 50 + Training Memory (GB): 13.9 + inference time (ms/im): + - value: 238.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 210 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco/cornernet_hourglass104_mstest_10x5_210e_coco_20200824_185720-5fefbf1c.pth + + - Name: cornernet_hourglass104_mstest_8x6_210e_coco + In Collection: CornerNet + Config: configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py + Metadata: + Batch Size: 48 + Training Memory (GB): 15.9 + inference time (ms/im): + - value: 238.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 210 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco/cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618-79b44c30.pth + + - Name: cornernet_hourglass104_mstest_32x3_210e_coco + In Collection: CornerNet + Config: configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py + Metadata: + Training Resources: 32x V100 GPUs + Batch Size: 96 + Training Memory (GB): 9.5 + inference time (ms/im): + - value: 256.41 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 210 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco/cornernet_hourglass104_mstest_32x3_210e_coco_20200819_203110-1efaea91.pth diff --git a/downstream/mmdetection/configs/dcn/README.md b/downstream/mmdetection/configs/dcn/README.md new file mode 100644 index 0000000..745b01c --- /dev/null +++ b/downstream/mmdetection/configs/dcn/README.md @@ -0,0 +1,48 @@ +# DCN + +> [Deformable Convolutional Networks](https://arxiv.org/abs/1703.06211) + + + +## Abstract + +Convolutional neural networks (CNNs) are inherently limited to model geometric transformations due to the fixed geometric structures in its building modules. In this work, we introduce two new modules to enhance the transformation modeling capacity of CNNs, namely, deformable convolution and deformable RoI pooling. Both are based on the idea of augmenting the spatial sampling locations in the modules with additional offsets and learning the offsets from target tasks, without additional supervision. The new modules can readily replace their plain counterparts in existing CNNs and can be easily trained end-to-end by standard back-propagation, giving rise to deformable convolutional networks. Extensive experiments validate the effectiveness of our approach on sophisticated vision tasks of object detection and semantic segmentation. + +
    + +
    + +## Results and Models + +| Backbone | Model | Style | Conv | Pool | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :----------: | :-----: | :----------: | :---: | :-----: | :------: | :------------: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Faster | pytorch | dconv(c3-c5) | - | 1x | 4.0 | 17.8 | 41.3 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-d68aed1e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130_212941.log.json) | +| R-50-FPN | Faster | pytorch | - | dpool | 1x | 5.0 | 17.2 | 38.9 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dpool_1x_coco/faster_rcnn_r50_fpn_dpool_1x_coco_20200307-90d3c01d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dpool_1x_coco/faster_rcnn_r50_fpn_dpool_1x_coco_20200307_203250.log.json) | +| R-101-FPN | Faster | pytorch | dconv(c3-c5) | - | 1x | 6.0 | 12.5 | 42.7 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203-1377f13d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203_230019.log.json) | +| X-101-32x4d-FPN | Faster | pytorch | dconv(c3-c5) | - | 1x | 7.3 | 10.0 | 44.5 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco_20200203-4f85c69c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco_20200203_001325.log.json) | +| R-50-FPN | Mask | pytorch | dconv(c3-c5) | - | 1x | 4.5 | 15.4 | 41.8 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200203-4d9ad43b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200203_061339.log.json) | +| R-101-FPN | Mask | pytorch | dconv(c3-c5) | - | 1x | 6.5 | 11.7 | 43.5 | 38.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200216-a71f5bce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200216_191601.log.json) | +| R-50-FPN | Cascade | pytorch | dconv(c3-c5) | - | 1x | 4.5 | 14.6 | 43.8 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-2f1fca44.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130_220843.log.json) | +| R-101-FPN | Cascade | pytorch | dconv(c3-c5) | - | 1x | 6.4 | 11.0 | 45.0 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203-3b2f0594.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203_224829.log.json) | +| R-50-FPN | Cascade Mask | pytorch | dconv(c3-c5) | - | 1x | 6.0 | 10.0 | 44.4 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200202-42e767a2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200202_010309.log.json) | +| R-101-FPN | Cascade Mask | pytorch | dconv(c3-c5) | - | 1x | 8.0 | 8.6 | 45.8 | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200204-df0c5f10.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200204_134006.log.json) | +| X-101-32x4d-FPN | Cascade Mask | pytorch | dconv(c3-c5) | - | 1x | 9.2 | | 47.3 | 41.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco-e75f90c8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco-20200606_183737.log.json) | +| R-50-FPN (FP16) | Mask | pytorch | dconv(c3-c5) | - | 1x | 3.0 | | 41.9 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fp16/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco_20210520_180247-c06429d2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco_20210520_180247.log.json) | + +**Notes:** + +- `dconv` denotes deformable convolution, `c3-c5` means adding dconv in resnet stage 3 to 5. `dpool` denotes deformable roi pooling. +- The dcn ops are modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch, which should be more memory efficient and slightly faster. +- (\*) For R-50-FPN (dg=4), dg is short for deformable_group. This model is trained and tested on Amazon EC2 p3dn.24xlarge instance. +- **Memory, Train/Inf time is outdated.** + +## Citation + +```latex +@inproceedings{dai2017deformable, + title={Deformable Convolutional Networks}, + author={Dai, Jifeng and Qi, Haozhi and Xiong, Yuwen and Li, Yi and Zhang, Guodong and Hu, Han and Wei, Yichen}, + booktitle={Proceedings of the IEEE international conference on computer vision}, + year={2017} +} +``` diff --git a/downstream/mmdetection/configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..081b998 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..3b3683a --- /dev/null +++ b/downstream/mmdetection/configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..daaa472 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..a01df33 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..aa664bd --- /dev/null +++ b/downstream/mmdetection/configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..f5fee7e --- /dev/null +++ b/downstream/mmdetection/configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..8787088 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py b/downstream/mmdetection/configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py new file mode 100644 index 0000000..1b695f0 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py @@ -0,0 +1,12 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + _delete_=True, + type='DeformRoIPoolPack', + output_size=7, + output_channels=256), + out_channels=256, + featmap_strides=[4, 8, 16, 32]))) diff --git a/downstream/mmdetection/configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..e3bea19 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..cb34002 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..ababe58 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcn/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcn/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..ee5cca7 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) + +fp16 = dict(loss_scale=512.) diff --git a/downstream/mmdetection/configs/dcn/metafile.yml b/downstream/mmdetection/configs/dcn/metafile.yml new file mode 100644 index 0000000..36f3887 --- /dev/null +++ b/downstream/mmdetection/configs/dcn/metafile.yml @@ -0,0 +1,272 @@ +Collections: + - Name: Deformable Convolutional Networks + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Deformable Convolution + Paper: + URL: https://arxiv.org/abs/1703.06211 + Title: "Deformable Convolutional Networks" + README: configs/dcn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/ops/dcn/deform_conv.py#L15 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 56.18 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-d68aed1e.pth + + - Name: faster_rcnn_r50_fpn_dpool_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + inference time (ms/im): + - value: 58.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dpool_1x_coco/faster_rcnn_r50_fpn_dpool_1x_coco_20200307-90d3c01d.pth + + - Name: faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 80 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203-1377f13d.pth + + - Name: faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.3 + inference time (ms/im): + - value: 100 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco_20200203-4f85c69c.pth + + - Name: mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + inference time (ms/im): + - value: 64.94 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200203-4d9ad43b.pth + + - Name: mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py + Metadata: + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + Training Memory (GB): 3.0 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco_20210520_180247-c06429d2.pth + + - Name: mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 6.5 + inference time (ms/im): + - value: 85.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200216-a71f5bce.pth + + - Name: cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + inference time (ms/im): + - value: 68.49 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-2f1fca44.pth + + - Name: cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203-3b2f0594.pth + + - Name: cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 100 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200202-42e767a2.pth + + - Name: cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 8.0 + inference time (ms/im): + - value: 116.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200204-df0c5f10.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 9.2 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco-e75f90c8.pth diff --git a/downstream/mmdetection/configs/dcnv2/README.md b/downstream/mmdetection/configs/dcnv2/README.md new file mode 100644 index 0000000..d230f20 --- /dev/null +++ b/downstream/mmdetection/configs/dcnv2/README.md @@ -0,0 +1,37 @@ +# DCNv2 + +> [Deformable ConvNets v2: More Deformable, Better Results](https://arxiv.org/abs/1811.11168) + + + +## Abstract + +The superior performance of Deformable Convolutional Networks arises from its ability to adapt to the geometric variations of objects. Through an examination of its adaptive behavior, we observe that while the spatial support for its neural features conforms more closely than regular ConvNets to object structure, this support may nevertheless extend well beyond the region of interest, causing features to be influenced by irrelevant image content. To address this problem, we present a reformulation of Deformable ConvNets that improves its ability to focus on pertinent image regions, through increased modeling power and stronger training. The modeling power is enhanced through a more comprehensive integration of deformable convolution within the network, and by introducing a modulation mechanism that expands the scope of deformation modeling. To effectively harness this enriched modeling capability, we guide network training via a proposed feature mimicking scheme that helps the network to learn features that reflect the object focus and classification power of RCNN features. With the proposed contributions, this new version of Deformable ConvNets yields significant performance gains over the original model and produces leading results on the COCO benchmark for object detection and instance segmentation. + +## Results and Models + +| Backbone | Model | Style | Conv | Pool | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :---------------: | :----: | :-----: | :-----------: | :----: | :-----: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Faster | pytorch | mdconv(c3-c5) | - | 1x | 4.1 | 17.6 | 41.4 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200130-d099253b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200130_222144.log.json) | +| \*R-50-FPN (dg=4) | Faster | pytorch | mdconv(c3-c5) | - | 1x | 4.2 | 17.4 | 41.5 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco_20200130-01262257.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco_20200130_222058.log.json) | +| R-50-FPN | Faster | pytorch | - | mdpool | 1x | 5.8 | 16.6 | 38.7 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco/faster_rcnn_r50_fpn_mdpool_1x_coco_20200307-c0df27ff.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco/faster_rcnn_r50_fpn_mdpool_1x_coco_20200307_203304.log.json) | +| R-50-FPN | Mask | pytorch | mdconv(c3-c5) | - | 1x | 4.5 | 15.1 | 41.5 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200203-ad97591f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200203_063443.log.json) | +| R-50-FPN (FP16) | Mask | pytorch | mdconv(c3-c5) | - | 1x | 3.1 | | 42.0 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fp16/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco_20210520_180434-cf8fefa5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco_20210520_180434.log.json) | + +**Notes:** + +- `mdconv` denotes modulated deformable convolution, `c3-c5` means adding dconv in resnet stage 3 to 5. `mdpool` denotes modulated deformable roi pooling. +- The dcn ops are modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch, which should be more memory efficient and slightly faster. +- (\*) For R-50-FPN (dg=4), dg is short for deformable_group. This model is trained and tested on Amazon EC2 p3dn.24xlarge instance. +- **Memory, Train/Inf time is outdated.** + +## Citation + +```latex +@article{zhu2018deformable, + title={Deformable ConvNets v2: More Deformable, Better Results}, + author={Zhu, Xizhou and Hu, Han and Lin, Stephen and Dai, Jifeng}, + journal={arXiv preprint arXiv:1811.11168}, + year={2018} +} +``` diff --git a/downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..d1bcf3c --- /dev/null +++ b/downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py b/downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py new file mode 100644 index 0000000..d0ab89c --- /dev/null +++ b/downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=4, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py b/downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py new file mode 100644 index 0000000..ad7b034 --- /dev/null +++ b/downstream/mmdetection/configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py @@ -0,0 +1,12 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + _delete_=True, + type='ModulatedDeformRoIPoolPack', + output_size=7, + output_channels=256), + out_channels=256, + featmap_strides=[4, 8, 16, 32]))) diff --git a/downstream/mmdetection/configs/dcnv2/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcnv2/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..7e21454 --- /dev/null +++ b/downstream/mmdetection/configs/dcnv2/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) + +fp16 = dict(loss_scale=512.) diff --git a/downstream/mmdetection/configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..5ca2a67 --- /dev/null +++ b/downstream/mmdetection/configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/dcnv2/metafile.yml b/downstream/mmdetection/configs/dcnv2/metafile.yml new file mode 100644 index 0000000..9049421 --- /dev/null +++ b/downstream/mmdetection/configs/dcnv2/metafile.yml @@ -0,0 +1,123 @@ +Collections: + - Name: Deformable Convolutional Networks v2 + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Deformable Convolution + Paper: + URL: https://arxiv.org/abs/1811.11168 + Title: "Deformable ConvNets v2: More Deformable, Better Results" + README: configs/dcnv2/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/ops/dcn/deform_conv.py#L15 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.1 + inference time (ms/im): + - value: 56.82 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200130-d099253b.pth + + - Name: faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + inference time (ms/im): + - value: 57.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco_20200130-01262257.pth + + - Name: faster_rcnn_r50_fpn_mdpool_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco.py + Metadata: + Training Memory (GB): 5.8 + inference time (ms/im): + - value: 60.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco/faster_rcnn_r50_fpn_mdpool_1x_coco_20200307-c0df27ff.pth + + - Name: mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + inference time (ms/im): + - value: 66.23 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200203-ad97591f.pth + + - Name: mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcn/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 3.1 + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco_20210520_180434-cf8fefa5.pth diff --git a/downstream/mmdetection/configs/ddod/README.md b/downstream/mmdetection/configs/ddod/README.md new file mode 100644 index 0000000..9ab1f48 --- /dev/null +++ b/downstream/mmdetection/configs/ddod/README.md @@ -0,0 +1,31 @@ +# DDOD + +> [Disentangle Your Dense Object Detector](https://arxiv.org/pdf/2107.02963.pdf) + + + +## Abstract + +Deep learning-based dense object detectors have achieved great success in the past few years and have been applied to numerous multimedia applications such as video understanding. However, the current training pipeline for dense detectors is compromised to lots of conjunctions that may not hold. In this paper, we investigate three such important conjunctions: 1) only samples assigned as positive in classification head are used to train the regression head; 2) classification and regression share the same input feature and computational fields defined by the parallel head architecture; and 3) samples distributed in different feature pyramid layers are treated equally when computing the loss. We first carry out a series of pilot experiments to show disentangling such conjunctions can lead to persistent performance improvement. Then, based on these findings, we propose Disentangled Dense Object Detector(DDOD), in which simple and effective disentanglement mechanisms are designed and integrated into the current state-of-the-art dense object detectors. Extensive experiments on MS COCO benchmark show that our approach can lead to 2.0 mAP, 2.4 mAP and 2.2 mAP absolute improvements on RetinaNet, FCOS, and ATSS baselines with negligible extra overhead. Notably, our best model reaches 55.0 mAP on the COCO test-dev set and 93.5 AP on the hard subset of WIDER FACE, achieving new state-of-the-art performance on these two competitive benchmarks. Code is available at https://github.com/zehuichen123/DDOD. + +
    + +
    + +## Results and Models + +| Model | Backbone | Style | Lr schd | Mem (GB) | box AP | Config | Download | +| :-------: | :------: | :-----: | :-----: | :------: | :----: | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| DDOD-ATSS | R-50 | pytorch | 1x | 3.4 | 41.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ddod/ddod_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ddod/ddod_r50_fpn_1x_coco/ddod_r50_fpn_1x_coco_20220523_223737-29b2fc67.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ddod/ddod_r50_fpn_1x_coco/ddod_r50_fpn_1x_coco_20220523_223737.log.json) | + +## Citation + +```latex +@inproceedings{chen2021disentangle, +title={Disentangle Your Dense Object Detector}, +author={Chen, Zehui and Yang, Chenhongyi and Li, Qiaofei and Zhao, Feng and Zha, Zheng-Jun and Wu, Feng}, +booktitle={Proceedings of the 29th ACM International Conference on Multimedia}, +pages={4939--4948}, +year={2021} +} +``` diff --git a/downstream/mmdetection/configs/ddod/ddod_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/ddod/ddod_r50_fpn_1x_coco.py new file mode 100644 index 0000000..02dd2fe --- /dev/null +++ b/downstream/mmdetection/configs/ddod/ddod_r50_fpn_1x_coco.py @@ -0,0 +1,67 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='DDOD', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='DDODHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_iou=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + train_cfg=dict( + # assigner is mean cls_assigner + assigner=dict(type='ATSSAssigner', topk=9, alpha=0.8), + reg_assigner=dict(type='ATSSAssigner', topk=9, alpha=0.5), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +# This `persistent_workers` is only valid when PyTorch>=1.7.0 +data = dict(persistent_workers=True) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/ddod/metafile.yml b/downstream/mmdetection/configs/ddod/metafile.yml new file mode 100644 index 0000000..c223950 --- /dev/null +++ b/downstream/mmdetection/configs/ddod/metafile.yml @@ -0,0 +1,33 @@ +Collections: + - Name: DDOD + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - DDOD + - FPN + - ResNet + Paper: + URL: https://arxiv.org/pdf/2107.02963.pdf + Title: 'Disentangle Your Dense Object Detector' + README: configs/ddod/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.25.0/mmdet/models/detectors/ddod.py#L6 + Version: v2.25.0 + +Models: + - Name: ddod_r50_fpn_1x_coco + In Collection: DDOD + Config: configs/ddod/ddod_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.4 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ddod/ddod_r50_fpn_1x_coco/ddod_r50_fpn_1x_coco_20220523_223737-29b2fc67.pth diff --git a/downstream/mmdetection/configs/deepfashion/README.md b/downstream/mmdetection/configs/deepfashion/README.md new file mode 100644 index 0000000..45daec0 --- /dev/null +++ b/downstream/mmdetection/configs/deepfashion/README.md @@ -0,0 +1,70 @@ +# DeepFashion + +> [DeepFashion: Powering Robust Clothes Recognition and Retrieval With Rich Annotations](https://openaccess.thecvf.com/content_cvpr_2016/html/Liu_DeepFashion_Powering_Robust_CVPR_2016_paper.html) + + + +## Abstract + +Recent advances in clothes recognition have been driven by the construction of clothes datasets. Existing datasets are limited in the amount of annotations and are difficult to cope with the various challenges in real-world applications. In this work, we introduce DeepFashion, a large-scale clothes dataset with comprehensive annotations. It contains over 800,000 images, which are richly annotated with massive attributes, clothing landmarks, and correspondence of images taken under different scenarios including store, street snapshot, and consumer. Such rich annotations enable the development of powerful algorithms in clothes recognition and facilitating future researches. To demonstrate the advantages of DeepFashion, we propose a new deep model, namely FashionNet, which learns clothing features by jointly predicting clothing attributes and landmarks. The estimated landmarks are then employed to pool or gate the learned features. It is optimized in an iterative manner. Extensive experiments demonstrate the effectiveness of FashionNet and the usefulness of DeepFashion. + +
    + +
    + +## Introduction + +[MMFashion](https://github.com/open-mmlab/mmfashion) develops "fashion parsing and segmentation" module +based on the dataset +[DeepFashion-Inshop](https://drive.google.com/drive/folders/0B7EVK8r0v71pVDZFQXRsMDZCX1E?usp=sharing). +Its annotation follows COCO style. +To use it, you need to first download the data. Note that we only use "img_highres" in this task. +The file tree should be like this: + +```sh +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── DeepFashion +│ │ ├── In-shop +│ │ ├── Anno +│ │ │   ├── segmentation +│ │ │   | ├── DeepFashion_segmentation_train.json +│ │ │   | ├── DeepFashion_segmentation_query.json +│ │ │   | ├── DeepFashion_segmentation_gallery.json +│ │ │   ├── list_bbox_inshop.txt +│ │ │   ├── list_description_inshop.json +│ │ │   ├── list_item_inshop.txt +│ │ │   └── list_landmarks_inshop.txt +│ │ ├── Eval +│ │ │ └── list_eval_partition.txt +│ │ ├── Img +│ │ │ ├── img +│ │ │ │ ├──XXX.jpg +│ │ │ ├── img_highres +│ │ │ └── ├──XXX.jpg + +``` + +After that you can train the Mask RCNN r50 on DeepFashion-In-shop dataset by launching training with the `mask_rcnn_r50_fpn_1x.py` config +or creating your own config file. + +## Results and Models + +| Backbone | Model type | Dataset | bbox detection Average Precision | segmentation Average Precision | Config | Download (Google) | +| :------: | :--------: | :-----------------: | :------------------------------: | :----------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ResNet50 | Mask RCNN | DeepFashion-In-shop | 0.599 | 0.584 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion/mask_rcnn_r50_fpn_15e_deepfashion_20200329_192752.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion/20200329_192752.log.json) | + +## Citation + +```latex +@inproceedings{liuLQWTcvpr16DeepFashion, + author = {Liu, Ziwei and Luo, Ping and Qiu, Shi and Wang, Xiaogang and Tang, Xiaoou}, + title = {DeepFashion: Powering Robust Clothes Recognition and Retrieval with Rich Annotations}, + booktitle = {Proceedings of IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + month = {June}, + year = {2016} +} +``` diff --git a/downstream/mmdetection/configs/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion.py b/downstream/mmdetection/configs/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion.py new file mode 100644 index 0000000..c4e8638 --- /dev/null +++ b/downstream/mmdetection/configs/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/deepfashion.py', '../_base_/schedules/schedule_1x.py', + '../_base_/default_runtime.py' +] +model = dict( + roi_head=dict( + bbox_head=dict(num_classes=15), mask_head=dict(num_classes=15))) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=15) diff --git a/downstream/mmdetection/configs/deformable_detr/README.md b/downstream/mmdetection/configs/deformable_detr/README.md new file mode 100644 index 0000000..378e1f2 --- /dev/null +++ b/downstream/mmdetection/configs/deformable_detr/README.md @@ -0,0 +1,41 @@ +# Deformable DETR + +> [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159) + + + +## Abstract + +DETR has been recently proposed to eliminate the need for many hand-designed components in object detection while demonstrating good performance. However, it suffers from slow convergence and limited feature spatial resolution, due to the limitation of Transformer attention modules in processing image feature maps. To mitigate these issues, we proposed Deformable DETR, whose attention modules only attend to a small set of key sampling points around a reference. Deformable DETR can achieve better performance than DETR (especially on small objects) with 10 times less training epochs. Extensive experiments on the COCO benchmark demonstrate the effectiveness of our approach. + +
    + +
    + +## Results and Models + +| Backbone | Model | Lr schd | box AP | Config | Download | +| :------: | :---------------------------------: | :-----: | :----: | :------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | Deformable DETR | 50e | 44.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_r50_16x2_50e_coco/deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_r50_16x2_50e_coco/deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.log.json) | +| R-50 | + iterative bounding box refinement | 50e | 46.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco/deformable_detr_refine_r50_16x2_50e_coco_20210419_220503-5f5dff21.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco/deformable_detr_refine_r50_16x2_50e_coco_20210419_220503-5f5dff21.log.json) | +| R-50 | ++ two-stage Deformable DETR | 50e | 46.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco/deformable_detr_twostage_refine_r50_16x2_50e_coco_20210419_220613-9d28ab72.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco/deformable_detr_twostage_refine_r50_16x2_50e_coco_20210419_220613-9d28ab72.log.json) | + +# NOTE + +1. All models are trained with batch size 32. +2. The performance is unstable. `Deformable DETR` and `iterative bounding box refinement` may fluctuate about 0.3 mAP. `two-stage Deformable DETR` may fluctuate about 0.2 mAP. + +## Citation + +We provide the config files for Deformable DETR: [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159). + +```latex +@inproceedings{ +zhu2021deformable, +title={Deformable DETR: Deformable Transformers for End-to-End Object Detection}, +author={Xizhou Zhu and Weijie Su and Lewei Lu and Bin Li and Xiaogang Wang and Jifeng Dai}, +booktitle={International Conference on Learning Representations}, +year={2021}, +url={https://openreview.net/forum?id=gZ9hCDWe6ke} +} +``` diff --git a/downstream/mmdetection/configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py b/downstream/mmdetection/configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py new file mode 100644 index 0000000..c64d09f --- /dev/null +++ b/downstream/mmdetection/configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py @@ -0,0 +1,177 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +model = dict( + type='DeformableDETR', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='ChannelMapper', + in_channels=[512, 1024, 2048], + kernel_size=1, + out_channels=256, + act_cfg=None, + norm_cfg=dict(type='GN', num_groups=32), + num_outs=4), + bbox_head=dict( + type='DeformableDETRHead', + num_query=300, + num_classes=80, + in_channels=2048, + sync_cls_avg_factor=True, + as_two_stage=False, + transformer=dict( + type='DeformableDetrTransformer', + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiScaleDeformableAttention', embed_dims=256), + feedforward_channels=1024, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'ffn', 'norm'))), + decoder=dict( + type='DeformableDetrTransformerDecoder', + num_layers=6, + return_intermediate=True, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=[ + dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1), + dict( + type='MultiScaleDeformableAttention', + embed_dims=256) + ], + feedforward_channels=1024, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'cross_attn', 'norm', + 'ffn', 'norm')))), + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=128, + normalize=True, + offset=-0.5), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=2.0), + loss_bbox=dict(type='L1Loss', loss_weight=5.0), + loss_iou=dict(type='GIoULoss', loss_weight=2.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='HungarianAssigner', + cls_cost=dict(type='FocalLossCost', weight=2.0), + reg_cost=dict(type='BBoxL1Cost', weight=5.0, box_format='xywh'), + iou_cost=dict(type='IoUCost', iou_mode='giou', weight=2.0))), + test_cfg=dict(max_per_img=100)) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# train_pipeline, NOTE the img_scale and the Pad's size_divisor is different +# from the default setting in mmdet. +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[ + [ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + # The radio of all image in train dataset < 7 + # follow the original impl + img_scale=[(400, 4200), (500, 4200), (600, 4200)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +# test_pipeline, NOTE the Pad's size_divisor is different from the default +# setting (size_divisor=32). While there is little effect on the performance +# whether we use the default setting or use size_divisor=1. +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(filter_empty_gt=False, pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + type='AdamW', + lr=2e-4, + weight_decay=0.0001, + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1), + 'sampling_offsets': dict(lr_mult=0.1), + 'reference_points': dict(lr_mult=0.1) + })) +optimizer_config = dict(grad_clip=dict(max_norm=0.1, norm_type=2)) +# learning policy +lr_config = dict(policy='step', step=[40]) +runner = dict(type='EpochBasedRunner', max_epochs=50) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (16 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=32) diff --git a/downstream/mmdetection/configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py b/downstream/mmdetection/configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py new file mode 100644 index 0000000..01f13df --- /dev/null +++ b/downstream/mmdetection/configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py @@ -0,0 +1,2 @@ +_base_ = 'deformable_detr_r50_16x2_50e_coco.py' +model = dict(bbox_head=dict(with_box_refine=True)) diff --git a/downstream/mmdetection/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py b/downstream/mmdetection/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py new file mode 100644 index 0000000..2aa840d --- /dev/null +++ b/downstream/mmdetection/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py @@ -0,0 +1,2 @@ +_base_ = 'deformable_detr_refine_r50_16x2_50e_coco.py' +model = dict(bbox_head=dict(as_two_stage=True)) diff --git a/downstream/mmdetection/configs/deformable_detr/metafile.yml b/downstream/mmdetection/configs/deformable_detr/metafile.yml new file mode 100644 index 0000000..873292d --- /dev/null +++ b/downstream/mmdetection/configs/deformable_detr/metafile.yml @@ -0,0 +1,56 @@ +Collections: + - Name: Deformable DETR + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Multi Scale Train + - Gradient Clip + Training Resources: 8x V100 GPUs + Architecture: + - ResNet + - Transformer + Paper: + URL: https://openreview.net/forum?id=gZ9hCDWe6ke + Title: 'Deformable DETR: Deformable Transformers for End-to-End Object Detection' + README: configs/deformable_detr/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.12.0/mmdet/models/detectors/deformable_detr.py#L6 + Version: v2.12.0 + +Models: + - Name: deformable_detr_r50_16x2_50e_coco + In Collection: Deformable DETR + Config: configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py + Metadata: + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_r50_16x2_50e_coco/deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.pth + + - Name: deformable_detr_refine_r50_16x2_50e_coco + In Collection: Deformable DETR + Config: configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py + Metadata: + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco/deformable_detr_refine_r50_16x2_50e_coco_20210419_220503-5f5dff21.pth + + - Name: deformable_detr_twostage_refine_r50_16x2_50e_coco + In Collection: Deformable DETR + Config: configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py + Metadata: + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco/deformable_detr_twostage_refine_r50_16x2_50e_coco_20210419_220613-9d28ab72.pth diff --git a/downstream/mmdetection/configs/detectors/README.md b/downstream/mmdetection/configs/detectors/README.md new file mode 100644 index 0000000..baa245f --- /dev/null +++ b/downstream/mmdetection/configs/detectors/README.md @@ -0,0 +1,69 @@ +# DetectoRS + +> [DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution](https://arxiv.org/abs/2006.02334) + + + +## Abstract + +Many modern object detectors demonstrate outstanding performances by using the mechanism of looking and thinking twice. In this paper, we explore this mechanism in the backbone design for object detection. At the macro level, we propose Recursive Feature Pyramid, which incorporates extra feedback connections from Feature Pyramid Networks into the bottom-up backbone layers. At the micro level, we propose Switchable Atrous Convolution, which convolves the features with different atrous rates and gathers the results using switch functions. Combining them results in DetectoRS, which significantly improves the performances of object detection. On COCO test-dev, DetectoRS achieves state-of-the-art 55.7% box AP for object detection, 48.5% mask AP for instance segmentation, and 50.0% PQ for panoptic segmentation. + +
    + +
    + +## Introduction + +DetectoRS requires COCO and [COCO-stuff](http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/stuffthingmaps_trainval2017.zip) dataset for training. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +| | ├── stuffthingmaps +``` + +## Results and Models + +DetectoRS includes two major components: + +- Recursive Feature Pyramid (RFP). +- Switchable Atrous Convolution (SAC). + +They can be used independently. +Combining them together results in DetectoRS. +The results on COCO 2017 val are shown in the below table. + +| Method | Detector | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------: | :-----------------: | :-----: | :------: | :------------: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| RFP | Cascade + ResNet-50 | 1x | 7.5 | - | 44.8 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_rfp_1x_coco/cascade_rcnn_r50_rfp_1x_coco-8cf51bfd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_rfp_1x_coco/cascade_rcnn_r50_rfp_1x_coco_20200624_104126.log.json) | +| SAC | Cascade + ResNet-50 | 1x | 5.6 | - | 45.0 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/cascade_rcnn_r50_sac_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_sac_1x_coco/cascade_rcnn_r50_sac_1x_coco-24bfda62.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_sac_1x_coco/cascade_rcnn_r50_sac_1x_coco_20200624_104402.log.json) | +| DetectoRS | Cascade + ResNet-50 | 1x | 9.9 | - | 47.4 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_cascade_rcnn_r50_1x_coco/detectors_cascade_rcnn_r50_1x_coco-32a10ba0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_cascade_rcnn_r50_1x_coco/detectors_cascade_rcnn_r50_1x_coco_20200706_001203.log.json) | +| RFP | HTC + ResNet-50 | 1x | 11.2 | - | 46.6 | 40.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/htc_r50_rfp_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_rfp_1x_coco/htc_r50_rfp_1x_coco-8ff87c51.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_rfp_1x_coco/htc_r50_rfp_1x_coco_20200624_103053.log.json) | +| SAC | HTC + ResNet-50 | 1x | 9.3 | - | 46.4 | 40.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/htc_r50_sac_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_sac_1x_coco/htc_r50_sac_1x_coco-bfa60c54.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_sac_1x_coco/htc_r50_sac_1x_coco_20200624_103111.log.json) | +| DetectoRS | HTC + ResNet-50 | 1x | 13.6 | - | 49.1 | 42.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/detectors_htc_r50_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r50_1x_coco/detectors_htc_r50_1x_coco-329b1453.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r50_1x_coco/detectors_htc_r50_1x_coco_20200624_103659.log.json) | +| DetectoRS | HTC + ResNet-101 | 20e | 19.6 | | 50.5 | 43.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/detectors_htc_r101_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r101_20e_coco/detectors_htc_r101_20e_coco_20210419_203638-348d533b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r101_20e_coco/detectors_htc_r101_20e_coco_20210419_203638.log.json) | + +*Note*: This is a re-implementation based on MMDetection-V2. +The original implementation is based on MMDetection-V1. + +## Citation + +We provide the config files for [DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution](https://arxiv.org/pdf/2006.02334.pdf). + +```latex +@article{qiao2020detectors, + title={DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution}, + author={Qiao, Siyuan and Chen, Liang-Chieh and Yuille, Alan}, + journal={arXiv preprint arXiv:2006.02334}, + year={2020} +} +``` diff --git a/downstream/mmdetection/configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py b/downstream/mmdetection/configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py new file mode 100644 index 0000000..4430d8a --- /dev/null +++ b/downstream/mmdetection/configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py @@ -0,0 +1,28 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + pretrained='torchvision://resnet50', + style='pytorch'))) diff --git a/downstream/mmdetection/configs/detectors/cascade_rcnn_r50_sac_1x_coco.py b/downstream/mmdetection/configs/detectors/cascade_rcnn_r50_sac_1x_coco.py new file mode 100644 index 0000000..ccd9319 --- /dev/null +++ b/downstream/mmdetection/configs/detectors/cascade_rcnn_r50_sac_1x_coco.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py b/downstream/mmdetection/configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py new file mode 100644 index 0000000..f760404 --- /dev/null +++ b/downstream/mmdetection/configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + pretrained='torchvision://resnet50', + style='pytorch'))) diff --git a/downstream/mmdetection/configs/detectors/detectors_htc_r101_20e_coco.py b/downstream/mmdetection/configs/detectors/detectors_htc_r101_20e_coco.py new file mode 100644 index 0000000..93d7d2b --- /dev/null +++ b/downstream/mmdetection/configs/detectors/detectors_htc_r101_20e_coco.py @@ -0,0 +1,28 @@ +_base_ = '../htc/htc_r101_fpn_20e_coco.py' + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + pretrained='torchvision://resnet101', + style='pytorch'))) diff --git a/downstream/mmdetection/configs/detectors/detectors_htc_r50_1x_coco.py b/downstream/mmdetection/configs/detectors/detectors_htc_r50_1x_coco.py new file mode 100644 index 0000000..0d2fc4f --- /dev/null +++ b/downstream/mmdetection/configs/detectors/detectors_htc_r50_1x_coco.py @@ -0,0 +1,28 @@ +_base_ = '../htc/htc_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + pretrained='torchvision://resnet50', + style='pytorch'))) diff --git a/downstream/mmdetection/configs/detectors/htc_r50_rfp_1x_coco.py b/downstream/mmdetection/configs/detectors/htc_r50_rfp_1x_coco.py new file mode 100644 index 0000000..496104e --- /dev/null +++ b/downstream/mmdetection/configs/detectors/htc_r50_rfp_1x_coco.py @@ -0,0 +1,24 @@ +_base_ = '../htc/htc_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + pretrained='torchvision://resnet50', + style='pytorch'))) diff --git a/downstream/mmdetection/configs/detectors/htc_r50_sac_1x_coco.py b/downstream/mmdetection/configs/detectors/htc_r50_sac_1x_coco.py new file mode 100644 index 0000000..72d4db9 --- /dev/null +++ b/downstream/mmdetection/configs/detectors/htc_r50_sac_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../htc/htc_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/detectors/metafile.yml b/downstream/mmdetection/configs/detectors/metafile.yml new file mode 100644 index 0000000..4bed569 --- /dev/null +++ b/downstream/mmdetection/configs/detectors/metafile.yml @@ -0,0 +1,114 @@ +Collections: + - Name: DetectoRS + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ASPP + - FPN + - RFP + - RPN + - ResNet + - RoIAlign + - SAC + Paper: + URL: https://arxiv.org/abs/2006.02334 + Title: 'DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution' + README: configs/detectors/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.2.0/mmdet/models/backbones/detectors_resnet.py#L205 + Version: v2.2.0 + +Models: + - Name: cascade_rcnn_r50_rfp_1x_coco + In Collection: DetectoRS + Config: configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py + Metadata: + Training Memory (GB): 7.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_rfp_1x_coco/cascade_rcnn_r50_rfp_1x_coco-8cf51bfd.pth + + - Name: cascade_rcnn_r50_sac_1x_coco + In Collection: DetectoRS + Config: configs/detectors/cascade_rcnn_r50_sac_1x_coco.py + Metadata: + Training Memory (GB): 5.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_sac_1x_coco/cascade_rcnn_r50_sac_1x_coco-24bfda62.pth + + - Name: detectors_cascade_rcnn_r50_1x_coco + In Collection: DetectoRS + Config: configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py + Metadata: + Training Memory (GB): 9.9 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_cascade_rcnn_r50_1x_coco/detectors_cascade_rcnn_r50_1x_coco-32a10ba0.pth + + - Name: htc_r50_rfp_1x_coco + In Collection: DetectoRS + Config: configs/detectors/htc_r50_rfp_1x_coco.py + Metadata: + Training Memory (GB): 11.2 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_rfp_1x_coco/htc_r50_rfp_1x_coco-8ff87c51.pth + + - Name: htc_r50_sac_1x_coco + In Collection: DetectoRS + Config: configs/detectors/htc_r50_sac_1x_coco.py + Metadata: + Training Memory (GB): 9.3 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_sac_1x_coco/htc_r50_sac_1x_coco-bfa60c54.pth + + - Name: detectors_htc_r50_1x_coco + In Collection: DetectoRS + Config: configs/detectors/detectors_htc_r50_1x_coco.py + Metadata: + Training Memory (GB): 13.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 49.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r50_1x_coco/detectors_htc_r50_1x_coco-329b1453.pth diff --git a/downstream/mmdetection/configs/detr/README.md b/downstream/mmdetection/configs/detr/README.md new file mode 100644 index 0000000..9f2485d --- /dev/null +++ b/downstream/mmdetection/configs/detr/README.md @@ -0,0 +1,37 @@ +# DETR + +> [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) + + + +## Abstract + +We present a new method that views object detection as a direct set prediction problem. Our approach streamlines the detection pipeline, effectively removing the need for many hand-designed components like a non-maximum suppression procedure or anchor generation that explicitly encode our prior knowledge about the task. The main ingredients of the new framework, called DEtection TRansformer or DETR, are a set-based global loss that forces unique predictions via bipartite matching, and a transformer encoder-decoder architecture. Given a fixed small set of learned object queries, DETR reasons about the relations of the objects and the global image context to directly output the final set of predictions in parallel. The new model is conceptually simple and does not require a specialized library, unlike many other modern detectors. DETR demonstrates accuracy and run-time performance on par with the well-established and highly-optimized Faster RCNN baseline on the challenging COCO object detection dataset. Moreover, DETR can be easily generalized to produce panoptic segmentation in a unified manner. We show that it significantly outperforms competitive baselines. + +
    + +
    + +## Results and Models + +| Backbone | Model | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :---: | :-----: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | DETR | 150e | 7.9 | | 40.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detr/detr_r50_8x2_150e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detr/detr_r50_8x2_150e_coco/detr_r50_8x2_150e_coco_20201130_194835-2c4b8974.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detr/detr_r50_8x2_150e_coco/detr_r50_8x2_150e_coco_20201130_194835.log.json) | + +## Citation + +We provide the config files for DETR: [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872). + +```latex +@inproceedings{detr, + author = {Nicolas Carion and + Francisco Massa and + Gabriel Synnaeve and + Nicolas Usunier and + Alexander Kirillov and + Sergey Zagoruyko}, + title = {End-to-End Object Detection with Transformers}, + booktitle = {ECCV}, + year = {2020} +} +``` diff --git a/downstream/mmdetection/configs/detr/detr_r50_8x2_150e_coco.py b/downstream/mmdetection/configs/detr/detr_r50_8x2_150e_coco.py new file mode 100644 index 0000000..892447d --- /dev/null +++ b/downstream/mmdetection/configs/detr/detr_r50_8x2_150e_coco.py @@ -0,0 +1,150 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +model = dict( + type='DETR', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + bbox_head=dict( + type='DETRHead', + num_classes=80, + in_channels=2048, + transformer=dict( + type='Transformer', + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=[ + dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1) + ], + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'ffn', 'norm'))), + decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=6, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1), + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'cross_attn', 'norm', + 'ffn', 'norm')), + )), + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + loss_cls=dict( + type='CrossEntropyLoss', + bg_cls_weight=0.1, + use_sigmoid=False, + loss_weight=1.0, + class_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=5.0), + loss_iou=dict(type='GIoULoss', loss_weight=2.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='HungarianAssigner', + cls_cost=dict(type='ClassificationCost', weight=1.), + reg_cost=dict(type='BBoxL1Cost', weight=5.0, box_format='xywh'), + iou_cost=dict(type='IoUCost', iou_mode='giou', weight=2.0))), + test_cfg=dict(max_per_img=100)) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# train_pipeline, NOTE the img_scale and the Pad's size_divisor is different +# from the default setting in mmdet. +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +# test_pipeline, NOTE the Pad's size_divisor is different from the default +# setting (size_divisor=32). While there is little effect on the performance +# whether we use the default setting or use size_divisor=1. +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.0001, + paramwise_cfg=dict( + custom_keys={'backbone': dict(lr_mult=0.1, decay_mult=1.0)})) +optimizer_config = dict(grad_clip=dict(max_norm=0.1, norm_type=2)) +# learning policy +lr_config = dict(policy='step', step=[100]) +runner = dict(type='EpochBasedRunner', max_epochs=150) diff --git a/downstream/mmdetection/configs/detr/metafile.yml b/downstream/mmdetection/configs/detr/metafile.yml new file mode 100644 index 0000000..45622cf --- /dev/null +++ b/downstream/mmdetection/configs/detr/metafile.yml @@ -0,0 +1,33 @@ +Collections: + - Name: DETR + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Multi Scale Train + - Gradient Clip + Training Resources: 8x V100 GPUs + Architecture: + - ResNet + - Transformer + Paper: + URL: https://arxiv.org/abs/2005.12872 + Title: 'End-to-End Object Detection with Transformers' + README: configs/detr/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/detectors/detr.py#L7 + Version: v2.7.0 + +Models: + - Name: detr_r50_8x2_150e_coco + In Collection: DETR + Config: configs/detr/detr_r50_8x2_150e_coco.py + Metadata: + Training Memory (GB): 7.9 + Epochs: 150 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detr/detr_r50_8x2_150e_coco/detr_r50_8x2_150e_coco_20201130_194835-2c4b8974.pth diff --git a/downstream/mmdetection/configs/double_heads/README.md b/downstream/mmdetection/configs/double_heads/README.md new file mode 100644 index 0000000..4a149b5 --- /dev/null +++ b/downstream/mmdetection/configs/double_heads/README.md @@ -0,0 +1,32 @@ +# Double Heads + +> [Rethinking Classification and Localization for Object Detection](https://arxiv.org/abs/1904.06493) + + + +## Abstract + +Two head structures (i.e. fully connected head and convolution head) have been widely used in R-CNN based detectors for classification and localization tasks. However, there is a lack of understanding of how does these two head structures work for these two tasks. To address this issue, we perform a thorough analysis and find an interesting fact that the two head structures have opposite preferences towards the two tasks. Specifically, the fully connected head (fc-head) is more suitable for the classification task, while the convolution head (conv-head) is more suitable for the localization task. Furthermore, we examine the output feature maps of both heads and find that fc-head has more spatial sensitivity than conv-head. Thus, fc-head has more capability to distinguish a complete object from part of an object, but is not robust to regress the whole object. Based upon these findings, we propose a Double-Head method, which has a fully connected head focusing on classification and a convolution head for bounding box regression. Without bells and whistles, our method gains +3.5 and +2.8 AP on MS COCO dataset from Feature Pyramid Network (FPN) baselines with ResNet-50 and ResNet-101 backbones, respectively. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :--------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 6.8 | 9.5 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/double_heads/dh_faster_rcnn_r50_fpn_1x_coco/dh_faster_rcnn_r50_fpn_1x_coco_20200130-586b67df.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/double_heads/dh_faster_rcnn_r50_fpn_1x_coco/dh_faster_rcnn_r50_fpn_1x_coco_20200130_220238.log.json) | + +## Citation + +```latex +@article{wu2019rethinking, + title={Rethinking Classification and Localization for Object Detection}, + author={Yue Wu and Yinpeng Chen and Lu Yuan and Zicheng Liu and Lijuan Wang and Hongzhi Li and Yun Fu}, + year={2019}, + eprint={1904.06493}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/downstream/mmdetection/configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..9b8118b --- /dev/null +++ b/downstream/mmdetection/configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,23 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + type='DoubleHeadRoIHead', + reg_roi_scale_factor=1.3, + bbox_head=dict( + _delete_=True, + type='DoubleConvFCBBoxHead', + num_convs=4, + num_fcs=2, + in_channels=256, + conv_out_channels=1024, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=2.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=2.0)))) diff --git a/downstream/mmdetection/configs/double_heads/metafile.yml b/downstream/mmdetection/configs/double_heads/metafile.yml new file mode 100644 index 0000000..6fe9b7a --- /dev/null +++ b/downstream/mmdetection/configs/double_heads/metafile.yml @@ -0,0 +1,41 @@ +Collections: + - Name: Rethinking Classification and Localization for Object Detection + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - RPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/pdf/1904.06493 + Title: 'Rethinking Classification and Localization for Object Detection' + README: configs/double_heads/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/roi_heads/double_roi_head.py#L6 + Version: v2.0.0 + +Models: + - Name: dh_faster_rcnn_r50_fpn_1x_coco + In Collection: Rethinking Classification and Localization for Object Detection + Config: configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.8 + inference time (ms/im): + - value: 105.26 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/double_heads/dh_faster_rcnn_r50_fpn_1x_coco/dh_faster_rcnn_r50_fpn_1x_coco_20200130-586b67df.pth diff --git a/downstream/mmdetection/configs/dyhead/README.md b/downstream/mmdetection/configs/dyhead/README.md new file mode 100644 index 0000000..8e6aed3 --- /dev/null +++ b/downstream/mmdetection/configs/dyhead/README.md @@ -0,0 +1,52 @@ +# DyHead + +> [Dynamic Head: Unifying Object Detection Heads with Attentions](https://arxiv.org/abs/2106.08322) + + + +## Abstract + +The complex nature of combining localization and classification in object detection has resulted in the flourished development of methods. Previous works tried to improve the performance in various object detection heads but failed to present a unified view. In this paper, we present a novel dynamic head framework to unify object detection heads with attentions. By coherently combining multiple self-attention mechanisms between feature levels for scale-awareness, among spatial locations for spatial-awareness, and within output channels for task-awareness, the proposed approach significantly improves the representation ability of object detection heads without any computational overhead. Further experiments demonstrate that the effectiveness and efficiency of the proposed dynamic head on the COCO benchmark. With a standard ResNeXt-101-DCN backbone, we largely improve the performance over popular object detectors and achieve a new state-of-the-art at 54.0 AP. Furthermore, with latest transformer backbone and extra data, we can push current best COCO result to a new record at 60.6 AP. + +
    + +
    + +## Results and Models + +| Method | Backbone | Style | Setting | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----: | :------: | :-----: | :----------: | :-----: | :------: | :------------: | :----: | :----------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ATSS | R-50 | caffe | reproduction | 1x | 5.4 | 13.2 | 42.5 | [config](./atss_r50_caffe_fpn_dyhead_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_for_reproduction_1x_coco/atss_r50_fpn_dyhead_for_reproduction_4x4_1x_coco_20220107_213939-162888e6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_for_reproduction_1x_coco/atss_r50_fpn_dyhead_for_reproduction_4x4_1x_coco_20220107_213939.log.json) | +| ATSS | R-50 | pytorch | simple | 1x | 4.9 | 13.7 | 43.3 | [config](./atss_r50_fpn_dyhead_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_4x4_1x_coco/atss_r50_fpn_dyhead_4x4_1x_coco_20211219_023314-eaa620c6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_4x4_1x_coco/atss_r50_fpn_dyhead_4x4_1x_coco_20211219_023314.log.json) | + +- We trained the above models with 4 GPUs and 4 `samples_per_gpu`. +- The `reproduction` setting aims to reproduce the official implementation based on Detectron2. +- The `simple` setting serves as a minimum example to use DyHead in MMDetection. Specifically, + - it adds `DyHead` to `neck` after `FPN` + - it sets `stacked_convs=0` to `bbox_head` +- The `simple` setting achieves higher AP than the original implementation. + We have not conduct ablation study between the two settings. + `dict(type='Pad', size_divisor=128)` may further improve AP by prefer spatial alignment across pyramid levels, although large padding reduces efficiency. + +We also trained the model with Swin-L backbone. Results are as below. + +| Method | Backbone | Style | Setting | Lr schd | mstrain | box AP | Config | Download | +| :----: | :------: | :---: | :----------: | :-----: | :------: | :----: | :----------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ATSS | Swin-L | caffe | reproduction | 2x | 480~1200 | 56.2 | [config](./atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco_20220509_100315-bc5b6516.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco_20220509_100315.log.json) | + +## Relation to Other Methods + +- DyHead can be regarded as an improved [SEPC](https://arxiv.org/abs/2005.03101) with [DyReLU modules](https://arxiv.org/abs/2003.10027) and simplified [SE blocks](https://arxiv.org/abs/1709.01507). +- Xiyang Dai et al., the author team of DyHead, adopt it for [Dynamic DETR](https://openaccess.thecvf.com/content/ICCV2021/html/Dai_Dynamic_DETR_End-to-End_Object_Detection_With_Dynamic_Attention_ICCV_2021_paper.html). + The description of Dynamic Encoder in Sec. 3.2 will help you understand DyHead. + +## Citation + +```latex +@inproceedings{DyHead_CVPR2021, + author = {Dai, Xiyang and Chen, Yinpeng and Xiao, Bin and Chen, Dongdong and Liu, Mengchen and Yuan, Lu and Zhang, Lei}, + title = {Dynamic Head: Unifying Object Detection Heads With Attentions}, + booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, + year = {2021} +} +``` diff --git a/downstream/mmdetection/configs/dyhead/atss_r50_caffe_fpn_dyhead_1x_coco.py b/downstream/mmdetection/configs/dyhead/atss_r50_caffe_fpn_dyhead_1x_coco.py new file mode 100644 index 0000000..223b653 --- /dev/null +++ b/downstream/mmdetection/configs/dyhead/atss_r50_caffe_fpn_dyhead_1x_coco.py @@ -0,0 +1,112 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + dict( + type='DyHead', + in_channels=256, + out_channels=256, + num_blocks=6, + # disable zero_init_offset to follow official implementation + zero_init_offset=False) + ], + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + pred_kernel_size=1, # follow DyHead official implementation + stacked_convs=0, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128], + center_offset=0.5), # follow DyHead official implementation + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) + +# use caffe img_norm, size_divisor=128, pillow resize +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=(1333, 800), + keep_ratio=True, + backend='pillow'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True, backend='pillow'), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/dyhead/atss_r50_fpn_dyhead_1x_coco.py b/downstream/mmdetection/configs/dyhead/atss_r50_fpn_dyhead_1x_coco.py new file mode 100644 index 0000000..8c5109d --- /dev/null +++ b/downstream/mmdetection/configs/dyhead/atss_r50_fpn_dyhead_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + dict(type='DyHead', in_channels=256, out_channels=256, num_blocks=6) + ], + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + stacked_convs=0, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py b/downstream/mmdetection/configs/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py new file mode 100644 index 0000000..dc9c328 --- /dev/null +++ b/downstream/mmdetection/configs/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py @@ -0,0 +1,164 @@ +_base_ = '../_base_/default_runtime.py' + +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22k.pth' # noqa +model = dict( + type='ATSS', + backbone=dict( + type='SwinTransformer', + pretrain_img_size=384, + embed_dims=192, + depths=[2, 2, 18, 2], + num_heads=[6, 12, 24, 48], + window_size=12, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.2, + patch_norm=True, + out_indices=(1, 2, 3), + # Please only add indices that would be used + # in FPN, otherwise some parameter will not be used + with_cp=False, + convert_weights=True, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + neck=[ + dict( + type='FPN', + in_channels=[384, 768, 1536], + out_channels=256, + start_level=0, + add_extra_convs='on_output', + num_outs=5), + dict( + type='DyHead', + in_channels=256, + out_channels=256, + num_blocks=6, + # disable zero_init_offset to follow official implementation + zero_init_offset=False) + ], + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + pred_kernel_size=1, # follow DyHead official implementation + stacked_convs=0, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128], + center_offset=0.5), # follow DyHead official implementation + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(2000, 480), (2000, 1200)], + multiscale_mode='range', + keep_ratio=True, + backend='pillow'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2000, 1200), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True, backend='pillow'), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=2, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') + +# optimizer +optimizer_config = dict(grad_clip=None) +optimizer = dict( + type='AdamW', + lr=0.00005, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[8, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/downstream/mmdetection/configs/dyhead/metafile.yml b/downstream/mmdetection/configs/dyhead/metafile.yml new file mode 100644 index 0000000..3fb7370 --- /dev/null +++ b/downstream/mmdetection/configs/dyhead/metafile.yml @@ -0,0 +1,76 @@ +Collections: + - Name: DyHead + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 4x T4 GPUs + Architecture: + - ATSS + - DyHead + - FPN + - ResNet + - Deformable Convolution + - Pyramid Convolution + Paper: + URL: https://arxiv.org/abs/2106.08322 + Title: 'Dynamic Head: Unifying Object Detection Heads with Attentions' + README: configs/dyhead/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.22.0/mmdet/models/necks/dyhead.py#L130 + Version: v2.22.0 + +Models: + - Name: atss_r50_caffe_fpn_dyhead_1x_coco + In Collection: DyHead + Config: configs/dyhead/atss_r50_caffe_fpn_dyhead_1x_coco.py + Metadata: + Training Memory (GB): 5.4 + inference time (ms/im): + - value: 75.7 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_for_reproduction_1x_coco/atss_r50_fpn_dyhead_for_reproduction_4x4_1x_coco_20220107_213939-162888e6.pth + + - Name: atss_r50_fpn_dyhead_1x_coco + In Collection: DyHead + Config: configs/dyhead/atss_r50_fpn_dyhead_1x_coco.py + Metadata: + Training Memory (GB): 4.9 + inference time (ms/im): + - value: 73.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_4x4_1x_coco/atss_r50_fpn_dyhead_4x4_1x_coco_20211219_023314-eaa620c6.pth + + - Name: atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco + In Collection: DyHead + Config: configs/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py + Metadata: + Training Memory (GB): 58.4 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 56.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco_20220509_100315-bc5b6516.pth diff --git a/downstream/mmdetection/configs/dynamic_rcnn/README.md b/downstream/mmdetection/configs/dynamic_rcnn/README.md new file mode 100644 index 0000000..0045df7 --- /dev/null +++ b/downstream/mmdetection/configs/dynamic_rcnn/README.md @@ -0,0 +1,30 @@ +# Dynamic R-CNN + +> [Dynamic R-CNN: Towards High Quality Object Detection via Dynamic Training](https://arxiv.org/abs/2004.06002) + + + +## Abstract + +Although two-stage object detectors have continuously advanced the state-of-the-art performance in recent years, the training process itself is far from crystal. In this work, we first point out the inconsistency problem between the fixed network settings and the dynamic training procedure, which greatly affects the performance. For example, the fixed label assignment strategy and regression loss function cannot fit the distribution change of proposals and thus are harmful to training high quality detectors. Consequently, we propose Dynamic R-CNN to adjust the label assignment criteria (IoU threshold) and the shape of regression loss function (parameters of SmoothL1 Loss) automatically based on the statistics of proposals during training. This dynamic design makes better use of the training samples and pushes the detector to fit more high quality samples. Specifically, our method improves upon ResNet-50-FPN baseline with 1.9% AP and 5.5% AP90 on the MS COCO dataset with no extra overhead. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | 3.8 | | 38.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x/dynamic_rcnn_r50_fpn_1x-62a3f276.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x/dynamic_rcnn_r50_fpn_1x_20200618_095048.log.json) | + +## Citation + +```latex +@article{DynamicRCNN, + author = {Hongkai Zhang and Hong Chang and Bingpeng Ma and Naiyan Wang and Xilin Chen}, + title = {Dynamic {R-CNN}: Towards High Quality Object Detection via Dynamic Training}, + journal = {arXiv preprint arXiv:2004.06002}, + year = {2020} +} +``` diff --git a/downstream/mmdetection/configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..f2deb99 --- /dev/null +++ b/downstream/mmdetection/configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,28 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + type='DynamicRoIHead', + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict(nms=dict(iou_threshold=0.85)), + rcnn=dict( + dynamic_rcnn=dict( + iou_topk=75, + beta_topk=10, + update_iter_interval=100, + initial_iou=0.4, + initial_beta=1.0))), + test_cfg=dict(rpn=dict(nms=dict(iou_threshold=0.85)))) diff --git a/downstream/mmdetection/configs/dynamic_rcnn/metafile.yml b/downstream/mmdetection/configs/dynamic_rcnn/metafile.yml new file mode 100644 index 0000000..fec43db --- /dev/null +++ b/downstream/mmdetection/configs/dynamic_rcnn/metafile.yml @@ -0,0 +1,35 @@ +Collections: + - Name: Dynamic R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Dynamic R-CNN + - FPN + - RPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/pdf/2004.06002 + Title: 'Dynamic R-CNN: Towards High Quality Object Detection via Dynamic Training' + README: configs/dynamic_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.2.0/mmdet/models/roi_heads/dynamic_roi_head.py#L11 + Version: v2.2.0 + +Models: + - Name: dynamic_rcnn_r50_fpn_1x_coco + In Collection: Dynamic R-CNN + Config: configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.8 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x/dynamic_rcnn_r50_fpn_1x-62a3f276.pth diff --git a/downstream/mmdetection/configs/efficientnet/README.md b/downstream/mmdetection/configs/efficientnet/README.md new file mode 100644 index 0000000..99b0572 --- /dev/null +++ b/downstream/mmdetection/configs/efficientnet/README.md @@ -0,0 +1,30 @@ +# EfficientNet + +> [EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946v5) + + + +## Introduction + +Convolutional Neural Networks (ConvNets) are commonly developed at a fixed resource budget, and then scaled up for better accuracy if more resources are available. In this paper, we systematically study model scaling and identify that carefully balancing network depth, width, and resolution can lead to better performance. Based on this observation, we propose a new scaling method that uniformly scales all dimensions of depth/width/resolution using a simple yet highly effective compound coefficient. We demonstrate the effectiveness of this method on scaling up MobileNets and ResNet. + +To go even further, we use neural architecture search to design a new baseline network and scale it up to obtain a family of models, called EfficientNets, which achieve much better accuracy and efficiency than previous ConvNets. In particular, our EfficientNet-B7 achieves state-of-the-art 84.3% top-1 accuracy on ImageNet, while being 8.4x smaller and 6.1x faster on inference than the best existing ConvNet. Our EfficientNets also transfer well and achieve state-of-the-art accuracy on CIFAR-100 (91.7%), Flowers (98.8%), and 3 other transfer learning datasets, with an order of magnitude fewer parameters. + +## Results and Models + +### RetinaNet + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Efficientnet-b3 | pytorch | 1x | - | - | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco/retinanet_effb3_fpn_crop896_8x4_1x_coco_20220322_234806-615a0dda.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco/retinanet_effb3_fpn_crop896_8x4_1x_coco_20220322_234806.log.json) | + +## Citation + +```latex +@article{tan2019efficientnet, + title={Efficientnet: Rethinking model scaling for convolutional neural networks}, + author={Tan, Mingxing and Le, Quoc V}, + journal={arXiv preprint arXiv:1905.11946}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/efficientnet/metafile.yml b/downstream/mmdetection/configs/efficientnet/metafile.yml new file mode 100644 index 0000000..de40b95 --- /dev/null +++ b/downstream/mmdetection/configs/efficientnet/metafile.yml @@ -0,0 +1,19 @@ +Models: + - Name: retinanet_effb3_fpn_crop896_8x4_1x_coco + In Collection: RetinaNet + Config: configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco/retinanet_effb3_fpn_crop896_8x4_1x_coco_20220322_234806-615a0dda.pth + Paper: + URL: https://arxiv.org/abs/1905.11946v5 + Title: 'EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks' + README: configs/efficientnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.23.0/mmdet/models/backbones/efficientnet.py#L159 + Version: v2.23.0 diff --git a/downstream/mmdetection/configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py b/downstream/mmdetection/configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py new file mode 100644 index 0000000..c90bc16 --- /dev/null +++ b/downstream/mmdetection/configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py @@ -0,0 +1,94 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] + +cudnn_benchmark = True +norm_cfg = dict(type='BN', requires_grad=True) +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa_in1k_20220119-5b4887a0.pth' # noqa +model = dict( + backbone=dict( + _delete_=True, + type='EfficientNet', + arch='b3', + drop_path_rate=0.2, + out_indices=(3, 4, 5), + frozen_stages=0, + norm_cfg=dict( + type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01), + norm_eval=False, + init_cfg=dict( + type='Pretrained', prefix='backbone', checkpoint=checkpoint)), + neck=dict( + in_channels=[48, 136, 384], + start_level=0, + out_channels=256, + relu_before_extra_convs=True, + no_norm_on_lateral=True, + norm_cfg=norm_cfg), + bbox_head=dict(type='RetinaSepBNHead', num_ins=5, norm_cfg=norm_cfg), + # training and testing settings + train_cfg=dict(assigner=dict(neg_iou_thr=0.5))) + +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_size = (896, 896) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=img_size, + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=img_size), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=img_size), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_size, + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=img_size), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer_config = dict(grad_clip=None) +optimizer = dict( + type='SGD', + lr=0.04, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[8, 11]) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=12) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (4 samples per GPU) +auto_scale_lr = dict(base_batch_size=32) diff --git a/downstream/mmdetection/configs/empirical_attention/README.md b/downstream/mmdetection/configs/empirical_attention/README.md new file mode 100644 index 0000000..fc2620a --- /dev/null +++ b/downstream/mmdetection/configs/empirical_attention/README.md @@ -0,0 +1,33 @@ +# Empirical Attention + +> [An Empirical Study of Spatial Attention Mechanisms in Deep Networks](https://arxiv.org/abs/1904.05873) + + + +## Abstract + +Attention mechanisms have become a popular component in deep neural networks, yet there has been little examination of how different influencing factors and methods for computing attention from these factors affect performance. Toward a better general understanding of attention mechanisms, we present an empirical study that ablates various spatial attention elements within a generalized attention formulation, encompassing the dominant Transformer attention as well as the prevalent deformable convolution and dynamic convolution modules. Conducted on a variety of applications, the study yields significant findings about spatial attention in deep networks, some of which run counter to conventional understanding. For example, we find that the query and key content comparison in Transformer attention is negligible for self-attention, but vital for encoder-decoder attention. A proper combination of deformable convolution with key content only saliency achieves the best accuracy-efficiency tradeoff in self-attention. Our results suggest that there exists much room for improvement in the design of attention mechanisms. + +
    + +
    + +## Results and Models + +| Backbone | Attention Component | DCN | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----------------: | :-: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | 1111 | N | 1x | 8.0 | 13.8 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco/faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130-403cccba.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco/faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130_210344.log.json) | +| R-50 | 0010 | N | 1x | 4.2 | 18.4 | 39.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco/faster_rcnn_r50_fpn_attention_0010_1x_coco_20200130-7cb0c14d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco/faster_rcnn_r50_fpn_attention_0010_1x_coco_20200130_210125.log.json) | +| R-50 | 1111 | Y | 1x | 8.0 | 12.7 | 42.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco_20200130-8b2523a6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco_20200130_204442.log.json) | +| R-50 | 0010 | Y | 1x | 4.2 | 17.1 | 42.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco_20200130-1a2e831d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco_20200130_210410.log.json) | + +## Citation + +```latex +@article{zhu2019empirical, + title={An Empirical Study of Spatial Attention Mechanisms in Deep Networks}, + author={Zhu, Xizhou and Cheng, Dazhi and Zhang, Zheng and Lin, Stephen and Dai, Jifeng}, + journal={arXiv preprint arXiv:1904.05873}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py b/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py new file mode 100644 index 0000000..a544e3a --- /dev/null +++ b/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + stages=(False, False, True, True), + position='after_conv2') + ])) diff --git a/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py b/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py new file mode 100644 index 0000000..bbefd27 --- /dev/null +++ b/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + plugins=[ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + stages=(False, False, True, True), + position='after_conv2') + ], + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py b/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py new file mode 100644 index 0000000..13a4645 --- /dev/null +++ b/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='1111', + kv_stride=2), + stages=(False, False, True, True), + position='after_conv2') + ])) diff --git a/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py b/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py new file mode 100644 index 0000000..b1f26c0 --- /dev/null +++ b/downstream/mmdetection/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + plugins=[ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='1111', + kv_stride=2), + stages=(False, False, True, True), + position='after_conv2') + ], + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/downstream/mmdetection/configs/empirical_attention/metafile.yml b/downstream/mmdetection/configs/empirical_attention/metafile.yml new file mode 100644 index 0000000..923bcb2 --- /dev/null +++ b/downstream/mmdetection/configs/empirical_attention/metafile.yml @@ -0,0 +1,103 @@ +Collections: + - Name: Empirical Attention + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Deformable Convolution + - FPN + - RPN + - ResNet + - RoIAlign + - Spatial Attention + Paper: + URL: https://arxiv.org/pdf/1904.05873 + Title: 'An Empirical Study of Spatial Attention Mechanisms in Deep Networks' + README: configs/empirical_attention/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/ops/generalized_attention.py#L10 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_fpn_attention_1111_1x_coco + In Collection: Empirical Attention + Config: configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py + Metadata: + Training Memory (GB): 8.0 + inference time (ms/im): + - value: 72.46 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco/faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130-403cccba.pth + + - Name: faster_rcnn_r50_fpn_attention_0010_1x_coco + In Collection: Empirical Attention + Config: configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + inference time (ms/im): + - value: 54.35 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco/faster_rcnn_r50_fpn_attention_0010_1x_coco_20200130-7cb0c14d.pth + + - Name: faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco + In Collection: Empirical Attention + Config: configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py + Metadata: + Training Memory (GB): 8.0 + inference time (ms/im): + - value: 78.74 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco_20200130-8b2523a6.pth + + - Name: faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco + In Collection: Empirical Attention + Config: configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + inference time (ms/im): + - value: 58.48 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco_20200130-1a2e831d.pth diff --git a/downstream/mmdetection/configs/fast_rcnn/README.md b/downstream/mmdetection/configs/fast_rcnn/README.md new file mode 100644 index 0000000..767f76c --- /dev/null +++ b/downstream/mmdetection/configs/fast_rcnn/README.md @@ -0,0 +1,73 @@ +# Fast R-CNN + +> [Fast R-CNN](https://arxiv.org/abs/1504.08083) + + + +## Abstract + +This paper proposes a Fast Region-based Convolutional Network method (Fast R-CNN) for object detection. Fast R-CNN builds on previous work to efficiently classify object proposals using deep convolutional networks. Compared to previous work, Fast R-CNN employs several innovations to improve training and testing speed while also increasing detection accuracy. Fast R-CNN trains the very deep VGG16 network 9x faster than R-CNN, is 213x faster at test-time, and achieves a higher mAP on PASCAL VOC 2012. Compared to SPPnet, Fast R-CNN trains VGG16 3x faster, tests 10x faster, and is more accurate. + +
    + +
    + +## Introduction + +Before training the Fast R-CNN, users should first train an [RPN](../rpn/README.md), and use the RPN to extract the region proposals. + +- Firstly, extract the region proposals of the val set by this command as below: + +```bash +./tools/dist_test.sh \ + configs/rpn_r50_fpn_1x_coco.py \ + checkpoints/rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth \ + 8 \ + --out proposals/rpn_r50_fpn_1x_val2017.pkl +``` + +- Then, change the `ann_file` and `img_prefix` of `data.test` in the RPN config to train set as below: + +```python +data = dict( + test=dict( + ann_file='data/coco/annotations/instances_train2017.json', + img_prefix='data/coco/train2017/')) +``` + +- Extract the region proposals of the train set by this command as below: + +```bash +./tools/dist_test.sh \ + configs/rpn_r50_fpn_1x_coco.py \ + checkpoints/rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth \ + 8 \ + --out proposals/rpn_r50_fpn_1x_train2017.pkl +``` + +- Modify the path of `proposal_file` in Fast R-CNN config as below: + +```python +data = dict( + train=dict( + proposal_file='proposals/rpn_r50_fpn_1x_train2017.pkl'), + val=dict( + proposal_file='proposals/rpn_r50_fpn_1x_val2017.pkl'), + test=dict( + proposal_file='proposals/rpn_r50_fpn_1x_val2017.pkl')) +``` + +Finally, users can start training the Fast R-CNN. + +## Results and Models + +## Citation + +```latex +@inproceedings{girshick2015fast, + title={Fast r-cnn}, + author={Girshick, Ross}, + booktitle={Proceedings of the IEEE international conference on computer vision}, + year={2015} +} +``` diff --git a/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..3ab8e98 --- /dev/null +++ b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './fast_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..83852b2 --- /dev/null +++ b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fast_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_fpn_2x_coco.py b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_fpn_2x_coco.py new file mode 100644 index 0000000..c220885 --- /dev/null +++ b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r101_fpn_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fast_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..f1b29ef --- /dev/null +++ b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,48 @@ +_base_ = './fast_rcnn_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + norm_cfg=dict(type='BN', requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=2000), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=None), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['proposals']), + dict( + type='ToDataContainer', + fields=[dict(key='proposals', stack=False)]), + dict(type='Collect', keys=['img', 'proposals']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..d2f080e --- /dev/null +++ b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,52 @@ +_base_ = [ + '../_base_/models/fast_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=2000), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=None), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['proposals']), + dict( + type='ToDataContainer', + fields=[dict(key='proposals', stack=False)]), + dict(type='Collect', keys=['img', 'proposals']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + proposal_file=data_root + 'proposals/rpn_r50_fpn_1x_train2017.pkl', + pipeline=train_pipeline), + val=dict( + proposal_file=data_root + 'proposals/rpn_r50_fpn_1x_val2017.pkl', + pipeline=test_pipeline), + test=dict( + proposal_file=data_root + 'proposals/rpn_r50_fpn_1x_val2017.pkl', + pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_fpn_2x_coco.py b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_fpn_2x_coco.py new file mode 100644 index 0000000..228e856 --- /dev/null +++ b/downstream/mmdetection/configs/fast_rcnn/fast_rcnn_r50_fpn_2x_coco.py @@ -0,0 +1,5 @@ +_base_ = './fast_rcnn_r50_fpn_1x_coco.py' + +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/faster_rcnn/README.md b/downstream/mmdetection/configs/faster_rcnn/README.md new file mode 100644 index 0000000..865d375 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/README.md @@ -0,0 +1,88 @@ +# Faster R-CNN + +> [Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks](https://arxiv.org/abs/1506.01497) + + + +## Abstract + +State-of-the-art object detection networks depend on region proposal algorithms to hypothesize object locations. Advances like SPPnet and Fast R-CNN have reduced the running time of these detection networks, exposing region proposal computation as a bottleneck. In this work, we introduce a Region Proposal Network (RPN) that shares full-image convolutional features with the detection network, thus enabling nearly cost-free region proposals. An RPN is a fully convolutional network that simultaneously predicts object bounds and objectness scores at each position. The RPN is trained end-to-end to generate high-quality region proposals, which are used by Fast R-CNN for detection. We further merge RPN and Fast R-CNN into a single network by sharing their convolutional features---using the recently popular terminology of neural networks with 'attention' mechanisms, the RPN component tells the unified network where to look. For the very deep VGG-16 model, our detection system has a frame rate of 5fps (including all steps) on a GPU, while achieving state-of-the-art object detection accuracy on PASCAL VOC 2007, 2012, and MS COCO datasets with only 300 proposals per image. In ILSVRC and COCO 2015 competitions, Faster R-CNN and RPN are the foundations of the 1st-place winning entries in several tracks. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-C4 | caffe | 1x | - | - | 35.6 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco/faster_rcnn_r50_caffe_c4_1x_coco_20220316_150152-3f885b85.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco/faster_rcnn_r50_caffe_c4_1x_coco_20220316_150152.log.json) | +| R-50-DC5 | caffe | 1x | - | - | 37.2 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco/faster_rcnn_r50_caffe_dc5_1x_coco_20201030_151909-531f0f43.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco/faster_rcnn_r50_caffe_dc5_1x_coco_20201030_151909.log.json) | +| R-50-FPN | caffe | 1x | 3.8 | | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco/faster_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.378_20200504_180032-c5925ee5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco/faster_rcnn_r50_caffe_fpn_1x_coco_20200504_180032.log.json) | +| R-50-FPN | pytorch | 1x | 4.0 | 21.4 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| R-50-FPN (FP16) | pytorch | 1x | 3.4 | 28.8 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fp16/faster_rcnn_r50_fpn_fp16_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fp16/faster_rcnn_r50_fpn_fp16_1x_coco/faster_rcnn_r50_fpn_fp16_1x_coco_20200204-d4dc1471.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fp16/faster_rcnn_r50_fpn_fp16_1x_coco/faster_rcnn_r50_fpn_fp16_1x_coco_20200204_143530.log.json) | +| R-50-FPN | pytorch | 2x | - | - | 38.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_2x_coco/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_2x_coco/faster_rcnn_r50_fpn_2x_coco_20200504_210434.log.json) | +| R-101-FPN | caffe | 1x | 5.7 | | 39.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco/faster_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.398_20200504_180057-b269e9dd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco/faster_rcnn_r101_caffe_fpn_1x_coco_20200504_180057.log.json) | +| R-101-FPN | pytorch | 1x | 6.0 | 15.6 | 39.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_1x_coco/faster_rcnn_r101_fpn_1x_coco_20200130-f513f705.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_1x_coco/faster_rcnn_r101_fpn_1x_coco_20200130_204655.log.json) | +| R-101-FPN | pytorch | 2x | - | - | 39.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_2x_coco/faster_rcnn_r101_fpn_2x_coco_bbox_mAP-0.398_20200504_210455-1d2dac9c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_2x_coco/faster_rcnn_r101_fpn_2x_coco_20200504_210455.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.2 | 13.8 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco/faster_rcnn_x101_32x4d_fpn_1x_coco_20200203-cff10310.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco/faster_rcnn_x101_32x4d_fpn_1x_coco_20200203_000520.log.json) | +| X-101-32x4d-FPN | pytorch | 2x | - | - | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco/faster_rcnn_x101_32x4d_fpn_2x_coco_bbox_mAP-0.412_20200506_041400-64a12c0b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco/faster_rcnn_x101_32x4d_fpn_2x_coco_20200506_041400.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.3 | 9.4 | 42.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco/faster_rcnn_x101_64x4d_fpn_1x_coco_20200204-833ee192.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco/faster_rcnn_x101_64x4d_fpn_1x_coco_20200204_134340.log.json) | +| X-101-64x4d-FPN | pytorch | 2x | - | - | 41.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco/faster_rcnn_x101_64x4d_fpn_2x_coco_20200512_161033-5961fa95.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco/faster_rcnn_x101_64x4d_fpn_2x_coco_20200512_161033.log.json) | + +## Different regression loss + +We trained with R-50-FPN pytorch style backbone for 1x schedule. + +| Backbone | Loss type | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :------------: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | L1Loss | 4.0 | 21.4 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| R-50-FPN | IoULoss | | | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_iou_1x_coco-fdd207f3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_iou_1x_coco_20200506_095954.log.json) | +| R-50-FPN | GIoULoss | | | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_giou_1x_coco-0eada910.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_giou_1x_coco_20200505_161120.log.json) | +| R-50-FPN | BoundedIoULoss | | | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_bounded_iou_1x_coco-98ad993b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_bounded_iou_1x_coco_20200505_160738.log.json) | + +## Pre-trained Models + +We also train some models with longer schedules and multi-scale training. The users could finetune them for downstream tasks. + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-C4](./faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py) | caffe | 1x | - | | 35.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco/faster_rcnn_r50_caffe_c4_mstrain_1x_coco_20220316_150527-db276fed.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco/faster_rcnn_r50_caffe_c4_mstrain_1x_coco_20220316_150527.log.json) | +| [R-50-DC5](./faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py) | caffe | 1x | - | | 37.4 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco_20201028_233851-b33d21b9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco_20201028_233851.log.json) | +| [R-50-DC5](./faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py) | caffe | 3x | - | | 38.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco_20201028_002107-34a53b2c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco_20201028_002107.log.json) | +| [R-50-FPN](./faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py) | caffe | 2x | 3.7 | | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco_bbox_mAP-0.397_20200504_231813-10b2de58.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco_20200504_231813.log.json) | +| [R-50-FPN](./faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | caffe | 3x | 3.7 | | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054.log.json) | +| [R-50-FPN](./faster_rcnn_r50_fpn_mstrain_3x_coco.py) | pytorch | 3x | 3.9 | | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco/faster_rcnn_r50_fpn_mstrain_3x_coco_20210524_110822-e10bd31c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco/faster_rcnn_r50_fpn_mstrain_3x_coco_20210524_110822.log.json) | +| [R-101-FPN](./faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py) | caffe | 3x | 5.6 | | 42.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210526_095742-a7ae426d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210526_095742.log.json) | +| [R-101-FPN](./faster_rcnn_r101_fpn_mstrain_3x_coco.py) | pytorch | 3x | 5.8 | | 41.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco/faster_rcnn_r101_fpn_mstrain_3x_coco_20210524_110822-4d4d2ca8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco/faster_rcnn_r101_fpn_mstrain_3x_coco_20210524_110822.log.json) | +| [X-101-32x4d-FPN](./faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py) | pytorch | 3x | 7.0 | | 42.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210524_124151-16b9b260.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210524_124151.log.json) | +| [X-101-32x8d-FPN](./faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py) | pytorch | 3x | 10.1 | | 42.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210604_182954-002e082a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210604_182954.log.json) | +| [X-101-64x4d-FPN](./faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py) | pytorch | 3x | 10.0 | | 43.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210524_124528-26c63de6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210524_124528.log.json) | + +We further finetune some pre-trained models on the COCO subsets, which only contain only a few of the 80 categories. + +| Backbone | Style | Class name | Pre-traind model | Mem (GB) | box AP | Config | Download | +| ----------------------------------------------------------------------------- | ----- | ------------------ | ------------------------------------------------------------------- | -------- | ------ | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [R-50-FPN](./faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py) | caffe | person | [R-50-FPN-Caffe-3x](./faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | 3.7 | 55.8 | [config](./faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco-person/faster_rcnn_r50_fpn_1x_coco-person_20201216_175929-d022e227.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco-person/faster_rcnn_r50_fpn_1x_coco-person_20201216_175929.log.json) | +| [R-50-FPN](./faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py) | caffe | person-bicycle-car | [R-50-FPN-Caffe-3x](./faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | 3.7 | 44.1 | [config](./faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco-person-bicycle-car/faster_rcnn_r50_fpn_1x_coco-person-bicycle-car_20201216_173117-6eda6d92.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco-person-bicycle-car/faster_rcnn_r50_fpn_1x_coco-person-bicycle-car_20201216_173117.log.json) | + +## Torchvision New Receipe (TNR) + +Torchvision released its high-precision ResNet models. The training details can be found on the [Pytorch website](https://pytorch.org/blog/how-to-train-state-of-the-art-models-using-torchvision-latest-primitives/). Here, we have done grid searches on learning rate and weight decay and found the optimal hyper-parameter on the detection task. + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-TNR](./faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py) | pytorch | 1x | - | | 40.2 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco_20220320_085147-efedfda4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco_20220320_085147.log.json) | + +## Citation + +```latex +@article{Ren_2017, + title={Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks}, + journal={IEEE Transactions on Pattern Analysis and Machine Intelligence}, + publisher={Institute of Electrical and Electronics Engineers (IEEE)}, + author={Ren, Shaoqing and He, Kaiming and Girshick, Ross and Sun, Jian}, + year={2017}, + month={Jun}, +} +``` diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..c6f078c --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './faster_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..6a13fe9 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,49 @@ +_base_ = 'faster_rcnn_r50_fpn_mstrain_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..1de53a6 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py new file mode 100644 index 0000000..0d41599 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..0b498bb --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'faster_rcnn_r50_fpn_mstrain_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py new file mode 100644 index 0000000..b071962 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_caffe_c4.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py new file mode 100644 index 0000000..f4d83e6 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py @@ -0,0 +1,38 @@ +_base_ = './faster_rcnn_r50_caffe_c4_1x_coco.py' +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py new file mode 100644 index 0000000..ee2010c --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_caffe_dc5.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py new file mode 100644 index 0000000..14eaef2 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py @@ -0,0 +1,42 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_caffe_dc5.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py new file mode 100644 index 0000000..403747f --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = './faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py' +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..56c01bd --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,41 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_90k_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_90k_coco.py new file mode 100644 index 0000000..b5aea6a --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_90k_coco.py @@ -0,0 +1,15 @@ +_base_ = 'faster_rcnn_r50_caffe_fpn_1x_coco.py' + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[60000, 80000]) + +# Runner type +runner = dict(_delete_=True, type='IterBasedRunner', max_iters=90000) + +checkpoint_config = dict(interval=10000) +evaluation = dict(interval=10000, metric='bbox') diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py new file mode 100644 index 0000000..4f1f376 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py @@ -0,0 +1,9 @@ +_base_ = './faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' +model = dict(roi_head=dict(bbox_head=dict(num_classes=3))) +classes = ('person', 'bicycle', 'car') +data = dict( + train=dict(classes=classes), + val=dict(classes=classes), + test=dict(classes=classes)) + +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_bbox_mAP-0.398_20200504_163323-30042637.pth' # noqa diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py new file mode 100644 index 0000000..b5dfb4f --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py @@ -0,0 +1,9 @@ +_base_ = './faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' +model = dict(roi_head=dict(bbox_head=dict(num_classes=1))) +classes = ('person', ) +data = dict( + train=dict(classes=classes), + val=dict(classes=classes), + test=dict(classes=classes)) + +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_bbox_mAP-0.398_20200504_163323-30042637.pth' # noqa diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py new file mode 100644 index 0000000..f807a19 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py @@ -0,0 +1,46 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..df58973 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..9eeaace --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,47 @@ +_base_ = 'faster_rcnn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_90k_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_90k_coco.py new file mode 100644 index 0000000..74dca24 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_90k_coco.py @@ -0,0 +1,15 @@ +_base_ = 'faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[60000, 80000]) + +# Runner type +runner = dict(_delete_=True, type='IterBasedRunner', max_iters=90000) + +checkpoint_config = dict(interval=10000) +evaluation = dict(interval=10000, metric='bbox') diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..009bd93 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py new file mode 100644 index 0000000..e77a7fa --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py new file mode 100644 index 0000000..648081f --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_head=dict( + reg_decoded_bbox=True, + loss_bbox=dict(type='BoundedIoULoss', loss_weight=10.0)))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_ciou_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_ciou_1x_coco.py new file mode 100644 index 0000000..886d566 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_ciou_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_head=dict( + reg_decoded_bbox=True, + loss_bbox=dict(type='CIoULoss', loss_weight=12.0)))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py new file mode 100644 index 0000000..acd4040 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py @@ -0,0 +1,3 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +# fp16 settings +fp16 = dict(loss_scale=512.) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py new file mode 100644 index 0000000..5556c49 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_head=dict( + reg_decoded_bbox=True, + loss_bbox=dict(type='GIoULoss', loss_weight=10.0)))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py new file mode 100644 index 0000000..ddf663e --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_head=dict( + reg_decoded_bbox=True, + loss_bbox=dict(type='IoULoss', loss_weight=10.0)))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..faf8f92 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py @@ -0,0 +1,3 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py new file mode 100644 index 0000000..f897e7c --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py @@ -0,0 +1,2 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict(train_cfg=dict(rcnn=dict(sampler=dict(type='OHEMSampler')))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_soft_nms_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_soft_nms_1x_coco.py new file mode 100644 index 0000000..759ae3a --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_soft_nms_1x_coco.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + test_cfg=dict( + rcnn=dict( + score_thr=0.05, + nms=dict(type='soft_nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py new file mode 100644 index 0000000..ecbfb92 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +checkpoint = 'https://download.pytorch.org/models/resnet50-11ad3fa6.pth' +model = dict( + backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint))) + +# `lr` and `weight_decay` have been searched to be optimal. +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0001, + weight_decay=0.1, + paramwise_cfg=dict(norm_decay_mult=0., bypass_duplicate=True)) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..3808c9f --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py new file mode 100644 index 0000000..e93f5d8 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './faster_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..f55985d --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py @@ -0,0 +1,16 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..a5d5aeb --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py @@ -0,0 +1,62 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +# ResNeXt-101-32x8d model trained with Caffe2 at FB, +# so the mean and std need to be changed. +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..8bf2b65 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py new file mode 100644 index 0000000..7ea9b2d --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './faster_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..80397f4 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py @@ -0,0 +1,16 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/faster_rcnn/metafile.yml b/downstream/mmdetection/configs/faster_rcnn/metafile.yml new file mode 100644 index 0000000..91d6751 --- /dev/null +++ b/downstream/mmdetection/configs/faster_rcnn/metafile.yml @@ -0,0 +1,451 @@ +Collections: + - Name: Faster R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - RPN + - ResNet + - RoIPool + Paper: + URL: https://arxiv.org/abs/1506.01497 + Title: "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks" + README: configs/faster_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/faster_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_caffe_c4_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 35.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco/faster_rcnn_r50_caffe_c4_1x_coco_20220316_150152-3f885b85.pth + + - Name: faster_rcnn_r50_caffe_c4_mstrain_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 35.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco/faster_rcnn_r50_caffe_c4_mstrain_1x_coco_20220316_150527-db276fed.pth + + - Name: faster_rcnn_r50_caffe_dc5_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco/faster_rcnn_r50_caffe_dc5_1x_coco_20201030_151909-531f0f43.pth + + - Name: faster_rcnn_r50_caffe_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.8 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco/faster_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.378_20200504_180032-c5925ee5.pth + + - Name: faster_rcnn_r50_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 46.73 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth + + - Name: faster_rcnn_r50_fpn_fp16_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py + Metadata: + Training Memory (GB): 3.4 + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + inference time (ms/im): + - value: 34.72 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP16 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fp16/faster_rcnn_r50_fpn_fp16_1x_coco/faster_rcnn_r50_fpn_fp16_1x_coco_20200204-d4dc1471.pth + + - Name: faster_rcnn_r50_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 46.73 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_2x_coco/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth + + - Name: faster_rcnn_r101_caffe_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.7 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco/faster_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.398_20200504_180057-b269e9dd.pth + + - Name: faster_rcnn_r101_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 64.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_1x_coco/faster_rcnn_r101_fpn_1x_coco_20200130-f513f705.pth + + - Name: faster_rcnn_r101_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 64.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_2x_coco/faster_rcnn_r101_fpn_2x_coco_bbox_mAP-0.398_20200504_210455-1d2dac9c.pth + + - Name: faster_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.2 + inference time (ms/im): + - value: 72.46 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco/faster_rcnn_x101_32x4d_fpn_1x_coco_20200203-cff10310.pth + + - Name: faster_rcnn_x101_32x4d_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 7.2 + inference time (ms/im): + - value: 72.46 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco/faster_rcnn_x101_32x4d_fpn_2x_coco_bbox_mAP-0.412_20200506_041400-64a12c0b.pth + + - Name: faster_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 106.38 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco/faster_rcnn_x101_64x4d_fpn_1x_coco_20200204-833ee192.pth + + - Name: faster_rcnn_x101_64x4d_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 106.38 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco/faster_rcnn_x101_64x4d_fpn_2x_coco_20200512_161033-5961fa95.pth + + - Name: faster_rcnn_r50_fpn_iou_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_iou_1x_coco-fdd207f3.pth + + - Name: faster_rcnn_r50_fpn_giou_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_giou_1x_coco-0eada910.pth + + - Name: faster_rcnn_r50_fpn_bounded_iou_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_bounded_iou_1x_coco-98ad993b.pth + + - Name: faster_rcnn_r50_caffe_dc5_mstrain_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco_20201028_233851-b33d21b9.pth + + - Name: faster_rcnn_r50_caffe_dc5_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco_20201028_002107-34a53b2c.pth + + - Name: faster_rcnn_r50_caffe_fpn_mstrain_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco_bbox_mAP-0.397_20200504_231813-10b2de58.pth + + - Name: faster_rcnn_r50_caffe_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 3.7 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth + + - Name: faster_rcnn_r50_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 3.9 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco/faster_rcnn_r50_fpn_mstrain_3x_coco_20210524_110822-e10bd31c.pth + + - Name: faster_rcnn_r101_caffe_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.6 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210526_095742-a7ae426d.pth + + - Name: faster_rcnn_r101_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.8 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco/faster_rcnn_r101_fpn_mstrain_3x_coco_20210524_110822-4d4d2ca8.pth + + - Name: faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 7.0 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210524_124151-16b9b260.pth + + - Name: faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 10.1 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210604_182954-002e082a.pth + + - Name: faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 10.0 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210524_124528-26c63de6.pth + + - Name: faster_rcnn_r50_fpn_tnr-pretrain_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 46.73 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco_20220320_085147-efedfda4.pth diff --git a/downstream/mmdetection/configs/fcos/README.md b/downstream/mmdetection/configs/fcos/README.md new file mode 100644 index 0000000..76be365 --- /dev/null +++ b/downstream/mmdetection/configs/fcos/README.md @@ -0,0 +1,45 @@ +# FCOS + +> [FCOS: Fully Convolutional One-Stage Object Detection](https://arxiv.org/abs/1904.01355) + + + +## Abstract + +We propose a fully convolutional one-stage object detector (FCOS) to solve object detection in a per-pixel prediction fashion, analogue to semantic segmentation. Almost all state-of-the-art object detectors such as RetinaNet, SSD, YOLOv3, and Faster R-CNN rely on pre-defined anchor boxes. In contrast, our proposed detector FCOS is anchor box free, as well as proposal free. By eliminating the predefined set of anchor boxes, FCOS completely avoids the complicated computation related to anchor boxes such as calculating overlapping during training. More importantly, we also avoid all hyper-parameters related to anchor boxes, which are often very sensitive to the final detection performance. With the only post-processing non-maximum suppression (NMS), FCOS with ResNeXt-64x4d-101 achieves 44.7% in AP with single-model and single-scale testing, surpassing previous one-stage detectors with the advantage of being much simpler. For the first time, we demonstrate a much simpler and flexible detection framework achieving improved detection accuracy. We hope that the proposed FCOS framework can serve as a simple and strong alternative for many other instance-level tasks. + +
    + +
    + +## Results and Models + +| Backbone | Style | GN | MS train | Tricks | DCN | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :---: | :-: | :------: | :----: | :-: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | caffe | Y | N | N | N | 1x | 3.6 | 22.7 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco/fcos_r50_caffe_fpn_gn-head_1x_coco-821213aa.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco/20201227_180009.log.json) | +| R-50 | caffe | Y | N | Y | N | 1x | 3.7 | - | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco-0a0d75a8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco/20210105_135818.log.json) | +| R-50 | caffe | Y | N | Y | Y | 1x | 3.8 | - | 42.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco-ae4d8b3d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco/20210105_224556.log.json) | +| R-101 | caffe | Y | N | N | N | 1x | 5.5 | 17.3 | 39.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco/fcos_r101_caffe_fpn_gn-head_1x_coco-0e37b982.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco/20210103_155046.log.json) | + +| Backbone | Style | GN | MS train | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-: | :------: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | caffe | Y | Y | 2x | 2.6 | 22.9 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco-d92ceeea.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco/20201227_161900.log.json) | +| R-101 | caffe | Y | Y | 2x | 5.5 | 17.3 | 40.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco-511424d6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco/20210103_155046.log.json) | +| X-101 | pytorch | Y | Y | 2x | 10.0 | 9.7 | 42.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco-ede514a8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco/20210114_133041.log.json) | + +**Notes:** + +- The X-101 backbone is X-101-64x4d. +- Tricks means setting `norm_on_bbox`, `centerness_on_reg`, `center_sampling` as `True`. +- DCN means using `DCNv2` in both backbone and head. + +## Citation + +```latex +@article{tian2019fcos, + title={FCOS: Fully Convolutional One-Stage Object Detection}, + author={Tian, Zhi and Shen, Chunhua and Chen, Hao and He, Tong}, + journal={arXiv preprint arXiv:1904.01355}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py b/downstream/mmdetection/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..2699bdb --- /dev/null +++ b/downstream/mmdetection/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py @@ -0,0 +1,54 @@ +_base_ = 'fcos_r50_caffe_fpn_gn-head_1x_coco.py' + +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + bbox_head=dict( + norm_on_bbox=True, + centerness_on_reg=True, + dcn_on_last_conv=False, + center_sampling=True, + conv_bias=True, + loss_bbox=dict(type='GIoULoss', loss_weight=1.0)), + # training and testing settings + test_cfg=dict(nms=dict(type='nms', iou_threshold=0.6))) + +# dataset settings +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer_config = dict(_delete_=True, grad_clip=None) + +lr_config = dict(warmup='linear') diff --git a/downstream/mmdetection/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py b/downstream/mmdetection/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py new file mode 100644 index 0000000..cf93c91 --- /dev/null +++ b/downstream/mmdetection/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py @@ -0,0 +1,56 @@ +_base_ = 'fcos_r50_caffe_fpn_gn-head_1x_coco.py' + +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + bbox_head=dict( + norm_on_bbox=True, + centerness_on_reg=True, + dcn_on_last_conv=True, + center_sampling=True, + conv_bias=True, + loss_bbox=dict(type='GIoULoss', loss_weight=1.0)), + # training and testing settings + test_cfg=dict(nms=dict(type='nms', iou_threshold=0.6))) + +# dataset settings +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer_config = dict(_delete_=True, grad_clip=None) + +lr_config = dict(warmup='linear') diff --git a/downstream/mmdetection/configs/fcos/fcos_center_r50_caffe_fpn_gn-head_1x_coco.py b/downstream/mmdetection/configs/fcos/fcos_center_r50_caffe_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..9f502e7 --- /dev/null +++ b/downstream/mmdetection/configs/fcos/fcos_center_r50_caffe_fpn_gn-head_1x_coco.py @@ -0,0 +1,2 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +model = dict(bbox_head=dict(center_sampling=True, center_sample_radius=1.5)) diff --git a/downstream/mmdetection/configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py b/downstream/mmdetection/configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..45bea48 --- /dev/null +++ b/downstream/mmdetection/configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py b/downstream/mmdetection/configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py new file mode 100644 index 0000000..f4d36f1 --- /dev/null +++ b/downstream/mmdetection/configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py @@ -0,0 +1,47 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet101_caffe'))) +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py b/downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..955787b --- /dev/null +++ b/downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py @@ -0,0 +1,106 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + type='FCOS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet50_caffe')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', # use P5 + num_outs=5, + relu_before_extra_convs=True), + bbox_head=dict( + type='FCOSHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', loss_weight=1.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + lr=0.01, paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='constant', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[8, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py b/downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..2816b16 --- /dev/null +++ b/downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py @@ -0,0 +1,4 @@ +# TODO: Remove this config after benchmarking all related configs +_base_ = 'fcos_r50_caffe_fpn_gn-head_1x_coco.py' + +data = dict(samples_per_gpu=4, workers_per_gpu=4) diff --git a/downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py b/downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py new file mode 100644 index 0000000..497d03f --- /dev/null +++ b/downstream/mmdetection/configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py @@ -0,0 +1,39 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py b/downstream/mmdetection/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py new file mode 100644 index 0000000..e70e465 --- /dev/null +++ b/downstream/mmdetection/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py @@ -0,0 +1,60 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + lr=0.01, paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/fcos/metafile.yml b/downstream/mmdetection/configs/fcos/metafile.yml new file mode 100644 index 0000000..ae922eb --- /dev/null +++ b/downstream/mmdetection/configs/fcos/metafile.yml @@ -0,0 +1,146 @@ +Collections: + - Name: FCOS + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - Group Normalization + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.01355 + Title: 'FCOS: Fully Convolutional One-Stage Object Detection' + README: configs/fcos/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/fcos.py#L6 + Version: v2.0.0 + +Models: + - Name: fcos_r50_caffe_fpn_gn-head_1x_coco + In Collection: FCOS + Config: configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py + Metadata: + Training Memory (GB): 3.6 + inference time (ms/im): + - value: 44.05 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco/fcos_r50_caffe_fpn_gn-head_1x_coco-821213aa.pth + + - Name: fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco + In Collection: FCOS + Config: configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py + Metadata: + Training Memory (GB): 3.7 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco-0a0d75a8.pth + + - Name: fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco + In Collection: FCOS + Config: configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py + Metadata: + Training Memory (GB): 3.8 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco-ae4d8b3d.pth + + - Name: fcos_r101_caffe_fpn_gn-head_1x_coco + In Collection: FCOS + Config: configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + inference time (ms/im): + - value: 57.8 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco/fcos_r101_caffe_fpn_gn-head_1x_coco-0e37b982.pth + + - Name: fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco + In Collection: FCOS + Config: configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py + Metadata: + Training Memory (GB): 2.6 + inference time (ms/im): + - value: 43.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco-d92ceeea.pth + + - Name: fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco + In Collection: FCOS + Config: configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py + Metadata: + Training Memory (GB): 5.5 + inference time (ms/im): + - value: 57.8 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco-511424d6.pth + + - Name: fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco + In Collection: FCOS + Config: configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py + Metadata: + Training Memory (GB): 10.0 + inference time (ms/im): + - value: 103.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco-ede514a8.pth diff --git a/downstream/mmdetection/configs/foveabox/README.md b/downstream/mmdetection/configs/foveabox/README.md new file mode 100644 index 0000000..7fcd094 --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/README.md @@ -0,0 +1,53 @@ +# FoveaBox + +> [FoveaBox: Beyond Anchor-based Object Detector](https://arxiv.org/abs/1904.03797) + + + +## Abstract + +We present FoveaBox, an accurate, flexible, and completely anchor-free framework for object detection. While almost all state-of-the-art object detectors utilize predefined anchors to enumerate possible locations, scales and aspect ratios for the search of the objects, their performance and generalization ability are also limited to the design of anchors. Instead, FoveaBox directly learns the object existing possibility and the bounding box coordinates without anchor reference. This is achieved by: (a) predicting category-sensitive semantic maps for the object existing possibility, and (b) producing category-agnostic bounding box for each position that potentially contains an object. The scales of target boxes are naturally associated with feature pyramid representations. In FoveaBox, an instance is assigned to adjacent feature levels to make the model more accurate.We demonstrate its effectiveness on standard benchmarks and report extensive experimental analysis. Without bells and whistles, FoveaBox achieves state-of-the-art single model performance on the standard COCO and Pascal VOC object detection benchmark. More importantly, FoveaBox avoids all computation and hyper-parameters related to anchor boxes, which are often sensitive to the final detection performance. We believe the simple and effective approach will serve as a solid baseline and help ease future research for object detection. + +
    + +
    + +## Introduction + +FoveaBox is an accurate, flexible and completely anchor-free object detection system for object detection framework, as presented in our paper [https://arxiv.org/abs/1904.03797](https://arxiv.org/abs/1904.03797): +Different from previous anchor-based methods, FoveaBox directly learns the object existing possibility and the bounding box coordinates without anchor reference. This is achieved by: (a) predicting category-sensitive semantic maps for the object existing possibility, and (b) producing category-agnostic bounding box for each position that potentially contains an object. + +## Results and Models + +### Results on R50/101-FPN + +| Backbone | Style | align | ms-train | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :---: | :------: | :-----: | :------: | :------------: | :----: | :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | N | N | 1x | 5.6 | 24.1 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_1x_coco/fovea_r50_fpn_4x4_1x_coco_20200219-ee4d5303.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_1x_coco/fovea_r50_fpn_4x4_1x_coco_20200219_223025.log.json) | +| R-50 | pytorch | N | N | 2x | 5.6 | - | 37.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_2x_coco/fovea_r50_fpn_4x4_2x_coco_20200203-2df792b1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_2x_coco/fovea_r50_fpn_4x4_2x_coco_20200203_112043.log.json) | +| R-50 | pytorch | Y | N | 2x | 8.1 | 19.4 | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco/fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203-8987880d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco/fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203_134252.log.json) | +| R-50 | pytorch | Y | Y | 2x | 8.1 | 18.3 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200205-85ce26cb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200205_112557.log.json) | +| R-101 | pytorch | N | N | 1x | 9.2 | 17.4 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_1x_coco/fovea_r101_fpn_4x4_1x_coco_20200219-05e38f1c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_1x_coco/fovea_r101_fpn_4x4_1x_coco_20200219_011740.log.json) | +| R-101 | pytorch | N | N | 2x | 11.7 | - | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_2x_coco/fovea_r101_fpn_4x4_2x_coco_20200208-02320ea4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_2x_coco/fovea_r101_fpn_4x4_2x_coco_20200208_202059.log.json) | +| R-101 | pytorch | Y | N | 2x | 11.7 | 14.7 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco/fovea_align_r101_fpn_gn-head_4x4_2x_coco_20200208-c39a027a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco/fovea_align_r101_fpn_gn-head_4x4_2x_coco_20200208_203337.log.json) | +| R-101 | pytorch | Y | Y | 2x | 11.7 | 14.7 | 42.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200208-649c5eb6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200208_202124.log.json) | + +\[1\] *1x and 2x mean the model is trained for 12 and 24 epochs, respectively.* \ +\[2\] *Align means utilizing deformable convolution to align the cls branch.* \ +\[3\] *All results are obtained with a single model and without any test time data augmentation.*\ +\[4\] *We use 4 GPUs for training.* + +Any pull requests or issues are welcome. + +## Citation + +Please consider citing our paper in your publications if the project helps your research. BibTeX reference is as follows. + +```latex +@article{kong2019foveabox, + title={FoveaBox: Beyond Anchor-based Object Detector}, + author={Kong, Tao and Sun, Fuchun and Liu, Huaping and Jiang, Yuning and Shi, Jianbo}, + journal={arXiv preprint arXiv:1904.03797}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py b/downstream/mmdetection/configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py new file mode 100644 index 0000000..c5d1784 --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py @@ -0,0 +1,12 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + bbox_head=dict( + with_deform=True, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py b/downstream/mmdetection/configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..cc5affe --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,29 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + bbox_head=dict( + with_deform=True, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py b/downstream/mmdetection/configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py new file mode 100644 index 0000000..e7265bc --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py @@ -0,0 +1,10 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + bbox_head=dict( + with_deform=True, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py b/downstream/mmdetection/configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..8fc39be --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,25 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + bbox_head=dict( + with_deform=True, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py b/downstream/mmdetection/configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py new file mode 100644 index 0000000..9201af1 --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py b/downstream/mmdetection/configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py new file mode 100644 index 0000000..1ef5243 --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fovea_r50_fpn_4x4_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py b/downstream/mmdetection/configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py new file mode 100644 index 0000000..7e986eb --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py @@ -0,0 +1,52 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + type='FOVEA', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + num_outs=5, + add_extra_convs='on_input'), + bbox_head=dict( + type='FoveaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + base_edge_list=[16, 32, 64, 128, 256], + scale_ranges=((1, 64), (32, 128), (64, 256), (128, 512), (256, 2048)), + sigma=0.4, + with_deform=False, + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=1.50, + alpha=0.4, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), + # training and testing settings + train_cfg=dict(), + test_cfg=dict( + nms_pre=1000, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) +data = dict(samples_per_gpu=4, workers_per_gpu=4) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py b/downstream/mmdetection/configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py new file mode 100644 index 0000000..68ce4d2 --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/foveabox/metafile.yml b/downstream/mmdetection/configs/foveabox/metafile.yml new file mode 100644 index 0000000..fe9a283 --- /dev/null +++ b/downstream/mmdetection/configs/foveabox/metafile.yml @@ -0,0 +1,172 @@ +Collections: + - Name: FoveaBox + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 4x V100 GPUs + Architecture: + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.03797 + Title: 'FoveaBox: Beyond Anchor-based Object Detector' + README: configs/foveabox/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/fovea.py#L6 + Version: v2.0.0 + +Models: + - Name: fovea_r50_fpn_4x4_1x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py + Metadata: + Training Memory (GB): 5.6 + inference time (ms/im): + - value: 41.49 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_1x_coco/fovea_r50_fpn_4x4_1x_coco_20200219-ee4d5303.pth + + - Name: fovea_r50_fpn_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py + Metadata: + Training Memory (GB): 5.6 + inference time (ms/im): + - value: 41.49 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_2x_coco/fovea_r50_fpn_4x4_2x_coco_20200203-2df792b1.pth + + - Name: fovea_align_r50_fpn_gn-head_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py + Metadata: + Training Memory (GB): 8.1 + inference time (ms/im): + - value: 51.55 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco/fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203-8987880d.pth + + - Name: fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Memory (GB): 8.1 + inference time (ms/im): + - value: 54.64 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200205-85ce26cb.pth + + - Name: fovea_r101_fpn_4x4_1x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py + Metadata: + Training Memory (GB): 9.2 + inference time (ms/im): + - value: 57.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_1x_coco/fovea_r101_fpn_4x4_1x_coco_20200219-05e38f1c.pth + + - Name: fovea_r101_fpn_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py + Metadata: + Training Memory (GB): 11.7 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_2x_coco/fovea_r101_fpn_4x4_2x_coco_20200208-02320ea4.pth + + - Name: fovea_align_r101_fpn_gn-head_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py + Metadata: + Training Memory (GB): 11.7 + inference time (ms/im): + - value: 68.03 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco/fovea_align_r101_fpn_gn-head_4x4_2x_coco_20200208-c39a027a.pth + + - Name: fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Memory (GB): 11.7 + inference time (ms/im): + - value: 68.03 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200208-649c5eb6.pth diff --git a/downstream/mmdetection/configs/fpg/README.md b/downstream/mmdetection/configs/fpg/README.md new file mode 100644 index 0000000..c9bb1fe --- /dev/null +++ b/downstream/mmdetection/configs/fpg/README.md @@ -0,0 +1,43 @@ +# FPG + +> [Feature Pyramid Grids](https://arxiv.org/abs/2004.03580) + + + +## Abstract + +Feature pyramid networks have been widely adopted in the object detection literature to improve feature representations for better handling of variations in scale. In this paper, we present Feature Pyramid Grids (FPG), a deep multi-pathway feature pyramid, that represents the feature scale-space as a regular grid of parallel bottom-up pathways which are fused by multi-directional lateral connections. FPG can improve single-pathway feature pyramid networks by significantly increasing its performance at similar computation cost, highlighting importance of deep pyramid representations. In addition to its general and uniform structure, over complicated structures that have been found with neural architecture search, it also compares favorably against such approaches without relying on search. We hope that FPG with its uniform and effective nature can serve as a strong component for future work in object recognition. + +
    + +
    + +## Results and Models + +We benchmark the new training schedule (crop training, large batch, unfrozen BN, 50 epochs) introduced in NAS-FPN. +All backbones are Resnet-50 in pytorch style. + +| Method | Neck | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :--------: | :-----: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | FPG | 50e | 20.0 | - | 42.3 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg_crop640_50e_coco/faster_rcnn_r50_fpg_crop640_50e_coco_20220311_011856-74109f42.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg_crop640_50e_coco/faster_rcnn_r50_fpg_crop640_50e_coco_20220311_011856.log.json) | +| Faster R-CNN | FPG-chn128 | 50e | 11.9 | - | 41.2 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco/faster_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011857-9376aa9d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco/faster_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011857.log.json) | +| Faster R-CNN | FPN | 50e | 20.0 | - | 38.9 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/faster_rcnn_r50_fpn_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpn_crop640_50e_coco/faster_rcnn_r50_fpn_crop640_50e_coco_20220311_011857-be7c9f42.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpn_crop640_50e_coco/faster_rcnn_r50_fpn_crop640_50e_coco_20220311_011857.log.json) | +| Mask R-CNN | FPG | 50e | 23.2 | - | 43.0 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg_crop640_50e_coco/mask_rcnn_r50_fpg_crop640_50e_coco_20220311_011857-233b8334.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg_crop640_50e_coco/mask_rcnn_r50_fpg_crop640_50e_coco_20220311_011857.log.json) | +| Mask R-CNN | FPG-chn128 | 50e | 15.3 | - | 41.7 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco/mask_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011859-043c9b4e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco/mask_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011859.log.json) | +| Mask R-CNN | FPN | 50e | 23.2 | - | 49.6 | 35.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpn_crop640_50e_coco/mask_rcnn_r50_fpn_crop640_50e_coco_20220311_011855-a756664a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpn_crop640_50e_coco/mask_rcnn_r50_fpn_crop640_50e_coco_20220311_011855.log.json) | +| RetinaNet | FPG | 50e | 20.8 | - | 40.5 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg_crop640_50e_coco/retinanet_r50_fpg_crop640_50e_coco_20220311_110809-b0bcf5f4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg_crop640_50e_coco/retinanet_r50_fpg_crop640_50e_coco_20220311_110809.log.json) | +| RetinaNet | FPG-chn128 | 50e | 19.9 | - | 39.9 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco/retinanet_r50_fpg-chn128_crop640_50e_coco_20220313_104829-ee99a686.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco/retinanet_r50_fpg-chn128_crop640_50e_coco_20220313_104829.log.json) | + +**Note**: Chn128 means to decrease the number of channels of features and convs from 256 (default) to 128 in +Neck and BBox Head, which can greatly decrease memory consumption without sacrificing much precision. + +## Citation + +```latex +@article{chen2020feature, + title={Feature pyramid grids}, + author={Chen, Kai and Cao, Yuhang and Loy, Chen Change and Lin, Dahua and Feichtenhofer, Christoph}, + journal={arXiv preprint arXiv:2004.03580}, + year={2020} +} +``` diff --git a/downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py b/downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py new file mode 100644 index 0000000..4535034 --- /dev/null +++ b/downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py @@ -0,0 +1,9 @@ +_base_ = 'faster_rcnn_r50_fpg_crop640_50e_coco.py' + +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + neck=dict(out_channels=128, inter_channels=128), + rpn_head=dict(in_channels=128), + roi_head=dict( + bbox_roi_extractor=dict(out_channels=128), + bbox_head=dict(in_channels=128))) diff --git a/downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py b/downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py new file mode 100644 index 0000000..3ab2a2c --- /dev/null +++ b/downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py @@ -0,0 +1,48 @@ +_base_ = 'faster_rcnn_r50_fpn_crop640_50e_coco.py' + +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + neck=dict( + type='FPG', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + inter_channels=256, + num_outs=5, + stack_times=9, + paths=['bu'] * 9, + same_down_trans=None, + same_up_trans=dict( + type='conv', + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_lateral_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_down_trans=dict( + type='interpolation_conv', + mode='nearest', + kernel_size=3, + norm_cfg=norm_cfg, + order=('act', 'conv', 'norm'), + inplace=False), + across_up_trans=None, + across_skip_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + output_trans=dict( + type='last_conv', + kernel_size=3, + order=('act', 'conv', 'norm'), + inplace=False), + norm_cfg=norm_cfg, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()])) diff --git a/downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpn_crop640_50e_coco.py b/downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpn_crop640_50e_coco.py new file mode 100644 index 0000000..e4ec940 --- /dev/null +++ b/downstream/mmdetection/configs/fpg/faster_rcnn_r50_fpn_crop640_50e_coco.py @@ -0,0 +1,73 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg, norm_eval=False), + neck=dict(norm_cfg=norm_cfg), + roi_head=dict(bbox_head=dict(norm_cfg=norm_cfg))) +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=(640, 640), + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(640, 640)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=(640, 640)), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(640, 640), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +optimizer = dict( + type='SGD', + lr=0.08, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[30, 40]) +# runtime settings +runner = dict(max_epochs=50) +evaluation = dict(interval=2) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py b/downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py new file mode 100644 index 0000000..baa4a5a --- /dev/null +++ b/downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py @@ -0,0 +1,10 @@ +_base_ = 'mask_rcnn_r50_fpg_crop640_50e_coco.py' + +model = dict( + neck=dict(out_channels=128, inter_channels=128), + rpn_head=dict(in_channels=128), + roi_head=dict( + bbox_roi_extractor=dict(out_channels=128), + bbox_head=dict(in_channels=128), + mask_roi_extractor=dict(out_channels=128), + mask_head=dict(in_channels=128))) diff --git a/downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py b/downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py new file mode 100644 index 0000000..3c9ea27 --- /dev/null +++ b/downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py @@ -0,0 +1,48 @@ +_base_ = 'mask_rcnn_r50_fpn_crop640_50e_coco.py' + +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + neck=dict( + type='FPG', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + inter_channels=256, + num_outs=5, + stack_times=9, + paths=['bu'] * 9, + same_down_trans=None, + same_up_trans=dict( + type='conv', + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_lateral_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_down_trans=dict( + type='interpolation_conv', + mode='nearest', + kernel_size=3, + norm_cfg=norm_cfg, + order=('act', 'conv', 'norm'), + inplace=False), + across_up_trans=None, + across_skip_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + output_trans=dict( + type='last_conv', + kernel_size=3, + order=('act', 'conv', 'norm'), + inplace=False), + norm_cfg=norm_cfg, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()])) diff --git a/downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py b/downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py new file mode 100644 index 0000000..c6bcc24 --- /dev/null +++ b/downstream/mmdetection/configs/fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py @@ -0,0 +1,79 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg, norm_eval=False), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + norm_cfg=norm_cfg, + num_outs=5), + roi_head=dict( + bbox_head=dict(norm_cfg=norm_cfg), mask_head=dict(norm_cfg=norm_cfg))) +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=(640, 640), + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(640, 640)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=(640, 640)), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(640, 640), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +optimizer = dict( + type='SGD', + lr=0.08, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[30, 40]) +# runtime settings +runner = dict(max_epochs=50) +evaluation = dict(interval=2) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/fpg/metafile.yml b/downstream/mmdetection/configs/fpg/metafile.yml new file mode 100644 index 0000000..6b0a6a7 --- /dev/null +++ b/downstream/mmdetection/configs/fpg/metafile.yml @@ -0,0 +1,104 @@ +Collections: + - Name: Feature Pyramid Grids + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Feature Pyramid Grids + Paper: + URL: https://arxiv.org/abs/2004.03580 + Title: 'Feature Pyramid Grids' + README: configs/fpg/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.10.0/mmdet/models/necks/fpg.py#L101 + Version: v2.10.0 + +Models: + - Name: faster_rcnn_r50_fpg_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py + Metadata: + Training Memory (GB): 20.0 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg_crop640_50e_coco/faster_rcnn_r50_fpg_crop640_50e_coco_20220311_011856-74109f42.pth + + - Name: faster_rcnn_r50_fpg-chn128_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py + Metadata: + Training Memory (GB): 11.9 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco/faster_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011857-9376aa9d.pth + + - Name: mask_rcnn_r50_fpg_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py + Metadata: + Training Memory (GB): 23.2 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg_crop640_50e_coco/mask_rcnn_r50_fpg_crop640_50e_coco_20220311_011857-233b8334.pth + + - Name: mask_rcnn_r50_fpg-chn128_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py + Metadata: + Training Memory (GB): 15.3 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco/mask_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011859-043c9b4e.pth + + - Name: retinanet_r50_fpg_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py + Metadata: + Training Memory (GB): 20.8 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg_crop640_50e_coco/retinanet_r50_fpg_crop640_50e_coco_20220311_110809-b0bcf5f4.pth + + - Name: retinanet_r50_fpg-chn128_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py + Metadata: + Training Memory (GB): 19.9 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco/retinanet_r50_fpg-chn128_crop640_50e_coco_20220313_104829-ee99a686.pth diff --git a/downstream/mmdetection/configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py b/downstream/mmdetection/configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py new file mode 100644 index 0000000..9a6cf7e --- /dev/null +++ b/downstream/mmdetection/configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py @@ -0,0 +1,5 @@ +_base_ = 'retinanet_r50_fpg_crop640_50e_coco.py' + +model = dict( + neck=dict(out_channels=128, inter_channels=128), + bbox_head=dict(in_channels=128)) diff --git a/downstream/mmdetection/configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py b/downstream/mmdetection/configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py new file mode 100644 index 0000000..504ed5e --- /dev/null +++ b/downstream/mmdetection/configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py @@ -0,0 +1,53 @@ +_base_ = '../nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py' + +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + neck=dict( + _delete_=True, + type='FPG', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + inter_channels=256, + num_outs=5, + add_extra_convs=True, + start_level=1, + stack_times=9, + paths=['bu'] * 9, + same_down_trans=None, + same_up_trans=dict( + type='conv', + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_lateral_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_down_trans=dict( + type='interpolation_conv', + mode='nearest', + kernel_size=3, + norm_cfg=norm_cfg, + order=('act', 'conv', 'norm'), + inplace=False), + across_up_trans=None, + across_skip_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + output_trans=dict( + type='last_conv', + kernel_size=3, + order=('act', 'conv', 'norm'), + inplace=False), + norm_cfg=norm_cfg, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()])) + +evaluation = dict(interval=2) diff --git a/downstream/mmdetection/configs/free_anchor/README.md b/downstream/mmdetection/configs/free_anchor/README.md new file mode 100644 index 0000000..d24c340 --- /dev/null +++ b/downstream/mmdetection/configs/free_anchor/README.md @@ -0,0 +1,37 @@ +# FreeAnchor + +> [FreeAnchor: Learning to Match Anchors for Visual Object Detection](https://arxiv.org/abs/1909.02466) + + + +## Abstract + +Modern CNN-based object detectors assign anchors for ground-truth objects under the restriction of object-anchor Intersection-over-Unit (IoU). In this study, we propose a learning-to-match approach to break IoU restriction, allowing objects to match anchors in a flexible manner. Our approach, referred to as FreeAnchor, updates hand-crafted anchor assignment to "free" anchor matching by formulating detector training as a maximum likelihood estimation (MLE) procedure. FreeAnchor targets at learning features which best explain a class of objects in terms of both classification and localization. FreeAnchor is implemented by optimizing detection customized likelihood and can be fused with CNN-based detectors in a plug-and-play manner. Experiments on COCO demonstrate that FreeAnchor consistently outperforms their counterparts with significant margins. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------: | :-----: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | 4.9 | 18.4 | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco/retinanet_free_anchor_r50_fpn_1x_coco_20200130-0f67375f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco/retinanet_free_anchor_r50_fpn_1x_coco_20200130_095625.log.json) | +| R-101 | pytorch | 1x | 6.8 | 14.9 | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco/retinanet_free_anchor_r101_fpn_1x_coco_20200130-358324e6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco/retinanet_free_anchor_r101_fpn_1x_coco_20200130_100723.log.json) | +| X-101-32x4d | pytorch | 1x | 8.1 | 11.1 | 41.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco/retinanet_free_anchor_x101_32x4d_fpn_1x_coco_20200130-d4846968.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco/retinanet_free_anchor_x101_32x4d_fpn_1x_coco_20200130_095627.log.json) | + +**Notes:** + +- We use 8 GPUs with 2 images/GPU. +- For more settings and models, please refer to the [official repo](https://github.com/zhangxiaosong18/FreeAnchor). + +## Citation + +```latex +@inproceedings{zhang2019freeanchor, + title = {{FreeAnchor}: Learning to Match Anchors for Visual Object Detection}, + author = {Zhang, Xiaosong and Wan, Fang and Liu, Chang and Ji, Rongrong and Ye, Qixiang}, + booktitle = {Neural Information Processing Systems}, + year = {2019} +} +``` diff --git a/downstream/mmdetection/configs/free_anchor/metafile.yml b/downstream/mmdetection/configs/free_anchor/metafile.yml new file mode 100644 index 0000000..170fb5c --- /dev/null +++ b/downstream/mmdetection/configs/free_anchor/metafile.yml @@ -0,0 +1,79 @@ +Collections: + - Name: FreeAnchor + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FreeAnchor + - ResNet + Paper: + URL: https://arxiv.org/abs/1909.02466 + Title: 'FreeAnchor: Learning to Match Anchors for Visual Object Detection' + README: configs/free_anchor/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/dense_heads/free_anchor_retina_head.py#L10 + Version: v2.0.0 + +Models: + - Name: retinanet_free_anchor_r50_fpn_1x_coco + In Collection: FreeAnchor + Config: configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.9 + inference time (ms/im): + - value: 54.35 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco/retinanet_free_anchor_r50_fpn_1x_coco_20200130-0f67375f.pth + + - Name: retinanet_free_anchor_r101_fpn_1x_coco + In Collection: FreeAnchor + Config: configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.8 + inference time (ms/im): + - value: 67.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco/retinanet_free_anchor_r101_fpn_1x_coco_20200130-358324e6.pth + + - Name: retinanet_free_anchor_x101_32x4d_fpn_1x_coco + In Collection: FreeAnchor + Config: configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.1 + inference time (ms/im): + - value: 90.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco/retinanet_free_anchor_x101_32x4d_fpn_1x_coco_20200130-d4846968.pth diff --git a/downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py new file mode 100644 index 0000000..f4aea53 --- /dev/null +++ b/downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './retinanet_free_anchor_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py new file mode 100644 index 0000000..28f983c --- /dev/null +++ b/downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py @@ -0,0 +1,22 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +model = dict( + bbox_head=dict( + _delete_=True, + type='FreeAnchorRetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=0.75))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..65f8a9e --- /dev/null +++ b/downstream/mmdetection/configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = './retinanet_free_anchor_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/fsaf/README.md b/downstream/mmdetection/configs/fsaf/README.md new file mode 100644 index 0000000..4392a6e --- /dev/null +++ b/downstream/mmdetection/configs/fsaf/README.md @@ -0,0 +1,57 @@ +# FSAF + +> [Feature Selective Anchor-Free Module for Single-Shot Object Detection](https://arxiv.org/abs/1903.00621) + + + +## Abstract + +We motivate and present feature selective anchor-free (FSAF) module, a simple and effective building block for single-shot object detectors. It can be plugged into single-shot detectors with feature pyramid structure. The FSAF module addresses two limitations brought up by the conventional anchor-based detection: 1) heuristic-guided feature selection; 2) overlap-based anchor sampling. The general concept of the FSAF module is online feature selection applied to the training of multi-level anchor-free branches. Specifically, an anchor-free branch is attached to each level of the feature pyramid, allowing box encoding and decoding in the anchor-free manner at an arbitrary level. During training, we dynamically assign each instance to the most suitable feature level. At the time of inference, the FSAF module can work jointly with anchor-based branches by outputting predictions in parallel. We instantiate this concept with simple implementations of anchor-free branches and online feature selection strategy. Experimental results on the COCO detection track show that our FSAF module performs better than anchor-based counterparts while being faster. When working jointly with anchor-based branches, the FSAF module robustly improves the baseline RetinaNet by a large margin under various settings, while introducing nearly free inference overhead. And the resulting best model can achieve a state-of-the-art 44.6% mAP, outperforming all existing single-shot detectors on COCO. + +
    + +
    + +## Introduction + +FSAF is an anchor-free method published in CVPR2019 ([https://arxiv.org/pdf/1903.00621.pdf](https://arxiv.org/pdf/1903.00621.pdf)). +Actually it is equivalent to the anchor-based method with only one anchor at each feature map position in each FPN level. +And this is how we implemented it. +Only the anchor-free branch is released for its better compatibility with the current framework and less computational budget. + +In the original paper, feature maps within the central 0.2-0.5 area of a gt box are tagged as ignored. However, +it is empirically found that a hard threshold (0.2-0.2) gives a further gain on the performance. (see the table below) + +## Results and Models + +### Results on R50/R101/X101-FPN + +| Backbone | ignore range | ms-train | Lr schd | Train Mem (GB) | Train time (s/iter) | Inf time (fps) | box AP | Config | Download | +| :------: | :----------: | :------: | :-----: | :------------: | :-----------------: | :------------: | :---------: | :---------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | 0.2-0.5 | N | 1x | 3.15 | 0.43 | 12.3 | 36.0 (35.9) | | [model](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_pscale0.2_nscale0.5_r50_fpn_1x_coco/fsaf_pscale0.2_nscale0.5_r50_fpn_1x_coco_20200715-b555b0e0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_pscale0.2_nscale0.5_r50_fpn_1x_coco/fsaf_pscale0.2_nscale0.5_r50_fpn_1x_coco_20200715_094657.log.json) | +| R-50 | 0.2-0.2 | N | 1x | 3.15 | 0.43 | 13.0 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf/fsaf_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r50_fpn_1x_coco/fsaf_r50_fpn_1x_coco-94ccc51f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r50_fpn_1x_coco/fsaf_r50_fpn_1x_coco_20200428_072327.log.json) | +| R-101 | 0.2-0.2 | N | 1x | 5.08 | 0.58 | 10.8 | 39.3 (37.9) | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf/fsaf_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r101_fpn_1x_coco/fsaf_r101_fpn_1x_coco-9e71098f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r101_fpn_1x_coco/fsaf_r101_fpn_1x_coco_20200428_160348.log.json) | +| X-101 | 0.2-0.2 | N | 1x | 9.38 | 1.23 | 5.6 | 42.4 (41.0) | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_x101_64x4d_fpn_1x_coco/fsaf_x101_64x4d_fpn_1x_coco-e3f6e6fd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_x101_64x4d_fpn_1x_coco/fsaf_x101_64x4d_fpn_1x_coco_20200428_160424.log.json) | + +**Notes:** + +- *1x means the model is trained for 12 epochs.* +- *AP values in the brackets represent those reported in the original paper.* +- *All results are obtained with a single model and single-scale test.* +- *X-101 backbone represents ResNext-101-64x4d.* +- *All pretrained backbones use pytorch style.* +- *All models are trained on 8 Titan-XP gpus and tested on a single gpu.* + +## Citation + +BibTeX reference is as follows. + +```latex +@inproceedings{zhu2019feature, + title={Feature Selective Anchor-Free Module for Single-Shot Object Detection}, + author={Zhu, Chenchen and He, Yihui and Savvides, Marios}, + booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, + pages={840--849}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/fsaf/fsaf_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/fsaf/fsaf_r101_fpn_1x_coco.py new file mode 100644 index 0000000..12b49fe --- /dev/null +++ b/downstream/mmdetection/configs/fsaf/fsaf_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fsaf_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/fsaf/fsaf_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/fsaf/fsaf_r50_fpn_1x_coco.py new file mode 100644 index 0000000..67f3ec1 --- /dev/null +++ b/downstream/mmdetection/configs/fsaf/fsaf_r50_fpn_1x_coco.py @@ -0,0 +1,48 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +# model settings +model = dict( + type='FSAF', + bbox_head=dict( + type='FSAFHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + reg_decoded_bbox=True, + # Only anchor-free branch is implemented. The anchor generator only + # generates 1 anchor at each feature point, as a substitute of the + # grid of features. + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=1, + scales_per_octave=1, + ratios=[1.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict(_delete_=True, type='TBLRBBoxCoder', normalizer=4.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0, + reduction='none'), + loss_bbox=dict( + _delete_=True, + type='IoULoss', + eps=1e-6, + loss_weight=1.0, + reduction='none')), + # training and testing settings + train_cfg=dict( + assigner=dict( + _delete_=True, + type='CenterRegionAssigner', + pos_scale=0.2, + neg_scale=0.2, + min_pos_iof=0.01), + allowed_border=-1, + pos_weight=-1, + debug=False)) +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) diff --git a/downstream/mmdetection/configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..89c0c63 --- /dev/null +++ b/downstream/mmdetection/configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './fsaf_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/fsaf/metafile.yml b/downstream/mmdetection/configs/fsaf/metafile.yml new file mode 100644 index 0000000..5434e9a --- /dev/null +++ b/downstream/mmdetection/configs/fsaf/metafile.yml @@ -0,0 +1,80 @@ +Collections: + - Name: FSAF + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x Titan-XP GPUs + Architecture: + - FPN + - FSAF + - ResNet + Paper: + URL: https://arxiv.org/abs/1903.00621 + Title: 'Feature Selective Anchor-Free Module for Single-Shot Object Detection' + README: configs/fsaf/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/detectors/fsaf.py#L6 + Version: v2.1.0 + +Models: + - Name: fsaf_r50_fpn_1x_coco + In Collection: FSAF + Config: configs/fsaf/fsaf_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.15 + inference time (ms/im): + - value: 76.92 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r50_fpn_1x_coco/fsaf_r50_fpn_1x_coco-94ccc51f.pth + + - Name: fsaf_r101_fpn_1x_coco + In Collection: FSAF + Config: configs/fsaf/fsaf_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.08 + inference time (ms/im): + - value: 92.59 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.3 (37.9) + Weights: https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r101_fpn_1x_coco/fsaf_r101_fpn_1x_coco-9e71098f.pth + + - Name: fsaf_x101_64x4d_fpn_1x_coco + In Collection: FSAF + Config: configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 9.38 + inference time (ms/im): + - value: 178.57 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.4 (41.0) + Weights: https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_x101_64x4d_fpn_1x_coco/fsaf_x101_64x4d_fpn_1x_coco-e3f6e6fd.pth diff --git a/downstream/mmdetection/configs/gcnet/README.md b/downstream/mmdetection/configs/gcnet/README.md new file mode 100644 index 0000000..403e086 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/README.md @@ -0,0 +1,69 @@ +# GCNet + +> [GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond](https://arxiv.org/abs/1904.11492) + + + +## Abstract + +The Non-Local Network (NLNet) presents a pioneering approach for capturing long-range dependencies, via aggregating query-specific global context to each query position. However, through a rigorous empirical analysis, we have found that the global contexts modeled by non-local network are almost the same for different query positions within an image. In this paper, we take advantage of this finding to create a simplified network based on a query-independent formulation, which maintains the accuracy of NLNet but with significantly less computation. We further observe that this simplified design shares similar structure with Squeeze-Excitation Network (SENet). Hence we unify them into a three-step general framework for global context modeling. Within the general framework, we design a better instantiation, called the global context (GC) block, which is lightweight and can effectively model the global context. The lightweight property allows us to apply it for multiple layers in a backbone network to construct a global context network (GCNet), which generally outperforms both simplified NLNet and SENet on major benchmarks for various recognition tasks. + +
    + +
    + +## Introduction + +By [Yue Cao](http://yue-cao.me), [Jiarui Xu](http://jerryxu.net), [Stephen Lin](https://scholar.google.com/citations?user=c3PYmxUAAAAJ&hl=en), Fangyun Wei, [Han Hu](https://sites.google.com/site/hanhushomepage/). + +We provide config files to reproduce the results in the paper for +["GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond"](https://arxiv.org/abs/1904.11492) on COCO object detection. + +**GCNet** is initially described in [arxiv](https://arxiv.org/abs/1904.11492). Via absorbing advantages of Non-Local Networks (NLNet) and Squeeze-Excitation Networks (SENet), GCNet provides a simple, fast and effective approach for global context modeling, which generally outperforms both NLNet and SENet on major benchmarks for various recognition tasks. + +## Results and Models + +The results on COCO 2017val are shown in the below table. + +| Backbone | Model | Context | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------: | :---: | :------------: | :-----: | :------: | :------------: | :----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Mask | GC(c3-c5, r16) | 1x | 5.0 | | 39.7 | 35.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco_20200515_211915-187da160.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco_20200515_211915.log.json) | +| R-50-FPN | Mask | GC(c3-c5, r4) | 1x | 5.1 | 15.0 | 39.9 | 36.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco_20200204-17235656.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco_20200204_024626.log.json) | +| R-101-FPN | Mask | GC(c3-c5, r16) | 1x | 7.6 | 11.4 | 41.3 | 37.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco_20200205-e58ae947.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco_20200205_192835.log.json) | +| R-101-FPN | Mask | GC(c3-c5, r4) | 1x | 7.8 | 11.6 | 42.2 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco_20200206-af22dc9d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco_20200206_112128.log.json) | + +| Backbone | Model | Context | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------: | :--------------: | :------------: | :-----: | :------: | :------------: | :----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Mask | - | 1x | 4.4 | 16.6 | 38.4 | 34.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco_20200202-bb3eb55c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco_20200202_214122.log.json) | +| R-50-FPN | Mask | GC(c3-c5, r16) | 1x | 5.0 | 15.5 | 40.4 | 36.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202-587b99aa.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202_174907.log.json) | +| R-50-FPN | Mask | GC(c3-c5, r4) | 1x | 5.1 | 15.1 | 40.7 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202-50b90e5c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202_085547.log.json) | +| R-101-FPN | Mask | - | 1x | 6.4 | 13.3 | 40.5 | 36.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco_20200210-81658c8a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco_20200210_220422.log.json) | +| R-101-FPN | Mask | GC(c3-c5, r16) | 1x | 7.6 | 12.0 | 42.2 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200207-945e77ca.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200207_015330.log.json) | +| R-101-FPN | Mask | GC(c3-c5, r4) | 1x | 7.8 | 11.8 | 42.2 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206-8407a3f0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206_142508.log.json) | +| X-101-FPN | Mask | - | 1x | 7.6 | 11.3 | 42.4 | 37.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200211-7584841c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200211_054326.log.json) | +| X-101-FPN | Mask | GC(c3-c5, r16) | 1x | 8.8 | 9.8 | 43.5 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211-cbed3d2c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211_164715.log.json) | +| X-101-FPN | Mask | GC(c3-c5, r4) | 1x | 9.0 | 9.7 | 43.9 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200212-68164964.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200212_070942.log.json) | +| X-101-FPN | Cascade Mask | - | 1x | 9.2 | 8.4 | 44.7 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200310-d5ad2a5e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200310_115217.log.json) | +| X-101-FPN | Cascade Mask | GC(c3-c5, r16) | 1x | 10.3 | 7.7 | 46.2 | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211-10bf2463.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211_184154.log.json) | +| X-101-FPN | Cascade Mask | GC(c3-c5, r4) | 1x | 10.6 | | 46.4 | 40.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200703_180653-ed035291.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200703_180653.log.json) | +| X-101-FPN | DCN Cascade Mask | - | 1x | | | 47.5 | 40.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco_20210615_211019-abbc39ea.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco_20210615_211019.log.json) | +| X-101-FPN | DCN Cascade Mask | GC(c3-c5, r16) | 1x | | | 48.0 | 41.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco_20210615_215648-44aa598a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco_20210615_215648.log.json) | +| X-101-FPN | DCN Cascade Mask | GC(c3-c5, r4) | 1x | | | 47.9 | 41.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco_20210615_161851-720338ec.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco_20210615_161851.log.json) | + +**Notes:** + +- The `SyncBN` is added in the backbone for all models in **Table 2**. +- `GC` denotes Global Context (GC) block is inserted after 1x1 conv of backbone. +- `DCN` denotes replace 3x3 conv with 3x3 Deformable Convolution in `c3-c5` stages of backbone. +- `r4` and `r16` denote ratio 4 and ratio 16 in GC block respectively. + +## Citation + +```latex +@article{cao2019GCNet, + title={GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond}, + author={Cao, Yue and Xu, Jiarui and Lin, Stephen and Wei, Fangyun and Hu, Han}, + journal={arXiv preprint arXiv:1904.11492}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py new file mode 100644 index 0000000..5118895 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..413499d --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..50689aa --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..1367231 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..50883ff --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..31fdd07 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..ad6ad47 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..29f9167 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py new file mode 100644 index 0000000..6e1c5d0 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..781dba7 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..32972de --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..d299b69 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..5ac908e --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py new file mode 100644 index 0000000..0308a56 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..e04780c --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..980f819 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py new file mode 100644 index 0000000..f0c96e5 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..7fb8e82 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py b/downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..b1ddbee --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/downstream/mmdetection/configs/gcnet/metafile.yml b/downstream/mmdetection/configs/gcnet/metafile.yml new file mode 100644 index 0000000..1281122 --- /dev/null +++ b/downstream/mmdetection/configs/gcnet/metafile.yml @@ -0,0 +1,440 @@ +Collections: + - Name: GCNet + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Global Context Block + - FPN + - RPN + - ResNet + - ResNeXt + Paper: + URL: https://arxiv.org/abs/1904.11492 + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + README: configs/gcnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/ops/context_block.py#L13 + Version: v2.0.0 + +Models: + - Name: mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco_20200515_211915-187da160.pth + + - Name: mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.1 + inference time (ms/im): + - value: 66.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco_20200204-17235656.pth + + - Name: mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 87.72 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco_20200205-e58ae947.pth + + - Name: mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.8 + inference time (ms/im): + - value: 86.21 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco_20200206-af22dc9d.pth + + - Name: mask_rcnn_r50_fpn_syncbn-backbone_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 60.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco_20200202-bb3eb55c.pth + + - Name: mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + inference time (ms/im): + - value: 64.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202-587b99aa.pth + + - Name: mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.1 + inference time (ms/im): + - value: 66.23 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202-50b90e5c.pth + + - Name: mask_rcnn_r101_fpn_syncbn-backbone_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 75.19 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco_20200210-81658c8a.pth + + - Name: mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 83.33 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200207-945e77ca.pth + + - Name: mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.8 + inference time (ms/im): + - value: 84.75 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206-8407a3f0.pth + + - Name: mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200211-7584841c.pth + + - Name: mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 8.8 + inference time (ms/im): + - value: 102.04 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211-cbed3d2c.pth + + - Name: mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 9.0 + inference time (ms/im): + - value: 103.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200212-68164964.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py + Metadata: + Training Memory (GB): 9.2 + inference time (ms/im): + - value: 119.05 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200310-d5ad2a5e.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 129.87 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211-10bf2463.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 10.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200703_180653-ed035291.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco_20210615_211019-abbc39ea.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 48.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco_20210615_215648-44aa598a.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco_20210615_161851-720338ec.pth diff --git a/downstream/mmdetection/configs/gfl/README.md b/downstream/mmdetection/configs/gfl/README.md new file mode 100644 index 0000000..703936b --- /dev/null +++ b/downstream/mmdetection/configs/gfl/README.md @@ -0,0 +1,42 @@ +# GFL + +> [Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection](https://arxiv.org/abs/2006.04388) + + + +## Abstract + +One-stage detector basically formulates object detection as dense classification and localization. The classification is usually optimized by Focal Loss and the box location is commonly learned under Dirac delta distribution. A recent trend for one-stage detectors is to introduce an individual prediction branch to estimate the quality of localization, where the predicted quality facilitates the classification to improve detection performance. This paper delves into the representations of the above three fundamental elements: quality estimation, classification and localization. Two problems are discovered in existing practices, including (1) the inconsistent usage of the quality estimation and classification between training and inference and (2) the inflexible Dirac delta distribution for localization when there is ambiguity and uncertainty in complex scenes. To address the problems, we design new representations for these elements. Specifically, we merge the quality estimation into the class prediction vector to form a joint representation of localization quality and classification, and use a vector to represent arbitrary distribution of box locations. The improved representations eliminate the inconsistency risk and accurately depict the flexible distribution in real data, but contain continuous labels, which is beyond the scope of Focal Loss. We then propose Generalized Focal Loss (GFL) that generalizes Focal Loss from its discrete form to the continuous version for successful optimization. On COCO test-dev, GFL achieves 45.0% AP using ResNet-101 backbone, surpassing state-of-the-art SAPD (43.5%) and ATSS (43.6%) with higher or comparable inference speed, under the same backbone and training settings. Notably, our best model can achieve a single-model single-scale AP of 48.2%, at 10 FPS on a single 2080Ti GPU. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Multi-scale Training | Inf time (fps) | box AP | Config | Download | +| :---------------: | :-----: | :-----: | :------------------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | No | 19.5 | 40.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_1x_coco/gfl_r50_fpn_1x_coco_20200629_121244-25944287.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_1x_coco/gfl_r50_fpn_1x_coco_20200629_121244.log.json) | +| R-50 | pytorch | 2x | Yes | 19.5 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_mstrain_2x_coco/gfl_r50_fpn_mstrain_2x_coco_20200629_213802-37bb1edc.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_mstrain_2x_coco/gfl_r50_fpn_mstrain_2x_coco_20200629_213802.log.json) | +| R-101 | pytorch | 2x | Yes | 14.7 | 44.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_mstrain_2x_coco/gfl_r101_fpn_mstrain_2x_coco_20200629_200126-dd12f847.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_mstrain_2x_coco/gfl_r101_fpn_mstrain_2x_coco_20200629_200126.log.json) | +| R-101-dcnv2 | pytorch | 2x | Yes | 12.9 | 47.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20200630_102002-134b07df.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20200630_102002.log.json) | +| X-101-32x4d | pytorch | 2x | Yes | 12.1 | 45.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco/gfl_x101_32x4d_fpn_mstrain_2x_coco_20200630_102002-50c1ffdb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco/gfl_x101_32x4d_fpn_mstrain_2x_coco_20200630_102002.log.json) | +| X-101-32x4d-dcnv2 | pytorch | 2x | Yes | 10.7 | 48.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco_20200630_102002-14a2bf25.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco_20200630_102002.log.json) | + +\[1\] *1x and 2x mean the model is trained for 90K and 180K iterations, respectively.* \ +\[2\] *All results are obtained with a single model and without any test time data augmentation such as multi-scale, flipping and etc..* \ +\[3\] *`dcnv2` denotes deformable convolutional networks v2.* \ +\[4\] *FPS is tested with a single GeForce RTX 2080Ti GPU, using a batch size of 1.* + +## Citation + +We provide config files to reproduce the object detection results in the paper [Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection](https://arxiv.org/abs/2006.04388) + +```latex +@article{li2020generalized, + title={Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection}, + author={Li, Xiang and Wang, Wenhai and Wu, Lijun and Chen, Shuo and Hu, Xiaolin and Li, Jun and Tang, Jinhui and Yang, Jian}, + journal={arXiv preprint arXiv:2006.04388}, + year={2020} +} +``` diff --git a/downstream/mmdetection/configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py b/downstream/mmdetection/configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..b72c2b6 --- /dev/null +++ b/downstream/mmdetection/configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py @@ -0,0 +1,15 @@ +_base_ = './gfl_r50_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py b/downstream/mmdetection/configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..e33b5c0 --- /dev/null +++ b/downstream/mmdetection/configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py @@ -0,0 +1,13 @@ +_base_ = './gfl_r50_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/gfl/gfl_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/gfl/gfl_r50_fpn_1x_coco.py new file mode 100644 index 0000000..cfd4b02 --- /dev/null +++ b/downstream/mmdetection/configs/gfl/gfl_r50_fpn_1x_coco.py @@ -0,0 +1,57 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='GFL', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='GFLHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + loss_cls=dict( + type='QualityFocalLoss', + use_sigmoid=True, + beta=2.0, + loss_weight=1.0), + loss_dfl=dict(type='DistributionFocalLoss', loss_weight=0.25), + reg_max=16, + loss_bbox=dict(type='GIoULoss', loss_weight=2.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py b/downstream/mmdetection/configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..b8be601 --- /dev/null +++ b/downstream/mmdetection/configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py @@ -0,0 +1,22 @@ +_base_ = './gfl_r50_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) +# multi-scale training +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/downstream/mmdetection/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py b/downstream/mmdetection/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..2539807 --- /dev/null +++ b/downstream/mmdetection/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py @@ -0,0 +1,18 @@ +_base_ = './gfl_r50_fpn_mstrain_2x_coco.py' +model = dict( + type='GFL', + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, False, True, True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py b/downstream/mmdetection/configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..effda19 --- /dev/null +++ b/downstream/mmdetection/configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py @@ -0,0 +1,16 @@ +_base_ = './gfl_r50_fpn_mstrain_2x_coco.py' +model = dict( + type='GFL', + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/gfl/metafile.yml b/downstream/mmdetection/configs/gfl/metafile.yml new file mode 100644 index 0000000..8f049c6 --- /dev/null +++ b/downstream/mmdetection/configs/gfl/metafile.yml @@ -0,0 +1,134 @@ +Collections: + - Name: Generalized Focal Loss + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Generalized Focal Loss + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/2006.04388 + Title: 'Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection' + README: configs/gfl/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.2.0/mmdet/models/detectors/gfl.py#L6 + Version: v2.2.0 + +Models: + - Name: gfl_r50_fpn_1x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_r50_fpn_1x_coco.py + Metadata: + inference time (ms/im): + - value: 51.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_1x_coco/gfl_r50_fpn_1x_coco_20200629_121244-25944287.pth + + - Name: gfl_r50_fpn_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 51.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_mstrain_2x_coco/gfl_r50_fpn_mstrain_2x_coco_20200629_213802-37bb1edc.pth + + - Name: gfl_r101_fpn_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 68.03 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_mstrain_2x_coco/gfl_r101_fpn_mstrain_2x_coco_20200629_200126-dd12f847.pth + + - Name: gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20200630_102002-134b07df.pth + + - Name: gfl_x101_32x4d_fpn_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 82.64 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco/gfl_x101_32x4d_fpn_mstrain_2x_coco_20200630_102002-50c1ffdb.pth + + - Name: gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 93.46 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 48.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco_20200630_102002-14a2bf25.pth diff --git a/downstream/mmdetection/configs/ghm/README.md b/downstream/mmdetection/configs/ghm/README.md new file mode 100644 index 0000000..cf9fb73 --- /dev/null +++ b/downstream/mmdetection/configs/ghm/README.md @@ -0,0 +1,33 @@ +# GHM + +> [Gradient Harmonized Single-stage Detector](https://arxiv.org/abs/1811.05181) + + + +## Abstract + +Despite the great success of two-stage detectors, single-stage detector is still a more elegant and efficient way, yet suffers from the two well-known disharmonies during training, i.e. the huge difference in quantity between positive and negative examples as well as between easy and hard examples. In this work, we first point out that the essential effect of the two disharmonies can be summarized in term of the gradient. Further, we propose a novel gradient harmonizing mechanism (GHM) to be a hedging for the disharmonies. The philosophy behind GHM can be easily embedded into both classification loss function like cross-entropy (CE) and regression loss function like smooth-L1 (SL1) loss. To this end, two novel loss functions called GHM-C and GHM-R are designed to balancing the gradient flow for anchor classification and bounding box refinement, respectively. Ablation study on MS COCO demonstrates that without laborious hyper-parameter tuning, both GHM-C and GHM-R can bring substantial improvement for single-stage detector. Without any whistles and bells, our model achieves 41.6 mAP on COCO test-dev set which surpasses the state-of-the-art method, Focal Loss (FL) + SL1, by 0.8. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 4.0 | 3.3 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r50_fpn_1x_coco/retinanet_ghm_r50_fpn_1x_coco_20200130-a437fda3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r50_fpn_1x_coco/retinanet_ghm_r50_fpn_1x_coco_20200130_004213.log.json) | +| R-101-FPN | pytorch | 1x | 6.0 | 4.4 | 39.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r101_fpn_1x_coco/retinanet_ghm_r101_fpn_1x_coco_20200130-c148ee8f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r101_fpn_1x_coco/retinanet_ghm_r101_fpn_1x_coco_20200130_145259.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.2 | 5.1 | 40.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco/retinanet_ghm_x101_32x4d_fpn_1x_coco_20200131-e4333bd0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco/retinanet_ghm_x101_32x4d_fpn_1x_coco_20200131_113653.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.3 | 5.2 | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco/retinanet_ghm_x101_64x4d_fpn_1x_coco_20200131-dd381cef.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco/retinanet_ghm_x101_64x4d_fpn_1x_coco_20200131_113723.log.json) | + +## Citation + +```latex +@inproceedings{li2019gradient, + title={Gradient Harmonized Single-stage Detector}, + author={Li, Buyu and Liu, Yu and Wang, Xiaogang}, + booktitle={AAAI Conference on Artificial Intelligence}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/ghm/metafile.yml b/downstream/mmdetection/configs/ghm/metafile.yml new file mode 100644 index 0000000..b4f488c --- /dev/null +++ b/downstream/mmdetection/configs/ghm/metafile.yml @@ -0,0 +1,101 @@ +Collections: + - Name: GHM + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - GHM-C + - GHM-R + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1811.05181 + Title: 'Gradient Harmonized Single-stage Detector' + README: configs/ghm/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/losses/ghm_loss.py#L21 + Version: v2.0.0 + +Models: + - Name: retinanet_ghm_r50_fpn_1x_coco + In Collection: GHM + Config: configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 303.03 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r50_fpn_1x_coco/retinanet_ghm_r50_fpn_1x_coco_20200130-a437fda3.pth + + - Name: retinanet_ghm_r101_fpn_1x_coco + In Collection: GHM + Config: configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 227.27 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r101_fpn_1x_coco/retinanet_ghm_r101_fpn_1x_coco_20200130-c148ee8f.pth + + - Name: retinanet_ghm_x101_32x4d_fpn_1x_coco + In Collection: GHM + Config: configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.2 + inference time (ms/im): + - value: 196.08 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco/retinanet_ghm_x101_32x4d_fpn_1x_coco_20200131-e4333bd0.pth + + - Name: retinanet_ghm_x101_64x4d_fpn_1x_coco + In Collection: GHM + Config: configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 192.31 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco/retinanet_ghm_x101_64x4d_fpn_1x_coco_20200131-dd381cef.pth diff --git a/downstream/mmdetection/configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py new file mode 100644 index 0000000..aaf6fc2 --- /dev/null +++ b/downstream/mmdetection/configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './retinanet_ghm_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py new file mode 100644 index 0000000..61b9751 --- /dev/null +++ b/downstream/mmdetection/configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py @@ -0,0 +1,19 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +model = dict( + bbox_head=dict( + loss_cls=dict( + _delete_=True, + type='GHMC', + bins=30, + momentum=0.75, + use_sigmoid=True, + loss_weight=1.0), + loss_bbox=dict( + _delete_=True, + type='GHMR', + mu=0.02, + bins=10, + momentum=0.7, + loss_weight=10.0))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..cd2e4cc --- /dev/null +++ b/downstream/mmdetection/configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './retinanet_ghm_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..b6107d8 --- /dev/null +++ b/downstream/mmdetection/configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './retinanet_ghm_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/gn+ws/README.md b/downstream/mmdetection/configs/gn+ws/README.md new file mode 100644 index 0000000..184bed3 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/README.md @@ -0,0 +1,54 @@ +# GN + WS + +> [Weight Standardization](https://arxiv.org/abs/1903.10520) + + + +## Abstract + +Batch Normalization (BN) has become an out-of-box technique to improve deep network training. However, its effectiveness is limited for micro-batch training, i.e., each GPU typically has only 1-2 images for training, which is inevitable for many computer vision tasks, e.g., object detection and semantic segmentation, constrained by memory consumption. To address this issue, we propose Weight Standardization (WS) and Batch-Channel Normalization (BCN) to bring two success factors of BN into micro-batch training: 1) the smoothing effects on the loss landscape and 2) the ability to avoid harmful elimination singularities along the training trajectory. WS standardizes the weights in convolutional layers to smooth the loss landscape by reducing the Lipschitz constants of the loss and the gradients; BCN combines batch and channel normalizations and leverages estimated statistics of the activations in convolutional layers to keep networks away from elimination singularities. We validate WS and BCN on comprehensive computer vision tasks, including image classification, object detection, instance segmentation, video recognition and semantic segmentation. All experimental results consistently show that WS and BCN improve micro-batch training significantly. Moreover, using WS and BCN with micro-batch training is even able to match or outperform the performances of BN with large-batch training. + +
    + +
    + +## Results and Models + +Faster R-CNN + +| Backbone | Style | Normalization | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----------: | :-----: | :------: | :------------: | :----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | GN+WS | 1x | 5.9 | 11.7 | 39.7 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco/faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130-613d9fe2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco/faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130_210936.log.json) | +| R-101-FPN | pytorch | GN+WS | 1x | 8.9 | 9.0 | 41.7 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco/faster_rcnn_r101_fpn_gn_ws-all_1x_coco_20200205-a93b0d75.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco/faster_rcnn_r101_fpn_gn_ws-all_1x_coco_20200205_232146.log.json) | +| X-50-32x4d-FPN | pytorch | GN+WS | 1x | 7.0 | 10.3 | 40.7 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco_20200203-839c5d9d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco_20200203_220113.log.json) | +| X-101-32x4d-FPN | pytorch | GN+WS | 1x | 10.8 | 7.6 | 42.1 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco_20200212-27da1bc2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco_20200212_195302.log.json) | + +Mask R-CNN + +| Backbone | Style | Normalization | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----------: | :-------: | :------: | :------------: | :----: | :-----: | :----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | GN+WS | 2x | 7.3 | 10.5 | 40.6 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco/mask_rcnn_r50_fpn_gn_ws-all_2x_coco_20200226-16acb762.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco/mask_rcnn_r50_fpn_gn_ws-all_2x_coco_20200226_062128.log.json) | +| R-101-FPN | pytorch | GN+WS | 2x | 10.3 | 8.6 | 42.0 | 37.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco/mask_rcnn_r101_fpn_gn_ws-all_2x_coco_20200212-ea357cd9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco/mask_rcnn_r101_fpn_gn_ws-all_2x_coco_20200212_213627.log.json) | +| X-50-32x4d-FPN | pytorch | GN+WS | 2x | 8.4 | 9.3 | 41.1 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco_20200216-649fdb6f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco_20200216_201500.log.json) | +| X-101-32x4d-FPN | pytorch | GN+WS | 2x | 12.2 | 7.1 | 42.1 | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco_20200319-33fb95b5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco_20200319_104101.log.json) | +| R-50-FPN | pytorch | GN+WS | 20-23-24e | 7.3 | - | 41.1 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco_20200213-487d1283.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco_20200213_035123.log.json) | +| R-101-FPN | pytorch | GN+WS | 20-23-24e | 10.3 | - | 43.1 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco_20200213-57b5a50f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco_20200213_130142.log.json) | +| X-50-32x4d-FPN | pytorch | GN+WS | 20-23-24e | 8.4 | - | 42.1 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200226-969bcb2c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200226_093732.log.json) | +| X-101-32x4d-FPN | pytorch | GN+WS | 20-23-24e | 12.2 | - | 42.7 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200316-e6cd35ef.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200316_013741.log.json) | + +Note: + +- GN+WS requires about 5% more memory than GN, and it is only 5% slower than GN. +- In the paper, a 20-23-24e lr schedule is used instead of 2x. +- The X-50-GN and X-101-GN pretrained models are also shared by the authors. + +## Citation + +```latex +@article{weightstandardization, + author = {Siyuan Qiao and Huiyu Wang and Chenxi Liu and Wei Shen and Alan Yuille}, + title = {Weight Standardization}, + journal = {arXiv preprint arXiv:1903.10520}, + year = {2019}, +} +``` diff --git a/downstream/mmdetection/configs/gn+ws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py b/downstream/mmdetection/configs/gn+ws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py new file mode 100644 index 0000000..cd2cb2b --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://jhu/resnet101_gn_ws'))) diff --git a/downstream/mmdetection/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py b/downstream/mmdetection/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py new file mode 100644 index 0000000..1b326b8 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://jhu/resnet50_gn_ws')), + neck=dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg))) diff --git a/downstream/mmdetection/configs/gn+ws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py b/downstream/mmdetection/configs/gn+ws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py new file mode 100644 index 0000000..f64ae89 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = './faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py' +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://jhu/resnext101_32x4d_gn_ws'))) diff --git a/downstream/mmdetection/configs/gn+ws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py b/downstream/mmdetection/configs/gn+ws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py new file mode 100644 index 0000000..246851b --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = './faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py' +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + type='ResNeXt', + depth=50, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://jhu/resnext50_32x4d_gn_ws'))) diff --git a/downstream/mmdetection/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py b/downstream/mmdetection/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py new file mode 100644 index 0000000..a790d93 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py' +# learning policy +lr_config = dict(step=[20, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py b/downstream/mmdetection/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py new file mode 100644 index 0000000..a9fa6a2 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://jhu/resnet101_gn_ws'))) diff --git a/downstream/mmdetection/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py b/downstream/mmdetection/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py new file mode 100644 index 0000000..5516808 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' +# learning policy +lr_config = dict(step=[20, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py b/downstream/mmdetection/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py new file mode 100644 index 0000000..63be60f --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py @@ -0,0 +1,20 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://jhu/resnet50_gn_ws')), + neck=dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg), + mask_head=dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg))) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py b/downstream/mmdetection/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py new file mode 100644 index 0000000..cfa14c9 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py' +# learning policy +lr_config = dict(step=[20, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py b/downstream/mmdetection/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py new file mode 100644 index 0000000..6498b03 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py @@ -0,0 +1,19 @@ +_base_ = './mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' +# model settings +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://jhu/resnext101_32x4d_gn_ws'))) diff --git a/downstream/mmdetection/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py b/downstream/mmdetection/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py new file mode 100644 index 0000000..79ce0ad --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py' +# learning policy +lr_config = dict(step=[20, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py b/downstream/mmdetection/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py new file mode 100644 index 0000000..7fac317 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py @@ -0,0 +1,19 @@ +_base_ = './mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' +# model settings +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + type='ResNeXt', + depth=50, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://jhu/resnext50_32x4d_gn_ws'))) diff --git a/downstream/mmdetection/configs/gn+ws/metafile.yml b/downstream/mmdetection/configs/gn+ws/metafile.yml new file mode 100644 index 0000000..bc89359 --- /dev/null +++ b/downstream/mmdetection/configs/gn+ws/metafile.yml @@ -0,0 +1,263 @@ +Collections: + - Name: Weight Standardization + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Group Normalization + - Weight Standardization + Paper: + URL: https://arxiv.org/abs/1903.10520 + Title: 'Weight Standardization' + README: configs/gn+ws/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/configs/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_fpn_gn_ws-all_1x_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py + Metadata: + Training Memory (GB): 5.9 + inference time (ms/im): + - value: 85.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco/faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130-613d9fe2.pth + + - Name: faster_rcnn_r101_fpn_gn_ws-all_1x_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py + Metadata: + Training Memory (GB): 8.9 + inference time (ms/im): + - value: 111.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco/faster_rcnn_r101_fpn_gn_ws-all_1x_coco_20200205-a93b0d75.pth + + - Name: faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 97.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco_20200203-839c5d9d.pth + + - Name: faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py + Metadata: + Training Memory (GB): 10.8 + inference time (ms/im): + - value: 131.58 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco_20200212-27da1bc2.pth + + - Name: mask_rcnn_r50_fpn_gn_ws-all_2x_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py + Metadata: + Training Memory (GB): 7.3 + inference time (ms/im): + - value: 95.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco/mask_rcnn_r50_fpn_gn_ws-all_2x_coco_20200226-16acb762.pth + + - Name: mask_rcnn_r101_fpn_gn_ws-all_2x_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 116.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco/mask_rcnn_r101_fpn_gn_ws-all_2x_coco_20200212-ea357cd9.pth + + - Name: mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py + Metadata: + Training Memory (GB): 8.4 + inference time (ms/im): + - value: 107.53 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco_20200216-649fdb6f.pth + + - Name: mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py + Metadata: + Training Memory (GB): 12.2 + inference time (ms/im): + - value: 140.85 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco_20200319-33fb95b5.pth + + - Name: mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py + Metadata: + Training Memory (GB): 7.3 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco_20200213-487d1283.pth + + - Name: mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py + Metadata: + Training Memory (GB): 10.3 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco_20200213-57b5a50f.pth + + - Name: mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py + Metadata: + Training Memory (GB): 8.4 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200226-969bcb2c.pth + + - Name: mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco + In Collection: Weight Standardization + Config: configs/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py + Metadata: + Training Memory (GB): 12.2 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200316-e6cd35ef.pth diff --git a/downstream/mmdetection/configs/gn/README.md b/downstream/mmdetection/configs/gn/README.md new file mode 100644 index 0000000..9bb2888 --- /dev/null +++ b/downstream/mmdetection/configs/gn/README.md @@ -0,0 +1,41 @@ +# GN + +> [Group Normalization](https://arxiv.org/abs/1803.08494) + + + +## Abstract + +Batch Normalization (BN) is a milestone technique in the development of deep learning, enabling various networks to train. However, normalizing along the batch dimension introduces problems --- BN's error increases rapidly when the batch size becomes smaller, caused by inaccurate batch statistics estimation. This limits BN's usage for training larger models and transferring features to computer vision tasks including detection, segmentation, and video, which require small batches constrained by memory consumption. In this paper, we present Group Normalization (GN) as a simple alternative to BN. GN divides the channels into groups and computes within each group the mean and variance for normalization. GN's computation is independent of batch sizes, and its accuracy is stable in a wide range of batch sizes. On ResNet-50 trained in ImageNet, GN has 10.6% lower error than its BN counterpart when using a batch size of 2; when using typical batch sizes, GN is comparably good with BN and outperforms other normalization variants. Moreover, GN can be naturally transferred from pre-training to fine-tuning. GN can outperform its BN-based counterparts for object detection and segmentation in COCO, and for video classification in Kinetics, showing that GN can effectively replace the powerful BN in a variety of tasks. GN can be easily implemented by a few lines of code in modern libraries. + +
    + +
    + +## Results and Models + +| Backbone | model | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-----------: | :--------: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN (d) | Mask R-CNN | 2x | 7.1 | 11.0 | 40.2 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_2x_coco/mask_rcnn_r50_fpn_gn-all_2x_coco_20200206-8eee02a6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_2x_coco/mask_rcnn_r50_fpn_gn-all_2x_coco_20200206_050355.log.json) | +| R-50-FPN (d) | Mask R-CNN | 3x | 7.1 | - | 40.5 | 36.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_3x_coco/mask_rcnn_r50_fpn_gn-all_3x_coco_20200214-8b23b1e5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_3x_coco/mask_rcnn_r50_fpn_gn-all_3x_coco_20200214_063512.log.json) | +| R-101-FPN (d) | Mask R-CNN | 2x | 9.9 | 9.0 | 41.9 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_2x_coco/mask_rcnn_r101_fpn_gn-all_2x_coco_20200205-d96b1b50.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_2x_coco/mask_rcnn_r101_fpn_gn-all_2x_coco_20200205_234402.log.json) | +| R-101-FPN (d) | Mask R-CNN | 3x | 9.9 | | 42.1 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_3x_coco/mask_rcnn_r101_fpn_gn-all_3x_coco_20200513_181609-0df864f4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_3x_coco/mask_rcnn_r101_fpn_gn-all_3x_coco_20200513_181609.log.json) | +| R-50-FPN (c) | Mask R-CNN | 2x | 7.1 | 10.9 | 40.0 | 36.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco_20200207-20d3e849.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco_20200207_225832.log.json) | +| R-50-FPN (c) | Mask R-CNN | 3x | 7.1 | - | 40.1 | 36.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco_20200225-542aefbc.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco_20200225_235135.log.json) | + +**Notes:** + +- (d) means pretrained model converted from Detectron, and (c) means the contributed model pretrained by [@thangvubk](https://github.com/thangvubk). +- The `3x` schedule is epoch \[28, 34, 36\]. +- **Memory, Train/Inf time is outdated.** + +## Citation + +```latex +@inproceedings{wu2018group, + title={Group Normalization}, + author={Wu, Yuxin and He, Kaiming}, + booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, + year={2018} +} +``` diff --git a/downstream/mmdetection/configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py b/downstream/mmdetection/configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py new file mode 100644 index 0000000..a505ba0 --- /dev/null +++ b/downstream/mmdetection/configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py @@ -0,0 +1,7 @@ +_base_ = './mask_rcnn_r50_fpn_gn-all_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet101_gn'))) diff --git a/downstream/mmdetection/configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py b/downstream/mmdetection/configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py new file mode 100644 index 0000000..12a9d17 --- /dev/null +++ b/downstream/mmdetection/configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py @@ -0,0 +1,5 @@ +_base_ = './mask_rcnn_r101_fpn_gn-all_2x_coco.py' + +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py b/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py new file mode 100644 index 0000000..1de7d98 --- /dev/null +++ b/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py @@ -0,0 +1,49 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet50_gn')), + neck=dict(norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=norm_cfg), + mask_head=dict(norm_cfg=norm_cfg))) +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py b/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py new file mode 100644 index 0000000..f917719 --- /dev/null +++ b/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py @@ -0,0 +1,5 @@ +_base_ = './mask_rcnn_r50_fpn_gn-all_2x_coco.py' + +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py b/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py new file mode 100644 index 0000000..2f430fd --- /dev/null +++ b/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py @@ -0,0 +1,17 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://contrib/resnet50_gn')), + neck=dict(norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=norm_cfg), + mask_head=dict(norm_cfg=norm_cfg))) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py b/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py new file mode 100644 index 0000000..66834f0 --- /dev/null +++ b/downstream/mmdetection/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py @@ -0,0 +1,5 @@ +_base_ = './mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py' + +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/downstream/mmdetection/configs/gn/metafile.yml b/downstream/mmdetection/configs/gn/metafile.yml new file mode 100644 index 0000000..4a1ecae --- /dev/null +++ b/downstream/mmdetection/configs/gn/metafile.yml @@ -0,0 +1,162 @@ +Collections: + - Name: Group Normalization + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Group Normalization + Paper: + URL: https://arxiv.org/abs/1803.08494 + Title: 'Group Normalization' + README: configs/gn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py + Version: v2.0.0 + +Models: + - Name: mask_rcnn_r50_fpn_gn-all_2x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_2x_coco/mask_rcnn_r50_fpn_gn-all_2x_coco_20200206-8eee02a6.pth + + - Name: mask_rcnn_r50_fpn_gn-all_3x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_3x_coco/mask_rcnn_r50_fpn_gn-all_3x_coco_20200214-8b23b1e5.pth + + - Name: mask_rcnn_r101_fpn_gn-all_2x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py + Metadata: + Training Memory (GB): 9.9 + inference time (ms/im): + - value: 111.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_2x_coco/mask_rcnn_r101_fpn_gn-all_2x_coco_20200205-d96b1b50.pth + + - Name: mask_rcnn_r101_fpn_gn-all_3x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py + Metadata: + Training Memory (GB): 9.9 + inference time (ms/im): + - value: 111.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_3x_coco/mask_rcnn_r101_fpn_gn-all_3x_coco_20200513_181609-0df864f4.pth + + - Name: mask_rcnn_r50_fpn_gn-all_contrib_2x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 91.74 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco_20200207-20d3e849.pth + + - Name: mask_rcnn_r50_fpn_gn-all_contrib_3x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 91.74 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco_20200225-542aefbc.pth diff --git a/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_1x.py b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_1x.py new file mode 100644 index 0000000..af90b16 --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_1x.py @@ -0,0 +1,173 @@ +_base_ = [ + '../../_base_/datasets/coco_instance.py', + '../../_base_/schedules/schedule_1x.py', + '../../_base_/default_runtime.py' +] +checkpoint_url = '' +embed_dims = 216 +model = dict( + type='MaskRCNN', + backbone=dict( + type='GPViTAdapter', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L1', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims, embed_dims], + out_channels=256, + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + norm_cfg=dict(type='SyncBN', requires_grad=True), + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + # norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) +optimizer_config = dict(grad_clip=None) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) +work_dir = 'work_dirs/gpvit_l1_maskrcnn_1x' diff --git a/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_3x.py b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_3x.py new file mode 100644 index 0000000..92f8716 --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l1_maskrcnn_3x.py @@ -0,0 +1,207 @@ +_base_ = [ + '../../_base_/datasets/coco_instance.py', + '../../_base_/schedules/schedule_3x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 216 +model = dict( + type='MaskRCNN', + backbone=dict( + type='GPViTAdapter', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L1', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims, embed_dims], + out_channels=256, + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + norm_cfg=dict(type='SyncBN', requires_grad=True), + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + # norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='AutoAugment', + policies=[ + [ + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict(type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(1024, 1024), + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) +optimizer_config = dict(grad_clip=None) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l1_maskrcnn_3x' diff --git a/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_1x.py b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_1x.py new file mode 100644 index 0000000..c22423f --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_1x.py @@ -0,0 +1,173 @@ +_base_ = [ + '../../_base_/datasets/coco_instance.py', + '../../_base_/schedules/schedule_1x.py', + '../../_base_/default_runtime.py' +] +checkpoint_url = '' +embed_dims = 348 +model = dict( + type='MaskRCNN', + backbone=dict( + type='GPViTAdapter', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L2', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims, embed_dims], + out_channels=256, + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + norm_cfg=dict(type='SyncBN', requires_grad=True), + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + # norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) +optimizer_config = dict(grad_clip=None) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) +work_dir = 'work_dirs/gpvit_l2_maskrcnn_1x' diff --git a/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_3x.py b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_3x.py new file mode 100644 index 0000000..57eccd5 --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l2_maskrcnn_3x.py @@ -0,0 +1,207 @@ +_base_ = [ + '../../_base_/datasets/coco_instance.py', + '../../_base_/schedules/schedule_3x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 348 +model = dict( + type='MaskRCNN', + backbone=dict( + type='GPViTAdapter', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L2', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims, embed_dims], + out_channels=256, + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + norm_cfg=dict(type='SyncBN', requires_grad=True), + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + # norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='AutoAugment', + policies=[ + [ + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict(type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(1024, 1024), + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) +optimizer_config = dict(grad_clip=None) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l2_maskrcnn_3x' diff --git a/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_1x.py b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_1x.py new file mode 100644 index 0000000..7b9f3c1 --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_1x.py @@ -0,0 +1,173 @@ +_base_ = [ + '../../_base_/datasets/coco_instance.py', + '../../_base_/schedules/schedule_1x.py', + '../../_base_/default_runtime.py' +] +checkpoint_url = '' +embed_dims = 432 +model = dict( + type='MaskRCNN', + backbone=dict( + type='GPViTAdapter', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L3', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims, embed_dims], + out_channels=256, + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + norm_cfg=dict(type='SyncBN', requires_grad=True), + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + # norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) +optimizer_config = dict(grad_clip=None) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) +work_dir = 'work_dirs/gpvit_l3_maskrcnn_1x' diff --git a/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_3x.py b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_3x.py new file mode 100644 index 0000000..a68474b --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l3_maskrcnn_3x.py @@ -0,0 +1,207 @@ +_base_ = [ + '../../_base_/datasets/coco_instance.py', + '../../_base_/schedules/schedule_3x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 432 +model = dict( + type='MaskRCNN', + backbone=dict( + type='GPViTAdapter', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L3', + drop_path_rate=0.2, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims, embed_dims], + out_channels=256, + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + norm_cfg=dict(type='SyncBN', requires_grad=True), + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + # norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='AutoAugment', + policies=[ + [ + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict(type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(1024, 1024), + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) +optimizer_config = dict(grad_clip=None) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l3_maskrcnn_3x' diff --git a/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_1x.py b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_1x.py new file mode 100644 index 0000000..d5e1e98 --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_1x.py @@ -0,0 +1,173 @@ +_base_ = [ + '../../_base_/datasets/coco_instance.py', + '../../_base_/schedules/schedule_1x.py', + '../../_base_/default_runtime.py' +] +checkpoint_url = '' +embed_dims = 624 +model = dict( + type='MaskRCNN', + backbone=dict( + type='GPViTAdapter', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L4', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims, embed_dims], + out_channels=256, + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + norm_cfg=dict(type='SyncBN', requires_grad=True), + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + # norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) +optimizer_config = dict(grad_clip=None) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) +work_dir = 'work_dirs/gpvit_l4_maskrcnn_1x' diff --git a/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_3x.py b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_3x.py new file mode 100644 index 0000000..ab193e5 --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/mask_rcnn/gpvit_l4_maskrcnn_3x.py @@ -0,0 +1,207 @@ +_base_ = [ + '../../_base_/datasets/coco_instance.py', + '../../_base_/schedules/schedule_3x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 624 +model = dict( + type='MaskRCNN', + backbone=dict( + type='GPViTAdapter', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L4', + drop_path_rate=0.2, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims, embed_dims], + out_channels=256, + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + norm_cfg=dict(type='SyncBN', requires_grad=True), + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + # norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='AutoAugment', + policies=[ + [ + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict(type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(1024, 1024), + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) +optimizer_config = dict(grad_clip=None) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l4_maskrcnn_3x' diff --git a/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_1x.py b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_1x.py new file mode 100644 index 0000000..687b097 --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_1x.py @@ -0,0 +1,115 @@ +_base_ = [ + '../../_base_/datasets/coco_detection.py', + '../../_base_/schedules/schedule_1x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 216 +model = dict( + type='RetinaNet', + backbone=dict( + type='GPViTAdapterSingleStage', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L1', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims], + out_channels=256, + add_extra_convs='on_output', + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) + +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l1_retinanet_1x' \ No newline at end of file diff --git a/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_3x.py b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_3x.py new file mode 100644 index 0000000..c373335 --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l1_retinanet_3x.py @@ -0,0 +1,149 @@ +_base_ = [ + '../../_base_/datasets/coco_detection.py', + '../../_base_/schedules/schedule_3x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 216 +model = dict( + type='RetinaNet', + backbone=dict( + type='GPViTAdapterSingleStage', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L1', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims], + out_channels=256, + add_extra_convs='on_output', + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + + +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='AutoAugment', + policies=[ + [ + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict(type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(1024, 1024), + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) + +find_unused_parameters = True +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l1_retinanet_3x' \ No newline at end of file diff --git a/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_1x.py b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_1x.py new file mode 100644 index 0000000..6833bec --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_1x.py @@ -0,0 +1,115 @@ +_base_ = [ + '../../_base_/datasets/coco_detection.py', + '../../_base_/schedules/schedule_1x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 348 +model = dict( + type='RetinaNet', + backbone=dict( + type='GPViTAdapterSingleStage', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L2', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims], + out_channels=256, + add_extra_convs='on_output', + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) + +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l2_retinanet_1x' \ No newline at end of file diff --git a/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_3x.py b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_3x.py new file mode 100644 index 0000000..d42864a --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l2_retinanet_3x.py @@ -0,0 +1,149 @@ +_base_ = [ + '../../_base_/datasets/coco_detection.py', + '../../_base_/schedules/schedule_3x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 348 +model = dict( + type='RetinaNet', + backbone=dict( + type='GPViTAdapterSingleStage', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L2', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims], + out_channels=256, + add_extra_convs='on_output', + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + + +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='AutoAugment', + policies=[ + [ + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict(type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(1024, 1024), + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) + +find_unused_parameters = True +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l2_retinanet_3x' \ No newline at end of file diff --git a/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_1x.py b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_1x.py new file mode 100644 index 0000000..ea033c6 --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_1x.py @@ -0,0 +1,115 @@ +_base_ = [ + '../../_base_/datasets/coco_detection.py', + '../../_base_/schedules/schedule_1x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 432 +model = dict( + type='RetinaNet', + backbone=dict( + type='GPViTAdapterSingleStage', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L3', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims], + out_channels=256, + add_extra_convs='on_output', + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) + +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l3_retinanet_1x' \ No newline at end of file diff --git a/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_3x.py b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_3x.py new file mode 100644 index 0000000..f0885ef --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l3_retinanet_3x.py @@ -0,0 +1,149 @@ +_base_ = [ + '../../_base_/datasets/coco_detection.py', + '../../_base_/schedules/schedule_3x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 432 +model = dict( + type='RetinaNet', + backbone=dict( + type='GPViTAdapterSingleStage', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L3', + drop_path_rate=0.2, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims], + out_channels=256, + add_extra_convs='on_output', + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + + +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='AutoAugment', + policies=[ + [ + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict(type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(1024, 1024), + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) + +find_unused_parameters = True +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l3_retinanet_3x' \ No newline at end of file diff --git a/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_1x.py b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_1x.py new file mode 100644 index 0000000..5b1592e --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_1x.py @@ -0,0 +1,115 @@ +_base_ = [ + '../../_base_/datasets/coco_detection.py', + '../../_base_/schedules/schedule_1x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 624 +model = dict( + type='RetinaNet', + backbone=dict( + type='GPViTAdapterSingleStage', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L4', + drop_path_rate=0.1, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims], + out_channels=256, + add_extra_convs='on_output', + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) + +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l4_retinanet_1x' \ No newline at end of file diff --git a/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_3x.py b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_3x.py new file mode 100644 index 0000000..d92440f --- /dev/null +++ b/downstream/mmdetection/configs/gpvit/retinanet/gpvit_l4_retinanet_3x.py @@ -0,0 +1,149 @@ +_base_ = [ + '../../_base_/datasets/coco_detection.py', + '../../_base_/schedules/schedule_3x.py', + '../../_base_/default_runtime.py' +] + +checkpoint_url = '' +embed_dims = 624 +model = dict( + type='RetinaNet', + backbone=dict( + type='GPViTAdapterSingleStage', + conv_inplane=64, + n_points=4, + deform_num_heads=6, + cffn_ratio=0.25, + deform_ratio=1.0, + interaction_indexes=[[0, 2], [3, 5], [6, 8], [9, 11]], + arch='L4', + drop_path_rate=0.2, + out_indices=(11,), + final_norm=False, + init_cfg=dict(type='Pretrained', checkpoint=checkpoint_url, prefix="backbone."), + convert_syncbn=True), + neck=dict( + type='FPN', + in_channels=[embed_dims, embed_dims, embed_dims], + out_channels=256, + add_extra_convs='on_output', + num_outs=5, + norm_cfg=dict(type='SyncBN', requires_grad=True)), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + + +# optimizer +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='AutoAugment', + policies=[ + [ + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict(type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict(type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='RandomCrop', + crop_type='absolute_range', + crop_size=(1024, 1024), + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0002, weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'level_embed': dict(decay_mult=0.), + 'pos_embed': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.), + 'bias': dict(decay_mult=0.), + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0), + '.group_token': dict(decay_mult=0.0), + '.dw_norm': dict(decay_mult=0.0) + })) + +find_unused_parameters = True +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +fp16 = dict(loss_scale=dict(init_scale=512)) +checkpoint_config = dict( + interval=1, + max_keep_ckpts=3, + save_last=True, +) + +work_dir = 'work_dirs/gpvit_l4_retinanet_3x' \ No newline at end of file diff --git a/downstream/mmdetection/configs/grid_rcnn/README.md b/downstream/mmdetection/configs/grid_rcnn/README.md new file mode 100644 index 0000000..e844021 --- /dev/null +++ b/downstream/mmdetection/configs/grid_rcnn/README.md @@ -0,0 +1,47 @@ +# Grid R-CNN + +> [Grid R-CNN](https://arxiv.org/abs/1811.12030) + + + +## Abstract + +This paper proposes a novel object detection framework named Grid R-CNN, which adopts a grid guided localization mechanism for accurate object detection. Different from the traditional regression based methods, the Grid R-CNN captures the spatial information explicitly and enjoys the position sensitive property of fully convolutional architecture. Instead of using only two independent points, we design a multi-point supervision formulation to encode more clues in order to reduce the impact of inaccurate prediction of specific points. To take the full advantage of the correlation of points in a grid, we propose a two-stage information fusion strategy to fuse feature maps of neighbor grid points. The grid guided localization approach is easy to be extended to different state-of-the-art detection frameworks. Grid R-CNN leads to high quality object localization, and experiments demonstrate that it achieves a 4.1% AP gain at IoU=0.8 and a 10.0% AP gain at IoU=0.9 on COCO benchmark compared to Faster R-CNN with Res50 backbone and FPN architecture. + +Grid R-CNN is a well-performed objection detection framework. It transforms the traditional box offset regression problem into a grid point estimation problem. With the guidance of the grid points, it can obtain high-quality localization results. However, the speed of Grid R-CNN is not so satisfactory. In this technical report we present Grid R-CNN Plus, a better and faster version of Grid R-CNN. We have made several updates that significantly speed up the framework and simultaneously improve the accuracy. On COCO dataset, the Res50-FPN based Grid R-CNN Plus detector achieves an mAP of 40.4%, outperforming the baseline on the same model by 3.0 points with similar inference time. + +
    + +
    + +## Results and Models + +| Backbone | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | 2x | 5.1 | 15.0 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco/grid_rcnn_r50_fpn_gn-head_2x_coco_20200130-6cca8223.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco/grid_rcnn_r50_fpn_gn-head_2x_coco_20200130_221140.log.json) | +| R-101 | 2x | 7.0 | 12.6 | 41.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco/grid_rcnn_r101_fpn_gn-head_2x_coco_20200309-d6eca030.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco/grid_rcnn_r101_fpn_gn-head_2x_coco_20200309_164224.log.json) | +| X-101-32x4d | 2x | 8.3 | 10.8 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco_20200130-d8f0e3ff.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco_20200130_215413.log.json) | +| X-101-64x4d | 2x | 11.3 | 7.7 | 43.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco_20200204-ec76a754.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco_20200204_080641.log.json) | + +**Notes:** + +- All models are trained with 8 GPUs instead of 32 GPUs in the original paper. +- The warming up lasts for 1 epoch and `2x` here indicates 25 epochs. + +## Citation + +```latex +@inproceedings{lu2019grid, + title={Grid r-cnn}, + author={Lu, Xin and Li, Buyu and Yue, Yuxin and Li, Quanquan and Yan, Junjie}, + booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019} +} + +@article{lu2019grid, + title={Grid R-CNN Plus: Faster and Better}, + author={Lu, Xin and Li, Buyu and Yue, Yuxin and Li, Quanquan and Yan, Junjie}, + journal={arXiv preprint arXiv:1906.05688}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py new file mode 100644 index 0000000..1bb5889 --- /dev/null +++ b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py @@ -0,0 +1,7 @@ +_base_ = './grid_rcnn_r50_fpn_gn-head_2x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_1x_coco.py b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..4aa00ec --- /dev/null +++ b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = ['grid_rcnn_r50_fpn_gn-head_2x_coco.py'] +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[8, 11]) +checkpoint_config = dict(interval=1) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py new file mode 100644 index 0000000..df63cd5 --- /dev/null +++ b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py @@ -0,0 +1,131 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + type='GridRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='GridRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared2FCBBoxHead', + with_reg=False, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False), + grid_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + grid_head=dict( + type='GridHead', + grid_points=9, + num_convs=8, + in_channels=256, + point_feat_channels=64, + norm_cfg=dict(type='GN', num_groups=36), + loss_grid=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=15))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_radius=1, + pos_weight=-1, + max_num_grid=192, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.03, + nms=dict(type='nms', iou_threshold=0.3), + max_per_img=100))) +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=3665, + warmup_ratio=1.0 / 80, + step=[17, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=25) diff --git a/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py new file mode 100644 index 0000000..3bc8516 --- /dev/null +++ b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py @@ -0,0 +1,24 @@ +_base_ = './grid_rcnn_r50_fpn_gn-head_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=3665, + warmup_ratio=1.0 / 80, + step=[17, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=25) diff --git a/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py new file mode 100644 index 0000000..c78f8f6 --- /dev/null +++ b/downstream/mmdetection/configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py @@ -0,0 +1,13 @@ +_base_ = './grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/grid_rcnn/metafile.yml b/downstream/mmdetection/configs/grid_rcnn/metafile.yml new file mode 100644 index 0000000..d1aa851 --- /dev/null +++ b/downstream/mmdetection/configs/grid_rcnn/metafile.yml @@ -0,0 +1,101 @@ +Collections: + - Name: Grid R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RPN + - Dilated Convolution + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/abs/1906.05688 + Title: 'Grid R-CNN' + README: configs/grid_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/grid_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: grid_rcnn_r50_fpn_gn-head_2x_coco + In Collection: Grid R-CNN + Config: configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py + Metadata: + Training Memory (GB): 5.1 + inference time (ms/im): + - value: 66.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco/grid_rcnn_r50_fpn_gn-head_2x_coco_20200130-6cca8223.pth + + - Name: grid_rcnn_r101_fpn_gn-head_2x_coco + In Collection: Grid R-CNN + Config: configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 79.37 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco/grid_rcnn_r101_fpn_gn-head_2x_coco_20200309-d6eca030.pth + + - Name: grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco + In Collection: Grid R-CNN + Config: configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py + Metadata: + Training Memory (GB): 8.3 + inference time (ms/im): + - value: 92.59 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco_20200130-d8f0e3ff.pth + + - Name: grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco + In Collection: Grid R-CNN + Config: configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py + Metadata: + Training Memory (GB): 11.3 + inference time (ms/im): + - value: 129.87 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco_20200204-ec76a754.pth diff --git a/downstream/mmdetection/configs/groie/README.md b/downstream/mmdetection/configs/groie/README.md new file mode 100644 index 0000000..4a1eba0 --- /dev/null +++ b/downstream/mmdetection/configs/groie/README.md @@ -0,0 +1,72 @@ +# GRoIE + +> [A novel Region of Interest Extraction Layer for Instance Segmentation](https://arxiv.org/abs/2004.13665) + + + +## Abstract + +Given the wide diffusion of deep neural network architectures for computer vision tasks, several new applications are nowadays more and more feasible. Among them, a particular attention has been recently given to instance segmentation, by exploiting the results achievable by two-stage networks (such as Mask R-CNN or Faster R-CNN), derived from R-CNN. In these complex architectures, a crucial role is played by the Region of Interest (RoI) extraction layer, devoted to extracting a coherent subset of features from a single Feature Pyramid Network (FPN) layer attached on top of a backbone. +This paper is motivated by the need to overcome the limitations of existing RoI extractors which select only one (the best) layer from FPN. Our intuition is that all the layers of FPN retain useful information. Therefore, the proposed layer (called Generic RoI Extractor - GRoIE) introduces non-local building blocks and attention mechanisms to boost the performance. +A comprehensive ablation study at component level is conducted to find the best set of algorithms and parameters for the GRoIE layer. Moreover, GRoIE can be integrated seamlessly with every two-stage architecture for both object detection and instance segmentation tasks. Therefore, the improvements brought about by the use of GRoIE in different state-of-the-art architectures are also evaluated. The proposed layer leads up to gain a 1.1% AP improvement on bounding box detection and 1.7% AP improvement on instance segmentation. + +
    + +
    + +## Introduction + +By Leonardo Rossi, Akbar Karimi and Andrea Prati from +[IMPLab](http://implab.ce.unipr.it/). + +We provide configs to reproduce the results in the paper for +"*A novel Region of Interest Extraction Layer for Instance Segmentation*" +on COCO object detection. + +This paper is motivated by the need to overcome to the limitations of existing +RoI extractors which select only one (the best) layer from FPN. + +Our intuition is that all the layers of FPN retain useful information. + +Therefore, the proposed layer (called Generic RoI Extractor - **GRoIE**) +introduces non-local building blocks and attention mechanisms to boost the +performance. + +## Results and Models + +The results on COCO 2017 minival (5k images) are shown in the below table. + +### Application of GRoIE to different architectures + +| Backbone | Method | Lr schd | box AP | mask AP | Config | Download | +| :-------: | :-------------: | :-----: | :----: | :-----: | :---------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Faster Original | 1x | 37.4 | | [config](../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| R-50-FPN | + GRoIE | 1x | 38.3 | | [config](./faster_rcnn_r50_fpn_groie_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/faster_rcnn_r50_fpn_groie_1x_coco/faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715-66ee9516.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/faster_rcnn_r50_fpn_groie_1x_coco/faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715.log.json) | +| R-50-FPN | Grid R-CNN | 1x | 39.1 | | [config](./grid_rcnn_r50_fpn_gn-head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/grid_rcnn_r50_fpn_gn-head_1x_coco/grid_rcnn_r50_fpn_gn-head_1x_coco_20200605_202059-64f00ee8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/grid_rcnn_r50_fpn_gn-head_1x_coco/grid_rcnn_r50_fpn_gn-head_1x_coco_20200605_202059.log.json) | +| R-50-FPN | + GRoIE | 1x | | | [config](./grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py) | | +| R-50-FPN | Mask R-CNN | 1x | 38.2 | 34.7 | [config](../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205_050542.log.json) | +| R-50-FPN | + GRoIE | 1x | 39.0 | 36.0 | [config](./mask_rcnn_r50_fpn_groie_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_groie_1x_coco/mask_rcnn_r50_fpn_groie_1x_coco_20200604_211715-50d90c74.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_groie_1x_coco/mask_rcnn_r50_fpn_groie_1x_coco_20200604_211715.log.json) | +| R-50-FPN | GC-Net | 1x | 40.7 | 36.5 | [config](../gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202-50b90e5c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202_085547.log.json) | +| R-50-FPN | + GRoIE | 1x | 41.0 | 37.8 | [config](./mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200604_211715-42eb79e1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200604_211715-42eb79e1.pth) | +| R-101-FPN | GC-Net | 1x | 42.2 | 37.8 | [config](../gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206-8407a3f0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206_142508.log.json) | +| R-101-FPN | + GRoIE | 1x | 42.6 | 38.7 | [config](./mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200607_224507-8daae01c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200607_224507.log.json) | + +## Citation + +If you use this work or benchmark in your research, please cite this project. + +```latex +@inproceedings{rossi2021novel, + title={A novel region of interest extraction layer for instance segmentation}, + author={Rossi, Leonardo and Karimi, Akbar and Prati, Andrea}, + booktitle={2020 25th International Conference on Pattern Recognition (ICPR)}, + pages={2203--2209}, + year={2021}, + organization={IEEE} +} +``` + +## Contact + +The implementation of GRoIE is currently maintained by +[Leonardo Rossi](https://github.com/hachreak/). diff --git a/downstream/mmdetection/configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py b/downstream/mmdetection/configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py new file mode 100644 index 0000000..0fc528b --- /dev/null +++ b/downstream/mmdetection/configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py @@ -0,0 +1,25 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/downstream/mmdetection/configs/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py b/downstream/mmdetection/configs/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py new file mode 100644 index 0000000..8e4b4ab --- /dev/null +++ b/downstream/mmdetection/configs/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = '../grid_rcnn/grid_rcnn_r50_fpn_gn-head_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)), + grid_roi_extractor=dict( + type='GenericRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/downstream/mmdetection/configs/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py b/downstream/mmdetection/configs/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py new file mode 100644 index 0000000..8b83722 --- /dev/null +++ b/downstream/mmdetection/configs/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = '../gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)), + mask_roi_extractor=dict( + type='GenericRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/downstream/mmdetection/configs/groie/mask_rcnn_r50_fpn_groie_1x_coco.py b/downstream/mmdetection/configs/groie/mask_rcnn_r50_fpn_groie_1x_coco.py new file mode 100644 index 0000000..81dfb48 --- /dev/null +++ b/downstream/mmdetection/configs/groie/mask_rcnn_r50_fpn_groie_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)), + mask_roi_extractor=dict( + type='GenericRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/downstream/mmdetection/configs/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py b/downstream/mmdetection/configs/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py new file mode 100644 index 0000000..852c5ca --- /dev/null +++ b/downstream/mmdetection/configs/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = '../gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)), + mask_roi_extractor=dict( + type='GenericRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/downstream/mmdetection/configs/groie/metafile.yml b/downstream/mmdetection/configs/groie/metafile.yml new file mode 100644 index 0000000..269cb39 --- /dev/null +++ b/downstream/mmdetection/configs/groie/metafile.yml @@ -0,0 +1,93 @@ +Collections: + - Name: GRoIE + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Generic RoI Extractor + - FPN + - RPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/abs/2004.13665 + Title: 'A novel Region of Interest Extraction Layer for Instance Segmentation' + README: configs/groie/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/roi_heads/roi_extractors/groie.py#L15 + Version: v2.1.0 + +Models: + - Name: faster_rcnn_r50_fpn_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/groie/faster_rcnn_r50_fpn_groie_1x_coco/faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715-66ee9516.pth + + - Name: grid_rcnn_r50_fpn_gn-head_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + + - Name: mask_rcnn_r50_fpn_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/mask_rcnn_r50_fpn_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_groie_1x_coco/mask_rcnn_r50_fpn_groie_1x_coco_20200604_211715-50d90c74.pth + + - Name: mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200604_211715-42eb79e1.pth + + - Name: mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200607_224507-8daae01c.pth diff --git a/downstream/mmdetection/configs/guided_anchoring/README.md b/downstream/mmdetection/configs/guided_anchoring/README.md new file mode 100644 index 0000000..563e43f --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/README.md @@ -0,0 +1,59 @@ +# Guided Anchoring + +> [Region Proposal by Guided Anchoring](https://arxiv.org/abs/1901.03278) + + + +## Abstract + +Region anchors are the cornerstone of modern object detection techniques. State-of-the-art detectors mostly rely on a dense anchoring scheme, where anchors are sampled uniformly over the spatial domain with a predefined set of scales and aspect ratios. In this paper, we revisit this foundational stage. Our study shows that it can be done much more effectively and efficiently. Specifically, we present an alternative scheme, named Guided Anchoring, which leverages semantic features to guide the anchoring. The proposed method jointly predicts the locations where the center of objects of interest are likely to exist as well as the scales and aspect ratios at different locations. On top of predicted anchor shapes, we mitigate the feature inconsistency with a feature adaption module. We also study the use of high-quality proposals to improve detection performance. The anchoring scheme can be seamlessly integrated into proposal methods and detectors. With Guided Anchoring, we achieve 9.1% higher recall on MS COCO with 90% fewer anchors than the RPN baseline. We also adopt Guided Anchoring in Fast R-CNN, Faster R-CNN and RetinaNet, respectively improving the detection mAP by 2.2%, 2.7% and 1.2%. + +
    + +
    + +## Results and Models + +The results on COCO 2017 val is shown in the below table. (results on test-dev are usually slightly higher than val). + +| Method | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | AR 1000 | Config | Download | +| :----: | :-------------: | :-----: | :-----: | :------: | :------------: | :-----: | :-----------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| GA-RPN | R-50-FPN | caffe | 1x | 5.3 | 15.8 | 68.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco/ga_rpn_r50_caffe_fpn_1x_coco_20200531-899008a6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco/ga_rpn_r50_caffe_fpn_1x_coco_20200531_011819.log.json) | +| GA-RPN | R-101-FPN | caffe | 1x | 7.3 | 13.0 | 69.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco/ga_rpn_r101_caffe_fpn_1x_coco_20200531-ca9ba8fb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco/ga_rpn_r101_caffe_fpn_1x_coco_20200531_011812.log.json) | +| GA-RPN | X-101-32x4d-FPN | pytorch | 1x | 8.5 | 10.0 | 70.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco/ga_rpn_x101_32x4d_fpn_1x_coco_20200220-c28d1b18.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco/ga_rpn_x101_32x4d_fpn_1x_coco_20200220_221326.log.json) | +| GA-RPN | X-101-64x4d-FPN | pytorch | 1x | 7.1 | 7.5 | 71.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco/ga_rpn_x101_64x4d_fpn_1x_coco_20200225-3c6e1aa2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco/ga_rpn_x101_64x4d_fpn_1x_coco_20200225_152704.log.json) | + +| Method | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------------: | :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| GA-Faster RCNN | R-50-FPN | caffe | 1x | 5.5 | | 39.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco/ga_faster_r50_caffe_fpn_1x_coco_20200702_000718-a11ccfe6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco/ga_faster_r50_caffe_fpn_1x_coco_20200702_000718.log.json) | +| GA-Faster RCNN | R-101-FPN | caffe | 1x | 7.5 | | 41.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco/ga_faster_r101_caffe_fpn_1x_coco_bbox_mAP-0.415_20200505_115528-fb82e499.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco/ga_faster_r101_caffe_fpn_1x_coco_20200505_115528.log.json) | +| GA-Faster RCNN | X-101-32x4d-FPN | pytorch | 1x | 8.7 | 9.7 | 43.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco/ga_faster_x101_32x4d_fpn_1x_coco_20200215-1ded9da3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco/ga_faster_x101_32x4d_fpn_1x_coco_20200215_184547.log.json) | +| GA-Faster RCNN | X-101-64x4d-FPN | pytorch | 1x | 11.8 | 7.3 | 43.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco/ga_faster_x101_64x4d_fpn_1x_coco_20200215-0fa7bde7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco/ga_faster_x101_64x4d_fpn_1x_coco_20200215_104455.log.json) | +| GA-RetinaNet | R-50-FPN | caffe | 1x | 3.5 | 16.8 | 36.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco/ga_retinanet_r50_caffe_fpn_1x_coco_20201020-39581c6f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco/ga_retinanet_r50_caffe_fpn_1x_coco_20201020_225450.log.json) | +| GA-RetinaNet | R-101-FPN | caffe | 1x | 5.5 | 12.9 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco/ga_retinanet_r101_caffe_fpn_1x_coco_20200531-6266453c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco/ga_retinanet_r101_caffe_fpn_1x_coco_20200531_012847.log.json) | +| GA-RetinaNet | X-101-32x4d-FPN | pytorch | 1x | 6.9 | 10.6 | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco/ga_retinanet_x101_32x4d_fpn_1x_coco_20200219-40c56caa.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco/ga_retinanet_x101_32x4d_fpn_1x_coco_20200219_223025.log.json) | +| GA-RetinaNet | X-101-64x4d-FPN | pytorch | 1x | 9.9 | 7.7 | 41.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco/ga_retinanet_x101_64x4d_fpn_1x_coco_20200226-ef9f7f1f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco/ga_retinanet_x101_64x4d_fpn_1x_coco_20200226_221123.log.json) | + +- In the Guided Anchoring paper, `score_thr` is set to 0.001 in Fast/Faster RCNN and 0.05 in RetinaNet for both baselines and Guided Anchoring. + +- Performance on COCO test-dev benchmark are shown as follows. + +| Method | Backbone | Style | Lr schd | Aug Train | Score thr | AP | AP_50 | AP_75 | AP_small | AP_medium | AP_large | Download | +| :------------: | :-------: | :---: | :-----: | :-------: | :-------: | :-: | :---: | :---: | :------: | :-------: | :------: | :------: | +| GA-Faster RCNN | R-101-FPN | caffe | 1x | F | 0.05 | | | | | | | | +| GA-Faster RCNN | R-101-FPN | caffe | 1x | F | 0.001 | | | | | | | | +| GA-RetinaNet | R-101-FPN | caffe | 1x | F | 0.05 | | | | | | | | +| GA-RetinaNet | R-101-FPN | caffe | 2x | T | 0.05 | | | | | | | | + +## Citation + +We provide config files to reproduce the results in the CVPR 2019 paper for [Region Proposal by Guided Anchoring](https://arxiv.org/abs/1901.03278). + +```latex +@inproceedings{wang2019region, + title={Region Proposal by Guided Anchoring}, + author={Jiaqi Wang and Kai Chen and Shuo Yang and Chen Change Loy and Dahua Lin}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_fast_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_fast_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..8fc203c --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_fast_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = '../fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + roi_head=dict( + bbox_head=dict(bbox_coder=dict(target_stds=[0.05, 0.05, 0.1, 0.1]))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + assigner=dict(pos_iou_thr=0.6, neg_iou_thr=0.6, min_pos_iou=0.6), + sampler=dict(num=256))), + test_cfg=dict(rcnn=dict(score_thr=1e-3))) +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=300), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=None), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img', 'proposals']), + ]) +] +data = dict( + train=dict( + proposal_file=data_root + 'proposals/ga_rpn_r50_fpn_1x_train2017.pkl', + pipeline=train_pipeline), + val=dict( + proposal_file=data_root + 'proposals/ga_rpn_r50_fpn_1x_val2017.pkl', + pipeline=test_pipeline), + test=dict( + proposal_file=data_root + 'proposals/ga_rpn_r50_fpn_1x_val2017.pkl', + pipeline=test_pipeline)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..a40e7c6 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './ga_faster_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..b0add92 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='GARPNHead', + in_channels=256, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=8, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[8], + strides=[4, 8, 16, 32, 64]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.14, 0.14]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.11, 0.11]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + roi_head=dict( + bbox_head=dict(bbox_coder=dict(target_stds=[0.05, 0.05, 0.1, 0.1]))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + center_ratio=0.2, + ignore_ratio=0.5), + rpn_proposal=dict(nms_post=1000, max_per_img=300), + rcnn=dict( + assigner=dict(pos_iou_thr=0.6, neg_iou_thr=0.6, min_pos_iou=0.6), + sampler=dict(type='RandomSampler', num=256))), + test_cfg=dict( + rpn=dict(nms_post=1000, max_per_img=300), rcnn=dict(score_thr=1e-3))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_faster_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_faster_r50_fpn_1x_coco.py new file mode 100644 index 0000000..e3d8238 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_faster_r50_fpn_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='GARPNHead', + in_channels=256, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=8, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[8], + strides=[4, 8, 16, 32, 64]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.14, 0.14]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.11, 0.11]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + roi_head=dict( + bbox_head=dict(bbox_coder=dict(target_stds=[0.05, 0.05, 0.1, 0.1]))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + center_ratio=0.2, + ignore_ratio=0.5), + rpn_proposal=dict(nms_post=1000, max_per_img=300), + rcnn=dict( + assigner=dict(pos_iou_thr=0.6, neg_iou_thr=0.6, min_pos_iou=0.6), + sampler=dict(type='RandomSampler', num=256))), + test_cfg=dict( + rpn=dict(nms_post=1000, max_per_img=300), rcnn=dict(score_thr=1e-3))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..f1dda94 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_faster_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..fb9e2af --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_faster_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..1b1cccd --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './ga_retinanet_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_mstrain_2x.py b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_mstrain_2x.py new file mode 100644 index 0000000..260895b --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_mstrain_2x.py @@ -0,0 +1,169 @@ +_base_ = '../_base_/default_runtime.py' + +# model settings +model = dict( + type='RetinaNet', + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs=True, + num_outs=5), + bbox_head=dict( + type='GARetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.04, loss_weight=1.0))) +# training and testing settings +train_cfg = dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.4, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + center_ratio=0.2, + ignore_ratio=0.5, + debug=False) +test_cfg = dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100) +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 960)], + keep_ratio=True, + multiscale_mode='range'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[16, 22]) +checkpoint_config = dict(interval=1) +# yapf:disable +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + # dict(type='TensorboardLoggerHook') + ]) +# yapf:enable +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..3351201 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,62 @@ +_base_ = '../retinanet/retinanet_r50_caffe_fpn_1x_coco.py' +model = dict( + bbox_head=dict( + _delete_=True, + type='GARetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.04, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.4, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + assigner=dict(neg_iou_thr=0.5, min_pos_iou=0.0), + center_ratio=0.2, + ignore_ratio=0.5)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..7694723 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_r50_fpn_1x_coco.py @@ -0,0 +1,62 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +model = dict( + bbox_head=dict( + _delete_=True, + type='GARetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.04, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.4, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + assigner=dict(neg_iou_thr=0.5, min_pos_iou=0.0), + center_ratio=0.2, + ignore_ratio=0.5)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..c5eb34f --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_retinanet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..5c69a6f --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_retinanet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..039703e --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = './ga_rpn_r50_caffe_fpn_1x_coco.py' +# model settings +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..7830894 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,58 @@ +_base_ = '../rpn/rpn_r50_caffe_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='GARPNHead', + in_channels=256, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=8, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[8], + strides=[4, 8, 16, 32, 64]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.14, 0.14]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.11, 0.11]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + rpn=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + center_ratio=0.2, + ignore_ratio=0.5)), + test_cfg=dict(rpn=dict(nms_post=1000))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_rpn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..27ab3e7 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_r50_fpn_1x_coco.py @@ -0,0 +1,58 @@ +_base_ = '../rpn/rpn_r50_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='GARPNHead', + in_channels=256, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=8, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[8], + strides=[4, 8, 16, 32, 64]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.14, 0.14]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.11, 0.11]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + rpn=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + center_ratio=0.2, + ignore_ratio=0.5)), + test_cfg=dict(rpn=dict(nms_post=1000))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..cccc985 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_rpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..4e134d2 --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_rpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/guided_anchoring/metafile.yml b/downstream/mmdetection/configs/guided_anchoring/metafile.yml new file mode 100644 index 0000000..3019d4a --- /dev/null +++ b/downstream/mmdetection/configs/guided_anchoring/metafile.yml @@ -0,0 +1,246 @@ +Collections: + - Name: Guided Anchoring + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - Guided Anchoring + - ResNet + Paper: + URL: https://arxiv.org/abs/1901.03278 + Title: 'Region Proposal by Guided Anchoring' + README: configs/guided_anchoring/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/dense_heads/ga_retina_head.py#L10 + Version: v2.0.0 + +Models: + - Name: ga_rpn_r50_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.3 + inference time (ms/im): + - value: 63.29 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Region Proposal + Dataset: COCO + Metrics: + AR@1000: 68.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco/ga_rpn_r50_caffe_fpn_1x_coco_20200531-899008a6.pth + + - Name: ga_rpn_r101_caffe_fpn_1x_coco.py + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py.py + Metadata: + Training Memory (GB): 7.3 + inference time (ms/im): + - value: 76.92 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Region Proposal + Dataset: COCO + Metrics: + AR@1000: 69.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco/ga_rpn_r101_caffe_fpn_1x_coco_20200531-ca9ba8fb.pth + + - Name: ga_rpn_x101_32x4d_fpn_1x_coco.py + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py.py + Metadata: + Training Memory (GB): 8.5 + inference time (ms/im): + - value: 100 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Region Proposal + Dataset: COCO + Metrics: + AR@1000: 70.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco/ga_rpn_x101_32x4d_fpn_1x_coco_20200220-c28d1b18.pth + + - Name: ga_rpn_x101_64x4d_fpn_1x_coco.py.py + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py.py.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 133.33 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Region Proposal + Dataset: COCO + Metrics: + AR@1000: 70.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco/ga_rpn_x101_64x4d_fpn_1x_coco_20200225-3c6e1aa2.pth + + - Name: ga_faster_r50_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco/ga_faster_r50_caffe_fpn_1x_coco_20200702_000718-a11ccfe6.pth + + - Name: ga_faster_r101_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco/ga_faster_r101_caffe_fpn_1x_coco_bbox_mAP-0.415_20200505_115528-fb82e499.pth + + - Name: ga_faster_x101_32x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.7 + inference time (ms/im): + - value: 103.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco/ga_faster_x101_32x4d_fpn_1x_coco_20200215-1ded9da3.pth + + - Name: ga_faster_x101_64x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 11.8 + inference time (ms/im): + - value: 136.99 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco/ga_faster_x101_64x4d_fpn_1x_coco_20200215-0fa7bde7.pth + + - Name: ga_retinanet_r50_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.5 + inference time (ms/im): + - value: 59.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco/ga_retinanet_r50_caffe_fpn_1x_coco_20201020-39581c6f.pth + + - Name: ga_retinanet_r101_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco/ga_retinanet_r101_caffe_fpn_1x_coco_20200531-6266453c.pth + + - Name: ga_retinanet_x101_32x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.9 + inference time (ms/im): + - value: 94.34 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco/ga_retinanet_x101_32x4d_fpn_1x_coco_20200219-40c56caa.pth + + - Name: ga_retinanet_x101_64x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 9.9 + inference time (ms/im): + - value: 129.87 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco/ga_retinanet_x101_64x4d_fpn_1x_coco_20200226-ef9f7f1f.pth diff --git a/downstream/mmdetection/configs/hrnet/README.md b/downstream/mmdetection/configs/hrnet/README.md new file mode 100644 index 0000000..e340c78 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/README.md @@ -0,0 +1,101 @@ +# HRNet + +> [Deep High-Resolution Representation Learning for Human Pose Estimation](https://arxiv.org/abs/1902.09212) + + + +## Abstract + +This is an official pytorch implementation of Deep High-Resolution Representation Learning for Human Pose Estimation. In this work, we are interested in the human pose estimation problem with a focus on learning reliable high-resolution representations. Most existing methods recover high-resolution representations from low-resolution representations produced by a high-to-low resolution network. Instead, our proposed network maintains high-resolution representations through the whole process. We start from a high-resolution subnetwork as the first stage, gradually add high-to-low resolution subnetworks one by one to form more stages, and connect the mutli-resolution subnetworks in parallel. We conduct repeated multi-scale fusions such that each of the high-to-low resolution representations receives information from other parallel representations over and over, leading to rich high-resolution representations. As a result, the predicted keypoint heatmap is potentially more accurate and spatially more precise. We empirically demonstrate the effectiveness of our network through the superior pose estimation results over two benchmark datasets: the COCO keypoint detection dataset and the MPII Human Pose dataset. + +High-resolution representation learning plays an essential role in many vision problems, e.g., pose estimation and semantic segmentation. The high-resolution network (HRNet), recently developed for human pose estimation, maintains high-resolution representations through the whole process by connecting high-to-low resolution convolutions in parallel and produces strong high-resolution representations by repeatedly conducting fusions across parallel convolutions. +In this paper, we conduct a further study on high-resolution representations by introducing a simple yet effective modification and apply it to a wide range of vision tasks. We augment the high-resolution representation by aggregating the (upsampled) representations from all the parallel convolutions rather than only the representation from the high-resolution convolution as done in HRNet. This simple modification leads to stronger representations, evidenced by superior results. We show top results in semantic segmentation on Cityscapes, LIP, and PASCAL Context, and facial landmark detection on AFLW, COFW, 300W, and WFLW. In addition, we build a multi-level representation from the high-resolution representation and apply it to the Faster R-CNN object detection framework and the extended frameworks. The proposed approach achieves superior results to existing single-model networks on COCO object detection. + +
    + +
    + +## Results and Models + +### Faster R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 1x | 6.6 | 13.4 | 36.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco/faster_rcnn_hrnetv2p_w18_1x_coco_20200130-56651a6d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco/faster_rcnn_hrnetv2p_w18_1x_coco_20200130_211246.log.json) | +| HRNetV2p-W18 | pytorch | 2x | 6.6 | - | 38.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco/faster_rcnn_hrnetv2p_w18_2x_coco_20200702_085731-a4ec0611.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco/faster_rcnn_hrnetv2p_w18_2x_coco_20200702_085731.log.json) | +| HRNetV2p-W32 | pytorch | 1x | 9.0 | 12.4 | 40.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco/faster_rcnn_hrnetv2p_w32_1x_coco_20200130-6e286425.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco/faster_rcnn_hrnetv2p_w32_1x_coco_20200130_204442.log.json) | +| HRNetV2p-W32 | pytorch | 2x | 9.0 | - | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco/faster_rcnn_hrnetv2p_w32_2x_coco_20200529_015927-976a9c15.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco/faster_rcnn_hrnetv2p_w32_2x_coco_20200529_015927.log.json) | +| HRNetV2p-W40 | pytorch | 1x | 10.4 | 10.5 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco/faster_rcnn_hrnetv2p_w40_1x_coco_20200210-95c1f5ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco/faster_rcnn_hrnetv2p_w40_1x_coco_20200210_125315.log.json) | +| HRNetV2p-W40 | pytorch | 2x | 10.4 | - | 42.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco/faster_rcnn_hrnetv2p_w40_2x_coco_20200512_161033-0f236ef4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco/faster_rcnn_hrnetv2p_w40_2x_coco_20200512_161033.log.json) | + +### Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 1x | 7.0 | 11.7 | 37.7 | 34.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco/mask_rcnn_hrnetv2p_w18_1x_coco_20200205-1c3d78ed.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco/mask_rcnn_hrnetv2p_w18_1x_coco_20200205_232523.log.json) | +| HRNetV2p-W18 | pytorch | 2x | 7.0 | - | 39.8 | 36.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco/mask_rcnn_hrnetv2p_w18_2x_coco_20200212-b3c825b1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco/mask_rcnn_hrnetv2p_w18_2x_coco_20200212_134222.log.json) | +| HRNetV2p-W32 | pytorch | 1x | 9.4 | 11.3 | 41.2 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco/mask_rcnn_hrnetv2p_w32_1x_coco_20200207-b29f616e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco/mask_rcnn_hrnetv2p_w32_1x_coco_20200207_055017.log.json) | +| HRNetV2p-W32 | pytorch | 2x | 9.4 | - | 42.5 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco/mask_rcnn_hrnetv2p_w32_2x_coco_20200213-45b75b4d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco/mask_rcnn_hrnetv2p_w32_2x_coco_20200213_150518.log.json) | +| HRNetV2p-W40 | pytorch | 1x | 10.9 | | 42.1 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco/mask_rcnn_hrnetv2p_w40_1x_coco_20200511_015646-66738b35.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco/mask_rcnn_hrnetv2p_w40_1x_coco_20200511_015646.log.json) | +| HRNetV2p-W40 | pytorch | 2x | 10.9 | | 42.8 | 38.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco/mask_rcnn_hrnetv2p_w40_2x_coco_20200512_163732-aed5e4ab.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco/mask_rcnn_hrnetv2p_w40_2x_coco_20200512_163732.log.json) | + +### Cascade R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 20e | 7.0 | 11.0 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco/cascade_rcnn_hrnetv2p_w18_20e_coco_20200210-434be9d7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco/cascade_rcnn_hrnetv2p_w18_20e_coco_20200210_105632.log.json) | +| HRNetV2p-W32 | pytorch | 20e | 9.4 | 11.0 | 43.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco/cascade_rcnn_hrnetv2p_w32_20e_coco_20200208-928455a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco/cascade_rcnn_hrnetv2p_w32_20e_coco_20200208_160511.log.json) | +| HRNetV2p-W40 | pytorch | 20e | 10.8 | | 43.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco/cascade_rcnn_hrnetv2p_w40_20e_coco_20200512_161112-75e47b04.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco/cascade_rcnn_hrnetv2p_w40_20e_coco_20200512_161112.log.json) | + +### Cascade Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :----------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 20e | 8.5 | 8.5 | 41.6 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20200210-b543cd2b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20200210_093149.log.json) | +| HRNetV2p-W32 | pytorch | 20e | | 8.3 | 44.3 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco/cascade_mask_rcnn_hrnetv2p_w32_20e_coco_20200512_154043-39d9cf7b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco/cascade_mask_rcnn_hrnetv2p_w32_20e_coco_20200512_154043.log.json) | +| HRNetV2p-W40 | pytorch | 20e | 12.5 | | 45.1 | 39.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco/cascade_mask_rcnn_hrnetv2p_w40_20e_coco_20200527_204922-969c4610.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco/cascade_mask_rcnn_hrnetv2p_w40_20e_coco_20200527_204922.log.json) | + +### Hybrid Task Cascade (HTC) + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 20e | 10.8 | 4.7 | 42.8 | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/htc_hrnetv2p_w18_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w18_20e_coco/htc_hrnetv2p_w18_20e_coco_20200210-b266988c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w18_20e_coco/htc_hrnetv2p_w18_20e_coco_20200210_182735.log.json) | +| HRNetV2p-W32 | pytorch | 20e | 13.1 | 4.9 | 45.4 | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/htc_hrnetv2p_w32_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w32_20e_coco/htc_hrnetv2p_w32_20e_coco_20200207-7639fa12.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w32_20e_coco/htc_hrnetv2p_w32_20e_coco_20200207_193153.log.json) | +| HRNetV2p-W40 | pytorch | 20e | 14.6 | | 46.4 | 40.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/htc_hrnetv2p_w40_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w40_20e_coco/htc_hrnetv2p_w40_20e_coco_20200529_183411-417c4d5b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w40_20e_coco/htc_hrnetv2p_w40_20e_coco_20200529_183411.log.json) | + +### FCOS + +| Backbone | Style | GN | MS train | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :-----: | :-: | :------: | :-----: | :------: | :------------: | :----: | :------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | Y | N | 1x | 13.0 | 12.9 | 35.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco_20201212_100710-4ad151de.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco_20201212_100710.log.json) | +| HRNetV2p-W18 | pytorch | Y | N | 2x | 13.0 | - | 38.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco_20201212_101110-5c575fa5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco_20201212_101110.log.json) | +| HRNetV2p-W32 | pytorch | Y | N | 1x | 17.5 | 12.9 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco_20201211_134730-cb8055c0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco_20201211_134730.log.json) | +| HRNetV2p-W32 | pytorch | Y | N | 2x | 17.5 | - | 40.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco_20201212_112133-77b6b9bb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco_20201212_112133.log.json) | +| HRNetV2p-W18 | pytorch | Y | Y | 2x | 13.0 | 12.9 | 38.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco_20201212_111651-441e9d9f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco_20201212_111651.log.json) | +| HRNetV2p-W32 | pytorch | Y | Y | 2x | 17.5 | 12.4 | 41.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco_20201212_090846-b6f2b49f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco_20201212_090846.log.json) | +| HRNetV2p-W48 | pytorch | Y | Y | 2x | 20.3 | 10.8 | 42.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco_20201212_124752-f22d2ce5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco_20201212_124752.log.json) | + +**Note:** + +- The `28e` schedule in HTC indicates decreasing the lr at 24 and 27 epochs, with a total of 28 epochs. +- HRNetV2 ImageNet pretrained models are in [HRNets for Image Classification](https://github.com/HRNet/HRNet-Image-Classification). + +## Citation + +```latex +@inproceedings{SunXLW19, + title={Deep High-Resolution Representation Learning for Human Pose Estimation}, + author={Ke Sun and Bin Xiao and Dong Liu and Jingdong Wang}, + booktitle={CVPR}, + year={2019} +} + +@article{SunZJCXLMWLW19, + title={High-Resolution Representations for Labeling Pixels and Regions}, + author={Ke Sun and Yang Zhao and Borui Jiang and Tianheng Cheng and Bin Xiao + and Dong Liu and Yadong Mu and Xinggang Wang and Wenyu Liu and Jingdong Wang}, + journal = {CoRR}, + volume = {abs/1904.04514}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py b/downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py new file mode 100644 index 0000000..839cf3e --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py @@ -0,0 +1,11 @@ +_base_ = './cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py' +# model settings +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py b/downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py new file mode 100644 index 0000000..9942602 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py @@ -0,0 +1,40 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py b/downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py new file mode 100644 index 0000000..10d5e83 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py @@ -0,0 +1,12 @@ +_base_ = './cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py' +# model settings +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py b/downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py new file mode 100644 index 0000000..ebd5e20 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py @@ -0,0 +1,11 @@ +_base_ = './cascade_rcnn_hrnetv2p_w32_20e_coco.py' +# model settings +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py b/downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py new file mode 100644 index 0000000..e7f89a9 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py @@ -0,0 +1,40 @@ +_base_ = '../cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py b/downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py new file mode 100644 index 0000000..265e8d6 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py @@ -0,0 +1,12 @@ +_base_ = './cascade_rcnn_hrnetv2p_w32_20e_coco.py' +# model settings +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py new file mode 100644 index 0000000..1df2c3d --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = './faster_rcnn_hrnetv2p_w32_1x_coco.py' +# model settings +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py new file mode 100644 index 0000000..a4b987a --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py @@ -0,0 +1,5 @@ +_base_ = './faster_rcnn_hrnetv2p_w18_1x_coco.py' + +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py new file mode 100644 index 0000000..be05809 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py @@ -0,0 +1,37 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py new file mode 100644 index 0000000..63c8717 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './faster_rcnn_hrnetv2p_w32_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py new file mode 100644 index 0000000..886a7c9 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = './faster_rcnn_hrnetv2p_w32_1x_coco.py' +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py new file mode 100644 index 0000000..585cc2c --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './faster_rcnn_hrnetv2p_w40_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..fd662bd --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py @@ -0,0 +1,10 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py' +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py new file mode 100644 index 0000000..3497595 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..37bfdae --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,10 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py' +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..10617f2 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py @@ -0,0 +1,70 @@ +_base_ = '../fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256, + stride=2, + num_outs=5)) +img_norm_cfg = dict( + mean=[103.53, 116.28, 123.675], std=[57.375, 57.12, 58.395], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py new file mode 100644 index 0000000..7b38130 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..482f887 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,39 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py' +img_norm_cfg = dict( + mean=[103.53, 116.28, 123.675], std=[57.375, 57.12, 58.395], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..0ae9dbe --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,11 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py' +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w18_20e_coco.py b/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w18_20e_coco.py new file mode 100644 index 0000000..3c2eb1d --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w18_20e_coco.py @@ -0,0 +1,10 @@ +_base_ = './htc_hrnetv2p_w32_20e_coco.py' +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w32_20e_coco.py b/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w32_20e_coco.py new file mode 100644 index 0000000..545cb83 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w32_20e_coco.py @@ -0,0 +1,37 @@ +_base_ = '../htc/htc_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w40_20e_coco.py b/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w40_20e_coco.py new file mode 100644 index 0000000..94bff1b --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w40_20e_coco.py @@ -0,0 +1,11 @@ +_base_ = './htc_hrnetv2p_w32_20e_coco.py' +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w40_28e_coco.py b/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w40_28e_coco.py new file mode 100644 index 0000000..7067e8b --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/htc_hrnetv2p_w40_28e_coco.py @@ -0,0 +1,4 @@ +_base_ = './htc_hrnetv2p_w40_20e_coco.py' +# learning policy +lr_config = dict(step=[24, 27]) +runner = dict(type='EpochBasedRunner', max_epochs=28) diff --git a/downstream/mmdetection/configs/hrnet/htc_x101_64x4d_fpn_16x1_28e_coco.py b/downstream/mmdetection/configs/hrnet/htc_x101_64x4d_fpn_16x1_28e_coco.py new file mode 100644 index 0000000..815f285 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/htc_x101_64x4d_fpn_16x1_28e_coco.py @@ -0,0 +1,4 @@ +_base_ = '../htc/htc_x101_64x4d_fpn_16x1_20e_coco.py' +# learning policy +lr_config = dict(step=[24, 27]) +runner = dict(type='EpochBasedRunner', max_epochs=28) diff --git a/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py new file mode 100644 index 0000000..cb12200 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py @@ -0,0 +1,10 @@ +_base_ = './mask_rcnn_hrnetv2p_w32_1x_coco.py' +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py new file mode 100644 index 0000000..ca62682 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_hrnetv2p_w18_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py new file mode 100644 index 0000000..d5f0eb5 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py @@ -0,0 +1,37 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py new file mode 100644 index 0000000..63d5d13 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_hrnetv2p_w32_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py new file mode 100644 index 0000000..5a76f4b --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = './mask_rcnn_hrnetv2p_w18_1x_coco.py' +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py new file mode 100644 index 0000000..3a2a510 --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_hrnetv2p_w40_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/hrnet/metafile.yml b/downstream/mmdetection/configs/hrnet/metafile.yml new file mode 100644 index 0000000..ac36efa --- /dev/null +++ b/downstream/mmdetection/configs/hrnet/metafile.yml @@ -0,0 +1,971 @@ +Models: + - Name: faster_rcnn_hrnetv2p_w18_1x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py + Metadata: + Training Memory (GB): 6.6 + inference time (ms/im): + - value: 74.63 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco/faster_rcnn_hrnetv2p_w18_1x_coco_20200130-56651a6d.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w18_2x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py + Metadata: + Training Memory (GB): 6.6 + inference time (ms/im): + - value: 74.63 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco/faster_rcnn_hrnetv2p_w18_2x_coco_20200702_085731-a4ec0611.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w32_1x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py + Metadata: + Training Memory (GB): 9.0 + inference time (ms/im): + - value: 80.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco/faster_rcnn_hrnetv2p_w32_1x_coco_20200130-6e286425.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w32_2x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py + Metadata: + Training Memory (GB): 9.0 + inference time (ms/im): + - value: 80.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco/faster_rcnn_hrnetv2p_w32_2x_coco_20200529_015927-976a9c15.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w40_1x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py + Metadata: + Training Memory (GB): 10.4 + inference time (ms/im): + - value: 95.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco/faster_rcnn_hrnetv2p_w40_1x_coco_20200210-95c1f5ce.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w40_2x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py + Metadata: + Training Memory (GB): 10.4 + inference time (ms/im): + - value: 95.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco/faster_rcnn_hrnetv2p_w40_2x_coco_20200512_161033-0f236ef4.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w18_1x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 85.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco/mask_rcnn_hrnetv2p_w18_1x_coco_20200205-1c3d78ed.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w18_2x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 85.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco/mask_rcnn_hrnetv2p_w18_2x_coco_20200212-b3c825b1.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w32_1x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py + Metadata: + Training Memory (GB): 9.4 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco/mask_rcnn_hrnetv2p_w32_1x_coco_20200207-b29f616e.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w32_2x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py + Metadata: + Training Memory (GB): 9.4 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco/mask_rcnn_hrnetv2p_w32_2x_coco_20200213-45b75b4d.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w40_1x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py + Metadata: + Training Memory (GB): 10.9 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco/mask_rcnn_hrnetv2p_w40_1x_coco_20200511_015646-66738b35.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w40_2x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py + Metadata: + Training Memory (GB): 10.9 + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco/mask_rcnn_hrnetv2p_w40_2x_coco_20200512_163732-aed5e4ab.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_rcnn_hrnetv2p_w18_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco/cascade_rcnn_hrnetv2p_w18_20e_coco_20200210-434be9d7.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_rcnn_hrnetv2p_w32_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py + Metadata: + Training Memory (GB): 9.4 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco/cascade_rcnn_hrnetv2p_w32_20e_coco_20200208-928455a4.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_rcnn_hrnetv2p_w40_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py + Metadata: + Training Memory (GB): 10.8 + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco/cascade_rcnn_hrnetv2p_w40_20e_coco_20200512_161112-75e47b04.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_mask_rcnn_hrnetv2p_w18_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py + Metadata: + Training Memory (GB): 8.5 + inference time (ms/im): + - value: 117.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20200210-b543cd2b.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_mask_rcnn_hrnetv2p_w32_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py + Metadata: + inference time (ms/im): + - value: 120.48 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco/cascade_mask_rcnn_hrnetv2p_w32_20e_coco_20200512_154043-39d9cf7b.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_mask_rcnn_hrnetv2p_w40_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py + Metadata: + Training Memory (GB): 12.5 + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco/cascade_mask_rcnn_hrnetv2p_w40_20e_coco_20200527_204922-969c4610.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: htc_hrnetv2p_w18_20e_coco + In Collection: HTC + Config: configs/hrnet/htc_hrnetv2p_w18_20e_coco.py + Metadata: + Training Memory (GB): 10.8 + inference time (ms/im): + - value: 212.77 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w18_20e_coco/htc_hrnetv2p_w18_20e_coco_20200210-b266988c.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: htc_hrnetv2p_w32_20e_coco + In Collection: HTC + Config: configs/hrnet/htc_hrnetv2p_w32_20e_coco.py + Metadata: + Training Memory (GB): 13.1 + inference time (ms/im): + - value: 204.08 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w32_20e_coco/htc_hrnetv2p_w32_20e_coco_20200207-7639fa12.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: htc_hrnetv2p_w40_20e_coco + In Collection: HTC + Config: configs/hrnet/htc_hrnetv2p_w40_20e_coco.py + Metadata: + Training Memory (GB): 14.6 + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w40_20e_coco/htc_hrnetv2p_w40_20e_coco_20200529_183411-417c4d5b.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w18_gn-head_4x4_1x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 13.0 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 35.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco_20201212_100710-4ad151de.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w18_gn-head_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 13.0 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco_20201212_101110-5c575fa5.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w32_gn-head_4x4_1x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 17.5 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco_20201211_134730-cb8055c0.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w32_gn-head_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 17.5 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco_20201212_112133-77b6b9bb.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 13.0 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco_20201212_111651-441e9d9f.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 17.5 + inference time (ms/im): + - value: 80.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco_20201212_090846-b6f2b49f.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 20.3 + inference time (ms/im): + - value: 92.59 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco_20201212_124752-f22d2ce5.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 diff --git a/downstream/mmdetection/configs/htc/README.md b/downstream/mmdetection/configs/htc/README.md new file mode 100644 index 0000000..03a89aa --- /dev/null +++ b/downstream/mmdetection/configs/htc/README.md @@ -0,0 +1,67 @@ +# HTC + +> [Hybrid Task Cascade for Instance Segmentation](ttps://arxiv.org/abs/1901.07518) + + + +## Abstract + +Cascade is a classic yet powerful architecture that has boosted performance on various tasks. However, how to introduce cascade to instance segmentation remains an open question. A simple combination of Cascade R-CNN and Mask R-CNN only brings limited gain. In exploring a more effective approach, we find that the key to a successful instance segmentation cascade is to fully leverage the reciprocal relationship between detection and segmentation. In this work, we propose a new framework, Hybrid Task Cascade (HTC), which differs in two important aspects: (1) instead of performing cascaded refinement on these two tasks separately, it interweaves them for a joint multi-stage processing; (2) it adopts a fully convolutional branch to provide spatial context, which can help distinguishing hard foreground from cluttered background. Overall, this framework can learn more discriminative features progressively while integrating complementary features together in each stage. Without bells and whistles, a single HTC obtains 38.4 and 1.5 improvement over a strong Cascade Mask R-CNN baseline on MSCOCO dataset. Moreover, our overall system achieves 48.6 mask AP on the test-challenge split, ranking 1st in the COCO 2018 Challenge Object Detection Task. + +
    + +
    + +## Introduction + +HTC requires COCO and [COCO-stuff](http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/stuffthingmaps_trainval2017.zip) dataset for training. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +| | ├── stuffthingmaps +``` + +## Results and Models + +The results on COCO 2017val are shown in the below table. (results on test-dev are usually slightly higher than val) + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 8.2 | 5.8 | 42.3 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_1x_coco/htc_r50_fpn_1x_coco_20200317-7332cf16.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_1x_coco/htc_r50_fpn_1x_coco_20200317_070435.log.json) | +| R-50-FPN | pytorch | 20e | 8.2 | - | 43.3 | 38.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_r50_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_20e_coco/htc_r50_fpn_20e_coco_20200319-fe28c577.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_20e_coco/htc_r50_fpn_20e_coco_20200319_070313.log.json) | +| R-101-FPN | pytorch | 20e | 10.2 | 5.5 | 44.8 | 39.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_r101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r101_fpn_20e_coco/htc_r101_fpn_20e_coco_20200317-9b41b48f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r101_fpn_20e_coco/htc_r101_fpn_20e_coco_20200317_153107.log.json) | +| X-101-32x4d-FPN | pytorch | 20e | 11.4 | 5.0 | 46.1 | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_32x4d_fpn_16x1_20e_coco/htc_x101_32x4d_fpn_16x1_20e_coco_20200318-de97ae01.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_32x4d_fpn_16x1_20e_coco/htc_x101_32x4d_fpn_16x1_20e_coco_20200318_034519.log.json) | +| X-101-64x4d-FPN | pytorch | 20e | 14.5 | 4.4 | 47.0 | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_16x1_20e_coco/htc_x101_64x4d_fpn_16x1_20e_coco_20200318-b181fd7a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_16x1_20e_coco/htc_x101_64x4d_fpn_16x1_20e_coco_20200318_081711.log.json) | + +- In the HTC paper and COCO 2018 Challenge, `score_thr` is set to 0.001 for both baselines and HTC. +- We use 8 GPUs with 2 images/GPU for R-50 and R-101 models, and 16 GPUs with 1 image/GPU for X-101 models. + If you would like to train X-101 HTC with 8 GPUs, you need to change the lr from 0.02 to 0.01. + +We also provide a powerful HTC with DCN and multi-scale training model. No testing augmentation is used. + +| Backbone | Style | DCN | training scales | Lr schd | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :---: | :-------------: | :-----: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| X-101-64x4d-FPN | pytorch | c3-c5 | 400~1400 | 20e | 50.4 | 43.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco_20200312-946fd751.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco_20200312_203410.log.json) | + +## Citation + +We provide config files to reproduce the results in the CVPR 2019 paper for [Hybrid Task Cascade](https://arxiv.org/abs/1901.07518). + +```latex +@inproceedings{chen2019hybrid, + title={Hybrid task cascade for instance segmentation}, + author={Chen, Kai and Pang, Jiangmiao and Wang, Jiaqi and Xiong, Yu and Li, Xiaoxiao and Sun, Shuyang and Feng, Wansen and Liu, Ziwei and Shi, Jianping and Ouyang, Wanli and Chen Change Loy and Dahua Lin}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/htc/htc_r101_fpn_20e_coco.py b/downstream/mmdetection/configs/htc/htc_r101_fpn_20e_coco.py new file mode 100644 index 0000000..b42297b --- /dev/null +++ b/downstream/mmdetection/configs/htc/htc_r101_fpn_20e_coco.py @@ -0,0 +1,9 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/downstream/mmdetection/configs/htc/htc_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/htc/htc_r50_fpn_1x_coco.py new file mode 100644 index 0000000..1e8e18a --- /dev/null +++ b/downstream/mmdetection/configs/htc/htc_r50_fpn_1x_coco.py @@ -0,0 +1,56 @@ +_base_ = './htc_without_semantic_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + semantic_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[8]), + semantic_head=dict( + type='FusedSemanticHead', + num_ins=5, + fusion_level=1, + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=183, + loss_seg=dict( + type='CrossEntropyLoss', ignore_index=255, loss_weight=0.2)))) +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', with_bbox=True, with_mask=True, with_seg=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 8), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict( + seg_prefix=data_root + 'stuffthingmaps/train2017/', + pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/htc/htc_r50_fpn_20e_coco.py b/downstream/mmdetection/configs/htc/htc_r50_fpn_20e_coco.py new file mode 100644 index 0000000..7d2e011 --- /dev/null +++ b/downstream/mmdetection/configs/htc/htc_r50_fpn_20e_coco.py @@ -0,0 +1,4 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/downstream/mmdetection/configs/htc/htc_without_semantic_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/htc/htc_without_semantic_r50_fpn_1x_coco.py new file mode 100644 index 0000000..565104f --- /dev/null +++ b/downstream/mmdetection/configs/htc/htc_without_semantic_r50_fpn_1x_coco.py @@ -0,0 +1,236 @@ +_base_ = [ + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + type='HybridTaskCascade', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='HybridTaskCascadeRoIHead', + interleaved=True, + mask_info_flow=True, + num_stages=3, + stage_loss_weights=[1, 0.5, 0.25], + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=[ + dict( + type='HTCMaskHead', + with_conv_res=False, + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), + dict( + type='HTCMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), + dict( + type='HTCMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)) + ]), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=[ + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.6, + neg_iou_thr=0.6, + min_pos_iou=0.6, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.7, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False) + ]), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.001, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + val=dict(pipeline=test_pipeline), test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py b/downstream/mmdetection/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py new file mode 100644 index 0000000..0c834f2 --- /dev/null +++ b/downstream/mmdetection/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py @@ -0,0 +1,19 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) +data = dict(samples_per_gpu=1, workers_per_gpu=1) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/downstream/mmdetection/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py b/downstream/mmdetection/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py new file mode 100644 index 0000000..8b0d962 --- /dev/null +++ b/downstream/mmdetection/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py @@ -0,0 +1,19 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) +data = dict(samples_per_gpu=1, workers_per_gpu=1) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/downstream/mmdetection/configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py b/downstream/mmdetection/configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py new file mode 100644 index 0000000..c8d8703 --- /dev/null +++ b/downstream/mmdetection/configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py @@ -0,0 +1,43 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', with_bbox=True, with_mask=True, with_seg=True), + dict( + type='Resize', + img_scale=[(1600, 400), (1600, 1400)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 8), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +data = dict( + samples_per_gpu=1, workers_per_gpu=1, train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/downstream/mmdetection/configs/htc/metafile.yml b/downstream/mmdetection/configs/htc/metafile.yml new file mode 100644 index 0000000..acd038c --- /dev/null +++ b/downstream/mmdetection/configs/htc/metafile.yml @@ -0,0 +1,165 @@ +Collections: + - Name: HTC + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - HTC + - RPN + - ResNet + - ResNeXt + - RoIAlign + Paper: + URL: https://arxiv.org/abs/1901.07518 + Title: 'Hybrid Task Cascade for Instance Segmentation' + README: configs/htc/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/htc.py#L6 + Version: v2.0.0 + +Models: + - Name: htc_r50_fpn_1x_coco + In Collection: HTC + Config: configs/htc/htc_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.2 + inference time (ms/im): + - value: 172.41 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_1x_coco/htc_r50_fpn_1x_coco_20200317-7332cf16.pth + + - Name: htc_r50_fpn_20e_coco + In Collection: HTC + Config: configs/htc/htc_r50_fpn_20e_coco.py + Metadata: + Training Memory (GB): 8.2 + inference time (ms/im): + - value: 172.41 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_20e_coco/htc_r50_fpn_20e_coco_20200319-fe28c577.pth + + - Name: htc_r101_fpn_20e_coco + In Collection: HTC + Config: configs/htc/htc_r101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 10.2 + inference time (ms/im): + - value: 181.82 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r101_fpn_20e_coco/htc_r101_fpn_20e_coco_20200317-9b41b48f.pth + + - Name: htc_x101_32x4d_fpn_16x1_20e_coco + In Collection: HTC + Config: configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py + Metadata: + Training Resources: 16x V100 GPUs + Batch Size: 16 + Training Memory (GB): 11.4 + inference time (ms/im): + - value: 200 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_32x4d_fpn_16x1_20e_coco/htc_x101_32x4d_fpn_16x1_20e_coco_20200318-de97ae01.pth + + - Name: htc_x101_64x4d_fpn_16x1_20e_coco + In Collection: HTC + Config: configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py + Metadata: + Training Resources: 16x V100 GPUs + Batch Size: 16 + Training Memory (GB): 14.5 + inference time (ms/im): + - value: 227.27 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_16x1_20e_coco/htc_x101_64x4d_fpn_16x1_20e_coco_20200318-b181fd7a.pth + + - Name: htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco + In Collection: HTC + Config: configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py + Metadata: + Training Resources: 16x V100 GPUs + Batch Size: 16 + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 43.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco_20200312-946fd751.pth diff --git a/downstream/mmdetection/configs/instaboost/README.md b/downstream/mmdetection/configs/instaboost/README.md new file mode 100644 index 0000000..82ed334 --- /dev/null +++ b/downstream/mmdetection/configs/instaboost/README.md @@ -0,0 +1,58 @@ +# Instaboost + +> [Instaboost: Boosting instance segmentation via probability map guided copy-pasting](https://arxiv.org/abs/1908.07801) + + + +## Abstract + +Instance segmentation requires a large number of training samples to achieve satisfactory performance and benefits from proper data augmentation. To enlarge the training set and increase the diversity, previous methods have investigated using data annotation from other domain (e.g. bbox, point) in a weakly supervised mechanism. In this paper, we present a simple, efficient and effective method to augment the training set using the existing instance mask annotations. Exploiting the pixel redundancy of the background, we are able to improve the performance of Mask R-CNN for 1.7 mAP on COCO dataset and 3.3 mAP on Pascal VOC dataset by simply introducing random jittering to objects. Furthermore, we propose a location probability map based approach to explore the feasible locations that objects can be placed based on local appearance similarity. With the guidance of such map, we boost the performance of R101-Mask R-CNN on instance segmentation from 35.7 mAP to 37.9 mAP without modifying the backbone or network structure. Our method is simple to implement and does not increase the computational complexity. It can be integrated into the training pipeline of any instance segmentation model without affecting the training and inference efficiency. + +
    + +
    + +## Introduction + +Configs in this directory is the implementation for ICCV2019 paper "InstaBoost: Boosting Instance Segmentation Via Probability Map Guided Copy-Pasting" and provided by the authors of the paper. InstaBoost is a data augmentation method for object detection and instance segmentation. The paper has been released on [`arXiv`](https://arxiv.org/abs/1908.07801). + +## Usage + +### Requirements + +You need to install `instaboostfast` before using it. + +```shell +pip install instaboostfast +``` + +The code and more details can be found [here](https://github.com/GothicAi/Instaboost). + +### Integration with MMDetection + +InstaBoost have been already integrated in the data pipeline, thus all you need is to add or change **InstaBoost** configurations after **LoadImageFromFile**. We have provided examples like [this](mask_rcnn_r50_fpn_instaboost_4x#L121). You can refer to [`InstaBoostConfig`](https://github.com/GothicAi/InstaBoost-pypi#instaboostconfig) for more details. + +## Results and Models + +- All models were trained on `coco_2017_train` and tested on `coco_2017_val` for convenience of evaluation and comparison. In the paper, the results are obtained from `test-dev`. +- To balance accuracy and training time when using InstaBoost, models released in this page are all trained for 48 Epochs. Other training and testing configs strictly follow the original framework. +- For results and models in MMDetection V1.x, please refer to [Instaboost](https://github.com/GothicAi/Instaboost). + +| Network | Backbone | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-----------: | :-------------: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Mask R-CNN | R-50-FPN | 4x | 4.4 | 17.5 | 40.6 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco/mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-d025f83a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco/mask_rcnn_r50_fpn_instaboost_4x_coco_20200307_223635.log.json) | +| Mask R-CNN | R-101-FPN | 4x | 6.4 | | 42.5 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco/mask_rcnn_r101_fpn_instaboost_4x_coco_20200703_235738-f23f3a5f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco/mask_rcnn_r101_fpn_instaboost_4x_coco_20200703_235738.log.json) | +| Mask R-CNN | X-101-64x4d-FPN | 4x | 10.7 | | 44.7 | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco_20200515_080947-8ed58c1b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco_20200515_080947.log.json) | +| Cascade R-CNN | R-101-FPN | 4x | 6.0 | 12.0 | 43.7 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-c19d98d9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco_20200307_223646.log.json) | + +## Citation + +```latex +@inproceedings{fang2019instaboost, + title={Instaboost: Boosting instance segmentation via probability map guided copy-pasting}, + author={Fang, Hao-Shu and Sun, Jianhua and Wang, Runzhong and Gou, Minghao and Li, Yong-Lu and Lu, Cewu}, + booktitle={Proceedings of the IEEE International Conference on Computer Vision}, + pages={682--691}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_r101_fpn_instaboost_4x_coco.py b/downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_r101_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..9d0515d --- /dev/null +++ b/downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_r101_fpn_instaboost_4x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py b/downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..a89a81f --- /dev/null +++ b/downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py @@ -0,0 +1,28 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='InstaBoost', + action_candidate=('normal', 'horizontal', 'skip'), + action_prob=(1, 0, 0), + scale=(0.8, 1.2), + dx=15, + dy=15, + theta=(-1, 1), + color_prob=0.5, + hflag=False, + aug_ratio=0.5), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[32, 44]) +runner = dict(type='EpochBasedRunner', max_epochs=48) diff --git a/downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py b/downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..d67b799 --- /dev/null +++ b/downstream/mmdetection/configs/instaboost/cascade_mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py b/downstream/mmdetection/configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..ebbb43e --- /dev/null +++ b/downstream/mmdetection/configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_instaboost_4x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py b/downstream/mmdetection/configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..55ca62b --- /dev/null +++ b/downstream/mmdetection/configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py @@ -0,0 +1,28 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='InstaBoost', + action_candidate=('normal', 'horizontal', 'skip'), + action_prob=(1, 0, 0), + scale=(0.8, 1.2), + dx=15, + dy=15, + theta=(-1, 1), + color_prob=0.5, + hflag=False, + aug_ratio=0.5), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[32, 44]) +runner = dict(type='EpochBasedRunner', max_epochs=48) diff --git a/downstream/mmdetection/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py b/downstream/mmdetection/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..2010f44 --- /dev/null +++ b/downstream/mmdetection/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_instaboost_4x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/instaboost/metafile.yml b/downstream/mmdetection/configs/instaboost/metafile.yml new file mode 100644 index 0000000..325283d --- /dev/null +++ b/downstream/mmdetection/configs/instaboost/metafile.yml @@ -0,0 +1,99 @@ +Collections: + - Name: InstaBoost + Metadata: + Training Data: COCO + Training Techniques: + - InstaBoost + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Paper: + URL: https://arxiv.org/abs/1908.07801 + Title: 'Instaboost: Boosting instance segmentation via probability map guided copy-pasting' + README: configs/instaboost/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/datasets/pipelines/instaboost.py#L7 + Version: v2.0.0 + +Models: + - Name: mask_rcnn_r50_fpn_instaboost_4x_coco + In Collection: InstaBoost + Config: configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 57.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 48 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco/mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-d025f83a.pth + + - Name: mask_rcnn_r101_fpn_instaboost_4x_coco + In Collection: InstaBoost + Config: configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py + Metadata: + Training Memory (GB): 6.4 + Epochs: 48 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco/mask_rcnn_r101_fpn_instaboost_4x_coco_20200703_235738-f23f3a5f.pth + + - Name: mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco + In Collection: InstaBoost + Config: configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py + Metadata: + Training Memory (GB): 10.7 + Epochs: 48 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco_20200515_080947-8ed58c1b.pth + + - Name: cascade_mask_rcnn_r50_fpn_instaboost_4x_coco + In Collection: InstaBoost + Config: configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 83.33 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 48 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-c19d98d9.pth diff --git a/downstream/mmdetection/configs/lad/README.md b/downstream/mmdetection/configs/lad/README.md new file mode 100644 index 0000000..6cad7d9 --- /dev/null +++ b/downstream/mmdetection/configs/lad/README.md @@ -0,0 +1,44 @@ +# LAD + +> [Improving Object Detection by Label Assignment Distillation](https://arxiv.org/abs/2108.10520) + + + +## Abstract + +Label assignment in object detection aims to assign targets, foreground or background, to sampled regions in an image. Unlike labeling for image classification, this problem is not well defined due to the object's bounding box. In this paper, we investigate the problem from a perspective of distillation, hence we call Label Assignment Distillation (LAD). Our initial motivation is very simple, we use a teacher network to generate labels for the student. This can be achieved in two ways: either using the teacher's prediction as the direct targets (soft label), or through the hard labels dynamically assigned by the teacher (LAD). Our experiments reveal that: (i) LAD is more effective than soft-label, but they are complementary. (ii) Using LAD, a smaller teacher can also improve a larger student significantly, while soft-label can't. We then introduce Co-learning LAD, in which two networks simultaneously learn from scratch and the role of teacher and student are dynamically interchanged. Using PAA-ResNet50 as a teacher, our LAD techniques can improve detectors PAA-ResNet101 and PAA-ResNeXt101 to 46AP and 47.5AP on the COCO test-dev set. With a stronger teacher PAA-SwinB, we improve the students PAA-ResNet50 to 43.7AP by only 1x schedule training and standard setting, and PAA-ResNet101 to 47.9AP, significantly surpassing the current methods. + +
    + +
    + +## Results and Models + +We provide config files to reproduce the object detection results in the +WACV 2022 paper for Improving Object Detection by Label Assignment +Distillation. + +### PAA with LAD + +| Teacher | Student | Training schedule | AP (val) | Config | +| :-----: | :-----: | :---------------: | :------: | :---------------------------------------------------: | +| -- | R-50 | 1x | 40.4 | | +| -- | R-101 | 1x | 42.6 | | +| R-101 | R-50 | 1x | 41.6 | [config](configs/lad/lad_r50_paa_r101_fpn_coco_1x.py) | +| R-50 | R-101 | 1x | 43.2 | [config](configs/lad/lad_r101_paa_r50_fpn_coco_1x.py) | + +## Note + +- Meaning of Config name: lad_r50(student model)\_paa(based on paa)\_r101(teacher model)\_fpn(neck)\_coco(dataset)\_1x(12 epoch).py +- Results may fluctuate by about 0.2 mAP. + +## Citation + +```latex +@inproceedings{nguyen2021improving, + title={Improving Object Detection by Label Assignment Distillation}, + author={Chuong H. Nguyen and Thuy C. Nguyen and Tuan N. Tang and Nam L. H. Phan}, + booktitle = {WACV}, + year={2022} +} +``` diff --git a/downstream/mmdetection/configs/lad/lad_r101_paa_r50_fpn_coco_1x.py b/downstream/mmdetection/configs/lad/lad_r101_paa_r50_fpn_coco_1x.py new file mode 100644 index 0000000..4877d95 --- /dev/null +++ b/downstream/mmdetection/configs/lad/lad_r101_paa_r50_fpn_coco_1x.py @@ -0,0 +1,126 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +teacher_ckpt = 'https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.pth' # noqa +model = dict( + type='LAD', + # student + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='LADHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # teacher + teacher_ckpt=teacher_ckpt, + teacher_backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch'), + teacher_neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + teacher_bbox_head=dict( + type='LADHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.1, + neg_iou_thr=0.1, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + score_voting=True, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +data = dict(samples_per_gpu=8, workers_per_gpu=4) +optimizer = dict(lr=0.01) +fp16 = dict(loss_scale=512.) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/lad/lad_r50_paa_r101_fpn_coco_1x.py b/downstream/mmdetection/configs/lad/lad_r50_paa_r101_fpn_coco_1x.py new file mode 100644 index 0000000..29bbe69 --- /dev/null +++ b/downstream/mmdetection/configs/lad/lad_r50_paa_r101_fpn_coco_1x.py @@ -0,0 +1,125 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +teacher_ckpt = 'http://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.pth' # noqa +model = dict( + type='LAD', + # student + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='LADHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # teacher + teacher_ckpt=teacher_ckpt, + teacher_backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch'), + teacher_neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + teacher_bbox_head=dict( + type='LADHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.1, + neg_iou_thr=0.1, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + score_voting=True, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +data = dict(samples_per_gpu=8, workers_per_gpu=4) +optimizer = dict(lr=0.01) +fp16 = dict(loss_scale=512.) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/lad/metafile.yml b/downstream/mmdetection/configs/lad/metafile.yml new file mode 100644 index 0000000..5076f28 --- /dev/null +++ b/downstream/mmdetection/configs/lad/metafile.yml @@ -0,0 +1,42 @@ +Collections: + - Name: Label Assignment Distillation + Metadata: + Training Data: COCO + Training Techniques: + - Label Assignment Distillation + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/2108.10520 + Title: 'Improving Object Detection by Label Assignment Distillation' + README: configs/lad/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.19.0/mmdet/models/detectors/lad.py#L10 + Version: v2.19.0 + +Models: + - Name: lad_r50_paa_r101_fpn_coco_1x + In Collection: Label Assignment Distillation + Config: configs/lad/lad_r50_paa_r101_fpn_coco_1x.py + Metadata: + Teacher: R-101 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + + - Name: lad_r101_paa_r50_fpn_coco_1x + In Collection: Label Assignment Distillation + Config: configs/lad/lad_r101_paa_r50_fpn_coco_1x.py + Metadata: + Teacher: R-50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.2 diff --git a/downstream/mmdetection/configs/ld/README.md b/downstream/mmdetection/configs/ld/README.md new file mode 100644 index 0000000..6556542 --- /dev/null +++ b/downstream/mmdetection/configs/ld/README.md @@ -0,0 +1,43 @@ +# LD + +> [Localization Distillation for Dense Object Detection](https://arxiv.org/abs/2102.12252) + + + +## Abstract + +Knowledge distillation (KD) has witnessed its powerful capability in learning compact models in object detection. Previous KD methods for object detection mostly focus on imitating deep features within the imitation regions instead of mimicking classification logits due to its inefficiency in distilling localization information. In this paper, by reformulating the knowledge distillation process on localization, we present a novel localization distillation (LD) method which can efficiently transfer the localization knowledge from the teacher to the student. Moreover, we also heuristically introduce the concept of valuable localization region that can aid to selectively distill the semantic and localization knowledge for a certain region. Combining these two new components, for the first time, we show that logit mimicking can outperform feature imitation and localization knowledge distillation is more important and efficient than semantic knowledge for distilling object detectors. Our distillation scheme is simple as well as effective and can be easily applied to different dense object detectors. Experiments show that our LD can boost the AP score of GFocal-ResNet-50 with a single-scale 1× training schedule from 40.1 to 42.1 on the COCO benchmark without any sacrifice on the inference speed. + +
    + +
    + +## Results and Models + +### GFocalV1 with LD + +| Teacher | Student | Training schedule | Mini-batch size | AP (val) | AP50 (val) | AP75 (val) | Config | +| :-------: | :-----: | :---------------: | :-------------: | :------: | :--------: | :--------: | :-------------------------------------------------------------------------------------------------------------: | +| -- | R-18 | 1x | 6 | 35.8 | 53.1 | 38.2 | | +| R-101 | R-18 | 1x | 6 | 36.5 | 52.9 | 39.3 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py) | +| -- | R-34 | 1x | 6 | 38.9 | 56.6 | 42.2 | | +| R-101 | R-34 | 1x | 6 | 39.8 | 56.6 | 43.1 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py) | +| -- | R-50 | 1x | 6 | 40.1 | 58.2 | 43.1 | | +| R-101 | R-50 | 1x | 6 | 41.1 | 58.7 | 44.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py) | +| -- | R-101 | 2x | 6 | 44.6 | 62.9 | 48.4 | | +| R-101-DCN | R-101 | 2x | 6 | 45.4 | 63.1 | 49.5 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_1x.py) | + +## Note + +- Meaning of Config name: ld_r18(student model)\_gflv1(based on gflv1)\_r101(teacher model)\_fpn(neck)\_coco(dataset)\_1x(12 epoch).py + +## Citation + +```latex +@Inproceedings{zheng2022LD, + title={Localization Distillation for Dense Object Detection}, + author= {Zheng, Zhaohui and Ye, Rongguang and Wang, Ping and Ren, Dongwei and Zuo, Wangmeng and Hou, Qibin and Cheng, Mingming}, + booktitle={CVPR}, + year={2022} +} +``` diff --git a/downstream/mmdetection/configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py b/downstream/mmdetection/configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py new file mode 100644 index 0000000..1cbdb4c --- /dev/null +++ b/downstream/mmdetection/configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py @@ -0,0 +1,44 @@ +_base_ = ['./ld_r18_gflv1_r101_fpn_coco_1x.py'] +teacher_ckpt = 'https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20200630_102002-134b07df.pth' # noqa +model = dict( + teacher_config='configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py', + teacher_ckpt=teacher_ckpt, + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5)) + +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) +# multi-scale training +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/downstream/mmdetection/configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py b/downstream/mmdetection/configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py new file mode 100644 index 0000000..18dce81 --- /dev/null +++ b/downstream/mmdetection/configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py @@ -0,0 +1,62 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +teacher_ckpt = 'https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_mstrain_2x_coco/gfl_r101_fpn_mstrain_2x_coco_20200629_200126-dd12f847.pth' # noqa +model = dict( + type='KnowledgeDistillationSingleStageDetector', + teacher_config='configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py', + teacher_ckpt=teacher_ckpt, + backbone=dict( + type='ResNet', + depth=18, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet18')), + neck=dict( + type='FPN', + in_channels=[64, 128, 256, 512], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='LDHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + loss_cls=dict( + type='QualityFocalLoss', + use_sigmoid=True, + beta=2.0, + loss_weight=1.0), + loss_dfl=dict(type='DistributionFocalLoss', loss_weight=0.25), + loss_ld=dict( + type='KnowledgeDistillationKLDivLoss', loss_weight=0.25, T=10), + reg_max=16, + loss_bbox=dict(type='GIoULoss', loss_weight=2.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py b/downstream/mmdetection/configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py new file mode 100644 index 0000000..3b6996d --- /dev/null +++ b/downstream/mmdetection/configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py @@ -0,0 +1,19 @@ +_base_ = ['./ld_r18_gflv1_r101_fpn_coco_1x.py'] +model = dict( + backbone=dict( + type='ResNet', + depth=34, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet34')), + neck=dict( + type='FPN', + in_channels=[64, 128, 256, 512], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5)) diff --git a/downstream/mmdetection/configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py b/downstream/mmdetection/configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py new file mode 100644 index 0000000..2b18785 --- /dev/null +++ b/downstream/mmdetection/configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py @@ -0,0 +1,19 @@ +_base_ = ['./ld_r18_gflv1_r101_fpn_coco_1x.py'] +model = dict( + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5)) diff --git a/downstream/mmdetection/configs/ld/metafile.yml b/downstream/mmdetection/configs/ld/metafile.yml new file mode 100644 index 0000000..d555a6d --- /dev/null +++ b/downstream/mmdetection/configs/ld/metafile.yml @@ -0,0 +1,72 @@ +Collections: + - Name: Localization Distillation + Metadata: + Training Data: COCO + Training Techniques: + - Localization Distillation + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/2102.12252 + Title: 'Localization Distillation for Dense Object Detection' + README: configs/ld/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.11.0/mmdet/models/dense_heads/ld_head.py#L11 + Version: v2.11.0 + +Models: + - Name: ld_r18_gflv1_r101_fpn_coco_1x + In Collection: Localization Distillation + Config: configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py + Metadata: + Teacher: R-101 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.5 + box AP@0.5: 52.9 + box AP@0.75: 39.3 + + - Name: ld_r34_gflv1_r101_fpn_coco_1x + In Collection: Localization Distillation + Config: configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py + Metadata: + Teacher: R-101 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.8 + box AP@0.5: 56.6 + box AP@0.75: 43.1 + + - Name: ld_r50_gflv1_r101_fpn_coco_1x + In Collection: Localization Distillation + Config: configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py + Metadata: + Teacher: R-101 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.1 + box AP@0.5: 58.7 + box AP@0.75: 44.9 + + - Name: ld_r101_gflv1_r101dcn_fpn_coco_1x + In Collection: Localization Distillation + Config: configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_1x.py + Metadata: + Teacher: R-101-DCN + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.4 + box AP@0.5: 63.1 + box AP@0.75: 49.5 diff --git a/downstream/mmdetection/configs/legacy_1.x/README.md b/downstream/mmdetection/configs/legacy_1.x/README.md new file mode 100644 index 0000000..c48477f --- /dev/null +++ b/downstream/mmdetection/configs/legacy_1.x/README.md @@ -0,0 +1,54 @@ +# Legacy Configs in MMDetection V1.x + + + +Configs in this directory implement the legacy configs used by MMDetection V1.x and its model zoos. + +To help users convert their models from V1.x to MMDetection V2.0, we provide v1.x configs to inference the converted v1.x models. +Due to the BC-breaking changes in MMDetection V2.0 from MMDetection V1.x, running inference with the same model weights in these two version will produce different results. The difference will cause within 1% AP absolute difference as can be found in the following table. + +## Usage + +To upgrade the model version, the users need to do the following steps. + +### 1. Convert model weights + +There are three main difference in the model weights between V1.x and V2.0 codebases. + +1. Since the class order in all the detector's classification branch is reordered, all the legacy model weights need to go through the conversion process. +2. The regression and segmentation head no longer contain the background channel. Weights in these background channels should be removed to fix in the current codebase. +3. For two-stage detectors, their wegihts need to be upgraded since MMDetection V2.0 refactors all the two-stage detectors with `RoIHead`. + +The users can do the same modification as mentioned above for the self-implemented +detectors. We provide a scripts `tools/model_converters/upgrade_model_version.py` to convert the model weights in the V1.x model zoo. + +```bash +python tools/model_converters/upgrade_model_version.py ${OLD_MODEL_PATH} ${NEW_MODEL_PATH} --num-classes ${NUM_CLASSES} + +``` + +- OLD_MODEL_PATH: the path to load the model weights in 1.x version. +- NEW_MODEL_PATH: the path to save the converted model weights in 2.0 version. +- NUM_CLASSES: number of classes of the original model weights. Usually it is 81 for COCO dataset, 21 for VOC dataset. + The number of classes in V2.0 models should be equal to that in V1.x models - 1. + +### 2. Use configs with legacy settings + +After converting the model weights, checkout to the v1.2 release to find the corresponding config file that uses the legacy settings. +The V1.x models usually need these three legacy modules: `LegacyAnchorGenerator`, `LegacyDeltaXYWHBBoxCoder`, and `RoIAlign(align=False)`. +For models using ResNet Caffe backbones, they also need to change the pretrain name and the corresponding `img_norm_cfg`. +An example is in [`retinanet_r50_caffe_fpn_1x_coco_v1.py`](retinanet_r50_caffe_fpn_1x_coco_v1.py) +Then use the config to test the model weights. For most models, the obtained results should be close to that in V1.x. +We provide configs of some common structures in this directory. + +## Performance + +The performance change after converting the models in this directory are listed as the following. + +| Method | Style | Lr schd | V1.x box AP | V1.x mask AP | V2.0 box AP | V2.0 mask AP | Config | Download | +| :-------------------------: | :-----: | :-----: | :---------: | :----------: | :---------: | :----------: | :------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | +| Mask R-CNN R-50-FPN | pytorch | 1x | 37.3 | 34.2 | 36.8 | 33.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/mask_rcnn_r50_fpn_1x_coco_v1.py) | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/mask_rcnn_r50_fpn_1x_20181010-069fa190.pth) | +| RetinaNet R-50-FPN | caffe | 1x | 35.8 | - | 35.4 | - | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/retinanet_r50_caffe_1x_coco_v1.py) | | +| RetinaNet R-50-FPN | pytorch | 1x | 35.6 | - | 35.2 | - | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/retinanet_r50_fpn_1x_coco_v1.py) | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/retinanet_r50_fpn_1x_20181125-7b0c2548.pth) | +| Cascade Mask R-CNN R-50-FPN | pytorch | 1x | 41.2 | 35.7 | 40.8 | 35.6 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/cascade_mask_rcnn_r50_fpn_1x_coco_v1.py) | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/cascade_mask_rcnn_r50_fpn_1x_20181123-88b170c9.pth) | +| SSD300-VGG16 | caffe | 120e | 25.7 | - | 25.4 | - | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/ssd300_coco_v1.py) | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/ssd300_coco_vgg16_caffe_120e_20181221-84d7110b.pth) | diff --git a/downstream/mmdetection/configs/legacy_1.x/cascade_mask_rcnn_r50_fpn_1x_coco_v1.py b/downstream/mmdetection/configs/legacy_1.x/cascade_mask_rcnn_r50_fpn_1x_coco_v1.py new file mode 100644 index 0000000..fc9d004 --- /dev/null +++ b/downstream/mmdetection/configs/legacy_1.x/cascade_mask_rcnn_r50_fpn_1x_coco_v1.py @@ -0,0 +1,79 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + anchor_generator=dict(type='LegacyAnchorGenerator', center_offset=0.5), + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0])), + roi_head=dict( + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=7, + sampling_ratio=2, + aligned=False)), + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + reg_class_agnostic=True, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2])), + dict( + type='Shared2FCBBoxHead', + reg_class_agnostic=True, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1])), + dict( + type='Shared2FCBBoxHead', + reg_class_agnostic=True, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067])), + ], + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=14, + sampling_ratio=2, + aligned=False)))) +dist_params = dict(backend='nccl', port=29515) diff --git a/downstream/mmdetection/configs/legacy_1.x/faster_rcnn_r50_fpn_1x_coco_v1.py b/downstream/mmdetection/configs/legacy_1.x/faster_rcnn_r50_fpn_1x_coco_v1.py new file mode 100644 index 0000000..8c573be --- /dev/null +++ b/downstream/mmdetection/configs/legacy_1.x/faster_rcnn_r50_fpn_1x_coco_v1.py @@ -0,0 +1,38 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='FasterRCNN', + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + rpn_head=dict( + type='RPNHead', + anchor_generator=dict( + type='LegacyAnchorGenerator', + center_offset=0.5, + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=7, + sampling_ratio=2, + aligned=False), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn_proposal=dict(max_per_img=2000), + rcnn=dict(assigner=dict(match_low_quality=True)))) diff --git a/downstream/mmdetection/configs/legacy_1.x/mask_rcnn_r50_fpn_1x_coco_v1.py b/downstream/mmdetection/configs/legacy_1.x/mask_rcnn_r50_fpn_1x_coco_v1.py new file mode 100644 index 0000000..04581bb --- /dev/null +++ b/downstream/mmdetection/configs/legacy_1.x/mask_rcnn_r50_fpn_1x_coco_v1.py @@ -0,0 +1,34 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + rpn_head=dict( + anchor_generator=dict(type='LegacyAnchorGenerator', center_offset=0.5), + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=7, + sampling_ratio=2, + aligned=False)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=14, + sampling_ratio=2, + aligned=False)), + bbox_head=dict( + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + + # model training and testing settings + train_cfg=dict( + rpn_proposal=dict(max_per_img=2000), + rcnn=dict(assigner=dict(match_low_quality=True)))) diff --git a/downstream/mmdetection/configs/legacy_1.x/retinanet_r50_caffe_fpn_1x_coco_v1.py b/downstream/mmdetection/configs/legacy_1.x/retinanet_r50_caffe_fpn_1x_coco_v1.py new file mode 100644 index 0000000..a63d248 --- /dev/null +++ b/downstream/mmdetection/configs/legacy_1.x/retinanet_r50_caffe_fpn_1x_coco_v1.py @@ -0,0 +1,41 @@ +_base_ = './retinanet_r50_fpn_1x_coco_v1.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/legacy_1.x/retinanet_r50_fpn_1x_coco_v1.py b/downstream/mmdetection/configs/legacy_1.x/retinanet_r50_fpn_1x_coco_v1.py new file mode 100644 index 0000000..6198b97 --- /dev/null +++ b/downstream/mmdetection/configs/legacy_1.x/retinanet_r50_fpn_1x_coco_v1.py @@ -0,0 +1,17 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + bbox_head=dict( + type='RetinaHead', + anchor_generator=dict( + type='LegacyAnchorGenerator', + center_offset=0.5, + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0))) diff --git a/downstream/mmdetection/configs/legacy_1.x/ssd300_coco_v1.py b/downstream/mmdetection/configs/legacy_1.x/ssd300_coco_v1.py new file mode 100644 index 0000000..65ccc1e --- /dev/null +++ b/downstream/mmdetection/configs/legacy_1.x/ssd300_coco_v1.py @@ -0,0 +1,84 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +# model settings +input_size = 300 +model = dict( + bbox_head=dict( + type='SSDHead', + anchor_generator=dict( + type='LegacySSDAnchorGenerator', + scale_major=False, + input_size=input_size, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]), + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]))) +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=3, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=2e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +dist_params = dict(backend='nccl', port=29555) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/libra_rcnn/README.md b/downstream/mmdetection/configs/libra_rcnn/README.md new file mode 100644 index 0000000..87a128a --- /dev/null +++ b/downstream/mmdetection/configs/libra_rcnn/README.md @@ -0,0 +1,53 @@ +# Libra R-CNN + +> [Libra R-CNN: Towards Balanced Learning for Object Detection](https://arxiv.org/abs/1904.02701) + + + +## Abstract + +Compared with model architectures, the training process, which is also crucial to the success of detectors, has received relatively less attention in object detection. In this work, we carefully revisit the standard training practice of detectors, and find that the detection performance is often limited by the imbalance during the training process, which generally consists in three levels - sample level, feature level, and objective level. To mitigate the adverse effects caused thereby, we propose Libra R-CNN, a simple but effective framework towards balanced learning for object detection. It integrates three novel components: IoU-balanced sampling, balanced feature pyramid, and balanced L1 loss, respectively for reducing the imbalance at sample, feature, and objective level. Benefitted from the overall balanced design, Libra R-CNN significantly improves the detection performance. Without bells and whistles, it achieves 2.5 points and 2.0 points higher Average Precision (AP) than FPN Faster R-CNN and RetinaNet respectively on MSCOCO. + +Instance recognition is rapidly advanced along with the developments of various deep convolutional neural networks. Compared to the architectures of networks, the training process, which is also crucial to the success of detectors, has received relatively less attention. In this work, we carefully revisit the standard training practice of detectors, and find that the detection performance is often limited by the imbalance during the training process, which generally consists in three levels - sample level, feature level, and objective level. To mitigate the adverse effects caused thereby, we propose Libra R-CNN, a simple yet effective framework towards balanced learning for instance recognition. It integrates IoU-balanced sampling, balanced feature pyramid, and objective re-weighting, respectively for reducing the imbalance at sample, feature, and objective level. Extensive experiments conducted on MS COCO, LVIS and Pascal VOC datasets prove the effectiveness of the overall balanced design. + +
    + +
    + +## Results and Models + +The results on COCO 2017val are shown in the below table. (results on test-dev are usually slightly higher than val) + +| Architecture | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | R-50-FPN | pytorch | 1x | 4.6 | 19.0 | 38.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco/libra_faster_rcnn_r50_fpn_1x_coco_20200130-3afee3a9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco/libra_faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| Fast R-CNN | R-50-FPN | pytorch | 1x | | | | | | +| Faster R-CNN | R-101-FPN | pytorch | 1x | 6.5 | 14.4 | 40.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco/libra_faster_rcnn_r101_fpn_1x_coco_20200203-8dba6a5a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco/libra_faster_rcnn_r101_fpn_1x_coco_20200203_001405.log.json) | +| Faster R-CNN | X-101-64x4d-FPN | pytorch | 1x | 10.8 | 8.5 | 42.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco/libra_faster_rcnn_x101_64x4d_fpn_1x_coco_20200315-3a7d0488.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco/libra_faster_rcnn_x101_64x4d_fpn_1x_coco_20200315_231625.log.json) | +| RetinaNet | R-50-FPN | pytorch | 1x | 4.2 | 17.7 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_retinanet_r50_fpn_1x_coco/libra_retinanet_r50_fpn_1x_coco_20200205-804d94ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_retinanet_r50_fpn_1x_coco/libra_retinanet_r50_fpn_1x_coco_20200205_112757.log.json) | + +## Citation + +We provide config files to reproduce the results in the CVPR 2019 paper [Libra R-CNN](https://arxiv.org/pdf/1904.02701.pdf). + +The extended version of [Libra R-CNN](https://arxiv.org/pdf/2108.10175.pdf) is accpeted by IJCV. + +```latex +@inproceedings{pang2019libra, + title={Libra R-CNN: Towards Balanced Learning for Object Detection}, + author={Pang, Jiangmiao and Chen, Kai and Shi, Jianping and Feng, Huajun and Ouyang, Wanli and Dahua Lin}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019} +} + +@article{pang2021towards, + title={Towards Balanced Learning for Instance Recognition}, + author={Pang, Jiangmiao and Chen, Kai and Li, Qi and Xu, Zhihai and Feng, Huajun and Shi, Jianping and Ouyang, Wanli and Lin, Dahua}, + journal={International Journal of Computer Vision}, + volume={129}, + number={5}, + pages={1376--1393}, + year={2021}, + publisher={Springer} +} +``` diff --git a/downstream/mmdetection/configs/libra_rcnn/libra_fast_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/libra_rcnn/libra_fast_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..efbedc8 --- /dev/null +++ b/downstream/mmdetection/configs/libra_rcnn/libra_fast_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,50 @@ +_base_ = '../fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py' +# model settings +model = dict( + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + dict( + type='BFP', + in_channels=256, + num_levels=5, + refine_level=2, + refine_type='non_local') + ], + roi_head=dict( + bbox_head=dict( + loss_bbox=dict( + _delete_=True, + type='BalancedL1Loss', + alpha=0.5, + gamma=1.5, + beta=1.0, + loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + sampler=dict( + _delete_=True, + type='CombinedSampler', + num=512, + pos_fraction=0.25, + add_gt_as_proposals=True, + pos_sampler=dict(type='InstanceBalancedPosSampler'), + neg_sampler=dict( + type='IoUBalancedNegSampler', + floor_thr=-1, + floor_fraction=0, + num_bins=3))))) +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +data = dict( + train=dict(proposal_file=data_root + + 'libra_proposals/rpn_r50_fpn_1x_train2017.pkl'), + val=dict(proposal_file=data_root + + 'libra_proposals/rpn_r50_fpn_1x_val2017.pkl'), + test=dict(proposal_file=data_root + + 'libra_proposals/rpn_r50_fpn_1x_val2017.pkl')) diff --git a/downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..e899706 --- /dev/null +++ b/downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './libra_faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..89a0d7b --- /dev/null +++ b/downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,41 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +# model settings +model = dict( + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + dict( + type='BFP', + in_channels=256, + num_levels=5, + refine_level=2, + refine_type='non_local') + ], + roi_head=dict( + bbox_head=dict( + loss_bbox=dict( + _delete_=True, + type='BalancedL1Loss', + alpha=0.5, + gamma=1.5, + beta=1.0, + loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict(sampler=dict(neg_pos_ub=5), allowed_border=-1), + rcnn=dict( + sampler=dict( + _delete_=True, + type='CombinedSampler', + num=512, + pos_fraction=0.25, + add_gt_as_proposals=True, + pos_sampler=dict(type='InstanceBalancedPosSampler'), + neg_sampler=dict( + type='IoUBalancedNegSampler', + floor_thr=-1, + floor_fraction=0, + num_bins=3))))) diff --git a/downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..06740a7 --- /dev/null +++ b/downstream/mmdetection/configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './libra_faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..be27420 --- /dev/null +++ b/downstream/mmdetection/configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py @@ -0,0 +1,26 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +# model settings +model = dict( + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_input', + num_outs=5), + dict( + type='BFP', + in_channels=256, + num_levels=5, + refine_level=1, + refine_type='non_local') + ], + bbox_head=dict( + loss_bbox=dict( + _delete_=True, + type='BalancedL1Loss', + alpha=0.5, + gamma=1.5, + beta=0.11, + loss_weight=1.0))) diff --git a/downstream/mmdetection/configs/libra_rcnn/metafile.yml b/downstream/mmdetection/configs/libra_rcnn/metafile.yml new file mode 100644 index 0000000..8c32795 --- /dev/null +++ b/downstream/mmdetection/configs/libra_rcnn/metafile.yml @@ -0,0 +1,99 @@ +Collections: + - Name: Libra R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - IoU-Balanced Sampling + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Balanced Feature Pyramid + Paper: + URL: https://arxiv.org/abs/1904.02701 + Title: 'Libra R-CNN: Towards Balanced Learning for Object Detection' + README: configs/libra_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/necks/bfp.py#L10 + Version: v2.0.0 + +Models: + - Name: libra_faster_rcnn_r50_fpn_1x_coco + In Collection: Libra R-CNN + Config: configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.6 + inference time (ms/im): + - value: 52.63 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco/libra_faster_rcnn_r50_fpn_1x_coco_20200130-3afee3a9.pth + + - Name: libra_faster_rcnn_r101_fpn_1x_coco + In Collection: Libra R-CNN + Config: configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.5 + inference time (ms/im): + - value: 69.44 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco/libra_faster_rcnn_r101_fpn_1x_coco_20200203-8dba6a5a.pth + + - Name: libra_faster_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Libra R-CNN + Config: configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.8 + inference time (ms/im): + - value: 117.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco/libra_faster_rcnn_x101_64x4d_fpn_1x_coco_20200315-3a7d0488.pth + + - Name: libra_retinanet_r50_fpn_1x_coco + In Collection: Libra R-CNN + Config: configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + inference time (ms/im): + - value: 56.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_retinanet_r50_fpn_1x_coco/libra_retinanet_r50_fpn_1x_coco_20200205-804d94ce.pth diff --git a/downstream/mmdetection/configs/lvis/README.md b/downstream/mmdetection/configs/lvis/README.md new file mode 100644 index 0000000..0c2760e --- /dev/null +++ b/downstream/mmdetection/configs/lvis/README.md @@ -0,0 +1,56 @@ +# LVIS + +> [LVIS: A Dataset for Large Vocabulary Instance Segmentation](https://arxiv.org/abs/1908.03195) + + + +## Abstract + +Progress on object detection is enabled by datasets that focus the research community's attention on open challenges. This process led us from simple images to complex scenes and from bounding boxes to segmentation masks. In this work, we introduce LVIS (pronounced \`el-vis'): a new dataset for Large Vocabulary Instance Segmentation. We plan to collect ~2 million high-quality instance segmentation masks for over 1000 entry-level object categories in 164k images. Due to the Zipfian distribution of categories in natural images, LVIS naturally has a long tail of categories with few training samples. Given that state-of-the-art deep learning methods for object detection perform poorly in the low-sample regime, we believe that our dataset poses an important and exciting new scientific challenge. + +
    + +
    + +## Common Setting + +- Please follow [install guide](../../docs/get_started.md#install-mmdetection) to install open-mmlab forked cocoapi first. + +- Run following scripts to install our forked lvis-api. + + ```shell + pip install git+https://github.com/lvis-dataset/lvis-api.git + ``` + +- All experiments use oversample strategy [here](../../docs/tutorials/customize_dataset.md#class-balanced-dataset) with oversample threshold `1e-3`. + +- The size of LVIS v0.5 is half of COCO, so schedule `2x` in LVIS is roughly the same iterations as `1x` in COCO. + +## Results and models of LVIS v0.5 + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 2x | - | - | 26.1 | 25.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis-dbd06831.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_20200531_160435.log.json) | +| R-101-FPN | pytorch | 2x | - | - | 27.1 | 27.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis-54582ee2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_20200601_134748.log.json) | +| X-101-32x4d-FPN | pytorch | 2x | - | - | 26.7 | 26.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis-3cf55ea2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_20200531_221749.log.json) | +| X-101-64x4d-FPN | pytorch | 2x | - | - | 26.4 | 26.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis-1c99a5ad.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_20200601_194651.log.json) | + +## Results and models of LVIS v1 + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 9.1 | - | 22.5 | 21.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1-aa78ac3d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1-20200829_061305.log.json) | +| R-101-FPN | pytorch | 1x | 10.8 | - | 24.6 | 23.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1-ec55ce32.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1-20200829_070959.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 11.8 | - | 26.7 | 25.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1-ebbc5c81.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1-20200829_071317.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 14.6 | - | 27.2 | 25.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1-43d9edfe.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1-20200830_060206.log.json) | + +## Citation + +```latex +@inproceedings{gupta2019lvis, + title={{LVIS}: A Dataset for Large Vocabulary Instance Segmentation}, + author={Gupta, Agrim and Dollar, Piotr and Girshick, Ross}, + booktitle={Proceedings of the {IEEE} Conference on Computer Vision and Pattern Recognition}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py b/downstream/mmdetection/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py new file mode 100644 index 0000000..0f017f5 --- /dev/null +++ b/downstream/mmdetection/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py b/downstream/mmdetection/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py new file mode 100644 index 0000000..637f4a6 --- /dev/null +++ b/downstream/mmdetection/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py b/downstream/mmdetection/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py new file mode 100644 index 0000000..92ddb52 --- /dev/null +++ b/downstream/mmdetection/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py @@ -0,0 +1,31 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/lvis_v1_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + roi_head=dict( + bbox_head=dict(num_classes=1203), mask_head=dict(num_classes=1203)), + test_cfg=dict( + rcnn=dict( + score_thr=0.0001, + # LVIS allows up to 300 + max_per_img=300))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(dataset=dict(pipeline=train_pipeline))) diff --git a/downstream/mmdetection/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py b/downstream/mmdetection/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py new file mode 100644 index 0000000..d53c5dc --- /dev/null +++ b/downstream/mmdetection/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py @@ -0,0 +1,31 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/lvis_v0.5_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +model = dict( + roi_head=dict( + bbox_head=dict(num_classes=1230), mask_head=dict(num_classes=1230)), + test_cfg=dict( + rcnn=dict( + score_thr=0.0001, + # LVIS allows up to 300 + max_per_img=300))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(dataset=dict(pipeline=train_pipeline))) diff --git a/downstream/mmdetection/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py b/downstream/mmdetection/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py new file mode 100644 index 0000000..a6115c1 --- /dev/null +++ b/downstream/mmdetection/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py b/downstream/mmdetection/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py new file mode 100644 index 0000000..96b6252 --- /dev/null +++ b/downstream/mmdetection/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py b/downstream/mmdetection/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py new file mode 100644 index 0000000..0f95a73 --- /dev/null +++ b/downstream/mmdetection/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py b/downstream/mmdetection/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py new file mode 100644 index 0000000..986acda --- /dev/null +++ b/downstream/mmdetection/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/mask2former/README.md b/downstream/mmdetection/configs/mask2former/README.md new file mode 100644 index 0000000..ebce50d --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/README.md @@ -0,0 +1,73 @@ +# Mask2Former + +> [Masked-attention Mask Transformer for Universal Image Segmentation](http://arxiv.org/abs/2112.01527) + + + +## Abstract + +Image segmentation is about grouping pixels with different semantics, e.g., category or instance membership, where each choice of semantics defines a task. While only the semantics of each task differ, current research focuses on designing specialized architectures for each task. We present Masked-attention Mask Transformer (Mask2Former), a new architecture capable of addressing any image segmentation task (panoptic, instance or semantic). Its key components include masked attention, which extracts localized features by constraining cross-attention within predicted mask regions. In addition to reducing the research effort by at least three times, it outperforms the best specialized architectures by a significant margin on four popular datasets. Most notably, Mask2Former sets a new state-of-the-art for panoptic segmentation (57.8 PQ on COCO), instance segmentation (50.1 AP on COCO) and semantic segmentation (57.7 mIoU on ADE20K). + +
    + +
    + +## Introduction + +Mask2Former requires COCO and [COCO-panoptic](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip) dataset for training and evaluation. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +| | | ├── instances_train2017.json +| | | ├── instances_val2017.json +│ │ │ ├── panoptic_train2017.json +│ │ │ ├── panoptic_train2017 +│ │ │ ├── panoptic_val2017.json +│ │ │ ├── panoptic_val2017 +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +``` + +## Results and Models + +### Panoptic segmentation + +| Backbone | style | Pretrain | Lr schd | Mem (GB) | Inf time (fps) | PQ | box mAP | mask mAP | Config | Download | +| :------: | :-----: | :----------: | :-----: | :------: | :------------: | :--: | :-----: | :------: | :----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | ImageNet-1K | 50e | 13.9 | - | 51.9 | 44.8 | 41.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic/mask2former_r50_lsj_8x2_50e_coco-panoptic_20220326_224516-11a44721.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic/mask2former_r50_lsj_8x2_50e_coco-panoptic_20220326_224516.log.json) | +| R-101 | pytorch | ImageNet-1K | 50e | 16.1 | - | 52.4 | 45.3 | 42.4 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic/mask2former_r101_lsj_8x2_50e_coco-panoptic_20220329_225104-c54e64c9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic/mask2former_r101_lsj_8x2_50e_coco-panoptic_20220329_225104.log.json) | +| Swin-T | - | ImageNet-1K | 50e | 15.9 | - | 53.4 | 46.3 | 43.4 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220326_224553-fc567107.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220326_224553.log.json) | +| Swin-S | - | ImageNet-1K | 50e | 19.1 | - | 54.5 | 47.8 | 44.5 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220329_225200-c7b94355.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220329_225200.log.json) | +| Swin-B | - | ImageNet-1K | 50e | 26.0 | - | 55.1 | 48.2 | 44.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic_20220331_002244-c149a9e9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic_20220331_002244.log.json) | +| Swin-B | - | ImageNet-21K | 50e | 25.8 | - | 56.3 | 50.0 | 46.3 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic_20220329_230021-3bb8b482.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic_20220329_230021.log.json) | +| Swin-L | - | ImageNet-21K | 100e | 21.1 | - | 57.6 | 52.2 | 48.5 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic_20220407_104949-d4919c44.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic_20220407_104949.log.json) | + +### Instance segmentation + +| Backbone | style | Pretrain | Lr schd | Mem (GB) | Inf time (fps) | box mAP | mask mAP | Config | Download | +| -------- | ------- | ----------- | ------- | -------- | -------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| R-50 | pytorch | ImageNet-1K | 50e | 13.7 | - | 45.7 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco/mask2former_r50_lsj_8x2_50e_coco_20220506_191028-8e96e88b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco/mask2former_r50_lsj_8x2_50e_coco_20220506_191028.log.json) | +| R-101 | pytorch | ImageNet-1K | 50e | 15.5 | - | 46.7 | 44.0 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco/mask2former_r101_lsj_8x2_50e_coco_20220426_100250-c50b6fa6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco/mask2former_r101_lsj_8x2_50e_coco_20220426_100250.log.json) | +| Swin-T | - | ImageNet-1K | 50e | 15.3 | - | 47.7 | 44.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco_20220508_091649-4a943037.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco_20220508_091649.log.json) | +| Swin-S | - | ImageNet-1K | 50e | 18.8 | - | 49.3 | 46.1 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco_20220504_001756-743b7d99.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco_20220504_001756.log.json) | + +Note: We have trained the instance segmentation models many times (see more details in [PR 7571](https://github.com/open-mmlab/mmdetection/pull/7571)). The results of the trained models are relatively stable (+- 0.2), and have a certain gap (about 0.2 AP) in comparison with the results in the [paper](http://arxiv.org/abs/2112.01527). However, the performance of the model trained with the official code is unstable and may also be slightly lower than the reported results as mentioned in the [issue](https://github.com/facebookresearch/Mask2Former/issues/46). + +## Citation + +```latex +@article{cheng2021mask2former, + title={Masked-attention Mask Transformer for Universal Image Segmentation}, + author={Bowen Cheng and Ishan Misra and Alexander G. Schwing and Alexander Kirillov and Rohit Girdhar}, + journal={arXiv}, + year={2021} +} +``` diff --git a/downstream/mmdetection/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py b/downstream/mmdetection/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..33fdde6 --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,7 @@ +_base_ = './mask2former_r50_lsj_8x2_50e_coco-panoptic.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py b/downstream/mmdetection/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py new file mode 100644 index 0000000..5543fb0 --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py @@ -0,0 +1,7 @@ +_base_ = ['./mask2former_r50_lsj_8x2_50e_coco.py'] + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py b/downstream/mmdetection/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..2c23625 --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,253 @@ +_base_ = [ + '../_base_/datasets/coco_panoptic.py', '../_base_/default_runtime.py' +] +num_things_classes = 80 +num_stuff_classes = 53 +num_classes = num_things_classes + num_stuff_classes +model = dict( + type='Mask2Former', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + panoptic_head=dict( + type='Mask2FormerHead', + in_channels=[256, 512, 1024, 2048], # pass to pixel_decoder inside + strides=[4, 8, 16, 32], + feat_channels=256, + out_channels=256, + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + num_queries=100, + num_transformer_feat_level=3, + pixel_decoder=dict( + type='MSDeformAttnPixelDecoder', + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiScaleDeformableAttention', + embed_dims=256, + num_heads=8, + num_levels=3, + num_points=4, + im2col_step=64, + dropout=0.0, + batch_first=False, + norm_cfg=None, + init_cfg=None), + ffn_cfgs=dict( + type='FFN', + embed_dims=256, + feedforward_channels=1024, + num_fcs=2, + ffn_drop=0.0, + act_cfg=dict(type='ReLU', inplace=True)), + operation_order=('self_attn', 'norm', 'ffn', 'norm')), + init_cfg=None), + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + init_cfg=None), + enforce_decoder_input_project=False, + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + transformer_decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=9, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.0, + dropout_layer=None, + add_identity=True), + feedforward_channels=2048, + operation_order=('cross_attn', 'norm', 'self_attn', 'norm', + 'ffn', 'norm')), + init_cfg=None), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=2.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + reduction='mean', + loss_weight=5.0), + loss_dice=dict( + type='DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=5.0)), + panoptic_fusion_head=dict( + type='MaskFormerFusionHead', + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + loss_panoptic=None, + init_cfg=None), + train_cfg=dict( + num_points=12544, + oversample_ratio=3.0, + importance_sample_ratio=0.75, + assigner=dict( + type='MaskHungarianAssigner', + cls_cost=dict(type='ClassificationCost', weight=2.0), + mask_cost=dict( + type='CrossEntropyLossCost', weight=5.0, use_sigmoid=True), + dice_cost=dict( + type='DiceCost', weight=5.0, pred_act=True, eps=1.0)), + sampler=dict(type='MaskPseudoSampler')), + test_cfg=dict( + panoptic_on=True, + # For now, the dataset does not support + # evaluating semantic segmentation metric. + semantic_on=False, + instance_on=True, + # max_per_image is for instance segmentation. + max_per_image=100, + iou_thr=0.8, + # In Mask2Former's panoptic postprocessing, + # it will filter mask area where score is less than 0.5 . + filter_low_score=True), + init_cfg=None) + +# dataset settings +image_size = (1024, 1024) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict(type='RandomFlip', flip_ratio=0.5), + # large scale jittering + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.1, 2.0), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_size=image_size, + crop_type='absolute', + recompute_bbox=True, + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=image_size), + dict(type='DefaultFormatBundle', img_to_float=True), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data_root = 'data/coco/' +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict( + pipeline=test_pipeline, + ins_ann_file=data_root + 'annotations/instances_val2017.json', + ), + test=dict( + pipeline=test_pipeline, + ins_ann_file=data_root + 'annotations/instances_val2017.json', + )) + +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi, + }, + norm_decay_mult=0.0)) +optimizer_config = dict(grad_clip=dict(max_norm=0.01, norm_type=2)) + +# learning policy +lr_config = dict( + policy='step', + gamma=0.1, + by_epoch=False, + step=[327778, 355092], + warmup='linear', + warmup_by_epoch=False, + warmup_ratio=1.0, # no warmup + warmup_iters=10) + +max_iters = 368750 +runner = dict(type='IterBasedRunner', max_iters=max_iters) + +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook', by_epoch=False), + dict(type='TensorboardLoggerHook', by_epoch=False) + ]) +interval = 5000 +workflow = [('train', interval)] +checkpoint_config = dict( + by_epoch=False, interval=interval, save_last=True, max_keep_ckpts=3) + +# Before 365001th iteration, we do evaluation every 5000 iterations. +# After 365000th iteration, we do evaluation every 368750 iterations, +# which means that we do evaluation at the end of training. +dynamic_intervals = [(max_iters // interval * interval + 1, max_iters)] +evaluation = dict( + interval=interval, + dynamic_intervals=dynamic_intervals, + metric=['PQ', 'bbox', 'segm']) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py b/downstream/mmdetection/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py new file mode 100644 index 0000000..eca6135 --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py @@ -0,0 +1,79 @@ +_base_ = ['./mask2former_r50_lsj_8x2_50e_coco-panoptic.py'] +num_things_classes = 80 +num_stuff_classes = 0 +num_classes = num_things_classes + num_stuff_classes +model = dict( + panoptic_head=dict( + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + loss_cls=dict(class_weight=[1.0] * num_classes + [0.1])), + panoptic_fusion_head=dict( + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes), + test_cfg=dict(panoptic_on=False)) + +# dataset settings +image_size = (1024, 1024) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +pad_cfg = dict(img=(128, 128, 128), masks=0, seg=255) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + # large scale jittering + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.1, 2.0), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_size=image_size, + crop_type='absolute', + recompute_bbox=True, + allow_negative_crop=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1e-5, 1e-5), by_mask=True), + dict(type='Pad', size=image_size, pad_val=pad_cfg), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle', img_to_float=True), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Pad', size_divisor=32, pad_val=pad_cfg), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +data = dict( + _delete_=True, + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py b/downstream/mmdetection/configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..f13f5e1 --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,5 @@ +_base_ = ['./mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384_22k.pth' # noqa + +model = dict( + backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=pretrained))) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py b/downstream/mmdetection/configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..33a805c --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,42 @@ +_base_ = ['./mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + pretrain_img_size=384, + embed_dims=128, + depths=depths, + num_heads=[4, 8, 16, 32], + window_size=12, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict(in_channels=[128, 256, 512, 1024])) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py b/downstream/mmdetection/configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py new file mode 100644 index 0000000..91a180d --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py @@ -0,0 +1,26 @@ +_base_ = ['./mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22k.pth' # noqa + +model = dict( + backbone=dict( + embed_dims=192, + num_heads=[6, 12, 24, 48], + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict(num_queries=200, in_channels=[192, 384, 768, 1536])) + +data = dict(samples_per_gpu=1, workers_per_gpu=1) + +lr_config = dict(step=[655556, 710184]) + +max_iters = 737500 +runner = dict(type='IterBasedRunner', max_iters=max_iters) + +# Before 735001th iteration, we do evaluation every 5000 iterations. +# After 735000th iteration, we do evaluation every 737500 iterations, +# which means that we do evaluation at the end of training.' +interval = 5000 +dynamic_intervals = [(max_iters // interval * interval + 1, max_iters)] +evaluation = dict( + interval=interval, + dynamic_intervals=dynamic_intervals, + metric=['PQ', 'bbox', 'segm']) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py b/downstream/mmdetection/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..b2b621c --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,37 @@ +_base_ = ['./mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_small_patch4_window7_224.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + depths=depths, init_cfg=dict(type='Pretrained', + checkpoint=pretrained))) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py b/downstream/mmdetection/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py new file mode 100644 index 0000000..7b1b05a --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py @@ -0,0 +1,37 @@ +_base_ = ['./mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_small_patch4_window7_224.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + depths=depths, init_cfg=dict(type='Pretrained', + checkpoint=pretrained))) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py b/downstream/mmdetection/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..04b2f10 --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,62 @@ +_base_ = ['./mask2former_r50_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth' # noqa + +depths = [2, 2, 6, 2] +model = dict( + type='Mask2Former', + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=depths, + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + convert_weights=True, + frozen_stages=-1, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict( + type='Mask2FormerHead', in_channels=[96, 192, 384, 768]), + init_cfg=None) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/downstream/mmdetection/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py b/downstream/mmdetection/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py new file mode 100644 index 0000000..0ccbe91 --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py @@ -0,0 +1,61 @@ +_base_ = ['./mask2former_r50_lsj_8x2_50e_coco.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth' # noqa +depths = [2, 2, 6, 2] +model = dict( + type='Mask2Former', + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=depths, + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + convert_weights=True, + frozen_stages=-1, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict( + type='Mask2FormerHead', in_channels=[96, 192, 384, 768]), + init_cfg=None) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/downstream/mmdetection/configs/mask2former/metafile.yml b/downstream/mmdetection/configs/mask2former/metafile.yml new file mode 100644 index 0000000..d9f4692 --- /dev/null +++ b/downstream/mmdetection/configs/mask2former/metafile.yml @@ -0,0 +1,223 @@ +Collections: + - Name: Mask2Former + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Weight Decay + Training Resources: 8x A100 GPUs + Architecture: + - Mask2Former + Paper: + URL: https://arxiv.org/pdf/2112.01527 + Title: 'Masked-attention Mask Transformer for Universal Image Segmentation' + README: configs/mask2former/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.23.0/mmdet/models/detectors/mask2former.py#L7 + Version: v2.23.0 + +Models: +- Name: mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 19.1 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.5 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 54.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220329_225200-c7b94355.pth +- Name: mask2former_r101_lsj_8x2_50e_coco + In Collection: Mask2Former + Config: configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py + Metadata: + Training Memory (GB): 15.5 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco/mask2former_r101_lsj_8x2_50e_coco_20220426_100250-c50b6fa6.pth +- Name: mask2former_r101_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 16.1 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.4 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 52.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic/mask2former_r101_lsj_8x2_50e_coco-panoptic_20220329_225104-c54e64c9.pth +- Name: mask2former_r50_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 13.9 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.9 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 51.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic/mask2former_r50_lsj_8x2_50e_coco-panoptic_20220326_224516-11a44721.pth +- Name: mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 15.9 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 43.4 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 53.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220326_224553-fc567107.pth +- Name: mask2former_r50_lsj_8x2_50e_coco + In Collection: Mask2Former + Config: configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py + Metadata: + Training Memory (GB): 13.7 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco/mask2former_r50_lsj_8x2_50e_coco_20220506_191028-8e96e88b.pth +- Name: mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py + Metadata: + Training Memory (GB): 21.1 + Iterations: 737500 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 52.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 48.5 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 57.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic_20220407_104949-d4919c44.pth +- Name: mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 25.8 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 46.3 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 56.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic_20220329_230021-3bb8b482.pth +- Name: mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 26.0 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 48.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.9 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 55.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic_20220331_002244-c149a9e9.pth +- Name: mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py + Metadata: + Training Memory (GB): 15.3 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco_20220508_091649-4a943037.pth +- Name: mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py + Metadata: + Training Memory (GB): 18.8 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 49.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 46.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco_20220504_001756-743b7d99.pth diff --git a/downstream/mmdetection/configs/mask_rcnn/README.md b/downstream/mmdetection/configs/mask_rcnn/README.md new file mode 100644 index 0000000..6aad9a2 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/README.md @@ -0,0 +1,59 @@ +# Mask R-CNN + +> [Mask R-CNN](https://arxiv.org/abs/1703.06870) + + + +## Abstract + +We present a conceptually simple, flexible, and general framework for object instance segmentation. Our approach efficiently detects objects in an image while simultaneously generating a high-quality segmentation mask for each instance. The method, called Mask R-CNN, extends Faster R-CNN by adding a branch for predicting an object mask in parallel with the existing branch for bounding box recognition. Mask R-CNN is simple to train and adds only a small overhead to Faster R-CNN, running at 5 fps. Moreover, Mask R-CNN is easy to generalize to other tasks, e.g., allowing us to estimate human poses in the same framework. We show top results in all three tracks of the COCO suite of challenges, including instance segmentation, bounding-box object detection, and person keypoint detection. Without bells and whistles, Mask R-CNN outperforms all existing, single-model entries on every task, including the COCO 2016 challenge winners. We hope our simple and effective approach will serve as a solid baseline and help ease future research in instance-level recognition. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 4.3 | | 38.0 | 34.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco/mask_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.38__segm_mAP-0.344_20200504_231812-0ebd1859.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco/mask_rcnn_r50_caffe_fpn_1x_coco_20200504_231812.log.json) | +| R-50-FPN | pytorch | 1x | 4.4 | 16.1 | 38.2 | 34.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205_050542.log.json) | +| R-50-FPN (FP16) | pytorch | 1x | 3.6 | 24.1 | 38.1 | 34.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_1x_coco/mask_rcnn_r50_fpn_fp16_1x_coco_20200205-59faf7e4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_1x_coco/mask_rcnn_r50_fpn_fp16_1x_coco_20200205_130539.log.json) | +| R-50-FPN | pytorch | 2x | - | - | 39.2 | 35.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_2x_coco/mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_2x_coco/mask_rcnn_r50_fpn_2x_coco_20200505_003907.log.json) | +| R-101-FPN | caffe | 1x | | | 40.4 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco/mask_rcnn_r101_caffe_fpn_1x_coco_20200601_095758-805e06c1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco/mask_rcnn_r101_caffe_fpn_1x_coco_20200601_095758.log.json) | +| R-101-FPN | pytorch | 1x | 6.4 | 13.5 | 40.0 | 36.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204_144809.log.json) | +| R-101-FPN | pytorch | 2x | - | - | 40.8 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco_bbox_mAP-0.408__segm_mAP-0.366_20200505_071027-14b391c7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco_20200505_071027.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.6 | 11.3 | 41.9 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205-478d0b67.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205_034906.log.json) | +| X-101-32x4d-FPN | pytorch | 2x | - | - | 42.2 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco/mask_rcnn_x101_32x4d_fpn_2x_coco_bbox_mAP-0.422__segm_mAP-0.378_20200506_004702-faef898c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco/mask_rcnn_x101_32x4d_fpn_2x_coco_20200506_004702.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.7 | 8.0 | 42.8 | 38.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco/mask_rcnn_x101_64x4d_fpn_1x_coco_20200201-9352eb0d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco/mask_rcnn_x101_64x4d_fpn_1x_coco_20200201_124310.log.json) | +| X-101-64x4d-FPN | pytorch | 2x | - | - | 42.7 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco/mask_rcnn_x101_64x4d_fpn_2x_coco_20200509_224208-39d6f70c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco/mask_rcnn_x101_64x4d_fpn_2x_coco_20200509_224208.log.json) | +| X-101-32x8d-FPN | pytorch | 1x | - | - | 42.8 | 38.3 | | | + +## Pre-trained Models + +We also train some models with longer schedules and multi-scale training. The users could finetune them for downstream tasks. + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-FPN](./mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py) | caffe | 2x | 4.3 | | 40.3 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco_bbox_mAP-0.403__segm_mAP-0.365_20200504_231822-a75c98ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco_20200504_231822.log.json) | +| [R-50-FPN](./mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py) | caffe | 3x | 4.3 | | 40.8 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_20200504_163245.log.json) | +| [R-50-FPN](./mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 4.1 | | 40.9 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_fpn_mstrain-poly_3x_coco_20210524_201154-21b550bb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_fpn_mstrain-poly_3x_coco_20210524_201154.log.json) | +| [R-101-FPN](./mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py) | caffe | 3x | 5.9 | | 42.9 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco_20210526_132339-3c33ce02.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco_20210526_132339.log.json) | +| [R-101-FPN](./mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 6.1 | | 42.7 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_fpn_mstrain-poly_3x_coco_20210524_200244-5675c317.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_fpn_mstrain-poly_3x_coco_20210524_200244.log.json) | +| [x101-32x4d-FPN](./mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 7.3 | | 43.6 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco_20210524_201410-abcd7859.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco_20210524_201410.log.json) | +| [X-101-32x8d-FPN](./mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py) | pytorch | 1x | - | | 43.6 | 39.0 | | | +| [X-101-32x8d-FPN](./mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 10.3 | | 44.3 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco_20210607_161042-8bd2c639.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco_20210607_161042.log.json) | +| [X-101-64x4d-FPN](./mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 10.4 | | 44.5 | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco_20210526_120447-c376f129.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco_20210526_120447.log.json) | + +## Citation + +```latex +@article{He_2017, + title={Mask R-CNN}, + journal={2017 IEEE International Conference on Computer Vision (ICCV)}, + publisher={IEEE}, + author={He, Kaiming and Gkioxari, Georgia and Dollar, Piotr and Girshick, Ross}, + year={2017}, + month={Oct} +} +``` diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..95b324f --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './mask_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..e39781d --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,55 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + depth=101, + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..b7986e8 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py new file mode 100644 index 0000000..c9059d5 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..0696cbe --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,10 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_c4_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_c4_1x_coco.py new file mode 100644 index 0000000..a44c018 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_c4_1x_coco.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_caffe_c4.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..5a23f8c --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,40 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py new file mode 100644 index 0000000..6308e40 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py @@ -0,0 +1,49 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py new file mode 100644 index 0000000..4f7150c --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..1b48a21 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py' +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py new file mode 100644 index 0000000..bebbaaa --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py new file mode 100644 index 0000000..3f8079d --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py @@ -0,0 +1,61 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + rpn_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + bbox_roi_extractor=dict( + roi_layer=dict( + type='RoIAlign', + output_size=7, + sampling_ratio=2, + aligned=False)), + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + mask_roi_extractor=dict( + roi_layer=dict( + type='RoIAlign', + output_size=14, + sampling_ratio=2, + aligned=False)))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..6a6c924 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_wandb_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_wandb_coco.py new file mode 100644 index 0000000..88c8576 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_wandb_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# Set evaluation interval +evaluation = dict(interval=2) +# Set checkpoint interval +checkpoint_config = dict(interval=4) + +# yapf:disable +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + dict(type='MMDetWandbHook', + init_kwargs={ + 'project': 'mmdetection', + 'group': 'maskrcnn-r50-fpn-1x-coco' + }, + interval=50, + log_checkpoint=True, + log_checkpoint_metadata=True, + num_eval_images=100) + ]) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py new file mode 100644 index 0000000..932b1f9 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py new file mode 100644 index 0000000..fb8289b --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py @@ -0,0 +1,3 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +# fp16 settings +fp16 = dict(loss_scale=512.) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..b3d9242 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_poly_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_poly_1x_coco.py new file mode 100644 index 0000000..9eb6d57 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_r50_fpn_poly_1x_coco.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..a8b3799 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py new file mode 100644 index 0000000..2cd3cee --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r101_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..b698a7d --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py new file mode 100644 index 0000000..108ea4e --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = './mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py new file mode 100644 index 0000000..6b912f6 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py @@ -0,0 +1,60 @@ +_base_ = './mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..8ba0e9c --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,85 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..2333b03 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py new file mode 100644 index 0000000..6074cca --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_x101_32x4d_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..9f9cb1c --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/mask_rcnn/metafile.yml b/downstream/mmdetection/configs/mask_rcnn/metafile.yml new file mode 100644 index 0000000..f74bdf3 --- /dev/null +++ b/downstream/mmdetection/configs/mask_rcnn/metafile.yml @@ -0,0 +1,447 @@ +Collections: + - Name: Mask R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Softmax + - RPN + - Convolution + - Dense Connections + - FPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/abs/1703.06870v3 + Title: "Mask R-CNN" + README: configs/mask_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/mask_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: mask_rcnn_r50_caffe_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco/mask_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.38__segm_mAP-0.344_20200504_231812-0ebd1859.pth + + - Name: mask_rcnn_r50_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 62.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth + + - Name: mask_rcnn_r50_fpn_fp16_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py + Metadata: + Training Memory (GB): 3.6 + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + inference time (ms/im): + - value: 41.49 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP16 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_1x_coco/mask_rcnn_r50_fpn_fp16_1x_coco_20200205-59faf7e4.pth + + - Name: mask_rcnn_r50_fpn_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 62.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_2x_coco/mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth + + - Name: mask_rcnn_r101_caffe_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco/mask_rcnn_r101_caffe_fpn_1x_coco_20200601_095758-805e06c1.pth + + - Name: mask_rcnn_r101_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 74.07 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth + + - Name: mask_rcnn_r101_fpn_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 74.07 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco_bbox_mAP-0.408__segm_mAP-0.366_20200505_071027-14b391c7.pth + + - Name: mask_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205-478d0b67.pth + + - Name: mask_rcnn_x101_32x4d_fpn_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco/mask_rcnn_x101_32x4d_fpn_2x_coco_bbox_mAP-0.422__segm_mAP-0.378_20200506_004702-faef898c.pth + + - Name: mask_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.7 + inference time (ms/im): + - value: 125 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco/mask_rcnn_x101_64x4d_fpn_1x_coco_20200201-9352eb0d.pth + + - Name: mask_rcnn_x101_64x4d_fpn_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 10.7 + inference time (ms/im): + - value: 125 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco/mask_rcnn_x101_64x4d_fpn_2x_coco_20200509_224208-39d6f70c.pth + + - Name: mask_rcnn_x101_32x8d_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.7 + inference time (ms/im): + - value: 125 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.3 + + - Name: mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco_bbox_mAP-0.403__segm_mAP-0.365_20200504_231822-a75c98ce.pth + + - Name: mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth + + - Name: mask_rcnn_r50_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 4.1 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_fpn_mstrain-poly_3x_coco_20210524_201154-21b550bb.pth + + - Name: mask_rcnn_r101_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 6.1 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_fpn_mstrain-poly_3x_coco_20210524_200244-5675c317.pth + + - Name: mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 5.9 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco_20210526_132339-3c33ce02.pth + + - Name: mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 7.3 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco_20210524_201410-abcd7859.pth + + - Name: mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + + - Name: mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco + Metadata: + Training Memory (GB): 10.3 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco_20210607_161042-8bd2c639.pth + + - Name: mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py + Metadata: + Epochs: 36 + Training Memory (GB): 10.4 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco_20210526_120447-c376f129.pth diff --git a/downstream/mmdetection/configs/maskformer/README.md b/downstream/mmdetection/configs/maskformer/README.md new file mode 100644 index 0000000..5d8daa2 --- /dev/null +++ b/downstream/mmdetection/configs/maskformer/README.md @@ -0,0 +1,53 @@ +# MaskFormer + +> [Per-Pixel Classification is Not All You Need for Semantic Segmentation](https://arxiv.org/abs/2107.06278) + + + +## Abstract + +Modern approaches typically formulate semantic segmentation as a per-pixel classification task, while instance-level segmentation is handled with an alternative mask classification. Our key insight: mask classification is sufficiently general to solve both semantic- and instance-level segmentation tasks in a unified manner using the exact same model, loss, and training procedure. Following this observation, we propose MaskFormer, a simple mask classification model which predicts a set of binary masks, each associated with a single global class label prediction. Overall, the proposed mask classification-based method simplifies the landscape of effective approaches to semantic and panoptic segmentation tasks and shows excellent empirical results. In particular, we observe that MaskFormer outperforms per-pixel classification baselines when the number of classes is large. Our mask classification-based method outperforms both current state-of-the-art semantic (55.6 mIoU on ADE20K) and panoptic segmentation (52.7 PQ on COCO) models. + +
    + +
    + +## Introduction + +MaskFormer requires COCO and [COCO-panoptic](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip) dataset for training and evaluation. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ │ ├── panoptic_train2017.json +│ │ │ ├── panoptic_train2017 +│ │ │ ├── panoptic_val2017.json +│ │ │ ├── panoptic_val2017 +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +``` + +## Results and Models + +| Backbone | style | Lr schd | Mem (GB) | Inf time (fps) | PQ | SQ | RQ | PQ_th | SQ_th | RQ_th | PQ_st | SQ_st | RQ_st | Config | Download | detail | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :-----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 75e | 16.2 | - | 46.854 | 80.617 | 57.085 | 51.089 | 81.511 | 61.853 | 40.463 | 79.269 | 49.888 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_r50_mstrain_16x1_75e_coco/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956-bc2699cb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_r50_mstrain_16x1_75e_coco/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956.log.json) | This version was mentioned in Table XI, in paper [Masked-attention Mask Transformer for Universal Image Segmentation](https://arxiv.org/abs/2112.01527) | +| Swin-L | pytorch | 300e | 27.2 | - | 53.249 | 81.704 | 64.231 | 58.798 | 82.923 | 70.282 | 44.874 | 79.863 | 55.097 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco_20220326_221612-061b4eb8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco_20220326_221612.log.json) | - | + +## Citation + +```latex +@inproceedings{cheng2021maskformer, + title={Per-Pixel Classification is Not All You Need for Semantic Segmentation}, + author={Bowen Cheng and Alexander G. Schwing and Alexander Kirillov}, + journal={NeurIPS}, + year={2021} +} +``` diff --git a/downstream/mmdetection/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py b/downstream/mmdetection/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py new file mode 100644 index 0000000..46b3c13 --- /dev/null +++ b/downstream/mmdetection/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py @@ -0,0 +1,238 @@ +_base_ = [ + '../_base_/datasets/coco_panoptic.py', '../_base_/default_runtime.py' +] +num_things_classes = 80 +num_stuff_classes = 53 +num_classes = num_things_classes + num_stuff_classes +model = dict( + type='MaskFormer', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + panoptic_head=dict( + type='MaskFormerHead', + in_channels=[256, 512, 1024, 2048], # pass to pixel_decoder inside + feat_channels=256, + out_channels=256, + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + num_queries=100, + pixel_decoder=dict( + type='TransformerEncoderPixelDecoder', + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + attn_drop=0.1, + proj_drop=0.1, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.1, + dropout_layer=None, + add_identity=True), + operation_order=('self_attn', 'norm', 'ffn', 'norm'), + norm_cfg=dict(type='LN'), + init_cfg=None, + batch_first=False), + init_cfg=None), + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True)), + enforce_decoder_input_project=False, + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + transformer_decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=6, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + attn_drop=0.1, + proj_drop=0.1, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.1, + dropout_layer=None, + add_identity=True), + # the following parameter was not used, + # just make current api happy + feedforward_channels=2048, + operation_order=('self_attn', 'norm', 'cross_attn', 'norm', + 'ffn', 'norm')), + init_cfg=None), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + reduction='mean', + loss_weight=20.0), + loss_dice=dict( + type='DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=1.0)), + panoptic_fusion_head=dict( + type='MaskFormerFusionHead', + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + loss_panoptic=None, + init_cfg=None), + train_cfg=dict( + assigner=dict( + type='MaskHungarianAssigner', + cls_cost=dict(type='ClassificationCost', weight=1.0), + mask_cost=dict( + type='FocalLossCost', weight=20.0, binary_input=True), + dice_cost=dict( + type='DiceCost', weight=1.0, pred_act=True, eps=1.0)), + sampler=dict(type='MaskPseudoSampler')), + test_cfg=dict( + panoptic_on=True, + # For now, the dataset does not support + # evaluating semantic segmentation metric. + semantic_on=False, + instance_on=False, + # max_per_image is for instance segmentation. + max_per_image=100, + object_mask_thr=0.8, + iou_thr=0.8, + # In MaskFormer's panoptic postprocessing, + # it will not filter masks whose score is smaller than 0.5 . + filter_low_score=False), + init_cfg=None) + +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=1, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.0001, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'query_embed': dict(lr_mult=1.0, decay_mult=0.0) + }, + norm_decay_mult=0.0)) +optimizer_config = dict(grad_clip=dict(max_norm=0.01, norm_type=2)) + +# learning policy +lr_config = dict( + policy='step', + gamma=0.1, + by_epoch=True, + step=[50], + warmup='linear', + warmup_by_epoch=False, + warmup_ratio=1.0, # no warmup + warmup_iters=10) +runner = dict(type='EpochBasedRunner', max_epochs=75) diff --git a/downstream/mmdetection/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py b/downstream/mmdetection/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py new file mode 100644 index 0000000..bc23c54 --- /dev/null +++ b/downstream/mmdetection/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py @@ -0,0 +1,67 @@ +_base_ = './maskformer_r50_mstrain_16x1_75e_coco.py' + +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22k.pth' # noqa +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + _delete_=True, + type='SwinTransformer', + pretrain_img_size=384, + embed_dims=192, + patch_size=4, + window_size=12, + mlp_ratio=4, + depths=depths, + num_heads=[6, 12, 24, 48], + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + convert_weights=True, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict( + in_channels=[192, 384, 768, 1536], # pass to pixel_decoder inside + pixel_decoder=dict( + _delete_=True, + type='PixelDecoder', + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU')), + enforce_decoder_input_project=True)) + +# weight_decay = 0.01 +# norm_weight_decay = 0.0 +# embed_weight_decay = 0.0 +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +norm_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'norm': norm_multi, + 'absolute_pos_embed': embed_multi, + 'relative_position_bias_table': embed_multi, + 'query_embed': embed_multi +} + +# optimizer +optimizer = dict( + type='AdamW', + lr=6e-5, + weight_decay=0.01, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) +optimizer_config = dict(grad_clip=dict(max_norm=0.01, norm_type=2)) + +# learning policy +lr_config = dict( + policy='step', + gamma=0.1, + by_epoch=True, + step=[250], + warmup='linear', + warmup_by_epoch=False, + warmup_ratio=1e-6, + warmup_iters=1500) +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/downstream/mmdetection/configs/maskformer/metafile.yml b/downstream/mmdetection/configs/maskformer/metafile.yml new file mode 100644 index 0000000..6530fa1 --- /dev/null +++ b/downstream/mmdetection/configs/maskformer/metafile.yml @@ -0,0 +1,43 @@ +Collections: + - Name: MaskFormer + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Weight Decay + Training Resources: 16x V100 GPUs + Architecture: + - MaskFormer + Paper: + URL: https://arxiv.org/pdf/2107.06278 + Title: 'Per-Pixel Classification is Not All You Need for Semantic Segmentation' + README: configs/maskformer/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.22.0/mmdet/models/detectors/maskformer.py#L7 + Version: v2.22.0 + +Models: + - Name: maskformer_r50_mstrain_16x1_75e_coco + In Collection: MaskFormer + Config: configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py + Metadata: + Training Memory (GB): 16.2 + Epochs: 75 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 46.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_r50_mstrain_16x1_75e_coco/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956-bc2699cb.pth + - Name: maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco + In Collection: MaskFormer + Config: configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py + Metadata: + Training Memory (GB): 27.2 + Epochs: 300 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 53.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco_20220326_221612-061b4eb8.pth diff --git a/downstream/mmdetection/configs/ms_rcnn/README.md b/downstream/mmdetection/configs/ms_rcnn/README.md new file mode 100644 index 0000000..97bca05 --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/README.md @@ -0,0 +1,36 @@ +# MS R-CNN + +> [Mask Scoring R-CNN](https://arxiv.org/abs/1903.00241) + + + +## Abstract + +Letting a deep network be aware of the quality of its own predictions is an interesting yet important problem. In the task of instance segmentation, the confidence of instance classification is used as mask quality score in most instance segmentation frameworks. However, the mask quality, quantified as the IoU between the instance mask and its ground truth, is usually not well correlated with classification score. In this paper, we study this problem and propose Mask Scoring R-CNN which contains a network block to learn the quality of the predicted instance masks. The proposed network block takes the instance feature and the corresponding predicted mask together to regress the mask IoU. The mask scoring strategy calibrates the misalignment between mask quality and mask score, and improves instance segmentation performance by prioritizing more accurate mask predictions during COCO AP evaluation. By extensive evaluations on the COCO dataset, Mask Scoring R-CNN brings consistent and noticeable gain with different models, and outperforms the state-of-the-art Mask R-CNN. We hope our simple and effective approach will provide a new direction for improving instance segmentation. + +
    + +
    + +## Results and Models + +| Backbone | style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 4.5 | | 38.2 | 36.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco/ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848-61c9355e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco/ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848.log.json) | +| R-50-FPN | caffe | 2x | - | - | 38.8 | 36.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco/ms_rcnn_r50_caffe_fpn_2x_coco_bbox_mAP-0.388__segm_mAP-0.363_20200506_004738-ee87b137.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco/ms_rcnn_r50_caffe_fpn_2x_coco_20200506_004738.log.json) | +| R-101-FPN | caffe | 1x | 6.5 | | 40.4 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco/ms_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.404__segm_mAP-0.376_20200506_004755-b9b12a37.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco/ms_rcnn_r101_caffe_fpn_1x_coco_20200506_004755.log.json) | +| R-101-FPN | caffe | 2x | - | - | 41.1 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco/ms_rcnn_r101_caffe_fpn_2x_coco_bbox_mAP-0.411__segm_mAP-0.381_20200506_011134-5f3cc74f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco/ms_rcnn_r101_caffe_fpn_2x_coco_20200506_011134.log.json) | +| R-X101-32x4d | pytorch | 2x | 7.9 | 11.0 | 41.8 | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco/ms_rcnn_x101_32x4d_fpn_1x_coco_20200206-81fd1740.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco/ms_rcnn_x101_32x4d_fpn_1x_coco_20200206_100113.log.json) | +| R-X101-64x4d | pytorch | 1x | 11.0 | 8.0 | 43.0 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco/ms_rcnn_x101_64x4d_fpn_1x_coco_20200206-86ba88d2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco/ms_rcnn_x101_64x4d_fpn_1x_coco_20200206_091744.log.json) | +| R-X101-64x4d | pytorch | 2x | 11.0 | 8.0 | 42.6 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco/ms_rcnn_x101_64x4d_fpn_2x_coco_20200308-02a445e2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco/ms_rcnn_x101_64x4d_fpn_2x_coco_20200308_012247.log.json) | + +## Citation + +```latex +@inproceedings{huang2019msrcnn, + title={Mask Scoring R-CNN}, + author={Zhaojin Huang and Lichao Huang and Yongchao Gong and Chang Huang and Xinggang Wang}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019}, +} +``` diff --git a/downstream/mmdetection/configs/ms_rcnn/metafile.yml b/downstream/mmdetection/configs/ms_rcnn/metafile.yml new file mode 100644 index 0000000..a6c7dc5 --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/metafile.yml @@ -0,0 +1,159 @@ +Collections: + - Name: Mask Scoring R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RPN + - FPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/abs/1903.00241 + Title: 'Mask Scoring R-CNN' + README: configs/ms_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/mask_scoring_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: ms_rcnn_r50_caffe_fpn_1x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco/ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848-61c9355e.pth + + - Name: ms_rcnn_r50_caffe_fpn_2x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco/ms_rcnn_r50_caffe_fpn_2x_coco_bbox_mAP-0.388__segm_mAP-0.363_20200506_004738-ee87b137.pth + + - Name: ms_rcnn_r101_caffe_fpn_1x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco/ms_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.404__segm_mAP-0.376_20200506_004755-b9b12a37.pth + + - Name: ms_rcnn_r101_caffe_fpn_2x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco/ms_rcnn_r101_caffe_fpn_2x_coco_bbox_mAP-0.411__segm_mAP-0.381_20200506_011134-5f3cc74f.pth + + - Name: ms_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.9 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco/ms_rcnn_x101_32x4d_fpn_1x_coco_20200206-81fd1740.pth + + - Name: ms_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 11.0 + inference time (ms/im): + - value: 125 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco/ms_rcnn_x101_64x4d_fpn_1x_coco_20200206-86ba88d2.pth + + - Name: ms_rcnn_x101_64x4d_fpn_2x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 11.0 + inference time (ms/im): + - value: 125 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco/ms_rcnn_x101_64x4d_fpn_2x_coco_20200308-02a445e2.pth diff --git a/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..9b7dcbb --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './ms_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py new file mode 100644 index 0000000..202bcce --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './ms_rcnn_r101_caffe_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..5845125 --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + type='MaskScoringRCNN', + roi_head=dict( + type='MaskScoringRoIHead', + mask_iou_head=dict( + type='MaskIoUHead', + num_convs=4, + num_fcs=2, + roi_feat_size=14, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + num_classes=80)), + # model training and testing settings + train_cfg=dict(rcnn=dict(mask_thr_binary=0.5))) diff --git a/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py new file mode 100644 index 0000000..008a70a --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './ms_rcnn_r50_caffe_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..0a163ce --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + type='MaskScoringRCNN', + roi_head=dict( + type='MaskScoringRoIHead', + mask_iou_head=dict( + type='MaskIoUHead', + num_convs=4, + num_fcs=2, + roi_feat_size=14, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + num_classes=80)), + # model training and testing settings + train_cfg=dict(rcnn=dict(mask_thr_binary=0.5))) diff --git a/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..20479bb --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ms_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..ee5b734 --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ms_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py new file mode 100644 index 0000000..54c605b --- /dev/null +++ b/downstream/mmdetection/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './ms_rcnn_x101_64x4d_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/nas_fcos/README.md b/downstream/mmdetection/configs/nas_fcos/README.md new file mode 100644 index 0000000..def8831 --- /dev/null +++ b/downstream/mmdetection/configs/nas_fcos/README.md @@ -0,0 +1,35 @@ +# NAS-FCOS + +> [NAS-FCOS: Fast Neural Architecture Search for Object Detection](https://arxiv.org/abs/1906.04423) + + + +## Abstract + +The success of deep neural networks relies on significant architecture engineering. Recently neural architecture search (NAS) has emerged as a promise to greatly reduce manual effort in network design by automatically searching for optimal architectures, although typically such algorithms need an excessive amount of computational resources, e.g., a few thousand GPU-days. To date, on challenging vision tasks such as object detection, NAS, especially fast versions of NAS, is less studied. Here we propose to search for the decoder structure of object detectors with search efficiency being taken into consideration. To be more specific, we aim to efficiently search for the feature pyramid network (FPN) as well as the prediction head of a simple anchor-free object detector, namely FCOS, using a tailored reinforcement learning paradigm. With carefully designed search space, search algorithms and strategies for evaluating network quality, we are able to efficiently search a top-performing detection architecture within 4 days using 8 V100 GPUs. The discovered architecture surpasses state-of-the-art object detection models (such as Faster R-CNN, RetinaNet and FCOS) by 1.5 to 3.5 points in AP on the COCO dataset, with comparable computation complexity and memory footprint, demonstrating the efficacy of the proposed NAS for object detection. + +
    + +
    + +## Results and Models + +| Head | Backbone | Style | GN-head | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :------: | :---: | :-----: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| NAS-FCOSHead | R-50 | caffe | Y | 1x | | | 39.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520-1bdba3ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520.log.json) | +| FCOSHead | R-50 | caffe | Y | 1x | | | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200521-7fdcbce0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200521.log.json) | + +**Notes:** + +- To be consistent with the author's implementation, we use 4 GPUs with 4 images/GPU. + +## Citation + +```latex +@article{wang2019fcos, + title={Nas-fcos: Fast neural architecture search for object detection}, + author={Wang, Ning and Gao, Yang and Chen, Hao and Wang, Peng and Tian, Zhi and Shen, Chunhua}, + journal={arXiv preprint arXiv:1906.04423}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/nas_fcos/metafile.yml b/downstream/mmdetection/configs/nas_fcos/metafile.yml new file mode 100644 index 0000000..1ea28cf --- /dev/null +++ b/downstream/mmdetection/configs/nas_fcos/metafile.yml @@ -0,0 +1,44 @@ +Collections: + - Name: NAS-FCOS + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 4x V100 GPUs + Architecture: + - FPN + - NAS-FCOS + - ResNet + Paper: + URL: https://arxiv.org/abs/1906.04423 + Title: 'NAS-FCOS: Fast Neural Architecture Search for Object Detection' + README: configs/nas_fcos/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/detectors/nasfcos.py#L6 + Version: v2.1.0 + +Models: + - Name: nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco + In Collection: NAS-FCOS + Config: configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520-1bdba3ce.pth + + - Name: nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco + In Collection: NAS-FCOS + Config: configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200521-7fdcbce0.pth diff --git a/downstream/mmdetection/configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py b/downstream/mmdetection/configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..a455c92 --- /dev/null +++ b/downstream/mmdetection/configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py @@ -0,0 +1,100 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='NASFCOS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False, eps=0), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=dict( + type='NASFCOS_FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs=True, + num_outs=5, + norm_cfg=dict(type='BN'), + conv_cfg=dict(type='DCNv2', deform_groups=2)), + bbox_head=dict( + type='FCOSHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + norm_cfg=dict(type='GN', num_groups=32), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', loss_weight=1.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +optimizer = dict( + lr=0.01, paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.)) diff --git a/downstream/mmdetection/configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py b/downstream/mmdetection/configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..b779492 --- /dev/null +++ b/downstream/mmdetection/configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py @@ -0,0 +1,99 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='NASFCOS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False, eps=0), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=dict( + type='NASFCOS_FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs=True, + num_outs=5, + norm_cfg=dict(type='BN'), + conv_cfg=dict(type='DCNv2', deform_groups=2)), + bbox_head=dict( + type='NASFCOSHead', + num_classes=80, + in_channels=256, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + norm_cfg=dict(type='GN', num_groups=32), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', loss_weight=1.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +optimizer = dict( + lr=0.01, paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.)) diff --git a/downstream/mmdetection/configs/nas_fpn/README.md b/downstream/mmdetection/configs/nas_fpn/README.md new file mode 100644 index 0000000..c5acf40 --- /dev/null +++ b/downstream/mmdetection/configs/nas_fpn/README.md @@ -0,0 +1,36 @@ +# NAS-FPN + +> [NAS-FPN: Learning Scalable Feature Pyramid Architecture for Object Detection](https://arxiv.org/abs/1904.07392) + + + +## Abstract + +Current state-of-the-art convolutional architectures for object detection are manually designed. Here we aim to learn a better architecture of feature pyramid network for object detection. We adopt Neural Architecture Search and discover a new feature pyramid architecture in a novel scalable search space covering all cross-scale connections. The discovered architecture, named NAS-FPN, consists of a combination of top-down and bottom-up connections to fuse features across scales. NAS-FPN, combined with various backbone models in the RetinaNet framework, achieves better accuracy and latency tradeoff compared to state-of-the-art object detection models. NAS-FPN improves mobile detection accuracy by 2 AP compared to state-of-the-art SSDLite with MobileNetV2 model in \[32\] and achieves 48.3 AP which surpasses Mask R-CNN \[10\] detection accuracy with less computation time. + +
    + +
    + +## Results and Models + +We benchmark the new training schedule (crop training, large batch, unfrozen BN, 50 epochs) introduced in NAS-FPN. RetinaNet is used in the paper. + +| Backbone | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------: | :-----: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | 50e | 12.9 | 22.9 | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_fpn_crop640_50e_coco/retinanet_r50_fpn_crop640_50e_coco-9b953d76.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_fpn_crop640_50e_coco/retinanet_r50_fpn_crop640_50e_coco_20200529_095329.log.json) | +| R-50-NASFPN | 50e | 13.2 | 23.0 | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco/retinanet_r50_nasfpn_crop640_50e_coco-0ad1f644.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco/retinanet_r50_nasfpn_crop640_50e_coco_20200528_230008.log.json) | + +**Note**: We find that it is unstable to train NAS-FPN and there is a small chance that results can be 3% mAP lower. + +## Citation + +```latex +@inproceedings{ghiasi2019fpn, + title={Nas-fpn: Learning scalable feature pyramid architecture for object detection}, + author={Ghiasi, Golnaz and Lin, Tsung-Yi and Le, Quoc V}, + booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, + pages={7036--7045}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/nas_fpn/metafile.yml b/downstream/mmdetection/configs/nas_fpn/metafile.yml new file mode 100644 index 0000000..ab8d649 --- /dev/null +++ b/downstream/mmdetection/configs/nas_fpn/metafile.yml @@ -0,0 +1,59 @@ +Collections: + - Name: NAS-FPN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - NAS-FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.07392 + Title: 'NAS-FPN: Learning Scalable Feature Pyramid Architecture for Object Detection' + README: configs/nas_fpn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/necks/nas_fpn.py#L67 + Version: v2.0.0 + +Models: + - Name: retinanet_r50_fpn_crop640_50e_coco + In Collection: NAS-FPN + Config: configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py + Metadata: + Training Memory (GB): 12.9 + inference time (ms/im): + - value: 43.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_fpn_crop640_50e_coco/retinanet_r50_fpn_crop640_50e_coco-9b953d76.pth + + - Name: retinanet_r50_nasfpn_crop640_50e_coco + In Collection: NAS-FPN + Config: configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py + Metadata: + Training Memory (GB): 13.2 + inference time (ms/im): + - value: 43.48 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco/retinanet_r50_nasfpn_crop640_50e_coco-0ad1f644.pth diff --git a/downstream/mmdetection/configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py b/downstream/mmdetection/configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py new file mode 100644 index 0000000..e4408fe --- /dev/null +++ b/downstream/mmdetection/configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py @@ -0,0 +1,85 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +cudnn_benchmark = True +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + relu_before_extra_convs=True, + no_norm_on_lateral=True, + norm_cfg=norm_cfg), + bbox_head=dict(type='RetinaSepBNHead', num_ins=5, norm_cfg=norm_cfg), + # training and testing settings + train_cfg=dict(assigner=dict(neg_iou_thr=0.5))) +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=(640, 640), + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(640, 640)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=(640, 640)), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(640, 640), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + type='SGD', + lr=0.08, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[30, 40]) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=50) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py b/downstream/mmdetection/configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py new file mode 100644 index 0000000..1387a10 --- /dev/null +++ b/downstream/mmdetection/configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py @@ -0,0 +1,84 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +cudnn_benchmark = True +# model settings +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + type='RetinaNet', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict(type='NASFPN', stack_times=7, norm_cfg=norm_cfg), + bbox_head=dict(type='RetinaSepBNHead', num_ins=5, norm_cfg=norm_cfg), + # training and testing settings + train_cfg=dict(assigner=dict(neg_iou_thr=0.5))) +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=(640, 640), + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(640, 640)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=(640, 640)), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(640, 640), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + type='SGD', + lr=0.08, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[30, 40]) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=50) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/openimages/README.md b/downstream/mmdetection/configs/openimages/README.md new file mode 100644 index 0000000..e5c1c27 --- /dev/null +++ b/downstream/mmdetection/configs/openimages/README.md @@ -0,0 +1,148 @@ +# Open Images Dataset + +> [Open Images Dataset](https://arxiv.org/abs/1811.00982) + + + +## Abstract + + + +#### Open Images v6 + +[Open Images](https://storage.googleapis.com/openimages/web/index.html) is a dataset of ~9M images annotated with image-level labels, +object bounding boxes, object segmentation masks, visual relationships, +and localized narratives: + +- It contains a total of 16M bounding boxes for 600 object classes on + 1.9M images, making it the largest existing dataset with object location + annotations. The boxes have been largely manually drawn by professional + annotators to ensure accuracy and consistency. The images are very diverse + and often contain complex scenes with several objects (8.3 per image on + average). + +- Open Images also offers visual relationship annotations, indicating pairs + of objects in particular relations (e.g. "woman playing guitar", "beer on + table"), object properties (e.g. "table is wooden"), and human actions (e.g. + "woman is jumping"). In total it has 3.3M annotations from 1,466 distinct + relationship triplets. + +- In V5 we added segmentation masks for 2.8M object instances in 350 classes. + Segmentation masks mark the outline of objects, which characterizes their + spatial extent to a much higher level of detail. + +- In V6 we added 675k localized narratives: multimodal descriptions of images + consisting of synchronized voice, text, and mouse traces over the objects being + described. (Note we originally launched localized narratives only on train in V6, + but since July 2020 we also have validation and test covered.) + +- Finally, the dataset is annotated with 59.9M image-level labels spanning 19,957 + classes. + +We believe that having a single dataset with unified annotations for image +classification, object detection, visual relationship detection, instance +segmentation, and multimodal image descriptions will enable to study these +tasks jointly and stimulate progress towards genuine scene understanding. + + + +
    + +
    + +#### Open Images Challenge 2019 + +[Open Images Challenges 2019](https://storage.googleapis.com/openimages/web/challenge2019.html) is based on the V5 release of the Open +Images dataset. The images of the dataset are very varied and +often contain complex scenes with several objects (explore the dataset). + +## Citation + +``` +@article{OpenImages, + author = {Alina Kuznetsova and Hassan Rom and Neil Alldrin and Jasper Uijlings and Ivan Krasin and Jordi Pont-Tuset and Shahab Kamali and Stefan Popov and Matteo Malloci and Alexander Kolesnikov and Tom Duerig and Vittorio Ferrari}, + title = {The Open Images Dataset V4: Unified image classification, object detection, and visual relationship detection at scale}, + year = {2020}, + journal = {IJCV} +} +``` + +## Prepare Dataset + +1. You need to download and extract Open Images dataset. + +2. The Open Images dataset does not have image metas (width and height of the image), + which will be used during evaluation. We suggest to get test image metas before + training/testing by using `tools/misc/get_image_metas.py`. + + **Usage** + + ```shell + python tools/misc/get_image_metas.py ${CONFIG} \ + --out ${OUTPUT FILE NAME} + ``` + +3. The directory should be like this: + + ```none + mmdetection + ├── mmdet + ├── tools + ├── configs + ├── data + │ ├── OpenImages + │ │ ├── annotations + │ │ │ ├── bbox_labels_600_hierarchy.json + │ │ │ ├── class-descriptions-boxable.csv + │ │ │ ├── oidv6-train-annotations-bbox.scv + │ │ │ ├── validation-annotations-bbox.csv + │ │ │ ├── validation-annotations-human-imagelabels-boxable.csv + │ │ │ ├── validation-image-metas.pkl # get from script + │ │ ├── challenge2019 + │ │ │ ├── challenge-2019-train-detection-bbox.txt + │ │ │ ├── challenge-2019-validation-detection-bbox.txt + │ │ │ ├── class_label_tree.np + │ │ │ ├── class_sample_train.pkl + │ │ │ ├── challenge-2019-validation-detection-human-imagelabels.csv # download from official website + │ │ │ ├── challenge-2019-validation-metas.pkl # get from script + │ │ ├── OpenImages + │ │ │ ├── train # training images + │ │ │ ├── test # testing images + │ │ │ ├── validation # validation images + ``` + +**Note**: + +1. The training and validation images of Open Images Challenge dataset are based on + Open Images v6, but the test images are different. +2. The Open Images Challenges annotations are obtained from [TSD](https://github.com/Sense-X/TSD). + You can also download the annotations from [official website](https://storage.googleapis.com/openimages/web/challenge2019_downloads.html), + and set data.train.type=OpenImagesDataset, data.val.type=OpenImagesDataset, and data.test.type=OpenImagesDataset in the config +3. If users do not want to use `validation-annotations-human-imagelabels-boxable.csv` and `challenge-2019-validation-detection-human-imagelabels.csv` + users can set `data.val.load_image_level_labels=False` and `data.test.load_image_level_labels=False` in the config. + Please note that loading image-levels label is the default of Open Images evaluation metric. + More details please refer to the [official website](https://storage.googleapis.com/openimages/web/evaluation.html) + +## Results and Models + +| Architecture | Backbone | Style | Lr schd | Sampler | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------------------------: | :------: | :-----: | :-----: | :-----------------: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | R-50 | pytorch | 1x | Group Sampler | 7.7 | - | 51.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_20211130_231159-e87ab7ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_20211130_231159.log.json) | +| Faster R-CNN | R-50 | pytorch | 1x | Class Aware Sampler | 7.7 | - | 60.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_20220306_202424-98c630e5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_20220306_202424.log.json) | +| Faster R-CNN (Challenge 2019) | R-50 | pytorch | 1x | Group Sampler | 7.7 | - | 54.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge_20220114_045100-0e79e5df.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge_20220114_045100.log.json) | +| Faster R-CNN (Challenge 2019) | R-50 | pytorch | 1x | Class Aware Sampler | 7.1 | - | 65.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge_20220221_192021-34c402d9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge_20220221_192021.log.json) | +| Retinanet | R-50 | pytorch | 1x | Group Sampler | 6.6 | - | 61.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/retinanet_r50_fpn_32x2_1x_openimages/retinanet_r50_fpn_32x2_1x_openimages_20211223_071954-d2ae5462.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/retinanet_r50_fpn_32x2_1x_openimages/retinanet_r50_fpn_32x2_1x_openimages_20211223_071954.log.json) | +| SSD | VGG16 | pytorch | 36e | Group Sampler | 10.8 | - | 35.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/ssd300_32x8_36e_openimages.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/ssd300_32x8_36e_openimages/ssd300_32x8_36e_openimages_20211224_000232-dce93846.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/ssd300_32x8_36e_openimages/ssd300_32x8_36e_openimages_20211224_000232.log.json) | + +**Notes:** + +- 'cas' is short for 'Class Aware Sampler' + +### Results of consider image level labels + +| Architecture | Sampler | Consider Image Level Labels | box AP | +| :-------------------------------: | :-----------------: | :-------------------------: | :----: | +| Faster R-CNN r50 (Challenge 2019) | Group Sampler | w/o | 62.19 | +| Faster R-CNN r50 (Challenge 2019) | Group Sampler | w/ | 54.87 | +| Faster R-CNN r50 (Challenge 2019) | Class Aware Sampler | w/o | 71.77 | +| Faster R-CNN r50 (Challenge 2019) | Class Aware Sampler | w/ | 64.98 | diff --git a/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py b/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py new file mode 100644 index 0000000..3dfc341 --- /dev/null +++ b/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/openimages_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict(roi_head=dict(bbox_head=dict(num_classes=601))) + +# Using 32 GPUS while training +optimizer = dict(type='SGD', lr=0.08, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=26000, + warmup_ratio=1.0 / 64, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py b/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py new file mode 100644 index 0000000..c8900ad --- /dev/null +++ b/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py @@ -0,0 +1,47 @@ +_base_ = ['faster_rcnn_r50_fpn_32x2_1x_openimages.py'] + +model = dict( + roi_head=dict(bbox_head=dict(num_classes=500)), + test_cfg=dict(rcnn=dict(score_thr=0.01))) + +# dataset settings +dataset_type = 'OpenImagesChallengeDataset' +data_root = 'data/OpenImages/' +data = dict( + train=dict( + type=dataset_type, + ann_file=data_root + + 'challenge2019/challenge-2019-train-detection-bbox.txt', + img_prefix=data_root + 'OpenImages/', + label_file=data_root + 'challenge2019/cls-label-description.csv', + hierarchy_file=data_root + 'challenge2019/class_label_tree.np'), + val=dict( + type=dataset_type, + ann_file=data_root + + 'challenge2019/challenge-2019-validation-detection-bbox.txt', + img_prefix=data_root + 'OpenImages/', + label_file=data_root + 'challenge2019/cls-label-description.csv', + hierarchy_file=data_root + 'challenge2019/class_label_tree.np', + meta_file=data_root + + 'challenge2019/challenge-2019-validation-metas.pkl', + image_level_ann_file=data_root + + 'challenge2019/challenge-2019-validation-detection-' + 'human-imagelabels.csv'), + test=dict( + type=dataset_type, + ann_file=data_root + + 'challenge2019/challenge-2019-validation-detection-bbox.txt', + img_prefix=data_root + 'OpenImages/', + label_file=data_root + 'challenge2019/cls-label-description.csv', + hierarchy_file=data_root + 'challenge2019/class_label_tree.np', + meta_file=data_root + + 'challenge2019/challenge-2019-validation-metas.pkl', + image_level_ann_file=data_root + + 'challenge2019/challenge-2019-validation-detection-' + 'human-imagelabels.csv')) +evaluation = dict(interval=1, metric='mAP') + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py b/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py new file mode 100644 index 0000000..88d029d --- /dev/null +++ b/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py @@ -0,0 +1,5 @@ +_base_ = ['faster_rcnn_r50_fpn_32x2_1x_openimages.py'] + +# Use ClassAwareSampler +data = dict( + train_dataloader=dict(class_aware_sampler=dict(num_sample_class=1))) diff --git a/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py b/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py new file mode 100644 index 0000000..26bd64e --- /dev/null +++ b/downstream/mmdetection/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py @@ -0,0 +1,5 @@ +_base_ = ['faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py'] + +# Use ClassAwareSampler +data = dict( + train_dataloader=dict(class_aware_sampler=dict(num_sample_class=1))) diff --git a/downstream/mmdetection/configs/openimages/metafile.yml b/downstream/mmdetection/configs/openimages/metafile.yml new file mode 100644 index 0000000..9be1726 --- /dev/null +++ b/downstream/mmdetection/configs/openimages/metafile.yml @@ -0,0 +1,102 @@ +Models: + - Name: faster_rcnn_r50_fpn_32x2_1x_openimages + In Collection: Faster R-CNN + Config: configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py + Metadata: + Training Memory (GB): 7.7 + Epochs: 12 + Training Data: Open Images v6 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images v6 + Metrics: + box AP: 51.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_20211130_231159-e87ab7ce.pth + + - Name: retinanet_r50_fpn_32x2_1x_openimages + In Collection: RetinaNet + Config: configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py + Metadata: + Training Memory (GB): 6.6 + Epochs: 12 + Training Data: Open Images v6 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images v6 + Metrics: + box AP: 61.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/retinanet_r50_fpn_32x2_1x_openimages/retinanet_r50_fpn_32x2_1x_openimages_20211223_071954-d2ae5462.pth + + - Name: ssd300_32x8_36e_openimages + In Collection: SSD + Config: configs/openimages/ssd300_32x8_36e_openimages + Metadata: + Training Memory (GB): 10.8 + Epochs: 36 + Training Data: Open Images v6 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images v6 + Metrics: + box AP: 35.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/ssd300_32x8_36e_openimages/ssd300_32x8_36e_openimages_20211224_000232-dce93846.pth + + - Name: faster_rcnn_r50_fpn_32x2_1x_openimages_challenge + In Collection: Faster R-CNN + Config: configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py + Metadata: + Training Memory (GB): 7.7 + Epochs: 12 + Training Data: Open Images Challenge 2019 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images Challenge 2019 + Metrics: + box AP: 54.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge_20220114_045100-0e79e5df.pth + + - Name: faster_rcnn_r50_fpn_32x2_cas_1x_openimages + In Collection: Faster R-CNN + Config: configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py + Metadata: + Training Memory (GB): 7.7 + Epochs: 12 + Training Data: Open Images Challenge 2019 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images Challenge 2019 + Metrics: + box AP: 60.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_20220306_202424-98c630e5.pth + + - Name: faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge + In Collection: Faster R-CNN + Config: configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py + Metadata: + Training Memory (GB): 7.1 + Epochs: 12 + Training Data: Open Images Challenge 2019 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images Challenge 2019 + Metrics: + box AP: 65.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge_20220221_192021-34c402d9.pth diff --git a/downstream/mmdetection/configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py b/downstream/mmdetection/configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py new file mode 100644 index 0000000..0191aa1 --- /dev/null +++ b/downstream/mmdetection/configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py @@ -0,0 +1,22 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/openimages_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict(bbox_head=dict(num_classes=601)) + +optimizer = dict(type='SGD', lr=0.08, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=26000, + warmup_ratio=1.0 / 64, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/openimages/ssd300_32x8_36e_openimages.py b/downstream/mmdetection/configs/openimages/ssd300_32x8_36e_openimages.py new file mode 100644 index 0000000..e2565b9 --- /dev/null +++ b/downstream/mmdetection/configs/openimages/ssd300_32x8_36e_openimages.py @@ -0,0 +1,83 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/openimages_detection.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_1x.py' +] +model = dict( + bbox_head=dict( + num_classes=601, + anchor_generator=dict(basesize_ratio_range=(0.2, 0.9)))) +# dataset settings +dataset_type = 'OpenImagesDataset' +data_root = 'data/OpenImages/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True, normed_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, # using 32 GPUS while training. + workers_per_gpu=0, # workers_per_gpu > 0 may occur out of memory + train=dict( + _delete_=True, + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/oidv6-train-annotations-bbox.csv', + img_prefix=data_root + 'OpenImages/train/', + label_file=data_root + + 'annotations/class-descriptions-boxable.csv', + hierarchy_file=data_root + + 'annotations/bbox_labels_600_hierarchy.json', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.04, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict() +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=20000, + warmup_ratio=0.001, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=256) diff --git a/downstream/mmdetection/configs/paa/README.md b/downstream/mmdetection/configs/paa/README.md new file mode 100644 index 0000000..c8861ec --- /dev/null +++ b/downstream/mmdetection/configs/paa/README.md @@ -0,0 +1,47 @@ +# PAA + +> [Probabilistic Anchor Assignment with IoU Prediction for Object Detection](https://arxiv.org/abs/2007.08103) + + + +## Abstract + +In object detection, determining which anchors to assign as positive or negative samples, known as anchor assignment, has been revealed as a core procedure that can significantly affect a model's performance. In this paper we propose a novel anchor assignment strategy that adaptively separates anchors into positive and negative samples for a ground truth bounding box according to the model's learning status such that it is able to reason about the separation in a probabilistic manner. To do so we first calculate the scores of anchors conditioned on the model and fit a probability distribution to these scores. The model is then trained with anchors separated into positive and negative samples according to their probabilities. Moreover, we investigate the gap between the training and testing objectives and propose to predict the Intersection-over-Unions of detected boxes as a measure of localization quality to reduce the discrepancy. The combined score of classification and localization qualities serving as a box selection metric in non-maximum suppression well aligns with the proposed anchor assignment strategy and leads significant performance improvements. The proposed methods only add a single convolutional layer to RetinaNet baseline and does not require multiple anchors per location, so are efficient. Experimental results verify the effectiveness of the proposed methods. Especially, our models set new records for single-stage detectors on MS COCO test-dev dataset with various backbones. + +
    + +
    + +## Results and Models + +We provide config files to reproduce the object detection results in the +ECCV 2020 paper for Probabilistic Anchor Assignment with IoU +Prediction for Object Detection. + +| Backbone | Lr schd | Mem (GB) | Score voting | box AP | Config | Download | +| :-------: | :-----: | :------: | :----------: | :----: | :---------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | 12e | 3.7 | True | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.log.json) | +| R-50-FPN | 12e | 3.7 | False | 40.2 | - | | +| R-50-FPN | 18e | 3.7 | True | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r50_fpn_1.5x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1.5x_coco/paa_r50_fpn_1.5x_coco_20200823-805d6078.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1.5x_coco/paa_r50_fpn_1.5x_coco_20200823-805d6078.log.json) | +| R-50-FPN | 18e | 3.7 | False | 41.2 | - | | +| R-50-FPN | 24e | 3.7 | True | 41.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r50_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_2x_coco/paa_r50_fpn_2x_coco_20200821-c98bfc4e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_2x_coco/paa_r50_fpn_2x_coco_20200821-c98bfc4e.log.json) | +| R-50-FPN | 36e | 3.7 | True | 43.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r50_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_mstrain_3x_coco/paa_r50_fpn_mstrain_3x_coco_20210121_145722-06a6880b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_mstrain_3x_coco/paa_r50_fpn_mstrain_3x_coco_20210121_145722.log.json) | +| R-101-FPN | 12e | 6.2 | True | 42.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.log.json) | +| R-101-FPN | 12e | 6.2 | False | 42.4 | - | | +| R-101-FPN | 24e | 6.2 | True | 43.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_2x_coco/paa_r101_fpn_2x_coco_20200821-6829f96b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_2x_coco/paa_r101_fpn_2x_coco_20200821-6829f96b.log.json) | +| R-101-FPN | 36e | 6.2 | True | 45.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r101_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_mstrain_3x_coco/paa_r101_fpn_mstrain_3x_coco_20210122_084202-83250d22.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_mstrain_3x_coco/paa_r101_fpn_mstrain_3x_coco_20210122_084202.log.json) | + +**Note**: + +1. We find that the performance is unstable with 1x setting and may fluctuate by about 0.2 mAP. We report the best results. + +## Citation + +```latex +@inproceedings{paa-eccv2020, + title={Probabilistic Anchor Assignment with IoU Prediction for Object Detection}, + author={Kim, Kang and Lee, Hee Seok}, + booktitle = {ECCV}, + year={2020} +} +``` diff --git a/downstream/mmdetection/configs/paa/metafile.yml b/downstream/mmdetection/configs/paa/metafile.yml new file mode 100644 index 0000000..e08b663 --- /dev/null +++ b/downstream/mmdetection/configs/paa/metafile.yml @@ -0,0 +1,104 @@ +Collections: + - Name: PAA + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - Probabilistic Anchor Assignment + - ResNet + Paper: + URL: https://arxiv.org/abs/2007.08103 + Title: 'Probabilistic Anchor Assignment with IoU Prediction for Object Detection' + README: configs/paa/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.4.0/mmdet/models/detectors/paa.py#L6 + Version: v2.4.0 + +Models: + - Name: paa_r50_fpn_1x_coco + In Collection: PAA + Config: configs/paa/paa_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.7 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.pth + + - Name: paa_r50_fpn_1.5x_coco + In Collection: PAA + Config: configs/paa/paa_r50_fpn_1.5x_coco.py + Metadata: + Training Memory (GB): 3.7 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1.5x_coco/paa_r50_fpn_1.5x_coco_20200823-805d6078.pth + + - Name: paa_r50_fpn_2x_coco + In Collection: PAA + Config: configs/paa/paa_r50_fpn_2x_coco.py + Metadata: + Training Memory (GB): 3.7 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_2x_coco/paa_r50_fpn_2x_coco_20200821-c98bfc4e.pth + + - Name: paa_r50_fpn_mstrain_3x_coco + In Collection: PAA + Config: configs/paa/paa_r50_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 3.7 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_mstrain_3x_coco/paa_r50_fpn_mstrain_3x_coco_20210121_145722-06a6880b.pth + + - Name: paa_r101_fpn_1x_coco + In Collection: PAA + Config: configs/paa/paa_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.pth + + - Name: paa_r101_fpn_2x_coco + In Collection: PAA + Config: configs/paa/paa_r101_fpn_2x_coco.py + Metadata: + Training Memory (GB): 6.2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_2x_coco/paa_r101_fpn_2x_coco_20200821-6829f96b.pth + + - Name: paa_r101_fpn_mstrain_3x_coco + In Collection: PAA + Config: configs/paa/paa_r101_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 6.2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_mstrain_3x_coco/paa_r101_fpn_mstrain_3x_coco_20210122_084202-83250d22.pth diff --git a/downstream/mmdetection/configs/paa/paa_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/paa/paa_r101_fpn_1x_coco.py new file mode 100644 index 0000000..94f1c27 --- /dev/null +++ b/downstream/mmdetection/configs/paa/paa_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './paa_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/paa/paa_r101_fpn_2x_coco.py b/downstream/mmdetection/configs/paa/paa_r101_fpn_2x_coco.py new file mode 100644 index 0000000..641ef76 --- /dev/null +++ b/downstream/mmdetection/configs/paa/paa_r101_fpn_2x_coco.py @@ -0,0 +1,3 @@ +_base_ = './paa_r101_fpn_1x_coco.py' +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/paa/paa_r101_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/paa/paa_r101_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..71858ed --- /dev/null +++ b/downstream/mmdetection/configs/paa/paa_r101_fpn_mstrain_3x_coco.py @@ -0,0 +1,6 @@ +_base_ = './paa_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/paa/paa_r50_fpn_1.5x_coco.py b/downstream/mmdetection/configs/paa/paa_r50_fpn_1.5x_coco.py new file mode 100644 index 0000000..aabce4a --- /dev/null +++ b/downstream/mmdetection/configs/paa/paa_r50_fpn_1.5x_coco.py @@ -0,0 +1,3 @@ +_base_ = './paa_r50_fpn_1x_coco.py' +lr_config = dict(step=[12, 16]) +runner = dict(type='EpochBasedRunner', max_epochs=18) diff --git a/downstream/mmdetection/configs/paa/paa_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/paa/paa_r50_fpn_1x_coco.py new file mode 100644 index 0000000..4c9c4aa --- /dev/null +++ b/downstream/mmdetection/configs/paa/paa_r50_fpn_1x_coco.py @@ -0,0 +1,70 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='PAA', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='PAAHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.1, + neg_iou_thr=0.1, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/paa/paa_r50_fpn_2x_coco.py b/downstream/mmdetection/configs/paa/paa_r50_fpn_2x_coco.py new file mode 100644 index 0000000..663d2c0 --- /dev/null +++ b/downstream/mmdetection/configs/paa/paa_r50_fpn_2x_coco.py @@ -0,0 +1,3 @@ +_base_ = './paa_r50_fpn_1x_coco.py' +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/paa/paa_r50_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/paa/paa_r50_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..91fa28c --- /dev/null +++ b/downstream/mmdetection/configs/paa/paa_r50_fpn_mstrain_3x_coco.py @@ -0,0 +1,20 @@ +_base_ = './paa_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/downstream/mmdetection/configs/pafpn/README.md b/downstream/mmdetection/configs/pafpn/README.md new file mode 100644 index 0000000..ae1e3a3 --- /dev/null +++ b/downstream/mmdetection/configs/pafpn/README.md @@ -0,0 +1,34 @@ +# PAFPN + +> [Path Aggregation Network for Instance Segmentation](https://arxiv.org/abs/1803.01534) + + + +## Abstract + +The way that information propagates in neural networks is of great importance. In this paper, we propose Path Aggregation Network (PANet) aiming at boosting information flow in proposal-based instance segmentation framework. Specifically, we enhance the entire feature hierarchy with accurate localization signals in lower layers by bottom-up path augmentation, which shortens the information path between lower layers and topmost feature. We present adaptive feature pooling, which links feature grid and all feature levels to make useful information in each feature level propagate directly to following proposal subnetworks. A complementary branch capturing different views for each proposal is created to further improve mask prediction. These improvements are simple to implement, with subtle extra computational overhead. Our PANet reaches the 1st place in the COCO 2017 Challenge Instance Segmentation task and the 2nd place in Object Detection task without large-batch training. It is also state-of-the-art on MVD and Cityscapes. + +
    + +
    + +## Results and Models + +| Backbone | style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 4.0 | 17.2 | 37.5 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pafpn/faster_rcnn_r50_pafpn_1x_coco/faster_rcnn_r50_pafpn_1x_coco_bbox_mAP-0.375_20200503_105836-b7b4b9bd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pafpn/faster_rcnn_r50_pafpn_1x_coco/faster_rcnn_r50_pafpn_1x_coco_20200503_105836.log.json) | + +## Citation + +```latex +@inproceedings{liu2018path, + author = {Shu Liu and + Lu Qi and + Haifang Qin and + Jianping Shi and + Jiaya Jia}, + title = {Path Aggregation Network for Instance Segmentation}, + booktitle = {Proceedings of IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year = {2018} +} +``` diff --git a/downstream/mmdetection/configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py b/downstream/mmdetection/configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py new file mode 100644 index 0000000..b2fdef9 --- /dev/null +++ b/downstream/mmdetection/configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' + +model = dict( + neck=dict( + type='PAFPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/pafpn/metafile.yml b/downstream/mmdetection/configs/pafpn/metafile.yml new file mode 100644 index 0000000..f9cf97c --- /dev/null +++ b/downstream/mmdetection/configs/pafpn/metafile.yml @@ -0,0 +1,38 @@ +Collections: + - Name: PAFPN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - PAFPN + Paper: + URL: https://arxiv.org/abs/1803.01534 + Title: 'Path Aggregation Network for Instance Segmentation' + README: configs/pafpn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/necks/pafpn.py#L11 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_pafpn_1x_coco + In Collection: PAFPN + Config: configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 58.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pafpn/faster_rcnn_r50_pafpn_1x_coco/faster_rcnn_r50_pafpn_1x_coco_bbox_mAP-0.375_20200503_105836-b7b4b9bd.pth diff --git a/downstream/mmdetection/configs/panoptic_fpn/README.md b/downstream/mmdetection/configs/panoptic_fpn/README.md new file mode 100644 index 0000000..12980ce --- /dev/null +++ b/downstream/mmdetection/configs/panoptic_fpn/README.md @@ -0,0 +1,62 @@ +# Panoptic FPN + +> [Panoptic feature pyramid networks](https://arxiv.org/abs/1901.02446) + + + +## Abstract + +The recently introduced panoptic segmentation task has renewed our community's interest in unifying the tasks of instance segmentation (for thing classes) and semantic segmentation (for stuff classes). However, current state-of-the-art methods for this joint task use separate and dissimilar networks for instance and semantic segmentation, without performing any shared computation. In this work, we aim to unify these methods at the architectural level, designing a single network for both tasks. Our approach is to endow Mask R-CNN, a popular instance segmentation method, with a semantic segmentation branch using a shared Feature Pyramid Network (FPN) backbone. Surprisingly, this simple baseline not only remains effective for instance segmentation, but also yields a lightweight, top-performing method for semantic segmentation. In this work, we perform a detailed study of this minimally extended version of Mask R-CNN with FPN, which we refer to as Panoptic FPN, and show it is a robust and accurate baseline for both tasks. Given its effectiveness and conceptual simplicity, we hope our method can serve as a strong baseline and aid future research in panoptic segmentation. + +
    + +
    + +## Dataset + +PanopticFPN requires COCO and [COCO-panoptic](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip) dataset for training and evaluation. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ │ ├── panoptic_train2017.json +│ │ │ ├── panoptic_train2017 +│ │ │ ├── panoptic_val2017.json +│ │ │ ├── panoptic_val2017 +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +``` + +## Results and Models + +| Backbone | style | Lr schd | Mem (GB) | Inf time (fps) | PQ | SQ | RQ | PQ_th | SQ_th | RQ_th | PQ_st | SQ_st | RQ_st | Config | Download | +| :-------: | :-----: | :-----: | :------: | :------------: | :--: | :--: | :--: | :---: | :---: | :---: | :---: | :---: | :---: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 4.7 | | 40.2 | 77.8 | 49.3 | 47.8 | 80.9 | 57.5 | 28.9 | 73.1 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco/panoptic_fpn_r50_fpn_1x_coco_20210821_101153-9668fd13.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco/panoptic_fpn_r50_fpn_1x_coco_20210821_101153.log.json) | +| R-50-FPN | pytorch | 3x | - | - | 42.5 | 78.1 | 51.7 | 50.3 | 81.5 | 60.3 | 30.7 | 73.0 | 38.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco/panoptic_fpn_r50_fpn_mstrain_3x_coco_20210824_171155-5650f98b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco/panoptic_fpn_r50_fpn_mstrain_3x_coco_20210824_171155.log.json) | +| R-101-FPN | pytorch | 1x | 6.7 | | 42.2 | 78.3 | 51.4 | 50.1 | 81.4 | 59.9 | 30.3 | 73.6 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco/panoptic_fpn_r101_fpn_1x_coco_20210820_193950-ab9157a2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco/panoptic_fpn_r101_fpn_1x_coco_20210820_193950.log.json) | +| R-101-FPN | pytorch | 3x | - | - | 44.1 | 78.9 | 53.6 | 52.1 | 81.7 | 62.3 | 32.0 | 74.6 | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco/panoptic_fpn_r101_fpn_mstrain_3x_coco_20210823_114712-9c99acc4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco/panoptic_fpn_r101_fpn_mstrain_3x_coco_20210823_114712.log.json) | + +## Citation + +The base method for panoptic segmentation task. + +```latex +@inproceedings{kirillov2018panopticfpn, + author = { + Alexander Kirillov, + Ross Girshick, + Kaiming He, + Piotr Dollar, + }, + title = {Panoptic Feature Pyramid Networks}, + booktitle = {Proceedings of IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year = {2019} +} +``` diff --git a/downstream/mmdetection/configs/panoptic_fpn/metafile.yml b/downstream/mmdetection/configs/panoptic_fpn/metafile.yml new file mode 100644 index 0000000..8c9d39d --- /dev/null +++ b/downstream/mmdetection/configs/panoptic_fpn/metafile.yml @@ -0,0 +1,70 @@ +Collections: + - Name: PanopticFPN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - PanopticFPN + Paper: + URL: https://arxiv.org/pdf/1901.02446 + Title: 'Panoptic feature pyramid networks' + README: configs/panoptic_fpn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/detectors/panoptic_fpn.py#L7 + Version: v2.16.0 + +Models: + - Name: panoptic_fpn_r50_fpn_1x_coco + In Collection: PanopticFPN + Config: configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.6 + Epochs: 12 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 40.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco/panoptic_fpn_r50_fpn_1x_coco_20210821_101153-9668fd13.pth + + - Name: panoptic_fpn_r50_fpn_mstrain_3x_coco + In Collection: PanopticFPN + Config: configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.6 + Epochs: 36 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 42.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco/panoptic_fpn_r50_fpn_mstrain_3x_coco_20210824_171155-5650f98b.pth + + - Name: panoptic_fpn_r101_fpn_1x_coco + In Collection: PanopticFPN + Config: configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.5 + Epochs: 12 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 42.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco/panoptic_fpn_r101_fpn_1x_coco_20210820_193950-ab9157a2.pth + + - Name: panoptic_fpn_r101_fpn_mstrain_3x_coco + In Collection: PanopticFPN + Config: configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 6.5 + Epochs: 36 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 44.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco/panoptic_fpn_r101_fpn_mstrain_3x_coco_20210823_114712-9c99acc4.pth diff --git a/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py b/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..78b8079 --- /dev/null +++ b/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './panoptic_fpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..057e481 --- /dev/null +++ b/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py @@ -0,0 +1,6 @@ +_base_ = './panoptic_fpn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..2995524 --- /dev/null +++ b/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py @@ -0,0 +1,33 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_panoptic.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='PanopticFPN', + semantic_head=dict( + type='PanopticFPNHead', + num_things_classes=80, + num_stuff_classes=53, + in_channels=256, + inner_channels=128, + start_level=0, + end_level=4, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + conv_cfg=None, + loss_seg=dict( + type='CrossEntropyLoss', ignore_index=255, loss_weight=0.5)), + panoptic_fusion_head=dict( + type='HeuristicFusionHead', + num_things_classes=80, + num_stuff_classes=53), + test_cfg=dict( + panoptic=dict( + score_thr=0.6, + max_per_img=100, + mask_thr_binary=0.5, + mask_overlap=0.5, + nms=dict(type='nms', iou_threshold=0.5, class_agnostic=True), + stuff_area_limit=4096))) + +custom_hooks = [] diff --git a/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..b510935 --- /dev/null +++ b/downstream/mmdetection/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py @@ -0,0 +1,61 @@ +_base_ = './panoptic_fpn_r50_fpn_1x_coco.py' + +# dataset settings +dataset_type = 'CocoPanopticDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 4), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + train=dict( + _delete_=True, + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/panoptic_train2017.json', + img_prefix=data_root + 'train2017/', + seg_prefix=data_root + 'annotations/panoptic_train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/pascal_voc/README.md b/downstream/mmdetection/configs/pascal_voc/README.md new file mode 100644 index 0000000..3c09813 --- /dev/null +++ b/downstream/mmdetection/configs/pascal_voc/README.md @@ -0,0 +1,40 @@ +# Pascal VOC + +> [The Pascal Visual Object Classes (VOC) Challenge](https://link.springer.com/article/10.1007/s11263-009-0275-4) + + + +## Abstract + +The Pascal Visual Object Classes (VOC) challenge is a benchmark in visual object category recognition and detection, providing the vision and machine learning communities with a standard dataset of images and annotation, and standard evaluation procedures. Organised annually from 2005 to present, the challenge and its associated dataset has become accepted as the benchmark for object detection. + +This paper describes the dataset and evaluation procedure. We review the state-of-the-art in evaluated methods for both classification and detection, analyse whether the methods are statistically different, what they are learning from the images (e.g. the object or its context), and what the methods find easy or confuse. The paper concludes with lessons learnt in the three year history of the challenge, and proposes directions for future improvement and extension. + +
    + +
    + +## Results and Models + +| Architecture | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :------: | :-----: | :-----: | :------: | :------------: | :----: | :--------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN C4 | R-50 | caffe | 18k | | - | 80.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712//home/dong/code_sensetime/2022Q1/mmdetection/work_dirs/prepare_voc/gather/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712_20220314_234327-847a14d2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712_20220314_234327.log.json) | +| Faster R-CNN | R-50 | pytorch | 1x | 2.6 | - | 80.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712/faster_rcnn_r50_fpn_1x_voc0712_20220320_192712-54bef0f3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712/faster_rcnn_r50_fpn_1x_voc0712_20220320_192712.log.json) | +| Retinanet | R-50 | pytorch | 1x | 2.1 | - | 77.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/retinanet_r50_fpn_1x_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/retinanet_r50_fpn_1x_voc0712/retinanet_r50_fpn_1x_voc0712_20200617-47cbdd0e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/retinanet_r50_fpn_1x_voc0712/retinanet_r50_fpn_1x_voc0712_20200616_014642.log.json) | +| SSD300 | VGG16 | - | 120e | - | - | 76.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/ssd300_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/ssd300_voc0712/ssd300_voc0712_20220320_194658-17edda1b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/ssd300_voc0712/ssd300_voc0712_20220320_194658.log.json) | +| SSD512 | VGG16 | - | 120e | - | - | 79.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/ssd512_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/ssd512_voc0712/ssd512_voc0712_20220320_194717-03cefefe.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/ssd512_voc0712/ssd512_voc0712_20220320_194717.log.json) | + +## Citation + +```latex +@Article{Everingham10, + author = "Everingham, M. and Van~Gool, L. and Williams, C. K. I. and Winn, J. and Zisserman, A.", + title = "The Pascal Visual Object Classes (VOC) Challenge", + journal = "International Journal of Computer Vision", + volume = "88", + year = "2010", + number = "2", + month = jun, + pages = "303--338", +} +``` diff --git a/downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py b/downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py new file mode 100644 index 0000000..7bb1d73 --- /dev/null +++ b/downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py @@ -0,0 +1,81 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_caffe_c4.py', + '../_base_/default_runtime.py' +] +model = dict(roi_head=dict(bbox_head=dict(num_classes=20))) + +# dataset settings +dataset_type = 'VOCDataset' +data_root = 'data/VOCdevkit/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 512), (1333, 544), (1333, 576), + (1333, 608), (1333, 640), (1333, 672), (1333, 704), + (1333, 736), (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=[ + data_root + 'VOC2007/ImageSets/Main/trainval.txt', + data_root + 'VOC2012/ImageSets/Main/trainval.txt' + ], + img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'], + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'VOC2007/ImageSets/Main/test.txt', + img_prefix=data_root + 'VOC2007/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'VOC2007/ImageSets/Main/test.txt', + img_prefix=data_root + 'VOC2007/', + pipeline=test_pipeline)) + +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=100, + warmup_ratio=0.001, + step=[12000, 16000]) + +# Runner type +runner = dict(type='IterBasedRunner', max_iters=18000) + +checkpoint_config = dict(interval=3000) +evaluation = dict(interval=3000, metric='mAP') diff --git a/downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py b/downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py new file mode 100644 index 0000000..7866ace --- /dev/null +++ b/downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', '../_base_/datasets/voc0712.py', + '../_base_/default_runtime.py' +] +model = dict(roi_head=dict(bbox_head=dict(num_classes=20))) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +# actual epoch = 3 * 3 = 9 +lr_config = dict(policy='step', step=[3]) +# runtime settings +runner = dict( + type='EpochBasedRunner', max_epochs=4) # actual epoch = 4 * 3 = 12 diff --git a/downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712_cocofmt.py b/downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712_cocofmt.py new file mode 100644 index 0000000..12eee2c --- /dev/null +++ b/downstream/mmdetection/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712_cocofmt.py @@ -0,0 +1,75 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', '../_base_/datasets/voc0712.py', + '../_base_/default_runtime.py' +] +model = dict(roi_head=dict(bbox_head=dict(num_classes=20))) + +CLASSES = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', + 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor') + +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/VOCdevkit/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1000, 600), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1000, 600), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file='data/voc0712_trainval.json', + img_prefix='data/VOCdevkit', + pipeline=train_pipeline, + classes=CLASSES)), + val=dict( + type=dataset_type, + ann_file='data/voc07_test.json', + img_prefix='data/VOCdevkit', + pipeline=test_pipeline, + classes=CLASSES), + test=dict( + type=dataset_type, + ann_file='data/voc07_test.json', + img_prefix='data/VOCdevkit', + pipeline=test_pipeline, + classes=CLASSES)) +evaluation = dict(interval=1, metric='bbox') + +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +# actual epoch = 3 * 3 = 9 +lr_config = dict(policy='step', step=[3]) +# runtime settings +runner = dict( + type='EpochBasedRunner', max_epochs=4) # actual epoch = 4 * 3 = 12 diff --git a/downstream/mmdetection/configs/pascal_voc/retinanet_r50_fpn_1x_voc0712.py b/downstream/mmdetection/configs/pascal_voc/retinanet_r50_fpn_1x_voc0712.py new file mode 100644 index 0000000..b4b050d --- /dev/null +++ b/downstream/mmdetection/configs/pascal_voc/retinanet_r50_fpn_1x_voc0712.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', '../_base_/datasets/voc0712.py', + '../_base_/default_runtime.py' +] +model = dict(bbox_head=dict(num_classes=20)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +# actual epoch = 3 * 3 = 9 +lr_config = dict(policy='step', step=[3]) +# runtime settings +runner = dict( + type='EpochBasedRunner', max_epochs=4) # actual epoch = 4 * 3 = 12 diff --git a/downstream/mmdetection/configs/pascal_voc/ssd300_voc0712.py b/downstream/mmdetection/configs/pascal_voc/ssd300_voc0712.py new file mode 100644 index 0000000..e7008ae --- /dev/null +++ b/downstream/mmdetection/configs/pascal_voc/ssd300_voc0712.py @@ -0,0 +1,74 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/voc0712.py', + '../_base_/default_runtime.py' +] +model = dict( + bbox_head=dict( + num_classes=20, anchor_generator=dict(basesize_ratio_range=(0.2, + 0.9)))) +# dataset settings +dataset_type = 'VOCDataset' +data_root = 'data/VOCdevkit/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=3, + train=dict( + type='RepeatDataset', times=10, dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=1e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict() +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[16, 20]) +checkpoint_config = dict(interval=1) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=24) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/downstream/mmdetection/configs/pascal_voc/ssd512_voc0712.py b/downstream/mmdetection/configs/pascal_voc/ssd512_voc0712.py new file mode 100644 index 0000000..f4627c2 --- /dev/null +++ b/downstream/mmdetection/configs/pascal_voc/ssd512_voc0712.py @@ -0,0 +1,57 @@ +_base_ = 'ssd300_voc0712.py' +input_size = 512 +model = dict( + neck=dict( + out_channels=(512, 1024, 512, 256, 256, 256, 256), + level_strides=(2, 2, 2, 2, 1), + level_paddings=(1, 1, 1, 1, 1), + last_kernel_size=4), + bbox_head=dict( + in_channels=(512, 1024, 512, 256, 256, 256, 256), + anchor_generator=dict( + input_size=input_size, + strides=[8, 16, 32, 64, 128, 256, 512], + basesize_ratio_range=(0.15, 0.9), + ratios=([2], [2, 3], [2, 3], [2, 3], [2, 3], [2], [2])))) +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(512, 512), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/downstream/mmdetection/configs/pisa/README.md b/downstream/mmdetection/configs/pisa/README.md new file mode 100644 index 0000000..c847c85 --- /dev/null +++ b/downstream/mmdetection/configs/pisa/README.md @@ -0,0 +1,50 @@ +# PISA + +> [Prime Sample Attention in Object Detection](https://arxiv.org/abs/1904.04821) + + + +## Abstract + +It is a common paradigm in object detection frameworks to treat all samples equally and target at maximizing the performance on average. In this work, we revisit this paradigm through a careful study on how different samples contribute to the overall performance measured in terms of mAP. Our study suggests that the samples in each mini-batch are neither independent nor equally important, and therefore a better classifier on average does not necessarily mean higher mAP. Motivated by this study, we propose the notion of Prime Samples, those that play a key role in driving the detection performance. We further develop a simple yet effective sampling and learning strategy called PrIme Sample Attention (PISA) that directs the focus of the training process towards such samples. Our experiments demonstrate that it is often more effective to focus on prime samples than hard samples when training a detector. Particularly, On the MSCOCO dataset, PISA outperforms the random sampling baseline and hard mining schemes, e.g., OHEM and Focal Loss, consistently by around 2% on both single-stage and two-stage detectors, even with a strong backbone ResNeXt-101. + +
    + +
    + +## Results and Models + +| PISA | Network | Backbone | Lr schd | box AP | mask AP | Config | Download | +| :--: | :----------: | :------------: | :-----: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| × | Faster R-CNN | R-50-FPN | 1x | 36.4 | | - | | +| √ | Faster R-CNN | R-50-FPN | 1x | 38.4 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_r50_fpn_1x_coco/pisa_faster_rcnn_r50_fpn_1x_coco-dea93523.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_r50_fpn_1x_coco/pisa_faster_rcnn_r50_fpn_1x_coco_20200506_185619.log.json) | +| × | Faster R-CNN | X101-32x4d-FPN | 1x | 40.1 | | - | | +| √ | Faster R-CNN | X101-32x4d-FPN | 1x | 41.9 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco-e4accec4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco_20200505_181503.log.json) | +| × | Mask R-CNN | R-50-FPN | 1x | 37.3 | 34.2 | - | | +| √ | Mask R-CNN | R-50-FPN | 1x | 39.1 | 35.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_mask_rcnn_r50_fpn_1x_coco/pisa_mask_rcnn_r50_fpn_1x_coco-dfcedba6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_mask_rcnn_r50_fpn_1x_coco/pisa_mask_rcnn_r50_fpn_1x_coco_20200508_150500.log.json) | +| × | Mask R-CNN | X101-32x4d-FPN | 1x | 41.1 | 37.1 | - | | +| √ | Mask R-CNN | X101-32x4d-FPN | 1x | | | | | +| × | RetinaNet | R-50-FPN | 1x | 35.6 | | - | | +| √ | RetinaNet | R-50-FPN | 1x | 36.9 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_r50_fpn_1x_coco/pisa_retinanet_r50_fpn_1x_coco-76409952.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_r50_fpn_1x_coco/pisa_retinanet_r50_fpn_1x_coco_20200504_014311.log.json) | +| × | RetinaNet | X101-32x4d-FPN | 1x | 39.0 | | - | | +| √ | RetinaNet | X101-32x4d-FPN | 1x | 40.7 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco/pisa_retinanet_x101_32x4d_fpn_1x_coco-a0c13c73.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco/pisa_retinanet_x101_32x4d_fpn_1x_coco_20200505_001404.log.json) | +| × | SSD300 | VGG16 | 1x | 25.6 | | - | | +| √ | SSD300 | VGG16 | 1x | 27.6 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_ssd300_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd300_coco/pisa_ssd300_coco-710e3ac9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd300_coco/pisa_ssd300_coco_20200504_144325.log.json) | +| × | SSD512 | VGG16 | 1x | 29.3 | | - | | +| √ | SSD512 | VGG16 | 1x | 31.8 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_ssd512_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd512_coco/pisa_ssd512_coco-247addee.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd512_coco/pisa_ssd512_coco_20200508_131030.log.json) | + +**Notes:** + +- In the original paper, all models are trained and tested on mmdet v1.x, thus results may not be exactly the same with this release on v2.0. +- It is noted PISA only modifies the training pipeline so the inference time remains the same with the baseline. + +## Citation + +```latex +@inproceedings{cao2019prime, + title={Prime sample attention in object detection}, + author={Cao, Yuhang and Chen, Kai and Loy, Chen Change and Lin, Dahua}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2020} +} +``` diff --git a/downstream/mmdetection/configs/pisa/metafile.yml b/downstream/mmdetection/configs/pisa/metafile.yml new file mode 100644 index 0000000..cd43afb --- /dev/null +++ b/downstream/mmdetection/configs/pisa/metafile.yml @@ -0,0 +1,110 @@ +Collections: + - Name: PISA + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - PISA + - RPN + - ResNet + - RoIPool + Paper: + URL: https://arxiv.org/abs/1904.04821 + Title: 'Prime Sample Attention in Object Detection' + README: configs/pisa/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/roi_heads/pisa_roi_head.py#L8 + Version: v2.1.0 + +Models: + - Name: pisa_faster_rcnn_r50_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_r50_fpn_1x_coco/pisa_faster_rcnn_r50_fpn_1x_coco-dea93523.pth + + - Name: pisa_faster_rcnn_x101_32x4d_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco-e4accec4.pth + + - Name: pisa_mask_rcnn_r50_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_mask_rcnn_r50_fpn_1x_coco/pisa_mask_rcnn_r50_fpn_1x_coco-dfcedba6.pth + + - Name: pisa_retinanet_r50_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_r50_fpn_1x_coco/pisa_retinanet_r50_fpn_1x_coco-76409952.pth + + - Name: pisa_retinanet_x101_32x4d_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco/pisa_retinanet_x101_32x4d_fpn_1x_coco-a0c13c73.pth + + - Name: pisa_ssd300_coco + In Collection: PISA + Config: configs/pisa/pisa_ssd300_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 27.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd300_coco/pisa_ssd300_coco-710e3ac9.pth + + - Name: pisa_ssd512_coco + In Collection: PISA + Config: configs/pisa/pisa_ssd512_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 31.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd512_coco/pisa_ssd512_coco-247addee.pth diff --git a/downstream/mmdetection/configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..71e65b0 --- /dev/null +++ b/downstream/mmdetection/configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,30 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' + +model = dict( + roi_head=dict( + type='PISARoIHead', + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + sampler=dict( + type='ScoreHLRSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0.), + isr=dict(k=2, bias=0), + carl=dict(k=1, bias=0.2))), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/downstream/mmdetection/configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..16edd99 --- /dev/null +++ b/downstream/mmdetection/configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,30 @@ +_base_ = '../faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py' + +model = dict( + roi_head=dict( + type='PISARoIHead', + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + sampler=dict( + type='ScoreHLRSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0.), + isr=dict(k=2, bias=0), + carl=dict(k=1, bias=0.2))), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/downstream/mmdetection/configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..047a293 --- /dev/null +++ b/downstream/mmdetection/configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,30 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' + +model = dict( + roi_head=dict( + type='PISARoIHead', + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + sampler=dict( + type='ScoreHLRSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0.), + isr=dict(k=2, bias=0), + carl=dict(k=1, bias=0.2))), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/downstream/mmdetection/configs/pisa/pisa_mask_rcnn_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/pisa/pisa_mask_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..2186a8f --- /dev/null +++ b/downstream/mmdetection/configs/pisa/pisa_mask_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,30 @@ +_base_ = '../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py' + +model = dict( + roi_head=dict( + type='PISARoIHead', + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + sampler=dict( + type='ScoreHLRSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0.), + isr=dict(k=2, bias=0), + carl=dict(k=1, bias=0.2))), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/downstream/mmdetection/configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..70f89e2 --- /dev/null +++ b/downstream/mmdetection/configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' + +model = dict( + bbox_head=dict( + type='PISARetinaHead', + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), + train_cfg=dict(isr=dict(k=2., bias=0.), carl=dict(k=1., bias=0.2))) diff --git a/downstream/mmdetection/configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py b/downstream/mmdetection/configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..b97b672 --- /dev/null +++ b/downstream/mmdetection/configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = '../retinanet/retinanet_x101_32x4d_fpn_1x_coco.py' + +model = dict( + bbox_head=dict( + type='PISARetinaHead', + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), + train_cfg=dict(isr=dict(k=2., bias=0.), carl=dict(k=1., bias=0.2))) diff --git a/downstream/mmdetection/configs/pisa/pisa_ssd300_coco.py b/downstream/mmdetection/configs/pisa/pisa_ssd300_coco.py new file mode 100644 index 0000000..b5cc006 --- /dev/null +++ b/downstream/mmdetection/configs/pisa/pisa_ssd300_coco.py @@ -0,0 +1,8 @@ +_base_ = '../ssd/ssd300_coco.py' + +model = dict( + bbox_head=dict(type='PISASSDHead'), + train_cfg=dict(isr=dict(k=2., bias=0.), carl=dict(k=1., bias=0.2))) + +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/pisa/pisa_ssd512_coco.py b/downstream/mmdetection/configs/pisa/pisa_ssd512_coco.py new file mode 100644 index 0000000..3219d6d --- /dev/null +++ b/downstream/mmdetection/configs/pisa/pisa_ssd512_coco.py @@ -0,0 +1,8 @@ +_base_ = '../ssd/ssd512_coco.py' + +model = dict( + bbox_head=dict(type='PISASSDHead'), + train_cfg=dict(isr=dict(k=2., bias=0.), carl=dict(k=1., bias=0.2))) + +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/point_rend/README.md b/downstream/mmdetection/configs/point_rend/README.md new file mode 100644 index 0000000..183e83d --- /dev/null +++ b/downstream/mmdetection/configs/point_rend/README.md @@ -0,0 +1,33 @@ +# PointRend + +> [PointRend: Image Segmentation as Rendering](https://arxiv.org/abs/1912.08193) + + + +## Abstract + +We present a new method for efficient high-quality image segmentation of objects and scenes. By analogizing classical computer graphics methods for efficient rendering with over- and undersampling challenges faced in pixel labeling tasks, we develop a unique perspective of image segmentation as a rendering problem. From this vantage, we present the PointRend (Point-based Rendering) neural network module: a module that performs point-based segmentation predictions at adaptively selected locations based on an iterative subdivision algorithm. PointRend can be flexibly applied to both instance and semantic segmentation tasks by building on top of existing state-of-the-art models. While many concrete implementations of the general idea are possible, we show that a simple design already achieves excellent results. Qualitatively, PointRend outputs crisp object boundaries in regions that are over-smoothed by previous methods. Quantitatively, PointRend yields significant gains on COCO and Cityscapes, for both instance and semantic segmentation. PointRend's efficiency enables output resolutions that are otherwise impractical in terms of memory or computation compared to existing approaches. + +
    + +
    + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :---: | :-----: | :------: | :------------: | :----: | :-----: | :----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 4.6 | | 38.4 | 36.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco/point_rend_r50_caffe_fpn_mstrain_1x_coco-1bcb5fb4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco/point_rend_r50_caffe_fpn_mstrain_1x_coco_20200612_161407.log.json) | +| R-50-FPN | caffe | 3x | 4.6 | | 41.0 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco/point_rend_r50_caffe_fpn_mstrain_3x_coco-e0ebb6b7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco/point_rend_r50_caffe_fpn_mstrain_3x_coco_20200614_002632.log.json) | + +Note: All models are trained with multi-scale, the input image shorter side is randomly scaled to one of (640, 672, 704, 736, 768, 800). + +## Citation + +```latex +@InProceedings{kirillov2019pointrend, + title={{PointRend}: Image Segmentation as Rendering}, + author={Alexander Kirillov and Yuxin Wu and Kaiming He and Ross Girshick}, + journal={ArXiv:1912.08193}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/point_rend/metafile.yml b/downstream/mmdetection/configs/point_rend/metafile.yml new file mode 100644 index 0000000..82aea05 --- /dev/null +++ b/downstream/mmdetection/configs/point_rend/metafile.yml @@ -0,0 +1,54 @@ +Collections: + - Name: PointRend + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - PointRend + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1912.08193 + Title: 'PointRend: Image Segmentation as Rendering' + README: configs/point_rend/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.2.0/mmdet/models/detectors/point_rend.py#L6 + Version: v2.2.0 + +Models: + - Name: point_rend_r50_caffe_fpn_mstrain_1x_coco + In Collection: PointRend + Config: configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py + Metadata: + Training Memory (GB): 4.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco/point_rend_r50_caffe_fpn_mstrain_1x_coco-1bcb5fb4.pth + + - Name: point_rend_r50_caffe_fpn_mstrain_3x_coco + In Collection: PointRend + Config: configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.6 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco/point_rend_r50_caffe_fpn_mstrain_3x_coco-e0ebb6b7.pth diff --git a/downstream/mmdetection/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py b/downstream/mmdetection/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py new file mode 100644 index 0000000..0c0e563 --- /dev/null +++ b/downstream/mmdetection/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py @@ -0,0 +1,44 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' +# model settings +model = dict( + type='PointRend', + roi_head=dict( + type='PointRendRoIHead', + mask_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='concat', + roi_layer=dict( + _delete_=True, type='SimpleRoIAlign', output_size=14), + out_channels=256, + featmap_strides=[4]), + mask_head=dict( + _delete_=True, + type='CoarseMaskHead', + num_fcs=2, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), + point_head=dict( + type='MaskPointHead', + num_fcs=3, + in_channels=256, + fc_channels=256, + num_classes=80, + coarse_pred_each_layer=True, + loss_point=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + mask_size=7, + num_points=14 * 14, + oversample_ratio=3, + importance_sample_ratio=0.75)), + test_cfg=dict( + rcnn=dict( + subdivision_steps=5, + subdivision_num_points=28 * 28, + scale_factor=2))) diff --git a/downstream/mmdetection/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..169278e --- /dev/null +++ b/downstream/mmdetection/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = './point_rend_r50_caffe_fpn_mstrain_1x_coco.py' +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/downstream/mmdetection/configs/pvt/README.md b/downstream/mmdetection/configs/pvt/README.md new file mode 100644 index 0000000..1fd090b --- /dev/null +++ b/downstream/mmdetection/configs/pvt/README.md @@ -0,0 +1,57 @@ +# PVT + +> [Pyramid vision transformer: A versatile backbone for dense prediction without convolutions](https://arxiv.org/abs/2102.12122) + + + +## Abstract + +Although using convolutional neural networks (CNNs) as backbones achieves great successes in computer vision, this work investigates a simple backbone network useful for many dense prediction tasks without convolutions. Unlike the recently-proposed Transformer model (e.g., ViT) that is specially designed for image classification, we propose Pyramid Vision Transformer~(PVT), which overcomes the difficulties of porting Transformer to various dense prediction tasks. PVT has several merits compared to prior arts. (1) Different from ViT that typically has low-resolution outputs and high computational and memory cost, PVT can be not only trained on dense partitions of the image to achieve high output resolution, which is important for dense predictions but also using a progressive shrinking pyramid to reduce computations of large feature maps. (2) PVT inherits the advantages from both CNN and Transformer, making it a unified backbone in various vision tasks without convolutions by simply replacing CNN backbones. (3) We validate PVT by conducting extensive experiments, showing that it boosts the performance of many downstream tasks, e.g., object detection, semantic, and instance segmentation. For example, with a comparable number of parameters, RetinaNet+PVT achieves 40.4 AP on the COCO dataset, surpassing RetinNet+ResNet50 (36.3 AP) by 4.1 absolute AP. We hope PVT could serve as an alternative and useful backbone for pixel-level predictions and facilitate future researches. + +Transformer recently has shown encouraging progresses in computer vision. In this work, we present new baselines by improving the original Pyramid Vision Transformer (abbreviated as PVTv1) by adding three designs, including (1) overlapping patch embedding, (2) convolutional feed-forward networks, and (3) linear complexity attention layers. +With these modifications, our PVTv2 significantly improves PVTv1 on three tasks e.g., classification, detection, and segmentation. Moreover, PVTv2 achieves comparable or better performances than recent works such as Swin Transformer. We hope this work will facilitate state-of-the-art Transformer researches in computer vision. + +
    + +
    + +## Results and Models + +### RetinaNet (PVTv1) + +| Backbone | Lr schd | Mem (GB) | box AP | Config | Download | +| :--------: | :-----: | :------: | :----: | :--------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| PVT-Tiny | 12e | 8.5 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_t_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-t_fpn_1x_coco/retinanet_pvt-t_fpn_1x_coco_20210831_103110-17b566bd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-t_fpn_1x_coco/retinanet_pvt-t_fpn_1x_coco_20210831_103110.log.json) | +| PVT-Small | 12e | 14.5 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_s_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-s_fpn_1x_coco/retinanet_pvt-s_fpn_1x_coco_20210906_142921-b6c94a5b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-s_fpn_1x_coco/retinanet_pvt-s_fpn_1x_coco_20210906_142921.log.json) | +| PVT-Medium | 12e | 20.9 | 41.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_m_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-m_fpn_1x_coco/retinanet_pvt-m_fpn_1x_coco_20210831_103243-55effa1b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-m_fpn_1x_coco/retinanet_pvt-m_fpn_1x_coco_20210831_103243.log.json) | + +### RetinaNet (PVTv2) + +| Backbone | Lr schd | Mem (GB) | box AP | Config | Download | +| :------: | :-----: | :------: | :----: | :------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| PVTv2-B0 | 12e | 7.4 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b0_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b0_fpn_1x_coco/retinanet_pvtv2-b0_fpn_1x_coco_20210831_103157-13e9aabe.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b0_fpn_1x_coco/retinanet_pvtv2-b0_fpn_1x_coco_20210831_103157.log.json) | +| PVTv2-B1 | 12e | 9.5 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b1_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b1_fpn_1x_coco/retinanet_pvtv2-b1_fpn_1x_coco_20210831_103318-7e169a7d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b1_fpn_1x_coco/retinanet_pvtv2-b1_fpn_1x_coco_20210831_103318.log.json) | +| PVTv2-B2 | 12e | 16.2 | 44.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b2_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b2_fpn_1x_coco/retinanet_pvtv2-b2_fpn_1x_coco_20210901_174843-529f0b9a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b2_fpn_1x_coco/retinanet_pvtv2-b2_fpn_1x_coco_20210901_174843.log.json) | +| PVTv2-B3 | 12e | 23.0 | 46.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b3_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b3_fpn_1x_coco/retinanet_pvtv2-b3_fpn_1x_coco_20210903_151512-8357deff.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b3_fpn_1x_coco/retinanet_pvtv2-b3_fpn_1x_coco_20210903_151512.log.json) | +| PVTv2-B4 | 12e | 17.0 | 46.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b4_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b4_fpn_1x_coco/retinanet_pvtv2-b4_fpn_1x_coco_20210901_170151-83795c86.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b4_fpn_1x_coco/retinanet_pvtv2-b4_fpn_1x_coco_20210901_170151.log.json) | +| PVTv2-B5 | 12e | 18.7 | 46.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b5_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b5_fpn_1x_coco/retinanet_pvtv2-b5_fpn_1x_coco_20210902_201800-3420eb57.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b5_fpn_1x_coco/retinanet_pvtv2-b5_fpn_1x_coco_20210902_201800.log.json) | + +## Citation + +```latex +@article{wang2021pyramid, + title={Pyramid vision transformer: A versatile backbone for dense prediction without convolutions}, + author={Wang, Wenhai and Xie, Enze and Li, Xiang and Fan, Deng-Ping and Song, Kaitao and Liang, Ding and Lu, Tong and Luo, Ping and Shao, Ling}, + journal={arXiv preprint arXiv:2102.12122}, + year={2021} +} +``` + +```latex +@article{wang2021pvtv2, + title={PVTv2: Improved Baselines with Pyramid Vision Transformer}, + author={Wang, Wenhai and Xie, Enze and Li, Xiang and Fan, Deng-Ping and Song, Kaitao and Liang, Ding and Lu, Tong and Luo, Ping and Shao, Ling}, + journal={arXiv preprint arXiv:2106.13797}, + year={2021} +} +``` diff --git a/downstream/mmdetection/configs/pvt/metafile.yml b/downstream/mmdetection/configs/pvt/metafile.yml new file mode 100644 index 0000000..5884378 --- /dev/null +++ b/downstream/mmdetection/configs/pvt/metafile.yml @@ -0,0 +1,243 @@ +Models: + - Name: retinanet_pvt-t_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvt-t_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-t_fpn_1x_coco/retinanet_pvt-t_fpn_1x_coco_20210831_103110-17b566bd.pth + Paper: + URL: https://arxiv.org/abs/2102.12122 + Title: "Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L315 + Version: 2.17.0 + + - Name: retinanet_pvt-s_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvt-s_fpn_1x_coco.py + Metadata: + Training Memory (GB): 14.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-s_fpn_1x_coco/retinanet_pvt-s_fpn_1x_coco_20210906_142921-b6c94a5b.pth + Paper: + URL: https://arxiv.org/abs/2102.12122 + Title: "Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L315 + Version: 2.17.0 + + - Name: retinanet_pvt-m_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvt-m_fpn_1x_coco.py + Metadata: + Training Memory (GB): 20.9 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-m_fpn_1x_coco/retinanet_pvt-m_fpn_1x_coco_20210831_103243-55effa1b.pth + Paper: + URL: https://arxiv.org/abs/2102.12122 + Title: "Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L315 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b0_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b0_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.4 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b0_fpn_1x_coco/retinanet_pvtv2-b0_fpn_1x_coco_20210831_103157-13e9aabe.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b1_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b1_fpn_1x_coco.py + Metadata: + Training Memory (GB): 9.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b1_fpn_1x_coco/retinanet_pvtv2-b1_fpn_1x_coco_20210831_103318-7e169a7d.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b2_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b2_fpn_1x_coco.py + Metadata: + Training Memory (GB): 16.2 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b2_fpn_1x_coco/retinanet_pvtv2-b2_fpn_1x_coco_20210901_174843-529f0b9a.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b3_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b3_fpn_1x_coco.py + Metadata: + Training Memory (GB): 23.0 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b3_fpn_1x_coco/retinanet_pvtv2-b3_fpn_1x_coco_20210903_151512-8357deff.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b4_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b4_fpn_1x_coco.py + Metadata: + Training Memory (GB): 17.0 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b4_fpn_1x_coco/retinanet_pvtv2-b4_fpn_1x_coco_20210901_170151-83795c86.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b5_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b5_fpn_1x_coco.py + Metadata: + Training Memory (GB): 18.7 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b5_fpn_1x_coco/retinanet_pvtv2-b5_fpn_1x_coco_20210902_201800-3420eb57.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvt-l_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvt-l_fpn_1x_coco.py new file mode 100644 index 0000000..e299f2a --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvt-l_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'retinanet_pvt-t_fpn_1x_coco.py' +model = dict( + backbone=dict( + num_layers=[3, 8, 27, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_large.pth'))) +fp16 = dict(loss_scale=dict(init_scale=512)) diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvt-m_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvt-m_fpn_1x_coco.py new file mode 100644 index 0000000..b888f78 --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvt-m_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = 'retinanet_pvt-t_fpn_1x_coco.py' +model = dict( + backbone=dict( + num_layers=[3, 4, 18, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_medium.pth'))) diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvt-s_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvt-s_fpn_1x_coco.py new file mode 100644 index 0000000..4660348 --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvt-s_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = 'retinanet_pvt-t_fpn_1x_coco.py' +model = dict( + backbone=dict( + num_layers=[3, 4, 6, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_small.pth'))) diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvt-t_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvt-t_fpn_1x_coco.py new file mode 100644 index 0000000..a6cff7d --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvt-t_fpn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='RetinaNet', + backbone=dict( + _delete_=True, + type='PyramidVisionTransformer', + num_layers=[2, 2, 2, 2], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_tiny.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) +# optimizer +optimizer = dict(_delete_=True, type='AdamW', lr=0.0001, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b0_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b0_fpn_1x_coco.py new file mode 100644 index 0000000..cbe2295 --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b0_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='RetinaNet', + backbone=dict( + _delete_=True, + type='PyramidVisionTransformerV2', + embed_dims=32, + num_layers=[2, 2, 2, 2], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b0.pth')), + neck=dict(in_channels=[32, 64, 160, 256])) +# optimizer +optimizer = dict(_delete_=True, type='AdamW', lr=0.0001, weight_decay=0.0001) diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b1_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b1_fpn_1x_coco.py new file mode 100644 index 0000000..5374c50 --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b1_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b1.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b2_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b2_fpn_1x_coco.py new file mode 100644 index 0000000..cf9a18d --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b2_fpn_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + num_layers=[3, 4, 6, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b2.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b3_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b3_fpn_1x_coco.py new file mode 100644 index 0000000..7a47f82 --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b3_fpn_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + num_layers=[3, 4, 18, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b3.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b4_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b4_fpn_1x_coco.py new file mode 100644 index 0000000..9891d7b --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b4_fpn_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + num_layers=[3, 8, 27, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b4.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) +# optimizer +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0001 / 1.4, weight_decay=0.0001) +# dataset settings +data = dict(samples_per_gpu=1, workers_per_gpu=1) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (1 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b5_fpn_1x_coco.py b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b5_fpn_1x_coco.py new file mode 100644 index 0000000..a9fea2e --- /dev/null +++ b/downstream/mmdetection/configs/pvt/retinanet_pvtv2-b5_fpn_1x_coco.py @@ -0,0 +1,19 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + num_layers=[3, 6, 40, 3], + mlp_ratios=(4, 4, 4, 4), + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b5.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) +# optimizer +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0001 / 1.4, weight_decay=0.0001) +# dataset settings +data = dict(samples_per_gpu=1, workers_per_gpu=1) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (1 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/downstream/mmdetection/configs/queryinst/README.md b/downstream/mmdetection/configs/queryinst/README.md new file mode 100644 index 0000000..ad6e0b3 --- /dev/null +++ b/downstream/mmdetection/configs/queryinst/README.md @@ -0,0 +1,36 @@ +# QueryInst + +> [Instances as Queries](https://openaccess.thecvf.com/content/ICCV2021/html/Fang_Instances_As_Queries_ICCV_2021_paper.html) + + + +## Abstract + +We present QueryInst, a new perspective for instance segmentation. QueryInst is a multi-stage end-to-end system that treats instances of interest as learnable queries, enabling query based object detectors, e.g., Sparse R-CNN, to have strong instance segmentation performance. The attributes of instances such as categories, bounding boxes, instance masks, and instance association embeddings are represented by queries in a unified manner. In QueryInst, a query is shared by both detection and segmentation via dynamic convolutions and driven by parallelly-supervised multi-stage learning. We conduct extensive experiments on three challenging benchmarks, i.e., COCO, CityScapes, and YouTube-VIS to evaluate the effectiveness of QueryInst in object detection, instance segmentation, and video instance segmentation tasks. For the first time, we demonstrate that a simple end-to-end query based framework can achieve the state-of-the-art performance in various instance-level recognition tasks. + +
    + +
    + +## Results and Models + +| Model | Backbone | Style | Lr schd | Number of Proposals | Multi-Scale | RandomCrop | box AP | mask AP | Config | Download | +| :-------: | :-------: | :-----: | :-----: | :-----------------: | :---------: | :--------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| QueryInst | R-50-FPN | pytorch | 1x | 100 | False | False | 42.0 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_1x_coco/queryinst_r50_fpn_1x_coco_20210907_084916-5a8f1998.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_1x_coco/queryinst_r50_fpn_1x_coco_20210907_084916.log.json) | +| QueryInst | R-50-FPN | pytorch | 3x | 100 | True | False | 44.8 | 39.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco/queryinst_r50_fpn_mstrain_480-800_3x_coco_20210901_103643-7837af86.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco/queryinst_r50_fpn_mstrain_480-800_3x_coco_20210901_103643.log.json) | +| QueryInst | R-50-FPN | pytorch | 3x | 300 | True | True | 47.5 | 41.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_101802-85cffbd8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_101802.log.json) | +| QueryInst | R-101-FPN | pytorch | 3x | 100 | True | False | 46.4 | 41.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco/queryinst_r101_fpn_mstrain_480-800_3x_coco_20210904_104048-91f9995b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco/queryinst_r101_fpn_mstrain_480-800_3x_coco_20210904_104048.log.json) | +| QueryInst | R-101-FPN | pytorch | 3x | 300 | True | True | 49.0 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_153621-76cce59f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_153621.log.json) | + +## Citation + +```latex +@InProceedings{Fang_2021_ICCV, + author = {Fang, Yuxin and Yang, Shusheng and Wang, Xinggang and Li, Yu and Fang, Chen and Shan, Ying and Feng, Bin and Liu, Wenyu}, + title = {Instances As Queries}, + booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, + month = {October}, + year = {2021}, + pages = {6910-6919} +} +``` diff --git a/downstream/mmdetection/configs/queryinst/metafile.yml b/downstream/mmdetection/configs/queryinst/metafile.yml new file mode 100644 index 0000000..da7f0a7 --- /dev/null +++ b/downstream/mmdetection/configs/queryinst/metafile.yml @@ -0,0 +1,100 @@ +Collections: + - Name: QueryInst + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + - QueryInst + Paper: + URL: https://openaccess.thecvf.com/content/ICCV2021/papers/Fang_Instances_As_Queries_ICCV_2021_paper.pdf + Title: 'Instances as Queries' + README: configs/queryinst/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/detectors/queryinst.py + Version: v2.18.0 + +Models: + - Name: queryinst_r50_fpn_1x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_1x_coco/queryinst_r50_fpn_1x_coco_20210907_084916-5a8f1998.pth + + - Name: queryinst_r50_fpn_mstrain_480-800_3x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco/queryinst_r50_fpn_mstrain_480-800_3x_coco_20210901_103643-7837af86.pth + + - Name: queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_101802-85cffbd8.pth + + - Name: queryinst_r101_fpn_mstrain_480-800_3x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco/queryinst_r101_fpn_mstrain_480-800_3x_coco_20210904_104048-91f9995b.pth + + - Name: queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 49.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_153621-76cce59f.pth diff --git a/downstream/mmdetection/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py b/downstream/mmdetection/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..fd138f5 --- /dev/null +++ b/downstream/mmdetection/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = './queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py b/downstream/mmdetection/configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..07cae19 --- /dev/null +++ b/downstream/mmdetection/configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = './queryinst_r50_fpn_mstrain_480-800_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_1x_coco.py b/downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_1x_coco.py new file mode 100644 index 0000000..48f5773 --- /dev/null +++ b/downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_1x_coco.py @@ -0,0 +1,138 @@ +_base_ = [ + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +num_stages = 6 +num_proposals = 100 +model = dict( + type='QueryInst', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=0, + add_extra_convs='on_input', + num_outs=4), + rpn_head=dict( + type='EmbeddingRPNHead', + num_proposals=num_proposals, + proposal_feature_channel=256), + roi_head=dict( + type='SparseRoIHead', + num_stages=num_stages, + stage_loss_weights=[1] * num_stages, + proposal_feature_channel=256, + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='DIIHead', + num_classes=80, + num_ffn_fcs=2, + num_heads=8, + num_cls_fcs=1, + num_reg_fcs=3, + feedforward_channels=2048, + in_channels=256, + dropout=0.0, + ffn_act_cfg=dict(type='ReLU', inplace=True), + dynamic_conv_cfg=dict( + type='DynamicConv', + in_channels=256, + feat_channels=64, + out_channels=256, + input_feat_shape=7, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN')), + loss_bbox=dict(type='L1Loss', loss_weight=5.0), + loss_iou=dict(type='GIoULoss', loss_weight=2.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=2.0), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + clip_border=False, + target_means=[0., 0., 0., 0.], + target_stds=[0.5, 0.5, 1., 1.])) for _ in range(num_stages) + ], + mask_head=[ + dict( + type='DynamicMaskHead', + dynamic_conv_cfg=dict( + type='DynamicConv', + in_channels=256, + feat_channels=64, + out_channels=256, + input_feat_shape=14, + with_proj=False, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN')), + num_convs=4, + num_classes=80, + roi_feat_size=14, + in_channels=256, + conv_kernel_size=3, + conv_out_channels=256, + class_agnostic=False, + norm_cfg=dict(type='BN'), + upsample_cfg=dict(type='deconv', scale_factor=2), + loss_mask=dict( + type='DiceLoss', + loss_weight=8.0, + use_sigmoid=True, + activate=False, + eps=1e-5)) for _ in range(num_stages) + ]), + # training and testing settings + train_cfg=dict( + rpn=None, + rcnn=[ + dict( + assigner=dict( + type='HungarianAssigner', + cls_cost=dict(type='FocalLossCost', weight=2.0), + reg_cost=dict(type='BBoxL1Cost', weight=5.0), + iou_cost=dict(type='IoUCost', iou_mode='giou', + weight=2.0)), + sampler=dict(type='PseudoSampler'), + pos_weight=1, + mask_size=28, + ) for _ in range(num_stages) + ]), + test_cfg=dict( + rpn=None, rcnn=dict(max_per_img=num_proposals, mask_thr_binary=0.5))) + +# optimizer +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0001, + weight_decay=0.0001, + paramwise_cfg=dict( + custom_keys={'backbone': dict(lr_mult=0.1, decay_mult=1.0)})) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=0.1, norm_type=2)) +# learning policy +lr_config = dict(policy='step', step=[8, 11], warmup_iters=1000) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py b/downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..3089b3c --- /dev/null +++ b/downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py @@ -0,0 +1,54 @@ +_base_ = './queryinst_r50_fpn_mstrain_480-800_3x_coco.py' +num_proposals = 300 +model = dict( + rpn_head=dict(num_proposals=num_proposals), + test_cfg=dict( + _delete_=True, + rpn=None, + rcnn=dict(max_per_img=num_proposals, mask_thr_binary=0.5))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# augmentation strategy originates from DETR. +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py b/downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..89e2cd1 --- /dev/null +++ b/downstream/mmdetection/configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py @@ -0,0 +1,23 @@ +_base_ = './queryinst_r50_fpn_1x_coco.py' + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +min_values = (480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, value) for value in min_values], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) +] + +data = dict(train=dict(pipeline=train_pipeline)) +lr_config = dict(policy='step', step=[27, 33]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/downstream/mmdetection/configs/regnet/README.md b/downstream/mmdetection/configs/regnet/README.md new file mode 100644 index 0000000..711ed63 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/README.md @@ -0,0 +1,122 @@ +# RegNet + +> [Designing Network Design Spaces](https://arxiv.org/abs/2003.13678) + + + +## Abstract + +In this work, we present a new network design paradigm. Our goal is to help advance the understanding of network design and discover design principles that generalize across settings. Instead of focusing on designing individual network instances, we design network design spaces that parametrize populations of networks. The overall process is analogous to classic manual design of networks, but elevated to the design space level. Using our methodology we explore the structure aspect of network design and arrive at a low-dimensional design space consisting of simple, regular networks that we call RegNet. The core insight of the RegNet parametrization is surprisingly simple: widths and depths of good networks can be explained by a quantized linear function. We analyze the RegNet design space and arrive at interesting findings that do not match the current practice of network design. The RegNet design space provides simple and fast networks that work well across a wide range of flop regimes. Under comparable training settings and flops, the RegNet models outperform the popular EfficientNet models while being up to 5x faster on GPUs. + +
    + +
    + +## Introduction + +We implement RegNetX and RegNetY models in detection systems and provide their first results on Mask R-CNN, Faster R-CNN and RetinaNet. + +The pre-trained models are converted from [model zoo of pycls](https://github.com/facebookresearch/pycls/blob/master/MODEL_ZOO.md). + +## Usage + +To use a regnet model, there are two steps to do: + +1. Convert the model to ResNet-style supported by MMDetection +2. Modify backbone and neck in config accordingly + +### Convert model + +We already prepare models of FLOPs from 400M to 12G in our model zoo. + +For more general usage, we also provide script `regnet2mmdet.py` in the tools directory to convert the key of models pretrained by [pycls](https://github.com/facebookresearch/pycls/) to +ResNet-style checkpoints used in MMDetection. + +```bash +python -u tools/model_converters/regnet2mmdet.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +### Modify config + +The users can modify the config's `depth` of backbone and corresponding keys in `arch` according to the configs in the [pycls model zoo](https://github.com/facebookresearch/pycls/blob/master/MODEL_ZOO.md). +The parameter `in_channels` in FPN can be found in the Figure 15 & 16 of the paper (`wi` in the legend). +This directory already provides some configs with their performance, using RegNetX from 800MF to 12GF level. +For other pre-trained models or self-implemented regnet models, the users are responsible to check these parameters by themselves. + +**Note**: Although Fig. 15 & 16 also provide `w0`, `wa`, `wm`, `group_w`, and `bot_mul` for `arch`, they are quantized thus inaccurate, using them sometimes produces different backbone that does not match the key in the pre-trained model. + +## Results and Models + +### Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------------------------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-FPN](../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py) | pytorch | 1x | 4.4 | 12.0 | 38.2 | 34.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205_050542.log.json) | +| [RegNetX-3.2GF-FPN](./mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py) | pytorch | 1x | 5.0 | | 40.3 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141-2a9d1814.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141.log.json) | +| [RegNetX-4.0GF-FPN](./mask_rcnn_regnetx-4GF_fpn_1x_coco.py) | pytorch | 1x | 5.5 | | 41.5 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco/mask_rcnn_regnetx-4GF_fpn_1x_coco_20200517_180217-32e9c92d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco/mask_rcnn_regnetx-4GF_fpn_1x_coco_20200517_180217.log.json) | +| [R-101-FPN](../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py) | pytorch | 1x | 6.4 | 10.3 | 40.0 | 36.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204_144809.log.json) | +| [RegNetX-6.4GF-FPN](./mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py) | pytorch | 1x | 6.1 | | 41.0 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco/mask_rcnn_regnetx-6.4GF_fpn_1x_coco_20200517_180439-3a7aae83.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco/mask_rcnn_regnetx-6.4GF_fpn_1x_coco_20200517_180439.log.json) | +| [X-101-32x4d-FPN](../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py) | pytorch | 1x | 7.6 | 9.4 | 41.9 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205-478d0b67.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205_034906.log.json) | +| [RegNetX-8.0GF-FPN](./mask_rcnn_regnetx-8GF_fpn_1x_coco.py) | pytorch | 1x | 6.4 | | 41.7 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco/mask_rcnn_regnetx-8GF_fpn_1x_coco_20200517_180515-09daa87e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco/mask_rcnn_regnetx-8GF_fpn_1x_coco_20200517_180515.log.json) | +| [RegNetX-12GF-FPN](./mask_rcnn_regnetx-12GF_fpn_1x_coco.py) | pytorch | 1x | 7.4 | | 42.2 | 38 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco/mask_rcnn_regnetx-12GF_fpn_1x_coco_20200517_180552-b538bd8b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco/mask_rcnn_regnetx-12GF_fpn_1x_coco_20200517_180552.log.json) | +| [RegNetX-3.2GF-FPN-DCN-C3-C5](./mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py) | pytorch | 1x | 5.0 | | 40.3 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco_20200520_172726-75f40794.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco_20200520_172726.log.json) | + +### Faster R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-FPN](../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | pytorch | 1x | 4.0 | 18.2 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| [RegNetX-3.2GF-FPN](./faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py) | pytorch | 1x | 4.5 | | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco/faster_rcnn_regnetx-3.2GF_fpn_1x_coco_20200517_175927-126fd9bf.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco/faster_rcnn_regnetx-3.2GF_fpn_1x_coco_20200517_175927.log.json) | +| [RegNetX-3.2GF-FPN](./faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py) | pytorch | 2x | 4.5 | | 41.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco/faster_rcnn_regnetx-3.2GF_fpn_2x_coco_20200520_223955-e2081918.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco/faster_rcnn_regnetx-3.2GF_fpn_2x_coco_20200520_223955.log.json) | + +### RetinaNet + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-----------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-FPN](../retinanet/retinanet_r50_fpn_1x_coco.py) | pytorch | 1x | 3.8 | 16.6 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130_002941.log.json) | +| [RegNetX-800MF-FPN](./retinanet_regnetx-800MF_fpn_1x_coco.py) | pytorch | 1x | 2.5 | | 35.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-800MF_fpn_1x_coco/retinanet_regnetx-800MF_fpn_1x_coco_20200517_191403-f6f91d10.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-800MF_fpn_1x_coco/retinanet_regnetx-800MF_fpn_1x_coco_20200517_191403.log.json) | +| [RegNetX-1.6GF-FPN](./retinanet_regnetx-1.6GF_fpn_1x_coco.py) | pytorch | 1x | 3.3 | | 37.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco/retinanet_regnetx-1.6GF_fpn_1x_coco_20200517_191403-37009a9d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco/retinanet_regnetx-1.6GF_fpn_1x_coco_20200517_191403.log.json) | +| [RegNetX-3.2GF-FPN](./retinanet_regnetx-3.2GF_fpn_1x_coco.py) | pytorch | 1x | 4.2 | | 39.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco/retinanet_regnetx-3.2GF_fpn_1x_coco_20200520_163141-cb1509e8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco/retinanet_regnetx-3.2GF_fpn_1x_coco_20200520_163141.log.json) | + +### Pre-trained models + +We also train some models with longer schedules and multi-scale training. The users could finetune them for downstream tasks. + +| Method | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :---------------: | :---------------------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster RCNN | [RegNetX-400MF-FPN](./faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 2.3 | | 37.1 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210526_095112-e1967c37.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210526_095112.log.json) | +| Faster RCNN | [RegNetX-800MF-FPN](./faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 2.8 | | 38.8 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210526_095118-a2c70b20.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210526_095118.log.json) | +| Faster RCNN | [RegNetX-1.6GF-FPN](./faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 3.4 | | 40.5 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-1_20210526_095325-94aa46cc.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-1_20210526_095325.log.json) | +| Faster RCNN | [RegNetX-3.2GF-FPN](./faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 4.4 | | 42.3 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-3_20210526_095152-e16a5227.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-3_20210526_095152.log.json) | +| Faster RCNN | [RegNetX-4GF-FPN](./faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 4.9 | | 42.8 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210526_095201-65eaf841.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210526_095201.log.json) | +| Mask RCNN | [RegNetX-3.2GF-FPN](./mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 5.0 | | 43.1 | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco_20200521_202221-99879813.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco_20200521_202221.log.json) | +| Mask RCNN | [RegNetX-400MF-FPN](./mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 2.5 | | 37.6 | 34.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco_20210601_235443-8aac57a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco_20210601_235443.log.json) | +| Mask RCNN | [RegNetX-800MF-FPN](./mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 2.9 | | 39.5 | 36.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco_20210602_210641-715d51f5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco_20210602_210641.log.json) | +| Mask RCNN | [RegNetX-1.6GF-FPN](./mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 3.6 | | 40.9 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-1_20210602_210641-6764cff5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-1_20210602_210641.log.json) | +| Mask RCNN | [RegNetX-3.2GF-FPN](./mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 5.0 | | 43.1 | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco_20200521_202221-99879813.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco_20200521_202221.log.json) | +| Mask RCNN | [RegNetX-4GF-FPN](./mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 5.1 | | 43.4 | 39.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco_20210602_032621-00f0331c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco_20210602_032621.log.json) | +| Cascade Mask RCNN | [RegNetX-400MF-FPN](./cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 4.3 | | 41.6 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210715_211619-5142f449.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210715_211619.log.json) | +| Cascade Mask RCNN | [RegNetX-800MF-FPN](./cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 4.8 | | 42.8 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210715_211616-dcbd13f4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210715_211616.log.json) | +| Cascade Mask RCNN | [RegNetX-1.6GF-FPN](./cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 5.4 | | 44.5 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-1_20210715_211616-75f29a61.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-1_20210715_211616.log.json) | +| Cascade Mask RCNN | [RegNetX-3.2GF-FPN](./cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 6.4 | | 45.8 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-3_20210715_211616-b9c2c58b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-3_20210715_211616.log.json) | +| Cascade Mask RCNN | [RegNetX-4GF-FPN](./cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 6.9 | | 45.8 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210715_212034-cbb1be4c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210715_212034.log.json) | + +### Notice + +1. The models are trained using a different weight decay, i.e., `weight_decay=5e-5` according to the setting in ImageNet training. This brings improvement of at least 0.7 AP absolute but does not improve the model using ResNet-50. +2. RetinaNets using RegNets are trained with learning rate 0.02 with gradient clip. We find that using learning rate 0.02 could improve the results by at least 0.7 AP absolute and gradient clip is necessary to stabilize the training. However, this does not improve the performance of ResNet-50-FPN RetinaNet. + +## Citation + +```latex +@article{radosavovic2020designing, + title={Designing Network Design Spaces}, + author={Ilija Radosavovic and Raj Prateek Kosaraju and Ross Girshick and Kaiming He and Piotr Dollár}, + year={2020}, + eprint={2003.13678}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..358d85a --- /dev/null +++ b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_1.6gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf')), + neck=dict( + type='FPN', + in_channels=[72, 168, 408, 912], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..8464571 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,63 @@ +_base_ = [ + '../common/mstrain_3x_coco_instance.py', + '../_base_/models/cascade_mask_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + # Images are converted to float32 directly after loading in PyCls + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +optimizer = dict(weight_decay=0.00005) diff --git a/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..2a8990a --- /dev/null +++ b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_400mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_400mf')), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 384], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..3157863 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_4.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_4.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 560, 1360], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..41376ad --- /dev/null +++ b/downstream/mmdetection/configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_800mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_800mf')), + neck=dict( + type='FPN', + in_channels=[64, 128, 288, 672], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..385b5ca --- /dev/null +++ b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_1.6gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf')), + neck=dict( + type='FPN', + in_channels=[72, 168, 408, 912], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py new file mode 100644 index 0000000..88d270e --- /dev/null +++ b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py @@ -0,0 +1,57 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) diff --git a/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py new file mode 100644 index 0000000..612490b --- /dev/null +++ b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py @@ -0,0 +1,3 @@ +_base_ = './faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..b7e6e1a --- /dev/null +++ b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,61 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +optimizer = dict(weight_decay=0.00005) diff --git a/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..0a05f6e --- /dev/null +++ b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_400mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_400mf')), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 384], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..98b3fc2 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_4.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_4.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 560, 1360], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..67f448b --- /dev/null +++ b/downstream/mmdetection/configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_800mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_800mf')), + neck=dict( + type='FPN', + in_channels=[64, 128, 288, 672], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..7970c3c --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_1.6gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf')), + neck=dict( + type='FPN', + in_channels=[72, 168, 408, 912], + out_channels=256, + num_outs=5)) + +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py new file mode 100644 index 0000000..ce3661c --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_12gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_12gf')), + neck=dict( + type='FPN', + in_channels=[224, 448, 896, 2240], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py new file mode 100644 index 0000000..44bf0d1 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py @@ -0,0 +1,58 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + # Images are converted to float32 directly after loading in PyCls + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..5b53428 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf'))) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..aca64d3 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,66 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..c38dfa6 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_400mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_400mf')), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 384], + out_channels=256, + num_outs=5)) + +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py new file mode 100644 index 0000000..874d485 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_4.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_4.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 560, 1360], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..f0b65ea --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_4.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_4.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 560, 1360], + out_channels=256, + num_outs=5)) + +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py new file mode 100644 index 0000000..99387d8 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_6.4gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_6.4gf')), + neck=dict( + type='FPN', + in_channels=[168, 392, 784, 1624], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..335ebab --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_800mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_800mf')), + neck=dict( + type='FPN', + in_channels=[64, 128, 288, 672], + out_channels=256, + num_outs=5)) + +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py new file mode 100644 index 0000000..1e7832f --- /dev/null +++ b/downstream/mmdetection/configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_8.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_8.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 720, 1920], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/metafile.yml b/downstream/mmdetection/configs/regnet/metafile.yml new file mode 100644 index 0000000..ecd3953 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/metafile.yml @@ -0,0 +1,797 @@ +Models: + - Name: mask_rcnn_regnetx-3.2GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141-2a9d1814.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-4GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco/mask_rcnn_regnetx-4GF_fpn_1x_coco_20200517_180217-32e9c92d.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-6.4GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.1 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco/mask_rcnn_regnetx-6.4GF_fpn_1x_coco_20200517_180439-3a7aae83.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-8GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco/mask_rcnn_regnetx-8GF_fpn_1x_coco_20200517_180515-09daa87e.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-12GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.4 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco/mask_rcnn_regnetx-12GF_fpn_1x_coco_20200517_180552-b538bd8b.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco_20200520_172726-75f40794.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-3.2GF_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco/faster_rcnn_regnetx-3.2GF_fpn_1x_coco_20200517_175927-126fd9bf.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-3.2GF_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py + Metadata: + Training Memory (GB): 4.5 + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco/faster_rcnn_regnetx-3.2GF_fpn_2x_coco_20200520_223955-e2081918.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: retinanet_regnetx-800MF_fpn_1x_coco + In Collection: RetinaNet + Config: configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 2.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 35.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-800MF_fpn_1x_coco/retinanet_regnetx-800MF_fpn_1x_coco_20200517_191403-f6f91d10.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: retinanet_regnetx-1.6GF_fpn_1x_coco + In Collection: RetinaNet + Config: configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.3 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco/retinanet_regnetx-1.6GF_fpn_1x_coco_20200517_191403-37009a9d.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: retinanet_regnetx-3.2GF_fpn_1x_coco + In Collection: RetinaNet + Config: configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco/retinanet_regnetx-3.2GF_fpn_1x_coco_20200520_163141-cb1509e8.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 2.3 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210526_095112-e1967c37.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 2.8 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210526_095118-a2c70b20.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 3.4 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-1_20210526_095325-94aa46cc.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.4 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-3_20210526_095152-e16a5227.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.9 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210526_095201-65eaf841.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco_20200521_202221-99879813.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 2.5 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco_20210601_235443-8aac57a4.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 2.9 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco_20210602_210641-715d51f5.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 3.6 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-1_20210602_210641-6764cff5.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-1_20210602_210641-6e63e19c.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.1 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco_20210602_032621-00f0331c.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210715_211619-5142f449.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.8 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210715_211616-dcbd13f4.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.4 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-1_20210715_211616-75f29a61.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 6.4 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-3_20210715_211616-b9c2c58b.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 6.9 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210715_212034-cbb1be4c.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 diff --git a/downstream/mmdetection/configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py b/downstream/mmdetection/configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py new file mode 100644 index 0000000..7395c1b --- /dev/null +++ b/downstream/mmdetection/configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './retinanet_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_1.6gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf')), + neck=dict( + type='FPN', + in_channels=[72, 168, 408, 912], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py b/downstream/mmdetection/configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py new file mode 100644 index 0000000..f05307c --- /dev/null +++ b/downstream/mmdetection/configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py @@ -0,0 +1,59 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/downstream/mmdetection/configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py b/downstream/mmdetection/configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py new file mode 100644 index 0000000..f6f8989 --- /dev/null +++ b/downstream/mmdetection/configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './retinanet_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_800mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_800mf')), + neck=dict( + type='FPN', + in_channels=[64, 128, 288, 672], + out_channels=256, + num_outs=5)) diff --git a/downstream/mmdetection/configs/reppoints/README.md b/downstream/mmdetection/configs/reppoints/README.md new file mode 100644 index 0000000..acf8e47 --- /dev/null +++ b/downstream/mmdetection/configs/reppoints/README.md @@ -0,0 +1,59 @@ +# RepPoints + +> [RepPoints: Point Set Representation for Object Detection](https://arxiv.org/abs/1904.11490) + + + +## Abstract + +Modern object detectors rely heavily on rectangular bounding boxes, such as anchors, proposals and the final predictions, to represent objects at various recognition stages. The bounding box is convenient to use but provides only a coarse localization of objects and leads to a correspondingly coarse extraction of object features. In this paper, we present RepPoints(representative points), a new finer representation of objects as a set of sample points useful for both localization and recognition. Given ground truth localization and recognition targets for training, RepPoints learn to automatically arrange themselves in a manner that bounds the spatial extent of an object and indicates semantically significant local areas. They furthermore do not require the use of anchors to sample a space of bounding boxes. We show that an anchor-free object detector based on RepPoints can be as effective as the state-of-the-art anchor-based detection methods, with 46.5 AP and 67.4 AP50 on the COCO test-dev detection benchmark, using ResNet-101 model. + +
    + +
    + +## Introdution + +By [Ze Yang](https://yangze.tech/), [Shaohui Liu](http://b1ueber2y.me/), and [Han Hu](https://ancientmooner.github.io/). + +We provide code support and configuration files to reproduce the results in the paper for +["RepPoints: Point Set Representation for Object Detection"](https://arxiv.org/abs/1904.11490) on COCO object detection. + +**RepPoints**, initially described in [arXiv](https://arxiv.org/abs/1904.11490), is a new representation method for visual objects, on which visual understanding tasks are typically centered. Visual object representation, aiming at both geometric description and appearance feature extraction, is conventionally achieved by `bounding box + RoIPool (RoIAlign)`. The bounding box representation is convenient to use; however, it provides only a rectangular localization of objects that lacks geometric precision and may consequently degrade feature quality. Our new representation, RepPoints, models objects by a `point set` instead of a `bounding box`, which learns to adaptively position themselves over an object in a manner that circumscribes the object’s `spatial extent` and enables `semantically aligned feature extraction`. This richer and more flexible representation maintains the convenience of bounding boxes while facilitating various visual understanding applications. This repo demonstrated the effectiveness of RepPoints for COCO object detection. + +Another feature of this repo is the demonstration of an `anchor-free detector`, which can be as effective as state-of-the-art anchor-based detection methods. The anchor-free detector can utilize either `bounding box` or `RepPoints` as the basic object representation. + +## Results and Models + +The results on COCO 2017val are shown in the table below. + +| Method | Backbone | GN | Anchor | convert func | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------: | :-----------: | :-: | :----: | :----------: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| BBox | R-50-FPN | Y | single | - | 1x | 3.9 | 15.9 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco_20200329-c98bfa96.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco_20200329_145916.log.json) | +| BBox | R-50-FPN | Y | none | - | 1x | 3.9 | 15.4 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+Bhead_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_center_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_center_fpn_gn-neck%2Bhead_1x_coco_20200330-00f73d58.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_center_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_center_fpn_gn-neck%2Bhead_1x_coco_20200330_233609.log.json) | +| RepPoints | R-50-FPN | N | none | moment | 1x | 3.3 | 18.5 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_1x_coco/reppoints_moment_r50_fpn_1x_coco_20200330-b73db8d1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_1x_coco/reppoints_moment_r50_fpn_1x_coco_20200330_233609.log.json) | +| RepPoints | R-50-FPN | Y | none | moment | 1x | 3.9 | 17.5 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco_20200329-4b38409a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco_20200329_145952.log.json) | +| RepPoints | R-50-FPN | Y | none | moment | 2x | 3.9 | - | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco_20200329-91babaa2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco_20200329_150020.log.json) | +| RepPoints | R-101-FPN | Y | none | moment | 2x | 5.8 | 13.7 | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r101_fpn_gn-neck+head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco_20200329-4fbc7310.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco_20200329_132205.log.json) | +| RepPoints | R-101-FPN-DCN | Y | none | moment | 2x | 5.9 | 12.1 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329-3309fbf2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329_132134.log.json) | +| RepPoints | X-101-FPN-DCN | Y | none | moment | 2x | 7.1 | 9.3 | 44.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329-f87da1ea.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329_132201.log.json) | + +**Notes:** + +- `R-xx`, `X-xx` denote the ResNet and ResNeXt architectures, respectively. +- `DCN` denotes replacing 3x3 conv with the 3x3 deformable convolution in `c3-c5` stages of backbone. +- `none` in the `anchor` column means 2-d `center point` (x,y) is used to represent the initial object hypothesis. `single` denotes one 4-d anchor box (x,y,w,h) with IoU based label assign criterion is adopted. +- `moment`, `partial MinMax`, `MinMax` in the `convert func` column are three functions to convert a point set to a pseudo box. +- Note the results here are slightly different from those reported in the paper, due to framework change. While the original paper uses an [MXNet](https://mxnet.apache.org/) implementation, we re-implement the method in [PyTorch](https://pytorch.org/) based on mmdetection. + +## Citation + +```latex +@inproceedings{yang2019reppoints, + title={RepPoints: Point Set Representation for Object Detection}, + author={Yang, Ze and Liu, Shaohui and Hu, Han and Wang, Liwei and Lin, Stephen}, + booktitle={The IEEE International Conference on Computer Vision (ICCV)}, + month={Oct}, + year={2019} +} +``` diff --git a/downstream/mmdetection/configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+head_1x_coco.py b/downstream/mmdetection/configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+head_1x_coco.py new file mode 100644 index 0000000..b24c8db --- /dev/null +++ b/downstream/mmdetection/configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+head_1x_coco.py @@ -0,0 +1,2 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py' +model = dict(bbox_head=dict(transform_method='minmax', use_grid_points=True)) diff --git a/downstream/mmdetection/configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py b/downstream/mmdetection/configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py new file mode 100644 index 0000000..8d5013d --- /dev/null +++ b/downstream/mmdetection/configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py' +model = dict( + bbox_head=dict(transform_method='minmax', use_grid_points=True), + # training and testing settings + train_cfg=dict( + init=dict( + assigner=dict( + _delete_=True, + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1)))) diff --git a/downstream/mmdetection/configs/reppoints/metafile.yml b/downstream/mmdetection/configs/reppoints/metafile.yml new file mode 100644 index 0000000..cd4312c --- /dev/null +++ b/downstream/mmdetection/configs/reppoints/metafile.yml @@ -0,0 +1,181 @@ +Collections: + - Name: RepPoints + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Group Normalization + - FPN + - RepPoints + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.11490 + Title: 'RepPoints: Point Set Representation for Object Detection' + README: configs/reppoints/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/reppoints_detector.py#L9 + Version: v2.0.0 + +Models: + - Name: bbox_r50_grid_fpn_gn-neck+head_1x_coco + In Collection: RepPoints + Config: configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py + Metadata: + Training Memory (GB): 3.9 + inference time (ms/im): + - value: 62.89 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco_20200329-c98bfa96.pth + + - Name: bbox_r50_grid_center_fpn_gn-neck+Bhead_1x_coco + In Collection: RepPoints + Config: configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+Bhead_1x_coco.py + Metadata: + Training Memory (GB): 3.9 + inference time (ms/im): + - value: 64.94 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_center_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_center_fpn_gn-neck%2Bhead_1x_coco_20200330-00f73d58.pth + + - Name: reppoints_moment_r50_fpn_1x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.3 + inference time (ms/im): + - value: 54.05 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_1x_coco/reppoints_moment_r50_fpn_1x_coco_20200330-b73db8d1.pth + + - Name: reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco.py + Metadata: + Training Memory (GB): 3.9 + inference time (ms/im): + - value: 57.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco_20200329-4b38409a.pth + + - Name: reppoints_moment_r50_fpn_gn-neck+head_2x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py + Metadata: + Training Memory (GB): 3.9 + inference time (ms/im): + - value: 57.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco_20200329-91babaa2.pth + + - Name: reppoints_moment_r101_fpn_gn-neck+head_2x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r101_fpn_gn-neck+head_2x_coco.py + Metadata: + Training Memory (GB): 5.8 + inference time (ms/im): + - value: 72.99 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco_20200329-4fbc7310.pth + + - Name: reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py + Metadata: + Training Memory (GB): 5.9 + inference time (ms/im): + - value: 82.64 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329-3309fbf2.pth + + - Name: reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 107.53 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329-f87da1ea.pth diff --git a/downstream/mmdetection/configs/reppoints/reppoints.png b/downstream/mmdetection/configs/reppoints/reppoints.png new file mode 100644 index 0000000000000000000000000000000000000000..a9306d9ba6c659a670822213bf198099f9e125b1 GIT binary patch literal 1198109 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 z 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�nWL` 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�`0H_ga*!w>X;GW<6SbmUi^%T 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Π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

    nL~cI`e#- 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