tensorflow的object detection api中的evaluation简介

计算mAP

主要有三种有所区别的计算方式

  1. 把confidence分为11份,以11个confidence分别为阈值,计算11个recall和precision,最后计算曲线下面积。
  2. 假预测结果里面为positive的数据的个数为num,那么我们最多可以得到num个fp,最少0个fp,也就是recall的可能取值为[1/num, 2/num, ... ,1]。以这num个recall为准,计算对应的precision,最后计算曲线下面积。
  3. 考虑到一幅图中,真值不可能把所有的物体都框出来,为了保证不误判,在真值里面还会加上每张图的正负标签。比如一张图里面有狗,有人。这个是正标签。这个图里面没有房子,没有树。这个负标签。那么只有出现在正负标签中的类才会用来计算AP。也就是你判断出了标签以外的类,对最终的分数既没有好处也没有坏处。

曲线下面积计算方法:

  • sum((recall_n_1-recall_n)*precision),也就是求曲线面积的公式。recall为横轴,precision为纵轴。

判定fp,tp

  1. 计算fp,tp的时候,需要判断预测的box是否和真值的box重合。这里就引出了几种计算法方法
  2. 按照box重合度分:
    • AP:分别计算iou阈值为0.5到0.95,步长0.05的AP的平均值
    • AP50:iou阈值为0.5得到的AP
    • AP75:iou阈值为0.7得到的AP
  3. 按照box大小
    • APs:box面积小于32*32像素
    • APm:box面积介于32*32到96*96像素
    • APl:box面积大于32*32到96*96像素
  4. 如果多个预测的box和一个真值的box重合,判定第一个为tp,其他为fp。也有场合是无视多余的box。这两种方法的不同会影响precision但是不影响recall。

代码分析

metrics/oid_od_challenge_evaluation.py

main函数,输入真值的csv文件,以及预测值的csv文件。

采用2018 open images dataset challenge的评估方式,所以需要传入图片的label信息。见上面计算AP的三种方式的第三种。

  1. 另外计算metric的时候还涉及到is_group和is_difficult的处理
  2. 图像是否有某个类的准确率的计算

主要流程为:

  1. 读入真值csv,转化为api的标准字典结构(包含box,class等各种字段)
  2. 调用object_detection_evaluation.DetectionEvaluator.add_single_ground_truth_image_info,将真值信息进行处理。
  3. 读入预测值csv,转化为api的标准字典结构(多了一个Score字段的要求)
  4. 调用object_detection_evaluation.DetectionEvaluator.add_single_detected_image_info,将预测信息进行处理。
  5. 最后调用object_detection_evaluation.DetectionEvaluator.evaluation计算出最终的各个评估值。
  6. 评估值包括:总的AP,每个类分别的AP
  7. 具体每个函数的输入输出要求请查阅源码

metrics/offline_eval_map_corloc.py

main函数,输入为为添加了预测结果的tfrecord(字段:standard_fields.DetectionResultFields.key)

utils/object_detection_evaluation.py

ObjectDetectionEvaluation:对真值和预测值的处理的实际代码都在这个类里面

  1. add_single_detected_image_info
    1. 存储真值
    2. 得到每个类有多少个真值数据
  2. add_single_ground_truth_image_info
    1. 调用utils/per_image_evaluation.py 中的compute_object_detection_metrics
    2. 得到每张图片的不同阈值对应的tp,tf,然后把所有图片的tp,tf加一起得到每个类的tp,tf
    3. 细节见源码
    4. tp,tf都是数组,对应不同的阈值
    5. 不同class->不同图片->不同阈值
  3. evaluation:调用utils/metrics.py 里面的的函数的到最终的评估值
    1. metrics.compute_precision_recall
      1. 得到precision和recall​​​​​​​送入下一个函数
    2. metrics.compute_average_precision
      1. 得到AP
    3. metrics.compute_cor_loc
      1. 得到图片分类的正确率

DetectionEvaluator:多层继承的类,负责把api的标准字典结构转化为ObjectDetectionEvaluation需要的信息

 

猜你喜欢

转载自blog.csdn.net/ziliwangmoe/article/details/81415943