# global configs
Global:
  checkpoints: null
  pretrained_model: null
  output_dir: ./output
  device: gpu
  save_interval: 1
  eval_during_train: True
  eval_interval: 1
  epochs: 100
  print_batch_step: 20
  use_visualdl: False
  eval_mode: retrieval
  retrieval_feature_from: features # 'backbone' or 'features'
  re_ranking: False
  use_dali: False
  # used for static mode and model export
  image_shape: [3, 224, 224]
  save_inference_dir: ./inference

# mixed precision
AMP:
  use_amp: False
  use_fp16_test: False
  scale_loss: 128.0
  use_dynamic_loss_scaling: True
  use_promote: False
  # O1: mixed fp16, O2: pure fp16
  level: O1

# model architecture
Arch:
  name: RecModel
  infer_output_key: features
  infer_add_softmax: False

  Backbone:
    name: PPLCNetV2_base_ShiTu
    pretrained: True
    use_ssld: True
    class_expand: &feat_dim 512
  BackboneStopLayer:
    name: flatten
  Neck:
    name: BNNeck
    num_features: *feat_dim
    weight_attr:
      initializer:
        name: Constant
        value: 1.0
    bias_attr:
      initializer:
        name: Constant
        value: 0.0
      learning_rate: 1.0e-20 # NOTE: Temporarily set lr small enough to freeze the bias to zero
  Head:
    name: FC
    embedding_size: *feat_dim
    class_num: 192612
    weight_attr:
      initializer:
        name: Normal
        std: 0.001
    bias_attr: False

# loss function config for traing/eval process
Loss:
  Train:
    - CELoss:
        weight: 1.0
        epsilon: 0.1
    - TripletAngularMarginLoss:
        weight: 1.0
        feature_from: features
        margin: 0.5
        reduction: mean
        add_absolute: True
        absolute_loss_weight: 0.1
        normalize_feature: True
        ap_value: 0.8
        an_value: 0.4
  Eval:
    - CELoss:
        weight: 1.0

Optimizer:
  name: Momentum
  momentum: 0.9
  lr:
    name: Cosine
    learning_rate: 0.06 # for 8gpu x 256bs
    warmup_epoch: 5
  regularizer:
    name: L2
    coeff: 0.00001

# data loader for train and eval
DataLoader:
  Train:
    dataset:
      name: ImageNetDataset
      image_root: ./dataset/
      cls_label_path: ./dataset/train_reg_all_data_v2.txt
      relabel: True
      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - ResizeImage:
            size: [224, 224]
            return_numpy: False
            interpolation: bilinear
            backend: cv2
        - RandFlipImage:
            flip_code: 1
        - Pad:
            padding: 10
            backend: cv2
        - RandCropImageV2:
            size: [224, 224]
        - RandomRotation:
            prob: 0.5
            degrees: 90
            interpolation: bilinear
        - ResizeImage:
            size: [224, 224]
            return_numpy: False
            interpolation: bilinear
            backend: cv2
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: hwc
    sampler:
      name: PKSampler
      batch_size: 256
      sample_per_id: 4
      drop_last: False
      shuffle: True
    loader:
      num_workers: 4
      use_shared_memory: True

  Eval:
    Query:
      dataset:
        name: ImageNetDataset
        image_root: ./dataset/Inshop/
        cls_label_path: ./dataset/Inshop/query_list.txt
        transform_ops:
          - DecodeImage:
              to_rgb: True
              channel_first: False
          - ResizeImage:
              size: [224, 224]
              return_numpy: False
              interpolation: bilinear
              backend: cv2
          - NormalizeImage:
              scale: 1.0/255.0
              mean: [0.485, 0.456, 0.406]
              std: [0.229, 0.224, 0.225]
              order: hwc
      sampler:
        name: DistributedBatchSampler
        batch_size: 64
        drop_last: False
        shuffle: False
      loader:
        num_workers: 4
        use_shared_memory: True

    Gallery:
      dataset:
        name: ImageNetDataset
        image_root: ./dataset/Inshop/
        cls_label_path: ./dataset/Inshop/gallery_list.txt
        transform_ops:
          - DecodeImage:
              to_rgb: True
              channel_first: False
          - ResizeImage:
              size: [224, 224]
              return_numpy: False
              interpolation: bilinear
              backend: cv2
          - NormalizeImage:
              scale: 1.0/255.0
              mean: [0.485, 0.456, 0.406]
              std: [0.229, 0.224, 0.225]
              order: hwc
      sampler:
        name: DistributedBatchSampler
        batch_size: 64
        drop_last: False
        shuffle: False
      loader:
        num_workers: 4
        use_shared_memory: True

Metric:
  Eval:
    - Recallk:
        topk: [1, 5]
    - mAP: {}
