-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.py
144 lines (108 loc) · 3.99 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
from davisinteractive import utils
import torch
from torch.autograd import Variable
from torch.utils import data
import torch.nn as nn
import torch.nn.functional as F
import torch.nn.init as init
import torch.utils.model_zoo as model_zoo
from torchvision import models
# general libs
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import os
import copy
import cv2
import random
import glob
def get_fps(video):
return video.get(cv2.CAP_PROP_FPS)
def get_n_frames(video):
return int(video.get(cv2.CAP_PROP_FRAME_COUNT))
def pascal_color_map(N=256, normalized=False):
"""
Python implementation of the color map function for the PASCAL VOC data set.
Official Matlab version can be found in the PASCAL VOC devkit
http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html#devkit
"""
def bitget(byteval, idx):
return (byteval & (1 << idx)) != 0
dtype = 'float32' if normalized else 'uint8'
cmap = np.zeros((N, 3), dtype=dtype)
for i in range(N):
r = g = b = 0
c = i
for j in range(8):
r = r | (bitget(c, 0) << 7 - j)
g = g | (bitget(c, 1) << 7 - j)
b = b | (bitget(c, 2) << 7 - j)
c = c >> 3
cmap[i] = np.array([r, g, b])
cmap = cmap / 255 if normalized else cmap
return cmap
def load_frames(video, step, size=None):
frame_list = []
frame_ids = []
count = 0
while True:
success, image = video.read()
if not success:
break
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
if size is not None:
image = cv2.resize(image, size, interpolation=cv2.INTER_CUBIC)
frame_list.append(image)
frame_ids.append(count)
count += step
video.set(cv2.CAP_PROP_POS_FRAMES, count)
frames = np.stack(frame_list, axis=0)
return frames, frame_ids
def overlay_davis(image, mask, rgb=[255, 0, 0], cscale=2, alpha=0.5):
im_overlay = utils.visualization.overlay_mask(image, mask, alpha=alpha)
return im_overlay.astype(image.dtype)
def checkerboard(img_size, block_size):
width = int(
np.maximum(np.ceil(img_size[0] / block_size),
np.ceil(img_size[1] / block_size)))
b = np.zeros((block_size, block_size), dtype=np.uint8) + 32
w = np.zeros((block_size, block_size), dtype=np.uint8) + 255 - 32
row1 = np.hstack([w, b] * width)
row2 = np.hstack([b, w] * width)
board = np.vstack([row1, row2] * width)
board = np.stack([board, board, board], axis=2)
return board[:img_size[0], :img_size[1], :]
BIG_BOARD = checkerboard([1000, 1000], 20)
def overlay_checker(image, mask):
from scipy.ndimage.morphology import binary_erosion, binary_dilation
im_overlay = image.copy()
object_ids = np.unique(mask)
# board = checkerboard(image.shape[:2], block_size=20)
board = BIG_BOARD[:im_overlay.shape[0], :im_overlay.shape[1], :].copy()
binary_mask = (mask != 0)
# Compose image
board[binary_mask] = im_overlay[binary_mask]
return board.astype(image.dtype)
def overlay_color(image, mask, rgb=[255, 0, 255]):
from scipy.ndimage.morphology import binary_erosion, binary_dilation
im_overlay = image.copy()
object_ids = np.unique(mask)
board = np.ones(image.shape, dtype=np.uint8) * np.array(
rgb, dtype=np.uint8)[None, None, :]
binary_mask = (mask != 0)
# Compose image
board[binary_mask] = im_overlay[binary_mask]
return board.astype(image.dtype)
def overlay_fade(image, mask):
from scipy.ndimage.morphology import binary_erosion, binary_dilation
im_overlay = image.copy()
# Overlay color on binary mask
binary_mask = mask != 0
not_mask = mask == 0
# Compose image
im_overlay[not_mask] = 0.4 * im_overlay[not_mask]
countours = binary_dilation(binary_mask) ^ binary_mask
im_overlay[countours, 0] = 0
im_overlay[countours, 1] = 255
im_overlay[countours, 2] = 255
return im_overlay.astype(image.dtype)