Как я могу использовать MaskRcnn на видео, чтобы удалить фон? - PullRequest
1 голос
/ 27 апреля 2020

У меня есть код для MaskRcnn на видео, но он просто маскирует объект, а не удаляет фон объекта в видео. Следующий код преобразует видео в кадры изображений. А затем его Обработка изображений, на последнем шаге - Поворот обработанных изображений для вывода видео. Записная книжка Google colab

    import cv2
import numpy as np


def random_colors(N):
    np.random.seed(1)
    colors = [tuple(255 * np.random.rand(3)) for _ in range(N)]
    return colors


def apply_mask(image, mask, color, alpha=0.5):
    """apply mask to image"""
    for n, c in enumerate(color):
        image[:, :, n] = np.where(
            mask == 1,
            image[:, :, n] * (1 - alpha) + alpha * c,
            image[:, :, n]
        )
    return image


def display_instances(image, boxes, masks, ids, names, scores):
    """
        take the image and results and apply the mask, box, and Label
    """
    n_instances = boxes.shape[0]
    colors = random_colors(n_instances)

    if not n_instances:
        print('NO INSTANCES TO DISPLAY')
    else:
        assert boxes.shape[0] == masks.shape[-1] == ids.shape[0]

    for i, color in enumerate(colors):
        if not np.any(boxes[i]):
            continue

        y1, x1, y2, x2 = boxes[i]
        label = names[ids[i]]
        score = scores[i] if scores is not None else None
        caption = '{} {:.2f}'.format(label, score) if score else label
        mask = masks[:, :, i]

        image = apply_mask(image, mask, color)
        image = cv2.rectangle(image, (x1, y1), (x2, y2), color, 2)
        image = cv2.putText(
            image, caption, (x1, y1), cv2.FONT_HERSHEY_COMPLEX, 0.7, color, 2
        )

    return image


if __name__ == '__main__':

`

def segment(image, r):
idx = r['scores'].argmax()
mask = r['masks'][:,:,idx]
mask = np.stack((mask,)3, axis=-1)
mask = mask.astype('uint8')
bg = 255 - mask * 255
mask_img = imagemask
result = mask_img+ bg
return result

segmentation = segment(image, r)
plt.subplots(1, figsize=(16, 16))
plt.axis('off')
plt.imshow(np.concatenate([image, segmentation], axis = 1))

Как использовать то же самое для удаления видео фон?

...