YOLOv5全面解析教程⑤:計算mAP用到的Numpy函式詳解

語言: CN / TW / HK

 

作者 | Fengwen、 BBuf

 

本文主要介紹在One-YOLOv5專案中計算mAP用到的一些numpy操作,這些numpy操作使用在utils/metrics.py中。本文是《YOLOv5全面解析教程④:目標檢測模型精確度評估的補充,希望能幫助到小夥伴們。

 

歡迎Star、試用One-YOLOv5

http://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)原始碼( http://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( http://www.osgeo.cn/numpy/reference/generated/numpy.cumsum.html?highlight=cumsum#numpy.cumsum )

 

2.API_EN( http://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 = [ 123]
fp = [ 320]
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 = [ 011.52.723.14]
xp = [ 123]
fp = [ 320]
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]

[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 = [ 123] ; 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

 


   

import matplotlib.pyplot  as plt
import numpy  as np
y = [ 123
x = [ 468]
print(np.trapz(y,x))
plt.fill_between(x, y)
plt.show()  # (3 + 1)*(8 - 4) / 2 = 8

8.0

 

 

參考資料:

1. numpy API文件 CN:http://www.osgeo.cn/numpy/dev/index.html

2. numpy API文件 EN:http://numpy.org/doc/stable/reference/index.html

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

 

 

其他人都在看

歡迎Star、試用OneFlow最新版本:http://github.com/Oneflow-Inc/oneflow/

 


 

 

本文分享自微信公眾號 - OneFlow(OneFlowTechnology)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。