PaddleClas/docs/zh_CN/application/feature_learning.md

4.7 KiB
Raw Blame History

特征学习

此部分主要是针对RecModel的训练模式进行说明。RecModel的训练模式主要是为了支持车辆识别车辆细分类、ReID、Logo识别、动漫人物识别、商品识别等特征学习的应用。与在ImageNet上训练普通的分类网络不同的是,此训练模式,主要有以下特征

  • 支持对backbone的输出进行截断,即支持提取任意中间层的特征信息
  • 支持在backbone的feature输出层后添加可配置的网络层Neck部分
  • 支持ArcMarginmetric learning 相关loss函数提升特征学习能力

yaml文件说明

RecModel的训练模式与普通分类训练的配置类似,配置文件主要分为以下几个部分:

1 全局设置部分

Global:
  # 如为null则从头开始训练。若指定中间训练保存的状态地址则继续训练
  checkpoints: null
  # pretrained model路径或者 bool类型
  pretrained_model: null
  # 模型保存路径
  output_dir: "./output/"
  device: "gpu"
  class_num: 30671
  # 保存模型的粒度每个epoch保存一次
  save_interval: 1
  eval_during_train: True
  eval_interval: 1
  # 训练的epoch数
  epochs: 160
  # log输出频率
  print_batch_step: 10
  # 是否使用visualdl库
  use_visualdl: False
  # used for static mode and model export
  image_shape: [3, 224, 224]
  save_inference_dir: "./inference"
  # 使用retrival的方式进行评测
  eval_mode: "retrieval"

2 数据部分

DataLoader:
  Train:
    dataset:
        # 具体使用的Dataset的的名称
        name: "VeriWild"
        # 使用此数据集的具体参数
        image_root: "./dataset/VeRI-Wild/images/"
        cls_label_path: "./dataset/VeRI-Wild/train_test_split/train_list_start0.txt"
        # 图像增广策略ResizeImage、RandFlipImage等
        transform_ops:
          - ResizeImage:
              size: 224
          - RandFlipImage:
              flip_code: 1
          - AugMix:
              prob: 0.5
          - NormalizeImage:
              scale: 0.00392157
              mean: [0.485, 0.456, 0.406]
              std: [0.229, 0.224, 0.225]
              order: ''
          - RandomErasing:
              EPSILON: 0.5
              sl: 0.02
              sh: 0.4
              r1: 0.3
              mean: [0., 0., 0.]
    sampler:
        name: DistributedRandomIdentitySampler
        batch_size: 128
        num_instances: 2
        drop_last: False
        shuffle: True
    loader:
        num_workers: 6
        use_shared_memory: False

val dataset设置与train dataset除图像增广策略外,设置基本一致

3 Backbone的具体设置

Arch:
  # 使用RecModel模式进行训练
  name: "RecModel"
  # 导出inference model的具体配置
  infer_output_key: "features"
  infer_add_softmax: False
  # 使用的Backbone
  Backbone:
    name: "ResNet50"
    pretrained: True
  # 使用此层作为Backbone的feature输出name为ResNet50的full_name
  BackboneStopLayer:
    name: "adaptive_avg_pool2d_0"
  # Backbone的基础上新增网络层。此模型添加1x1的卷积层embedding
  Neck:
    name: "VehicleNeck"
    in_channels: 2048
    out_channels: 512
  # 增加ArcMargin 即ArcLoss的具体实现
  Head:
    name: "ArcMargin"  
    embedding_size: 512
    class_num: 431
    margin: 0.15
    scale: 32

Neck部分为在bacbone基础上,添加的网络层,可根据需求添加。 如在ReID任务中添加一个输出长度为512的embedding层,可由此部分实现。需注意的是,Neck部分需对应好BackboneStopLayer层的输出维度。一般来说,Neck部分为网络的最终特征输出层。

Head部分主要是为了支持metric learning等具体loss函数ArcMargin(ArcFace Loss的fc层的具体实现),在完成训练后,一般将此部分剔除。

4 Loss的设置

Loss:
  Train:
    - CELoss:
        weight: 1.0
    - SupConLoss:
        weight: 1.0
        # SupConLoss的具体参数
        views: 2
  Eval:
    - CELoss:
        weight: 1.0

训练时同时使用CELossSupConLoss,权重比例为1:1,测试时只使用CELoss

5 优化器设置

Optimizer:
  # 使用的优化器名称
  name: Momentum
  # 优化器具体参数
  momentum: 0.9
  lr:
    # 使用的学习率调节具体名称
    name: MultiStepDecay
    # 学习率调节算法具体参数
    learning_rate: 0.01
    milestones: [30, 60, 70, 80, 90, 100, 120, 140]
    gamma: 0.5
    verbose: False
    last_epoch: -1
  regularizer:
    name: 'L2'
    coeff: 0.0005

6 Eval Metric设置

Metric:
  Eval:
    # 使用Recallk和mAP两种评价指标
    - Recallk:
        topk: [1, 5]
    - mAP: {}