|
""" pre-trained GAN models for feature visualization |
|
Examples: |
|
# Load a state dict |
|
G = upconvGAN("fc6") |
|
# Load a state dict from a pretrained model |
|
G = upconvGAN("pool5") |
|
G.G.load_state_dict(torch.hub.load_state_dict_from_url(r"https://drive.google.com/uc?export=download&id=1vB_tOoXL064v9D6AKwl0gTs1a7jo68y7",progress=True)) |
|
""" |
|
import os |
|
from os.path import join |
|
from sys import platform |
|
from collections import OrderedDict |
|
import torch |
|
import torch.nn as nn |
|
import torch.nn.functional as F |
|
|
|
model_urls = { |
|
"caffenet": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/caffenet.pt", |
|
"norm1": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/upconvGAN_norm1.pt", |
|
"norm2": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/upconvGAN_norm2.pt", |
|
"conv3": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/upconvGAN_conv3.pt", |
|
"conv4": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/upconvGAN_conv4.pt", |
|
"pool5": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/upconvGAN_pool5.pt", |
|
"fc6": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/upconvGAN_fc6.pt", |
|
"fc6_eucl": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/upconvGAN_fc6_eucl.pt", |
|
"fc7": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/upconvGAN_fc7.pt", |
|
"fc8": "https://huggingface.co/binxu/DeePSim_DosovitskiyBrox2016/resolve/main/upconvGAN_fc8.pt", |
|
} |
|
|
|
def download_file(url, local_path): |
|
import requests |
|
from tqdm.auto import tqdm |
|
response = requests.get(url, stream=True) |
|
file_size = int(response.headers.get('content-length', 0)) |
|
chunk_size = 1024 |
|
progress_bar = tqdm(total=file_size, unit='iB', unit_scale=True) |
|
|
|
with open(local_path, 'wb') as file: |
|
for chunk in response.iter_content(chunk_size=chunk_size): |
|
progress_bar.update(len(chunk)) |
|
file.write(chunk) |
|
|
|
progress_bar.close() |
|
if file_size != 0 and progress_bar.n != file_size: |
|
print("ERROR, something went wrong.") |
|
|
|
|
|
def load_statedict_from_online(name="fc6"): |
|
import requests |
|
from requests.exceptions import HTTPError |
|
torchhome = torch.hub.get_dir() |
|
ckpthome = join(torchhome, "checkpoints") |
|
os.makedirs(ckpthome, exist_ok=True) |
|
filepath = join(ckpthome, "upconvGAN_%s.pt"%name) |
|
if not os.path.exists(filepath): |
|
print(f"downloading weights of `upconvGAN_{name}.pt` to {filepath}") |
|
download_file(model_urls[name], filepath) |
|
|
|
SD = torch.load(filepath) |
|
return SD |
|
|
|
|
|
class View(nn.Module): |
|
def __init__(self, *shape): |
|
super(View, self).__init__() |
|
self.shape = shape |
|
|
|
def forward(self, x): |
|
return x.view(*self.shape) |
|
|
|
|
|
class ScalarMultiply(nn.Module): |
|
def __init__(self, scalar): |
|
super(ScalarMultiply, self).__init__() |
|
self.scalar = scalar |
|
|
|
def forward(self, x): |
|
return self.scalar * x |
|
|
|
|
|
RGB_mean = torch.tensor([123.0, 117.0, 104.0]) |
|
RGB_mean = torch.reshape(RGB_mean, (1, 3, 1, 1)) |
|
class upconvGAN(nn.Module): |
|
def __init__(self, name="fc6", pretrained=True): |
|
super(upconvGAN, self).__init__() |
|
self.name = name |
|
if name == "fc6" or name == "fc7" or name == "fc6_eucl": |
|
self.G = nn.Sequential(OrderedDict([ |
|
('defc7', nn.Linear(in_features=4096, out_features=4096, bias=True)), |
|
('relu_defc7', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('defc6', nn.Linear(in_features=4096, out_features=4096, bias=True)), |
|
('relu_defc6', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('defc5', nn.Linear(in_features=4096, out_features=4096, bias=True)), |
|
('relu_defc5', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('reshape', View((-1, 256, 4, 4))), |
|
('deconv5', nn.ConvTranspose2d(256, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv5', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv5_1', nn.ConvTranspose2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv5_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv4', nn.ConvTranspose2d(512, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv4', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv4_1', nn.ConvTranspose2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv4_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv3', nn.ConvTranspose2d(256, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv3', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv3_1', nn.ConvTranspose2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv3_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv2', nn.ConvTranspose2d(128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv2', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv1', nn.ConvTranspose2d(64, 32, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv0', nn.ConvTranspose2d(32, 3, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
])) |
|
self.codelen = self.G[0].in_features |
|
self.latent_shape = (4096,) |
|
elif name == "fc8": |
|
self.G = nn.Sequential(OrderedDict([ |
|
("defc7", nn.Linear(in_features=1000, out_features=4096, bias=True)), |
|
("relu_defc7", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("defc6", nn.Linear(in_features=4096, out_features=4096, bias=True)), |
|
("relu_defc6", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("defc5", nn.Linear(in_features=4096, out_features=4096, bias=True)), |
|
("relu_defc5", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("reshape", View((-1, 256, 4, 4))), |
|
("deconv5", nn.ConvTranspose2d(256, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
("relu_deconv5", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("conv5_1", nn.ConvTranspose2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
("relu_conv5_1", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("deconv4", nn.ConvTranspose2d(512, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
("relu_deconv4", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("conv4_1", nn.ConvTranspose2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
("relu_conv4_1", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("deconv3", nn.ConvTranspose2d(256, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
("relu_deconv3", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("conv3_1", nn.ConvTranspose2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
("relu_conv3_1", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("deconv2", nn.ConvTranspose2d(128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
("relu_deconv2", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("deconv1", nn.ConvTranspose2d(64, 32, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
("relu_deconv1", nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
("deconv0", nn.ConvTranspose2d(32, 3, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
])) |
|
self.codelen = self.G[0].in_features |
|
self.latent_shape = (1000,) |
|
elif name == "pool5": |
|
self.G = nn.Sequential(OrderedDict([ |
|
('Rconv6', nn.Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('Rrelu6', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv7', nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('Rrelu7', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv8', nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1))), |
|
('Rrelu8', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv5', nn.ConvTranspose2d(512, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv5', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv5_1', nn.ConvTranspose2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv5_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv4', nn.ConvTranspose2d(512, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv4', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv4_1', nn.ConvTranspose2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv4_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv3', nn.ConvTranspose2d(256, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv3', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv3_1', nn.ConvTranspose2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv3_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv2', nn.ConvTranspose2d(128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv2', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv1', nn.ConvTranspose2d(64, 32, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv0', nn.ConvTranspose2d(32, 3, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), ])) |
|
self.codelen = self.G[0].in_channels |
|
self.latent_shape = (256, 6, 6) |
|
elif name == "conv4": |
|
self.G = nn.Sequential(OrderedDict([ |
|
('Rconv6', nn.Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1))), |
|
('Rrelu6', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv7', nn.Conv2d(384, 512, kernel_size=(3, 3), stride=(1, 1))), |
|
('Rrelu7', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv8', nn.Conv2d(512, 512, kernel_size=(2, 2), stride=(1, 1))), |
|
('Rrelu8', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv5', nn.ConvTranspose2d(512, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv5', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv5_1', nn.ConvTranspose2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv5_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv4', nn.ConvTranspose2d(256, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv4', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv4_1', nn.ConvTranspose2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv4_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv3', nn.ConvTranspose2d(128, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv3', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv3_1', nn.ConvTranspose2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv3_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv2', nn.ConvTranspose2d(128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv2', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv2_1', nn.Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv2_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv1', nn.ConvTranspose2d(32, 16, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv1_1', nn.Conv2d(16, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('tanh', nn.Tanh()), |
|
("scaling", ScalarMultiply(255.0)), |
|
])) |
|
self.codelen = self.G[0].in_channels |
|
self.latent_shape = (384, 13, 13) |
|
elif name == "conv3": |
|
self.G = nn.Sequential(OrderedDict([ |
|
('Rconv6', nn.Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1))), |
|
('Rrelu6', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv7', nn.Conv2d(384, 512, kernel_size=(3, 3), stride=(1, 1))), |
|
('Rrelu7', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv8', nn.Conv2d(512, 512, kernel_size=(2, 2), stride=(1, 1))), |
|
('Rrelu8', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv5', nn.ConvTranspose2d(512, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv5', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv5_1', nn.ConvTranspose2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv5_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv4', nn.ConvTranspose2d(256, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv4', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv4_1', nn.ConvTranspose2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv4_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv3', nn.ConvTranspose2d(128, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv3', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv3_1', nn.ConvTranspose2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv3_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv2', nn.ConvTranspose2d(128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv2', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv2_1', nn.Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv2_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv1', nn.ConvTranspose2d(32, 16, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv1_1', nn.Conv2d(16, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('tanh', nn.Tanh()), |
|
("scaling", ScalarMultiply(255.0)), |
|
])) |
|
self.codelen = self.G[0].in_channels |
|
self.latent_shape = (384, 13, 13) |
|
elif name == "norm2": |
|
self.G = nn.Sequential(OrderedDict([ |
|
('Rconv6', nn.Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))), |
|
('Rrelu6', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv7', nn.Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('Rrelu7', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv8', nn.Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('Rrelu8', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv4', nn.ConvTranspose2d(128, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv4', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv4_1', nn.Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv4_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv3', nn.ConvTranspose2d(128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv3', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv3_1', nn.Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv3_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv2', nn.ConvTranspose2d(64, 32, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv2', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv2_1', nn.Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv2_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv1', nn.ConvTranspose2d(32, 16, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('conv1_1', nn.Conv2d(16, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('tanh', nn.Tanh()), |
|
("scaling", ScalarMultiply(255.0)), |
|
])) |
|
self.codelen = self.G[0].in_channels |
|
self.latent_shape = (256, 13, 13) |
|
elif name == "norm1": |
|
self.G = nn.Sequential(OrderedDict([ |
|
('Rconv6', nn.Conv2d(96, 128, kernel_size=(3, 3), stride=(2, 2), padding=(2, 2))), |
|
('Rrelu6', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv7', nn.Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('Rrelu7', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('Rconv8', nn.Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('Rrelu8', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv4', nn.ConvTranspose2d(128, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv4', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv4_1', nn.Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv4_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv3', nn.ConvTranspose2d(128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv3', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv3_1', nn.Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv3_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv2', nn.ConvTranspose2d(64, 32, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('relu_deconv2', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('conv2_1', nn.Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu_conv2_1', nn.LeakyReLU(negative_slope=0.3, inplace=True)), |
|
('deconv1', nn.ConvTranspose2d(32, 16, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))), |
|
('conv1_1', nn.Conv2d(16, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('tanh', nn.Tanh()), |
|
("scaling", ScalarMultiply(255.0)), |
|
])) |
|
self.codelen = self.G[0].in_channels |
|
self.latent_shape = (96, 27, 27) |
|
|
|
if pretrained: |
|
SD = load_statedict_from_online(name) |
|
SDnew = OrderedDict() |
|
for name, W in SD.items(): |
|
name = name.replace(".1.", ".") |
|
SDnew[name] = W |
|
self.G.load_state_dict(SDnew) |
|
|
|
def sample_vector(self, sampn=1, device="cuda", noise_std=1.0): |
|
return torch.randn(sampn, self.codelen, device=device) * noise_std |
|
|
|
def forward(self, x): |
|
return self.G(x)[:, [2, 1, 0], :, :] |
|
|
|
def visualize(self, x, scale=1.0): |
|
raw = self.G(x)[:, [2, 1, 0], :, :] |
|
return torch.clamp(raw + RGB_mean.to(raw.device), 0, 255.0) / 255.0 * scale |
|
|
|
def visualize_batch(self, x_arr, scale=1.0, B=42, ): |
|
coden = x_arr.shape[0] |
|
img_all = [] |
|
csr = 0 |
|
with torch.no_grad(): |
|
while csr < coden: |
|
csr_end = min(csr + B, coden) |
|
imgs = self.visualize(x_arr[csr:csr_end, :].cuda(), scale).cpu() |
|
img_all.append(imgs) |
|
csr = csr_end |
|
img_all = torch.cat(img_all, dim=0) |
|
return img_all |
|
|
|
def render(self, x, scale=1.0, B=42): |
|
coden = x.shape[0] |
|
img_all = [] |
|
csr = 0 |
|
while csr < coden: |
|
csr_end = min(csr + B, coden) |
|
with torch.no_grad(): |
|
imgs = self.visualize(torch.from_numpy(x[csr:csr_end, :]).float().cuda(), scale).permute(2,3,1,0).cpu().numpy() |
|
img_all.extend([imgs[:, :, :, imgi] for imgi in range(imgs.shape[3])]) |
|
csr = csr_end |
|
return img_all |
|
|
|
def visualize_batch_np(self, codes_all_arr, scale=1.0, B=42, verbose=False): |
|
coden = codes_all_arr.shape[0] |
|
img_all = None |
|
csr = 0 |
|
with torch.no_grad(): |
|
while csr < coden: |
|
csr_end = min(csr + B, coden) |
|
imgs = self.visualize(torch.from_numpy(codes_all_arr[csr:csr_end, :]).float().cuda(), scale).cpu() |
|
img_all = imgs if img_all is None else torch.cat((img_all, imgs), dim=0) |
|
csr = csr_end |
|
return img_all |
|
|
|
|
|
class Caffenet(nn.Module): |
|
def __init__(self, pretrained=True, ): |
|
super(Caffenet, self).__init__() |
|
self.net = nn.Sequential(OrderedDict([ |
|
|
|
('conv1', nn.Conv2d(3, 96, kernel_size=(11, 11), stride=(4, 4))), |
|
('relu1', nn.ReLU(inplace=True)), |
|
('pool1', nn.MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)), |
|
('norm1', nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=1.0)), |
|
|
|
('conv2', nn.Conv2d(96, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=2)), |
|
('relu2', nn.ReLU(inplace=True)), |
|
('pool2', nn.MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)), |
|
('norm2', nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=1.0)), |
|
|
|
('conv3', nn.Conv2d(256, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))), |
|
('relu3', nn.ReLU(inplace=True)), |
|
|
|
('conv4', nn.Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2)), |
|
('relu4', nn.ReLU(inplace=True)), |
|
|
|
('conv5', nn.Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2)), |
|
('relu5', nn.ReLU(inplace=True)), |
|
('pool5', nn.MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)), |
|
|
|
('flatten', nn.Flatten()), |
|
('fc6', nn.Linear(9216, 4096)), |
|
('relu6', nn.ReLU(inplace=True)), |
|
('fc7', nn.Linear(4096, 4096)), |
|
('relu7', nn.ReLU(inplace=True)), |
|
('fc8', nn.Linear(4096, 1000)) |
|
])) |
|
if pretrained: |
|
SD = load_statedict_from_online("caffenet") |
|
SDnew = OrderedDict() |
|
for name, W in SD.items(): |
|
name = name.replace(".1.", ".") |
|
SDnew[name] = W |
|
self.net.load_state_dict(SDnew) |
|
|
|
def forward(self, x, preproc=False, scale=1.0): |
|
if preproc: |
|
x = x.float() / scale * 255.0 |
|
x = x - RGB_mean.to(x.device) |
|
x = x[:, [2, 1, 0], :, :] |
|
return self.net(x) |
|
|
|
|