ImageGuard / utils /img_utils.py
adwardlee's picture
Upload folder using huggingface_hub
2e1316e verified
raw
history blame
2.99 kB
from PIL import Image
from torchvision import transforms
from torchvision.transforms.functional import InterpolationMode
import torchvision.transforms.functional as F
from .ixc_utils import HD_transform
class Resize_with_pad:
def __init__(self, w=490, h=490):
self.w = w
self.h = h
def __call__(self, image):
w_1, h_1 = image.size
ratio_f = self.w / self.h
ratio_1 = w_1 / h_1
# check if the original and final aspect ratios are the same within a margin
if round(ratio_1, 2) != round(ratio_f, 2):
# padding to preserve aspect ratio
hp = int(w_1/ratio_f - h_1)
wp = int(ratio_f * h_1 - w_1)
if hp > 0 and wp < 0:
hp = hp // 2
image = F.pad(image, (0, hp, 0, hp), 0, "constant")
return F.resize(image, [self.h, self.w], interpolation=InterpolationMode.BICUBIC)
elif hp < 0 and wp > 0:
wp = wp // 2
image = F.pad(image, (wp, 0, wp, 0), 0, "constant")
return F.resize(image, [self.h, self.w], interpolation=InterpolationMode.BICUBIC)
else:
return F.resize(image, [self.h, self.w], interpolation=InterpolationMode.BICUBIC)
class ImageProcessor:
def __init__(self, image_size=224):
self.resizepad = Resize_with_pad(image_size, image_size)
mean = (0.48145466, 0.4578275, 0.40821073)
std = (0.26862954, 0.26130258, 0.27577711)
self.normalize = transforms.Normalize(mean, std)
self.transform = transforms.Compose([
# transforms.Resize((image_size, image_size),
# interpolation=InterpolationMode.BICUBIC),
transforms.ToTensor(),
self.normalize,
])
def __call__(self, itemname):
try:
if isinstance(itemname, Image.Image):
item = itemname.convert('RGB')
else:
item = Image.open(itemname).convert('RGB')
item = self.resizepad(item)
except Exception as e:
print(e, flush=True)
print('error img', itemname, flush=True)
exit()
return self.transform(item)
class ImageProcessorHD:
def __init__(self, image_size=224, hd_num=-1):
mean = (0.48145466, 0.4578275, 0.40821073)
std = (0.26862954, 0.26130258, 0.27577711)
self.normalize = transforms.Normalize(mean, std)
self.hd_num = hd_num
self.transform = transforms.Compose([
transforms.ToTensor(),
self.normalize,
])
def __call__(self, item):
item = Image.open(item).convert('RGB')
return self.transform(HD_transform(item, hd_num=self.hd_num))
def get_internlm_processor():
return ImageProcessor(image_size=490)
processor_dict = {
'Internlm': get_internlm_processor,
}
def get_image_processor(model_name):
return processor_dict[model_name]()