【https://github.com/Naman-ntc/Pytorch-Human-Pose-Estimation】
早期一些自顶向下的深度学习方法用神经网络直接预测人体关键点的 2D 坐标。
DeepPose [1] 是这类方法的经典代表。DeepPose 采用级联的神经网络来预测人体各个关键点的相对坐标。每一个阶段都拿上一阶段的输出坐标作为输入,并进一步预测更为准确的坐标位置。最终,将预测得到的归一化的相对坐标转换为绝对坐标。
Alexander Toshev和Christian Szegedy提出的DeepPose最早将CNN(卷积神经网络)应用于人体关节点检测。DeepPose将人体姿态估计转换为关节点回归问题,并提出了将CNN应用于人体关节点回归的方法:使用整幅图像输入到7层CNN来做关节点回归,更进一步,使用级联的CNN检测器来增加关节点定位的精确度。
DeepPose在LSP数据集上的PCP@0.5平均精度达到61%,是当时的state-of-art方法
直接回归坐标的方法思路直接,可以直接获得关键点位置,往往有更快的预测速度。然而,由于人体姿态的自由度很大,直接预测坐标的建模方式对神经网络的预测并不友好,预测精度受到了一定制约。
.1、首先,为了更好更统一地训练,作者希望让图片以人为核心呈现,从而引入了一种关节坐标的标准化方法。
那么归一化的关节点坐标(相对坐标)表示如下:
得到网络预测的关节点坐标相对于图片的绝对位置为
但是我发现后面姿态识别的Baseline论文好像也没有再采取过这种标准化了。我的一个猜想是,当时Batch Normalization(2015)的文章还没发表,所以DeepPose(2014)根据姿态识别的特点采用了这样的标准化方法。但实际上,它和Batch Normalization起的功能可能差不多,因此在后续网络的构建中,如果加入了BN,那就不必再做这样的姿态标准化了。
2、基础网络部分
这一块不复杂,整体上复刻了AlexNet,只变了输出处。从原来的一维向量(长为分类的“类别数“)变成了一维向量(长为“两倍的关节数“)。而之所以输出的长度改成了两倍的关节数,是因为每个关节有横纵两个坐标要预测。
值得注意的是,由于预测坐标其实是一种非线性很强的回归任务,对于卷积网络来说也没有很好的利用上图片的空间信息。因此自从14年的Joint Training of a Convolutional Network and a Graphical Model for Human Pose Estimation提出了热图方法后,主流网络就很少采用预测坐标的方式来进行姿态识别了。预测坐标以及热力图具体的优缺点也会在后续的文章中介绍。
论文中的网络结构,Backbone就是AlexNet
3、进阶网络部分
为了达到更棒的局部观测效果,作者又对小尺度下的各个关节额外建立更多的AlexNet来学习。因此这一块的实现其实相当于针对不同关节提取出更小的图片框,再对这些提出出来的局部图片框进行标准化(模块1)和DNN(模块2)的重新建模和计算,这样做的原因是在放大目标位置的过程中有利于精度的提高。
但是比起它的实现过程,其实更重要的它这一模块的思想,那就是只要在不同阶段中反复的对关节位置提取提取,就有利于精度的提高提高。这样一种结合local和global的思想其实在后继很多的论文中都有采用到(Stacked Hourglass/CPM/...),并被证明是行之有效的思路。
参见:
人体姿态估计-DeepPose (详细说明)
DeepPose: 基于深度神经网络的人体姿态估计 Human Pose Estimation via Deep Neural Networkse