建設(shè)公司營銷網(wǎng)站優(yōu)化落實新十條措施
前言
近期參與到了手寫AI的車道線檢測的學(xué)習(xí)中去,以此系列筆記記錄學(xué)習(xí)與思考的全過程。車道線檢測系列會持續(xù)更新,力求完整精煉,引人啟示。所需前期知識,可以結(jié)合手寫AI進行系統(tǒng)的學(xué)習(xí)。
介紹
自動駕駛的一大前提是保證人的安全,故對人的檢測是必須的。考慮到自動駕駛的場景需求,各類車輛、交通燈、交通標(biāo)志以及其他路上高頻出現(xiàn)的,對決策有影響的物體類別都應(yīng)進行識別,例如摩托車、自行車等。在確定了數(shù)據(jù)集及檢測類別后,測試指標(biāo)對評估模型性能好壞有著至關(guān)重要的意義,目前已有大量相關(guān)研究。本文對在工程中選取的指標(biāo)做出總結(jié),并介紹了目前比較主流的各類評價指標(biāo)。
測試指標(biāo)的選取
目標(biāo)檢測問題,一般的常用評價指標(biāo)有:
- 精度評價指標(biāo):map(平均準(zhǔn)確度均值,精度評價),準(zhǔn)確率 (Accuracy),混淆矩陣 (Confusion Matrix),精確率(Precision),召回率(Recall),平均正確率(AP),mean Average Precision(mAP),交除并(IoU),ROC + AUC,非極大值抑制(NMS)。
- 速度評價指標(biāo): FPS(即每秒處理的圖片數(shù)量或者處理每張圖片所需的時間,當(dāng)然必須在同一硬件條件下進行比較)
選取mAP、混淆矩陣、PR曲線、fppi和F1-Score作為精度評價指標(biāo),其中mAP、F1-Score是量化的評價指標(biāo),fppi可以進行量化,使用log-average miss rate作為其量化的評價指標(biāo)。混淆矩陣和PR曲線從不同角度反映了模型的好壞。
選取FLOPs作為速度評價指標(biāo),表征了處理一幀圖像所需的計算量,相比FPS更加通用,同時考慮到模型的評價是在同一臺主機上進行的,故FPS也將作為參考標(biāo)準(zhǔn)。
下面具體介紹目標(biāo)檢測領(lǐng)域中常用的評價指標(biāo)。
精度評價指標(biāo)
MAP(平均準(zhǔn)確度均值)
mAP定義及相關(guān)概念
- mAP: mean Average Precision, 即各類別AP的平均值
- AP: PR曲線下面積,后文會詳細講解
- PR曲線: Precision-Recall曲線
- Precision: TP / (TP + FP)
- Recall: TP / (TP + FN)
- TP (True Positive,真陽性):檢測器給出正樣本,事實上也是正樣本,即正確檢測到目標(biāo)
- TN (True Negative,真陰性):檢測器給出負樣本,事實上也是負樣本,即正確檢測到非目標(biāo)
- FP (False Positive,假陽性):檢測器給出正樣本,事實上卻是負樣本,即誤檢測
- FN (False Negative,假陰性):檢測器給出負樣本,事實上卻是正樣本,即漏檢測
- TP: IoU>0.5的檢測框數(shù)量(同一Ground Truth只計算一次)
- FP: IoU<=0.5的檢測框,或者是檢測到同一個GT的多余檢測框的數(shù)量
- FN: 沒有檢測到的GT的數(shù)量
注意:
(1)一般來說mAP針對整個數(shù)據(jù)集而言的;
(2)AP針對數(shù)據(jù)集中某一個類別而言的;
(3)而percision和recall針對單張圖片某一類別的。
mAP的具體計算
- 不同數(shù)據(jù)集map計算方法
由于map是數(shù)據(jù)集中所有類別AP值得平均,所以我們要計算map,首先得知道某一類別的AP值怎么求。不同數(shù)據(jù)集的某類別的AP計算方法大同小異,主要分為三種:
(1)在VOC2010以前,只需要選取當(dāng)Recall >= 0, 0.1, 0.2, …, 1共11個點時的Precision最大值,然后AP就是這11個Precision的平均值,map就是所有類別AP值的平均。
(2)在VOC2010及以后,需要針對每一個不同的Recall值(包括0和1),選取其大于等于這些Recall值時的Precision最大值,然后計算PR曲線下面積作為AP值,map就是所有類別AP值的平均。
(3)COCO數(shù)據(jù)集,設(shè)定多個IOU閾值(0.5-0.95,0.05為步長),在每一個IOU閾值下都有某一類別的AP值,然后求不同IOU閾值下的AP平均,就是所求的最終的某類別的AP值。
- 計算某一類別的AP
由上面概念我們知道,我們計算某一類別AP需要需要繪畫出這一類別的PR曲線,所以我們要計算數(shù)據(jù)集中每張圖片中這一類別的percision和recall。
由公式:
- Precision: TP / (TP + FP)
- Recall: TP / (TP + FN)
只需要統(tǒng)計出TP,FP,FN個數(shù)就行了。
- 如何判斷TP,FP,FN(重要)
拿單張圖片來說吧,
- 首先遍歷圖片中g(shù)round truth對象,
- 然后提取我們要計算的某類別的gt objects,
- 之后讀取我們通過檢測器檢測出的這種類別的檢測框(其他類別的先不管),
- 接著過濾掉置信度分數(shù)低于置信度閾值的框(也有的未設(shè)置信度閾值),
- 將剩下的檢測框按置信度分數(shù)從高到低排序,最先判斷置信度分數(shù)最高的檢測框與gt bbox的iou是否大于iou閾值,
- 若iou大于設(shè)定的iou閾值即判斷為TP,將此gt_bbox標(biāo)記為已檢測(后續(xù)的同一個GT的多余檢測框都視為FP,這就是為什么先要按照置信度分數(shù)從高到低排序,置信度分數(shù)最高的檢測框最先去與iou閾值比較,若大于iou閾值,視為TP,后續(xù)的同一個gt對象的檢測框都視為FP),
- iou小于閾值的,直接規(guī)劃到FP中去。
這里置信度分數(shù)不同的論文可能對其定義不一樣,一般指分類置信度的居多,也就是預(yù)測框中物體屬于某一個類別的概率。
- 計算mAP在NMS之后
這一點一定要明確,**mAP值計算在NMS之后進行的,**mAP是統(tǒng)計我們的檢測模型的最終評價指標(biāo),是所有操作完成之后,以最終的檢測結(jié)果作為標(biāo)準(zhǔn),來計算mAP值的,另外提一點一般只有測試的時候才會作NMS,訓(xùn)練的時候不進行NMS操作,因為訓(xùn)練的時候需要大量的正負樣本去學(xué)習(xí)。
準(zhǔn)確率 (Accuracy)
分對的樣本數(shù)除以所有的樣本數(shù) ,即:
準(zhǔn)確(分類)率 = 正確預(yù)測的正反例數(shù) / 總數(shù)。
準(zhǔn)確率一般用來評估模型的全局準(zhǔn)確程度,不能包含太多信息,無法全面評價一個模型性能。
混淆矩陣 (Confusion Matrix)
混淆矩陣中的橫軸是模型預(yù)測的類別數(shù)量統(tǒng)計,縱軸是數(shù)據(jù)真實標(biāo)簽的數(shù)量統(tǒng)計。
對角線,**表示模型預(yù)測和數(shù)據(jù)標(biāo)簽一致的數(shù)目,*所以對角線之和除以測試集總數(shù)就是*準(zhǔn)確率。對角線上數(shù)字越大越好,在可視化結(jié)果中顏色越深,說明模型在該類的預(yù)測準(zhǔn)確率越高。如果按行來看,每行不在對角線位置的就是錯誤預(yù)測的類別??偟膩碚f,我們希望對角線越高越好,非對角線越低越好。
精確率(Precision)與召回率(Recall)
一些相關(guān)的定義。假設(shè)現(xiàn)在有這樣一個測試集,測試集中的圖片只由大雁和飛機兩種圖片組成,假設(shè)你的分類系統(tǒng)最終的目的是:能取出測試集中所有飛機的圖片,而不是大雁的圖片。
- True positives : 正樣本被正確識別為正樣本,飛機的圖片被正確的識別成了飛機。
- True negatives: 負樣本被正確識別為負樣本,大雁的圖片沒有被識別出來,系統(tǒng)正確地認為它們是大雁。
- False positives: 假的正樣本,即負樣本被錯誤識別為正樣本,大雁的圖片被錯誤地識別成了飛機。
- False negatives: 假的負樣本,即正樣本被錯誤識別為負樣本,飛機的圖片沒有被識別出來,系統(tǒng)錯誤地認為它們是大雁。
- **Precision其實就是在識別出來的圖片中,True positives所占的比率。**也就是本假設(shè)中,所有被識別出來的飛機中,真正的飛機所占的比例。
- Recall 是測試集中所有正樣本樣例中,被正確識別為正樣本的比例。也就是本假設(shè)中,被正確識別出來的飛機個數(shù)與測試集中所有真實飛機的個數(shù)的比值。
- **Precision-recall 曲線:**改變識別閾值,使得系統(tǒng)依次能夠識別前K張圖片,閾值的變化同時會導(dǎo)致Precision與Recall值發(fā)生變化,從而得到曲線。
如果一個分類器的性能比較好,那么它應(yīng)該有如下的表現(xiàn):
在Recall值增長的同時,Precision的值保持在一個很高的水平。
而性能比較差的分類器可能會損失很多Precision值才能換來Recall值的提高。
通常情況下,文章中都會使用Precision-recall曲線,來顯示出分類器在Precision與Recall之間的權(quán)衡。
平均精度(Average-Precision,AP)與 mean Average Precision(mAP)
AP就是Precision-recall 曲線下面的面積,通常來說一個越好的分類器,AP值越高。
mAP是多個類別AP的平均值。這個mean的意思是對每個類的AP再求平均,得到的就是mAP的值,mAP的大小一定在[0,1]區(qū)間,越大越好。該指標(biāo)是目標(biāo)檢測算法中最重要的一個。
在正樣本非常少的情況下,PR表現(xiàn)的效果會更好。
IoU
IoU這一值,可以理解為系統(tǒng)預(yù)測出來的框與原來圖片中標(biāo)記的框的重合程度。
計算方法即檢測結(jié)果Detection Result與 Ground Truth 的交集比上它們的并集,即為檢測的準(zhǔn)確率。
IOU正是表達這種bounding box和groundtruth的差異的指標(biāo):
ROC(Receiver Operating Characteristic)曲線與AUC(Area Under Curve)
受試者工作特征曲線 (receiver operating characteristic curve,簡稱ROC曲線),又稱為感受性曲線(sensitivity curve)。
ROC空間將偽陽性率(FPR)定義為 X 軸,真陽性率(TPR)定義為 Y 軸。
ROC曲線:
- 橫坐標(biāo):假正率(False positive rate, FPR),FPR = FP / [ FP + TN] ,代表所有負樣本中錯誤預(yù)測為正樣本的概率,假警報率;
- 縱坐標(biāo):真正率(True positive rate, TPR),TPR = TP / [ TP + FN] ,代表所有正樣本中預(yù)測正確的概率,命中率。
PD=(number of true target)/(number of actural target)
FA=number of false detection/number of tested frames
以FA為橫軸PD為縱軸繪制ROC曲線
對角線對應(yīng)于隨機猜測模型,而(0,1)對應(yīng)于所有整理排在所有反例之前的理想模型。
曲線越接近左上角,分類器的性能越好。
ROC曲線有個很好的特性:當(dāng)測試集中的正負樣本的分布變化的時候,ROC曲線能夠保持不變。
在實際的數(shù)據(jù)集中經(jīng)常會出現(xiàn)類不平衡(class imbalance)現(xiàn)象,即負樣本比正樣本多很多(或者相反),而且測試數(shù)據(jù)中的正負樣本的分布也可能隨著時間變化。
ROC曲線繪制:
(1)根據(jù)每個測試樣本屬于正樣本的概率值從大到小排序;
(2)從高到低,依次將“Score”值作為閾值threshold,當(dāng)測試樣本屬于正樣本的概率大于或等于這個threshold時,我們認為它為正樣本,否則為負樣本;
(3)每次選取一個不同的threshold,我們就可以得到一組FPR和TPR,即ROC曲線上的一點。
當(dāng)我們將threshold設(shè)置為1和0時,分別可以得到ROC曲線上的(0,0)和(1,1)兩個點。將這些(FPR,TPR)對連接起來,就得到了ROC曲線。當(dāng)threshold取值越多,ROC曲線越平滑。
- AUC(Area Under Curve)
即為ROC曲線下的面積。AUC越接近于1,分類器性能越好。
**物理意義:**首先AUC值是一個概率值,當(dāng)你隨機挑選一個正樣本以及一個負樣本,當(dāng)前的分類算法根據(jù)計算得到的Score值將這個正樣本排在負樣本前面的概率就是AUC值。當(dāng)然,AUC值越大,當(dāng)前的分類算法越有可能將正樣本排在負樣本前面,即能夠更好的分類。
計算公式:就是求曲線下矩形面積。
- PR曲線和ROC曲線比較
——ROC曲線特點:
(1)優(yōu)點:當(dāng)測試集中的正負樣本的分布變化的時候,ROC曲線能夠保持不變。因為TPR聚焦于正例,FPR聚焦于與負例,使其成為一個比較均衡的評估方法。
在實際的數(shù)據(jù)集中經(jīng)常會出現(xiàn)類不平衡(class imbalance)現(xiàn)象,即負樣本比正樣本多很多(或者相反),而且測試數(shù)據(jù)中的正負樣本的分布也可能隨著時間變化。
(2)缺點:上文提到ROC曲線的優(yōu)點是不會隨著類別分布的改變而改變,但這在某種程度上也是其缺點。因為負例N增加了很多,而曲線卻沒變,這等于產(chǎn)生了大量FP。像信息檢索中如果主要關(guān)心正例的預(yù)測準(zhǔn)確性的話,這就不可接受了。在類別不平衡的背景下,負例的數(shù)目眾多致使FPR的增長不明顯,導(dǎo)致ROC曲線呈現(xiàn)一個過分樂觀的效果估計。ROC曲線的橫軸采用FPR,根據(jù)FPR ,當(dāng)負例N的數(shù)量遠超正例P時,FP的大幅增長只能換來FPR的微小改變。結(jié)果是雖然大量負例被錯判成正例,在ROC曲線上卻無法直觀地看出來。(當(dāng)然也可以只分析ROC曲線左邊一小段)
——PR曲線:
(1)PR曲線使用了Precision,因此PR曲線的兩個指標(biāo)都聚焦于正例。類別不平衡問題中由于主要關(guān)心正例,所以在此情況下PR曲線被廣泛認為優(yōu)于ROC曲線。
使用場景:
- ROC曲線由于兼顧正例與負例,所以適用于評估分類器的整體性能,相比而言PR曲線完全聚焦于正例。
- 如果有多份數(shù)據(jù)且存在不同的類別分布,比如信用卡欺詐問題中每個月正例和負例的比例可能都不相同,這時候如果只想單純地比較分類器的性能且剔除類別分布改變的影響,則ROC曲線比較適合,因為類別分布改變可能使得PR曲線發(fā)生變化時好時壞,這種時候難以進行模型比較;反之,如果想測試不同類別分布下對分類器的性能的影響,則PR曲線比較適合。
- 如果想要評估在相同的類別分布下正例的預(yù)測情況,則宜選PR曲線。
- 類別不平衡問題中,ROC曲線通常會給出一個樂觀的效果估計,所以大部分時候還是PR曲線更好。
- 最后可以根據(jù)具體的應(yīng)用,在曲線上找到最優(yōu)的點,得到相對應(yīng)的precision,recall,f1 score等指標(biāo),去調(diào)整模型的閾值,從而得到一個符合具體應(yīng)用的模型。
fppi/fppw
- fppi = false positive per image
OK,到這里你好不容易畫出PR曲線,算好了mAP,然后興高采烈的在項目進度會上大講特講。當(dāng)你說完后,對面的產(chǎn)品妹子,用看智障的眼神瞅了你一眼,不緊不慢的說:
我不關(guān)心什么mAP,更不關(guān)心你的曲線,我就想知道你這個算法平均每張圖錯幾個。
fppi曲線
fppi曲線的縱軸為FN(即Miss rate),橫軸為false positive per image。
顯然相比PR曲線,fppi更接近于實際應(yīng)用。
至于畫法,與PR曲線類似,都是通過調(diào)整thresh_conf計算相關(guān)指標(biāo)畫點,然后連線得到。
對應(yīng)的還有fppw(fppw = false positive per window)。
在介紹miss rate versus false positives per-image(后文簡稱FPPI)之前,就不得不先說另一個指標(biāo),名字叫
miss rate versus false positives per window(后文簡稱FPPW) 。
起初呢,大家是使用FPPW作為評價行人檢測指標(biāo)的。這個指標(biāo)最早出現(xiàn)在文章 Histograms of Oriented Gradients for Human Detection。這篇文章中發(fā)表了INRIA行人數(shù)據(jù)集,評估性能的時候就是用這個FPPW(值得一提的是,HOG+SVM這個經(jīng)典的行人檢測方法也是在這篇文章中提出的)
下面簡單介紹下FPPW的檢測原理:
FPPW的縱軸是miss rate,橫軸是false positives per window,兩個坐標(biāo)軸都是采用對數(shù)坐標(biāo)軸表示:
miss rate = false negative / positive,即1-recall,即表示所有存在的行人中(positive),漏檢的行人(false negative)占了多少
false positives per window = false positive / the number of window
為什么要用the number of window呢,因為這和HOG+SVM的原理相關(guān),他的檢測過程大概是這樣的:
輸入一張待檢測的圖片
首先用滑窗法,選取圖片上的某一塊區(qū)域(后面稱這塊區(qū)域為window)
提取這個區(qū)域的HOG特征
將HOG特征輸入SVM中,利用SVM進行分類,判斷是否為行人
通過上面的過程我們可以看到,因為SVM僅僅只是作為分類器,所以如果要檢測到不同size的行人的話,就需要在滑窗法中用很多不同size的窗口去滑動,每滑動一次,就對應(yīng)一個window,因此誕生了很多window,每個window都對應(yīng)一個SVM的預(yù)測結(jié)果。
對于一張圖片來說,我們關(guān)注的是SVM是否能夠?qū)@些window判斷準(zhǔn)確,所以用false positive / the number of window,就可以評估SVM在這張圖片上的檢測性能如何。
那如何得到多個miss rate與fppw值呢?
這和ROC曲線的套路比較類似,即通過調(diào)整檢測的閾值,來得到一系列的miss rate與fppw。
例如,閾值越高,說明只有置信度越高的檢測框才能被認為是檢測器的輸出,所以輸出的實際檢測框越少、檢測框越準(zhǔn)確,檢測到空氣的可能性越低,這也會導(dǎo)致漏檢概率越大(置信度低的true positive變?yōu)榱薴alse negative),所以此時miss rate增加,fppw減少。反之同理。
上面是只有一個圖片時的計算方法,對于多張的圖片來說,其實也是類似的。首先先把所有圖片的結(jié)果都放在一起,按照置信度由高到低排序,然后按照置信度的高低來調(diào)整檢測的閾值,由此就得到了一系列的miss rate與fppw,然后再除以the number of window(此時the number of window為每張圖片上window的數(shù)量*圖片的數(shù)量)。
(調(diào)整檢測的閾值的例子在下文中有)
那FPPW如何量化對比呢?
因為曲線與曲線之間是沒辦法量化對比的,所以作者使用FPPW=1 0 ? 4 時 10^{?4}時10
?4
時的miss rate作為結(jié)果對比的參考點(地位類似ROC曲線中的AUC值)。
以上,就是FPPW的大致原理。
原文中,作者說FPPW這個指標(biāo)對于miss rate變化非常敏感,即miss rate稍微變化一點點,橫軸的fppw就會改變非常大。例如,miss rate每降低1%,就相當(dāng)于將原本的fppw降低1.57倍。
miss rate versus false positives per image (FPPI)
前面介紹了FPPW,但是FPPW存在以下問題:
不能反映false positive在不同size和位置空間中的表現(xiàn),即無法得知分類器檢測目標(biāo)附近的表現(xiàn)或分類器在與目標(biāo)相似的背景下性能如何。
因為我們從per window中無法得知這個window是在圖像中哪個位置的,也無法得知這個window的size如何,我們用per window所能得到關(guān)于window的有用信息量也不大,所以per window并沒有什么特別優(yōu)勢
FPPW這個指標(biāo)不好理解,因為per window這個概念過于接近底層的檢測原理了,按照正常的思維,我們其實比較好奇的是 “對于每一張圖片,誤檢率是多少”,我們會思考更加宏觀、貼近實際應(yīng)用的場景,反而不會關(guān)心每個window檢測情況是怎樣
所以在文章Pedestrian detection: A benchmark中,作者提出了FPPI作為更合適的行人檢測衡量指標(biāo)。
FPPI的好處主要如下:
per image這個概念更加貼近實際生活,更好理解
下面簡單介紹下FPPI的檢測原理:
FPPI的縱軸是miss rate,橫軸是false positives per image,兩個坐標(biāo)軸都是采用對數(shù)坐標(biāo)軸表示:
miss rate = false negative / positive,即1-recall
false positives per image = false positive / the number of image
我們可以發(fā)現(xiàn),其實就只是橫軸變了而已,其實縱軸是一樣的。
同樣,我們也可以調(diào)整閾值,得到一系列的miss rate和fppi。
那FPPI如何量化對比呢?
同樣,曲線與曲線之間是沒辦法量化對比的,所以一開始,使用FPPI=1時的miss rate作為結(jié)果對比的參考點。
但是在后續(xù)的論文 Pedestrian Detection: An Evaluation of the State of the Art中(兩篇論文的作者都是大神Piotr Dollar),作者改成了使用log-average miss rate作為結(jié)果對比的參考點,計算方式為:
在對數(shù)坐標(biāo)系下,從 1 0 ? 2 10^{-2} 10?2到 1 0 0 10^0 100之間均勻地取9個FPPI值,這9個FPPI值會對應(yīng)9個miss rate值,將這9個miss rate值求均值,就得到了log-average miss rate。
(對于一些在達到特定FPPI值之前,就已經(jīng)提前結(jié)束的曲線,miss rate值則取曲線所能達到的最小值)
什么叫提前結(jié)束的曲線呢?
我們可以看看下面這張圖
倒數(shù)第二個紫色的HogLbp還沒有達到 1 0 0 10^0 100就已經(jīng)提前結(jié)束了,而且你也會發(fā)現(xiàn)不同曲線也是長短不一,為什么會這樣呢?其實這和不同檢測器的輸出有關(guān)。
因為FPPI圖中的曲線本質(zhì)上是由一組一組的[fppi,mr]點組成的,這些點就連成了曲線,曲線提前結(jié)束了,說明這些點的最大fppi值到不了 1 0 0 10^0 100 。而一組一組的[fppi,mr]點是通過調(diào)整檢測器的閾值得到的。檢測器的閾值選取方式,是根據(jù)檢測器輸出檢測框的數(shù)量和置信度決定的。
例如,檢測器A檢測了3張圖片,它在這3張圖片上共輸出了10個檢測框,每個檢測框有其對應(yīng)的置信度,我們按照置信度將這些檢測框由高到低排序,例如:0.9、0.85、0.8、0.75、0.7、0.65、0.6、0.55、0.5、0.45。
我們先選擇0.9作為檢測器的閾值,大于等于0.9的檢測框,我們認為有行人、低于0.9的檢測框,我們認為沒有行人,這樣我們就得到了一個[fppi,mr]點。
接下來,我們選擇0.85作為檢測器的閾值,大于等于0.85的檢測框,我們認為有行人、低于0.85的檢測框,我們認為沒有行人,這樣我們就得到了一個[fppi,mr]點。
以此類推,一直到0.45,我們就可以一共得到10個[fppi,mr]點,即檢測器輸出了多少個檢測框,我們就能得到多少個[fppi,mr]點。當(dāng)閾值為0.45時,假設(shè)檢測器A對應(yīng)的[fppi,mr]點的值為[0.8, 0.25],那么此時,檢測器A的曲線最多只能畫到fppi=0.8,所以就到不了 1 0 0 10^0 100 了。但是如果換了一個檢測器,可能他們輸出的檢測框結(jié)果。例如,檢測器B檢測同樣的3張圖片,假設(shè)它在這3張圖片上也是共輸出了10個檢測框,按照上面的步驟,檢測器B就會輸出10個[fppi,mr]點。當(dāng)閾值為0.45時,假設(shè)檢測器B對應(yīng)的[fppi,mr]點的值為[1.5, 0.25],那么此時,檢測器B的曲線在繪制的時候就會超出 1 0 0 10^0 100 。
(不同檢測器輸出的檢測框數(shù)量可能也不一樣,也是一個影響因素,為了簡化表述所以上面的例子中沒有考慮進去)
其實說白了,就是不同檢測器性能不一樣。當(dāng)檢測器的閾值選擇最低的那個置信度時,本質(zhì)上就是所有的檢測框我們都認為檢測結(jié)果為行人,此時如果有些檢測器有很多誤檢的框,那么它所能達到的fppi就會比較高;如果有些檢測器誤檢的框比較少,那么它所能達到的fppi最大值也會比較低,所以因此導(dǎo)致了不同檢測器的fppi上界不同。
以上,就是FPPI的大致原理。
由ROC曲線得到FPPI曲線
在實際畫FPPI曲線的代碼中,作者用的是compRoc、plotRoc這些帶有ROC字眼的詞來寫的,那我們從理論上來看看作者是怎么通過ROC得到FPPI的
ROC曲線的y軸是TPR(True positive rate),x軸是FPR(False positive rate):
TPR = TP / ( TP + FN )
FPR = FP / ( FP + TN )
TPR 和recall的計算公式是一樣,所以我們可以認為TPR=recall
FPPI曲線的y軸是miss rate,x軸是fppi(false positives per image):
miss rate = FN / ( TP + FN )
fppi = FP / the number of image
關(guān)于y軸的轉(zhuǎn)換
miss rate = ( TP + FN - TP) / ( TP + FN ) = 1 - recall = 1 - TPR
所以只要用1減去ROC曲線的y值,就可以得到FPPI曲線的y值
關(guān)于x軸的轉(zhuǎn)換
作者在compRoc函數(shù)中,對于ROC曲線,計算的y軸就是fppi!這其實是一個名詞理解的問題。。。。
通常,我們一聽到ROC曲線,想到的就是y軸是TPR、x軸是FPR的曲線。
但是在作者的代碼中,他所指代的ROC,指的是y軸是TPR、x軸是fppi的曲線。所以不存在類似y軸一樣的FPR與fppi之間的轉(zhuǎn)換,因為作者直接算的就是fppi
我們也可以換一個角度理解他為什么要這樣命名,其實ROC曲線的FPR和FPPI曲線中的fppi他們的本質(zhì)是非常相近的,分子都是FP,這兩個指標(biāo)關(guān)注的都是誤檢方面。
兩者的區(qū)別只是在于分母不同,FPR的分母是“所有負例”,fppi的分母是“所有圖片”。
這也是很好理解的,因為在行人檢測任務(wù)中,“所有負例”的數(shù)量實在是太多了!一張圖片就只有那么幾個行人(即“正例”),沒有行人的地方都可以認為是“負例”,這個數(shù)量我們是確定不了的。
所以在行人檢測任務(wù)中,FPR是算不出來的,所以用的是fppi來評價誤檢的情況。
非極大值抑制(NMS)
Non-Maximum Suppression就是需要根據(jù)score矩陣和region的坐標(biāo)信息,從中找到置信度比較高的bounding box。對于有重疊在一起的預(yù)測框,只保留得分最高的那個。
(1)NMS計算出每一個bounding box的面積,然后根據(jù)score進行排序,把score最大的bounding box作為隊列中首個要比較的對象;
(2)計算其余bounding box與當(dāng)前最大score與box的IoU,去除IoU大于設(shè)定的閾值的bounding box,保留小的IoU得預(yù)測框;
(3)然后重復(fù)上面的過程,直至候選bounding box為空。
最終,檢測了bounding box的過程中有兩個閾值,一個就是IoU,另一個是在過程之后,從候選的bounding box中剔除score小于閾值的bounding box。需要注意的是:Non-Maximum Suppression一次處理一個類別,如果有N個類別,Non-Maximum Suppression就需要執(zhí)行N次。
F1-Score
F1
分數(shù)(F1-score
)是分類問題的一個衡量指標(biāo)。F1
分數(shù)認為召回率和精度同等重要, 一些多分類問題的機器學(xué)習(xí)競賽,常常將F1-score
作為最終測評的方法。它是精確率和召回率的調(diào)和平均數(shù),最大為1,最小為0。計算公式如下:
F1= 2TP/(2TP+FP+FN)
此外還有F2
分數(shù)和F0.5
分數(shù)。F2
分數(shù)認為召回率的重要程度是精度的2倍,而F0.5
分數(shù)認為召回率的重要程度是精度的一半。計算公式為:
更一般地,我們可以定義Fβ
(precision
和recall
權(quán)重可調(diào)的F1 score
):
Fβ = ((1+β*β)*precision*recall) / (β*β*precision + recall)
常用的如F2
和F0.5
。
速度評價指標(biāo)
概述
目標(biāo)檢測技術(shù)的很多實際應(yīng)用在準(zhǔn)確度和速度上都有很高的要求,如果不計速度性能指標(biāo),只注重準(zhǔn)確度表現(xiàn)的突破,但其代價是更高的計算復(fù)雜度和更多內(nèi)存需求,對于全面行業(yè)部署而言,可擴展性仍是一個懸而未決的問題。一般來說目標(biāo)檢測中的速度評價指標(biāo)有:
(1)FPS,檢測器每秒能處理圖片的張數(shù)
(2)檢測器處理每張圖片所需要的時間
但速度評價指標(biāo)必須在同一硬件上進行,同一硬件,它的最大FLOPS(每秒運算浮點數(shù)代表著硬件性能,此處區(qū)分FLOPs)是相同的,不同網(wǎng)絡(luò),處理每張圖片所需的FLOPs(浮點操作數(shù))是不同的,所以同一硬件處理相同圖片所需的FLOPs越小,相同時間內(nèi),就能處理更多的圖片,速度也就越快,處理每張圖片所需的FLOPs與許多因素有關(guān),比如你的網(wǎng)絡(luò)層數(shù),參數(shù)量,選用的激活函數(shù)等等,這里僅談一下網(wǎng)絡(luò)的參數(shù)量對其的影響,一般來說參數(shù)量越低的網(wǎng)絡(luò),FLOPs會越小,保存模型所需的內(nèi)存小,對硬件內(nèi)存要求比較低,因此比較對嵌入式端較友好。
- 一般來說ResNeXt+Faster RCNN在NVIDIA GPU上可以做到1秒/圖
- 而MobileNet+SSD在ARM芯片上可以做到300毫秒/圖
ARM和GPU之間的運算能力差距,各位都懂。
FLOPs計算
- FLOPs和FLOPS區(qū)分
先解釋一下FLOPs:floating point operations 指的是浮點運算次數(shù),理解為計算量,可以用來衡量算法/模型的復(fù)雜度。
此處區(qū)分一下FLOPS(全部大寫),FLOPS指的是每秒運算的浮點數(shù),理解為計算速度,衡量一個硬件的標(biāo)準(zhǔn)。我們要的是衡量模型的復(fù)雜度的指標(biāo),所以選擇FLOPs。
- FLOPs計算(以下計算FLOPs不考慮激活函數(shù)的運算)
(1)卷積層
FLOPs=(2*Ci*k*K-1)*H*W*Co(不考慮bias)
FLOPs=(2*Ci*k*K)*H*W*Co(考慮bias)
Ci為輸入特征圖通道數(shù),K為過濾器尺寸,H,W,Co為輸出特征圖的高,寬和通道數(shù)。
最后得到的Co張輸出特征圖,每張?zhí)卣鲌D上有HW個像素點,而這其中的每個像素點的值都是由過濾器與輸入特征圖卷積得到的,過濾器中Cik*K個點,每個點都要和輸入特征圖對應(yīng)點作一次相乘操作(浮點操作數(shù)為 c i × k × k c_i \times k\times k ci×k×k),然后將這些過濾器和輸入特征圖對應(yīng)點相乘所得的數(shù)相加起來(浮點操作數(shù)為 c i × k × k c_i \times k\times k ci×k×k,n個數(shù)相加,所需要的浮點操作數(shù)為n-1),得到一個值,對應(yīng)于一張輸出特征圖中的一個像素,輸出特征圖有Co張,故有Co個過濾器參與卷積運算,所以卷積層的 F L O P s = ( 2 × C i × k × k ? 1 ) × H × W × C o FLOPs=(2\times C_i \times k \times k -1)\times H \times W \times C_o FLOPs=(2×Ci×k×k?1)×H×W×Co
(Ci為輸入特征圖通道數(shù),K為過濾器尺寸,H,W,Co為輸出特征圖的高,寬和通道數(shù))
(2)池化層
池化分為最大值池化和均值池化,看別人的博客說網(wǎng)絡(luò)中一般池化層較少,且池化操作所占用的FLOPs很少,對速度性能影響較小。我在想,
最大池化雖然沒有參數(shù),但存在計算,類似的還有Dropout等
均值池化,要求平均值,先相加再除以總數(shù)(輸出特征圖上一個像素點,需要浮點操作數(shù)為: k × k ? 1 + 1 k \times k -1 +1 k×k?1+1。求平均值,先 k × k k \times k k×k個數(shù)相加,操作數(shù)為, k × k ? 1 k\times k-1 k×k?1,然后除以 k × k k \times k k×k,浮點操作數(shù)為1),輸出特征圖通道數(shù)為Co,所以這里浮點操作數(shù)應(yīng)該為 k ? k ? H ? W ? C o kkHWCo k?k?H?W?Co(不知道有沒有問題,如有大佬知道,還望告知)
(3)全連接層
先解釋一下全連接層
卷積神經(jīng)網(wǎng)絡(luò)的全連接層
在 CNN 結(jié)構(gòu)中,經(jīng)多個卷積層和池化層后,連接著1個或1個以上的全連接層.與 MLP 類似,全連接層中的每個神經(jīng)元與其前一層的所有神經(jīng)元進行全連接.全連接層可以整合卷積層或者池化層中具有類別區(qū)分性的局部信息.為了提升 CNN 網(wǎng)絡(luò)性能,全連接層每個神經(jīng)元的激勵函數(shù)一般采用 ReLU 函數(shù)。最后一層全連接層的輸出值被傳遞給一個輸出,可以采用 softmax 邏輯回歸(softmax regression)進行 分 類,該層也可 稱為 softmax 層(softmax layer).對于一個具體的分類任務(wù),選擇一個合適的損失函數(shù)是十分重要的,CNN 有幾種常用的損失函數(shù),各自都有不同的特點.通常,CNN 的全連接層與 MLP 結(jié)構(gòu)一樣,CNN 的訓(xùn)練算法也多采用BP算法
全連接層的每一個結(jié)點都與上一層的所有結(jié)點相連,用來把前邊提取到的特征綜合起來。由于其全相連的特性,一般全連接層的參數(shù)也是最多的。例如在VGG16中,第一個全連接層FC1有4096個節(jié)點,上一層POOL2是77512 = 25088個節(jié)點,則該傳輸需要4096*25088個權(quán)值,需要耗很大的內(nèi)存
其中,x1、x2、x3為全連接層的輸入,a1、a2、a3為輸出,
其實現(xiàn)在全連接層已經(jīng)基本不用了,CNN基本用FCN來代表,可用卷積層來實現(xiàn)全連接層的功能。設(shè)I為輸入神經(jīng)元個數(shù),O為輸出神經(jīng)元個數(shù),輸出的每個神經(jīng)元都是由輸入的每個神經(jīng)元乘以權(quán)重(浮點操作數(shù)為I),然后把所得的積的和相加(浮點操作數(shù)為I-1),加上一個偏差(浮點操作數(shù)為1)得到了,故FLOPs為:
FLOPs=(I+I-1) * O = (2I-1) * O(不考慮bias)
FLOPs=((I+I-1+1)* O = (2I) * O(考慮bias)
- FLOPs和參數(shù)量計算小工具
最近在github上找到了一個別人開源的在Pytorch框架中使用的FLOPs和參數(shù)量計算的小工具OpCouter,非常好用,這個工具安裝也十分方便,可以直接使用pip簡單的完成安裝。以下放出作者開源的鏈接:THOP: PyTorch-OpCounter
參考鏈接
目標(biāo)檢測評價指標(biāo)
機器學(xué)習(xí)算法評估指標(biāo)——2D目標(biāo)檢測
【行人檢測】miss rate versus false positives per image (FPPI) 前世今生(理論篇)