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

news/2024/7/10 1:51:51 标签: YOLO, numpy, oneflow, 目标检测, 深度学习

118e78f827cf830143393bc39de73fe4.jpeg

作者 | 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 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()

696dae24eeaa1436ed7ceadb940df564.png

# 插入一个序列
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()

3d79a07e4d19040249e73211f5773294.png

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]

[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 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

4.0

0f3b3740c6a728437637e018cfa1fa3d.png

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

8.0

400b076421fc18800b9da91e33654461.png

参考资料:

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最新版本:GitHub - Oneflow-Inc/oneflow: OneFlow is a deep learning framework designed to be user-friendly, scalable and efficient.OneFlow is a deep learning framework designed to be user-friendly, scalable and efficient. - GitHub - Oneflow-Inc/oneflow: OneFlow is a deep learning framework designed to be user-friendly, scalable and efficient.https://github.com/Oneflow-Inc/oneflow/


http://www.niftyadmin.cn/n/109296.html

相关文章

选课排课系统

技术&#xff1a;Java、JSP等摘要&#xff1a;随着在校大学生人数的不断增加&#xff0c;教务系统的数据量也不断的上涨。针对学生选课这一环节&#xff0c;本系统从学生网上自主选课以及教师的课程发布两个大方面进行了设计&#xff0c;基本实现了学生的在线信息查询、选课功能…

【Python百日进阶-Web开发-Vue3】Day542 - Vue3 商城后台 02:Windi CSS 与 Vue Router4

文章目录 一、WindiCSS 初始1.1 WindiCSS 是什么?1.2 为什么选择 Windi CSS?1.3. 基础用法1.4 集成二、简单按钮2.1 设置背景色2.2 设置字体颜色和上下左右padding2.3 设置圆角2.4 鼠标悬浮,颜色加深2.5 鼠标划入动画2.6 设置阴影2.7 @apply 抽离class代码到 style 块中三、…

移植移远4G模块EC20过程记录3-EC20模块固件升级以适配QMI拨号

目录 EC20模块固件升级步骤 1、交叉编译升级工具QFirehose 2、将工具QFirehose和待升级的固件EC20CEHDLGR06A09M1G.zip拷贝到板子上 3、在板上解压固件压缩包 4、升级 5、修改Gobinet源码以适配新固件 固件版本低于A08的均不能进行Gobinet拨号上网 EC20模块固件升级步骤 …

Redis实现高可用

怎么实现Redis的高可用&#xff1f;我们在项目中使用Redis&#xff0c;肯定不会是单点部署Redis服务的。因为&#xff0c;单点部署一旦宕机&#xff0c;就不可用了。为了实现高可用&#xff0c;通常的做法是&#xff0c;将数据库复制多个副本以部署在不同的服务器上&#xff0c…

Mysql(数据库基础篇)

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…

Matlab进阶绘图第3期—方块热图

方块热图是一种特殊的热图&#xff08;Heatmap&#xff09;。 与传统热图相比&#xff0c;方块热图通过不同颜色、不同大小的正方形以表示数据/特征的大小&#xff0c;能够更加直观地对数据分布情况进行分析&#xff0c;也因此可以在一些顶级期刊中看到它的身影&#xff0c;比…

IM即时通讯开发MQ消息队列

消息是互联网信息的一种表现形式&#xff0c;是人利用计算机进行信息传递的有效载体&#xff0c;比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一。 消息从发送者到接收者的典型传递方式有两种&#xff1a; 1&#xff09;一种我们可以称为即时消息&#xff1a…

CSS动画animation属性整理

1.animation-name animation-name属性&#xff1a;为 keyframes 动画规定名称。 2.animation-duration animation-duration属性&#xff1a;完成一个动画周期所需要的时间。 3.animation-timing-function animation-timing-function属性&#xff1a;规定动画的速度曲线 常…