主要内容

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

此示例显示了如何使用敞口算法和预审慎的网络估计一个或多个人的身体姿势。

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

有两种估计身体姿势的策略。自上而下的策略首先使用对象检测确定个人,然后估算每个人的姿势。自下而上的策略首先确定图像中的身体部位,例如鼻子和左肘,然后根据可能的身体部位配对来组装个体。自下而上的策略对于遮挡和身体接触更为强大,但是该策略更难实施。OpenPose是一种使用自下而上策略的多人姿势估计算法[1]。

为了识别图像中的身体部位,OpenPose使用验证的神经网络,该网络可预测输入图像中身体部位的热图和部分亲和力场(PAFS)[2]。每个热图显示特定类型的身体部位位于图像中每个像素的概率。PAF是矢量场,表明是否连接两个身体部位。对于每种定义的身体部位配对类型,例如颈部到左肩,有两个PAF显示身体部位实例之间矢量场的X和Y组分。

为了将身体部位组装成个人,OpenPose算法执行一系列后处理操作。第一个操作使用网络返回的热图标识和局部身体部位。随后的操作确定身体部位之间的实际连接,从而导致个人姿势。有关算法的更多详细信息,请参阅从热图和PAF中识别姿势

导入网络

从ONNX文件导入预验证的网络。

datadir = fullfile(tempdir,“ openpose');Trainedopenposenet_url ='https://ssd.mathworks.com/万博1manbetxsupportfiles/vision/data/human-pose-estimation.zip';下载trainedOpenPosenet(Trainedopenposenet_url,datadir)unzip(fullfile(datadir,,“人置 - 估计”),datadir);

下载并安装Deep Learning Toolbox™转换器,以供ONNX型号格式支持软件包。万博1manbetx

如果未安装用于ONX模型格式的深度学习工具箱转换器™,则该功能提供了指向附加探索器中所需的支持软件包的链接。万博1manbetx要安装支持包,请单击链接,然后万博1manbetx单击“安装”。如果安装了支持万博1manbetx包,则ExpientOnnXlayers功能返回aLayerGraph目的。

Modelfile = fullfile(datadir,“人置息” .onnx');layers = exumentonnxlayers(Modelfile,“进口重量”,真的);

卸下未使用的输出层。

layers = removelayers(层,[“ output_node_95”“ output_node_98”“ output_node_147”“ output_node_150”);net = dlnetwork(层);

预测热图和测试图像的PAF

阅读并显示测试图像。

im = 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卷积层输出的。

heatmaps =预测(net,netinput,“输出”,,,,“ node_147”);

获取数字热图数据存储在Dlarray。数据有19个渠道。每个通道对应于一个唯一身体部位的热图,背景还有一个附加的热图。

热图= ExtractData(热图);

在蒙太奇中显示热图,将数据重新缩放到数据类型图像的范围[0,1]单身的。现场有六个人,每个热图中有六个亮点。

蒙太奇(恢复(热图),“背景颜色”,,,,“ B”,,,,“边界”,3)

要可视化明亮斑点与身体的对应关系,请在测试图像上显示第一个伪色的热图。

idx = 1;hmap = heatmaps(:,:,idx);hmap = imresize(hmap,size(im,[1 2]));Imshowpair(hmap,im);

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

heatmaps = heatmaps(:,:,:,1:end-1);

预测PAF,这些PAF是从名为“ Node_150”的2D卷积层输出的。

PAFS =预测(Net,NetInput,“输出”,,,,“ node_150”);

获取存储在Dlarray。数据有38个通道。每种类型的身体部分配对都有两个通道,这些通道代表矢量场的X和Y组分。

PAFS = ExtractData(PAFS);

在蒙太奇中显示PAF,将数据重新缩放到数据类型图像的范围[0,1]单身的。两列分别显示了向量场的X和Y组分。身体部件配对按顺序确定params.paf_index价值。

  • 具有大部分垂直连接的身体部位对Y组分配对的幅度很大,而对于X组件配对的值可忽略不计。一个例子是右臀部到右膝连接,该连接出现在第二行中。请注意,PAFS取决于图像中的实际姿势。带有不同方向的身体的图像(例如躺下)不一定具有较大的Y组分幅度,可右臀部与右膝关节连接。

  • 与水平连接大部分连接的身体部位对X组件配对的幅度很大,而对于Y组分配对的值可忽略不计。一个例子是脖子到左肩连接,出现在第七行。

  • 对矢量场的X和Y组分的一对角部分具有一个值。一个例子是脖子到左臀部,出现在第一行中。

蒙太奇(Rescale(PAFS),,“尺寸”,[19 2],“背景颜色”,,,,“ B”,,,,“边界”,3)

为了可视化PAF与身体的对应关系,请在测试图像上以farsecolor中的第一个类型的身体部位对显示X和Y组分。

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

从热图和PAF中识别姿势

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

使用openpose算法的参数使用GetBodyPoseParameters助手功能。该函数作为支持文件附加到示例上。万博1manbetx该函数返回具有参数的结构,例如身体部位的数量和要考虑的身体零件类型之间的连接。这些参数还包括您可以调整的阈值以提高算法的性能。

params = getBodyPoseParameters;

通过使用GetBodyposes助手功能。此功能作为支持文件附加到示例上。万博1manbetx辅助功能执行所有后处理步骤以进行姿势估计:

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

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

  3. 通过计算通过PAF矢量场连接两个检测到的身体部位的直线的线积分来评分对。大分表明检测到的身体部位之间有着密切的联系。

  4. 通过他们的分数对可能的对进行排序,并找到有效的对。有效的身体部位对是连接属于同一人的两个身体部位的对。通常,分数最大的对被认为是首先考虑的,因为它们很可能是有效的对。但是,该算法使用其他约束来补偿遮挡和接近性。例如,同一个人不能具有重复的身体部位,一个身体部位不能属于两个不同的人。

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

辅助功能返回3-D矩阵。第一维表示图像中已识别的人的数量。第二维表示身体部位类型的数量。第三维表示每个人的每个身体的X和Y坐标。如果图像中未检测到身体部位,则该部分的坐标为[Nan Nan]。

poses = getBodyposes(热图,pafs,params);

显示身体姿势使用渲染体凹陷助手功能。此功能作为支持文件附加到示例上。万博1manbetx

RenderBodyPoss(IM,姿势,尺寸(热图,1),大小(热图,2),参数);

参考

[1] Cao,Zhe,Gines Hidalgo,Tomas Simon,Shih-en Wei和Yaser Sheikh。“开放式:使用零件亲和力字段的实时多人2D姿势估算。”ARXIV:1812.08008 [CS],2019年5月30日。https://arxiv.org/abs/1812.08008

[2] Osokin,Daniil。“实时2D多人姿势估计CPU:轻量级敞口。”ARXIV:1811.12004 [CS],2018年11月29日。https://arxiv.org/abs/1811.12004

也可以看看

(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)