akhaliq's picture
akhaliq HF staff
add files
89dc200
raw
history blame
4.41 kB
# -*- encoding: utf-8 -*-
'''
@File : direct_sr.py
@Time : 2022/03/02 13:58:11
@Author : Ming Ding
@Contact : dm18@mails.tsinghua.edu.cn
'''
# here put the import lib
import os
import sys
import math
import random
import torch
# -*- encoding: utf-8 -*-
'''
@File : inference_cogview2.py
@Time : 2021/10/10 16:31:34
@Author : Ming Ding
@Contact : dm18@mails.tsinghua.edu.cn
'''
# here put the import lib
import os
import sys
import math
import random
from PIL import ImageEnhance, Image
import torch
import argparse
from torchvision import transforms
from SwissArmyTransformer import get_args
from SwissArmyTransformer.training.model_io import load_checkpoint
from .dsr_sampling import filling_sequence_dsr, IterativeEntfilterStrategy
from SwissArmyTransformer.generation.utils import timed_name, save_multiple_images, generate_continually
from .dsr_model import DsrModel
from icetk import icetk as tokenizer
class DirectSuperResolution:
def __init__(self, args, path, max_bz=4, topk=6, onCUDA=False):
args.load = path
args.kernel_size = 5
args.kernel_size2 = 5
args.new_sequence_length = 4624
args.layout = [96,496,4096]
model = DsrModel(args)
if args.fp16:
model = model.half()
load_checkpoint(model, args) # on cpu
model.eval()
self.model = model
self.onCUDA = onCUDA
if onCUDA:
self.model = self.model.cuda()
invalid_slices = [slice(tokenizer.num_image_tokens, None)]
self.strategy = IterativeEntfilterStrategy(invalid_slices,
temperature=1.0, topk=topk) # temperature not used # Temperature Freezed Here!!
self.max_bz = max_bz
def __call__(self, text_tokens, image_tokens, enhance=False):
if len(text_tokens.shape) == 1:
text_tokens.unsqueeze_(0)
if len(image_tokens.shape) == 1:
image_tokens.unsqueeze_(0)
# ===================== Debug ======================== #
# new_image_tokens = []
# for small_img in image_tokens:
# decoded = tokenizer.decode(image_ids=small_img)
# decoded = torch.nn.functional.interpolate(decoded, size=(480, 480)).squeeze(0)
# ndarr = decoded.mul(255).add_(0.5).clamp_(0, 255).permute(1, 2, 0).to('cpu', torch.uint8).numpy()
# image_pil_raw = ImageEnhance.Sharpness(Image.fromarray(ndarr))
# small_img2 = tokenizer.encode(image_pil=image_pil_raw.enhance(1.5), image_size=480).view(-1)
# new_image_tokens.append(small_img2)
# image_tokens = torch.stack(new_image_tokens)
# return image_tokens
# ===================== END OF BLOCK ======================= #
if enhance:
new_image_tokens = []
for small_img in image_tokens:
decoded = tokenizer.decode(image_ids=small_img).squeeze(0)
ndarr = decoded.mul(255).add_(0.5).clamp_(0, 255).permute(1, 2, 0).to('cpu', torch.uint8).numpy()
image_pil_raw = ImageEnhance.Sharpness(Image.fromarray(ndarr))
small_img2 = tokenizer.encode(image_pil=image_pil_raw.enhance(1.), image_size=160).view(-1)
new_image_tokens.append(small_img2)
image_tokens = torch.stack(new_image_tokens)
seq = torch.cat((text_tokens,image_tokens), dim=1)
seq1 = torch.tensor([tokenizer['<start_of_image>']]*3601, device=image_tokens.device).unsqueeze(0).expand(text_tokens.shape[0], -1)
if not self.onCUDA:
print('Converting Dsr model...')
model = self.model.cuda()
else:
model = self.model
print('Direct super-resolution...')
output_list = []
for tim in range(max((text_tokens.shape[0]+self.max_bz-1) // self.max_bz, 1)):
output1 = filling_sequence_dsr(model,
seq[tim*self.max_bz:(tim+1)*self.max_bz],
seq1[tim*self.max_bz:(tim+1)*self.max_bz],
warmup_steps=1, block_hw=(1, 0),
strategy=self.strategy
)
output_list.extend(output1[1:])
if not self.onCUDA:
print('Moving back Dsr to cpu...')
model = model.cpu()
torch.cuda.empty_cache()
return torch.cat(output_list, dim=0)