|
import numpy as np |
|
|
|
def rle_encode(x, fg_val=1): |
|
""" |
|
Args: |
|
x: numpy array of shape (height, width), 1 - mask, 0 - background |
|
Returns: run length encoding as list |
|
""" |
|
|
|
dots = np.where( |
|
x.T.flatten() == fg_val)[0] |
|
run_lengths = [] |
|
prev = -2 |
|
for b in dots: |
|
if b > prev + 1: |
|
run_lengths.extend((b + 1, 0)) |
|
run_lengths[-1] += 1 |
|
prev = b |
|
return run_lengths |
|
|
|
def list_to_string(x): |
|
""" |
|
Converts list to a string representation |
|
Empty list returns '-' |
|
""" |
|
if x: |
|
s = str(x).replace("[", "").replace("]", "").replace(",", "") |
|
else: |
|
s = '-' |
|
return s |
|
|
|
|
|
def rle_decode(mask_rle, shape=(256, 256)): |
|
''' |
|
mask_rle: run-length as string formatted (start length) |
|
empty predictions need to be encoded with '-' |
|
shape: (height, width) of array to return |
|
Returns numpy array, 1 - mask, 0 - background |
|
''' |
|
|
|
img = np.zeros(shape[0]*shape[1], dtype=np.uint8) |
|
if mask_rle != '-': |
|
s = mask_rle.split() |
|
starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])] |
|
starts -= 1 |
|
ends = starts + lengths |
|
for lo, hi in zip(starts, ends): |
|
img[lo:hi] = 1 |
|
return img.reshape(shape, order='F') |