📄 jesorsky.cc
字号:
const char *help = "\progname: jesorsky.cc\n\code2html: This program computes the face detection results using the Jesorsky measure.\n\version: Torch3 vision2.0, 2004-2005\n\(c) Christine Alves (alves@idiap.ch)\n";// face model (more to be added)#include "FrontalFace19x19.h"// GT measurer#include "jesorskyGTMeasurer.h"// geometry#include "Rectangle2D.h"// misc#include "CmdLine.h"#include "DiskXFile.h"using namespace Torch;int main(int argc, char *argv[]){ // Cmdline variables char *gtlistposfilename; char *inlistposfilename; real threshold; int postype; bool oneface; bool gtoneface; bool verbose; bool rect; CmdLine cmd; cmd.info(help); cmd.setBOption("write log", false); cmd.addText("\nArguments:"); cmd.addSCmdArg("gtlistposfile", >listposfilename, "list of ground truth pos file"); cmd.addSCmdArg("inlistposfile", &inlistposfilename, "list of input pos file"); cmd.addText("\nOptions:"); cmd.addRCmdOption("-threshold", &threshold, 0.25, "threshold"); cmd.addICmdOption("-postype", &postype, 1, "pos type"); cmd.addBCmdOption("-gtoneface", >oneface, false, "gt one face"); cmd.addBCmdOption("-oneface", &oneface, false, "one face"); cmd.addBCmdOption("-rect", &rect, false, "the file contains rectangles coordinates"); cmd.addBCmdOption("-verbose", &verbose, false, "verbose"); cmd.read(argc, argv); // Allocator *allocator = new Allocator; char inposfilename[200]; char gtposfilename[200]; Point2D l_eye; Point2D r_eye; sPoint2D eyes[2]; bool found = true; int ngt, nin; real x1, y1, x2, y2; int n_detected_faces; int n_match_faces = 0; int n_gt_faces = 0; int s_n_gt_faces = 0; int missed = 0; int smissed = 0; int fa = 0; int sfa = 0; real detect = 0; real sdetect = 0; // DiskXFile *inlistposfile = new DiskXFile(inlistposfilename, "r"); DiskXFile *gtlistposfile = new DiskXFile(gtlistposfilename, "r"); gtlistposfile->scanf("%d", &ngt); inlistposfile->scanf("%d", &nin); for (int i = 1; i <= ngt; i++) { gtlistposfile->scanf("%s", gtposfilename); inlistposfile->scanf("%s", inposfilename); if(verbose) message(" Comparing %s to %s", inposfilename, gtposfilename); //------------------------------------------------------------------- //------------------- MATCHING -------------------------------------- //------------------------------------------------------------------- DiskXFile *inposfile = NULL; inposfile = new DiskXFile(inposfilename, "r"); if (oneface) n_detected_faces = 1; else inposfile->scanf("%d", &n_detected_faces); // if(verbose) message("Using 19x19 face model."); FaceModel *face_model = NULL; face_model = new(allocator) FrontalFace19x19(postype); // Read the input file and for all detections, compare with the groundtruth n_match_faces = 0; if (n_detected_faces != 0) //if (!oneface) { for (int i=1;i<=n_detected_faces;i++) { inposfile->scanf("%f", &x1); inposfile->scanf("%f", &y1); inposfile->scanf("%f", &x2); inposfile->scanf("%f", &y2); // If the input file contains rectangles and not eyes: convert to eyes coordinates if (rect) { // sPoint2D bbx[4]; // bbx[0].x = x1; bbx[0].y = y1; bbx[1].x = x1 + x2; bbx[1].y = y1; bbx[2].x = x1 + x2; bbx[2].y = y1 + y2; bbx[3].x = x1; bbx[3].y = y1 + y2; // Jesorsky measurer: load the gt file, get the number of faces jesorskyGTMeasurer *jesorsky = new(allocator) jesorskyGTMeasurer(face_model, gtoneface, threshold); jesorsky->setBOption("verbose", verbose); jesorsky->load(gtposfilename); n_gt_faces = jesorsky->n_faces; // if(verbose) message("Jesorsky measure"); found = jesorsky->measure(4, bbx); allocator->free(jesorsky); } else { l_eye.x = x1; l_eye.y = y1; r_eye.x = x2; r_eye.y = y2; eyes[0].x = l_eye.x; eyes[0].y = l_eye.y; eyes[1].x = r_eye.x; eyes[1].y = r_eye.y; // Jesorsky measurer: load the gt file, get the number of faces jesorskyGTMeasurer *jesorsky = new(allocator) jesorskyGTMeasurer(face_model, gtoneface, threshold); jesorsky->setBOption("verbose", verbose); jesorsky->load(gtposfilename); n_gt_faces = jesorsky->n_faces; // if(verbose) message("Jesorsky measure"); found = jesorsky->measure(2, eyes); allocator->free(jesorsky); } // Count the number of faces correctly detected in the input file if (found) n_match_faces ++; } } else { l_eye.x = 0; l_eye.y = 0; r_eye.x = 0; r_eye.y = 0; // Jesorsky measurer: load the gt file, get the number of faces jesorskyGTMeasurer *jesorsky = new(allocator) jesorskyGTMeasurer(face_model, gtoneface, threshold); jesorsky->setBOption("verbose", verbose); jesorsky->load(gtposfilename); n_gt_faces = jesorsky->n_faces; missed = n_gt_faces; fa = 0; allocator->free(jesorsky); } // Delete the input file delete inposfile; //------------------------------------------------------------------- //------------------- EVALUATION ------------------------------------ //------------------------------------------------------------------- if (n_detected_faces == n_gt_faces) { if (n_match_faces == n_gt_faces) { missed = 0; fa = 0; } else if (n_match_faces < n_gt_faces) { missed = n_gt_faces - n_match_faces; fa = 0; } } else if (n_detected_faces > n_gt_faces) { if (n_match_faces == n_gt_faces) { missed = 0; fa = n_detected_faces - n_match_faces; } else if (n_match_faces < n_gt_faces) { missed = n_gt_faces - n_match_faces; fa = n_detected_faces - n_gt_faces; } } else { if (n_match_faces == n_detected_faces) { missed = n_gt_faces - n_match_faces; fa = 0; } else if (n_match_faces < n_detected_faces) { missed = n_gt_faces - n_match_faces; fa = n_detected_faces - n_match_faces; } } detect = n_match_faces; s_n_gt_faces += n_gt_faces; sdetect += detect; smissed += missed; sfa += fa; if(verbose) { print(" Detection : %f\n", detect); print(" Missed : %d\n", missed); print(" FA : %d\n\n", fa); } } print("Final result:\n"); print(" GT Faces : %d\n", s_n_gt_faces); print(" Detected Faces : %f\n", sdetect); sdetect = (sdetect / s_n_gt_faces) * 100; print(" Percentage of detections : %f\n", sdetect); print(" Number of GT faces non detected (missed) : %d\n", smissed); print(" Number of non-faces detected as faces (FA) : %d\n", sfa); delete inlistposfile; delete gtlistposfile; delete allocator; return(0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -