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 22 23 24 25
在配置文件中设置如下,详见`transform_ops`部分:
```yaml
DataLoader:
  Train:
    dataset:
D
dongshuilong 已提交
26
    		# 具体使用的Dataset的的名称
D
dongshuilong 已提交
27
        name: "VeriWild"
D
dongshuilong 已提交
28
        # 使用此数据集的具体参数
D
dongshuilong 已提交
29 30
        image_root: "/work/dataset/VeRI-Wild/images/"
        cls_label_path: "/work/dataset/VeRI-Wild/train_test_split/train_list_start0.txt"
D
dongshuilong 已提交
31
        # 图像增广策略:ResizeImage、RandFlipImage等
D
dongshuilong 已提交
32 33 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
        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
```
60 61 62 63
## Backbone的具体设置
具体是用`ResNet50`作为backbone,但在`ResNet50`基础上做了如下修改:
- 对Last Stage(第4个stage),没有做下采样,即第4个stage的feature map和第3个stage的feature map大小一致,都是14x14。
- 在最后加入一个embedding 层,即1x1的卷积层,特征维度为512
D
dongshuilong 已提交
64 65 66 67 68 69
具体代码:[ResNet50_last_stage_stride1](../../../ppcls/arch/backbone/variant_models/resnet_variant.py)

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

```yaml
Arch:
D
dongshuilong 已提交
70
	# 使用RecModel模型进行训练,目前支持普通ImageNet和RecModel两个方式
D
dongshuilong 已提交
71
  name: "RecModel"
D
dongshuilong 已提交
72 73 74 75
  # 导出inference model的具体配置
  infer_output_key: "features"
  infer_add_softmax: False
  # 使用的Backbone
D
dongshuilong 已提交
76 77 78
  Backbone:
    name: "ResNet50_last_stage_stride1"
    pretrained: True
D
dongshuilong 已提交
79
  # 使用此层作为Backbone的feature输出,name为具体层的full_name
D
dongshuilong 已提交
80 81
  BackboneStopLayer:
    name: "adaptive_avg_pool2d_0"
D
dongshuilong 已提交
82
  # Backbone的基础上,新增网络层。此模型添加1x1的卷积层(embedding)
D
dongshuilong 已提交
83 84 85 86
  Neck:
    name: "VehicleNeck"
    in_channels: 2048
    out_channels: 512
D
dongshuilong 已提交
87
  # 增加ArcMargin, 即ArcLoss的具体实现
D
dongshuilong 已提交
88 89 90 91 92 93 94
  Head:
    name: "ArcMargin"  
    embedding_size: 512
    class_num: 431
    margin: 0.15
    scale: 32
```
95 96 97
## 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 已提交
98 99 100 101 102 103 104 105 106
在配置文件中设置如下:

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

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

```yaml
Metric:
  Eval:
D
dongshuilong 已提交
140
    # 使用Recallk和mAP两种评价指标
D
dongshuilong 已提交
141 142 143 144
    - Recallk:
        topk: [1, 5]
    - mAP: {}
```
D
dongshuilong 已提交
145 146 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

### 其他超参数设置

```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"
```