我使用detectron2对图像进行语义分割。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
]如果输出是coco格式的,我如何理解它?
发布于 2020-03-07 01:06:40
要理解这个问题,您需要知道COCO协议中有两种不同的存储掩码格式。一个是使用多边形,例如第二个例子,另一个是使用名为雷尔的二进制数据压缩格式,这是您的第一个示例。
在COCO中,如果以RLE格式存储掩码,则分割将是一个具有"counts"和"size"键的对象。如果您检查探测2/检测2/utils/visualizer.py alizer.py,您将在class GenericMask的构造函数中找到处理不同掩码格式的代码。
您可以轻松地将RLE格式转换为二进制掩码或多边形,并且您还会发现位于results.py的可视化脚本非常有用。
TLDR:
简而言之,要将RLE分段转换为二进制掩码,只需运行以下脚本(假设您已经安装了COCO,这是detection2的先决条件):
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)[:, :]如果您对将二进制掩码转换为多边形感兴趣,那么还有一个名为荒诞的包可以帮助您实现这一点:
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)希望这能有所帮助。
https://stackoverflow.com/questions/60143143
复制相似问题