https://blog.csdn.net/yanhx1204/article/details/81017134
摘要
在訓練YOLO v2的過程中,系統會顯示出一些評價訓練效果的值,如Recall,IoU等等。為了怕以后忘了,現在把自己對這幾種度量方式的理解記錄一下。
這一文章首先假設一個測試集,然后圍繞這一測試集來介紹這幾種度量方式的計算方法。
大雁與飛機
假設現在有這樣一個測試集,測試集中的圖片只由大雁和飛機兩種圖片組成,如下圖所示:
假設你的分類系統最終的目的是:能取出測試集中所有飛機的圖片,而不是大雁的圖片。
現在做如下的定義:
True positives : 飛機的圖片被正確的識別成了飛機。
True negatives: 大雁的圖片沒有被識別出來,系統正確地認為它們是大雁。
False positives: 大雁的圖片被錯誤地識別成了飛機。
False negatives: 飛機的圖片沒有被識別出來,系統錯誤地認為它們是大雁。
假設你的分類系統使用了上述假設識別出了四個結果,如下圖所示:
那么在識別出的這四張照片中:
True positives : 有三個,畫綠色框的飛機。
False positives: 有一個,畫紅色框的大雁。
沒被識別出來的六張圖片中:
True negatives : 有四個,這四個大雁的圖片,系統正確地沒有把它們識別成飛機。
False negatives: 有兩個,兩個飛機沒有被識別出來,系統錯誤地認為它們是大雁。
Precision 與 Recall
Precision其實就是在識別出來的圖片中,True positives所占的比率:
其中的n代表的是(True positives + False positives),也就是系統一共識別出來多少照片 。
在這一例子中,True positives為3,False positives為1,所以Precision值是 3/(3+1)=0.75。
意味着在識別出的結果中,飛機的圖片占75%。
Recall 是被正確識別出來的飛機個數與測試集中所有飛機的個數的比值:
Recall的分母是(True positives + False negatives),這兩個值的和,可以理解為一共有多少張飛機的照片。
在這一例子中,True positives為3,False negatives為2,那么Recall值是 3/(3+2)=0.6。
意味着在所有的飛機圖片中,60%的飛機被正確的識別成飛機.。
調整閾值
你也可以通過調整閾值,來選擇讓系統識別出多少圖片,進而改變Precision 或 Recall 的值。
在某種閾值的前提下(藍色虛線),系統識別出了四張圖片,如下圖中所示:
分類系統認為大於閾值(藍色虛線之上)的四個圖片更像飛機。
我們可以通過改變閾值(也可以看作上下移動藍色的虛線),來選擇讓系統識別能出多少個圖片,當然閾值的變化會導致Precision與Recall值發生變化。比如,把藍色虛線放到第一張圖片下面,也就是說讓系統只識別出最上面的那張飛機圖片,那么Precision的值就是100%,而Recall的值則是20%。如果把藍色虛線放到第二張圖片下面,也就是說讓系統只識別出最上面的前兩張圖片,那么Precision的值還是100%,而Recall的值則增長到是40%。
下圖為不同閾值條件下,Precision與Recall的變化情況:
Precision-recall 曲線
如果你想評估一個分類器的性能,一個比較好的方法就是:觀察當閾值變化時,Precision與Recall值的變化情況。如果一個分類器的性能比較好,那么它應該有如下的表現:被識別出的圖片中飛機所占的比重比較大,並且在識別出大雁之前,盡可能多地正確識別出飛機,也就是讓Recall值增長的同時保持Precision的值在一個很高的水平。而性能比較差的分類器可能會損失很多Precision值才能換來Recall值的提高。通常情況下,文章中都會使用Precision-recall曲線,來顯示出分類器在Precision與Recall之間的權衡。
上圖就是分類器的Precision-recall 曲線,在不損失精度的條件下它能達到40%Recall。而當Recall達到100%時,Precision 降低到50%。
Approximated Average precision
相比較與曲線圖,在某些時候還是一個具體的數值能更直觀地表現出分類器的性能。通常情況下都是用 Average Precision來作為這一度量標准,它的公式為:
在這一積分中,其中p代表Precision ,r代表Recall,p是一個以r為參數的函數,That is equal to taking the area under the curve.
實際上這一積分極其接近於這一數值:對每一種閾值分別求(Precision值)乘以(Recall值的變化情況),再把所有閾值下求得的乘積值進行累加。公式如下:
在這一公式中,N代表測試集中所有圖片的個數,P(k)表示在能識別出k個圖片的時候Precision的值,而 Delta r(k) 則表示識別圖片個數從k-1變化到k時(通過調整閾值)Recall值的變化情況。
在這一例子中,Approximated Average Precision的值
=(1 * (0.2-0)) + (1 * (0.4-0.2)) + (0.66 * (0.4-0.4)) + (0.75 * (0.6-0.4)) + (0.6 * (0.6-0.6)) + (0.66 * (0.8-0.6)) + (0.57 * (0.8-0.8)) + (0.5 * (0.8-0.8)) + (0.44 * (0.8-0.8)) + (0.5 * (1-0.8)) = 0.782.
=(1 * 0.2) + (1 * 0.2) + (0.66 * 0) + (0.75 * 0.2) + (0.6 * 0) + (0.66 * 0.2) + (0.57 * 0) + (0.5 * 0) + (0.44 * 0) + (0.5 * 0.2) = 0.782.
通過計算可以看到,那些Recall值沒有變化的地方(紅色數值),對增加Average Precision值沒有貢獻。
Interpolated average precision
不同於Approximated Average Precision,一些作者選擇另一種度量性能的標准:Interpolated Average Precision。這一新的算法不再使用P(k),也就是說,不再使用當系統識別出k個圖片的時候Precision的值與Recall變化值相乘。而是使用
也就是每次使用在所有閾值的Precision中,最大值的那個Precision值與Recall的變化值相乘。公式如下:
下圖的圖片是Approximated Average Precision 與 Interpolated Average Precision相比較。
需要注意的是,為了讓特征更明顯,圖片中使用的參數與上面所說的例子無關。
很明顯 Approximated Average Precision與精度曲線挨的很近,而使用Interpolated Average Precision算出的Average Precision值明顯要比Approximated Average Precision的方法算出的要高。
一些很重要的文章都是用Interpolated Average Precision 作為度量方法,並且直接稱算出的值為Average Precision 。PASCAL Visual Objects Challenge從2007年開始就是用這一度量制度,他們認為這一方法能有效地減少Precision-recall 曲線中的抖動。所以在比較文章中Average Precision 值的時候,最好先弄清楚它們使用的是那種度量方式。
IoU
IoU這一值,可以理解為系統預測出來的框與原來圖片中標記的框的重合程度。
計算方法即檢測結果Detection Result與 Ground Truth 的交集比上它們的並集,即為檢測的准確率:
如下圖所示:
藍色的框是:GroundTruth
黃色的框是:DetectionResult
綠色的框是:DetectionResult ⋂ GroundTruth
紅色的框是:DetectionResult ⋃ GroundTruth
要說的
1,本文參考了以下博客
https://sanchom.wordpress.com/tag/average-precision/
http://blog.csdn.net/eddy_zheng/article/details/52126641
2,在訓練YOLO v2中,會出現這幾個參數,所以在這總結一下,省得以后忘了。
3,本文只是一個學習筆記,內容可能會有錯誤,僅供參考。
4,如果你發現文中的錯誤,歡迎留言指正,謝謝!
5,之后會繼續把訓練YOLO過程中出現的問題寫在博客上。
最近一直在做相關推薦方面的研究與應用工作,召回率與准確率這兩個概念偶爾會遇到,知道意思,但是有時候要很清晰地向同學介紹則有點轉不過彎來。
召回率和准確率是數據挖掘中預測、互聯網中的搜索引擎等經常涉及的兩個概念和指標。
召回率:Recall,又稱“查全率”——還是查全率好記,也更能體現其實質意義。
准確率:Precision,又稱“精度”、“正確率”。
以檢索為例,可以把搜索情況用下圖表示:
如果我們希望:被檢索到的內容越多越好,這是追求“查全率”,即A/(A+C),越大越好。
如果我們希望:檢索到的文檔中,真正想要的、也就是相關的越多越好,不相關的越少越好,這是追求“准確率”,即A/(A+B),越大越好。
“召回率”與“准確率”雖然沒有必然的關系(從上面公式中可以看到),在實際應用中,是相互制約的。要根據實際需求,找到一個平衡點。
往往難以迅速反應的是“召回率”。我想這與字面意思也有關系,從“召回”的字面意思不能直接看到其意義。“召回”在中文的意思是:把xx調回來。“召回率”對應的英文“recall”,recall除了有上面說到的“order sth to return”的意思之外,還有“remember”的意思。
Recall:the ability to remember sth. that you have learned or sth. that has happened in the past.
當我們問檢索系統某一件事的所有細節時(輸入檢索query查詢詞),Recall指:檢索系統能“回憶”起那些事的多少細節,通俗來講就是“回憶的能力”。“能回憶起來的細節數” 除以 “系統知道這件事的所有細節”,就是“記憶率”,也就是recall——召回率。簡單的,也可以理解為查全率。
不妨舉這樣一個例子:某池塘有1400條鯉魚,300只蝦,300只鱉。現在以捕鯉魚為目的。撒一大網,逮着了700條鯉魚,200只蝦,100只鱉。那么,這些指標分別如下:
正確率 = 700 / (700 + 200 + 100) = 70%
召回率 = 700 / 1400 = 50%
F值 = 70% * 50% * 2 / (70% + 50%) = 58.3%
不妨看看如果把池子里的所有的鯉魚、蝦和鱉都一網打盡,這些指標又有何變化:
正確率 = 1400 / (1400 + 300 + 300) = 70%
召回率 = 1400 / 1400 = 100%
F值 = 70% * 100% * 2 / (70% + 100%) = 82.35%
由此可見,正確率是評估捕獲的成果中目標成果所占得比例;召回率,顧名思義,就是從關注領域中,召回目標類別的比例;而F值,則是綜合這二者指標的評估指標,用於綜合反映整體的指標。
當然希望檢索結果Precision越高越好,同時Recall也越高越好,但事實上這兩者在某些情況下有矛盾的。比如極端情況下,我們只搜索出了一個結果,且是准確的,那么Precision就是100%,但是Recall就很低;而如果我們把所有結果都返回,那么比如Recall是100%,但是Precision就會很低。因此在不同的場合中需要自己判斷希望Precision比較高或是Recall比較高。如果是做實驗研究,可以繪制Precision-Recall曲線來幫助分析。