| | import tqdm |
| | import torch |
| | from torchvision.transforms.functional import to_tensor |
| | import numpy as np |
| | import random |
| | import cv2 |
| |
|
| | def gen_dilate(alpha, min_kernel_size, max_kernel_size): |
| | kernel_size = random.randint(min_kernel_size, max_kernel_size) |
| | kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size,kernel_size)) |
| | fg_and_unknown = np.array(np.not_equal(alpha, 0).astype(np.float32)) |
| | dilate = cv2.dilate(fg_and_unknown, kernel, iterations=1)*255 |
| | return dilate.astype(np.float32) |
| |
|
| | def gen_erosion(alpha, min_kernel_size, max_kernel_size): |
| | kernel_size = random.randint(min_kernel_size, max_kernel_size) |
| | kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size,kernel_size)) |
| | fg = np.array(np.equal(alpha, 255).astype(np.float32)) |
| | erode = cv2.erode(fg, kernel, iterations=1)*255 |
| | return erode.astype(np.float32) |
| |
|
| | @torch.inference_mode() |
| | @torch.amp.autocast('cuda') |
| | def matanyone(processor, frames_np, mask, r_erode=0, r_dilate=0, n_warmup=10): |
| | """ |
| | Args: |
| | frames_np: [(H,W,C)]*n, uint8 |
| | mask: (H,W), uint8 |
| | Outputs: |
| | com: [(H,W,C)]*n, uint8 |
| | pha: [(H,W,C)]*n, uint8 |
| | """ |
| |
|
| | |
| | bgr = (np.array([120, 255, 155], dtype=np.float32)/255).reshape((1, 1, 3)) |
| | objects = [1] |
| |
|
| | |
| | if r_dilate > 0: |
| | mask = gen_dilate(mask, r_dilate, r_dilate) |
| | if r_erode > 0: |
| | mask = gen_erosion(mask, r_erode, r_erode) |
| |
|
| | mask = torch.from_numpy(mask).cuda() |
| |
|
| | frames_np = [frames_np[0]]* n_warmup + frames_np |
| |
|
| | frames = [] |
| | phas = [] |
| | i = 0 |
| | for ti, frame_single in tqdm.tqdm(enumerate(frames_np)): |
| | image = to_tensor(frame_single).cuda().float() |
| | if i % 10 ==0: |
| | pass |
| | |
| | i += 1 |
| | if ti == 0: |
| | output_prob = processor.step(image, mask, objects=objects) |
| | output_prob = processor.step(image, first_frame_pred=True) |
| | else: |
| | if ti <= n_warmup: |
| | output_prob = processor.step(image, first_frame_pred=True) |
| | else: |
| | output_prob = processor.step(image) |
| |
|
| | |
| | mask = processor.output_prob_to_mask(output_prob) |
| |
|
| | pha = mask.unsqueeze(2).cpu().numpy() |
| | com_np = frame_single / 255. * pha + bgr * (1 - pha) |
| | |
| | |
| | if ti > (n_warmup-1): |
| | frames.append((com_np*255).astype(np.uint8)) |
| | phas.append((pha*255).astype(np.uint8)) |
| | |
| | return frames, phas |