最近的项目中需要评价图像分割中每个目标的分割精度,如果目标分割精度大于阈值,则分割成功。每个图像中存在多个目标,分割结束后,如何评价每个目标的分割效果。本文的做法是crop出每个目标,分别计算其iou。
流程:
1、读取mask与resut。
2、对于mask使用opencv中的findcontours函数,找出每个目标。
3、用boundingRect求出目标的外接矩形,并crop出,与result对比计算。
iou计算:
def iou(mask, result):
intersection = np.sum(np.logical_and(mask > 0, result > 0))
union = np.sum(np.logical_or(mask > 0, result > 0))
return np.sum(intersection)/np.sum(union)
计算每个目标的精度:
for mask in mask_list:
img_num = 0
result = mask.replace('mask_255', 'org')
mask_img = cv2.imread(mask, flags=cv2.IMREAD_ANYDEPTH)
result_img = cv2.imread(result, flags=cv2.IMREAD_ANYDEPTH)
contours, hierarchy = cv2.findContours(mask_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
num_labels += len(contours)
for i in range(0, len(contours)):
x, y, w, h = cv2.boundingRect(contours[i])#取得每个目标的外接矩形的起始点坐标与举行w, h
img_num += 1
mask_roi = mask_img[y:y+h, x:x+w]#crop出mask目标区域
result_img = cv2.resize(result_img, (mask_img.shape[1], mask_img.shape[0]))
res_roi = result_img[y:y+h, x:x+w]#crop出result目标区域
ratio = iou(mask_roi, res_roi)#计算iou