二值mask转polygon/RLE (coco segment格式)

这篇具有很好参考价值的文章主要介绍了二值mask转polygon/RLE (coco segment格式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

coco数据集annotation的segmentation并不是二值mask,而是polygon格式,
看一个annotation.

{
	"segmentation": [[510.66,423.01,511.72,420.03,510.45......]], #两两组成(x,y)坐标,polygon格式
	"area": 702.1057499999998, #面积
	"iscrowd": 0,  #是不是一群物体,为0是seg是polygon格式,否则是RLE格式
	"image_id": 289343,  #对应的image id
	"bbox": [473.07,395.93,38.65,28.67], #(x,y,w,h)
	"category_id": 18,  #分类label
	"id": 1768  #当前annotation的id,每一个图像有不止一个对象,所以要对每一个对象编号(每个对象的ID是唯一的)
},

segmentation其实是一个二值mask的轮廓点,
如果想把二值mask转成这种格式,需要提取轮廓。

1.Polygon格式

网上找来一张二值mask的图片

mask转polygon,DeepLearning,python,opencv

提取它的轮廓

mask_img = cv2.imread("mask.png",cv2.IMREAD_GRAYSCALE)
contours, _ = cv2.findContours(mask_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
polygons = []
for object in contours:
    coords = []

    for point in object:
        coords.append(int(point[0][0]))
        coords.append(int(point[0][1]))

    polygons.append(coords)
    print(polygons)
    #[[131, 48, 130, 49, 129, 50, 128, 51, ...]]

这个polygon能不能用呢?是不是和coco的annotation格式一样?
下面来验证一下。
引入python自带的coco库,要用到里面的annToMask函数,把polygon转为mask,
然后imshow出来看看是不是和原图一样。

先看一下annToMask函数,它需要先把polygon格式转为RLE格式。

    def annToMask(self, ann):
        """
        Convert annotation which can be polygons, uncompressed RLE, or RLE to binary mask.
        :return: binary mask (numpy 2D array)
        """
        rle = self.annToRLE(ann)
        m = maskUtils.decode(rle)
        return m
        
    def annToRLE(self, ann):
        """
        Convert annotation which can be polygons, uncompressed RLE to RLE.
        :return: binary mask (numpy 2D array)
        """
        t = self.imgs[ann['image_id']]
        h, w = t['height'], t['width']
        segm = ann['segmentation']
        if type(segm) == list:
            # polygon -- a single object might consist of multiple parts
            # we merge all parts into one mask rle code
            rles = maskUtils.frPyObjects(segm, h, w)
            rle = maskUtils.merge(rles)
        elif type(segm['counts']) == list:
            # uncompressed RLE
            rle = maskUtils.frPyObjects(segm, h, w)
        else:
            # rle
            rle = ann['segmentation']
        return rle

转成RLE的过程中需要用到annotation里的image_id, segmentation.
而现在我们只有一个segmentation, 并没有image_id,
而image_id只是用来得到图片的w, h,
所以引入coco的instance_val2017.json文件,随便找一个image_id用一下。

from pycocotools.coco import COCO
coco_api = COCO('coco/annotations/instances_val2017.json')
ann = dict()
ann['image_id'] = 37777
ann['segmentation'] = polygons
mask = coco_api.annToMask(ann)
mask = np.clip(mask*255,0,255)

说明找到的轮廓是可以用的(随便找的image_id导致h,w和原图不一致,不过不影响mask).
(在曲线的连续性上仔细看会有一些误差)。

mask转polygon,DeepLearning,python,opencv

还是首选下面的RLE格式。

2.RLE格式

如果用在coco的segment, 首选这种,上面轮廓处会存在误差,且coco函数中polygon格式有诸多限制。

mask转RLE的代码来自segment anything的utils,
这里的mask是tensor形式的二值mask, 值是int型。文章来源地址https://www.toymoban.com/news/detail-569540.html

    def mask_to_rle(tensor: torch.Tensor) -> List[Dict[str, Any]]:
        """
        Encodes masks to an uncompressed RLE, in the format expected by
        pycoco tools.
        """
        # Put in fortran order and flatten h,w
        h, w, b = tensor.shape  #需要根据tensor的shape修改
        tensor = tensor.permute(2, 1, 0).flatten(1)  #需要根据tensor的shape修改

        # Compute change indices
        diff = tensor[:, 1:] ^ tensor[:, :-1] #要求值是int型
        change_indices = diff.nonzero()

        # Encode run length
        out = []
        for i in range(b):
            cur_idxs = change_indices[change_indices[:, 0] == i, 1]
            cur_idxs = torch.cat(
                [
                    torch.tensor([0], dtype=cur_idxs.dtype, device=cur_idxs.device),
                    cur_idxs + 1,
                    torch.tensor([h * w], dtype=cur_idxs.dtype, device=cur_idxs.device),
                ]
            )
            btw_idxs = cur_idxs[1:] - cur_idxs[:-1]
            counts = [] if tensor[i, 0] == 0 else [0]
            counts.extend(btw_idxs.detach().cpu().tolist())
            out.append({"size": [h, w], "counts": counts})
        return out

到了这里,关于二值mask转polygon/RLE (coco segment格式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集

    由于本人水平有限,难免出现错漏,敬请批评改正。 更多精彩内容,可点击进入YOLO系列专栏或我的个人主页查看 YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制 YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层 YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU YOLOv7训练自己的数据集(口罩检测)

    2024年02月15日
    浏览(37)
  • Segment Anything(SAM)全图分割做mask

    项目的源码和模型下载以及环境配置等可参考我的上一篇文章,这里不再赘述。  文章链接:https://blog.csdn.net/m0_63604019/article/details/130221434 在项目中创建一个名为segment-everything.py的文件,文件中写入如下代码: 然后右键点击【Run \\\'segment-everyting\\\'】运行segment-everyting.py文件,运

    2024年02月10日
    浏览(45)
  • 2023 Mask R-CNN 改进:DynaMask: Dynamic Mask Selection for Instance Segmentation 论文笔记

    写在前面   本周更新的第二篇论文阅读,2023年每周一篇博文,还剩5篇未补,继续加油~ 论文地址:DynaMask: Dynamic Mask Selection for Instance Segmentation 代码地址:https://github.com/lslrh/DynaMask 收录于:CVPR 2023 欢迎关注,主页更多干货,持续输出中~   一般的实例分割通常采用固定

    2024年02月01日
    浏览(81)
  • 【CV大模型SAM(Segment-Anything)】如何保存分割后的对象mask?并提取mask对应的图片区域?

    上一篇文章【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标中 详细介绍了大模型SAM(Segment-Anything)的不同使用方法 ,后面有很多小伙伴给我留言问我分割后的目标对象如何保存,这篇介绍一下分割后的ma

    2024年02月09日
    浏览(55)
  • RIS 系列 Mask Grounding for Referring Image Segmentation 论文阅读笔记

    写在前面   一篇 Arxiv 上面的新文章,看看清华大佬们的研究。 论文地址:Mask Grounding for Referring Image Segmentation 代码地址:原论文说将会开源,静待佳音~ 预计提交于:CVPR 2024 Ps:2023 年每周一篇博文阅读笔记,主页 更多干货,欢迎关注呀,期待 6 千粉丝有你的参与呦~   

    2024年02月03日
    浏览(51)
  • Segment Anything中将生成的多个mask结果拼接在一起,可视化(批量处理)

    使用提供的amg.py生成测试图片mask 将多个mask拼接到一起,并改变每个png中白色区域像素值颜色 输出:

    2024年02月14日
    浏览(67)
  • 从DETR到Mask2Former(1):DETR-segmentation结构全解析

    网上关于DETR做的detection的解析很多,但是DETR做Segmentation的几乎没有,本文结合DETR的论文与代码,对DETR做一个详细的拆解。理解DETR是理解Mask2Former的基础。 首先得把DETR-segmentation给run起来。Github上DETR的repository,下载了也只能run起来detection,run不起来segmentation功能,但还是下

    2024年01月22日
    浏览(38)
  • 【计算机视觉 | 目标检测】OVSeg:Open-Vocabulary Semantic Segmentation with Mask-adapted CLIP论文讲解

    开放词汇语义分割旨在根据文本描述将图像分割成语义区域,这些区域在训练过程中可能没有看到。 最近的两阶段方法首先生成与类别无关的mask proposals,然后利用预训练的视觉语言模型(例如CLIP)对 masked regions 进行分类。我们认为这种模式的性能瓶颈是预训练的CLIP模型,因

    2024年02月09日
    浏览(51)
  • 【mmdetection】用自己的coco数据集训练mask r-cnn并进行验证、测试,推理可视化,更改backbone,只针对某一标签进行训练

    本人呕心沥血从无到有的摸索,自己边尝试边整理的,其实耐心多看官方文档确实能找到很多东西(下面有官方文档的链接这里就不重复粘贴了),也为了方便我自己copy语句嘻嘻~ 为什么不是用Windows,作为一个小白我一开始真的想用windows,因为我懒得配双系统,但是没办法

    2024年02月04日
    浏览(43)
  • 一键转换labelimg格式为COCO格式

    1.实现了将目标检测任务中使用的 Pascal VOC 格式标注数据转换为 COCO 格式标注数据,并生成两个 COCO 格式的 JSON 文件,用于训练和验证。 2.通过解析 XML 文件,提取图片信息、类别信息和目标框信息,并将这些数据添加到对应的 COCO 格式数据中。 3.使用随机数种子将数据按照

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包