作者 | 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 np
import matplotlib.pyplot as plt
x = 2.5
xp = [1, 2, 3]
fp = [3, 2, 0]
y = np.interp(x, xp, fp) # 1.0
plt.plot(xp, fp, '-o')
plt.plot(x, y, 'x') # 画插值
plt.show()
# 插入一个序列
import numpy as np
import 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 np
d = 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 plt
import numpy as np
y = [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 plt
import numpy as np
y = [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
参考资料:
- numpy API 文档 CN:https://www.osgeo.cn/numpy/de…
- numpy API 文档 EN:https://numpy.org/doc/stable/…
- axis 的根本应用:https://www.jb51.net/article/…
欢送 Star、试用 OneFlow 最新版本:https://github.com/Oneflow-In…