如何将COCO数据集的Run Length Encoding(RLE)转回segmentation格式
RLE转COCO segmentation格式解决方案
你可以通过pycocotools结合轮廓提取工具实现反向转换,完整实现代码如下:
from pycocotools import mask import numpy as np import cv2 def rle_to_segmentation(rle): # 将RLE解码为二值掩码 binary_mask = mask.decode(rle) # 提取掩码外层轮廓 contours, _ = cv2.findContours(binary_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) segmentation = [] for contour in contours: # 调整轮廓格式为COCO要求的一维浮点数组 contour_list = contour.flatten().astype(float).tolist() # 过滤点数不足的无效轮廓(COCO要求多边形至少3个点,即6个坐标值) if len(contour_list) >= 6: segmentation.append(contour_list) return segmentation # 输入你要转换的RLE结构 rle = { 'size': [640, 529], 'counts': b'_PX9330cc07O2N1j\\ODhb0=U]OEkb0;T]OFlb0:T]OFlb0:R]OHnb0d02N1O2N2N2M201O1O000006J2N001OEh\\OMYc03l\\OGUc08:0c\\OFTc09m\\OIPc08o\\OIPc09n\\OHQc0d00O1O0012N0O12\\Oi\\O031Vc0KV]O0[j:' } # 调用转换得到segmentation segmentation = rle_to_segmentation(rle)
注意事项
- 若需要完全还原原始标注的所有坐标点,可将轮廓提取参数
cv2.CHAIN_APPROX_SIMPLE替换为cv2.CHAIN_APPROX_NONE,该参数会保留轮廓上的每一个像素点,不会做冗余点压缩 - 若标注的
iscrowd属性为1,对应RLE可能包含多个连通区域,上述代码会自动将所有连通区域的轮廓分别加入segmentation数组中,符合COCO格式规范 - 若不想引入OpenCV依赖,可使用scikit-image库的
find_contours接口实现相同的轮廓提取逻辑
内容的提问来源于stack exchange,提问作者Yuriy Leonov
相关产品推荐
相关产品推荐

