假如你有RLE的分割标注,如下图
要计算annotation中的area
coco的api可以计算,但官方给出的例程,完全是坑,会让你怀疑人生。
把segmentation放进pycocotools.mask.area,会出各种各样的错误。后来才在其他工具包里看到,要先将上面的segmentation编码,在放进area函数里面计算。代码如下
import pycocotools.mask as maskUtils
def annToRLE(ann, i_w, i_h):
h, w = i_h, i_w
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 = annToRLE(ann, segmentation['size'][0], segmentation['size'][1])
area = float(maskUtils.area(rle))
工具来自:https://tianchi.aliyun.com/competition/entrance/231787/information