void init_haar(t_haar *haar) { init_feature(haar->typea); init_feature(haar->typeb); init_feature(haar->typec); init_feature(haar->typed); init_feature(haar->typee); }
int main(int argc, char *argv[]) { boolean print_parse = FALSE; boolean print_expanded = FALSE; char *arg; char *source_name = NULL; char *output_name = NULL; FILE *file; add_header_handler("module", set_module); add_header_handler("library", set_library); add_header_handler(NULL, end_of_headers); init_sym_table(); init_feature(); init_info(); init_expand(); init_compile(); #ifdef MACOS add_feature(symbol("macos")); # ifndef SHLB argc = ccommand( &argv ); # endif #endif while ((arg = *++argv) != NULL) { if (arg[0] == '-') { switch (arg[1]) { case 'd': if (arg[2] == '\0') { print_parse = TRUE; print_expanded = TRUE; } else { char *ptr; for (ptr = arg+2; *ptr != '\0'; ptr++) { switch (*ptr) { case 'p': print_parse = TRUE; break; case 'e': print_expanded = TRUE; break; default: fprintf(stderr, "Invalid thing to print: ``%c''\n", *ptr); usage(); } } } break; case 'o': if (output_name != NULL) { fprintf(stderr, "-o can only be used once.\n"); usage(); } else if (arg[2] != '\0') output_name = arg+2; else if (*++argv == NULL) { fprintf(stderr, "-o must be followed by the output " "file name.\n"); usage(); } else output_name = *argv; break; case 'l': if (LibraryName != NULL) { fprintf(stderr, "-l can only be used once.\n"); usage(); } if (arg[2] != '\0') LibraryName = symbol(arg+2); else if (*++argv == NULL) { fprintf(stderr, "-l must be followed by the library " "name.\n"); usage(); } else LibraryName = symbol(*argv); break; case 'q': GiveWarnings = FALSE; break; case 'D': if (arg[2] != '\0') add_feature(symbol(arg + 2)); else if (*++argv == NULL) { fprintf(stderr, "-D must be followed by the feature to define.\n"); usage(); } else add_feature(symbol(*argv)); break; case 'U': if (arg[2] != '\0') remove_feature(symbol(arg + 2)); else if (*++argv == NULL) { fprintf(stderr, "-U must be followed by the feature " "to undefine.\n"); usage(); } else remove_feature(symbol(*argv)); break; default: fprintf(stderr, "Invalid flag: ``%s''\n", arg); usage(); } } else if (source_name != NULL) { fprintf(stderr, "Too many files\n"); usage(); } else source_name = arg; } if (source_name == NULL) usage(); yyin = fopen(source_name, "rb"); if (yyin == NULL) { /* Try the same filename but in the current directory */ /* Start ptr at the null termination, and work backwards to a path separator. */ char *ptr = source_name + strlen(source_name); for ( ; ptr != source_name; ptr--) { if (*ptr == '/' || *ptr == '\\') { /* We're pointing at the path separator, which is too far */ ptr++; break; } } /* If ptr is a different string than source_name, and it isn't the empty string... */ if (ptr != source_name && *ptr != 0) { yyin = fopen(ptr, "rb"); } if (yyin == NULL) { perror(source_name); exit(1); } } current_file = source_name; yyparse(); if (print_parse) { printf("================ Original Parse Tree ================\n"); print_body(Program, 0); } if (nerrors != 0) exit(1); /* Do the various source-to-source expansions. */ expand(Program); if (print_expanded) { printf("================ Expanded Parse Tree ================\n"); print_body(Program, 0); } if (nerrors != 0) exit(1); /* Run environment analysis */ environment_analysis(Program); if (nerrors != 0) exit(1); if (output_name == NULL) output_name = make_output_name(source_name, ".dbc"); if (strcmp(output_name, "-") == 0) file = stdout; else file = fopen(output_name, "wb"); if (file == NULL) { perror(output_name); exit(1); } dump_setup_output(source_name, file); /* Generate code. */ compile(Program); dump_finalize_output(); fclose(file); exit(0); return 0; }
StrongClassifier* adaboost_learning(CascadeClassifier *cc, std::list<float *> &positiveSet, int numPos, std::list<float *> &negativeSet, int numNeg, std::list<float *> &validateSet, std::vector<Feature *> &featureSet, float maxfpr, float maxfnr) { StrongClassifier *sc = new StrongClassifier; int width = cc->WIDTH; int height = cc->HEIGHT; float *weights = NULL, *values = NULL; int sampleSize = numPos + numNeg; int fsize = featureSet.size(); float cfpr = 1.0; init_weights(&weights, numPos, numNeg); values = new float[sampleSize]; memset(values, 0, sizeof(float) * sampleSize); while(cfpr > maxfpr) { std::list<float *>::iterator iter; float minError = 1, error, beta; WeakClassifier *bestWC = NULL; for(int i = 0; i < fsize; i++) { Feature *feat = new Feature; WeakClassifier *wc = new WeakClassifier; init_feature(feat, featureSet[i]); init_weak_classifier(wc, 0, 0, feat); iter = positiveSet.begin(); for(int j = 0; j < numPos; j++, iter++) values[j] = get_value(feat, *iter, width, 0, 0); iter = negativeSet.begin(); for(int j = 0; j < numNeg; j++, iter++) values[j + numPos] = get_value(feat, *iter, width, 0, 0); error = train(wc, values, numPos, numNeg, weights); if(error < minError) { if(bestWC != NULL){ clear(bestWC); bestWC = NULL; } bestWC = wc; minError = error; printf("Select best weak classifier, min error: %f\r", minError); fflush(stdout); } else delete wc; } assert(minError > 0); printf("best weak classifier error = %f \n", minError); beta = minError / (1 - minError); int tp = 0; iter = positiveSet.begin(); for(int i = 0; i < numPos; i++, iter++){ if(classify(bestWC, *iter, width, 0, 0) == 1){ weights[i] *= beta; tp ++; } } int tn = 0; iter = negativeSet.begin(); for(int i = numPos; i < sampleSize; i++, iter++){ if(classify(bestWC, *iter, width, 0, 0) != 1){ weights[i] *= beta; tn++; } } update_weights(weights, numPos, numNeg); printf("TP = %d, TN = %d, beta = %f, log(1/beta) = %f\n", tp, tn, beta, log(1/beta)); add(sc, bestWC, log(1/beta)); train(sc, positiveSet, width, maxfnr); cfpr = fpr(sc, validateSet, width); printf("fpr validate: %f\n", fpr(sc, validateSet, width)); printf("fpr negative: %f\n", fpr(sc, negativeSet, width)); printf("\n"); } printf("\nWeak classifier size %ld\n", sc->wcs.size()); delete [] values; delete [] weights; return sc; }