計算機視覺——深度學習圖像處理中目標檢測平均精度均值(mAP)與其他常用評估指標

概述

平均精度均值(mAP)是目標檢測領域中最為流行且復雜的重要評估指標之一。它廣泛用于綜合總結目標檢測器的性能。許多目標檢測模型會輸出類似以下的參數結果:

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.309
Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.519
Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.327
Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.173
Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.462
Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.547
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.297
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.456
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.511
Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.376
Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.686
Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.686

這是 COCO 數據集的 mAP 版本(或他們稱之為 AP)。但這些數字到底是什么意思?這些符號又代表什么呢?

一、如何選擇目標檢測器

當衡量目標檢測器的質量時,主要想評估兩個標準:

  1. 模型是否正確預測了目標的類別
  2. 預測的邊界框是否足夠接近真實框

當將兩者結合起來時,事情開始變得復雜。與其他機器學習任務(如分類)相比,目標檢測沒有一個明確的“正確預測”的定義。這在邊界框標準中尤為明顯。

如下面的圖像,可以看出正確與不正確檢測框的區別:

不同質量的目標檢測示例

在目標檢測領域,決策的制定往往充滿挑戰,尤其是在面對復雜多變的評估需求時。目標檢測器的性能評估并非一成不變,其表現可能因目標的大小而異。例如,某些檢測器在處理大型目標時表現出色,但在檢測小型目標時卻顯得力不從心;而另一些檢測器雖然在整體性能上并不突出,但在小型目標的檢測上卻具有獨特的優勢。此外,模型同時檢測到的目標數量也是一個重要的考量因素。這些因素相互交織,使得評估過程變得異常復雜。

COCO評估指標的出現,正是為了解決這一難題。它提供了一套標準化的評估體系,能夠在多種已確立的場景下,全面衡量目標檢測器的性能。COCO評估指標不僅關注目標檢測的準確性,還綜合考慮了檢測器在不同目標大小下的表現,以及模型同時檢測到的目標數量等多個維度。通過這種多維度的評估方式,COCO評估指標能夠更準確地反映目標檢測器在實際應用中的表現。

值得注意的是,COCO評估指標的應用范圍遠不止于目標檢測。它還涵蓋了分割、關鍵點檢測等多個領域,為這些領域的研究提供了統一的評估標準。然而,這些內容已經超出了當前討論的范疇,值得在后續的研究中進一步深入探討。

二、交并比

理解 mAP 的旅程從 IoU 開始。交并比(Intersection over Union) 是衡量兩個邊界框對齊程度的一種方法。它通常用于衡量預測框與真實框的質量。

正如其名稱所示,IoU 定義為兩個框的交集除以它們的并集:
I o U = A ∩ B A ∪ B IoU = \frac{A \cap B}{A \cup B} IoU=ABAB?

從圖上來看,交集和并集可以理解為:

交集和并集的圖示

左:原始預測。中:并集。右:交集。

在目標檢測任務中,評估預測框與真實框之間的匹配程度是一個關鍵的指標。這正是交并比(Intersection over Union,IoU)發揮作用的地方。IoU 是通過計算預測框與真實框的交集面積與它們的并集面積之比來定義的。這個比值提供了一個介于 0 和 1 之間的數值,用以衡量兩個框之間的重疊程度。

首先,我們來分析一下 IoU 公式的幾個關鍵點:

  1. 并集與交集的關系:并集總是大于或等于交集。這是因為并集包含了兩個框中所有的點,而交集只包含兩個框共有的點。
  2. 非重疊情況:如果兩個框不重疊,它們的交集將為零。在這種情況下,IoU 的值將為 0,表示兩個框之間沒有重疊。
  3. 完美重疊情況:如果兩個框完美重疊,它們的交集將與并集相等。在這種情況下,IoU 的值將為 1,表示兩個框完全匹配。
  4. IoU 的取值范圍:IoU 總是一個介于 0 和 1 之間的值,包括 0 和 1。這個范圍內的值表示了兩個框之間重疊程度的大小。
  5. IoU 的優化目標:在目標檢測任務中,IoU 越大越好。一個高的 IoU 值意味著預測框與真實框之間的重疊程度更高,這通常表示模型的預測更加準確。

除了 IoU,有時可能會聽到 Jaccard Index 或 Jaccard Similarity 這兩個術語。在目標檢測的上下文中,它們與 IoU 是相同的。Jaccard Index 是一種更通用的數學形式,用于比較兩個有限集之間的相似性。它通過計算兩個集合交集的大小與它們并集的大小之比來定義。在目標檢測中,我們通常將預測框和真實框視為兩個集合,因此 IoU 和 Jaccard Index 在這種情況下是等價的。

IoU 是一個重要的評估指標,用于衡量目標檢測模型的預測準確性。通過計算預測框與真實框之間的交集與并集之比,IoU 提供了一個介于 0 和 1 之間的數值,用以表示兩個框之間的重疊程度。一個高的 IoU 值通常表示模型的預測更加準確。

在 Python 中,IoU 可以這樣計算:

def iou(bbox_a, bbox_b):ax1, ay1, ax2, ay2 = bbox_abx1, by1, bx2, by2 = bbox_b# 計算交集的坐標ix1 = max(ax1, bx1)iy1 = max(ay1, by1)ix2 = min(ax2, bx2)iy2 = min(ay2, by2)# 計算交集矩形的面積intersection = max(0, ix2 - ix1) * max(0, iy2 - iy1)# 計算兩個邊界框的面積box1_area = (ax2 - ax1) * (ay2 - ay1)box2_area = (bx2 - bx1) * (by2 - by1)# 最后計算兩個面積的并集union = box1_area + box2_area - intersectionreturn intersection / union

IoU 的值介于 0 和 1 之間,其中 1 表示完美匹配,0 表示沒有重疊。但是,我們需要確定一個閾值,當 IoU 低于這個閾值時,我們就會認為預測是不準確的,從而放棄這個預測。

三、IoU 作為檢測閾值

再看看貓的預測示例。很明顯,最右邊的那個是錯誤的,而左邊的那個是可以接受的。我們的大腦是如何如此快速地做出這個決定的呢?中間的那個呢?如果我們比較模型的性能,我們不能讓這個決定主觀化。

哪些檢測是可以接受的,哪些不是?

3.1 IoU 作為閾值的定義與應用

IoU(交并比)不僅可以衡量預測邊界框與真實框的匹配程度,還可以作為閾值來決定是否接受一個預測。在目標檢測領域,IoU 閾值的設定是評估模型性能的關鍵因素之一。

具體來說,當 IoU 閾值被指定為 IoU@0.5 時,這意味著只有當預測框與真實框的 IoU 大于或等于 0.5(即 50%)時,該預測框才被視為正確匹配。換句話說,如果預測框與真實框的重疊面積不足 50%,則認為該預測是不準確的,從而被舍棄。

3.2 常見的 IoU 閾值及其含義

在學術文獻和實際應用中,常見的 IoU 閾值包括:

  • IoU@0.5:這是最常用的閾值,表示預測框與真實框的重疊面積至少為 50% 時,預測才被視為正確。
  • IoU@0.75:這是一個更高的閾值,要求預測框與真實框的重疊面積至少為 75%,通常用于評估更嚴格的匹配標準。
  • IoU@0.95:這是一個非常嚴格的閾值,要求預測框與真實框的重疊面積至少為 95%,通常用于評估模型在極端情況下的性能。

3.3 多個 IoU 閾值的表示方法

除了單一的 IoU 閾值,有時我們還會遇到表示多個閾值的表達式,例如 IoU@[0.5:0.05:0.95]。這個表達式表示從 0.5 到 0.95,以 0.05 為步長的所有 IoU 閾值。具體來說,它涵蓋了以下 10 個不同的 IoU 閾值:

  • IoU@0.5
  • IoU@0.55
  • IoU@0.6
  • IoU@0.65
  • IoU@0.7
  • IoU@0.75
  • IoU@0.8
  • IoU@0.85
  • IoU@0.9
  • IoU@0.95

這種表示方法在 COCO 數據集的評估中非常流行,因為它能夠全面評估模型在不同嚴格程度下的性能。通過計算模型在這些不同閾值下的平均性能(如平均精度,AP),可以更全面地反映模型的魯棒性和準確性。

3.4 關于簡寫和默認值

在目標檢測的文獻中,作者有時會省略步長,簡單地寫成 IoU@[0.5:0.95]。雖然這種簡寫可能會引起一些混淆,但通常可以推斷出作者指的是從 0.5 到 0.95,步長為 0.05 的 10 個 IoU 閾值。

此外,當評估目標檢測器時,如果作者沒有明確指定 IoU 閾值,通常默認為 IoU=0.5。這是因為 IoU@0.5 是最常用的標準,能夠提供一個基本的性能評估。

四、真正例、假正例、真負例和假負例

接下來需要理解的概念是 TP(真正例)、FP(假正例)、TN(真負例)和 FN(假負例)。這些術語是從二元分類任務中借來的。下表是一個假設的蘋果分類器的總結:

ObjectPredictionCategoryExplanation
🍎?TP該物體被正確分類為蘋果。
🍌?FP該物體被錯誤地分類為蘋果。
🍎?FN該物體被錯誤地分類為非蘋果。
🍌?TN該物體被正確分類為非蘋果。

一個好的分類器會有大量的真正例和真負例,同時盡量減少假正例和假負例。

4.1 多類分類器

上面提到的概念并不完全適用于多類分類器。二元分類器回答的是“這個對象是否屬于這個類別?”而多類分類器回答的是“這個對象屬于這些類別中的哪一個?”幸運的是,我們可以使用“一對一”或“一對多”的方法將其擴展。想法很簡單:我們分別評估每個類別,并將其視為一個二元分類器。那么,以下內容成立:

  • 正例:正確預測了該類別屬于目標對象。
  • 負例:預測了其他類別屬于目標對象。

以下是從蘋果(🍎)類別角度出發的相同總結表。

ObjectPredictionCategoryExplanation
🍎🍎TP該物體被正確分類為蘋果。
🍌🍎FP該物體被錯誤地分類為蘋果。
🍎🍌FN該物體被錯誤地分類為香蕉(即未被正確分類為蘋果)。
🍎🥭FN該物體被錯誤地分類為芒果(即未被正確分類為蘋果)。

在談論多類模型時,很少使用“真負例”這個術語,但它可以理解為“正確識別為其他類別的樣本”。

現在,讓我們從香蕉(🍌)的角度做一個類似的練習。

ObjectPredictionCategoryExplanation
🍌🍌TP該物體被正確分類為香蕉。
🍌🍎FN該物體被錯誤地分類為蘋果(即未被正確分類為香蕉)。
🍎🍌FP該物體被錯誤地分類為香蕉。

從蘋果類別的角度來看,(🍌,🍎)組合是一個 FP,但從香蕉類別的角度來看,它是一個 FN。類似的情況也發生在(🍎,🍌)組合上,它從蘋果類別的角度來看是一個 FN,但從香蕉類別的角度來看是一個 FP。這種重疊是多類模型中預期和典型的!

4.2 應用

剩下的問題是:如何將上述概念應用到目標檢測器中?檢測器通常是多類分類器,但也有目標定位的因素。幸運的是,我們已經有 IoU 指標可供使用!

在這里,我們可以直接跳到總結。假設 IoU=50%

真正例(True Positive)

  • 預測邊界框與真實框的 IoU 高于 50%。并且
  • 預測類別與真實類別匹配。

目標檢測中的真正例示例

目標檢測中的真正例示例。

假正例(False Positive)

  • 預測邊界框與真實框的 IoU 低于 50% 或者
  • 沒有對應的真實框 或者
  • 預測類別與真實類別不匹配。

目標檢測中的假正例示例

目標檢測中的假正例示例。左:IoU 低于 50%。中:缺少真實框。右:錯誤的類別。

假負例(False Negative)

  • 每一個沒有匹配預測的真實框。

目標檢測中的假負例示例

目標檢測中的假負例示例(對于某個真實框沒有預測)。

4.3 模糊的例子

在下圖中,有兩個真實框,但只有一個預測框。在這種情況下,預測框只能歸屬于其中一個真實框(IoU 超過 50%)。不幸的是,另一個真實框變成了一個 假負例

預測框只能歸屬于一個真實框

預測框只能歸屬于一個真實框。另一個真實框變成了假負例。

在下一個例子中,對同一個真實框做出了兩個預測。然而,這兩個預測的 IoU 都低于 50%。在這種情況下,這兩個預測都被算作 假正例,而孤立的真實框是一個 假負例

兩個預測的 IoU 都低于 50%

兩個預測的 IoU 都低于 50%。它們變成了假正例,而真實框變成了假負例。

在最后一個例子中,我們有一個類似的場景,但兩個預測的 IoU 都很好(超過 50%)。在這種情況下,IoU 最好的那個被算作一個 真正例,而另一個變成了一個 假正例

兩個預測的 IoU 都超過 50%

兩個預測的 IoU 都超過 50%。一個變成真正例,另一個變成假正例。

五、精確率、召回率和 F1 分數

現在我們知道了如何將 TP、FP、TN 和 FN 應用于目標檢測器,我們可以從分類器中借鑒其他指標。這些是 精確率(Precision)、召回率(Recall)F1 分數(F1 Score)。同樣,這些指標是按類別衡量的。下表總結了它們:

指標公式概念
精確率(Precision)( P = \frac{TP}{TP + FP} )對于一個類別所做的所有預測中,實際正確的預測所占的百分比。
召回率(Recall)( R = \frac{TP}{TP + FN} )在一個類別的所有物體中,被正確預測的物體所占的百分比。
F1值(F1)( F1 = 2 \cdot \frac{P \cdot R}{P + R} )精確率和召回率的幾何平均值。

5.1 精確率(Precision)

對于一個給定的類別,精確率告訴我們該類別預測中實際屬于該類別的比例是多少。下圖顯示了一個檢測器的結果,其中有 3 個真正例和 1 個假正例,精確率為:

精確率計算示例

檢測器結果示例

3 個人物,但只有 3 次人物檢測。

如果你關心模型不產生假正例,就要關注精確率。例如:錯過股市上漲總比錯誤地將上漲預測為下跌要好。

敏銳的讀者可能已經注意到,精確率公式沒有考慮假負例。只關注精確率可能會非常誤導人。如下例所示:

只考慮精確率的誤導性

檢測器結果示例

雖然只有 3 次檢測,但它們的類別都是正確的,因此精確率是 100%。

正如你所見,精確率指標達到了 100%,但模型表現不佳,因為它有很多假負例。

不要單獨測量精確率,因為沒有考慮假負例。

5.2 召回率(Recall)

對于一個給定的類別,召回率(或靈敏度)告訴我們實際類別實例中有多少被正確預測了。從同一張圖來看,檢測器正確預測了 3 個類別實例(真正例),但有 3 個實例完全沒有被預測到(假負例):

召回率計算示例

檢測器結果示例

6 個面包中只檢測到了 3 個。

如果你希望避免假負例,就要關注召回率。例如:誤診癌癥總比錯誤地將患者預測為健康要好。

同樣,可以注意到召回率沒有考慮假正例,因此如果單獨測量也會誤導人:

只考慮召回率的誤導性

檢測器結果示例

圖中的一只貓被成功檢測到,但還有 3 個假正例。

正如你所見,召回率指標達到了 100%,但模型表現不佳,因為它有很多假正例。

不要單獨測量召回率,因為沒有考慮假正例。

5.3 F1 分數(F1 Score)

F 分數或 F1 分數是一個結合了精確率和召回率的指標,為我們提供了一個平衡。再次使用上面的同一張圖,模型將返回一個 F1 分數為:

F1 分數計算示例

F1 分數衡量了精確率和召回率之間的平衡。

六、PR(精確率 - 召回率)曲線

到目前為止,我們已經看到精確率和召回率描述了模型的不同方面。在某些場景中,擁有更高的精確率更方便,而在其他場景中,擁有更高的召回率更方便。你可以通過調整檢測器的目標置信度閾值來調整這些指標。

事實證明,有一種非常方便的方法可以直觀地展示模型對特定類別的響應在不同分類閾值下的表現。這就是精確率 - 召回率曲線,如下圖所示:

精確率 - 召回率曲線示例

創建 PR 曲線的過程如下:

  1. 將置信度設置為 1,初始精確率設為 1。召回率將為 0(如果你做數學計算的話)。在曲線上標記這個點。
  2. 開始降低置信度,直到獲得第一次檢測。計算精確率和召回率。精確率將再次為 1(因為你沒有假正例)。在曲線上標記這個點。
  3. 繼續降低閾值,直到新的檢測出現。在曲線上標記這個點。
  4. 重復上述步驟,直到閾值足夠低,使得召回率達到 1。此時,精確率可能在 0.5 左右。

下圖展示了在 PR 曲線上評估某些點的閾值。

PR 曲線上某些點的閾值

可以看到,這條曲線的形狀可以用來描述模型的性能。下圖展示了一個“基線”分類器和一個“完美”分類器。分類器越接近“完美”曲線,性能越好。

PR 曲線中的基線和完美分類器

6.1 實用的 PR 曲線算法

在現實中,有一種更實用的方法來計算 PR 曲線。雖然這可能看起來有些反直覺,但結果與上述步驟相同,只是更適合腳本化:

  1. 將所有圖像的所有預測按置信度從高到低排序。
  2. 對于每個預測,計算 TP、FP 以及累積的 TP 和 FP 數量(之前所有 TP 和 FP 的總和)。
  3. 對于每個預測,使用累積的 TP 和 FP 計算精確率和召回率。
  4. 繪制結果的精確率和召回率的散點圖。

下表展示了在包含 15 個對象的小數據集上運行該算法的結果:

計算 PR 曲線的運行表

計算 PR 曲線的運行表。來源。

例如,如果我們計算 ID 為 K 的檢測的精確率和召回率(記住該數據集有 15 個真實對象,即 TP+FN=15):

精確率和召回率計算示例

得到的 PR 曲線就是我們之前展示過的那條。為了方便起見,再次展示這個圖:

使用實用算法得到的 PR 曲線

七、AP——平均精確率

到目前為止,我們已經知道如何為每個類別創建 PR 曲線。現在是時候計算平均精確率了。

AP 是 PR 曲線下的面積(AUC)。

然而,正如你可能已經注意到的,PR 曲線的不規則形狀和尖峰使得計算這個面積相當困難。因此,COCO 定義了一個 11 點插值,使計算變得更簡單。

7.1 COCO 11 點插值

對于一個給定的類別 C,11 點插值包括以下三個步驟:

  1. 定義 11 個等間距的召回率評估點:[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]。
  2. 對于每個召回率評估點 r,找到所有召回率 r’ >= r 中最高的精確率 p。或者用數學公式表示為:

p ( r ) = max ? r ′ ≥ r p ( r ′ ) p(r) = \max_{r' \geq r} p(r') p(r)=rrmax?p(r)

圖形化地看,這僅僅是一種從圖中去除尖峰的方法,使其看起來像這樣:

PR 曲線的插值

  1. 在這些召回率評估點上對獲得的精確率取平均值,得到類別 C 的平均精確率 AP_C
    A P C = 1 11 ∑ r ∈ [ 0.0 , 0.1 , … , 1.0 ] p ( r ) AP_C = \frac{1}{11} \sum_{r \in [0.0, 0.1, \dots, 1.0]} p(r) APC?=111?r[0.0,0.1,,1.0]?p(r)
    讓我們以同一個圖表為例,計算 AP。

11 點 PR 曲線插值

COCO mAP 示例

7.2 COCO mAP——平均精度均值

我們終于可以計算 mAP 了,這也是本文的核心指標。在上一節中,我們計算了一個給定類別的 AP。mAP 不過是每個類別的 AP 的平均值。換句話說:

m A P = 1 N ∑ C = 1 N A P C mAP = \frac{1}{N} \sum_{C=1}^{N} AP_C mAP=N1?C=1N?APC?

其中 ( N ) 是類別的總數。

因此,從某種意義上說,mAP 是精確率的平均值的平均值。現在讓我們深入了解 COCO 生成的報告的具體內容。

COCO 沒有區分 AP 和 mAP,但從概念上講,它們指的是 mAP。

7.3 不同 IoU 閾值下的 mAP

報告的第一部分如下:

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.309
Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.519
Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.327

讓我們先關注 IoU。

  • IoU@0.50IoU@0.75 是很簡單的。正如在 IoU 部分解釋的那樣,這些只是在兩個不同的 IoU 閾值(分別為 50% 和 75%)下評估的系統。當然,你期望 0.75 的值會低于 0.5,因為它更嚴格,需要更好的邊界框匹配。
  • IoU@[0.50:0.95] 我們已經知道它擴展為 10 個不同的 IoU 閾值:0.5, 0.55, 0.6, …, 0.95。從這些值中,我們計算每個 IoU 閾值的 mAP 并取平均值。這通常是最嚴格的指標,因此也是默認的。

mAP 的計算示意圖

這變成了“平均值的平均值的平均值”!

7.4 不同目標大小的 mAP

報告的下一部分如下:

Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.173
Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.462
Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.547

現在我們關注面積部分。這些作為過濾器,用于衡量檢測器在不同大小范圍的目標上的性能。

  • 小目標 的面積范圍為 ([02, 322))。
  • 中等目標 的面積范圍為 ([322, 962))。
  • 大目標 的面積范圍為 ([962, ∞))。

面積以像素為單位,而 (∞) 在實際中被定義為 (1e?2)。因此,對于 area=small 的報告,只會考慮面積在指定范圍內的目標。

八、AR——平均召回率

最后,除了 mAP(或 AP)之外,COCO 還提供了 AR(平均召回率)。正如你所想象的,計算方法相同,只是從召回率的角度進行評估。除了常規的報告行之外,值得注意的是以下幾行:

Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.297
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.456
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.511

在這里,他們變化了一個 maxDets 參數,它控制了每張圖像中可能的檢測數量上限,用于進行精確率和召回率的計算。每張圖像最多檢測 100 個目標聽起來可能很多,但要記住,在 PR 曲線中,你會從 0 到 1 變化置信度閾值,而在最低值時,你可能會得到很多假正例。

值得注意的是,maxDets 的變化只在召回率方面才有意義。這是因為精確率衡量的是檢測的準確性,而召回率衡量的是模型在數據集中檢測所有相關實例的能力,這受到潛在檢測數量的影響。

九、COCO 評估 API

現在,希望你已經清楚了不同類型的 mAP 的計算方法,更重要的是,理解了它們的含義。COCO 提供了一個 Python 模塊,能夠在后臺計算所有這些指標,并且實際上是 他們競賽任務的官方結果呈現方式。

以下是如何使用 COCO 評估 API 的示例:

# 下載示例數據集
import requests
import zipfile
from tqdm import tqdm# 示例模型
from ultralytics import YOLO# COCO 工具
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval# 檢查是否需要重新下載
import os# 下載文件的輔助函數
def download_file(url, file_path):response = requests.get(url, stream=True)total_size_in_bytes = int(response.headers.get('content-length', 0))block_size = 1024  # 1 Kibibyteprogress_bar = tqdm(total=total_size_in_bytes, unit='iB', unit_scale=True)with open(file_path, 'wb') as file:for data in response.iter_content(block_size):progress_bar.update(len(data))file.write(data)progress_bar.close()coco_url = "https://github.com/ultralytics/yolov5/releases/download/v1.0/coco2017val.zip"
coco_zip_path = 'coco2017val.zip'# 如果沒有 coco 目錄,則下載并解壓
if not os.path.exists('coco'):download_file(coco_url, coco_zip_path)# 解壓文件with zipfile.ZipFile(coco_zip_path, 'r') as zip_ref:zip_ref.extractall('.')# 加載預訓練的 YOLOv8 模型
model = YOLO('./yolov8n.pt')# 加載 COCO 驗證圖像注釋
coco_annotations_path = 'coco/annotations/instances_val2017.json'
coco = COCO(coco_annotations_path)# 獲取圖像 ID
image_ids = coco.getImgIds()
images = coco.loadImgs(image_ids)# 處理圖像并收集檢測結果
results = []
for img in images:image_path = f"coco/images/val2017/{img['file_name']}"preds = model(image_path)[0].numpy().boxes# 將結果轉換為 COCO 兼容的格式for xyxy, conf, cls in zip(preds.xyxy, preds.conf, preds.cls):result = {'image_id': img['id'],'category_id': int(cls.item() + 1), 'bbox': [xyxy[0].item(), xyxy[1].item(), xyxy[2].item() - xyxy[0].item(), xyxy[3].item() - xyxy[1].item()],'score': conf.item()}results.append(result)# 將結果轉換為 COCO 對象
coco_dt = coco.loadRes(results)# 運行 COCO 評估
coco_eval = COCOeval(coco, coco_dt, 'bbox')
coco_eval.evaluate()
coco_eval.accumulate()
coco_eval.summarize()

創建虛擬環境,安裝依賴項并運行報告:

pip3 install ultralytics
pip3 install requests
pip3 install pycocotools
python3 ./coco_map_report.py

輸出結果如下:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.053Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.071Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.058Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.021Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.052Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.083Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.043Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.061Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.061Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.027Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.062Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.094

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76404.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76404.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言中單鏈表操作:查找節點與刪除節點

一. 簡介 前面學習了C語言中創建鏈表節點,向鏈表中插入節點等操作,文章如下: C語言中單向鏈表:創建節點與插入新節點-CSDN博客 本文繼續學習c語言中對鏈表的其他操作,例如在鏈表中查找某個節點,刪除鏈表…

WePY 框架:小程序開發的“Vue式”利器!!!

WePY 框架:小程序開發的“Vue式”利器 🚀 哈嘍,大家好!👋 今天我們要聊聊一個在微信小程序開發中大放異彩的框架——WePY!它是什么?有什么特點?為啥值得一試?別急&#…

什么是微前端?有什么好處?有哪一些方案?

微前端(Micro Frontends) 微前端是一種架構理念,借鑒了微服務的思想,將一個大型的前端應用拆分為多個獨立、自治的子應用,每個子應用可以由不同團隊、使用不同技術棧獨立開發和部署,最終聚合為一個整體產品…

【家政平臺開發(33)】庫存管理模塊開發實戰:從基礎搭建到智能管控

本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析,剖析家政行業現狀、挖掘用戶需求與梳理功能要點,到系統設計階段的架構選型、數據庫構建,再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化,測試階段多維度保障平臺質量,…

Mysql個人筆記

Mysql個人筆記 sql基礎書寫規則和種類種類書寫規則注釋規則啟動 DDL數據類型數據庫的操作useshowcreatedrop 表的操作useshowcreate創建表復制表 dropalter Mysql的存儲引擎 DMLselectselect語句like(謂詞)where聚合函數:關于nullgroup byexi…

【重裝系統】大白菜自制U盤裝機,備份C盤數據,解決電腦啟動黑屏/藍屏

1. 準備 U 盤 U 盤容量至少 8G,備份 U 盤的數據(后期會格式化) 2. 從微軟官網下載操作系統鏡像 https://www.microsoft.com/zh-cn/software-download/windows11 3. 下載安裝大白菜 https://www.alipan.com/s/33RVnKayUfY 4. 插入 U 盤&#…

各類神經網絡學習:(十)注意力機制(第2/4集),pytorch 中的多維注意力機制、自注意力機制、掩碼自注意力機制、多頭注意力機制

上一篇下一篇注意力機制(第1/4集)待編寫 一、pytorch 中的多維注意力機制: 在 N L P NLP NLP 領域內,上述三個參數都是 向量 , 在 p y t o r c h pytorch pytorch 中參數向量會組成 矩陣 ,方便代碼編寫。…

uni-app初學

文章目錄 1. pages.json 頁面路由2. 圖標3. 全局 CSS4. 首頁4.1 整體框架4.2 完整代碼4.3 輪播圖 swiper4.3.1 image 4.4 公告4.4.1 uni-icons 4.5 分類 uni-row、uni-col4.6 商品列表 小程序開發網址: 注冊小程序賬號 微信開發者工具下載 uniapp 官網 HbuilderX 下…

VBA將Word文檔內容逐行寫入Excel

如果你需要將Word文檔的內容導入Excel工作表來進行數據加工,使用下面的代碼可以實現: Sub ImportWordToExcel()Dim wordApp As Word.ApplicationDim wordDoc As Word.DocumentDim excelSheet As WorksheetDim filePath As VariantDim i As LongDim para…

MySQL運行一段時間后磁盤出現100%讀寫

MySQL運行一段時間后磁盤出現100%讀寫的情況,可能是由多種原因導致的,以下是一些常見原因及解決方法: 可能的原因 1. 磁盤I/O壓力過大[^0^]:數據量過大,數據庫查詢和寫入操作消耗大量I/O資源。索引效率低&#xff0c…

【RabbitMQ】延遲隊列

1.概述 延遲隊列其實就是隊列里的消息是希望在指定時間到了以后或之前取出和處理,簡單來說,延時隊列就是用來存放需要在指定時間被處理的元素的隊列。 延時隊列的使用場景: 1.訂單在十分鐘之內未支付則自動取消 2.新創建的店鋪,…

Linux筆記之Ubuntu系統設置自動登錄tty1界面

Ubuntu22.04系統 編輯getty配置文件 vim /etc/systemd/system/gettytty1.service.d/override.conf如果該目錄或者文件不存在,進行創建。 在override.conf文件中進行編輯: [Service] ExecStart ExecStart-/sbin/agetty --autologin yourusername --no…

C++程序詩篇的靈動賦形:多態

文章目錄 1.什么是多態?2.多態的語法實現2.1 虛函數2.2 多態的構成2.3 虛函數的重寫2.3.1 協變2.3.2 析構函數的重寫 2.4 override 和 final 3.抽象類4.多態原理4.1 虛函數表4.2 多態原理實現4.3 動態綁定與靜態綁定 5.繼承和多態常見的面試問題希望讀者們多多三連支…

算法訓練之動態規劃(三)

???~~~~~~歡迎光臨知星小度博客空間~~~~~~??? ???零星地變得優秀~也能拼湊出星河~??? ???我們一起努力成為更好的自己~??? ???如果這一篇博客對你有幫助~別忘了點贊分享哦~??? ???如果有什么問題可以評論區留言或者私信我哦~??? ?????? 個…

$_GET變量

$_GET 是一個超級全局變量,在 PHP 中用于收集通過 URL 查詢字符串傳遞的參數。它是一個關聯數組,包含了所有通過 HTTP GET 方法發送到當前腳本的變量。 預定義的 $_GET 變量用于收集來自 method"get" 的表單中的值。 從帶有 GET 方法的表單發…

jQuery多庫共存

在現代Web開發中,項目往往需要集成多種JavaScript庫或框架來滿足不同的功能需求。然而,當多個庫同時使用時,可能會出現命名沖突、功能覆蓋等問題。幸運的是,jQuery提供了一些機制來確保其可以與其他庫和諧共存。本文將探討如何實現…

MySQL 中的聚簇索引和非聚簇索引有什么區別?

MySQL 中的聚簇索引和非聚簇索引有什么區別? 1. 從不同存儲引擎去考慮 在MySIAM存儲引擎中,索引和數據是分開存儲的,包括主鍵索引在內的所有索引都是“非聚簇”的,每個索引的葉子節點存儲的是數據記錄的物理地址(指針…

Java從入門到“放棄”(精通)之旅——啟航①

🌟Java從入門到“放棄 ”精通之旅🚀 今天我將要帶大家一起探索神奇的Java世界!希望能幫助到同樣初學Java的你~ (??????)?? 🔥 Java是什么?為什么這么火? Java不僅僅是一門編程語言,更…

三相電為什么沒零線也能通電

要理解三相電為什么沒零線也能通電,就要從發電的原理說起 1、弧形磁鐵中加入電樞,旋轉切割磁感線會產生電流 隨著電樞旋轉的角度變化,電樞垂直切割磁感線 電樞垂直切割磁感線,此時會產生最大電壓 當轉到與磁感線平行時&#xf…

文件上傳做題記錄

1,[SWPUCTF 2021 新生賽]easyupload2.0 直接上傳php 再試一下phtml 用蟻劍連發現連不上 那就只要命令執行了 2,[SWPUCTF 2021 新生賽]easyupload1.0 當然,直接上傳一個php是不行的 phtml也不行,看下是不是前端驗證,…