Opencv C++ 语言 计算运动检测评估指标

// ------ 原创,转载请注明出处,谢谢谢谢谢

运动检测(change detection),即给定一组图像序列,编写一种算法实现对图像序列中变化的像素点的检测。通常,输出结果和标准集为两幅二进制图,即 opencv Mat 中某个像素的值为255或0,其中255代表当前像素运动,0则代表静止。

评估一个运动检测算法的性能,通过比较标准集图像和算法输出图像每个像素的值来完成,常用的评估指标有TP(true positive)、TN(true negative)、FP(false positive)和FN(false negative),以及融合上述四种量化指标的recall、precision、F1-score和accuracy评估指标,定义如下。

recall = TP /(TP + FN)

precision = TP /(TP + FP)

F1-score =(2 x recall x precision)/(recall + precision)

accuracy = (TP + TN)/(TP + TN + FP + FN)

最简单直接的比较两个算法性能情况可以通过计算两个算法的F1-score来完成,其值越大则该算法性能越强。accuracy指标通常难以反映出算法效果,因为运动检测应用中负样本的数量通常远远大于正样本数量,计算过程中 TN 的值通常很大,导致accuracy缺少区分性。recall指标则是具体观察算法将正样本正确估计出来的能力,precision则是观察算法所估计出的正结果中是正样本的数量。recall和precision是相互制约的两个指标,算法设计过程中期望recall和precision两个指标越大越好,却是无法达到的。为此综合两个指标的F1-score被提出,作为一种综合考量。

综上,评估指标的计算核心是获取TP、TN、FP和FN几个基本计量指标。在opencv中,有采用python语言计算几个指标的实例,可参考 /opencv_contrib/modules/bgsegm/samples/evaluation.py。本文所给出的C++实现方法如下。

欢迎批评指正。

int rp_evaluation(Mat gtSrc, Mat rSrc, double &recall, double &precision, double &f1)

{

  Mat gt = gtSrc.clone();

  Mat r = rSrc.clone();

  r = r /51;

  gt = gt /5;

  Mat sumS = gt + r;

  Mat t56 = (sumS == 56);

  int TP = countNonZero(t56);

  Mat t51 = (sumS == 51);

  int FN = countNonZero(t51);

  Mat t5 = (sumS == 5);

  int FP = countNonZero(t5);

  int TN = gt.rows * gt.cols - countNonZero(sumS);

  if ( (( TP + FN ) > 0) && (( TP + FP ) > 0)){

    recall = (double)TP / (TP + FN);

    precision = (double)TP / (TP + FP);

    f1 = (2 * precision * recall ) / ( precision + recall );

    double accuracy = (double)(TP + TN) / (TP + FN + FP + TN);

  }

  return 1;

}

opencv

recall、precision

change detection

你可能感兴趣的:(Opencv C++ 语言 计算运动检测评估指标)