车牌检测回归任务(三、目标检测模型评估)

目标检测模型评估的常用指标是召回率(Recall),精度(Precision),IoU(交并比),其实在Tensorflow中有对应的API(tf.metrics.Accuracy),但是本人为了更深入的理解这些概念,所以自写。

思路:将预测的四个坐标在单通道图像进行填充绘制,即目标区域为1,非目标区域为0,计算非0像素的个数就是目标区域的面积。当然也可以直接利用不规则四边形的面积来计算(博客:https://blog.csdn.net/attitude_yu/article/details/81204694)。真实与预测相交区域的面积也是通过最简单的计算像素的个数来获得。

import  numpy as np
import cv2

Width = 64
Height = 64
def coord_convert_arr(coord):
    img = np.zeros((Height, Width))
    fill_coord = np.array(coord, np.int32).reshape((4,2))
    new_img = cv2.fillPoly(img, [fill_coord], 1) #2121
    # 获得非0区域的像素个数
    non_zero = cv2.countNonZero(new_img)+1
    #print("non zero num:",non_zero)
    # 转化为单行数组
    arr = new_img.reshape((1,Height*Width))[0]
    return arr, non_zero

# 获得相交区域的像素个数
def inter_pixel_num(label_arr, pred_arr):
    count = 0
    for idx in range(Width*Height):
        if label_arr[idx]==1 and pred_arr[idx]==1:
            count +=1
    return count
# 将归一化后的坐标调整为原图上的坐标
def adjust_coord(coord):
    for idx in range(8):
        if idx%2==0:
            coord[idx]=coord[idx]*Width
        else:
            coord[idx]=coord[idx]*Height
    return coord

# 将调整后的坐标恢复为归一化的坐标
def recovery_coord(coord):
    for idx in range(8):
        if idx%2==0:
            coord[idx]=coord[idx]/Width
        else:
            coord[idx]=coord[idx]/Height
    return coord

# 根据像素个数计算召回 精度 IoU
def recall_precision_Iou(label, pred):
    # label_ = adjust_coord(label)
    # pred_ = adjust_coord(pred)
    label_ = label
    pred_ = pred
    label_arr, label_area = coord_convert_arr(label_)
    pred_arr, pred_area = coord_convert_arr(pred_)
    inter_area = inter_pixel_num(label_arr, pred_arr)
    #print("label_area:{}   pred_area:{}   inter_ area:{}".format(label_area, pred_area, inter_area))

    recall = inter_area/float(label_area)
    precision = inter_area/float(pred_area)
    IoU= inter_area/float(label_area+pred_area-inter_area)
    return recall, precision, IoU

猜你喜欢

转载自blog.csdn.net/attitude_yu/article/details/81217126