DeepPose:通过深度神经网络实现人体姿态估计.

传统的人体姿态估计方法利用一些肢体间相互作用的知识体系,来设计一些图片的特征表示或者关节拓扑之类比较复杂的模型。这些模型需要人类的介入设计,而缺乏灵活的应变能力和表达能力。

DeepPose是深度学习应用于人体姿态估计的开山之作,将姿态估计问题转化为图像的特征提取和关键点的坐标回归问题。DeepPose使用预训练卷积神经网络(如AlexNet)提取特征,直接输出维度$2k$的坐标,表示对人体的$k$对关键点坐标进行回归预测。

为了更好更统一地训练,作者提出了一种关节坐标标签的标准化方法。对于关节$i$,其在原图片中的坐标为\(\vec{y}_i=(p,q)\)。用一个矩形框将图片中包含人像的部分框出来,这个矩形框的中心坐标为\(\vec{b}_c=(m,n)\),其长宽为$b_w,b_h$。将框出人体的矩形框的中心作为新的坐标系中心,并将图片压缩,使得新的矩形框长宽均统一成单位$1$。数学表达式为:

\[\vec{y}^{\prime}=\left(\begin{array}{cc} \frac{1}{b_w} & 0 \\ 0 & \frac{1}{b_h} \end{array}\right)\left(\vec{y}-\overrightarrow{b}_c\right)=\left(\begin{array}{cc} \frac{1}{b_w} & 0 \\ 0 & \frac{1}{b_h} \end{array}\right)\left(\begin{array}{c} p-m \\ q-n \end{array}\right)\]

模型使用了级联回归器(cascaded regressor),基于前一阶段不同关节预测坐标位置对图像进行局部裁剪作为现阶段的输入,因此现阶段的输入有着更高的分辨率,从而能学习到更为精细的尺度特征,以此来对前一阶段的预测结果进行细化。

DeepPose的简单实现如下:

import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F

class DeepPose(nn.Module):
	"""docstring for DeepPose"""
	def __init__(self, nJoints, modelName='resnet50'):
		super(DeepPose, self).__init__()
		self.nJoints = nJoints
		self.block = 'BottleNeck' if (int(modelName[6:]) > 34) else 'BasicBlock'
		self.resnet = getattr(torchvision.models, modelName)(pretrained=True)
		self.resnet.fc = nn.Linear(512 * (4 if self.block == 'BottleNeck' else 1), self.nJoints * 2)
	def forward(self, x):
		return self.resnet(x)