当前位置: 代码迷 >> 综合 >> 关于行人重识别方法PCB《Beyond Part Models: Person Retrieval with Refined Part Pooling 》及代码实现解读
  详细解决方案

关于行人重识别方法PCB《Beyond Part Models: Person Retrieval with Refined Part Pooling 》及代码实现解读

热度:6   发布时间:2024-01-06 13:05:56.0

论文地址:https://arxiv.org/abs/1711.09349
代码地址:code

什么是行人重识别(ReID)

行人重识别(Person re-identification)也称行人再识别,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术。广泛被认为是一个图像检索的子问题。 给定一个监控行人图像,检索跨设备下的该行人图像。旨在弥补目前固定的摄像头的视觉局限,并可与行人检测/行人跟踪技术相结合 ,可广泛应用于智能视频监控、智能安保等领域。

如下图,给定一个行人图或行人视频作为查询query,在大规模底库中找出与其最相近的同一ID的行人图或行人视频。
在这里插入图片描述

ReID任务描述

ReID任务一般包括两个部分:

  1. 特征工程,设计网络来学习不同场景下都general的visual feature,用probe-gallery的特征相关性来作为ranking的依据,一般直接Softmax分类。
  2. 、度量学习,设计损失函数,用多张图像的label来约束它们特征之间的关系,使学到的特征尽量类内间隔短,类间间隔大。

Beyond Part Models: Person Retrieval with Refined Part Pooling是清华大学孙奕帆于ECCV2018发表的一篇文章

摘要

论文包括两个部分:(1)

  1. 一个Part-based的Part-based Convolutional Baseline (PCB)框架,融合了水平切块的局部特征来得到一个强大的ReID特征;
  2. 一个refined part pooling (RPP) 方法,RPP会对水平切块边缘处的网格像素进行重新调整,将它们修正到正确的part分区。RPP可以理解为是一种注意力机制。

最终PCB+RPP不用任何re-ranking的方式来提点,在Market1501上可以达到93.8%的rank-1,是个很高的结果。
在这里插入图片描述

PCB框架流程:

  1. 对输入384128行人图提取深度特征(ResNet50),把最后一个block( averagepooling前)的下采样层丢弃掉,得到空间大小 248*2048的 tensor T。
  2. 按照水平方向分成均匀分成6parts,即6个空间大小 482048 tensor,然后各自进行 average pooling,得到6个column vectors g。
  3. 使用1*1卷积对g降维通道数,然后接6个FC层(权值不共享),Softmax进行分类。
  4. 训练时等于有 6个cross-entropy loss;测试时则将 6个 vectors h 合并在一起,再算相似度。

RPP(Refined Part Pooling)

在这里插入图片描述
为了了搞懂RPP,我们先定义一个术语——列向量。直观一点,列向量是指上图中每一个小网格的特征向量,即总共有24×8个列向量。接下来我们要调整每个列向量的part归属,假设某个列向量为f,我们要判断f要属于哪个水平块Pi
在这里插入图片描述
如上图所示,RPP思路:

  1. 把深度特征tensor T 中每个column vectors f 都分为6类(假设共有6个parts),文中是通过线性函数加Softmax来实现(其实就类似用1*1卷积来作segmentation一样。即最后对于所有的f,我们构造六个概率图(或者理解为mask、attention图都行),分别代表每个像素属于第i个part的概率。实现方式为在最后一层的特征图T后面接一个Conv2d得到一个6通道的张量,然后在最后在针对channel维度做softmax。
    在这里插入图片描述
    在这里插入图片描述
  2. 把每个part对应的attention map 权值叠加回 tensor T 里(即上图的 GAP过程),得到各 part 的spatial 空间压缩后的 feature vector g ~ 后续步骤都和PCB一样~
  3. 得到了概率图之后,再和原始的的特征进行相乘便可以得到最终refine之后的特征。现在的问题是如何训练这个新的Conv2d层来得到合适的概率图。这个卷积层是随机初始化的,要怎么才可以得到和PCB一样差不多的水平切块的概率图。论文提出的方式是先训练一个PCB网络,然后固定住除这个Conv2d层以外的所有层。因为PCB的概率图是人工切分的,所以用训练好的PCB去引导这个Conv2d层的训练,最后训练得到的概率图和水平切块的方式不会差太多,但是会微调一点点。

代码实现:

代码解读见下篇代码解读

参考资料:知乎–罗浩

  相关解决方案