|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from __future__ import absolute_import |
|
from __future__ import print_function |
|
from __future__ import division |
|
|
|
import numpy as np |
|
|
|
import torch |
|
import torch.nn as nn |
|
|
|
from .utils import to_tensor |
|
|
|
|
|
class VertexJointSelector(nn.Module): |
|
|
|
def __init__(self, |
|
vertex_ids=None, |
|
use_hands=True, |
|
use_feet_keypoints=True, |
|
**kwargs): |
|
super(VertexJointSelector, self).__init__() |
|
|
|
extra_joints_idxs = [] |
|
|
|
face_keyp_idxs = np.array([ |
|
vertex_ids['nose'], vertex_ids['reye'], vertex_ids['leye'], |
|
vertex_ids['rear'], vertex_ids['lear'] |
|
], |
|
dtype=np.int64) |
|
|
|
extra_joints_idxs = np.concatenate([extra_joints_idxs, face_keyp_idxs]) |
|
|
|
if use_feet_keypoints: |
|
feet_keyp_idxs = np.array([ |
|
vertex_ids['LBigToe'], vertex_ids['LSmallToe'], |
|
vertex_ids['LHeel'], vertex_ids['RBigToe'], |
|
vertex_ids['RSmallToe'], vertex_ids['RHeel'] |
|
], |
|
dtype=np.int32) |
|
|
|
extra_joints_idxs = np.concatenate( |
|
[extra_joints_idxs, feet_keyp_idxs]) |
|
|
|
if use_hands: |
|
self.tip_names = ['thumb', 'index', 'middle', 'ring', 'pinky'] |
|
|
|
tips_idxs = [] |
|
for hand_id in ['l', 'r']: |
|
for tip_name in self.tip_names: |
|
tips_idxs.append(vertex_ids[hand_id + tip_name]) |
|
|
|
extra_joints_idxs = np.concatenate([extra_joints_idxs, tips_idxs]) |
|
|
|
self.register_buffer('extra_joints_idxs', |
|
to_tensor(extra_joints_idxs, dtype=torch.long)) |
|
|
|
def forward(self, vertices, joints): |
|
extra_joints = torch.index_select(vertices, 1, self.extra_joints_idxs) |
|
joints = torch.cat([joints, extra_joints], dim=1) |
|
|
|
return joints |
|
|