Чтобы понять проблему, вам нужно знать, что в протоколе COCO есть два разных формата хранения масок. Один использует многоугольники, такие как ваш второй пример, другой - использовать формат сжатия двоичных данных, называемый RLE , как в вашем первом примере. В COCO, если маска хранится в формате RLE, тогда сегментация будет объектом с ключами "counts"
и "size"
. Если вы отметите detectron2/detectron2/utils/visualizer.py
, вы найдете код для обработки различных форматов масок в конструкторе class GenericMask
. Вы можете легко преобразовать формат RLE в двоичные маски или полигоны, а также вы найдете скрипт визуализации в detectron2/tools/visualize_json_results.py
, чтобы быть очень полезным.
TLDR:
Короче говоря, чтобы преобразовать сегментацию RLE в двоичную маску, просто запустите следующий скрипт (предположим, что вы установили COCO python api, что является обязательным условием обнаружения2):
import pycocotools.mask as mask_util
# Using the segment provided by your first example
segment = {'counts': 'R[W<=Sf0001O000000000000000000000000000000000000000^_\\?',
'size': [720, 1280]}
# Decode a binary mask of shape (720, 1280) from segment
mask = mask_util.decode(segment)[:, :]
Если вы заинтересованы в преобразовании бинарных масок в полигоны, существует другой пакет под названием imantics
, который может помочь вам достичь этого. :
import numpy as np
from imantics import Polygons, Mask
# This can be any array
array = np.ones((100, 100))
polygons = Mask(array).polygons()
print(polygons.points)
print(polygons.segmentation)
Надеюсь, это поможет.