Spaces:
Paused
Paused
| """ | |
| @author: Yanzuo Lu | |
| @author: oliveryanzuolu@gmail.com | |
| """ | |
| import torch.nn as nn | |
| from diffusers.models.resnet import ResnetBlock2D, Downsample2D | |
| class PoseEncoder(nn.Module): | |
| def __init__(self, downscale_factor, pose_channels, in_channels, channels): | |
| super().__init__() | |
| self.unshuffle = nn.PixelUnshuffle(downscale_factor) | |
| self.conv_in = nn.Conv2d(int(pose_channels * (downscale_factor ** 2)), in_channels, kernel_size=1) | |
| resnets = [] | |
| downsamplers = [] | |
| for i in range(len(channels)): | |
| in_channels = in_channels if i == 0 else channels[i - 1] | |
| out_channels = channels[i] | |
| resnets.append(ResnetBlock2D( | |
| in_channels=in_channels, | |
| out_channels=out_channels, | |
| temb_channels=None, # no time embed | |
| )) | |
| downsamplers.append(Downsample2D( | |
| out_channels, | |
| use_conv=False, | |
| out_channels=out_channels, | |
| padding=1, | |
| name="op" | |
| ) if i != len(channels) - 1 else nn.Identity()) | |
| self.resnets = nn.ModuleList(resnets) | |
| self.downsamplers = nn.ModuleList(downsamplers) | |
| def forward(self, hidden_states): | |
| features = [] | |
| hidden_states = self.unshuffle(hidden_states) | |
| hidden_states = self.conv_in(hidden_states) | |
| for resnet, downsampler in zip(self.resnets, self.downsamplers): | |
| hidden_states = resnet(hidden_states, temb=None) | |
| features.append(hidden_states) | |
| hidden_states = downsampler(hidden_states) | |
| return features |