# Runtime
epoch: 50
log_iter: 10
find_unused_parameters: true
use_gpu: true
use_xpu: false
use_mlu: false
use_npu: false
use_ema: true
save_dir: output
snapshot_epoch: 1
print_flops: false
print_params: false

# Dataset
metric: COCO
num_classes: 80

worker_num: 6
eval_height: &eval_height 640
eval_width: &eval_width 640
eval_size: &eval_size [*eval_height, *eval_width]

TrainDataset:
  name: COCODetDataset
  image_dir: images
  anno_path: annotations/instance_train.json
  dataset_dir: datasets/COCO
  data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']

EvalDataset:
  name: COCODetDataset
  image_dir: images
  anno_path: annotations/instance_val.json
  dataset_dir: datasets/COCO
  allow_empty: true

TestDataset:
  name: ImageFolder
  anno_path: annotations/instance_val.json
  dataset_dir: datasets/COCO

TrainReader:
  sample_transforms:
  - Decode: {}
  - RandomCrop: {}
  - RandomFlip: {prob: 0.5}
  - RandomDistort: {}
  batch_transforms:
  - BatchRandomResize: {target_size: [576, 608, 640, 672, 704], random_size: True, random_interp: True, keep_ratio: False}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  - PadGT: {}
  batch_size: 16
  shuffle: true
  drop_last: true

EvalReader:
  sample_transforms:
  - Decode: {}
  - Resize: {interp: 2, target_size: *eval_size, keep_ratio: False}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_transforms:
  - PadBatch: {pad_to_stride: 32}
  batch_size: 8
  shuffle: false

TestReader:
  inputs_def:
    image_shape: [3, *eval_height, *eval_width]
  sample_transforms:
  - Decode: {}
  - Resize: {interp: 2, target_size: *eval_size, keep_ratio: False}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_size: 1

# Model
architecture: PicoDet
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x2_0_pretrained.pdparams

PicoDet:
  backbone: LCNet
  neck: LCPAN
  head: PicoHeadV2

LCNet:
  scale: 2.0
  feature_maps: [3, 4, 5]

LCPAN:
  out_channels: 160
  use_depthwise: true
  num_features: 4

PicoHeadV2:
  conv_feat:
    name: PicoFeat
    feat_in: 160
    feat_out: 160
    num_convs: 4
    num_fpn_stride: 4
    norm_type: bn
    share_cls_reg: true
    use_se: true
  fpn_stride: [8, 16, 32, 64]
  feat_in_chan: 160
  prior_prob: 0.01
  reg_max: 7
  cell_offset: 0.5
  grid_cell_scale: 5.0
  static_assigner_epoch: 100
  use_align_head: true
  static_assigner:
    name: ATSSAssigner
    topk: 9
    force_gt_matching: false
  assigner:
    name: TaskAlignedAssigner
    topk: 13
    alpha: 1.0
    beta: 6.0
  loss_class:
    name: VarifocalLoss
    use_sigmoid: false
    iou_weighted: true
    loss_weight: 1.0
  loss_dfl:
    name: DistributionFocalLoss
    loss_weight: 0.5
  loss_bbox:
    name: GIoULoss
    loss_weight: 2.5
  nms:
    name: MultiClassNMS
    nms_top_k: 1000
    keep_top_k: 100
    score_threshold: 0.025
    nms_threshold: 0.6

# Optimizer
LearningRate:
  base_lr: 0.08
  schedulers:
  - name: CosineDecay
    max_epochs: 300
  - name: LinearWarmup
    start_factor: 0.1
    steps: 100

OptimizerBuilder:
  optimizer:
    momentum: 0.9
    type: Momentum
  regularizer:
    factor: 0.00004
    type: L2

# Export
export:
  post_process: true
  nms: true
  benchmark: false
  fuse_conv_bn: false
