Swin 环境配置

研究背景

检测任务

项目代码

Swin-Transformer-Object-Detection code
学习参考(Swin-Transformer源码(已跑通)

环境配置

可在已有mmDetection link 环境基础上进行配置

name: py37pt15
channels:
  - pytorch
  - psi4
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - defaults
dependencies:
  - _libgcc_mutex=0.1=main
  - blas=1.0=mkl
  - ca-certificates=2021.4.13=h06a4308_1
  - certifi=2020.12.5=py37h06a4308_0
  - cloog=0.18.0=0
  - cudatoolkit=10.1.243=h6bb024c_0
  - cudnn=7.6.5=cuda10.1_0
  - cython=0.29.23=py37h2531618_0
  - freetype=2.10.4=h5ab3b9f_0
  - gcc-5=5.2.0=1
  - gmp=6.2.1=h2531618_2
  - intel-openmp=2020.2=254
  - isl=0.12.2=0
  - jpeg=9b=h024ee3a_2
  - lcms2=2.12=h3be6417_0
  - ld_impl_linux-64=2.33.1=h53a641e_7
  - libffi=3.3=he6710b0_2
  - libgcc=7.2.0=h69d50b8_2
  - libgcc-ng=9.1.0=hdf63c60_0
  - libpng=1.6.37=hbc83047_0
  - libstdcxx-ng=9.1.0=hdf63c60_0
  - libtiff=4.1.0=h2733197_1
  - lz4-c=1.9.3=h2531618_0
  - mkl=2020.2=256
  - mkl-service=2.3.0=py37he8ac12f_0
  - mkl_fft=1.3.0=py37h54f3939_0
  - mkl_random=1.1.1=py37h0573a6f_0
  - mpc=1.1.0=h10f8cd9_1
  - mpfr=4.0.2=hb69a4c5_1
  - ncurses=6.2=he6710b0_1
  - ninja=1.10.2=hff7bd54_1
  - numpy=1.19.2=py37h54aff64_0
  - numpy-base=1.19.2=py37hfa32c7d_0
  - olefile=0.46=py37_0
  - openssl=1.1.1k=h27cfd23_0
  - pillow=8.2.0=py37he98fc37_0
  - pip=21.0.1=py37h06a4308_0
  - python=3.7.10=hdb3f193_0
  - pytorch=1.5.0=py3.7_cuda10.1.243_cudnn7.6.3_0
  - readline=8.1=h27cfd23_0
  - setuptools=52.0.0=py37h06a4308_0
  - six=1.15.0=py37h06a4308_0
  - sqlite=3.35.4=hdfb4753_0
  - tk=8.6.10=hbc83047_0
  - torchvision=0.6.0=py37_cu101
  - wheel=0.36.2=pyhd3eb1b0_0
  - xz=5.2.5=h7b6447c_0
  - zlib=1.2.11=h7b6447c_3
  - zstd=1.4.9=haebb681_0
  - pip:
    - addict==2.4.0
    - cycler==0.10.0
    - future==0.18.2
    - kiwisolver==1.3.1
    - matplotlib==3.4.1
    - mmcv-full==1.3.1
    - mmpycocotools==12.0.3
    - opencv-python==4.5.1.48
    - pyparsing==2.4.7
    - python-dateutil==2.8.1
    - pyyaml==5.4.1
    - terminaltables==3.1.0
    - timm==0.4.5
    - yapf==0.31.0
prefix: /home/intern2/anaconda3/envs/py37pt15

其中apex可选。

训练测试过程

与mmdetection基本一致
训练命令

python tools/train.py configs_rib/swin/cascade_mask_rcnn_swin_tiny_rib.py --gpu-ids=7 --cfg-options model.pretrained=./checkpoints/cascade_mask_rcnn_swin_tiny_patch4_window7.pth --work-dir ./work_dirs/cascade_mask_rcnn_swin_rib0425_0506

python tools/train.py configs_rib/swin/cascade_mask_rcnn_swin_tiny_rib.py --gpu-ids=0 --cfg-options model.pretrained=./checkpoints/swin_tiny_patch4_window7_224.pth --work-dir=./work_dirs/cascade_mask_rcnn_swin_rib0425_0506

从链接 https://github.com/SwinTransformer/Swin-Transformer-Object-Detection下载的pretrained model 会有问题,建议从链接 https://github.com/microsoft/Swin-Transformer 下载 swin_tiny_patch4_window7_224.pth 预训练模型。

问题梳理

  1. 训练启动后关于 backbone registry 的 KeyError的问题

问题描述

KeyError: "CascadeRCNN: 'SwinTransformer is not in the backbone registry'"

解决方式:
在当前工程项目文件夹下运行如下命令

python setup.py develop

参考 issue 9

  1. 训练启动后关于 relative_position_bias_table 的 KeyError的问题

问题描述:

KeyError: "CascadeRCNN: 'backbone.layers.0.blocks.0.attn.relative_position_bias_table'"

用的预训练模型是在COCO det上微调过的模型,而不是ImageNet预训练中的模型。
解决方式;
从链接 https://github.com/microsoft/Swin-Transformer 下载相对应的模型。
参考 issue 4

  1. 训练启动后关于初始化的 RuntimeError 的问题

问题描述:

RuntimeError: Default process group has not been initialized, please make sure to call init_process_group.

问题原因是非分布式训练使用了分布式训练的设置
解决方式:
方案一是改为默认的分布式训练

# multi-gpu training
tools/dist_train.sh <CONFIG_FILE> <GPU_NUM> --cfg-options model.pretrained=<PRETRAIN_MODEL> [model.backbone.use_checkpoint=True] [other optional arguments]

方案二是修改 tools/train.py 中代码,加入如下内容:

import torch.distributed as dist

dist.init_process_group('gloo', init_method='file:///temp/somefile', rank=0, world_size=1)

方案三是修改配置文件 Swin-Transformer-Object-Detection/configs_rib/swin/cascade_mask_rcnn_swin_tiny.py 代码,将

norm_cfg=dict(type='SyncBN', requires_grad=True),

改为

norm_cfg=dict(type='BN', requires_grad=True),

即'SyncBN'改为'BN'。
'SyncBN'是采用distributed的训练方法,在单GPU non-distributed训练中使用会出现上述错误,改为type='BN' 即可。

  1. 训练时Apex报错,因而选择禁用

默认情况下,Swin使用apex进行混合精度训练,如果要禁用Apex,请修改Runner的类型为'EpochBasedRunner'并在配置文件中cascade_mask_rcnn_swin_tiny.py的修改并且注释以下代码块:

runner = dict(type='EpochBasedRunner', max_epochs=36)

## Disable apex
# # runner = dict(type='EpochBasedRunnerAmp', max_epochs=36)

# # do not use mmdet version fp16
# fp16 = None
# optimizer_config = dict(
#     type="DistOptimizerHook",
#     update_interval=1,
#     grad_clip=None,
#     coalesce=True,
#     bucket_size_mb=-1,
#     use_fp16=True,
# )
  1. 将默认的maskRCNN改为无mask的常规目标检测

需要将含mask的配置文件代码注释
首先是configs/swin/cascade_mask_rcnn_swin_tiny_rib.py

    dict(type='LoadAnnotations', with_bbox=True),    # remove mask
    # dict(type='LoadAnnotations', with_bbox=True, with_mask=True),

    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),   # remove mask
    # dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']),

然后是configs/base/models/cascade_mask_rcnn_swin_fpn_rib.py

        # 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=1,
        #     loss_mask=dict(
        #         type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))

                # mask_size=28,

            # mask_thr_binary=0.5

最后是修改训练数据集,将coco改为voc格式。

_base_ = [
    '../_base_/models/cascade_mask_rcnn_swin_fpn_rib.py',
    '../_base_/datasets/voc0712.py',
    '../_base_/schedules/schedule_1x_rib.py', '../_base_/default_runtime.py'
]

参考 issue 25

  1. 使用自定义数据集进行训练

与mmdetection修改方式类似。

首先是修改配置文件configs/swin/cascade_mask_rcnn_swin_tiny.py 的类别个数

# num_classes=80,
num_classes=1,

然后是修改mmdet/core/evaluation/class_names.py的类别名

def voc_classes():
    return [
        'frac',
    ]

    # return [
    #     'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat',
    #     'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person',
    #     'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'
    # ]

最后是mmdet/datasets/voc.py里的类别元组。

    CLASSES = ('frac', )

    # CLASSES = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car',
    #            'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse',
    #            'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train',
    #            'tvmonitor')

到此为止,环境的搭建、数据的准备、配置文件的修改基本准备完成,可以进行自定义数据集的训练过程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容