【人体姿态】Convolutional Pose Machines

2023-11-13

Wei, Shih-En, et al. “Convolutional Pose Machines.” CVPR, 2016

本论文将深度学习应用于人体姿态分析,同时用卷积图层表达纹理信息和空间信息。目前在2016年的MPII竞赛中名列前茅。作者在github提供了训练和测试源码
本文详解其思想和实践方法,并指出源码与论文中不同之处。

思想

本文的特色有三:
1.用各部件响应图来表达各部件之间的空间约束。响应图和特征图一起作为数据在网络中传递。
2.网络分为多个阶段(stage)。各个阶段都有监督训练,避免过深网络难以优化的问题。
3.使用同一个网络,同时在多个尺度处理输入的特征和响应。既能确保精度,又考虑了各个部件之间的远距离关系。
这里写图片描述

算法的流程如下:

  1. 在每一个尺度下,计算各个部件的响应图
  2. 对于每个部件,累加所有尺度的响应图,得到总响应图
  3. 在每个部件的总响应图上,找出相应最大的点,为该部件位置

重点在第一步。以下依次讲解:如何设计网络来计算响应图,以及如何训练网络。

网络结构

网络输入彩色图像(绿色ori image)。以半身模型为例,分为四个阶段(stage)。每个阶段都能输出各个部件的响应图(蓝色score),使用时以最后一个阶段的响应图输出为准。
这里写图片描述

center map(绿色)是一个提前生成的高斯函数模板,用来把响应归拢到图像中心。
这里写图片描述

第一阶段

第一阶段是一个基本的卷积网络1(白色convs),从彩色图像直接预测每个部件的响应。半身模型有9个部件,另外包含一个背景响应,共10层响应图。

对应论文3.2.1

第二阶段

第二阶段也是从彩色图像预测各部件响应,但是在卷积层中段多了一个串联层(红色concat),把以下三个数据合一:

  • 阶段性的卷积结果(464632) → \to 纹理特征
  • 前一阶段各部件响应(464610) → \to 空间特征
  • 中心约束(46461)
    串联后的结果尺寸不变,深度变为32+10+1 = 43。

对应论文3.2.2

第三阶段

第三阶段不再使用原始图像为输入,而是从第二阶段的中途取出一个深度为128的特征图(feature image)作为输入。同样使用串联层综合三种因素:纹理特征+空间特征+中心约束。
原始图像和128层中的部分特征图层:
这里写图片描述

使用特征图作为阶段输入的方式在论文中未提及,在源码有实现。

后续阶段

第四阶段结构和第三阶段完全相同。在设计更复杂的网络时(例如全身模型),只需调整部件数量(从10变为15),并重复第三阶段结构即可。
这里写图片描述

训练

数据扩展

为了丰富训练样本,对原始图片进行随机旋转缩放镜像。

这部分由一个新定义的caffe层cpm_data实现。仅在训练时使用。

标定

姿态数据集中标定的是各个部件的位置,可以通过在每个关键点的真实位置上放置一个高斯响应,来构造响应图的真值。

疑问: “几何位置->真值响应”在哪里完成? genLMDB.py的输入参数中有json(几何位置),输出lmdb中也含有几何位置。cpm_data_layer.cpp中却找不到绘制响应图的部分。

对于包含多个人的图像,生成两种真值响应:
a. 在每个人的相应部件位置,放置高斯响应。(下图左)
b. 只在标定的人的相应部件位置,放置高斯响应。(下图右)
这里写图片描述

由于第一阶段只能考虑局部特征,故将a用于第一阶段网络训练,b用于后续阶段网络训练。

同样由cpm_data层实现。从标定的集合位置生成两个label数据,分别传给不同阶段的loss层。

中继监督优化

如果直接对整个网络进行梯度下降,输出层的误差经过多层反向传播会大幅减小,即发生vanishing gradients现象。
这里写图片描述
为解决此问题,本文在每个阶段的输出上都计算损失。这种方法称为intermediate supervision,可以保证底层参数正常更新。
这里写图片描述

训练时,初始化参数随机设定。

#多尺度
训练时,已经通过cpm_data层对数据进行了尺度扩充。在测试时,直接从原图生成不同尺度的图像,分别送入网络。将所得相应结果求和。下图示出第1,4,8,12尺度:
第1,4,8,12尺度的图像
测试时的尺度范围(0.8-3.0)远大于训练时的尺度范围(0.7-1.3),原因未知。

实验配置

数据集

数据集 类别 部件数 训练/测试样本数
FLIC 半身,影视 9 3987/1016
LSP 全身,体育 14 11000/1000
MPII 全身,日常 14 28000/

在这三个数据集上,PCK(Percentage Keypoints Metric)指标均超过已有文献。下图示出一例。

这里写图片描述

中继监督的效果

除了准确性指标,论文还研究了中继监督优化对于底层网络参数更新的帮助。
这里写图片描述
上图示出有中继监督(黑色)和无中继监督(红色)情况下,各层梯度的分布情况。
在无中继监督时,顶层梯度分布较均匀,而底层梯度都集中0附近,几乎无法更新网络。
有中继监督时,各层梯度分布情况良好,网络能够随着训练正常更新。

Stacked Hourglass2同样用CNN解决人体姿态分析问题。比本文在MPII上取得更改精度,网络更为简洁,训练时间大大缩短。可以参看这篇博客


  1. 本文中的“卷积网络”泛指由多个conv,relu,pooling层构成的网络。 ↩︎

  2. Newell, Alejandro, Kaiyu Yang, and Jia Deng. “Stacked hourglass networks for human pose estimation.” arXiv preprint arXiv:1603.06937 (2016). ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【人体姿态】Convolutional Pose Machines 的相关文章

  • 【第01题】A + B

    文章目录 零 写在前面 一 例题1 1 题目描述 2 解题思路 3 代码详解 二 例题2 1 题目描述 2 解题思路 3 代码详解 三 例题3 1 题目描述 2 解题思路 3 代码详解 四 例题4 1 题目描述 2 解题思路 3 代码详解
  • Unity 简单几句代码实现无限循环列表(Scroll View)

    先看效果 这里是Scroll View的设置 using System Collections using System Collections Generic using UnityEngine using UnityEngine UI
  • 第三章 套接字相关数据结构--基于Linux3.10

    本章是对socket通信过程中使用到的比较重要的据结构罗列和意义的阐述 在阅读其它层的代码前 先来看几个重要的数据结构 这几个数据结构贯串四层模型 3 1 socket对应的内核结构体 在用户空间使用socket 函数创建一个套接字 对应的
  • 数据中台模块介绍

    搭建一款集数据采集 存储 搜索 加工 分析为一体的海关外贸企业大数据平台 融合结构化数据 非结构化数据 实现了统一数据架构 对海量异构数据的存储归档 信息组织 搜索访问 安全控制 分析可视化 以及数据挖掘 数据治理等 如图1所示 1 数据分
  • URAL 1981. Parallel and Perpendicular 对角线的平行和垂直

    1981 Parallel and Perpendicular Time limit 0 5 second Memory limit 64 MB You are given a regular n gon Your task is to c
  • react采用forEach或map两种方式遍历数组

    之前写代码 从后台提取数据并渲染到前台 由于有多组数据 用map遍历会相对方便一点 但是 map不能遍历array数组 只能遍历object对象 所以如果遇到这样的问题可以采用forEach试一下 forEach import React

随机推荐