深度炼丹
首发于深度炼丹

一个强力的ReID basemodel

最近一段时间在旷视 @旷视科技 实习做 ReID 相关的任务,期间小伙伴们对于 basemodel 有一些不一致的意见,有的小伙伴人为 softmax 效果比较好,有的认为 triplet hard 效果好,还有的认为 softmax 加 triplet hard 联合训练效果比较好。同时今年 CVPR2018 很多有关 ReID 文章的性能并不是特别高,比如如何看待商汤CVPR2018行人重识别的文章比softmax baseline还低,其实现在很多文章的 setting 都不一样,所以大家的 baseline 也不一样,而有些文章提出的方法在低的 baseline 上面有提升,放到高的 baseline 上可能还会掉点。鉴于此我们做了一个实验,试验了使用三种 loss 进行训练最后的 rank1 能到多少,同时也验证一下到底哪种 loss 组合的效果最好。

What is person ReID?

Introduction

首先我们简单地介绍一下行人重识别,也被称为 ReID(Person Re-identification),是希望能够利用计算机视觉的算法来进行跨摄像头的追踪,也就是找到不同摄像头下的同一个人,这也是图像检索的一个子问题,同时因为摄像头的距离比较远,所以人的图像都比较模糊,没有办法通过人脸来定位,同时 ReID 更希望解决跨摄像头的问题,所以周围的环境以及摄像头的变化都会增加 ReID 的难度,具体可以看下面的图



左边的 query 就是要查找的某个人,右边的 gallery 就是所有的人,我们需要从 gallery 里面找到 query 的人。有关于 ReID 的更多的介绍,可以看看@郑哲东博士的文章行人重识别综述: 从哈利波特地图说起

Evaluation metric

我们知道了 ReID 的任务,下面我们讲一讲如何评测 ReID 模型的好坏,目前有两个比较常用的指标,一个是 rank1,一个是 mAP,我们分别来简单介绍一下。

Rank1 表示首位命中的概率,我们会将 query 和 gallery 依次算一个距离,然后根据距离排序,判断一下 gallery 首位的图有没有命中 query,rank5 表示 1 - 5张图片面至少有一张命中。

mAP 表示平均精度均值,我们可以用下面这张图片来形象的说明 mAP 是如何计算的



本图来自下面的blog

How to train and test

前面我们讲了 ReID 的定义以及评测指标,下面我们讲讲如何训练和测试一个 ReID 的模型。

Train

对于训练而言,目前 ReID basemodel 主要是使用一个 backbone network,比如 ResNet 或者 InceptionNet,然后使用 ImageNet pretrained 的权重去初始化 model, loss 的选择一般有两种,一种是分类的 cross entropy,一种是度量学习里面的 triplet loss。

分类很简单,就是把不同的人分成不同的类,一共有多少个人,就在最后接一个全连接层,分多少类,这和人脸中的做法是相似的。

而度量学习(metric learning)是更广泛应用于图像检索任务的方法,我们可以使用 backbone net 提取出网络的 feature,然后通过 feature 之间的距离去衡量他们的相似度,然后优化这些距离,比如在 triplet loss 中,我们选择一对三元组,也就是三张输入的图片,然后三元组中包含一对正样本和一对负样本,我们可以拉近正样本之间的距离,推远负样本之间的距离,这样就是的最后的类内距离更近,类间距离更大,提高 ReID 的效果。目前更加广泛使用的是难样本的三元组采样,也就是在每个 batch 里面选择同人的距离最远的正样本对,和不同的人之间距离最近的负样本。有关 triplet loss 的图示可以看下面的图片



Test

用 ReID model 做预测就非常简单,就去掉最后的全连接层,然后用网络提取 feature,最后算 query 和 gallery 所有图片 feature 之间的距离,根据距离去算 rank1 和 mAP 就可以得到最后的效果。

Baseline model

前面介绍完了 ReID 的基础知识,下面我们讲一讲我们用的 basemodel,同时也验证三种 loss(softmax, triplet, softmax+triplet) 的性能表现。我们的 backbone network 是 ResNet50,这也是很多论文中使用的 model,但是我们会稍稍做一点修改,将最后一个 conv block 的 stride 从 2 改成 1,这样网络的参数并不会变化,但是可以得到比原来大一倍的 feature map,这个想法来自于 huanghoujing的triplet baseline

Bottleneck

第二个增加的部分叫 bottleneck,也就是在全连接分类层的前面加上一个 BatchNorm,这个结构来自于 Towards Good Practices on Building Effective CNN Baseline Model for Person Re-identification 这篇论文。加上的 BatchNorm layer 中 gamma 进行学习,而 beta 初始化为0之后不进行更新,同时分类的全连接层也去掉bias。这样做是因为softmax是一个angular loss,所以我们通过去掉 beta 的 BN 对 feature normalize 到原点周围,同时因为单位球面上进行softmax效果并不好,所以我们对 BN 的 scale 参数 gamma 进行学习,希望实现一个 adaptive scale 而不是单位球。最后由于 feature 在原点周围,所以我们使用去掉 bias 的全连接层进行分类。

Warmup strategy

最后一个就是我们训练模型使用的学习率策略,这个策略叫做 warmup,也就是开始让学习率特别小,然后慢慢增大,接着训练一段时间又慢慢减小,这个策略来自于 fair 的论文 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour,同时这篇论文提供了一个多卡和学习率之间线性关系的简单证明,有兴趣的同学可以看看,里面有很多训练的 trick。

Loss

我们试验了三种 loss,分别是 softmax,triplet hard 以及 softmax + triplet hard。在训练分类的时候直接按照最简单的图像分类训练去取样本,在训练 triplet hard 以及 softmax + triplet hard 的时候,我们使用三元组采样,具体来讲在每个 batch 中我们采样 32 个人,每个人采样 4 张图片,这样每个 batch 有 128 张图片,实现上可以使用 pytorch 里 DataLoader 中的 sampler 这个函数,同时我们训练的时候使用 Adam 去优化所有的参数。

Input Size and Batch Size

除了上面的网络部分,我们也对 input size 和 batch size 进行了实验,我们尝试了 PCB 中的 (384 x 128) 的 input size,也尝试了标准的 (256 x 128)。同时对于 batch size,我们尝试了 64 和 128 进行实验。

Experiment Result

通过我们的实验,最后我们得到了下面的结果

通过上面的结果可以发现 softmax 联合 triplet hard 训练,输入是 (256 x 128),batch size 是 64 的效果是最好的,同时我们也做了多次试验,最后结果浮动在 1% 以内,最好的结果在 market1501 上是能跑到 93.8%。

Conclusion

本次对比试验主要是为了解决一个疑惑,那就是三种 loss 到底哪一种能够实现最好的结果,我们将 setting 控制成一样之后,最终得到了上面的结果,也证明了 softmax + triplet hard 能够实现最佳的性能,同时我们间接实现了一个非常强的 baseline,rank1 在 market1501 上直接能达到 93.8%,这可能比绝大多数论文的结果都要高,我们也希望大家能够在一个高的 baseline 上面去创新,思考一些 novelty 的方法,这样才是真正有意义的工作。

最后放上我们的代码地址 reid_baseline


欢迎关注我的知乎专栏深度炼丹

欢迎访问我的博客

Reference

编辑于 2019-03-15

文章被以下专栏收录

    介绍机器学习,深度学习以及其工程实践,分享学习的心路历程,分享一些小项目以及比赛