一、前言
此示例演示如何使用 OpenPose 算法和预训练网络估计一个或多个人的身体姿势。
身体姿势估计的目标是识别图像中人的位置及其身体部位的方向。当场景中存在多个人时,由于遮挡、身体接触和相似身体部位的接近,姿势估计可能会更加困难。
有两种策略可以估计身体姿势。自上而下的策略首先使用物体检测识别个人,然后估计每个人的姿势。自下而上的策略首先识别图像中的身体部位,例如鼻子和左肘,然后根据可能的身体部位配对组装个体。自下而上的策略对遮挡和身体接触更稳健,但该策略更难实施。OpenPose是一种使用自下而上的策略的多人姿态估计算法。
为了识别图像中的身体部位,OpenPose使用预先训练的神经网络来预测输入图像中身体部位的热图和部分亲和场(PAF)。每个热图显示特定类型的身体部位位于图像中每个像素的概率。PAF 是指示两个身体部位是否连接的向量场。对于每种定义的身体部位配对类型,例如颈部到左肩,有两个 PAF 显示身体部位实例之间向量场的 x 和 y 分量。
为了将身体部位组装成个人,OpenPose算法执行一系列后处理操作。第一个操作使用网络返回的热图识别和定位身体部位。后续操作识别身体部位之间的实际连接,从而产生各个姿势。
二、导入网络
从 ONNX 文件导入预训练网络。下载并安装适用于 ONNX 模型格式的深度学习工具箱转换器支持包。如果未安装 ONNX 模型格式的深度学习工具箱转换器,则该函数将提供指向加载项资源管理器中所需支持包的链接。若要安装支持包,请单击链接,然后单击“安装”。如果安装了支持包,则该函数将返回一个对象。
移除未使用的输出图层。
三、预测测试图像的热图和 PAF
读取并显示测试图像。
网络需要数据类型在 [-0.5, 0.5] 范围内的图像数据。将数据移位并重新缩放到此范围。网络期望颜色通道按蓝色、绿色、红色的顺序排列。切换图像颜色通道的顺序。将图像数据存储为 .dlarray。预测热图和部分亲和场 (PAF),它们是从二维输出卷积层输出的。获取存储在 中的数字热图数据。数据有 19 个通道。每个通道对应于一个唯一身体部位的热图,还有一个额外的热图用于背景。以蒙太奇形式显示热图,将数据重新缩放到数据类型图像的预期范围 [0, 1]。场景有六个人,每个热图有六个亮点。
要可视化亮点与物体的对应关系,请在测试图像上以假彩色显示第一个热图。
OpenPose 算法不使用背景热图来确定身体部位的位置。删除背景热图。获取存储在 中的数字 PAF 数据。数据有 38 个通道。每种类型的身体部位配对都有两个通道,分别表示向量场的 x 和 y 分量。
以蒙太奇形式显示 PAF,将数据重新缩放到数据类型图像的预期范围 [0, 1]。这两列分别显示向量场的 x 分量和 y 分量。身体部位配对按值确定的顺序排列。
-
具有大部分垂直连接的身体部位对的 y 分量配对量级较大,而 x 分量配对的值可以忽略不计。一个例子是右髋关节到右膝的连接,出现在第二行。请注意,PAF 取决于图像中的实际姿势。身体处于不同方向(例如躺下)的图像对于右髋关节到右膝的连接不一定具有较大的 y 分量大小。
-
具有大部分水平连接的身体部位对的 x 分量配对量级较大,而 y 分量配对的值可以忽略不计。一个例子是颈部与左肩的连接,出现在第七行。
-
成角度的身体部位对具有矢量场的 x 分量和 y 分量的值。一个例子是脖子到左臀部,出现在第一行。
为了可视化PAF与身体的对应关系,请在测试图像上以假彩色显示第一种身体部位对的x和y分量。
四、从热图和 PIF 中识别姿势
该算法的后处理部分使用神经网络返回的热图和 PAF 识别图像中人物的个人姿势。
使用帮助程序函数获取 OpenPose 算法的参数。该函数作为支持文件附加到示例。该函数返回一个结构,其中包含要考虑的身体部位数量和身体部位类型之间的连接等参数。这些参数还包括阈值,您可以调整这些阈值以提高算法的性能。
使用帮助程序功能识别个人及其姿势。此函数作为支持文件附加到示例。帮助程序函数执行姿势估计的所有后处理步骤:getBodyPoses
-
使用非最大抑制从热图中检测精确的身体部位位置。
-
对于每种类型的身体部位配对,在检测到的身体部位之间生成所有可能的配对。例如,生成六个颈部和六个左肩之间的所有可能的对。结果是一个二分图。
-
通过计算通过 PAF 向量场连接两个检测到的身体部位的直线的线积分来对配对进行评分。大分数表示检测到的身体部位之间存在紧密联系。
-
按分数对可能的配对进行排序并找到有效的对。有效的身体部位对是连接属于同一个人的两个身体部位的对。通常,得分最高的对首先被视为,因为它们最有可能是有效对。但是,该算法使用其他约束来补偿遮挡和邻近性。例如,同一个人不能有重复的身体部位对,一个身体部位不能属于两个不同的人。
-
知道哪些身体部位是连接的,将身体部位组装成每个人的单独姿势。
帮助程序函数返回三维矩阵。第一个维度表示图像中已识别人员的数量。第二个维度表示正文部分类型的数量。第三维表示每个人身体每个部位的 x 和 y 坐标。如果在图像中未检测到身体部位,则该部位的坐标为 [NaN NaN]。
五、程序
使用Matlab R2022b版本,点击打开。(版本过低,运行该程序可能会报错)
程序下载:基于matlab使用深度学习估计身体姿势资源-CSDN文库