主要内容

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

这个例子展示了如何估算一个或更多的人的身体姿势使用OpenPose算法和pretrained网络。

身体姿态估计的目标是确定人的位置在一个图像和定位他们的身体部位。当多个人出现在现场,估计更困难,因为阻塞,身体接触和接近相似的身体部位。

有两种策略来估计身体姿势。自顶向下的策略首先使用目标检测识别个人,然后估计每个人的姿势。自底向上策略首先识别身体部位的图像,如鼻子和左肘,然后组装个人基于可能配对的身体部位。自底向上的策略是更健壮的闭塞和身体接触,但战略更难以实现。OpenPose是一种多人人体姿态估计算法,它使用自底向上的策略1]。

在图像识别身体部位,OpenPose使用pretrained神经网络,预测的热图和部分关联字段(改善)身体部位在输入图像2]。每一个热图显示了一种特殊的身体部位的概率位于图像中每个像素。拥堵的向量场,表明是否两个身体部位相连。为每个已定义的类型的身体部分配对,如颈部左肩,有两个拥堵显示x和y分量的向量场的实例之间身体部位。

将身体部位组装成个人,OpenPose算法执行一系列后处理操作。第一个操作标识和本地化的身体部位使用返回的热图网络。后续操作识别实际身体部位之间的联系,导致个体构成。更详细的算法,看到识别造成的热图和拥堵

导入网络

从一个ONNX文件导入pretrained网络。

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

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

如果深入学习工具箱转换器™ONNX模型格式没有安装,那么函数提供了一个链接到需要在插件浏览器支持包。金宝app安装包的支持,点击链接,然后点金宝app击安装。如果安装支持包金宝app,那么importONNXLayers函数返回一个LayerGraph对象。

modelfile = fullfile (dataDir,“human-pose-estimation.onnx”);层= importONNXLayers (modelfile,“ImportWeights”,真正的);

删除未使用的输出层。

层= removeLayers(层,layers.OutputNames);网= dlnetwork(层);

预测的热图和拥堵的测试图像

读取和显示测试图像。

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

网络将图像数据的数据类型在[-0.5,0.5]。和重新将数据转移到这个范围。

netInput = im2single (im) -0.5;

网络预计颜色通道的顺序蓝色,绿色,红色。切换图像颜色通道的顺序。

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

存储的图像数据dlarray

netInput = dlarray (netInput,“SSC”);

预测的热图和部分关联字段(改善),二维卷积输出层的输出。

[热图,拥堵的]=预测(网络,netInput);

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

热图= extractdata(热图);

显示在蒙太奇的热图,重新调节数据范围[0,1]的期望的图像数据类型。现场有6人,有六个在每个热图亮点。

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

可视化对应身体的亮点,显示第一个在falsecolor热图测试图像。

idx = 1;hmap =热图(:,:,idx);hmap = imresize (hmap、大小(im, [1 - 2]));imshowpair (hmap, im);

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

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

获取存储在拥堵的数字数据dlarray。数据已经38频道。有两种渠道为每个类型的身体部分配对,这代表了x和y分量的向量场。

拥堵的= extractdata(改善);

显示拥堵的蒙太奇,尺度改变数据的预期区间[0,1]的图像数据类型。两列显示x分量的向量场,分别。身体部分配对的顺序决定的params.PAF_INDEX价值。

  • 对身体部位主要是垂直连接大大小的分量配对和微不足道的x分量值配对。一个例子是正确的髋关节到右膝关节连接,在第二行。注意,拥堵的形象取决于实际的姿势。图像与身体在一个不同的方向,比如躺着,不一定会有一个大分量级的髋关节到右膝关节连接。

  • 对身体部位主要是横向连接大大小的分量值配对的,无足轻重的分量配对。一个例子是左肩的颈部连接,在第七行。

  • 对身体的部分在一个角度值x -和分量的向量场。一个例子是脖子向左臀部,出现在第一行。

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

对应形象化的拥堵的身体,显示x和y分量的第一种在falsecolor部位对测试图像。

idx = 1;损害= horzcat (im, im);pafpair = horzcat(拥堵(:,:2 * idx-1),拥堵(:,:2 * idx));pafpair = imresize (pafpair、大小(损害(1 2)));imshowpair (pafpair,损害);

识别造成的热图和拥堵

的后处理部分算法识别个体构成的人返回的图像使用的热图和拥堵的神经网络。

得到参数OpenPose算法的使用getBodyPoseParametershelper函数。的函数例子作为支持文件。金宝app函数返回一个结构体的身体部位和数量等参数之间的连接部位类型来考虑。还包括阈值的参数,可以调整来提高算法的性能。

params = getBodyPoseParameters;

通过识别个人和他们的姿势getBodyPoseshelper函数。这个函数是附加到例子作为支持文件。金宝app姿态估计的helper函数执行所有后处理步骤:

  1. 检测的准确部位位置使用nonmaximum抑制热图。

  2. 为每个类型的身体部分配对,生成之间的所有可能对检测到的身体部位。例如,生成所有可能的对六个脖子和6之间的左肩上。结果是一个由两部分构成的图。

  3. 分数计算线积分的双直线连接这两个检测身体部位通过拥堵的向量场。一个大分数显示检测到的身体部位之间有着紧密联系。

  4. 可能对他们的成绩和找到有效的对。有效部位对双连接两个属于同一个人的身体部位。通常,对最大的分数被认为是第一个,因为他们最有可能是一个有效的一对。然而,该算法弥补了闭塞和接近使用额外的约束。例如,同一个人不能有重复的对身体部位,和一个身体部位不能属于两个不同的人。

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

辅助函数返回一个三维矩阵。第一个维度表示图像中识别人的数量。第二维度代表身体的部分类型的数量。x - y坐标的三维显示每个人的每个部位。如果一个身体部位没有图像中检测到,然后这部分的坐标是(NaN南)。

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

显示使用的身体姿势renderBodyPoseshelper函数。这个函数是附加到例子作为支持文件。金宝app

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

引用

[1]曹、哲希内斯伊达尔戈,托马斯•西蒙Shih-En魏,亚瑟·谢赫。“OpenPose:实时多人2 d姿势估计使用关联领域的一部分。”ArXiv: 1812.08008 (Cs),2019年5月30日。https://arxiv.org/abs/1812.08008

[2]Osokin,丹尼尔。“实时二维多人姿势估计CPU:轻量级OpenPose。”ArXiv: 1811.12004 (Cs)2018年11月29日。https://arxiv.org/abs/1811.12004

另请参阅

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