前 言
基于计算机视觉的人机交互一般可分为四个部分:
1. 有没有人;
2. 人在哪;
3. 这个人是谁;
4. 这个人在做什么;
人机交互过程中涉及的关键技术点如下:
在四个部分的实现中,人脸识别可以完成1、2、3部分的实现(具体实现详见《2D与3D人脸识别详解》),但是第4部分的这个人在做什么,人脸识别就失效了。还有第3部分的这个人是谁,当图片的分辨率太小以至于人脸识别失效,或者图片中的人只有背景的时候,人脸识别就没法识别出这个人是谁了:
如上图,人脸识别的方式能识别出这个人是谁不,NO!这时就得用到人脸识别之外的另一个识别方法:姿态识别。
姿态识别简介
人体姿态是人体重要的生物特征之一,有很多的应用场景,如:步态分析、视频监控、增强现实、人机交互、金融、移动支付、娱乐和游戏、体育科学等。姿态识别能让计算机知道人在做什么、识别出这个人是谁。特别是在监控领域、在摄像头获取到的人脸图像分辨率过小的情况下是一个很好的解决方案,还有在目标身份识别系统中可以作为一项重要的辅助验证手段,达到减小误识别的效果。
姿态识别一般流程如下:
人体分割
人体分割使用的方法可以大体分为人体骨骼关键点检测、语义分割等方式实现。这里主要分析与姿态相关的人体骨骼关键点检测。人体骨骼关键点检测输出是人体的骨架信息,一般主要作为人体姿态识别的基础部分,主要用于分割、对齐等。一般实现流程为:
人体姿态识别
人体姿态识别包括动作识别、身份识别两个方面,关键在人体特征提取,人体特征提取主要完成动作特征提取、身份特征提取。一般实现流程为:
动作识别
身份识别
人体骨骼关键点检测常常用来作为姿态识别的基础部件,下面先介绍人体骨骼关键点检测实现,然后再介绍人体姿态识别(动作识别、身份识别)实现。
N0.1
人体骨骼关键点检测
人体骨骼关键点检测也称为姿态估计(Pose Estimation),主要检测人体的关键点信息,如关节,五官等,通过关键点描述人体骨骼信息,常用来作为姿态识别、行为分析等的基础部件,如下图所示:
人体骨骼关键点检测现状
人体骨骼关键点检测是一种多方面任务,包含了目标检测、人体骨骼关键点检测、分割等。人体骨骼关键点检测可以分为二维(2D)和三维(3D)的人体骨骼关键点检测;按照检测的方法又能分为自底向上、自顶向下两个方式。
人体骨骼关键点检测的结果如下:
人体骨骼关键点检测的挑战:
1. 每张图片中包含人的数量是未知的,图像中人越多,计算复杂度越大(计算量与人的数量正相关),这使得处理时间变长,从而使real time变得困难。
2. 人与人之间会存在如接触、遮挡等关系,导致将不同人的关键节点区分出来的难度增加,有可能会将骨骼关键点误认为是另一个人的。
3. 关键点区域的图像信息比较难区分,也就是说某个关键点检测时容易出现检测位置不准或者置信度不准,甚至将背景的图像当成关键点图像的错误。
4. 人体不同关键点检测的难易程度是不一样的,对于腰部、腿部这类没有比较明显特征关键点的检测要难于头部附近关键点的检测,需要对不同的关键点区别对待。
根据输出的关键点数据是2D还是3D的,分为2D人体骨骼关键点检测、3D人体骨骼关键点检测。
2D人体骨骼关键点检测:
输入的图像数据:RGB
3D人体骨骼关键点检测:
根据输入图像数据是RGB还是RGBD可分为2D+人体骨骼关键点检测、3D人体骨骼关键点检测。
输入的图像数据:RGB(2D+)
输入的图像数据:RGBD(3D)
2D人体骨骼关键点检测实现
2D人体骨骼关键点检测的算法模型基本上都遵循自顶向下(TopDown)、自底向上(BottomUp)两种思路来实现:
自顶向下
自顶向下(Topdown)的人体骨骼关键点检测算法包含两个部分:目标检测和单人人体骨骼关键点检测,目标检测算法完成人体bounding box的输出,目前目标检测方法的精度跟速度已经很高,算法模型有YOLO系列、SSD系列、RCNN系列、RFCN系列等,本文重点研究关键点检测的算法。
RMPE
该模型主要解决了自顶向下人体骨骼关键点检测中的目标检测bounding box可能会出现定位误差、对同一个物体重复检测等问题。bounding box定位误差,会导致关键点检测的区域出错,关键点检测区域出错会造成对同一个人会生成不同的关键点。该模型提出了一种方法来解决目标检测产生bounding box所存在的问题,即通过空间变换网络将同一个人体的产生的不同裁剪区域(Proposals)都变换到一个较好的区域,这样就不会因为一个人体产生不同的裁剪区域从而出现不同关键点检测效果。具体流程如下图所示。
图片来自 https://arxiv.org/pdf/1612.00137.pdf
上图中的STN SPPE SDTN 结构如下
图片来自 https://arxiv.org/pdf/1612.00137.pdf
STN从一个不准确的边框中提取一个高质量的单人候选框,SPPE产生各种姿态,SDTN产生候选姿态, 同时引入一个并行的Parallel SPPE分支进行优化。
自顶向下的人体骨骼关键点算法还有:CPN(Cascaded Pyramid Network)、RMPE、G-RMI等。
自底向上
自底向上(BottomUp)的人体骨骼关键点检测算法主要包含两个部分:关键点检测和关键点聚类连接,关键点检测目的是将图片中所有人的所有关键点全部检测出来。关键点检测完毕之后需要对这些关键点进行聚类处理,将每一个人的不同关键点连接在一块,从而连接产生不同的个体。
Part Affinity Fields
该方法通过对人体的不同肢体结构进行建模,使用向量场来模拟不同肢体结构,解决了单纯使用中间点是否在肢干上造成的错连问题。
图片来自 https://arxiv.org/pdf/1611.08050.pdf
如上图所示,如果只使用中间点对肢干进行建模,如果中间点都在对应的肢干上,则判断两个关键点处在该肢干的两端,这样就会出现如上图所示的错连情况。而PAFs则不仅使用中间点来建模肢干,而且在中间的位置之外还给每个中间点加上了方向的信息,这样就能解决出现的错连问题。具体如下图所示。
图片来自 https://arxiv.org/pdf/1611.08050.pdf
使用PAFs的模型为openpose,openpose是目前速度、精度都比较高的人体骨骼关键点检测模型。openpose的整体思路如下:
先识别出关键点和关节点热图(也就是关节的区域、方向),然后通过PAFs算法组合成个体的姿势图。
图片来自 https://arxiv.org/pdf/1611.08050.pdf
如上图所示,openpose的检测流程为:
1)计算出所有关键点(头部,肩膀,手肘,手腕...)如上图(b)所示;
2)计算出所有关联区域,如上图(c)所示;
3)根据关键点和关联区域进行矢量连接,由前两步得到的关键点和关联区域,而后需要依据关联区域将关键点连接以组成人体真正的骨骼结构。作者提出了以一个最小限度的边数量来获得个体姿势的生成树图(用了二分图+匈牙利算法等),在保证不错的准确度的同时,大大减少了复杂度,提高了实时性,解决了对关键点聚类配对时需要每对点都试验一遍然后找到最优的划分和组合结构的难题。
自底向上的人体骨骼关键点检测算法有:Part Segmentation、Part Affinity Fields、Associative Embedding、Mid-Range Offsets、CPM(Convolutional Pose Machines)等。
当需要3D的人体姿态信息时,2D人体骨骼关键点检测并不能满足要求,这时需要3D人体骨骼关键点检测。
2D+人体骨骼关键点检测实现
2D+人体骨骼关键点检测多使用3D重建的方法,一般输入都是RGB的2D图像数据,首先使用2D人体骨骼关键点检测的方法检测出2D的人体骨骼关键点后,再使用3D重建的方式,将2D的关键点信息转到3D的空间中,输出的就是3维人体骨骼关键点信息。这种方法使用的图像数据不是真的3D数据,输出的3维的信息主要是通过2D到3D重建的方式实现的,当然这种方法也能解决一定的问题,在动作识别、身份识别等领域都有一定的作用。
2D+人体骨骼关键点检测输出的人体骨骼关键点信息是3D数据,即每个关节都是一个3D坐标(x,y,z),如下图所示:
图片来自 http://www.sysu-hcp.net/3d_pose_ssl/
2D+人体骨骼关键点检测的模型速度比较快的是DensePose,能在GPU上达到每秒多帧的运行速度,基本能在实际环境中使用。
DensePose主要在目标检测平台(Detectron)搭建起来的模型,称为DensePose-RCNN,模型的结构如下图所示:
图片来自 https://arxiv.org/pdf/1802.00434.pdf
DensePose-RCNN采用的是金字塔网络(FPN)特征的RCNN结构,区域特征聚集方式ROI align pooling以获得每个选定区域内的密集部分标签和坐标。将2D图像中人的表面图像数据投影到3D人体表面上,将人体的3D表面模型切分为24个部分,然后为每一部分构建一个UV坐标系,将2D图像上的人体部分的每一个点映射到相应的3D表面部分。也可以在估计出图像中人体的UV之后,将3Dmodel通过变换,将空间坐标转换为UV坐标之后,贴到图像上。
DensePose借鉴了Mask-RCNN的结构,同时带有Feature Pyramid Network(FPN)的特征,以及ROI-Align池化。整体流程为:首先使用Faster-RCNN得到人物区域bounding box,然后使用CNN网络模块分块,分块后用CNN网络模型处理每一个分块,最后得到目标的热力图IVU。
3D人体骨骼关键点检测实现
前面分析的2D+人体骨骼关键点检测,模式上基本能总结为2D的人体骨骼关键点检测+3D重建的过程。这里分析使用RGBD图像数据的3D人体骨骼关键点检测实现。
图像数据是RGBD的一种方式就是使用深度图像来获取人体骨骼关键点数据,虽然使用的只是RGBD中的深度数据D(Depth Image),但是Depth Image实际上也是一幅真实的3D图像数据,Depth Image包含了深度信息、图像的高宽信息。很多硬件设备的SDK都带有该功能,如微软的Kinect、英特尔实感3D摄像头、Mo-Cap解决方案等。
自从2011年Shotton, J等人在[Real-time human pose recognition in parts from single depth images. In: CVPR (2011)]中提出随机森林算法后,利用深度信息获取人体骨骼关键点数据的算法逐渐出现,如微软的Kinect深度相机自带SDK的骨骼提取算法用的就是随机森林算法,并且得到市场的认可。然而后面CNN的崛起,并在CV、NLP等各个领域取得显著的成绩,下面分析基于CNN+RNN结构的人体骨骼关键点获取模型,模型的网络结构如下:
图片来自http://vision.stanford.edu/pdf/haque2016eccv.pdf
该模型的结构如上图所示,输入一张深度图,对深度图片进行多次迭代处理,每一个迭代包含两个输入,即原图处理生成的一个patch(称为Glimpses)和之前生成的人体骨骼关键点信息。
该模型的输入深度图片并不直接输送到网络中去,而是先通过提取图片中的不同的patch,其中每个patch都以每个预测的身体部位为中心,并且将其转化成为Glimpses。Glimpse是一种对原始输入的特殊编码形式,它的中心分辨率高,周围分辨率逐渐降低,这就使得中心的特征得到重点的学习,同时又保留了部分空间信息。
上图的Depth Image到Embedding的过程输出的是具有视角不变特性的特征空间,获取到了尺度不变的Glimpses之后,将Glimpses作为输入,经过运算转换成3维的姿态数据输出,转换模型如下:
图片来自http://vision.stanford.edu/pdf/haque2016eccv.pdf
对于一个输入的Glimpse,结合原来的深度数据经过函数f(x)转换成体素(3维),最后将3D特征V并映射回到二维空间,最后得出3维的人体姿态信息。
2D的人体骨骼关键点检测跟3D的人体骨骼关键点检测对比如下:
人体姿态关键点是计算机视觉的一个主要的组成部分,是计算机理解人体语言、肢体语言的一个主要方式。解决了人体分割、人体定位、人体查找等问题,通过人体骨骼关键点检测可以完成动作识别分析、身份识别等内容,当然在动作识别、身份识别的过程中可以将人体骨骼关键点检测的技术融合,并没有输出人体骨骼关键点信息。
下面介绍人机交互过程中第4部分的实现,人体姿态识别。
N0.2
人体姿态识别
人机交互的识别过程中挑战性比较大之一就是人体姿态识别,主要解决:
1)身份识别问题:图片分辨率太低导致人脸识别失效的情况;
2)辅助验证问手段:配合人脸识别等识别方法提高识别准确率;
3)图像检索等;
4)其他。
人体姿态识别现状
姿态识别主要完成识别出这个人这一段时间在做什么,或者根据其姿态信息、运动规则来完成身份验证功能。姿态识别需要单帧或者多帧连续的姿态数据,通过算法模型计算得出人在做什么或者是谁。下面从动作识别分析、身份识别两个方面进行分析。
动作识别
视频逐帧分析,采用连续的动作识别出人物动作,如走路、跑步、蹲下等。在计算机视觉中人机交互中有很大的应用,主要处理模型大概分为两个大类:卷积神经网络(3D-CNN)、基于循环神经网络与其扩展模型(CNN + LSTM)。
动作识别分析的应用场景有:3D 个人健身教练、3D试衣、游戏人物动作设计、古画分析、人体绘画教学、游戏的交互、照相馆拍照姿势指南等等。
动作分析效果如:
身份识别
行人重识别、步态识别是身份识别的实现方法。
行人重识别(Person re-identification,简称ReID)也称行人再识别,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术。广泛被认为是一个图像检索的子问题。旨在弥补固定的摄像头的视觉局限,并可与行人检测/行人跟踪技术相结合,可广泛应用于智能视频监控、智能安保等领域,行人重识别是生物识别的一个重要部分,可以作为人脸识别的一个补充。
步态识别,首先对视频预处理将行人与背景分离,形成黑白轮廓图silhouette。然后再在连续多帧的silhouette图中获取特征,最终达到身份识别的目的,依据是每个人都会有自己的走路方式,这是一种比较复杂的行为特征。
silhouette图如下(来自CASIA-B):
在监控视频中,由于相机分辨率和拍摄角度的缘故,通常无法得到质量非常高的人脸图片。当人脸识别失效的情况下,ReID、步态识别就成为了一个非常重要的替代技术。ReID有一个非常重要的特性就是跨摄像头,所以学术论文里评价性能的时候,是要检索出不同摄像头下的相同行人图片。ReID、步态识别已经在学术界研究多年,但直到最近几年随着深度学习的发展,才取得了巨大的突破。
人体姿态识别是人脸识别之外另一个重要的研究领域,这里将姿态识别分为两个大类进行介绍,分别为:动作识别、身份识别。
动作识别实现
要识别出人物的动作通常需要连续的视频数据进行分析处理,需要采集的特征通常有单帧图像数据的特征和多帧图像数据之间时间上的特征,简单来说就是静态帧数据+帧间数据。
a、静态帧数据,表示单帧图像空间信息
b、帧间数据,表示时间信息(光流数据)
常用的数据集有:KTH、Weizmaan、HOHA、Keck Gesture、MSR action、YouTube Action、UT-Interaction等等。
从目标分析的角度上看,动作识别也能看作是分类的问题,每个动作就是一类,如果有二十个动作就是二十类。那么动作的识别最终就能转变成特征提取、分类两个主要过程。特征提取包含静态帧的特征,动态帧间的特征。算法在不断的迭代发展,产生了很多经典的处理模型、算法。一般的识别流程为:
从上图可以看到,动作识别的关键步骤是人体分割、特征提取以及特征编码。
人体分割是将图像中人体所在区域与图像的其他部分分割出来,使用人体关键点检测来分割的方法前文已经有所介绍;特征编码的作用主要是将提取到的特征标准化到统一的空间,而通常特征提取和特征编码一般是配套使用的,动作识别的CNN模型中已经包含了特征提取和特征编码。
上文提到,动作识别需要提取静态帧特征与帧间特征,比较经典的网络模型是Two-StreamConvolutionalNetworks、TSN、TRN等,下面分别介绍。
Two-StreamConvolutionalNetworks
two-stream结构是受到神经科学的启发,人类视觉皮层包含两条路径:腹侧流(执行物体识别)和背侧流(识别运动)。
图片来自 https://arxiv.org/pdf/1406.2199.pdf
spatial stream convnet输入单帧RGB图片,可以在Image-net上进行预训练,再在视频数据集上进行fine-tuning,训练图片是从所有视频帧中随机选一帧,并进行相应的数据增强,如翻转等其他处理,再随机剪切成224*224。用于提取单帧数据并分类。
temporal stream convnet处理的是连续帧的光流信息,由于光流是矢量,为了方便输入网络训练,故将此向量分解为水平和垂直方向的两个分量,因此一帧m*n*3的彩色图片,对应的光流特征图就是m*n*2,总共是L个连续的帧,经过随机剪裁,输入矩阵为224*224*2L。由于光流计算比较耗时,所以每个视频的光流图可通过OpenCV预先提取,并量化到0-255,用于提取帧间数据特征并分类。
TSN
两个CNN方式的动作识别,提出了一个很好的思路,在动作识别领域除了使用3DCNN等思路之外又提出的一个有效的思路,并且能解决一定的问题。但是Two-StreamConvolutionalNetworks的方式有个明显的缺点,就是对输入的图像帧并没有处理,这样的帧采集方式为密集采样方式,如果连续多帧图像人的动作都保持不变,那么动作识别将失效,同时浪费了处理的时间。
为了解决上面的问题,于是TSN出现了,结构如下:
图片来自 https://arxiv.org/pdf/1608.00859.pdf
TSN将输入的视频流分成k片段,然后再在每个片段随机选择一小片段分别送入CNN(two-CNN的方式),然后再进行特征融合,最后分类。
TSN主要是提出了稀疏时间的采样策略,提高了识别精度。不过在对帧间时间序列的处理上似乎并没有太多的优化,于是TRN在TSN的基础上对Temporal部分进行了优化,提出了video-level的实时时间关系推理框架,架构如下:
图片来自 https://arxiv.org/pdf/1711.08496.pdf
two-CNN方式的优化不仅有前面介绍的TSN、TRN,还有对spatial进行加权优化的方式DOVF,还有对spatial、temporal的部分同时进行优化处理的ECO,等。TSN、TRN、DOVF、ECO解决了一系列连续多帧采集的问题,使密集采样转到稀疏采样成为现实,大大提高了处理的速度跟精度。
静态帧数据 + 帧间数据处理方式除了可以直接使用two-CNN的方式处理,还有CNN+LSTM、GCN(GR-GCN)网络、3DCNN等结构,常见模型除了前面介绍的还有LRCN、ST-GCN、DPRL+GCNN、GEGCN、SGR-GCN、2s-NLGCN等等,技术的发展总是在你追我赶中不断前进。
动作分析的模型一直在进化、在向着精度更高、速度更快的方向进化,不管是two-CNN的、3DCNN的、CNN+LSTM的等等,都需要解决下面的问题:
1.动作识别一般都需要一系列连续的frame,如何从video里采样到更好更合适不重复的frame;
2.一系列连续的frame往往需要消耗很大的计算力,使real time比较难;
3.动态动作幅度有大小,有快有慢,静态动作又是静止的图像,需要准确区分识别;
4.训练集的动作跟实际环境的动作会有较大差别,如何保证实际环境中的准确率是个大问题。
N0.3
身份识别实现
基于人体姿态的身份识别,跟人脸识别的目的一样,主要是用来区分不同的人,其中人体的属性如高、矮、胖、瘦、长头发、短头发、衣服颜色、鞋子等基本都能识别分辨出来。一般的识别步骤为:
识别模型有:基于传统特征的方法如衣服颜色、身高等;基于深度学方法的PCB、MGN、EANet、doop-person-reid、BFENet、stand Baseline、PTSN、GaitSet、GEINet、GaitGAN等等。
身份识别的技术难点
1. 模型泛化能力弱
在训练集上测试的效果很好,但是将该模型迁移到实际环境(真实环境)、或者换一个测试集上进行验证,性能下降明显。
2.人体的特征属性变化比较大
人的胖瘦、高矮、长头发短头发是会变化的,而且会变化的比较快,如换一个发型,早上长发、下午短发等,就会导致识别模型识别失效。
3.计算量比较大
基于人体姿态的身份识别往往需要多帧的图片数据集结合计算,需要提取每帧图像数据的特征同时也需要提取多帧图像数据之间的运动信息。
4.数据资源少
目前基于人体姿态的身份识别相关的数据集太少,最多的数据集的ID也只有几千人,数据集的数量也很少。
5、行人特征不稳定因素比较多
多个摄像头下拍摄行人的角度不同,要正确判断的话,就要找到行人上的局部不变的part(比如:衣服颜色,衣服纹理,手提包,背包等等)。在计算机视觉中,常用的特征就有颜色直方图等等。
针对身份识别的原理、结合CNN的特征提取方式、综合身份识别的技术难点,将基于姿态的身份识别分为如下两个方式。
基于单帧图像的身份识别(2D)
使用单帧图像数据就完成基于人体姿态的身份识别,基本上的方法是使用CNN的特征提取的方法,设计一个CNN网络模型,设计一个损失函数,让这个CNN网络模型在数据集上学习到能区分不同身份的参数。CNN可以从原始的图像数据中根据任务需求自动提取出表征特征,可以把行人重识别问题看做分类问题或者验证问题:(1)分类问题是指利用行人的ID或者属性等作为训练标签来训练模型,基于表征特征的方法;(2)验证问题是指输入一对(两张)行人图片,让网络来学习这两张图片是否属于同一个行人,基于度量学习的方法。大体流程如下:
基于表征特征的方法
基于度量学习的方法
基于表征特征的方法
基于表征特征的方法,跟人脸识别的方式类似,首先检测出人体在图像中的具体位置,然后将人体的信息用图像中抠出,再对抠出的人体数据的分辨率进行标准化、方向矫正等对齐操作,最后使用CNN网络将对齐后的图片数据转换成特征数据,然后计算数据的相似度。对齐主要使用前面介绍的人体骨骼关键点检测作为参照点。
基于表征特征的学习方法,处理的方式有整张图片输入到CNN网络模型进行特征提取,也有将整张图片分块处理后送进CNN的网络模型再全局处理每个模块的特征,下面分两部分介绍。
基于全局特征
一般基于全局的特征提取模型还会加入人体的属性的识别,因为人体特征存在着诸多的不稳定性,如换一个发型,早上长发、下午短发等,为了提高泛化能力,增加了人体属性特征,例如性别、衣着等。通过引入人体属性标签,模型不但要准确地预测出行人ID,还要预测出各项正确的行人属性,这大大增加了模型的泛化能力。典型模型如下图:
图片来自 https://arxiv.org/pdf/1703.07220.pdf
上图的模型不仅使用CNN提取了目标的特征(这个特征是什么,CNN清楚,能区分两个不同的人就行),还提取了人体的属性,如性别、头发、衣服等等,最后两种结合判断给出得出目标的ID。
基于局部特征再组合
基于人体姿态的身份识别除了使用上面介绍的人体全局特征,还有增加使用基于局部特征的识别方法,常用的提取局部特征的思路主要有图像切块、利用人体骨架关键点定位以及姿态矫正等,最后再将局部的特征通过LSTM的方式合并成整体特征,本质上还是全局特征的处理方式,只是全局特征提取之前添加了局部特征的细节特征提取。
如下图,图片被分为若干份,提取局部特征。被分割好的若干块图像块按照顺序送到一个长短时记忆网络(Long short term memory network, LSTM),最后的特征融合了所有图像块的局部特征。但是这种缺点在于对图像对齐的要求比较高,如果两幅图像没有上下对齐,那么很可能出现头和上身对比的现象,反而使得模型判断错误。
图片来自 https://arxiv.org/pdf/1607.08381.pdf
为了解决上面因为两幅图像没有对齐出现的划分失败的问题,采用人体骨骼关键点检测的数据作为基础,解决两幅图像没有对齐的问题。首先使用骨骼关键点检测模型检测出人体的关键点,然后根据关键点进行仿射变换,也就是将关键点的位置映射到图像的固定位置,使两幅图片对齐,这个对齐过程使用的模型为PoseBox,对齐效果如下:
图片来自 https://arxiv.org/pdf/1701.07732.pdf
使用了PoseBox的对齐模型结构如下:
图片来自 https://arxiv.org/pdf/1701.07732.pdf
使用单帧图像直接获取全局或者局部特征的模型还有:AlignedREID,GLAD、Spindle Net等。
基于度量学习的方法
度量学习目的是通过网络学习出两张图片的相似度。同一人的不同图片相似度大于不同人的不同图片。最后网络的损失函数使得相同人图片(正样本对)的距离尽可能小,不同人图片(负样本对)的距离尽可能大。
基于度量学习方法的身份识别的一个典型模型如下:
来自 https://arxiv.org/pdf/1611.05244.pdf
如上图网络输入为若干对行人图片,包括分类子网络(Classification Subnet)和验证子网络(Verification Subnet)。分类子网络对图片进行ID预测,根据预测的ID来计算分类误差损失。验证子网络融合两张图片的特征,判断这两张图片是否属于同一个行人,该子网络实质上等于一个二分类网络。经过足够数据的训练,再次输入一张测试图片,网络将自动提取出一个特征,这个特征用于行人重识别类别判断依据。
基于度量学习的方法有三个关键要素:CNN特征提取模型、loss损失函数、数据集。CNN特征提取模型可以参考前面的基于表征特征学习的方法,数据集只要是基于姿态的身份识别的数据集都可以。
度量学习的方法常用的对比损失函数有:对比损失(Contrastive loss)、三元组损失(Triplet loss)、 四元组损失(Quadruplet loss)、样本采样三元组损失(Triplet hard loss with batch hard mining, TriHard loss)、边界挖掘损失(Margin sample mining loss, MSML)等。
这五种损失函数,论文《MarginSampleMiningLoss: ADeepLearningBasedMethodforPerson Re-identification》分别在resnet50、inceptionv2、resnet50-x三个CNN架构上做个测试,精度如下表所示:
数据来源 https://arxiv.org/pdf/1710.00478.pdf
基于单帧图像的身份识别方式实际是一个2D的实现过程,因为只使用了一帧的图像数据,而且这一帧图像数据是2D的,只有RGB信息。优点是处理的运算量相对于多帧的图像要少,所以处理速度快。但是缺点也明显,就是处理的信息有限,会影响识别的精度。
而基于多帧图像的身份识别不仅提取了每帧图像数据的特征,还提取了帧与帧之间的运动特征,这使得图像数据更丰富,识别精度更高。
下面开始分析基于多帧图像数据的身份识别,也就是3D的实现方式。
基于多帧图像的身份识别(3D)
获取多帧图像数据有两种情况:同一时刻多摄像头同时获取同一个人的不同视角图像,不同时刻单摄像头或者多摄像头获取同一个人的多帧图像。
同一时刻的多帧图像
这种多帧图像的同一个人是同一时刻采用不同位置的摄像头获取,如market1501使用了6个不同位置的摄像头、dukemtmc-reid使用了8个不同位置的摄像头、MSTM17使用了15个不同位置的摄像头等等。所以这些数据就是3D的图像数据。这种多帧图像数据(真3D图像数据)获取不容易,需要各个角度的摄像头同时监控到同一个地方才能获取。如下图:
这些照片就是3D数据的多视图表示方法(3D数据的表示方法见《2D与3D人脸识别详解》)。这时处理的方法就是3D的处理方式。
不同时刻的多帧图像
这种多帧图像的同一个人不是同一个时刻获取到的,可以是多个摄像头多个角度获取,但不是同一时刻获取。这种数据我们暂且称为假3D数据。目前绝大部分的数据集都是采用这种方式获取,主要是因为这种数据获取方式相对于多帧同一时刻的获取方式对硬件设备没有那么高的要求。如下图:
对同一个人同一时刻不同角度获取的图像数据理论上处理效果可能会更好,但是数据获取比较麻烦,对硬件设备要求更严格,这是个需要考虑的问题。目前基于多帧图像数据的处理方式基本都是同一个人不同角度的多帧图像(不管是不是同一时刻)都统一送入CNN,让CNN自己提取需要的特征,这种处理方式可以认为是3D的处理方式。
基于多帧图像的身份识别这里分为两个部分介绍:
行人重识别跟步态识别的主要差异是处理的图像数据不同,行人重识别处理的是一帧或多帧彩色的图像数据,而步态识别处理的是多帧黑白轮廓图silhouette。
行人重识别
行人重识别处理多帧图像数据的一个主要方式是CNN+RNN,当然也可以使用点云的数据处理方式,但是因为点云数据的生成对硬件设备要求比较高,同时点云的处理比较复杂、计算量也大,所以这里主要分析使用CNN + RNN的方式。
CNN+RNN主要思想是利用CNN来提取图像表征特征信息,使用基于RNN的方式提取帧与帧之间的运动信息。每张图像都经过一个共享的CNN提取出图像空间内容特征,之后这些特征向量被输入到一个RNN网络去提取最终的特征。最终的特征融合了单帧图像的内容特征和帧与帧之间的运动特征。网络结构如下图所示:
图片来自 https://arxiv.org/pdf/1701.00193.pdf
但是在实际的环境中还会存在遮挡的情况,如下图所示:
图片来自 https://arxiv.org/pdf/1711.08766.pdf
针对这种遮挡的问题,可以先对输入网络前图像的质量进行判断,着重考虑完整的帧,让网络对质量比较高的帧打上比较高的权重,整体网络结构如下:
图片来自 https://arxiv.org/pdf/1711.08766.pdf
N0.4
步态识别
跟前面介绍的方法不同,前面基于特征学习的方法、基于度量学习的方法、CNN+RNN的方法等输入图像都是彩色的图像数据,而这里步态识别处理的数据不是彩色数据,而是经过处理的黑白轮廓图silhouette,silhouette图获取方式一般可以通过语义分割等方式得到。如下图:
(来自CASIA-B数据集)
一般步态识别主要有两大类方法:
将步态看作图像
将多帧的步态轮廓图压缩成一幅图像,将步态识别看成一个图像匹配问题。优点是计算简单,缺点也同样明显,就是忽略了步态中的时序信息,也无法建模精细的空间信息,从而准确率不会高。
典型算法有:GEI、CGI、VTM、ViDP等。
将步态看作视频序列
考虑直接从silhouette提取特征,分为空间(每个轮廓图像的特征)、时间(多个轮廓图像之间的信息)两个部分提取特征,优点是可以很好的建模步态中的时、空域信息,缺点是计算量大、不易训练。
典型的算法有:基于LSTM的方法、基于3D-CNN的方法等。
GaitSet
这里主要分析AAAI2019收录的复旦大学提出的GaitSet的模型, 网络模型结构如下:
图片来自 https://arxiv.org/pdf/1811.06186v2.pdf
人类对步态的视觉感知上,步态轮廓图从视觉上看前后关系很容易辨认,根据这个思想作者不再刻意建模处理silhouette的时序关系,而将silhouette当作没有时序关系的图像集,让深度神经网络自身优化去提取并利用这种关系。按照上图的网络结构使用三个步骤提取步态特征,公式如下:
其中输入xi是输入图像;F是CNN从每个步态轮廓中提取特征;G是一个置换不变函数,用于将一组帧级特征映射到集合特征,这里是将F的多个特征聚合成一个特征;H 是考虑提取多尺度特征,并通过全连接网络提高特征的鉴别性。
G函数主要在上图中的SP实现,使用的方法是集合了多种池化方法,可集成到网络中实现端到端训练,算法流程如下:
图片来自 https://arxiv.org/pdf/1811.06186v2.pdf
人体姿态识别数据集有:Market1501、Market1501-attribute、DukeMTMC-reID、DukeMTMC-attribute、CUHK01、CUHK02、CUHK03、3DPES、QMUL-iLIDS、PRID、MARS、iLIDS-VID、PRID2011、GRID、CUHK-PEDES等等。
总 结
得益于神经网络的发展,在计算机视觉领域,识别的速度、准确度都有了很大的提高。不管是分类、检测、识别目前基本上都以CNN为基础结构,完成对图像数据的直接处理,得出数据,然后再使用特定的算法计算,即可实现如分类、检测、识别等功能。人脸检测、识别、人体骨骼关键点检测、动作识别、行人重识别、步态识别等,基本上都按这个架构来实现。本文分析了人机交互过程姿态识别相关的部分,目前精度比较好的模型基本都使用CNN作为基本特征提取结构。
人体骨骼关键点检测可以说是人体姿态识别的基础之一,如在单帧图像数据基于特征学习的方法中会用到。不使用人体骨骼关键点检测的方法完成身份的识别有基于多帧图像数据的CNN+RNN方法、步态识别的方法,但都需要精准找出人体的位置。
通过人体姿态的识别计算机就能明白我们的动作、在做什么、是谁等。
目标检测、人脸识别、人体骨骼关键点检测、基于人体姿态的动作识别、基于人体姿态的身份识别等技术还在不断的发展完善中,各个领域的技术相辅相成、相互借鉴、相互提高。前面介绍的模型、思想是行业内实现的主要方式,还有一些不同的方法、不同的模型也在不断的研究中,如矢量卷积,神经网格等,限于篇幅不在此介绍了。
往期
精选