作者 | Fengwen、BBuf

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

欢送Star、试用One-YOLOv5:
https://github.com/Oneflow-In...

用到的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/nump...)

  • 参数
  • a:数组
  • axis: 轴索引,整型,若a为n维数组,则axis的取值范畴为[0,n-1]
  • dtype: 返回后果的数据类型,若不指定,则默认与a统一n
  • out: 数据类型为数组。用来搁置后果的代替输入数组,它必须具备与输入后果具备雷同的形态和数据缓冲区长度
  • 返回
  • 沿着指定轴的元素累加和所组成的数组,其形态应与输出数组a统一

更多信息请参阅读:
1.API_CN(https://www.osgeo.cn/numpy/re...)

2.API_EN(https://numpy.org/doc/stable/...)

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 pltx = [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]
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/de...
  2. numpy API文档 EN:https://numpy.org/doc/stable/...
  3. axis的根本应用:https://www.jb51.net/article/...

欢送 Star、试用 OneFlow 最新版本:https://github.com/Oneflow-In...