1. 用seg2mask函数将segmentation转化为二值图(mask)
2. mask_iou用来计算图片中两个mask的iou
import json
import cv2
import numpy as np
from pycocotools import mask
def json_load(json_file):
with open(json_file, "r") as f:
data = json.load(f)
return data
def seg2mask():
json_file = "517/imageset/Max15B2018081900282_A02.json"
img = cv2.imread(json_file.replace(".json", ".jpg"))
h, w, _ = img.shape
data = json_load(json_file)
segment = data['anns'][0] ['segmentation']
# polygon -- a single object might consist of multiple parts
# we merge all parts into one mask rle code
rles = mask.frPyObjects(segment, h, w)
rle = mask.merge(rles)
area = mask.area(rles)
bbox = mask.toBbox(rles)
# convert rle to binart mask (numpy 2D array)
m = mask.decode(rle)
#m *= 255
#print(m)
#cv2.imwrite("test.jpg", m)
return m
def mask_iou(mask1, mask2):
area1 = mask1.sum()
area2 = mask2.sum()
inter = ((mask1+mask2)==2).sum()
mask_iou = inter / (area1+area2-inter)
return mask_iou
if __name__ == "__main__":
m = seg2mask()
mask_iou = mask_iou(m, m)