admin 管理员组

文章数量: 887021

目标检测评估指标 mAP, FPS

目标检测评估指标

  • mAP
    • 计算 AP(Traditional IoU = 0.5)
    • mAP 计算
    • 代码计算
  • FPS
    • FPS(每秒传输帧数-Frames Per Second)
    • 计算FPS代码实现

mAP

参考1 mAP (mean Average Precision) might confuse you!
参考2 Breaking Down Mean Average Precision (mAP)

计算 AP(Traditional IoU = 0.5)

根据 IoU 的取值,可以将预测得到 bbox 判断为 TP, FP 或者 FN。 TN 不考虑。

考虑下面这幅图,只查看 person 的预测 bbox。

TP 为 IoU > 0.5 的bbox.

FP: 有两种情况会被考虑为 FP

  • IoU< 0.5
  • 其他大于0.5 但是小于最大 IoU 值的 bbox

    FN: 有两种情况会被考虑为 FN
  • 没有匹配任何预测
  • IoU > 0.5 但是分类错误的 bbox

有了TP、FP和FN的正式定义,我们现在可以计算出我们在测试集上对一个给定类别的检测的精度和召回率。每个 bbox 都有它的置信度,通常由它的softmax层给出,并将用于对输出进行排序。


AP 本身的计算就是要取AR 在11个点取值对应的 Precision插值的均值。插值的方法就是对应每个 AR,取Precision最大值。

计算案例
假设是有一个 3 TP 和 4 FP 的数据,下图是按照置信度水平排序的结果。

mAP 计算

mAP 则在此基础上看情况是对 不同IoU还是不同的类别等取平均。

AP50,AP60,AP70……等等指的是取detector的IoU阈值大于0.5,大于0.6,大于0.7……等等。数值越高,即阈值越大,精度越低。

mAP@.5:.95(mAP@[.5:.95])
表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP。

mAP,a.k.a mean average precision.
第一个 mean, 表达的是针对不同任务,可能是all categories 的平均,也可能是 all IoU threshold 的平均。
而 AP 中的average,指的是不同 recall 对应的最大精度。
recall 被划分为11 parts: {0,0.1,0.2,…,0.9,1}

A P = 1 11 ∑ r e c a l l i P r e c i s i o n ( R e c a l l i ) AP = \frac{1}{11}\sum_{recall_{i}}Precision(Recall_{i}) AP=111​recalli​∑​Precision(Recalli​)

还有通常看到的指标 AP_small, AP_medium, AP_large 指的是不同大小的目标的检测评估。

代码计算

调用 torchmetrics 包
torchmetrics.detection.mean_ap.MeanAveragePrecision

FPS

参考链接

FPS(每秒传输帧数-Frames Per Second)

FPS就是目标网络每秒可以处理(检测)多少帧(多少张图片),FPS简单来理解就是图像的刷新频率,也就是每秒多少帧,假设目标检测网络处理1帧要0.02s,此时FPS就是1/0.02=50。

计算FPS代码实现

目标检测中的目标检测算法去检测视频或者调用电脑摄像头。

实现思路: 利用opencv调用摄像头,读取每一帧传入目标检测网络检测,将检测结果呈现,由于目标检测要求输入的图片格式一般为RGB格式,CV2读取的时候会使用BGR格式,因此在检测的时候要利用cv2.cvtColor进行图片格式转换。

# yolo = YOLO()  # 首先定义我们的检测模型类# 调用摄像头
capture = cv2.VideoCapture(0)  #0代表调用电脑的默认摄像头
# # 检测视频
# capture = cv2.VideoCapture("1.mp4")  #对视频进行检测,则将0改为视频文件# 定义起始fps
fps = 0.0
while(True):# 检测图片的起始时间t1 = time.time()# 读取某一帧ref,frame = capture.read()# 格式转变,BGRtoRGBframe = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)  # 利用OpenCV读取出来的图片的格式是BGR的,而目标检测中用到的图片格式是RGB# 转变成Imageframe = Image.fromarray(np.uint8(frame))   # 平时进行目标检测的库PIL中的Image,因此图片转换成Image进行存储。将读取出来的以数组形式存储的图片转换成图片Image# 网络进行检测fps计算# 对传入的图片使用自己的目标检测算法进行检测frame = np.array(yolo.detect_image(frame)) # RGBtoBGR满足opencv显示格式frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)  # 将我们检测好了的图片的格式从RGB转换成OpenCV可处理的BGR的格式进行图片的展示# fps的计算fps = (fps + (1. / (time.time() - t1))) / 2  #此处的time.time()就是检测完这张图片的结束时间,除以2是为了和之前的fps求一个平均print("fps= %.2f"%fps)  frame = cv2.putText(frame, "fps= %.2f"%(fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 检测完的图片的展示cv2.imshow("video", frame)  c = cv2.waitKey(30) & 0xffif c == 27:capture.release()break

本文标签: 目标检测评估指标 mAP FPS