vehicle_reid.md 5.7 KB
Newer Older
1
# 车辆ReID
D
dongshuilong 已提交
2
ReID,也就是 Re-identification,其定义是利用算法,在图像库中找到要搜索的目标的技术,所以它是属于图像检索的一个子问题。而车辆ReID就是给定一张车辆图像,找出同一摄像头不同的拍摄图像,或者不同摄像头下拍摄的同一车辆图像的过程。在此过程中,如何提取鲁棒特征,尤为重要。因此,此文档主要对车辆ReID中训练特征提取网络部分做相关介绍,内容如下:
D
dongshuilong 已提交
3
- 数据集及预处理方式
4 5 6
- Backbone的具体设置
- Loss函数的相关设置

D
dongshuilong 已提交
7
全部的超参数及具体配置:[ResNet50_ReID.yaml](../../../ppcls/configs/Vehicle/ResNet50_ReID.yaml)
8 9 10
## 数据集及预处理
### VERI-Wild数据集

D
dongshuilong 已提交
11
<img src="../../images/recognotion/vehicle/cars.JPG" style="zoom:50%;" />
12 13

此数据集是在一个大型闭路电视监控系统,在无约束的场景下,一个月内(30*24小时)中捕获的。该系统由174个摄像头组成,其摄像机分布在200多平方公里的大型区域。原始车辆图像集包含1200万个车辆图像,经过数据清理和标注,采集了416314张40671个不同的车辆图像。[具体详见论文](https://github.com/PKU-IMRE/VERI-Wild)
D
dongshuilong 已提交
14
## 数据预处理
15 16 17 18
由于原始的数据集中,车辆图像已经是由检测器检测后crop出的车辆图像,因此无需像训练`ImageNet`中图像crop操作。整体的数据增强方式,按照顺序如下:
- 图像`Resize`到224
- 随机水平翻转
- [AugMix](https://arxiv.org/abs/1912.02781v1)
D
dongshuilong 已提交
19
- Normlize:归一化到0~1
20
- [RandomErasing](https://arxiv.org/pdf/1708.04896v2.pdf)
D
dongshuilong 已提交
21

D
dongshuilong 已提交
22
在配置文件中设置如下,详见`transform_ops`部分:
D
dongshuilong 已提交
23

D
dongshuilong 已提交
24 25 26 27
```yaml
DataLoader:
  Train:
    dataset:
D
dongshuilong 已提交
28
        # 具体使用的Dataset的的名称
D
dongshuilong 已提交
29
        name: "VeriWild"
D
dongshuilong 已提交
30
        # 使用此数据集的具体参数
D
dongshuilong 已提交
31 32
        image_root: "/work/dataset/VeRI-Wild/images/"
        cls_label_path: "/work/dataset/VeRI-Wild/train_test_split/train_list_start0.txt"
D
dongshuilong 已提交
33
        # 图像增广策略:ResizeImage、RandFlipImage等
D
dongshuilong 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
        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
```
62 63 64 65
## Backbone的具体设置
具体是用`ResNet50`作为backbone,但在`ResNet50`基础上做了如下修改:
- 对Last Stage(第4个stage),没有做下采样,即第4个stage的feature map和第3个stage的feature map大小一致,都是14x14。
- 在最后加入一个embedding 层,即1x1的卷积层,特征维度为512
D
dongshuilong 已提交
66 67 68 69 70 71
具体代码:[ResNet50_last_stage_stride1](../../../ppcls/arch/backbone/variant_models/resnet_variant.py)

在配置文件中Backbone设置如下:

```yaml
Arch:
D
dongshuilong 已提交
72
  # 使用RecModel模型进行训练,目前支持普通ImageNet和RecModel两个方式
D
dongshuilong 已提交
73
  name: "RecModel"
D
dongshuilong 已提交
74 75 76 77
  # 导出inference model的具体配置
  infer_output_key: "features"
  infer_add_softmax: False
  # 使用的Backbone
D
dongshuilong 已提交
78 79 80
  Backbone:
    name: "ResNet50_last_stage_stride1"
    pretrained: True
D
dongshuilong 已提交
81
  # 使用此层作为Backbone的feature输出,name为具体层的full_name
D
dongshuilong 已提交
82 83
  BackboneStopLayer:
    name: "adaptive_avg_pool2d_0"
D
dongshuilong 已提交
84
  # Backbone的基础上,新增网络层。此模型添加1x1的卷积层(embedding)
D
dongshuilong 已提交
85 86 87 88
  Neck:
    name: "VehicleNeck"
    in_channels: 2048
    out_channels: 512
D
dongshuilong 已提交
89
  # 增加ArcMargin, 即ArcLoss的具体实现
D
dongshuilong 已提交
90 91 92 93 94 95 96
  Head:
    name: "ArcMargin"  
    embedding_size: 512
    class_num: 431
    margin: 0.15
    scale: 32
```
97 98 99
## Loss的设置
车辆ReID中,使用了[SupConLoss](https://arxiv.org/abs/2004.11362) + [ArcLoss](https://arxiv.org/abs/1801.07698),其中权重比例为1:1
具体代码详见:[SupConLoss代码](../../../ppcls/loss/supconloss.py)[ArcLoss代码](../../../ppcls/arch/gears/arcmargin.py)
D
dongshuilong 已提交
100 101 102 103 104 105 106 107 108
在配置文件中设置如下:

```yaml
Loss:
  Train:
    - CELoss:
        weight: 1.0
    - SupConLoss:
        weight: 1.0
D
dongshuilong 已提交
109
        # SupConLoss的具体参数
D
dongshuilong 已提交
110 111 112 113 114 115 116 117 118 119
        views: 2
  Eval:
    - CELoss:
        weight: 1.0
```

## 其他相关设置
### Optimizer设置
```yaml
Optimizer:
D
dongshuilong 已提交
120
  # 使用的优化器名称
D
dongshuilong 已提交
121
  name: Momentum
D
dongshuilong 已提交
122
  # 优化器具体参数
D
dongshuilong 已提交
123 124
  momentum: 0.9
  lr:
D
dongshuilong 已提交
125
    # 使用的学习率调节具体名称
D
dongshuilong 已提交
126
    name: MultiStepDecay
D
dongshuilong 已提交
127
    # 学习率调节算法具体参数
D
dongshuilong 已提交
128 129 130 131 132 133 134 135 136
    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
```
D
dongshuilong 已提交
137
### Eval Metric设置
D
dongshuilong 已提交
138 139 140 141

```yaml
Metric:
  Eval:
D
dongshuilong 已提交
142
    # 使用Recallk和mAP两种评价指标
D
dongshuilong 已提交
143 144 145 146
    - Recallk:
        topk: [1, 5]
    - mAP: {}
```
D
dongshuilong 已提交
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173

### 其他超参数设置

```yaml
Global:
  # 如为null则从头开始训练。若指定中间训练保存的状态地址,则继续训练
  checkpoints: null
  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"
```