555*_*597 2 computer-vision image-segmentation semantic-segmentation
我使用detectorron2对图像运行语义分割。Detectron2 具有用于可视化结果的预构建函数。我有兴趣保存分割结果并在需要时解析它们。于是我回溯代码,发现instances_to_coco_json函数就是输出分割结果的函数。我尝试保存结果。
结果采用以下格式:
{
"image_id": 1,
"segmentation": {
"counts": "R[W<=Sf0001O000000000000000000000000000000000000000^_\\?",
"size": [
720,
1280
]
},
"category_id": 1,
"score": 0.992115
},
Run Code Online (Sandbox Code Playgroud)
我期望得到分割结果作为分割点的坐标,如下所示:
"segmentation": [
[
662.1764705882352,
387,
686,
386.5882352941176,
686,
398,
662.7647058823529,
399
]
Run Code Online (Sandbox Code Playgroud)
鉴于输出是 coco 格式,我如何理解它?
要理解这个问题,您需要知道 COCO 协议中有两种不同的存储掩码格式。一个是使用多边形,例如您的第二个示例,另一个是使用称为RLE 的二进制数据压缩格式,这就是您的第一个示例的情况。
在 COCO 中,如果掩码以 RLE 格式存储,则分段将是键为"counts"和 的对象"size"。如果您检查detectorron2/detectron2/utils/visualizer.py,您会在 的构造函数中找到处理不同掩码格式的代码class GenericMask。
您可以轻松地将 RLE 格式转换为二进制蒙版或多边形,您还会发现位于detectorron2/tools/visualize_json_results.py的可视化脚本非常有帮助。
总而言之:
简而言之,要将 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)[:, :]
Run Code Online (Sandbox Code Playgroud)
如果您有兴趣将二进制蒙版转换为多边形,还有另一个名为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)
Run Code Online (Sandbox Code Playgroud)
希望有帮助。
| 归档时间: |
|
| 查看次数: |
4416 次 |
| 最近记录: |