不同检测算法误检率、漏检率、检测时间对比测试:
void main() { DetectTask* d_task = NewDetectTaskInstance(60,"pico"); //给facedeletedll就是facedeletedll算法,根据参数,有不同的分配算法 FileSupport file; std::string root = "D:\\project\\weifu-jpg"; <span style="white-space:pre"> </span>std::vector<std::string> all = file.get_file_names(root, ".jpg"); size_t n = all.size(); int losedet = 0; int falsedet = 0; clock_t total_time = 0; for (size_t i = 0; i < n; i++) { cv::Mat img = cv::imread(all[i],0); clock_t tic = clock(); std::vector<cv::Rect> rects = d_task->detect(img, 60); clock_t toc = clock(); total_time += toc - tic; if (rects.size() == 0) losedet += 1; else if (rects.size() > 1) falsedet += rects.size()-1; for (auto &r : rects) cv::rectangle(img, r, cv::Scalar(0,0,255), 3); //把所有检测到的窗口加到图片上去 cv::imshow("test", img); cv::waitKey(1); //opencv显示图片,必须要的waitKay。参数大小不管。 } printf("total_time = %d ms\n", total_time); printf("losedect: %d/%d = %f\n", losedet, n, double(losedet)/n); printf("falsedect: %d/%d = %f\n", falsedet, n, double(falsedet)/n); }
误检算法:检测窗口>1的,把多余1的算成误检窗口。算法bug: 1. 因为背景小人脸也有可能被检测到,算误检,提高了误检率。2. 检测到的主窗口,也有可能不是人脸。
大数据,不能人工数的前提下,目前只有采取这个算法。如果想进一步精确数据,可以改进数据集,即:在无背景,每张只有一张人脸的数据集上测试。(但仍无法避免检测到一个窗口,该窗口不是人脸的情况)