【mmPretrain】,mmcls的扩展版还可以多模态自监督学习,对模型的理解更深,自定义自由度也很大

  • MMPretrain 是一个全新升级的预训练开源算法框架,旨在提供各种强大的预训练主干网络, 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSelfSup,并开发了许多令人兴奋的新功能。 目前,预训练阶段对于视觉识别至关重要,凭借丰富而强大的预训练模型,我们能够改进各种下游视觉任务。

  • 为了用户能够快速上手,官方推荐以下流程:

    • 对于想要使用 MMPretrain 的用户,推荐先阅读 [开始你的第一步](依赖环境 — MMPretrain 1.0.0rc8 文档) 部分来设置环境。

    • 对于一些基础使用,建议用户阅读 [教程](学习配置文件 — MMPretrain 1.0.0rc8 文档) 来学习如何使用算法库来获得预训练模型以及在下游任务进行评测。

    • 若想进行算法的自定义,提供了 [进阶教程](添加新数据集 — MMPretrain 1.0.0rc8 文档) 来阐述了代码修改的方法和规则。

    • 如果想找到所期望的预训练模型,可以浏览 [模型库](模型库统计 — MMPretrain 1.0.0rc8 文档),其中包含了模型库的总结,以及各类主干网络和预训练算法的介绍。

    • 同样提供了 [分析工具](打印完整配置文件 — MMPretrain 1.0.0rc8 文档) 和 [可视化](数据集可视化 — MMPretrain 1.0.0rc8 文档) 来辅助模型分析。

  • 依赖环境

    • MMPretrain 适用于 Linux、Windows 和 macOS。它需要 Python 3.7+、CUDA 10.2+ 和 PyTorch 1.8+以上。

    • conda create --name openmmlab python=3.8 -y
      conda activate openmmlab  
      conda install pytorch torchvision -c pytorch 
      
    • 希望基于 MMPretrain 框架开发自己的预训练任务,需要添加新的功能,比如新的模型或是数据集,或者使用我们提供的各种工具,那就从源码开始安装

    • git clone https://github.com/open-mmlab/mmpretrain.git
      cd mmpretrain
      pip install -U openmim && mim install -e .
      
    • "-e" 表示以可编辑形式安装,这样可以在不重新安装的情况下,让本地修改直接生效

    • 安装多模态支持 (可选),MMPretrain 中的多模态模型需要额外的依赖项,要安装这些依赖项,请在安装过程中添加 [multimodal] 参数,如下所示:

    • # 从源码安装
      mim install -e ".[multimodal]"
      
  • 验证安装

    • 为了验证 MMPretrain 的安装是否正确,我们提供了一些示例代码来执行模型推理。如果你是从源码安装的 mmpretrain,那么直接运行以下命令进行验证:

    • python demo/image_demo.py demo/demo.JPEG resnet18_8xb32_in1k --device cpu
      
    • 可以看到命令行中输出了结果字典,包括 pred_labelpred_score 和 pred_class 三个字段。

  • 配置文件

    • 为了管理深度学习实验的各种设置,我们使用配置文件来记录所有这些配置。这种配置文件系统具有模块化和继承特性,更多细节可以在MMEngine 中的教程。

    • MMPretrain 主要使用 python 文件作为配置文件,所有配置文件都放置在 configs 文件夹下,目录结构如下所示:

    • MMPretrain/
          ├── configs/
          │   ├── _base_/                       # primitive configuration folder
          │   │   ├── datasets/                 # primitive datasets
          │   │   ├── models/                   # primitive models
          │   │   ├── schedules/                # primitive schedules
          │   │   └── default_runtime.py        # primitive runtime setting
          │   ├── beit/                         # BEiT Algorithms Folder
          │   ├── mae/                          # MAE Algorithms Folder
          │   ├── mocov2/                       # MoCoV2 Algorithms Folder
          │   ├── resnet/                       # ResNet Algorithms Folder
          │   ├── swin_transformer/             # Swin Algorithms Folder
          │   ├── vision_transformer/           # ViT Algorithms Folder
          │   ├── ...
          └── ...
      
    • 可以使用 python tools/misc/print_config.py /PATH/TO/CONFIG 命令来查看完整的配置信息,从而方便检查所对应的配置文件。

  • 配置文件结构,在 configs/_base_ 文件夹下有 4 个基本组件类型,分别是:

    • 模型(model);数据(data);训练策略(schedule);运行设置(runtime)。
  • 可以通过继承一些基本配置文件轻松构建自己的训练配置文件。称这些被继承的配置文件为 原始配置文件,如_base_ 文件夹中的文件一般仅作为原始配置文件。以resnet50为例:

  • _base_ = [                                    # 此配置文件将继承所有 `_base_` 中的配置
        '../_base_/models/resnet50.py',           # 模型配置
        '../_base_/datasets/imagenet_bs32.py',    # 数据配置
        '../_base_/schedules/imagenet_bs256.py',  # 训练策略配置
        '../_base_/default_runtime.py'            # 默认运行设置
    ]
    
  • 模型原始配置文件包含一个 model 字典数据结构,主要包括网络结构、损失函数等信息:

    • type:算法类型,我们支持了多种任务

    • 对于图像分类任务,通常为 ImageClassifier;对于自监督任务,有多种类型的算法,例如 MoCoV2BEiTMAE 等。对于图像检索任务,通常为 ImageToImageRetriever

    • 通常,我们使用 type字段 来指定组件的类,并使用其他字段来传递类的初始化参数。注册器教程 对其进行了详细描述。

  • 这里我们以 ImageClassifier 的配置字段为例,对初始化参数进行说明:

    • backbone: 主干网络设置,主干网络为主要的特征提取网络,比如 ResNetSwin TransformerVision Transformer 等等。

    • neck: 颈网络设置,颈网络主要是连接主干网和头网络的中间部分,比如 GlobalAveragePooling 等

    • head: 头网络设置,头网络主要是与具体任务关联的部件,如图像分类、自监督训练等;

    • loss: 损失函数设置, 支持 CrossEntropyLossLabelSmoothLossPixelReconstructionLoss 等;

    • data_preprocessor: 图像输入的预处理模块,输入在进入模型前的预处理操作;

    • train_cfgImageClassifier 的额外训练配置。在 ImageClassifier 中,我们使用这一参数指定批数据增强设置,比如 Mixup 和 CutMix

  • 以下是 ResNet50 的模型配置’configs/base/models/resnet50.py’:

    • model = dict(
          type='ImageClassifier',     # 主模型类型(对于图像分类任务,使用 `ImageClassifier`)
          backbone=dict(
              type='ResNet',          # 主干网络类型
              # 除了 `type` 之外的所有字段都来自 `ResNet` 类的 __init__ 方法
              # 可查阅 https://mmpretrain.readthedocs.io/zh_CN/latest/api/generated/mmpretrain.models.backbones.ResNet.html
              depth=50,
              num_stages=4,           # 主干网络状态(stages)的数目,这些状态产生的特征图作为后续的 head 的输入。
              out_indices=(3, ),      # 输出的特征图输出索引。
              frozen_stages=-1,       # 冻结主干网的层数
              style='pytorch'),
          neck=dict(type='GlobalAveragePooling'),    # 颈网络类型
          head=dict(
              type='LinearClsHead',         # 分类颈网络类型
              # 除了 `type` 之外的所有字段都来自 `LinearClsHead` 类的 __init__ 方法
              # 可查阅 https://mmpretrain.readthedocs.io/zh_CN/latest/api/generated/mmpretrain.models.heads.LinearClsHead.html
              num_classes=1000,
              in_channels=2048,
              loss=dict(type='CrossEntropyLoss', loss_weight=1.0), # 损失函数配置信息
              topk=(1, 5),                 # 评估指标,Top-k 准确率, 这里为 top1 与 top5 准确率
          ))
      
  • 数据原始配置文件主要包括预处理设置、dataloader 以及 评估器等设置:

    • data_preprocessor: 模型输入预处理配置,与 model.data_preprocessor 相同,但优先级更低。

    • train_evaluator | val_evaluator | test_evaluator: 构建评估器

    • train_dataloader | val_dataloader | test_dataloader: 构建 dataloader

      • samples_per_gpu: 每个 GPU 的 batch size

      • workers_per_gpu: 每个 GPU 的线程数

      • sampler: 采样器配置

      • dataset: 数据集配置;type: 数据集类型, MMPretrain 支持 ImageNet、 Cifar 等数据集;pipeline: 数据处理流水线。

    • dataset_type = 'ImageNet'
      # 预处理配置
      data_preprocessor = dict(
          # 输入的图片数据通道以 'RGB' 顺序
          mean=[123.675, 116.28, 103.53],    # 输入图像归一化的 RGB 通道均值
          std=[58.395, 57.12, 57.375],       # 输入图像归一化的 RGB 通道标准差
          to_rgb=True,                       # 是否将通道翻转,从 BGR 转为 RGB 或者 RGB 转为 BGR
      )
      train_pipeline = [
          dict(type='LoadImageFromFile'),     # 读取图像
          dict(type='RandomResizedCrop', scale=224),     # 随机放缩裁剪
          dict(type='RandomFlip', prob=0.5, direction='horizontal'),   # 随机水平翻转
          dict(type='PackInputs'),         # 准备图像以及标签
      ]
      test_pipeline = [
          dict(type='LoadImageFromFile'),     # 读取图像
          dict(type='ResizeEdge', scale=256, edge='short'),  # 缩放短边尺寸至 256px
          dict(type='CenterCrop', crop_size=224),     # 中心裁剪
          dict(type='PackInputs'),                 # 准备图像以及标签
      ]
      # 构造训练集 dataloader
      train_dataloader = dict(
          batch_size=32,                     # 每张 GPU 的 batchsize
          num_workers=5,                     # 每个 GPU 的线程数
          dataset=dict(                      # 训练数据集
              type=dataset_type,
              data_root='data/imagenet',
              ann_file='meta/train.txt',
              data_prefix='train',
              pipeline=train_pipeline),
          sampler=dict(type='DefaultSampler', shuffle=True),   # 默认采样器
          persistent_workers=True,                             # 是否保持进程,可以缩短每个 epoch 的准备时间
      )
      # 构造验证集 dataloader
      val_dataloader = dict(
          batch_size=32,
          num_workers=5,
          dataset=dict(
              type=dataset_type,
              data_root='data/imagenet',
              ann_file='meta/val.txt',
              data_prefix='val',
              pipeline=test_pipeline),
          sampler=dict(type='DefaultSampler', shuffle=False),
          persistent_workers=True,
      )
      # 验证集评估设置,使用准确率为指标, 这里使用 topk1 以及 top5 准确率
      val_evaluator = dict(type='Accuracy', topk=(1, 5))
      test_dataloader = val_dataloader  # test dataloader 配置,这里直接与 val_dataloader 相同
      test_evaluator = val_evaluator    # 测试集的评估配置,这里直接与 val_evaluator 相同
      
    • 预处理配置(data_preprocessor)既可以作为 model 的一个子字段,也可以定义在外部的 data_preprocessor 字段, 同时配置时,优先使用 model.data_preprocessor 的配置。

  • 训练策略原始配置文件主要包括预优化器设置和训练、验证及测试的循环控制器(LOOP):

    • optim_wrapper: 优化器装饰器配置信息,我们使用优化器装饰配置优化进程。

      • optimizer: 支持 pytorch 所有的优化器,

      • paramwise_cfg: 根据参数的类型或名称设置不同的优化参数。

      • accumulative_counts: 积累几个反向传播后再优化参数,你可以用它通过小批量来模拟大批量。

    • param_scheduler : 学习率策略,你可以指定训练期间的学习率和动量曲线。

    • train_cfg | val_cfg | test_cfg: 训练、验证以及测试的循环执行器配置

    • optim_wrapper = dict(
          # 使用 SGD 优化器来优化参数
          optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001))
      # 学习率参数的调整策略
      # 'MultiStepLR' 表示使用多步策略来调度学习率(LR)。
      param_scheduler = dict(
          type='MultiStepLR', by_epoch=True, milestones=[30, 60, 90], gamma=0.1)
      # 训练的配置,迭代 100 个 epoch,每一个训练 epoch 后都做验证集评估
      # 'by_epoch=True' 默认使用 `EpochBaseLoop`,  'by_epoch=False' 默认使用 `IterBaseLoop`
      train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1)
      # 使用默认的验证循环控制器
      val_cfg = dict()
      # 使用默认的测试循环控制器
      test_cfg = dict()
      # 通过默认策略自动缩放学习率,此策略适用于总批次大小 256
      # 如果你使用不同的总批量大小,比如 512 并启用自动学习率缩放
      # 我们将学习率扩大到 2 倍
      auto_scale_lr = dict(base_batch_size=256)
      
  • 运行设置: 本部分主要包括保存权重策略、日志配置、训练参数、断点权重路径和工作目录等等。

  • # 默认所有注册器使用的域
    default_scope = 'mmpretrain'
    # 配置默认的 hook
    default_hooks = dict(
        # 记录每次迭代的时间。
        timer=dict(type='IterTimerHook'),
        # 每 100 次迭代打印一次日志。
        logger=dict(type='LoggerHook', interval=100),
        # 启用默认参数调度 hook。
        param_scheduler=dict(type='ParamSchedulerHook'),
        # 每个 epoch 保存检查点。
        checkpoint=dict(type='CheckpointHook', interval=1),
        # 在分布式环境中设置采样器种子。
        sampler_seed=dict(type='DistSamplerSeedHook'),
        # 验证结果可视化,默认不启用,设置 True 时启用。
        visualization=dict(type='VisualizationHook', enable=False),
    )
    # 配置环境
    env_cfg = dict(
       # 是否开启 cudnn benchmark
        cudnn_benchmark=False,
        # 设置多进程参数
        mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),
        # 设置分布式参数
        dist_cfg=dict(backend='nccl'),
    )
    # 设置可视化工具
    vis_backends = [dict(type='LocalVisBackend')] # 使用磁盘(HDD)后端
    visualizer = dict(
        type='UniversalVisualizer', vis_backends=vis_backends, name='visualizer')
    # 设置日志级别
    log_level = 'INFO'
    # 从哪个检查点加载
    load_from = None
    # 是否从加载的检查点恢复训练
    resume = False
    
  • 对于在同一算法文件夹下的所有配置文件,MMPretrain 推荐只存在 一个 对应的 原始配置 文件。 所有其他的配置文件都应该继承 原始配置 文件,这样就能保证配置文件的最大继承深度为 3。

  • 用户还可以:

    • 继承并修改配置文件

    • 使用配置文件里的中间变量

    • 使用配置文件里的中间变量

    • 引用基础配置文件里的变量

    • 通过命令行参数修改配置信息

你可能感兴趣的:(树莓派,学习,深度学习,python)