SRNet-x4-Upscaler / srnet.py
JohanBeytell's picture
Upload 4 files
f7494c3 verified
Raw History Blame Contribute Delete
1.3 kB
import torch
import torch.nn as nn
import torch.nn.functional as F
try:
from huggingface_hub import PyTorchModelHubMixin
except ImportError: # the model still works without the hub helpers
class PyTorchModelHubMixin:
pass
class ResBlock(nn.Module):
def __init__(self, nf):
super().__init__()
self.c1 = nn.Conv2d(nf, nf, 3, 1, 1)
self.c2 = nn.Conv2d(nf, nf, 3, 1, 1)
def forward(self, x):
return x + self.c2(F.relu(self.c1(x), inplace=True))
class SRNet(nn.Module, PyTorchModelHubMixin):
"""x{scale} super-resolution. Input: float RGB (B,3,H,W) in [0,1]. Output: (B,3,H*scale,W*scale), clamp to [0,1]."""
def __init__(self, scale: int = 4, nf: int = 64, nb: int = 16):
super().__init__()
self.scale, self.nf, self.nb = scale, nf, nb
self.head = nn.Conv2d(3, nf, 3, 1, 1)
self.body = nn.Sequential(*[ResBlock(nf) for _ in range(nb)])
self.tail = nn.Conv2d(nf, nf, 3, 1, 1)
self.up = nn.Conv2d(nf, 3 * scale * scale, 3, 1, 1)
self.shuffle = nn.PixelShuffle(scale)
def forward(self, x):
f = self.head(x)
f = f + self.tail(self.body(f))
return self.shuffle(self.up(f)) + F.interpolate(x, scale_factor=self.scale, mode="bicubic", align_corners=False)