这方法简单而有效.
本文重点在于: 一些有用的training tricks
, 他们做的工作就在于collect and evaluate
这些有效的training tricks. 他们把这些tricks
结合到一起, 在只用全局特征
的时候. 模型在Market1501
上就达到了超高指标
.
effective training tricks or refinements
all training tricks
, 好像就是把所有的都结合起来了.global features of the model
.大多数之前的工作都是在poor baseline上面扩展的. 在market1501
这个库上的表现,23个里只有2个的rank-1精度在90%以上. 最上面那个图的最右上角的蓝点和红点就是那2个.
在下面的图中, 也就是DukeMTMC-reID,
所有baseline在rank-1上都不超过85点, 在mAP上都不超过65点.
modified the standard baseline
with some training tricks
to 获得那个stronge baseline.
什么意思? 别人怎么unfairly比较了?
训练技巧被有些作者低估, 所以造成读者忽略了训练技巧. 很多时候效果的改善就是来自training tricks
而不是method themselves
. 而不是方法本身. 这就把方法本身的作用给夸大了.
在学术领域, 是combine 多个
local feature
或者利用由姿态估计或者segmentation models
得到的semantic information
. 这些都有组合组合的嫌疑. 特征太大(large features)大大地降低了检索过程的速度. 所以,他们最大的特色还是单模型而且使用Global featurs.
他们文章都干些啥:
poor baselines
扩展的, 这也算啊?stronge baseline
让ReID有更高精度.他们其实找了很多tricks(在别的之前的论文里找的), 最后他们选中了six tricks
引入本文中.
也不是光引入, 有的还经过designed
或者修改
.
另外的话, 他们还发现different image size
和numbers of batch size
也很重要. 会对表现具有影响.
我之前的想法是different image size
应该不会有任何影响的.
neck structure named as BNNeck
image size
的影响, 以及the number of batch size
的影响. 这也能算?ResNet50
, 然后初始化是用的pre trained parameters on ImageNet
然后把the dimension of the fully connected layer变成N
. N代表训练集中identity的种类. 简化为: ResNet50(ImageNet)P
个类别, 每个人随机取K
个图像. B = P × K B=P\times{K} B=P×K 然后这里的话, 就是 B = 16 × 4 = 64 B=16\times{4}=64 B=16×4=64.resize
到 256 × 128 256\times128 256×128. 然后不仅仅光resize, 还用0
来pad
重新resized image
的10
个像素. 这句话代码怎么实现, 这句话在后来的fastreid保留了么? 最后, 再通过randomly crop
来把它弄成 256 × 128 256\times128 256×128 的图像.0.5
的概率来水平翻转. 不代表一半图像翻转,一半图像不翻转.[0,1]
的32位浮点数
. 然后RGB通道也得都经过减去一个数再除去一个数来normalize
.prediction logits
是 p p p被用来计算Cross Entropy loss
. triplet的margin m m m是 0.3 0.3 0.3.
告诉他们用的Training Strategies
. 从图上看, 比之前多了下面的方面:
Warmup Learning Rate
Random Erasing Augmentation
label smooth
last Stride
BNNeck
感觉这个可以移植下,而且应该管用. 是在Inference阶段才加么?Center loss
那这么看的话, 人脸的thumbnails一般不再被遮挡了啊, 但是对于口的可以试试这个技术.
REA随机地选择一个矩形区域,然后用随机值来擦除原来的像素. 然后, 这个里面因为选窗口,选位置什么的,还涉及一些超参数.
ID Embedding(IDE) network
这应该就是正常的Cross Entropy
的公式吧? 在这个文章里, 他们又把Cross Entropy当作
ReID 是 one-shot
,那么Face recognition是不是one-shot
.
多数的工作都是用ID loss
和triplet loss
来一起训练ReID
的模型. 表面上看着好像是约束着相同的特征, 但是, 在embedding space两者的目标是不一致的
, 这句话怎么讲.
这块涉及的是: ID loss通过构建几个hyperplanes
会把embedding space分成不同的子空间
. 每类的特征分布在不同的subspaces
.
为啥Cosine比欧式距离更适合?
他们的BNNeck
看样子的话,就是在features后面接上个BN
Layer, 意思是不是对原来的特征多做一步Batch Normalization
? 然后在用做Inference时候的特征, 那么训练时候有没有BN呢? How about the training inference stage?
这也是triplet的局限所在, 不能提供全局的优化约束, 所以就会出现, 类间的距离有时候甚至比类内还小. 那不就分错了嘛, 把不是一类的就会分到一类. 更常用的就是把他们两个结合:
结合ID loss
和triplet loss
来一起训练模型. 这种结合可以使模型学习更加discriminative features
. 优化的距离居然不一样. 因为CE是优化cosine distance
然而triplet loss优化的是欧式距离. 这就有可能存在下列现象:
triplet
训练的模型, 不太适合用cosine distance
来测试吧?
为了得到最优的feature vector
, 但是, 这时候因为目标不一致, 所以, 就可能让学到的feature很拧巴. 拧巴的具体表现如下:
In the training process, a possible phenomenon is that one loss is reduced(减少了), while the other loss is oscillating(震荡) or even increased(增加). 然而BNNeck居然能解决这个问题.
好像确实只是添加batch normalization layer
. 这么一个小操作居然这么管用?
没过BN的特征是 f t f_t ft, 经过BN的特征是 f i f_i fi.
这确实是两个不同处理的特征分别用来计算两个不同的loss.
经过BN的特征
f i f_i fi.为什么这么指定?
ID loss
因为归一化会平衡每个维度. 从而让特征在超球面表面分布, 从而让ID loss
更容易收敛. 不像之前一样,ID loss现在不再在 f t f_t ft上进行任何操作.
表一.的结果显示了BNNeck
非常有用. 就光一个这, 就提升如下很大的幅度.
Center loss可以弥补makes up for the drawbacks of the triplet loss
. 弥补了别人的缺点,
最小化Center loss
可以使得类内的compactness增加, 类内的紧凑性增加, 也就是同一个类更往一起聚.
We add tricks on the standard baseline successively and do not change any training settings.
依次地, 陆续地, 添加各个tricks, 但是不改变训练上的设置.
消融研究present the performance boost from each trick
.
之前的是Baseline-S代表的是Baseline-Standard
. 不管这个baseline-Standard了, 就记住这个其实和大多数的论文用的baseline
都差不多. 6
个 tricks
里面最好用的trick
要属于BNNeck
. 要确定config
文件里确实有BNNeck
功能.
最牛逼的在于, 这些tricks居然把mAP提升10%. 得到这么大的提升, only involve an extra BN layer
. 又不增加训练时间(可以这么说,却不精确到为啥.只写时间而已).
在inference stage
用的是经过BN的特征
然后再加上cosine distance
.
跨域的时候, 6个trick里面的Stride change
和center loss
就没有什么big impact
了.
而且REA does harm to models in cross-domain ReID task
.
为啥REA不好
, 他们也没说, 他们只是推测:
BFE
的方法和他们这个stronge baseline
结果差不多. 但是他会结合两个特征. 他们的方法牛逼在:
To our best knowledge, our baseline achieves best performance in the case of only using global features.
之前的工作会涉及不同的:
关于batch_size
的影响:
好像是 32 ∗ 3 = 96 32*3=96 32∗3=96时候效果最好.
受限于GPU的显存, 不是任意batch size都能测试的. 而且是在不加center loss
时候测的.
关于batch size到底怎么影响表现倒是没有特定结论
. 但是好像是larger batch size, better performance
.
也是不带center loss
. 他们认为图像尺寸也不影响performance.
他们不是要说自己的效果好, 而是告诉大家, 对于ReID以及人脸识别, 还应该有很多没发现的tricks.
在罗浩的Github
里, 是用一个字典的键值IF_WITH_CENTER
来加上center loss
.
但是, 但是, 在fastreid里好像没有用center loss
. 尚且不确定, 可以确定的是在yml
文件里没用, 但是不代表程序代码里没用.
从上图可以看出来: 在yaml里确实没用center loss
.
但是我们如果深入探究的话. 在PG跑完的日志文件里,可以看出如下loss:
下图是BOT50的输出结果.
从这看的话, 怎么感觉有4个loss呢? 感觉分别是:
CE
CIRCLE
FL
这个代表的什么loss啊?TRI
下图则是sbs_R101_ibn的输出结果.
发现上图中TRI:MARGIN居然变成0.0
, 所以, 可能sbs_R101_ibn
没有使用triplet loss
. 但是, 好像也用了center loss
? 不太确定, 因为这块这个CE好象是cross-entropy
. 因为在添加注释的github文件里这个CE就是代表的Cross-Entropy.