东莞城乡住房建设厅网站,wordpress 主题开发工具,百度网站推广教程,app永久免费封装平台简介
在目标检测任务中#xff0c;mAP#xff08;mean Average Precision#xff0c;平均精度均值#xff09;是一个非常重要的评价指标#xff0c;用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率#xff0c;能够全面反映模型在检测任务中…简介
在目标检测任务中mAPmean Average Precision平均精度均值是一个非常重要的评价指标用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率能够全面反映模型在检测任务中的表现。 作用 综合性评估mAP能够综合考虑模型在不同召回率下的精确率避免了单一指标如准确率或召回率可能带来的片面性。 多类别比较对于多类别的目标检测任务mAP可以计算每个类别的AP然后取平均值得到全局的mAP从而方便比较模型在不同类别上的性能。 模型选择和调优通过比较不同模型或不同参数设置下的mAP值可以选择性能更优的模型或确定最佳的参数配置。 计算方法 计算每个类别的AP 对于每个类别首先根据模型输出的预测框和真实的标注框计算交并比IOU。 根据设定的IOU阈值通常为0.5将预测框分为真正例TP、假正例FP和假反例FN。 对于每个预测框根据当前的TP和FP数量计算精确率Precision和召回率Recall。 绘制该类别的PR曲线即Precision随Recall变化的曲线。 计算PR曲线下方的面积得到该类别的AP值。这通常可以通过插值法实现如11点插值法即在Recall坐标轴上选择11个点如0, 0.1, 0.2, …, 1然后计算这些点对应的Precision的平均值作为AP的近似值。 计算全局的mAP 对于所有类别分别计算得到各自的AP值。 将所有类别的AP值取平均值得到全局的mAP值。 需要注意的是mAP的计算过程可能因使用的数据集和评估标准而有所不同。例如COCO数据集和PASCAL VOC数据集在计算mAP时可能采用不同的IOU阈值或插值方法。因此在实际应用中需要根据具体的数据集和评估要求来确定mAP的计算方法。
实现过程
假定我的输入为3D的目标检测的pred_boxes和gt_boxes image_idx cls_id x y z l w h yaw score(for pred_boxes) pred_boxes py.array([[0, 1, 13, 13, 0, 6, 6, 2, 0, 0.9], [0, 0, 35, 30, 0, 10, 8, 2, 0, 0.9], [1, 0, 12, 30, 0, 6, 9, 2, 0, 0.5]]) gt_boxes py.array([[0, 1, 10, 10, 0, 6, 6, 2, 0], [0, 0, 30, 30, 0, 10, 8, 2, 0], [0, 0, 10, 30, 0, 6, 9, 2, 0]]) 可视化一下image_idx0的boxes: 在每个类别中提取每个样本的这个类别的pred_boxes和gt_boxes,并计算iou值,根据iou阈值划分tp(正确检测)和fp(误检).
over_laps iou(pred_boxespred_boxes_cls_img[:, [2, 3, 5, 6]],gt_boxesgt_boxes_cls_img[:, [2, 3, 5, 6]])
corr_gts np.argmax(over_laps, axis1)
corr_iou np.max(over_laps, axis1)
visited_gt []
for id, pred_box in enumerate(pred_boxes_cls_img):if corr_iou[id] iou_threshold and corr_gts[id] not in visited_gt:visited_gt.append(corr_gts[id]) # if pred got gt, the gt should be ignorefp_or_tp.append(1)else:fp_or_tp.append(0)统计所有样本的pred_boxes的tp/fp类型及其score,安照score降序排序.
scores pred_boxes_cls[:, -1]
index np.argsort(-scores, )
# sort fp_or_tp by decending order of scores
fp_or_tp fp_or_tp[index]根据score列表依次选择有效的pred_boxes,计算precisiontp/(tpfp)和recalltp/gt_boxes.size(). precision和recall列表形成pr曲线,计算pr曲线面积即可.
# 根据score的是有效pred,有效pred中,0是f,1是检测到了目标, 1的数量除以总的有效pred就precious
# 1的数量除以真值数量就是recall
tp_num_list np.cumsum(fp_or_tp)
pred_num_list np.cumsum(np.ones_like(fp_or_tp))
precision_array tp_num_list / pred_num_list
recall_array tp_num_list / tp_and_tn
ap compute_ap(recall_array, precision_array, class_name)注意求pr曲线面积时,横坐标(长)要是recall,而不能是用score求平均precision.
思考下: pr曲线会不会出现左低右高的情况?是有的,当fp的score较高时候就会出现这个问题.比如score最高的第一个就是fp.那么这时recall很小时,precision为0. 解决方法:recall_list和precision_list的首尾补上(0,1)或者(1,0),然后单调性处理
再分析下:score降序,recall肯定是递增的,但是precision不一定是递减,因此需要使得它单调,具体操作: for i in range(len(precision_array)-1, 0,-1):precision_array[i-1] np.max(precision_array[i-1], precision_array[i])参考:b站视频