主要内容

利用深度学习估计身体姿势

此示例演示如何使用OpenPose算法和预训练网络估计一个或多个人的身体姿势。

身体姿势估计的目标是确定人在图像中的位置及其身体部位的方向。当场景中有多个人时,由于遮挡、身体接触和相似身体部位的接近,姿势估计可能会更加困难。

有两种方法来估计身体姿势。自上而下的策略首先使用目标检测来识别每个人,然后估计每个人的姿势。自下而上的策略首先识别图像中的身体部位,比如鼻子和左肘,然后根据可能的身体部位配对来组合个体。自下而上策略对咬合和身体接触具有较强的鲁棒性,但该策略更难实现。OpenPose是一种采用自下而上策略的多人人体姿势估计算法[1].

为了在图像中识别身体部位,OpenPose使用预先训练的神经网络来预测输入图像中身体部位的热图和部分亲和场(paf) [2]。每个热图显示特定类型的身体部位位于图像中每个像素处的概率。PAF是指示两个身体部位是否连接的向量场。对于每个已定义类型的身体部位配对,例如颈部到左肩,有两个PAF显示两个像素之间向量场的x和y分量身体部位的姿势。

为了将身体部位组装成个体,OpenPose算法执行了一系列后处理操作。第一个操作使用网络返回的热图识别和定位身体部位。随后的操作确定身体各部分之间的实际连接,从而形成不同的姿势。具体算法请参见从热图和PAF中识别姿势

导入网络

从ONNX文件导入预先训练过的网络。

dataDir = fullfile (tempdir,“开放式”);trainedOpenPoseNet_url =“https://ssd.mathworks.com/金宝appsupportfiles/vision/data/human-pose-estimation.zip”;下载trainedOpenPoseNet(trainedOpenPoseNet_url,dataDir)解压(完整文件(dataDir,“human-pose-estimation.zip”),dataDir);

下载并安装ONNX模型格式支持包的深度学习工具箱™转换器。金宝app

如果深入学习工具箱转换器™ 如果未安装ONNX型号格式,则该函数会在附加模块资源管理器中提供指向所需支持包的链接。若要安装支持包,请单击该链接,然后单击“安装”。如果已安装支持包,则金宝appimportONNXLayers函数返回一个LayerGraph对象。

modelfile=fullfile(dataDir,'人体姿势估计.onnx');图层=导入图层(模型文件,“重要性”,真正的);

删除未使用的输出层。

层=移除层(层[“Output_node_95”“输出_节点_98”“Output_node_147”“Output_node_150”]);网= dlnetwork(层);

预测测试图像的热图和PAF

读取并显示测试图像。

我= imread (“visionteam.jpg”);imshow(im)

网络需要数据类型的图像数据在范围[-0.5,0.5]中,将数据移动并重新缩放到此范围。

netInput=im2single(im)-0.5;

网络期望颜色通道按照蓝、绿、红的顺序排列。切换图像颜色通道的顺序。

netInput = netInput(:,:,[3 2 1]);

将图像数据存储为dlarray

netInput=dlarray(netInput,“SSC”);

预测热图,它是由名为“node_147”的2d卷积层输出的。

netInput热图=预测(净,“输出”“节点_147”);

获取存储在dlarray.数据有19个通道。每个通道对应一个独特的身体部分的热图,一个额外的背景热图。

热图= extractdata(热图);

以蒙太奇方式显示热图,将数据缩放到数据类型图像的预期范围[0,1].这个场景有六个人,每个热图上有六个亮点。

蒙太奇(重新调节(热图),“写成BackgroundColor”“b”“边框大小”,3)

为了可视化亮点与身体的对应关系,在测试图像上以假色显示第一个热图。

idx = 1;hmap =热图(:,:,idx);Hmap = imresize(Hmap,size(im,[1 2]));imshowpair (hmap, im);

OpenPose算法不使用背景热图来确定身体部位的位置。请删除背景热图。

热图=热图(:,:,1:end-1);

预测paf,它是从名为“node_150”的2-D卷积层输出的。

pafs=预测(净、净投入、,“输出”“node_150”);

获取存储在中的数字PAF数据dlarray.数据有38个通道。每种身体部位配对类型有两个通道,代表向量场的x和y分量。

拥堵的= extractdata(改善);

在蒙太奇中显示PAF,将数据重新缩放到数据类型图像的预期范围[0,1].这两列分别表示向量场的x分量和y分量。身体部位配对的顺序由参数个数。PAF_INDEX价值。

  • 大部分是垂直连接的身体部位对y分量对具有较大的数值,而对x分量对具有可忽略的值。一个例子是右髋到右膝关节的连接,它出现在第二行。注意,paf取决于图像中的实际姿态。身体在不同方向的图像,如躺下,右髋到右膝连接不一定有较大的y分量。

  • 以水平连接为主的身体部件对具有较大的x分量对和可忽略的y分量对的值。一个例子是颈部到左肩的连接,出现在第七行。

  • 某一角度上的物体部分对向量场的x分量和y分量都有值。一个例子是脖子到左臀部,出现在第一行。

蒙太奇(重新缩放(pafs),“大小”(19 - 2),“写成BackgroundColor”“b”“边框大小”,3)

为了可视化paf与身体的对应关系,在测试图像上以假色显示第一类身体部分对的x和y分量。

idx=1;损害=horzcat(im,im);pafpair=horzcat(pafs(:,:,2*idx-1),pafs(:,:,2*idx));pafpair=imresize(pafpair,size(损害,[12]);imshowpair(pafpair,损害);

从热图和PAF中识别姿势

该算法的后处理部分使用神经网络返回的热图和PAF识别图像中人物的个人姿势。

使用getBodyPoseParametershelper函数。该函数作为支持文件附加到示例中。金宝app该函数返回一个带有参数的结构体,例如要考虑的身体部位数量和身体部位类型之间的连接。这些参数还包括阈值,您可以通过调整阈值来提高算法的性能。

params = getBodyPoseParameters;

识别个人和他们的姿势使用身体姿势助手函数。此函数作为支持文件附加到示例中。金宝apphelper函数执行姿态估计的所有后处理步骤:

  1. 使用非最大抑制从热图中检测精确的身体部位位置。

  2. 对于每种类型的身体部位配对,在检测到的身体部位之间生成所有可能的配对。例如,在六个脖子和六个左肩之间生成所有可能的配对。结果是一个二部图。

  3. 通过PAF向量场计算连接被检测物体两个部分的直线积分来评分。一个大的分数表明被检测到的身体部位之间有很强的联系。

  4. 根据分数对可能的配对进行排序并找到有效配对。有效身体部位配对是指连接属于同一个人的两个身体部位的配对。通常,分数最大的配对会首先考虑,因为它们最有可能是有效配对。但是,该算法使用额外的c一个人的身体不能有两个不同的部分。

  5. 知道哪些身体部位是相连的,为每个人将身体部位组装成单独的姿势。

helper函数返回一个3-D矩阵。第一个维度表示图像中已识别的人的数量。第二个维度表示身体部位类型的数量。第三个维度表示每个人身体各部分的x和y坐标。如果在图像中没有检测到身体部位,则该部位的坐标为[NaN NaN]。

提出了= getBodyPoses(热图,拥堵,params);

展示身体姿势使用renderBodyPoses助手函数。此函数作为支持文件附加到示例中。金宝app

renderBodyPoses (im、姿势、大小(热图,1),大小(热图,2),参数);

参考文献

[1] 曹、哲、吉内斯·伊达尔戈、托马斯·西蒙、施恩伟和亚瑟·谢赫。“OpenPose:使用零件关联字段进行实时多人2D姿势估计。”ArXiv:1812.08008[Cs],2019年5月30日。https://arxiv.org/abs/1812.08008

[2] Osokin,丹尼尔。基于CPU的实时2D多人姿态估计:轻量级OpenPoseArXiv: 1811.12004 (Cs)2018年11月29日。https://arxiv.org/abs/1811.12004

另请参阅

||