Compare commits
2
Commits
f74cb4e92b
...
f8ba526a61
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8ba526a61 | ||
|
|
d9021672e4 |
@@ -0,0 +1,79 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
# os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
|
||||
# os.environ["CUDA_VISIBLE_DEVICES"] = '0'
|
||||
|
||||
import torch
|
||||
from torch import nn, Tensor
|
||||
from torch.nn import functional as F
|
||||
from functools import partial
|
||||
from typing import Any, Callable, List, Optional, Sequence
|
||||
|
||||
torch.set_float32_matmul_precision('high')
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
|
||||
from models.convnext import CNBlock, LayerNorm2d
|
||||
from models.pose_ae import PoseAE
|
||||
from utils.checkpoints import load_model
|
||||
|
||||
|
||||
class FeatureManipulator(nn.Module):
|
||||
def __init__(
|
||||
self,
|
||||
features: int = 256,
|
||||
device: str = 'cuda',
|
||||
) -> None:
|
||||
super().__init__()
|
||||
|
||||
norm_layer = partial(LayerNorm2d, eps=1e-6)
|
||||
self.last = nn.Sequential(
|
||||
norm_layer(features + 1),
|
||||
nn.Conv2d(features + 1, features, kernel_size=3, padding='same'),
|
||||
).to(device)
|
||||
|
||||
stage: List[nn.Module] = []
|
||||
for _ in range(10):
|
||||
stage.append(CNBlock(features + 1, 1.0, 0))
|
||||
self.stage = nn.Sequential(*stage).to(device)
|
||||
|
||||
def _forward_impl(self, x) -> Tensor:
|
||||
x = self.stage(x)
|
||||
x = self.last(x)
|
||||
return x
|
||||
|
||||
def forward(self, x) -> Tensor:
|
||||
return self._forward_impl(x)
|
||||
|
||||
|
||||
class PoseManipulator(nn.Module):
|
||||
def __init__(self, features=256, device='cuda', ae_checpoint=None):
|
||||
super().__init__()
|
||||
|
||||
self.pose_ae: PoseAE = PoseAE(features=features, device=device)
|
||||
iteration = load_model(self.pose_ae.encoder, ae_checpoint + '_enc')
|
||||
load_model(self.pose_ae.decoder, ae_checpoint + '_dec')
|
||||
for param in self.pose_ae.encoder.parameters():
|
||||
param.requires_grad = False
|
||||
for param in self.pose_ae.decoder.parameters():
|
||||
param.requires_grad = False
|
||||
|
||||
print(f'Loaded pose_ae checkpoint at iteration: {iteration}')
|
||||
|
||||
self.manipulator = FeatureManipulator(features=features, device=device)
|
||||
|
||||
|
||||
def forward(self, input) -> torch.Tensor:
|
||||
mask, pose_in, mask_out, pose_out, angle = input
|
||||
original_features, _ = self.pose_ae.encoder(torch.cat([mask, pose_in], dim=1))
|
||||
expected_features, _ = self.pose_ae.encoder(torch.cat([mask_out, pose_out], dim=1))
|
||||
|
||||
tiled_angle = torch.ones_like(original_features[:, :1, :, :]) * angle[:,:,None,None]
|
||||
modified_features = self.manipulator(torch.cat((original_features, tiled_angle), dim=1))
|
||||
pose_pred, mask_pred = self.pose_ae.decoder(modified_features)
|
||||
|
||||
return pose_pred, mask_pred, expected_features, modified_features
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
Reference in New Issue
Block a user