行人重识别 PCB-RPP,SGGNN

SIGAI推荐

为了帮助大家更好地理解当前基于深度学习的相关算法原理和实现细节,SIGAI邀请了目标检测领域的资深专家谭博士为你全面、系统地讲述通用目标检测一系列算法的原理以及编码实现中的细节与技巧,避免实现论文的算法时采坑。

(苹果手机用户请直接登录www.sigai.cn操作 )

YOLOv3算法是对YOLOv1和YOLOv2的增强版本,讲者认为该方法是目前最好的One-stage的方法之一,该方法主要对以下改进,使用多个独立的logisitc分类器做二分类,好处是可以处理重叠的多标签问题;借鉴FPN的思路,YOLOv3在多个不同的尺度的特征图上做预测;讲者将这些关键改进进行了详细的解读,帮助大家快速理解掌握核心要点。

SIGAI特约作者

Fisher Yu

CV在读博士

研究方向:情感计算

什么是行人重识别(ReID)

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

ReID(Person Re-identification)任务描述[2]

为什么需要ReID呢?

因为在安防场景下,跟踪一个目标,只靠人脸识别是不够的,在脸部信息丢失时(罪犯有时把脸特意蒙住一大部分,或者离太远了拍不清脸),行人信息就能辅助跟踪识别。

ReID与人脸识别有什么联系和区别?

都是多媒体内容检索,从方法论来说是通用的;但是ReID相比行人更有挑战,跨摄像头场景下复杂姿态,严重遮挡,多变的光照条件等等。

做ReID的话,一般从两方面入手:

A、特征工程,设计网络来学习不同场景下都general的visual feature,用probe-gallery的特征相关性来作为ranking的依据,一般直接Softmax分类。

B、度量学习,设计损失函数,用多张图像的label来约束它们特征之间的关系,使学到的特征尽量类内间隔短,类间间隔大。

PCB-RPP[1],2017

早期比较经典的文章,方法简洁明了。

main contribution:

1. 提出了均匀分块的 Part-based Convolutional Baseline(PCB),探讨了较优的块间组合方式

2. 提出了基于 parts 的 Refined part pooling(RPP),用注意力机制来对齐 parts

PCB框架[1]

如上图所示,PCB框架的流程是:

1、对输入384*128行人图提取深度特征(ResNet50),把最后一个block( averagepooling前)的下采样层丢弃掉,得到空间大小 24*8的 tensor T

2、按照水平方向分成均匀分成6parts,即6个空间大小 4*8 tensor,然后各自进行 average pooling,得到6个column vectors g

3、使用1*1卷积对g降维通道数,然后接6个FC层(权值不共享),Softmax进行分类

4、训练时等于有 6个cross-entropy loss;测试时则将 6个 vectors h 合并在一起,再算相似度

这里有几种组合方式和超参可以探讨:

A、Deep feature的空间维度大小?该分成多少parts?

B、把6个column vector h 先 average pooling 成 1个 vector,再 FC 分类?

C、6个FC层之间的权值是否共享?

作者在文中做了实验来对比结果,找到最优的组合方案~~

至于为什么分part的效果会更好,也是基于行人结构分割的先验知识驱使(类似用Pose key point来做一样)。比如part1,能更有针对性地根据头部信息来分类~~

RPP框架[1]

讲完了PCB,我们来看RPP~

RPP本质上就是个attention module,目标是把6 parts 对应的空间分布进行软权值分配,进而对齐parts(PCB中均匀分割6parts 的过程,其实可看成人为地 hard attention,只把当前part空间权值设为1,其他parts都为0)

如上图所示,RPP思路:

1、把深度特征tensor T 中每个column vectors f 都分为6类(假设共有6个parts),文中是通过线性函数加Softmax来实现(其实就类似用1*1卷积来作segmentation一样)

2、把每个part对应的attention map 权值叠加回 tensor T 里(即上图的 GAP过程),得到各 part 的spatial 空间压缩后的 feature vector g ~ 后续步骤都和PCB一样~

PCB-RPP训练流程:

PCB-RPP训练流程[1]

文中为了保证学到的是part based attention map来对齐parts,故特意在预训练完PCB后,在Step3处先fix住PCB里所有层的参数,单独训练 part classifier。如下图所示,如果不加Step 3的限制,出来的6个attention map 将很随机,性能也会下降。

attention map[1]下图是加了Step3的效果

从实验结果看,加了RPP对MAP提升还是很大的:

Results[1]

总结:

文中PCB的思想虽然简单,但是后续CVPR2018中各种part-based ReID文章(各种 Multi-scale, multi-level part fusion 啥的)提供了参考价值。特别是云从科技的这篇MGN[2],更是将各种粒度的parts 和 triplet loss+ Softmax loss玩得淋漓尽致~

SGGNN [3],ECCV2018

说完了ReID的单张图像part based特征工程,我们来谈谈多张图像输入的 metric learning方法,传统的contrastive loss, triplet loss 和 quadruplet Loss就不介绍了,下面说说基于图模型的 SGGNN。

Similarity-Guided Graph Neural Network (SGGNN) 主要贡献是:

1、网络的输入是probe和多个gallery,通过 GNN 来fuse不同probe-gallery pairs的差异性特征;而不像传统方法probe与每个gallery间都是单独计算 similarity

2、Similarity-Guided。图神经网络中节点与节点间的 edge weights 不是直接通过节点间的非线性函数(无监督) 得到,而是利用gallery的标签,有监督地计算 gallery-gallery similarity得到。

SGGNN整体框架[3]

如上图所示,假定输入是一个probe和四个gallery,首先每对probe-gallery 都经过Siamese-CNN 来计算关系特征di,作为GNN中的节点node;而node间的edge weights可通过 gallery-gallery pair过相同的Siamese-CNN来得到;接着根据图网络中d1,d2,d3,d4及权值关系,来更新节点的关系特征,作为similarity score(即Sigmoid后的二分类)。

那问题来了,如何设计网络来提取di?

又如何设计GNN来更新节点值呢?

节点输入特征生成[3]

如上图所示,提取di很简单,就是把图像对送进参数共享的ResNet50,出来的 deep feature进行 element-wise相减,接着element-wise square然后 BN,得到di;若要继续算图像对similarity的话,后接个FC层然后Sigmoid即可。

节点特征更新[3]

上图所示,目标就是更新di特征。虽然不太懂为啥专门用2个FC层搞了个message network 来映射di到ti,文中说这样可以增强节点间流动的信息,但估计增加不少运量和额外参数。Anyway我们已经得到了各个节点增强后的message+各个edge weights+原始的di特征,按照下面的公式更新di特征即可:

至此,整个网络就可以端到端地去训练了,通过probe-gallery label 的 cross-entropy loss引导di更新,又通过gallery-gallery label 的 cross-entropy loss引导 edge weights 更新(后者不确定是否一定需要,文中也没细讲)。

关于利用gallery-gallery相似分值来引导改善probe-gallery关系特征,文中举了一个类似metric learning的例子很有趣:给定 probe p 和 gallery gi 和 gj,假定 (p, gi) 是 hard positive pair node,而 (p, gj) 和 (gi, gj) 都是相对 easy positive pairs node。如果节点间没有信息流动,(p, gi)的相似分值不可能很高。但如果使用 (gi, gj) 相似度来引导更新(p, gi)的关系特征,那么(p, gi)的相似分值可能会高。

从实验结果看,使用Similarity-guided确实对性能提升很大:

results[3]

总结与展望:

SGGNN使用gallery-gallery引导多个probe-gallery进行特征融合,确实能让网络学到更discriminant特征。哈哈,估计有人会想把PCB中Part based feature和SGGNN融合起来用了,或者把parts当成节点来用了~~

原文发布于微信公众号 - SigAI(SIGAICN)

原文发表时间:2018-10-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏算法channel

@all: 新浪 机器学习算法岗 面试实录

二面面试官来了。是个算法大佬。是个专门做算法的。直接手出题,他说时间不多,就让我说思路。

20020
来自专栏AI科技评论

干货 | 如何理解深度学习分布式训练中的large batch size与learning rate的关系?

问题详情: 在深度学习进行分布式训练时,常常采用同步数据并行的方式,也就是采用大的batch size进行训练,但large batch一般较于小的baseli...

87890
来自专栏AI研习社

用 TensorFlow 让你的机器人唱首原创给你听

AI 研习社按:这篇文章会用一个简单的模型在 TensorFlow 上来实现一个音频生成器,GitHub 代码链接详见文末“阅读原文”。原文作者杨熹,载于作者的...

35990
来自专栏月色的自留地

从锅炉工到AI专家(6)

16980
来自专栏AI研习社

CNN+TensorFlow 就能教机器人作曲!

今天想来看看 AI 是怎样作曲的。 本文会用 TensorFlow 来写一个音乐生成器。 当你对一个机器人说:我想要一种能够表达出希望和奇迹的歌曲时,发生了什么...

50670
来自专栏AI研习社

Kaggle 比赛冠军经验分享:如何用 RNN 预测维基百科网络流量

最近在 Kaggle 上有一场关于网络流量预测的比赛(http://t.cn/RKRix7E)落下帷幕,作为领域里最具挑战性的问题之一,这场比赛得到了广泛关注。...

47560
来自专栏机器学习算法工程师

【TPAMI重磅综述】 SIFT与CNN的碰撞:万字长文回顾图像检索任务十年探索历程(下篇)

本文是《SIFT Meets CNN: A Decade Survey of Instance Retrieval》的下篇。在上 篇中概述了图像检索任务极其发...

20730
来自专栏IT派

PyTorch实例:用ResNet进行交通标志分类

【导读】本文是机器学习工程师Pavel Surmenok撰写的一篇技术博客,用Pytorch实现ResNet网络,并用德国交通标志识别基准数据集进行实验。文中分...

2.9K00
来自专栏AI科技评论

学界 | 百度联合英伟达发布最新论文:使深度学习效率事半功倍的混合精度训练

AI科技评论消息: 在10月10日-11日在加拿大蒙特利尔召开的Rework Deep Learning Summit会议上,百度高级研究员Greg Diamo...

38680
来自专栏目标检测和深度学习

CVPR2018 | CMU&谷歌Spotlight论文:超越卷积的视觉推理框架

选自arXiv 作者:陈鑫磊等 机器之心编译 参与:张倩、李泽南 人类在看到图像时可以进行合理的推理与预测,而目前的神经网络系统却还难以做到。近日,来自卡耐基梅...

31160

扫码关注云+社区

领取腾讯云代金券