int main(int argc, char *argv[]) { br_initialize(argc, argv); // Equivalent to 'Globals->algorithm = "FaceRecognion";' in C++ API br_set_property("algorithm", "FaceRecognition"); // Equivalent to 'Globals->path = "../data/MEDS/img/";' in C++ API br_set_property("path", "../data/MEDS/img/"); // Enroll galleries, don't re-enroll if they already exist (cache) br_enroll("../data/MEDS/sigset/MEDS_frontal_target.xml", "target.gal[cache]"); br_enroll("../data/MEDS/sigset/MEDS_frontal_query.xml", "query.gal[cache]"); // Compare galleries and store result in a binary similarity matrix br_compare("target.gal", "query.gal", "FaceRecognition_MEDS.mtx"); // Make a ground truth "mask" matrix from the sigsets. br_make_mask("../data/MEDS/sigset/MEDS_frontal_target.xml", "../data/MEDS/sigset/MEDS_frontal_query.xml", "MEDS.mask"); // Evaluate the performance of OpenBR's FaceRecognition and a COTS face recognition system. br_eval("FaceRecognition_MEDS.mtx", "MEDS.mask", "Algorithm_Dataset/FaceRecognition_MEDS.csv"); // The '_' character has special significance and is used to populate plot legends. // Requires R installation, see documentation of br_plot for details. const char *files[1]; files[0] = "Algorithm_Dataset/FaceRecognition_MEDS.csv"; br_plot(1, files, "MEDS", true); br_finalize(); return 0; }
void run() { // Remove program name argv = &argv[1]; argc--; if (argc == 0) printf("%s\nTry running 'br -help'\n", br_about()); bool daemon = false; const char *daemon_pipe = NULL; while (daemon || (argc > 0)) { const char *fun; int parc; const char **parv; if (argc == 0) br_read_pipe(daemon_pipe, &argc, &argv); fun = argv[0]; if (fun[0] == '-') fun++; parc = 0; while ((parc+1 < argc) && (argv[parc+1][0] != '-')) parc++; parv = (const char **)&argv[1]; argc = argc - (parc+1); argv = &argv[parc+1]; // Core Tasks if (!strcmp(fun, "train")) { check(parc >= 1, "Insufficient parameter count for 'train'."); br_train_n(parc == 1 ? 1 : parc-1, parv, parc == 1 ? "" : parv[parc-1]); } else if (!strcmp(fun, "enroll")) { check(parc >= 1, "Insufficient parameter count for 'enroll'."); if (parc == 1) br_enroll(parv[0]); else br_enroll_n(parc-1, parv, parv[parc-1]); } else if (!strcmp(fun, "compare")) { check((parc >= 2) && (parc <= 3), "Incorrect parameter count for 'compare'."); br_compare(parv[0], parv[1], parc == 3 ? parv[2] : ""); } else if (!strcmp(fun, "pairwiseCompare")) { check((parc >= 2) && (parc <= 3), "Incorrect parameter count for 'pairwiseCompare'."); br_pairwise_compare(parv[0], parv[1], parc == 3 ? parv[2] : ""); } else if (!strcmp(fun, "eval")) { check((parc >= 1) && (parc <= 3), "Incorrect parameter count for 'eval'."); if (parc == 1) { br_eval(parv[0], "", ""); } else if (parc == 2) { if (br::File(parv[1]).suffix() == "csv") br_eval(parv[0], "", parv[1]); else br_eval(parv[0], parv[1], ""); } else { br_eval(parv[0], parv[1], parv[2]); } } else if (!strcmp(fun, "plot")) { check(parc >= 2, "Incorrect parameter count for 'plot'."); br_plot(parc-1, parv, parv[parc-1], true); } // Secondary Tasks else if (!strcmp(fun, "fuse")) { check(parc >= 4, "Insufficient parameter count for 'fuse'."); br_fuse(parc-3, parv, parv[parc-3], parv[parc-2], parv[parc-1]); } else if (!strcmp(fun, "cluster")) { check(parc >= 3, "Insufficient parameter count for 'cluster'."); br_cluster(parc-2, parv, atof(parv[parc-2]), parv[parc-1]); } else if (!strcmp(fun, "makeMask")) { check(parc == 3, "Incorrect parameter count for 'makeMask'."); br_make_mask(parv[0], parv[1], parv[2]); } else if (!strcmp(fun, "makePairwiseMask")) { check(parc == 3, "Incorrect parameter count for 'makePairwiseMask'."); br_make_pairwise_mask(parv[0], parv[1], parv[2]); } else if (!strcmp(fun, "combineMasks")) { check(parc >= 4, "Insufficient parameter count for 'combineMasks'."); br_combine_masks(parc-2, parv, parv[parc-2], parv[parc-1]); } else if (!strcmp(fun, "cat")) { check(parc >= 2, "Insufficient parameter count for 'cat'."); br_cat(parc-1, parv, parv[parc-1]); } else if (!strcmp(fun, "convert")) { check(parc == 3, "Incorrect parameter count for 'convert'."); br_convert(parv[0], parv[1], parv[2]); } else if (!strcmp(fun, "evalClassification")) { check(parc >= 2 && parc <= 4, "Incorrect parameter count for 'evalClassification'."); br_eval_classification(parv[0], parv[1], parc >= 3 ? parv[2] : "", parc >= 4 ? parv[3] : ""); } else if (!strcmp(fun, "evalClustering")) { check((parc >= 2) && (parc <= 3), "Incorrect parameter count for 'evalClustering'."); br_eval_clustering(parv[0], parv[1], parc == 3 ? parv[2] : ""); } else if (!strcmp(fun, "evalDetection")) { check((parc >= 2) && (parc <= 3), "Incorrect parameter count for 'evalDetection'."); br_eval_detection(parv[0], parv[1], parc == 3 ? parv[2] : ""); } else if (!strcmp(fun, "evalLandmarking")) { check((parc >= 2) && (parc <= 5), "Incorrect parameter count for 'evalLandmarking'."); br_eval_landmarking(parv[0], parv[1], parc >= 3 ? parv[2] : "", parc >= 4 ? atoi(parv[3]) : 0, parc >= 5 ? atoi(parv[4]) : 1); } else if (!strcmp(fun, "evalRegression")) { check(parc >= 2 && parc <= 4, "Incorrect parameter count for 'evalRegression'."); br_eval_regression(parv[0], parv[1], parc >= 3 ? parv[2] : "", parc >= 4 ? parv[3] : ""); } else if (!strcmp(fun, "plotDetection")) { check(parc >= 2, "Incorrect parameter count for 'plotDetection'."); br_plot_detection(parc-1, parv, parv[parc-1], true); } else if (!strcmp(fun, "plotLandmarking")) { check(parc >= 2, "Incorrect parameter count for 'plotLandmarking'."); br_plot_landmarking(parc-1, parv, parv[parc-1], true); } else if (!strcmp(fun, "plotMetadata")) { check(parc >= 2, "Incorrect parameter count for 'plotMetadata'."); br_plot_metadata(parc-1, parv, parv[parc-1], true); } else if (!strcmp(fun, "deduplicate")) { check(parc == 3, "Incorrect parameter count for 'deduplicate'."); br_deduplicate(parv[0], parv[1], parv[2]); } // Miscellaneous else if (!strcmp(fun, "help")) { check(parc == 0, "No parameters expected for 'help'."); help(); } else if (!strcmp(fun, "gui")) { // Do nothing because we checked for this flag prior to initialization } else if (!strcmp(fun, "objects")) { check(parc <= 2, "Incorrect parameter count for 'objects'."); int size = br_objects(NULL, 0, parc >= 1 ? parv[0] : ".*", parc >= 2 ? parv[1] : ".*"); char * temp = new char[size]; br_objects(temp, size, parc >= 1 ? parv[0] : ".*", parc >= 2 ? parv[1] : ".*"); printf("%s\n", temp); delete [] temp; } else if (!strcmp(fun, "about")) { check(parc == 0, "No parameters expected for 'about'."); printf("%s\n", br_about()); } else if (!strcmp(fun, "version")) { check(parc == 0, "No parameters expected for 'version'."); printf("%s\n", br_version()); } else if (!strcmp(fun, "daemon")) { check(parc == 1, "Incorrect parameter count for 'daemon'."); daemon = true; daemon_pipe = parv[0]; } else if (!strcmp(fun, "slave")) { check(parc == 1, "Incorrect parameter count for 'slave'"); br_slave_process(parv[0]); } else if (!strcmp(fun, "exit")) { check(parc == 0, "No parameters expected for 'exit'."); daemon = false; } else if (!strcmp(fun, "getHeader")) { check(parc == 1, "Incorrect parameter count for 'getHeader'."); const char *target_gallery, *query_gallery; br_get_header(parv[0], &target_gallery, &query_gallery); printf("%s\n%s\n", target_gallery, query_gallery); } else if (!strcmp(fun, "setHeader")) { check(parc == 3, "Incorrect parameter count for 'setHeader'."); br_set_header(parv[0], parv[1], parv[2]); } else if (!strcmp(fun, "br")) { printf("That's me!\n"); } else if (parc <= 1) { br_set_property(fun, parc >=1 ? parv[0] : ""); } else { printf("Unrecognized function '%s'\n", fun); } } QCoreApplication::exit(); }