行人重识别(ReID)-表征学习
前言
在记录今天的内容前,先推一下罗浩老师的行人重识别的论文综述,这对于了解行人重识别领域是有很大帮助的,接下来的几篇博客呢,也是围绕这篇综述中的内容进行介绍的。
行人重识别-罗浩知乎专栏
顺便附上几个行人重识别的开源代码:
https://github.com/zhunzhong07/IDE-baseline-Market-1501
https://github.com/KaiyangZhou/deep-person-reid
https://github.com/huanghoujing/person-reid-triplet-loss-baseline
表征学习概念
在上一篇博客中我们提到过根据训练损失可以分为基于表征学习和度量学习,这一篇博客主要围绕表征学习来介绍。
基于表征学习(Representation learning)的方法是一类非常常用的行人重识别的方法。它的特点就在于虽然行人重识别的最终目标是为了学习出两张图片之间的相似度,但是表征学习的方法并没有直接在训练网络的时候考虑图片间的相似度,而是把行人重识别任务当作分类问题或者验证问题。
具体来说呢,分类问题就是把行人的ID或者属性作为训练标签来训练模型,每次只需要输入一张图片就够了;而验证问题呢,则需要输入一对(两张)行人的图片,让网络学习这两张图片是否属于同一个行人。分类网络对应的就是分类损失,蓝色的线表示两个图片同属于一个ID,训练网络时对应激活的就是同一个神经元,也表示他们具有相似的特征。
验证网络则是每次针对一对图片,红色表示不相关,蓝色表示为同一ID。
这类方法的特点就是网络的最后一层全连接层(FC)输出的并不是最后要使用的图像特征向量,而是要再经过一个Softmax激活函数来计算表征学习损失,相应的此时的FC层作为特征向量层。
分类损失
当我们将每一个行人作为分类问题的一个类别,用行人的ID作为训练数据的标签来训练CNN网络时,这个网络损失就被称为ID损失,只有ID损失的网络称为ID Embedding网络(IDE网络)。如图所示,训练集中行人的ID数为网络的类别数,特征层后接一个分类FC,经过Softmax激活函数计算交叉熵损失。但是在测试阶段我们使用的是倒数第二层的特征向量进行检索,而将分类FC层丢弃,因为训练集和测试集对应两个完全独立的行人,也意味着他们对应这不同的特征,因此不能再重复使用FC层。
后来有研究者发现,光靠行人ID信息不足以学习一个具有足够强泛化能力的模型(模型过拟合了),因此,又添加了额外的属性信息,如发色、性别、衣着。这就要求训练好的网络不仅仅要预测行人ID,同时也要预测对应的属性,由此带来的是属性损失。网络结构如下图:
网络的总损失就可以由ID损失和M个属性损失共同组成:
验证损失
和分类网络不同,验证网络每次输入一对(两张)图片,进入同一个Siamese(孪生网络:解决one-shot问题,可以输出两张给定图片的相似度)提取特征,然后将网络输出的两个特征向量融合,输入到一个只有两个神经元的FC层,计算一个二分类损失(验证损失)。这样在测试阶段就可以直接输入两张图片,计算它们的相似度。
但是,单单使用验证损失效果不好,因此常常将它与上面提到的ID损失结合起来进行训练。
如上图所示的行人重识别网络:
- 输入为若干对行人图片
- 网络
- 分类子网络(Classification Subnet)
- 验证子网络(Verification Subnet)
- 损失
- 总损失为 L = Lid + Lv(关于各交叉熵损失的具体形式在综述中都有提到,就不赘述了)
经过足够多的数据训练后,测试时仅需要再次输入一张测试图片,网络将自动提取特征,用于行人重识别任务。
总结
通过构造网络来直接得到鲁棒的ReID特征,不直接学习图片之间的相似性
- 通常需要额外的FC层来辅导特征学习,测试阶段FC层会被丢弃
- ID损失的FC层维度与ID数量一致,当训练集太大时网络巨大,训练收敛很难
- 验证损失测试的时候需要输入一对图片,识别效率很低
- 表征学习通常而言训练比较稳定,结果易复现
- 表征学习的分布式训练通常比较成熟