行人重识别

在人的感知系统所获得的信息中,视觉信息大约占到80%~85%。行人重识别(person re-identification)是近几年智能视频分析领域兴起的一项新技术,属于在复杂视频环境下的图像处理和分析范畴,是许多监控和安防应用中的主要任务,并且在计算机视觉领域获得了越来越多的关注。下面我们就仔细来聊聊行人重识别(ReID)。

1.什么是行人重识别

行人重识别(Person Re-identification也称行人再识别,简称为ReID,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术;或者说,行人重识别是指在已有的可能来源与非重叠摄像机视域的视频序列中识别出目标行人。广泛被认为是一个图像检索的子问题。给定一个监控行人图像,检索跨设备下的该行人图像。在监控视频中,由于相机分辨率和拍摄角度的缘故,通常无法得到质量非常高的人脸图片。当人脸识别失效的情况下,ReID就成为了一个非常重要的替代品技术。ReID有一个非常重要的特性就是跨摄像头,所以学术论文里评价性能的时候,是要检索出不同摄像头下的相同行人图片。ReID已经在学术界研究多年,但直到最近几年随着深度学习的发展,才取得了非常巨大的突破。

2.行人重识别研究的背景、意义及现状

我们先以一个小故事来说明一下:荷马史诗 (Odyssey iv:412),Mennelaus 被告知,如果想要众神息怒并平安回家,就要在特洛伊战争的回家路上抓到 Proteus,让他告诉自己躲避的方法。虽然Proteus变成了狮子,巨蛇,豹,甚至水和大树,Mennelaus最终还是在海边的海豹群中抓住了他,并知晓了自己平安回家的方法。这大概是最早的重识别的成功案例。
相对于行人检测来说,行人重识别的研究还不算成熟,但早在1996年,就有学者关注行人重识别问题,在2006年,行人重识别的概念第一次在CVPR上提出后,相关的研究不断涌现。2007年Gray提出一个对于行人重识别的研究具有重大意义的数据库VIPeR。此后越来越多的学者开始关注行人重识别的研究。图1是ReID从1997年到2016年间几个里程碑的发展事件。

图1 近些年,每年在国际顶级的会议以及顶级期刊上关于行人重识别的工作不在少数。2012年,第一个行人重识别研讨会在ECCV会议上召开;2013年,Gong等出版第一本行人重识别的专著;2014年后,深度学习被应用到行人重识别领域;2016年,行人重识别迎来井喷式的增长,在各大计算机视觉的会议中出现了几十篇相关论文,尤其是基于深度神经网络的方法引起了广泛的关注;图2是2008年到2016年间CV三大顶会的ReID论文接受情况;同时,相关数据集在不断地扩充,在各个数据集上的结果也获得很大的提升,到目前,行人重识别问题已成为计算机视觉的一个热点问题。

图2 传统的行人重识别从特征提取和距离度量学习两个方面进行研究。2014年后,越来越多的研究者尝试将行人重识别的研究与深度学习结合在一起,深度学习不仅应用于提取高层特征,也为度量学习的研究带来了革新。即使深度学习在规模较小的数据集上的结果没有很明显的提升,但随着研究方法的成熟以及较大规模的数据集的出现,深度学习在行人重识别领域越来越受研究者们青睐。行人重识别最开始是在基于图片的情况下,即在每个数据集中每个摄像机视角下只有一幅或者几幅行人图像。但是视频相较于图像而言拥有更多信息,并且基于视频的研究更符合视频监控环境下的现实情况,因此我们很自然地考虑处理基于视频的行人重识别问题。从2010年后,很多学者开始对基于视频的行人重识别进行研究

3.行人重识别的应用和目前存在的问题

3.1 图3是ReID在显示场景中的几个例子。

图3 行人重识别的研究面临着诸如图像分辨率低、视角变化、姿态变化、光线变化以及遮挡等带来的诸多挑战。比如,1)监控视频的画面一般比较模糊,分辨率也比较低,如图4(a)所示,所以利用人脸识别等方式无法进行重识别的工作,只能利用头部之外的人体外观信息进行识别,而不同行人的体型和衣着服饰有可能相同,这为行人重识别的准确度带来了极大的挑战;此外实际视频监控下的场景非常复杂,周边杂物较多,场景复杂,画面很容易出现遮挡等情况,如图4(b), 这种时候靠步态等特征就很难进行重识别。行人重识别的图像往往采自于不同的摄像机,由于拍摄场景、摄像参数不同,行人重识别工作一般存在光照变化及视角变化等问题,如图4(c)、(d)所示,这导致同一个行人在不同摄像机下存在较大的差异,不同行人的外貌特征可能比同一个人的外貌特征更相似;进行重识别的行人图像可能拍摄于不同的时间,行人姿态、衣着会有不同程度的改变。此外在不同的光照条件下,行人的外观特征也会有很大的差异,如图4(e)。以上情况都给行人重识别的研究带来了巨大的挑战,因此目前的研究距离实际应用层面还有很大的距离。

图4 除了以上的问题还存在着无正脸照、配饰、服装搭配、穿衣风格以及由于不同的数据集之间存在着域的偏移问题,使得在源数据集下训练的模型在目标数据集下很难取得好的性能,泛化性能不强。

3.2 由于存在这上述的问题那么我们是否可以考虑从其他方向来ReID

1. 能不能用人脸识别做重识别? 理论上是可以的。但是有两个原因导致人脸识别较难应用:首先,广泛存在后脑勺和侧脸的情况,做正脸的人脸识别难。其次,摄像头拍摄的像素可能不高,尤其是远景摄像头里面人脸截出来很可能都没有32x32的像素。所以人脸识别在实际的重识别应用中很可能有限。

2. 有些人靠衣服的颜色就可以判断出来了,还需要行人重识别么? 衣服颜色确实是行人重识别 做出判断一个重要因素,但光靠颜色是不足的。首先,摄像头之间是有色差,并且会有光照的影响。其次,有撞衫(颜色相似)的人怎么办,要找细节,但比如颜色直方图这种统计的特征就把细节给忽略了。在多个数据集上的测试表明,光用颜色特征是难以达到50%的top1正确率的。

3. 使用图像检索的指标来衡量行人重识别的结果是否合适? 在早期,行人重识别数据集是由两个摄像头采集的比如viper,每个query只有一个正确的retrieval目标。所以往往使用top1比较。但在近期,随着大数据集的提出,数据集中往往包含多个摄像头的多个正确目标。光使用top1的话,不能反应模型的真实能力。所以类似图像检索,重识别加入了mAP作为衡量标准,将top2,top3...topn都考虑进去。

4.行人重识别目前所采用的方法

行人重识别算法我们将从以下五各方面来叙述:
①基于表征学习的ReID方法: 基于表征学习(Representation learning)的方法是一类非常常用的行人重识别方法。这主要得益于深度学习,尤其是卷积神经网络(Convolutional neural network, CNN)的快速发展。由于CNN可以自动从原始的图像数据中根据任务需求自动提取出表征特征(Representation),所以有些研究者把行人重识别问题看做分类(Classification/Identification)问题或者验证(Verification)问题:
(1)分类问题是指利用行人的ID或者属性等作为训练标签来训练模型;(2)验证问题是指输入一对(两张)行人图片,让网络来学习这两张图片是否属于同一个行人。
利用Classification/Identification loss和verification loss来训练网络,其网络示意图如下图5所示。网络输入为若干对行人图片,包括分类子网络(Classification Subnet)和验证子网络(Verification Subnet)。分类子网络对图片进行ID预测,根据预测的ID来计算分类误差损失。验证子网络融合两张图片的特征,判断这两张图片是否属于同一个行人,该子网络实质上等于一个二分类网络。经过足够数据的训练,再次输入一张测试图片,网络将自动提取出一个特征,这个特征用于行人重识别任务。

图5 但是也有论文认为光靠行人的ID信息不足以学习出一个泛化能力足够强的模型。在这些工作中,它们额外标注了行人图片的属性特征,例如性别、头发、衣着等属性。通过引入行人属性标签,模型不但要准确地预测出行人ID,还要预测出各项正确的行人属性,这大大增加了模型的泛化能力,多数论文也显示这种方法是有效的。

基于特征表示的方法重点在于设计鲁棒可靠的行人图像特征表示模型,即能够区分不同行人,同时能够不受光照和视角变化的影响,将其主要分为以下几类进行介绍, 典型特征总结见表1。 表1

1)底层视觉特征:这种方法基本上都是将图像划分成多个区域,对每个区域提取多种不同的底层视觉特征,组合后得到鲁棒性更好的特征表示形式。最常用的就是颜色直方图,多数情况下行人的衣服颜色结构简单,因此颜色表示是有效的特征,通常用RGB、HSV直方图表示。把RGB空间的图像转化成HSL和YCbCr颜色空间,观察对数颜色空间中目标像素值的分布,颜色特征在不同光照或角度等行人识别的不适环境中具有一定的不变性。以及局部特征,如局部不变特征–尺度不变特征变换(scale-invariant feature transform,SIFT),SURF和Covariance描述子ELF(ensemble of localized features)方法中,结合RGB、YCbCr、HS颜色空间的颜色直方图,具有旋转不变性的Schmid和Gabor滤波器计算纹理直方图。还有纹理特征、Haar-like Represention、局部二值模式(LBP)、Gabor滤波器、共生矩阵(Co-occurrence Matrics)。

2)中层语义属性:可以通过语义信息来判断两张图像中是否属于同一行人,比如颜色、衣服以及携带的包等信息。相同的行人在不同视频拍摄下,语义属性很少变化。有的采用15种语义来描述行人,包括鞋子、头发颜色长短、是否携带物品等,分类器用SVM定义每幅行人图像的以上语义属性。结合语义属性重要性加权以及与底层特征融合,最终描述行人图像。对图像超像素划分,最近分割算法对图像块定义多种特征属性,颜色、位置和SIFT特征,效果有提高。

3)高级视觉特征:特征的选择技术对行人再识别的识别率的性能进行提升,如Fisher向量[编码;提取颜色或纹理直方图,预先定义块或条纹形状的图像区域;或者编码区域特征描述符来建立高级视觉特征。用某种描述符对密集轨迹、纹理、直方图进行编码,突出重要信息。受到多视角行为识别研究和Fisher向量编码的影响,一种捕获软矩阵的方法,即DynFV(dynamic fisher vector)特征和捕获步态和移动轨迹的Fisher向量编码的密集短轨迹时间金字塔特征被提出。Fisher向量编码方法是首先用来解决大尺度图像分类的方法,也能改善行为识别的性能。有的对行人的每个图像分成6个水平条带,在每个条带上计算纹理和颜色直方图。在YCbCr、HSV、白化的RGB颜色空间计算直方图建立颜色描述符,并用local fisher disrciminant analysis(LFDA)降维。学习出的矩阵把特征转换到新的空间,LFDA能在嵌入过程中使特征的局部结构适用于图像遮挡,背景变化和光照变化的情况,最后把计算变换空间中的特征向量的均值作为这个行人最终的特征向量表示。T. Matsukawa提出GOG(Gaussian Of Gaussian),把一幅图像分成水平条带和局部块,每个条带用一个高斯分布建模。每个条带看作一系列这样的高斯分布,然后用一个单一的高斯分布总体表示。GOG特征提取的方法好表现在用像素级特征的一个局部高斯分布来描述全局颜色和纹理分布,并且GOG是局部颜色和纹理结构的分层模型,可以从一个人的衣服的某些部分得到。此外,深度学习也被应用于行人重识别的特征提取中,在AlexNet-Finetune中,开始在ImageNet数据集上预训练的基于AlexNet结构的CNN,并用这个数据集对数据进行微调。在微调过程中,不修改卷积层的权重,训练后两个全连接层。McLaughlin等采用了类似的方法,对图像提取颜色和光流特征,采用卷积神经网络(CNN)处理得到高层表征,然后用循环神经网络(RNN)捕捉时间信息,然后池化得到序列特征。T对来自各个领域的数据训练出同一个卷积神经网络(CNN),有些神经元学习各个领域共享的表征,而其他的神经元对特定的某个区域有效,得到鲁棒的CNN特征表示。

②基于度量学习的ReID方法:度量学习(Metric learning)是广泛用于图像检索领域的一种方法。不同于特征学习,度量学习旨在通过网络学习出两张图片的相似度。在行人重识别问题上,具体为同一行人的不同图片相似度大于不同行人的不同图片。最后网络的损失函数使得相同行人图片(正样本对)的距离尽可能小,不同行人图片(负样本对)的距离尽可能大。常用的度量学习损失方法有对比损失(Contrastive loss)三元组损失(Triplet loss)、 四元组损失(Quadruplet loss)难样本采样三元组损失(Triplet hard loss with batch hard mining, TriHard loss)

首先,假如有两张输入图片${I_1}$和${I_2}$,通过网络我们可以得到他们的特征${f_{{I_1}}}$和${f_{{I_2}}}$。我们定义这两张图片特征向量的欧式距离为:$${d_{{I_1},{I_2}}} = {\left\| {{f_{{I_1}}} - {f_{{I_1}}}} \right\|2}$$ 1)对比损失(Contrastive loss)
对比损失用于训练孪生网络(Siamese network),其结构图如上图6所示。孪生网络的输入为一对(两张)图片${x_1}$和${x_2}$,这两张图片可以为同一行人,也可以为不同行人。每一对训练图片都有一个标签 $y$,其中$y = 1$,表示两张图片属于同一个行人(正样本对),反之$y = 0$表示它们属于不同行人(负样本对)。之后,对比损失函数写作:$${L_c} = yE_w^2 + (1 - y)(\alpha - {E_w}) + ^2$$,其中$${E_w} = \left\| {{G_w}({x_1}) - {G_w}({x_2})} \right\|$$

图6

其中${(z) + }$表示$\max (z,0)$, $\alpha$是根据实际需求设计的阈值参数。为了最小化损失函数,当网络输入一对正样本对,${E_w}$会逐渐变小,即相同ID的行人图片会逐渐在特征空间形成聚类。反之,当网络输入一对负样本对时,${E_w}$ 会逐渐变大直到超过设定的$\alpha$,通过最小化${L_c}$,最后可以使得正样本对之间的距离逐渐变小,负样本对之间的距离逐渐变大,从而满足行人重识别任务的需要。
(2)三元组损失(Triplet loss):三元组损失是一种被广泛应用的度量学习损失,之后的大量度量学习方法也是基于三元组损失演变而来。顾名思义,三元组损失需要三张输入图片。和对比损失不同,一个输入的三元组(Triplet)包括一对正样本对和一对负样本对。三张图片分别命名为固定图片(Anchor) $a$,正样本图片(Positive)$p$和负样本图片(Negative)$n$。图片$a$ 和图片 $p$ 为一对正样本对,图片$a$ 和图片$n$ 为一对负样本对。则三元组损失表示为:$${L_t}{\rm{ = (}}{{\rm{d}}{a,p}}{\rm{ - }}{{\rm{d}}{a,n}}{\rm{ + }}\alpha {{\rm{)}} + }$$如下图7所示,三元组可以拉近正样本对之间的距离,推开负样本对之间的距离,最后使得相同ID的行人图片在特征空间里形成聚类,达到行人重识别的目的。

图7 原版的Triplet loss只考虑正负样本对之间的相对距离,而并没有考虑正样本对之间的绝对距离,为此提出改进三元组损失(Improved triplet loss):

$${L_t}{\rm{t = }}{{\rm{d}}{a,p}} + {{\rm{(}}{{\rm{d}}{a,p}}{\rm{ - }}{{\rm{d}}{a,n}}{\rm{ + }}\alpha {\rm{)}} + }$$公式添加${{\rm{d}}{a,p}}$$项,保证网络不仅能够在特征空间把正负样本推开,也能保证正样本对之间的距离很近。
(3) 四元组损失(Quadruplet loss):四元组损失是三元组损失的另一个改进版本。顾名思义,四元组(Quadruplet)需要四张输入图片,和三元组不同的是多了一张负样本图片。即四张图片为固定图片(Anchor) $a$,正样本图片(Positive) $p$ ,负样本图片1(Negative1) $n1$ 和负样本图片2(Negative2) $n2$ 。其中 $n1$和$n2$ 是两张不同行人ID的图片,其结构则四元组损失表示为:$$q{\rm{ = (}}{{\rm{d}}{a,p}} - {{\rm{d}}{a,{n_1}}}{\rm{ + }}\alpha {{\rm{)}} + } + {{\rm{(}}{{\rm{d}}{a,p}} - {{\rm{d}}{a,{n_2}}}{\rm{ + }}\beta {\rm{)}} + }$$其中 $\alpha$ 和 $\beta$ 是手动设置的正常数,通常设置 $\beta$ 小于$ \alpha$ ,前一项称为强推动,后一项称为弱推动。相比于三元组损失只考虑正负样本间的相对距离,四元组添加的第二项不共享ID,所以考虑的是正负样本间的绝对距离。因此,四元组损失通常能让模型学习到更好的表征。
(4)难样本采样三元组损失(Triplet loss with batch hard mining, TriHard loss):难样采样三元组损失(本文之后用TriHard损失表示)是三元组损失的改进版。传统的三元组随机从训练数据中抽样三张图片,这样的做法虽然比较简单,但是抽样出来的大部分都是简单易区分的样本对。如果大量训练的样本对都是简单的样本对,那么这是不利于网络学习到更好的表征。大量论文发现用更难的样本去训练网络能够提高网络的泛化能力,而采样难样本对的方法很多。之前提出了一种基于训练批量(Batch)的在线难样本采样方法——TriHard Loss。TriHard损失的核心思想是:对于每一个训练batch,随机挑选 $P$ 个ID的行人,每个行人随机挑选 $K$ 张不同的图片,即一个batch含有 $P \times K$ 张图片。之后对于batch中的每一张图片 $a$ ,我们可以挑选一个最难的正样本和一个最难的负样本和 $a$ 组成一个三元组。首先我们定义和 $a$ 为相同ID的图片集为$A$ ,剩下不同ID的图片图片集为 $B$,则TriHard损失表示为:$${L{th}} = {1 \over {P \times K}}{\sum\limits_{a \in batch} {(\mathop {\max }\limits_{p \in A} {d_{a,p}} - \mathop {\min }\limits_{n \in B} {d_{a,n}} + \alpha )} _ + }$$其中 $\alpha$ 是人为设定的阈值参数。TriHard损失会计算 $a$ 和batch中的每一张图片在特征空间的欧式距离,然后选出与 $a$ 距离最远(最不像)的正样本 $p$ 和距离最近(最像)的负样本 $n$ 来计算三元组损失。通常TriHard损失效果比传统的三元组损失要好。
③基于局部特征的ReID方法:早期的ReID研究大家还主要关注点在全局的global feature上,就是用整图得到一个特征向量进行图像检索。但是后来大家逐渐发现全局特征遇到了瓶颈,于是开始渐渐研究起局部的local feature。常用的提取局部特征的思路主要有图像切块、利用骨架关键点定位以及姿态矫正等等。(1)图片8切块是一种很常见的提取局部特征方式。如下图所示,图片被垂直等分为若干份,因为垂直切割更符合我们对人体识别的直观感受,所以行人重识别领域很少用到水平切割。

图8 为了解决图像不对齐情况下手动图像切片失效的问题,一些论文利用一些先验知识先将行人进行对齐,这些先验知识主要是预训练的人体姿态(Pose)和骨架关键点(Skeleton) 模型。论文先用姿态估计的模型估计出行人的关键点,然后用仿射变换使得相同的关键点对齐。如下图9所示,一个行人通常被分为14个关键点,这14个关键点把人体结果分为若干个区域。为了提取不同尺度上的局部特征,作者设定了三个不同的PoseBox组合。之后这三个PoseBox矫正后的图片和原始为矫正的图片一起送到网络里去提取特征,这个特征包含了全局信息和局部信息。特别提出,这个仿射变换可以在进入网络之前的预处理中进行,也可以在输入到网络后进行。如果是后者的话需要需要对仿射变换做一个改进,因为传统的仿射变化是不可导的。为了使得网络可以训练,需要引入可导的近似放射变化,在本文中不赘述相关知识。

图9(3)CVPR2017的工作Spindle Net也利用了14个人体关键点来提取局部特征。和论文(1)不同的是,Spindle Net并没有用仿射变换来对齐局部图像区域,而是直接利用这些关键点来抠出感兴趣区域(Region of interest, ROI)。Spindle Net网络如下图10所示,首先通过骨架关键点提取的网络提取14个人体关键点,之后利用这些关键点提取7个人体结构ROI。网络中所有提取特征的CNN(橙色表示)参数都是共享的,这个CNN分成了线性的三个子网络FEN-C1、FEN-C2、FEN-C3。对于输入的一张行人图片,有一个预训练好的骨架关键点提取CNN(蓝色表示)来获得14个人体关键点,从而得到7个ROI区域,其中包括三个大区域(头、上身、下身)和四个四肢小区域。这7个ROI区域和原始图片进入同一个CNN网络提取特征。原始图片经过完整的CNN得到一个全局特征。三个大区域经过FEN-C2和FEN-C3子网络得到三个局部特征。四个四肢区域经过FEN-C3子网络得到四个局部特征。之后这8个特征按照图示的方式在不同的尺度进行联结,最终得到一个融合全局特征和多个尺度局部特征的行人重识别特征。

图10(4)图11提出了一种全局-局部对齐特征描述子(Global-Local-Alignment Descriptor, GLAD),来解决行人姿态变化的问题。与Spindle Net类似,GLAD利用提取的人体关键点把图片分为头部、上身和下身三个部分。之后将整图和三个局部图片一起输入到一个参数共享CNN网络中,最后提取的特征融合了全局和局部的特征。为了适应不同分辨率大小的图片输入,网络利用全局平均池化(Global average pooling, GAP)来提取各自的特征。和Spindle Net略微不同的是四个输入图片各自计算对应的损失,而不是融合为一个特征计算一个总的损失。

图11(5)以上所有的局部特征对齐方法都需要一个额外的骨架关键点或者姿态估计的模型。而训练一个可以达到实用程度的模型需要收集足够多的训练数据,这个代价是非常大的。为了解决以上问题,AlignedReID提出基于SP距离的自动对齐模型如图12,在不需要额外信息的情况下来自动对齐局部特征。而采用的方法就是动态对齐算法,或者也叫最短路径距离。这个最短距离就是自动计算出的local distance。

图12 较新的可以看看PCB和EAnet

④基于视频序列的ReID方法:目前单帧的ReID研究还是主流,因为相对来说数据集比较小,哪怕一个单GPU的PC做一次实验也不会花太长时间。但是通常单帧图像的信息是有限的,因此有很多工作集中在利用视频序列来进行行人重识别方法的研究。基于视频序列的方法最主要的不同点就是这类方法不仅考虑了图像的内容信息,还考虑了帧与帧之间的运动信息等。

基于单帧图像的方法主要思想是利用CNN来提取图像的空间特征,而基于视频序列的方法主要思想是利用CNN 来提取空间特征的同时利用递归循环网络(Recurrent neural networks, RNN)来提取时序特征。13图是非常典型的思路,网络输入为图像序列。每张图像都经过一个共享的CNN提取出图像空间内容特征,之后这些特征向量被输入到一个RNN网络去提取最终的特征。最终的特征融合了单帧图像的内容特征和帧与帧之间的运动特征。而这个特征用于代替前面单帧方法的图像特征来训练网络。

图13 视频序列类的代表方法之一是累计运动背景网络(Accumulative motion context network, AMOC)。AMOC输入的包括原始的图像序列和提取的光流序列。通常提取光流信息需要用到传统的光流提取算法,但是这些算法计算耗时,并且无法与深度学习网络兼容。为了能够得到一个自动提取光流的网络,作者首先训练了一个运动信息网络(Motion network, Moti Nets)。这个运动网络输入为原始的图像序列,标签为传统方法提取的光流序列。如图14所示,原始的图像序列显示在第一排,提取的光流序列显示在第二排。网络有三个光流预测的输出,分别为Pred1,Pred2,Pred3,这三个输出能够预测三个不同尺度的光流图。最后网络融合了三个尺度上的光流预测输出来得到最终光流图,预测的光流序列在第三排显示。通过最小化预测光流图和提取光流图的误差,网络能够提取出较准确的运动特征。

图14

AMOC的核心思想在于网络除了要提取序列图像的特征,还要提取运动光流的运动特征。AMOC拥有空间信息网络(Spatial network, Spat Nets)和运动信息网络两个子网络。图像序列的每一帧图像都被输入到Spat Nets来提取图像的全局内容特征。而相邻的两帧将会送到Moti Nets来提取光流图特征。之后空间特征和光流特征融合后输入到一个RNN来提取时序特征。通过AMOC网络,每个图像序列都能被提取出一个融合了内容信息、运动信息的特征。网络采用了分类损失和对比损失来训练模型。融合了运动信息的序列图像特征能够提高行人重识别的准确度。
论文从另外一个角度展示了多帧序列弥补单帧信息不足的作用,目前大部分video based ReID方法还是不管三七二十一的把序列信息输给网络,让网络去自己学有用的信息,并没有直观的去解释为什么多帧信息有用。则很明确地指出当单帧图像遇到遮挡等情况的时候,可以用多帧的其他信息来弥补,直接诱导网络去对图片进行一个质量判断,降低质量差的帧的重要度。如图15,文章认为在遮挡较严重的情况下,如果用一般的pooling会造成attention map变差,遮挡区域的特征会丢失很多。而利用论文的方法每帧进行一个质量判断,就可以着重考虑那些比较完整的几帧,使得attention map比较完整。而关键的实现就是利用一个pose estimation的网络,论文叫做landmark detector。当landmark不完整的时候就证明存在遮挡,则图片质量就会变差。之后pose feature map和global feature map都同时输入到网络,让网络对每帧进行一个权重判断,给高质量帧打上高权重,然后对feature map进行一个线性叠加。思路比较简单但是还是比较让人信服的。

图15⑤基于局部特征的ReID方法:ReID有一个非常大的问题就是数据获取困难,截止CVPR18 deadline截稿之前,最大的ReID数据集也就小几千个ID,几万张图片(序列假定只算一张)。因此在ICCV17 GAN造图做ReID挖了第一个坑之后,就有大量GAN的工作涌现,尤其是在CVPR18 deadline截稿之后arxiv出现了好几篇很好的paper。

论文是第一篇用GAN做ReID的文章,发表在ICCV17会议,虽然论文比较简单,但是作为挖坑鼻祖引出一系列很好的工作。如下图16,这篇论文生成的图像质量还不是很高,甚至可以用很惨来形容。另外一个问题就是由于图像是随机生成的,也就是说是没有可以标注label可以用。为了解决这个问题,论文提出一个标签平滑的方法。实际操作也很简单,就是把label vector每一个元素的值都取一样,满足加起来为1。反正也看不出属于哪个人,那就一碗水端平。生成的图像作为训练数据加入到训练之中,由于当时的baseline还不像现在这么高,所以效果还挺明显的,至少数据量多了过拟合能避免很多。

图16ReID还有个问题就是数据集存在bias,这个bias很大一部分原因就是环境造成的。为了克服这个bias,使用GAN把一个数据集的行人迁移到另外一个数据集。为了实现这个迁移,GAN的loss稍微设计了一下,一个是前景的绝对误差loss,一个是正常的判别器loss。判别器loss是用来判断生成的图属于哪个域,前景的loss是为了保证行人前景尽可能逼真不变。这个前景mask使用PSPnet来得到的,还有就是提出了一个MSMT17数据集,是个挺大的数据集,已经public出来。

ReID的其中一个难点就是姿态的不同,为了克服这个问题论文使用GAN造出了一系列标准的姿态图片。论文总共提取了8个pose,这个8个pose基本涵盖了各个角度。每一张图片都生成这样标准的8个pose,那么pose不同的问题就解决。最终用这些图片的feature进行一个average pooling得到最终的feature,这个feature融合了各个pose的信息,很好地解决的pose bias问题。无论从生成图还是从实验的结果来看,这个工作都是很不错的。这个工作把single query做成了multi query,但是你没法反驳,因为所有的图都是GAN生成的。除了生成这些图需要额外的时间开销以外,并没有利用额外的数据信息。当然这个工作也需要一个预训练的pose estimation网络来进行pose提取。

5.行人重识别数据集

在行人重识别中所使用到的数据集可以参考Person re-indentification datasets

6.行人重识别的评价指标

Reid论文中常用的评测指标有mAP、CMC、ROC等,下面一一分析。

1.ROC

ROC曲线是检测、分类、识别任务中很常用的一项评价指标。曲线上每个点反映着对同一信号刺激的感受性。具体到识别任务中就是,ROC曲线上的每一点反映的是不同的阈值对应的FP(false positive)和TP(true positive)之间的关系,如图17所示。

图17通常情况下,ROC曲线越靠近(0,1)坐标表示性能越好。

2.CMC

CMC曲线是算一种top-k的击中概率,主要用来评估闭集中rank的正确率。举个很简单的例子,假如在人脸识别中,底库中有100个人,现在来了1个待识别的人脸(假如label为m1),与底库中的人脸比对后将底库中的人脸按照得分从高到低进行排序,我们发现:

2.1.如果识别结果是m1、m2、m3、m4、m5……,则此时rank-1的正确率为100%;rank-2的正确率也为100%;rank-5的正确率也为100%;
2.2.如果识别结果是m2、m1、m3、m4、m5……,则此时rank-1的正确率为0%;rank-2的正确率为100%;rank-5的正确率也为100%;
2.3.如果识别结果是m2、m3、m4、m5、m1……,则此时rank-1的正确率为0%;rank-2的正确率为0%;rank-5的正确率为100%;
同理,当待识别的人脸集合有很多时,则采取取平均值的做法。例如待识别人脸有3个(假如label为m1,m2,m3),同样对每一个人脸都有一个从高到低的得分,

2-1.比如人脸1结果为m1、m2、m3、m4、m5……,人脸2结果为m2、m1、m3、m4、m5……,人脸3结果m3、m1、m2、m4、m5……,则此时rank-1的正确率为(1+1+1)/3=100%;rank-2的正确率也为(1+1+1)/3=100%;rank-5的正确率也为(1+1+1)/3=100%;
2-2.比如人脸1结果为m4、m2、m3、m5、m6……,人脸2结果为m1、m2、m3、m4、m5……,人脸3结果m3、m1、m2、m4、m5……,则此时rank-1的正确率为(0+0+1)/3=33.33%;rank-2的正确率为(0+1+1)/3=66.66%;rank-5的正确率也为(0+1+1)/3=66.66%;
3.Precision & Recall & mAP

一般来说,Precision就是检索出来的条目(比如:文档、网页等)有多少是准确的,Recall就是所有准确的条目有多少被检索出来了。

正确率 = 提取出的正确信息条数 / 提取出的信息条数

召回率 = 提取出的正确信息条数 / 样本中的信息条数 准确率和召回率都是针对同一类别来说的,并且只有当检索到当前类别时才进行计算,比如在person re-id中,一个人的label为m1,在测试集中包含3张此人的图像,检索出来的图像按照得分从高到低顺序为m1、m2、m1、m3、m4、m1….,此时

3.1.第一次检索到m1,提取出的正确信息条数=1,提取出的信息条数=1,样本中的信息条数=3,正确率=1/1=100%,召回率=1/3=33.33%;
3.2.第二次检索到m1,提取出的正确信息条数=2,提取出的信息条数=3,样本中的信息条数=3,正确率=2/3=66.66%,召回率=2/3=66.66%;
3.3.第三次检索到m1,提取出的正确信息条数=3,提取出的信息条数=6,样本中的信息条数=3,正确率=3/6=50%,召回率=3/3=100%;

平均正确率AP=(100%+66.66%+50%)/3=72.22%
而当需要检索的不止一个人时,此时正确率则取所有人的平均mAP。
4.F-Score
从上面准确率和召回率之间的关系可以看出,一般情况下,$Precision$高,$Recall$就低,$Recall$高,$Precision$就低。所以在实际中常常需要根据具体情况做出取舍,例如一般的搜索情况,在保证召回率的条件下,尽量提升精确率。很多时候我们需要综合权衡这2个指标,这就引出了一个新的指标$F-scor$e。这是综合考虑$Precision$和$Recall$的调和值。

$$F - Score = (1 + {\beta ^2}){{\Pr ecision{\mathop{\rm Re}\nolimits} call} \over {{\beta ^2}\Pr ecision + {\mathop{\rm Re}\nolimits} call}}$$ 当$β=1$时,称为$F1-score$,这时,精确率和召回率都很重要,权重相同。当有些情况下,我们认为精确率更重要些,那就调整β的值小于1,如果我们认为召回率更重要些,那就调整β的值大于1。

比如在上面的例子中,在第三次检索到m1时的争取率为50%,召回率为100%,则F1-score=(20.51)/(0.5+1)=66.66%,而F0.5-score=(1.250.51)/(0.25*0.5+1)=55.56%

7.行人重识别测试

主要有两种方案:
a.测试的输入是一对行人,输出为这对行人的相似度,然后再按相似度排序;
b.输入单个人,提取特征,再计算与其他人的欧式距离,然后再按距离排序。
第一种方案的优点是,判断两个人是不是一个人,简单的二分类(是/否)。但缺点是如果我们搜索库中有m张图片,那么与目标图片组成m对图片对。每一对都要进一次模型,估算相似度,这极大的增加了测试的时间。如果我们有n个query,那么我们要计算nm次相似度(而m往往很大)。另一种方案是,预先提取行人的特征,我们只要预先提好n+m次特征。之后只要比较就好了,比较特征可以简单的用矩阵乘法实现。 目前两种方案都有在用,但是后一种更接近实际中图像搜索的要求,用特征来快速检索。

参考自:
http://html.rhhz.net/tis/html/201706084.htm
https://blog.csdn.net/weixin_41427758/article/details/81188164
https://blog.csdn.net/Gavinmiaoc/article/details/80774199>
https://blog.csdn.net/baidu_18891025/article/details/79202249
https://zhuanlan.zhihu.com/p/26

行人重识别(Person re-identification)概述 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/398370.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【最优化】一维搜索

首先我们需要先明确一下我们的任务是什么? 我们的任务是给定一个未知函数,如何找到它的最小值。 三点二次插值法 给定三个点,拟合一条二次曲线,每次迭代更新,当时停止迭代。 GitHub - ldx-star/Numerical-Optimizati…

Redis(十四)双写一致性工程案例

文章目录 问题概述canal功能安装部署mysql配置canal服务端canal客户端(Java程序) 问题概述 canal https://github.com/alibaba/canal 功能 数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据…

【rust】7、命令行程序实战:std::env、clap 库命令行解析、anyhow 错误库、indicatif 进度条库

文章目录 一、解析命令行参数1.1 简单参数1.2 数据类型解析-手动解析1.3 用 clap 库解析1.4 收尾 二、实现 grep 命令行2.1 读取文件,过滤关键字2.2 错误处理2.2.1 Result 类型2.2.2 UNwraping2.2.3 不需要 panic2.2.4 ? 问号符号2.2.5 提供错误上下文-自定义 Cust…

sora生成高质量视频的原理

Sora是怎样生成视频的? 写在前面 Sora 是 OpenAI 在日前发布的超强视频生成 AI,旨在探索 AI 如何在理解真实世界运动和交互方面做得更好Sora目前无灰度体验 面临挑战 Sora面对的挑战就像是需要处理和理解来自世界各地、不同设备拍摄的数以百万计的图…

分布式扫描bean问题

今天我突然想到,为什么现在项目上会有一个 spring.factories 文件,原来它是用来批量扫描类,然后加到容器中的。 前几天我查了一下这个文件,发现这个文件是springboot运行时,会查询这个文件,然后把里面配置的…

SpringBoot配置文件日志

目录 一、SpringBoot配置文件的作用 二、SpringBoot配置文件的分类 1、application.properties 2、application.yml 3、application.yaml 三、使用配置文件实例--验证码 1、使用Kaptcha插件生成验证码 2、网页需求分析 3、前端页面 4、发送请求 5、服务器作出响应 …

AD24-铺铜使用方法说明

一、局部铺铜及网络添加 1)按空格键进行切换 2)按Backspac进行撤回 3)铜皮网络添加 再点击铜皮选中的区域,即可完成网络添加 4)完成铺铜 5)出现红色框情况处理 按以下进行设置 重新铺铜即可 法二&#xff1…

Filezilla 银河麒麟桌面操作系统V10(sp1)与Windows主机数据传输问题

银河麒麟桌面操作系统V10(sp1)与Windows主机数据传输问题 1. 关闭Windows主机的防火墙和KylinOS V10的防火墙 如果不知道怎么关闭的参考这两篇文章: https://blog.csdn.net/m0_70885101/article/details/127271517 https://blog.csdn.net/w…

三防平板丨平板终端丨三防平板电脑丨建筑工地应用

随着建筑工程越来越复杂和规模越来越大,工地管理和协调变得越来越复杂。在这个过程中,工业设备的作用越来越重要,而三防平板作为一种实用的工业设备,在工地上的应用越来越广泛。本文将介绍三防平板在工地使用中的优势和应用。 一…

typescript 泛型详解

typescript 泛型 泛型是可以在保证类型安全前提下,让函数等与多种类型一起工作,从而实现复用,常用于: 函数、接口、class中。 需求:创建一个id 函数,传入什么数据就返回该数据本身(也就是说,参数和返回值类型相同)。 …

DP读书:社区文档(小白向)解读——iSulad 轻量级容器引擎功能介绍以及代码架构解析

10min带你快速了解iSulad 容器技术方案 功能介绍以及代码架构解析iSulad是啥iSulad怎么用:先看大佬咋说——maintainer李峰iSulad 轻量级容器引擎功能介绍以及代码架构解析iSulad提问iSulad_SIGiSulad的仓库: 主仓库嘿嘿 仓库链接:[https://gitee.com/op…

Java实现假日旅社管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…

JavaWeb学习|JSON与AJAX

学习材料声明 所有知识点都来自互联网,进行总结和梳理,侵权必删。 引用来源:尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 JSON JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机…

两分钟秒懂Android控件设置

导言 本文从整体到局部,从常用布局(layout)到控件的设置,层层递进,一定要从前往后依次看 目录 1.常用布局方式 1.1 ConstraintLayout 约束布局 1.2 LinearLayout 线性布局 1.3 TableLayout 表格布局 1.4 GridLayout 瀑布布局 2.关于控件属性整合 2.1 放置位置 2.2 如…

cubeIDE之串口空闲中断注意事项

1:在配置完成后的main函数中不可使能接收中断 // __HAL_UART_ENABLE_IT(&huart4, UART_IT_RXNE);//接收中断__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);//空闲中断HAL_UART_Receive_DMA(&huart4,rx4_buffer, 255);//使能MDA接收HAL_UART_Transmit(&…

Linux系统中HTTP隧道的搭建与配置步骤:穿越网络的“魔法隧道”

在Linux系统中搭建HTTP隧道,就像是开启了一条穿越网络的“魔法隧道”。这条隧道能让你的数据在网络中自由穿梭,无论是远程办公还是数据同步,都能变得轻松自在。下面,就让我们一起探索如何搭建这条神奇的“魔法隧道”吧&#xff01…

2024-2-20-IO进程线程作业

1> 源代码&#xff1a; #include <myhead.h>int main(int argc, const char *argv[]) {pid_t pid -1;FILE *src NULL;FILE *dest NULL;if ((src fopen("./base.txt", "r")) NULL){perror("fopen error");return -1;}fseek(src, …

阿赵UE学习笔记——15、灯光的移动性概念和构建光照信息

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎&#xff0c;这次来学习一下UE里面灯光的移动性概念和构建光照信息。 1、灯光移动性 打开一个带有灯光的场景 在大纲面板里面找到其中一个灯光&#xff1a; 会发现灯光的细节面板里面&#xff0c;…

Windows 自带的 Linux 子系统(WSL)安装与使用

WSL官网安装教程&#xff1a; https://learn.microsoft.com/zh-cn/windows/wsl/install Windows 自带的Linux子系统&#xff0c;比用VM什么的香太多了。可以自己看官方教程&#xff0c;也可以以下步骤完成。 如果中间遇到我没遇到的问题百度&#xff0c;可以在评论区评论&#…

【Python】【VS Code】VS Code中python.json和setting.json文件配置说明

目录 1. python.json配置 2. setting.json配置 3. 解决中文乱码 4. 实现效果 1. python.json配置 python.json 获取步骤&#xff1a;文件 -> 首选项 -> 配置用户代码片段 -> python 此为VS Code的头文件设置&#xff0c;复制以下内容到 python.json {"HEADER…