通常我們去評價一個模型時,首先看的應該是它的精确度,當你精确度不行的時候,你和别人說我的模型預測的多麼多麼的快,部署的時候占的記憶體多麼多麼的小,都是白搭。但當你模型達到一定的精确度之後,就需要更進一步的評價名額來評價你模型:
1)前向傳播時所需的計算力,它反應了對硬體如GPU性能要求的高低;
2)參數個數,它反應所占記憶體大小。
為什麼要加上這兩個名額呢?因為這事關你模型算法的落地。比如你要在手機和汽車上部署深度學習模型,對模型大小和計算力就有嚴格要求。
IOU定義與計算
https://github.com/amusi/Deep-Learning-Interview-Book/blob/master/docs/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89.md#iou
mAP定義與計算
https://github.com/amusi/Deep-Learning-Interview-Book/blob/master/docs/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89.md#map
關于IOU的疑問:
iou隻能用來判斷預測預測的位置準不準确,但是目标檢測除了預測位置準不準确外,還需要判斷預測的類别和gt(ground truth)類别是否對應呀。
現在我拿出一張圖檔中所有要計算AP的類别的檢測框,計算與Gt對象檢測框的iou,若iou大于門檻值,則視為TP,若預測框中的實際對象不是要計算AP值的那個類别,但預測的标簽是要計算AP的那個類别,且預測框與gt對象的框iou也大于門檻值,那麼這種情況判讀為TP,明顯是錯誤的。
其實這種情況基本不可能發生:
1、源碼中:if not R[‘difficult’][jmax],将難檢測的目标去掉了(個人覺得這裡主要去除的是被遮擋面積較大的檢測對象,也就是2個不同類别的物體重疊幹擾的情況)
2、假如框中實際對象與要GT的類别不比對,你預測的此類别的置信度分數不會很高,然後在統計TP的時候,置信度分數高的檢測結果先去判斷是否是TP
3、即使假設你是剩下預測中置信度分數最高的,你與其他目标的GT的IOU還要超過門檻值
以上三點每一樣都基本很難滿足,更别說三點都滿足了,是以說這樣做是一點問題沒有的。
目标檢測中的遮擋問題解決方案
一般通過設計優化損失函數來解決
1.對于待檢測目标之間的互相遮擋
通過優化損失函數,一方面對proposal向其它目标偏移或其它目标對應的proposals靠近的情況進行懲罰;
另一方面設計損失函數使(1)所有的預測框逼近對應的Target框;(2)屬于同一Target框的多個預測框盡量集中來解決待檢測目标之前的互相遮擋。
2.對于待檢測的物體被幹擾物體(非檢測的類别目标)遮擋
因為算法隻學習待檢測的物體的特征,是以第二種遮擋隻能通過增加樣本來優化檢測效果。
在NMS之後計算mAP
這一點一定要明确,mAP值計算在NMS之後進行的,mAP是統計我們的檢測模型的最終評價名額,是所有操作完成之後,以最終的檢測結果作為标準,來計算mAP值的,另外一般隻有測試的時候才會作NMS,訓練的時候不進行NMS操作,因為訓練的時候需要大量的正負樣本去學習。
FLOPs和FLOPS區分
FLOPs:floating point operations 指的是浮點運算次數,了解為計算量,可以用來衡量算法/模型的複雜度。
FLOPS(全部大寫)指的是每秒運算的浮點數,了解為計算速度,衡量一個硬體的标準。
我們要的是衡量模型的複雜度的名額,是以選擇FLOPs。
FLOPs計算
卷積層FLOPs計算
參考:(另外其中有計算FLOPs的工具)
目标檢測的性能評價名額
CNN 模型所需的計算力flops是什麼?怎麼計算?