| import numpy as np |
| import torch |
| from PIL import Image |
| from modules.mobilesamv2.utils.transforms import ResizeLongestSide |
|
|
| from modules.dust3r.utils.image import _resize_pil_image |
|
|
| class Images: |
| def __init__(self, filelist, device, size=512): |
| |
| self.pil_images = [] |
| self.pil_images_size = [] |
| self.np_images = [] |
| self.np_images_size = [] |
| |
| tmp_images = [] |
| first_image_size = None |
| all_images_same_size = True |
| for img_path in filelist: |
| pil_image = Image.open(img_path).convert("RGB") |
| tmp_images.append(pil_image) |
|
|
| current_image_size = pil_image.size |
| if first_image_size is None: |
| first_image_size = current_image_size |
| else: |
| if current_image_size != first_image_size: |
| all_images_same_size = False |
| |
| for img in tmp_images: |
|
|
| if not all_images_same_size: |
| |
| pil_image = _resize_pil_image(img, size) |
| W, H = pil_image.size |
| cx, cy = W//2, H//2 |
| halfw, halfh = ((2*cx)//16)*8, ((2*cy)//16)*8 |
| if W == H: |
| halfh = 3*halfw/4 |
| pil_image = pil_image.crop((cx-halfw, cy-halfh, cx+halfw, cy+halfh)) |
| else: |
| pil_image = img |
|
|
| np_image = np.array(pil_image) |
|
|
| height, width = pil_image.size |
| np_shape = np_image.shape[:2] |
|
|
| self.pil_images.append(pil_image) |
| self.np_images.append(np_image) |
|
|
| self.pil_images_size.append((height, width)) |
| self.np_images_size.append(np_shape) |
| |
| |
| |
| img_mean = torch.tensor((0.485, 0.456, 0.406))[:, None, None] |
| img_std = torch.tensor((0.229, 0.224, 0.225))[:, None, None] |
| self.sam2_images = [] |
| |
| self.sam2_video_size = (self.pil_images_size[0][1], self.pil_images_size[0][0]) |
| self.sam2_input_size = 512 |
| for pil_image in self.pil_images: |
| np_image = np.array(pil_image.resize((self.sam2_input_size, self.sam2_input_size))) |
| np_image = np_image / 255.0 |
| sam2_image = torch.from_numpy(np_image).permute(2, 0, 1) |
| self.sam2_images.append(sam2_image) |
| self.sam2_images = torch.stack(self.sam2_images) |
| self.sam2_images -= img_mean |
| self.sam2_images /= img_std |
| self.sam2_images.to(device) |
|
|
| |
| self.sam1_images = [] |
| self.sam1_images_size = [] |
| self.sam1_input_size = 1024 |
| self.sam1_transform = ResizeLongestSide(self.sam1_input_size) |
| for np_image in self.np_images: |
| sam1_image = self.sam1_transform.apply_image(np_image) |
| sam1_image_torch = torch.as_tensor(sam1_image, device=device) |
| transformed_image = sam1_image_torch.permute(2, 0, 1).contiguous()[None, :, :, :] |
| |
| self.sam1_images.append(transformed_image) |
| self.sam1_images_size.append(tuple(transformed_image.shape[-2:])) |