Как сохранить и повторно использовать результаты сегментации semanti c? - PullRequest
1 голос
/ 10 февраля 2020

Я использую Detector2 для запуска сегментации Semanti c на изображениях. Detectron2 имеет встроенную функцию для визуализации результатов. Я заинтересован в сохранении результатов сегментации и разборе их при необходимости. Поэтому я снова отслеживал код и обнаружил, что функция instances_to_coco_ json выводит результаты сегментации. Я пытался сохранить результаты.

Результат в следующем формате.

 {
        "image_id": 1, 
        "segmentation": {
            "counts": "R[W<=Sf0001O000000000000000000000000000000000000000^_\\?", 
            "size": [
                720, 
                1280
            ]
        }, 
        "category_id": 1, 
        "score": 0.992115
    }, 

Я ожидал получить результаты полумнемации в виде координат точек сегментации, как показано ниже:

 "segmentation": [
            [
                662.1764705882352, 
                387, 
                686, 
                386.5882352941176, 
                686, 
                398, 
                662.7647058823529, 
                399
            ]

Учитывая вывод в формате кокоса, как мне иметь смысл об этом?

1 Ответ

0 голосов
/ 07 марта 2020

Чтобы понять проблему, вам нужно знать, что в протоколе 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)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...