【深度学习笔记2】——行人重识别之局部特征与深度学习小经验

【深度学习笔记2】——行人重识别之局部特征与深度学习小经验

  • 一. 表征学习和基于特征学习的区别
    • 1.表征学习:
    • 2.基于局部特征学习:
  • 二. 论文解读(Learning Discriminative Features with Multiple Granularities for Person Re-Identification)
  • 三. 论文解读(Human Semantic Parsing for Person Re-identification)
  • 四. 论文解读(Person Re-identi cation with Deep Similarity-Guided Graph Neural Network)
  • 五. FC和GAP的区别
    • 参考文献

望大佬们多多提携,如有错误欢迎提出并多多海涵哟~

一. 表征学习和基于特征学习的区别

1.表征学习:

主要有两种任务:

  1. 验证:通过深度模型判断输入人图像对是否属于同一个人。
  2. 识别:该方法将每个身份视为一个类别,然后最小化softmax损失。 在一些改进的论文中,人物属性loss(Attribute loss)与验证或识别loss相结合,以学习更好的特征描述。

2.基于局部特征学习:

主要有三种主要途径。

  1. 根据内在的人体结构知识,图像在水平方向上被分成几个条纹,在其上学习局部特征表示。
  2. 利用由姿态估计方法预测的身体地标的结构信息来用语义来裁剪更准确的区域区域。 为了在没有基于学习的强预测器的情况下定位语义分区。
  3. 利用骨架关键点定位。

二. 论文解读(Learning Discriminative Features with Multiple Granularities for Person Re-Identification)

Learning Discriminative Features with Multiple Granularities for Person Re-Identification(MGN)这篇论文可以说是基于局部特征方向现阶段取得的最好结果。这篇论文短小精悍。下面是网络的结构图。
如图所示,结构总共分成三个分支。第一个分支负责整张图片的全局信息提取,第二个分支会将图片分为上下两个部分提取中粒度的语意信息,第三个分支会将图片分为上中下三个部分提取更细粒度的信息。并且第一分支比二三分支多了下采样。
总结起来全文内容最重要的两点是:

  1. Triplet loss 要用全局特征。如果用局部特征。一张图片分成上到下两部分的时候,最完美当然是上部分是上半身,下部分是下半身。但在实际的场景中,有可能整个人都在上半部分,下半部分全是背景。这种情况用上、下部分来区分,假设下半部分都是背景,把这个背景放到Triplet loss三元损失去算loss,会学到莫名其弥的特征。
  2. 对2048维做softmax loss,对256维做Triplet loss。文中有这么一段解释:

This setting is inspired from coarse-to- fine mechanism, regarding non-reduced features as coarse informa tion to learn classification and reduced features as fine information with learned metric. The proposed setting achieves robust convergence comparing to that of imposing joint effects at the same level of reduced features. Besides, we employ no triplet loss on local features. Due to misalignment or other issues, the contents of local regions might vary dramatically, which makes the triplet loss tend to corrupt the model during training.
也就是说2048维特征是粗糙信息适合学习分类(softmax loss)。而256维特征是细微信息适合进行矩阵学习(Triplet loss)。
【深度学习笔记2】——行人重识别之局部特征与深度学习小经验_第1张图片

三. 论文解读(Human Semantic Parsing for Person Re-identification)

传统的过程是经过backbone,提取GAP后的特征进行检索,如图中中间分支。
SPReID,是上分支和下分支的结合。上分支最终提取较大的特征图,下分支是人体语义分割网络,提取5个语义信息的特征概率图(前景,头,上肢,下肢,鞋子)。将上分支的全部特征和下分支的各个概率图进行加权求和(2048个通道和1个通道特征概率图的prod)。考虑到特征维度爆炸(2048*5),作者对除了前景部分的4个2048-D向量做一个element-wise的max操作,最终得到了一个2048-D矢量。然后和前景特征concact,前景的特征再加上上图中GAP产生的2048-D矢量,总共3x2048的特征被用于分类(训练)和特征检索(测试)。
【深度学习笔记2】——行人重识别之局部特征与深度学习小经验_第2张图片其中值得注意点还有这个Bilinear Interpolation(双线性插值)。双线性插值其实是既可以放大也可以对图片进行缩小这和字面上的理解有所不同。双线性插值其实与下采样,上采样没有多大区别,只不过采样可以指定不同类别的插值的类型。这里值得关注的一点是双线性池化的概念。比如这一篇论文
(Part-Aligned Bilinear Representations for Person Re-identification)发表在ECCV 2018上
【深度学习笔记2】——行人重识别之局部特征与深度学习小经验_第3张图片
我们再与图像分类的论文(Bilinear CNN models for fine-grained visual recognition)进行对比:
【深度学习笔记2】——行人重识别之局部特征与深度学习小经验_第4张图片
这也太优秀了。图像分类的网络可以完美迁移到ReID任务中,并且Part Aligned 这篇论文点也不低高于90%了。。。双线性池化是个很棒的东西,打开试试用在自己的网络上看看能不能涨点~

四. 论文解读(Person Re-identi cation with Deep Similarity-Guided Graph Neural Network)

解决的问题:现有的人物识别模型主要是独立地估计probe和gallery图像的不同图像对的相似性,而忽略了不同probe-gallery图像对之间的关系信息,这就造成了一些困难样本的相似性估计可能不准确。可以从下图看出d1,d2,d3,d4的信息是相互流通的。

  • 输入:一个probe图像和多个gallery图像

  • 输出:每个probe-gallery图像对的相似性得分
    【深度学习笔记2】——行人重识别之局部特征与深度学习小经验_第5张图片
    如下图(a)所示:1)Siamese-CNN:基于ResNet-50,用于生成probe和gallery图像的特征;2)Subtract:将来自ResNet-50的两个图像的全局平均池化特征图相减;3)Square:将相减后的特征做平方操作;4)BN层:最后经过一个BN层得到probe图像和第i个gallery图像之间差异特征di。
    再经过图(b)进行进一步编码和更新,从di编码得到深度消息ti。ti再通过和不同节点进行信息流通并赋予不同的权重W得到更新后的节点di+1。详细的大家看论文哦,思路很简单。大佬们也可以在这篇的基础上融入新的提取特征的方法呀,又又又可以发paper了。。。
    【深度学习笔记2】——行人重识别之局部特征与深度学习小经验_第6张图片

五. FC和GAP的区别

看reid的论文会发现,作者一般都会提一句话:为了使得能够任意图片大小输入,我们增设了全局平均池化层(GAP)。那为什么全局平均池化可以代替FC呢?全连接层有一个非常致命的弱点就是参数量过大,特别是与最后一个卷积层相连的全连接层。比如,第一个全连接层FC1有4096个节点,上一层feature map是7X7X512 = 25088个节点,则该传输需要4096*25088个权值,需要耗很大的内存。
【深度学习笔记2】——行人重识别之局部特征与深度学习小经验_第7张图片
这两者合二为一的过程我们可以探索到GAP的真正意义是:对整个网路在结构上做正则化防止过拟合。其直接剔除了全连接层中黑箱的特征,直接赋予了每个channel实际的类别意义。做法是在最后卷积层输出多少类别就多少map,然后直接分别对map进行平均值计算得到结果最后用softmax进行分类。
pytorch代码是:

model.avgpool = nn.AdaptiveAvgPool2d(1)

nn.AdaptiveAvgPool2d参数一般都设成1,这样连FC都不用接啦,也有很多论文是设置成指定大小,后面再接一个FC也是可以呢。但GAP的优点就在于,你无须管输入图像的大小,只需要通过GAP变成指定大小与FC相连即可。比如下面这种错误出现的原因就是因为fc层weight参数维数与输入图像的维数不匹配,
“RuntimeError: size mismatch, m1: [1 x 7744], m2: [400 x 120]” in the convolutional layer . 要解决这种问题有两种办法。1.在FC层前加上GAP变成之前网络FC层前feature map大小。2.改成原来网络的大小吧,哈哈哈哈。

参考文献

https://www.jianshu.com/p/46a7670be6c5
https://blog.csdn.net/wxf19940618/article/details/83614932
https://blog.csdn.net/touch_dream/article/details/79775786


Shuting He, master student

Foresight Control Center

College of Control Science & Engineering

Zhejiang University

Email: [email protected]

你可能感兴趣的:(【深度学习笔记2】——行人重识别之局部特征与深度学习小经验)