REID重识别的一些思考-项目/工程实现(四)

REID目前是一个较为火热的研究热点,不管是在业界还是在学术界,在工业界实现项目的时候最大的问题就是如何快速设计一个baseline,并且是一个strong baseline,后续可在次基础上进行更改和优化。

由于不同的项目,不同的数据有各自的特点,所以这里只是说一种常见的baseline,不一定对所有的项目都是最好的,只是说优化潜力较大。

该方案来自 paper: 《 A Strong Baseline and Batch Normalization Neck 》
该篇paper虽然是一个学术paper,但是从中可以感受到作者也是一个偏向工程的,而不是仅仅为了发文章而写的,相信大家在实际做工程的时候使用了很多paper中的tricks,但是说实话真正好用的没几个,乱七八糟的网络结构和策略,难免误导了很多的刚上手的同学。

下面就是逐步进阶REID的一个过程:分为五步
1、直接分类网络 (pre_trained weights)

根据类别ID的个数,直接搭建分类网络,backbone采用与训练权重,由于类别较多最终的效果一般不会很好

2、分类网络+各类tricks (数据增强,注意力)

基于1中的网络,在上述基础上添加一些Tricks,比如 label smoothing,dara_aug,attention等等,一般对于1中的测试结果会有一定程度上的提升,但是仍然达不到想要的效果

3、分类网络 softmax + triplet loss

相对于2中,还是基于上述的架构,但是最终的输出变成了两个,一个是常规的分类 交叉熵损失函数,一个是triplet loss,该方案才是真正的把度量学习的思想加了进来,效果相对于上述的效果应该会好一些

4、分类网络 softmax + semihard-triplet loss

和3中的思想一样,但是对于 triplet loss 进行了改进,主要是只使用样本对之间较为难分的样本参与loss的计算,简单的和太难的样本不参与计算,因为如果使用普通的triplet loss的话,如果简单易分样本很多,难分较少,大量简单可分的样本的loss就会稀释难分样本的loss,模型在优化的时候就会很难注意到难分样本,但是对模型最终效果提升最有效的往往是难分样本。但是我们又不能注意太过于难分的样本,这样就变成 hard triplet loss,所以我们找一个折中,实验证明效果还不错。
注:
1、有很多的细节这里没有提到,比如如何进行数据组织,P*K的形式等等,需要在实际代码操作的时候去实现
2、使用triplet loss 的时候需要对数据进行组织,比如进行简单triplet loss实现的时候,由于每次需要输入三张图像,所以需要对模型进行改进,使得模型每次的输入为三张图像,一个anchor,一个positive, 一个negative,最终的loss输出为 anchor的类别,三者之间的triplrt loss。如果使用semi-hard triplet loss的话就可以不用改模型,使用TF封装的 semi-hard triplet loss就可以了,该包会在每个batch训练的过程中,自动根据label计算所有的正、负样本对之间的距离,并且进行选取其中semi-hard的样本计算loss。

5、基于上述方案,使用paper的一些 Triks

这里的Tricks包括在4的基础上增加 BN Neck, center loss, random erasing, LR schedule 等,其中这几个tricks的分析在之前的博客中提到过–博客地址,可以看看。

如果你想自己学习,建议从 一方案 开始,一步步的进行搭建和练习,并观察准确率最终的变化。如果是想要进行项目的快速搭建,建议直接用第五个方案,可以快速的出一个不错的baseline,然后根据项目的实际情况,比如小目标,背景杂乱等等进行优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值