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