写点什么

YOLOv5 全面解析教程⑤:计算 mAP 用到的 Numpy 函数详解

作者:OneFlow
  • 2023-02-28
    重庆
  • 本文字数:1948 字

    阅读完需:约 6 分钟

YOLOv5全面解析教程⑤:计算mAP用到的Numpy函数详解

作者 | Fengwen、BBuf


本文主要介绍在 One-YOLOv5 项目中计算 mAP 用到的一些 numpy 操作,这些 numpy 操作使用在 utils/metrics.py 中。本文是《YOLOv5全面解析教程④:目标检测模型精确度评估》的补充,希望能帮助到小伙伴们。


欢迎 Star、试用 One-YOLOv5:

https://github.com/Oneflow-Inc/one-yolov5


用到的 numpy 操作比如:np.cumsum()、np.interp()、np.maximum.accumulate()、np.trapz()等。接下来将在下面逐一介绍。


import numpy as np
复制代码


np.cumsum()


返回元素沿给定轴的累积和。


numpy.cumsum(a, axis=None, dtype=None, out=None)源码(https://github.com/numpy/numpy/blob/v1.23.0/numpy/core/fromnumeric.py#L2497-L2571)


  • 参数

  • a:数组

  • axis: 轴索引,整型,若 a 为 n 维数组,则 axis 的取值范围为[0,n-1]

  • dtype: 返回结果的数据类型,若不指定,则默认与 a 一致 n

  • out: 数据类型为数组。用来放置结果的替代输出数组,它必须具有与输出结果具有相同的形状和数据缓冲区长度

  • 返回

  • 沿着指定轴的元素累加和所组成的数组,其形状应与输入数组 a 一致


更多信息请参阅读:

1.API_CN(https://www.osgeo.cn/numpy/reference/generated/numpy.cumsum.html?highlight=cumsum#numpy.cumsum)


2.API_EN(https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html?highlight=cumsum#numpy.cumsum)


np.cumsum(a) # 计算累积和的轴。默认(无)是在展平的数组上计算cumsum。
复制代码

array([ 1,  3,  6, 10, 15, 21])

a = np.array([[1,2,3], [4,5,6]])np.cumsum(a, dtype=float)     # 指定输出的特定的类型
复制代码

array([ 1.,  3.,  6., 10., 15., 21.])

np.cumsum(a,axis=0)      # 3列中每一列的行总和
复制代码

array([[1, 2, 3],      [5, 7, 9]])

x = np.ones((3,4),dtype=int) np.cumsum( x ,axis=0)
复制代码

array([[1, 1, 1, 1],      [2, 2, 2, 2],      [3, 3, 3, 3]])

np.cumsum(a,axis=1)      # 2行中每行的列总和
复制代码

array([[ 1,  3,  6],      [ 4,  9, 15]])


np.interp()


  • 参数

  • x: 数组待插入数据的横坐标

  • xp: 一维浮点数序列原始数据点的横坐标,如果 period 参数没有指定那么就必须是递增的 否则,在使用 xp = xp % period 正则化之后,xp 在内部进行排序

  • fp: 一维浮点数或复数序列 原始数据点的纵坐标,和 xp 序列等长.

  • left: 可选参数,类型为浮点数或复数(对应于 fp 值) 当 x < xp[0]时的插值返回值,默认为 fp[0].

  • right: 可选参数,类型为浮点数或复数(对应于 fp 值),当 x > xp[-1]时的插值返回值,默认为 fp[-1].

  • period: None 或者浮点数,可选参数横坐标的周期 此参数使得可以正确插入 angular x-coordinates. 如果该参数被设定,那么忽略 left 参数和 right 参数

  • 返回

  • 浮点数或复数(对应于 fp 值)或 ndarray. 插入数据的纵坐标,和 x 形状相同


注意!


在没有设置 period 参数时,默认要求 xp 参数是递增序列


# 插入一个值import numpy as npimport matplotlib.pyplot as pltx = 2.5xp = [1, 2, 3]fp = [3, 2, 0]y = np.interp(x, xp, fp)  # 1.0plt.plot(xp, fp, '-o') plt.plot(x, y, 'x') # 画插值plt.show()
复制代码



# 插入一个序列import numpy as npimport matplotlib.pyplot as plt
x = [0, 1, 1.5, 2.72, 3.14]xp = [1, 2, 3]fp = [3, 2, 0]y = np.interp(x, xp, fp) # array([ 3. , 3. , 2.5 , 0.56, 0. ])plt.plot(xp, fp, '-o')plt.plot(x, y, 'x')plt.show()
复制代码



np.maximum.accumulate


计算数组(或数组的特定轴)的累积最大值


import numpy as npd = np.random.randint(low = 1, high = 10, size=(2,3))print("d:\n",d)c = np.maximum.accumulate(d, axis=1)print("c:\n",c)   
复制代码


d: 

[[1 9 5]

[2 6 1]]

c: 

[[1 9 9] 

[2 6 6]]


np.trapz()


numpy.trapz(y, x=None, dx=1.0, axis=- 1) 使用复合梯形规则沿给定轴积分。


import matplotlib.pyplot as pltimport numpy as npy = [1, 2, 3] ; x = [i+1 for i in range(len(y))]print(np.trapz(x))plt.fill_between(x, y)plt.show() # (1 + 3)*(3 - 1)/2 = 4
复制代码



import matplotlib.pyplot as pltimport numpy as npy = [1, 2, 3] x = [4, 6, 8]print(np.trapz(y,x))plt.fill_between(x, y)plt.show() # (3 + 1)*(8 - 4) / 2 = 8
复制代码



参考资料:

1. numpy API 文档 CN:https://www.osgeo.cn/numpy/dev/index.html

2. numpy API 文档 EN:https://numpy.org/doc/stable/reference/index.html

3. axis 的基本使用:https://www.jb51.net/article/242067.htm


其他人都在看

OneFlow v0.9.0正式发布

从0到1,OpenAI的创立之路

一块GPU搞定ChatGPT;ML系统入坑指南

YOLOv5解析教程:目标检测模型精确度评估

比快更快,开源Stable Diffusion刷新作图速度

OneEmbedding:单卡训练TB级推荐模型不是梦

GLM训练加速:性能最高提升3倍,显存节省1/3


欢迎 Star、试用 OneFlow 最新版本:https://github.com/Oneflow-Inc/oneflow/

发布于: 刚刚阅读数: 2
用户头像

OneFlow

关注

不至于成为世界上最快的深度学习框架。 2022-03-23 加入

★ OneFlow深度学习框架:github.com/Oneflow-Inc/oneflow ★ OF云平台:oneflow.cloud

评论

发布
暂无评论
YOLOv5全面解析教程⑤:计算mAP用到的Numpy函数详解_人工智能_OneFlow_InfoQ写作社区