主要内容

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

这个例子展示了如何使用OpenPose算法和预先训练好的网络来估计一个或多个人的身体姿势。

身体姿态估计的目标是识别图像中人物的位置和他们身体部位的方向。当一个场景中出现多人时,由于遮挡、身体接触和相似身体部位的接近,姿势估计可能会更加困难。

有两种估计身体姿势的策略。自上而下的策略首先使用物体检测来识别个体,然后估计每个人的姿势。自下而上的策略首先识别图像中的身体部位,如鼻子和左肘部,然后根据身体部位的可能配对组合个体。自底向上策略对遮挡和身体接触的鲁棒性更好,但实施难度更大。OpenPose是一种多人人体姿态估计算法,采用自底向上策略[1].

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

为了将人体各部分组装成独立的人,OpenPose算法执行了一系列后处理操作。第一个操作使用网络返回的热图识别和定位身体部位。随后的操作识别身体各部分之间的实际连接,从而产生单个姿势。有关算法的详细信息,请参见从热图和paf中识别姿势

导入网络

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

dataDir = fullfile(tempdir,“OpenPose”);trainedOpenPoseNet_url =“https://ssd.mathworks.com/金宝appsupportfiles/vision/data/human-pose-estimation.zip”;downloadTrainedOpenPoseNet (trainedOpenPoseNet_url dataDir)
预先训练的OpenPose网络已经存在。
解压缩(fullfile (dataDir,“human-pose-estimation.zip”), dataDir);

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

如果未安装用于ONNX模型格式的深度学习工具箱转换器™,则该功能将在插件资源管理器中提供到所需支持包的链接。金宝app要安装支持包,请单击链接,然后金宝app单击“安装”。如果安装了支持金宝app包,则importONNXLayers函数返回LayerGraph对象。

modelfile = fullfile(dataDir,“human-pose-estimation.onnx”);layers = importONNXLayers(模型文件,“ImportWeights”,真正的);

删除未使用的输出层。

layers = removeLayers(layers,layers. outputnames);Net = dlnetwork(layers);

预测测试图像的热图和paf

读取并显示测试图像。

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

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

netInput = im2single(im)-0.5;

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

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

将图像数据存储为dlarray

netInput = darray (netInput,“SSC”);

预测从二维输出卷积层输出的热图和部分亲和场(PAFs)。

[热图,pafs] =预测(net,netInput);

中存储的数值热图数据dlarray.数据有19个通道。每个通道对应一个独特的身体部位的热图,还有一个额外的背景热图。

热图= extractdata(热图);

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

蒙太奇(重新调节(热图),“写成BackgroundColor”“b”“BorderSize”3)

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

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

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

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

对象中存储的数值PAF数据dlarray.数据有38个通道。每种类型的身体部分配对有两个通道,分别表示向量场的x分量和y分量。

Pafs = extractdata(Pafs);

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

  • 大部分垂直连接的身体部位对y分量对具有较大的幅度,而x分量对具有可忽略的值。一个例子是右臀部到右膝盖的连接,出现在第二排。注意,paf取决于图像中的实际姿势。一个身体处于不同方向的图像,比如躺着,对于右臀部到右膝盖的连接,不一定有很大的y分量大小。

  • 大部分为水平连接的身体部位对的x分量配对具有较大的幅度,而y分量配对的值可以忽略不计。一个例子是脖子到左肩的连接,出现在第七行。

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

蒙太奇(重新调节(改善),“大小”(19 - 2),“写成BackgroundColor”“b”“BorderSize”3)

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

Idx = 1;损害= horzcat(im,im);pafpair = horzcat(拥堵(:,:2 * idx-1),拥堵(:,:2 * idx));Pafpair = imresize(Pafpair,size(削弱,[1 2]));imshowpair (pafpair,损害);

从热图和paf中识别姿势

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

方法获取OpenPose算法的参数getBodyPoseParametershelper函数。该函数作为支持文件附加到示例中。金宝app该函数返回一个结构体,其参数包括要考虑的主体部分的数量和主体部分类型之间的连接。参数还包括阈值,您可以调整这些阈值以提高算法的性能。

params = getBodyPoseParameters;

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

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

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

  3. 通过计算通过PAF向量场连接两个被检测身体部位的直线的线积分来对这些对打分。得分越高,表示检测到的身体部位之间有很强的联系。

  4. 根据分数对可能的配对进行排序,并找到有效的配对。有效的身体部位配对是指连接属于同一个人的两个身体部位的配对。通常,得分最高的配对被首先考虑,因为它们最有可能是有效的配对。然而,算法补偿遮挡和接近使用额外的约束。例如,同一个人不能有一对重复的身体部位,一个身体部位不能属于两个不同的人。

  5. 知道身体的哪些部位是相连的,将每个人的身体部位组合成不同的姿势。

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

姿态= getbodypose(热图,pafs,params);

控件显示身体姿势renderBodyPoseshelper函数。该函数作为支持文件附加到示例中。金宝app

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

参考文献

[1]曹、哲、希内斯·伊达尔戈、托马斯·西蒙、魏世恩和亚瑟·谢赫。OpenPose:使用部件亲和字段的实时多人2D姿态估计。ArXiv: 1812.08008 (Cs)2019年5月30日。https://arxiv.org/abs/1812.08008

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

另请参阅

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