模式識別 評價方法 ROC曲線, DET曲線, FPPW, FPPI etc._影像處理演算法

來源:互聯網
上載者:User

模式識別 評價方法 ===> ROC 曲線 DET 曲線  FPPW  FPPI


因個人在做模式識別相關的工作,模式識別演算法最終的效能評價是關鍵。但苦於網上很難找到具體、詳細的評價流程、方法以及代碼,所以本人打算近期準備如題所示評價方法的整理工作,到時候會奉上方法介紹、基礎代碼(matlab 版),以協助更多像我這樣對這些方法有些迷茫的人。

暫時提供matlab中內建的ROC,DET曲線繪製函數: perfcurve()

具體使用方法,中文連結:http://ilovematlab.cn/thread-76781-1-1.html

MathWork Manual(文檔源自matlab2013。之前低版本中應該有該函數,但本人在自己的2008a版本中沒有發現,2010版本中應該有): http://www.mathworks.cn/cn/help/stats/perfcurve.html


自編 ROC 曲線及相關中間結果的計算代碼。

Main function:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function: ROC curve related%   date : 2013.07.01% author : Xin Yang, School of medicine, SZU%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 根據Label8score檔案繪製 ROC、DET曲線% 擷取資料檔案路徑[filename, pathname] = uigetfile( {'*.txt', 'Model Files (*.txt)'; ...'*.*', 'All Files (*.*)'}, '選擇 ROC 資料來源','F:\Result\FPPW\');if isequal(filename,0) || isequal(pathname,0)    return;%如果點了“取消”else    L8S_file = [pathname , filename];enddot_num = 50;YX_Roc(L8S_file , dot_num);% YX_DET_Curve(L8S_file , dot_num);

YX_Roc function:

% 根據 標記&預測得分檔案 繪製ROC曲線function YX_Roc(Label8ScoreFile , dot_num)% 載入 標記&預測得分 資料檔案  1:正 0:負Mat_L8S = load(Label8ScoreFile);sample_num = size(Mat_L8S ,1);% 繪製正、負標記分布趨勢圖,用於觀察正負樣本的交叉程度Plot_PN_pdf(Mat_L8S);Label = Mat_L8S(:,1);% 人工標記Score = Mat_L8S(:,2);% 演算法評分% 分數上下限Upper = max(Score);Lower = min(Score);% 拓寬分數上下限,便於達到極限Upper = Upper + 0.1;Lower = Lower - 0.1;% 點數bins = dot_num;% 步進step = (Upper - Lower)/bins;% 閾值變化T = Lower:step:Upper;T_num = bins + 1;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 計算 TPR 、FPRTPR = zeros(T_num ,1);FPR = zeros(T_num ,1);% 遍曆閾值for i = 1:T_num    T_temp = T(i);    TP = 0 ; FN = 0;% 清零    FP = 0 ; TN = 0;    % 遍曆樣本    for j = 1:sample_num        if (Label(j) == 1)            if (Score(j) >= T_temp)                TP = TP + 1;% 真陽            else                FN = FN + 1;% 假陰            end        elseif (Label(j) == 0)            if (Score(j) >= T_temp)                FP = FP + 1;% 假陽            else                TN = TN + 1;% 真陰            end        end    end    % *****    TPR(i) = TP/(TP + FN);    FPR(i) = FP/(FP + TN);end% ROC 曲線figureplot(FPR , TPR , 'c', 'LineWidth',2);axis([0 ,1 ,0 ,1]);xlabel('1-Specificity')ylabel('Sensitivity')title('ROC')grid on% Youden 指數figureX = TPR-FPR;plot(X ,'r','LineWidth',2);title('Youden 指數');% TPR、FPR 隨閾值的變化,便於觀察、確定閾值figure ,plot3(FPR , TPR , T ,'Color' , 'r' ,'LineWidth',2);xlabel('\fontsize{14}\bfX軸 -- FPR')ylabel('\fontsize{14}\bfY軸 -- TPR')zlabel('\fontsize{14}\bfZ軸 -- Threshold')title('\fontsize{14}\bf閾值選取')

Plot_PN_pdf function : 

% 根據 Label2Score 繪製正、負標記的機率密度函數曲線function Plot_PN_pdf(Mat_label2score)[La_P_r , La_P_c] = find(Mat_label2score(:,1) == 1);[La_N_r , La_N_c] = find(Mat_label2score(:,1) == 0);P_Score = Mat_label2score(La_P_r , 2);N_Score = Mat_label2score(La_N_r , 2);[P_Count , P_bin] = hist(P_Score , 50);[N_Count , N_bin] = hist(N_Score , 50);P_Count = (P_Count - min(P_Count))/(max(P_Count) - min(P_Count));N_Count = (N_Count - min(N_Count))/(max(N_Count) - min(N_Count));figure values = spcrv([[P_bin(1) P_bin P_bin(end)];[P_Count(1) P_Count P_Count(end)]],3);plot(values(1,:),values(2,:),'Color' , 'r' ,'LineWidth',2);hold on values = spcrv([[N_bin(1) N_bin N_bin(end)];[N_Count(1) N_Count N_Count(end)]],3);plot(values(1,:),values(2,:),'Color' , 'b' ,'LineWidth',2);legend('\fontsize{14}\it  P-Labeled','\fontsize{14}\it  N-Labeled')xlabel('\fontsize{14}\bfScore')ylabel('\fontsize{14}\bffrequency')title('\fontsize{14}\bf正、負標記分布曲線')

中間結果:

  

                                    (1)                                                                                          (2)

  

                                  (3)                                                                                           (4)

(1)圖刻畫了正負測試資料的預測得分分布(機率密度函數),並表明了正負測試樣本得分的交叉程度。交叉程度由兩者曲線下的交叉部分的積分,即面積決定。交叉越多,則表明分類器效果越差,反之,效果越好。

(2)圖則是ROC曲線,越靠近左上方,分類器效能越好。

(3)圖則是ROC曲線應用時,選取實際應用閾值的參考方法之一:Youden指數。曲線最高點對應的閾值為最好的應用閾值。Youden指數可參考如下文章第6頁:http://www.medicalbiostatistics.com/roccurve.pdf

(4)圖是基於ROC,選取閾值的曲線。X, Y分別為假陽率、真陽率,Z軸則是相應的閾值。要始終記住的是,ROC曲線的產生,就是因為以閾值作為變數,在不同閾值下,得到的多組真陽、假陽率點繪製而來的ROC曲線。所以ROC曲線上的任何一個點,都是有對應的閾值的。繪製ROC曲線的目的,除了直觀的看到分類器效能,另一個重要作用就是,根據ROC曲線,選取一個合理的閾值,用於實際檢測、應用、判定。


另附兩篇個人覺得很有用的博文連結,是關於ROC和Precision-Recall的講解的:

[1] http://www.zhizhihu.com/html/y2012/4076.html

[2] http://blog.csdn.net/abcjennifer/article/details/7834256


//=============== 28-Aug-2015 增加==================//

目標檢測中另外常用的評價標準則是FPPW和FPPI,詳細應用可以參考這篇文章: Pedestrian detection: A benchmark
兩者都側重考察FP(False Positive)出現的頻率。

FPPW (False Positive per Window)

基本含義:給定一定數目N的負樣本映像,分類器將負樣本判定為“正”的次數FP,其比率FP/N即為FPPW。意義與ROC中的假陽率相同。FPPW中,一張圖就是一個樣本。

FPPI (False Positive per Image)

基本含義:給定一定數目N的樣本集,內含N張映像,每張映像內包含或不包含檢測目標。

每張映像均需要標定:

1.包含目標的個數;

2. 目標的準確位置L。

而後在每張映像上運行分類器,檢測目標並得到位置p。然後,檢查每張映像內的檢測結果是否“擊中”標定的目標:

a. 若映像內無目標,而分類器給出了n個“目標”檢測結果,那麼False Positive 次數 +n;

b. 若映像內有目標,則判斷p是否擊中L,判斷標準參看上述文章(主要看p與L的重疊率)。若判斷未擊中,則False Positive 次數 +1。

最後 FPPI = (False Positive 次數)/N。

FPPI 相比於FPPW來說,更接近於分類器的實際應用情況。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.