| | |
| | | if (ymax > h) ymax = h; |
| | | |
| | | for(j = 0; j < classes; ++j){ |
| | | int class = j; |
| | | if (probs[i][class]) fprintf(fp, "%d %d %f %f %f %f %f\n", id, j+1, probs[i][class], |
| | | int class_id = j; |
| | | if (probs[i][class_id]) fprintf(fp, "%d %d %f %f %f %f %f\n", id, j+1, probs[i][class_id], |
| | | xmin, ymin, xmax, ymax); |
| | | } |
| | | } |
| | |
| | | return 0; |
| | | } |
| | | |
| | | void validate_detector_map(char *datacfg, char *cfgfile, char *weightfile) |
| | | void validate_detector_map(char *datacfg, char *cfgfile, char *weightfile, float thresh_calc_avg_iou) |
| | | { |
| | | int j; |
| | | list *options = read_data_cfg(datacfg); |
| | |
| | | args.h = net.h; |
| | | args.type = IMAGE_DATA; |
| | | |
| | | //const float thresh_calc_avg_iou = 0.24; |
| | | float avg_iou = 0; |
| | | int tp_for_thresh = 0; |
| | | int fp_for_thresh = 0; |
| | | |
| | | box_prob *detections = calloc(1, sizeof(box_prob)); |
| | | int detections_count = 0; |
| | | int unique_truth_index = 0; |
| | | int unique_truth_count = 0; |
| | | |
| | | int *truth_classes_count = calloc(classes, sizeof(int)); |
| | | |
| | |
| | | if (current_iou > iou_thresh && class_id == truth[j].id) { |
| | | if (current_iou > max_iou) { |
| | | max_iou = current_iou; |
| | | truth_index = unique_truth_index + j; |
| | | truth_index = unique_truth_count + j; |
| | | } |
| | | } |
| | | } |
| | |
| | | float current_iou = box_iou(boxes[i], t); |
| | | if (current_iou > iou_thresh && class_id == truth_dif[j].id) { |
| | | --detections_count; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // calc avg IoU, true-positives, false-positives for required Threshold |
| | | if (prob > thresh_calc_avg_iou) { |
| | | if (truth_index > -1) { |
| | | avg_iou += max_iou; |
| | | ++tp_for_thresh; |
| | | } |
| | | else |
| | | fp_for_thresh++; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | unique_truth_index += num_labels; |
| | | unique_truth_count += num_labels; |
| | | |
| | | free(id); |
| | | free_image(val[t]); |
| | |
| | | } |
| | | } |
| | | |
| | | avg_iou = avg_iou / (tp_for_thresh + fp_for_thresh); |
| | | |
| | | |
| | | // SORT(detections) |
| | | qsort(detections, detections_count, sizeof(box_prob), detections_comparator); |
| | |
| | | for (i = 0; i < classes; ++i) { |
| | | pr[i] = calloc(detections_count, sizeof(pr_t)); |
| | | } |
| | | printf("detections_count = %d, unique_truth_index = %d \n", detections_count, unique_truth_index); |
| | | printf("detections_count = %d, unique_truth_count = %d \n", detections_count, unique_truth_count); |
| | | |
| | | |
| | | int *truth_flags = calloc(unique_truth_index, sizeof(int)); |
| | | int *truth_flags = calloc(unique_truth_count, sizeof(int)); |
| | | |
| | | int rank; |
| | | for (rank = 0; rank < detections_count; ++rank) { |
| | |
| | | } |
| | | } |
| | | } |
| | | //printf("point = %d, cur_recall = %.4f, cur_precision = %.4f \n", point, cur_recall, cur_precision); |
| | | //printf("class_id = %d, point = %d, cur_recall = %.4f, cur_precision = %.4f \n", i, point, cur_recall, cur_precision); |
| | | |
| | | avg_precision += cur_precision; |
| | | } |
| | | avg_precision = avg_precision / 11; |
| | | printf("class = %d, name = %s, \t ap = %2.2f %% \n", i, names[i], avg_precision*100); |
| | | printf("class_id = %d, name = %s, \t ap = %2.2f %% \n", i, names[i], avg_precision*100); |
| | | mean_average_precision += avg_precision; |
| | | } |
| | | |
| | | const float cur_precision = (float)tp_for_thresh / ((float)tp_for_thresh + (float)fp_for_thresh); |
| | | const float cur_recall = (float)tp_for_thresh / ((float)tp_for_thresh + (float)(unique_truth_count - tp_for_thresh)); |
| | | const float f1_score = 2.F * cur_precision * cur_recall / (cur_precision + cur_recall); |
| | | printf(" for thresh = %1.2f, precision = %1.2f, recall = %1.2f, F1-score = %1.2f \n", |
| | | thresh_calc_avg_iou, cur_precision, cur_recall, f1_score); |
| | | |
| | | printf(" for thresh = %0.2f, TP = %d, FP = %d, FN = %d, average IoU = %2.2f %% \n", |
| | | thresh_calc_avg_iou, tp_for_thresh, fp_for_thresh, unique_truth_count - tp_for_thresh, avg_iou * 100); |
| | | |
| | | mean_average_precision = mean_average_precision / classes; |
| | | printf("\n mean average precision (mAP) = %f, or %2.2f %% \n", mean_average_precision, mean_average_precision*100); |
| | | |
| | |
| | | fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start)); |
| | | } |
| | | |
| | | void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh) |
| | | void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, int dont_show) |
| | | { |
| | | list *options = read_data_cfg(datacfg); |
| | | char *name_list = option_find_str(options, "names", "data/names.list"); |
| | |
| | | if (nms) do_nms_sort(boxes, probs, l.w*l.h*l.n, l.classes, nms); |
| | | draw_detections(im, l.w*l.h*l.n, thresh, boxes, probs, names, alphabet, l.classes); |
| | | save_image(im, "predictions"); |
| | | show_image(im, "predictions"); |
| | | if (!dont_show) { |
| | | show_image(im, "predictions"); |
| | | } |
| | | |
| | | free_image(im); |
| | | free_image(sized); |
| | | free(boxes); |
| | | free_ptrs((void **)probs, l.w*l.h*l.n); |
| | | #ifdef OPENCV |
| | | cvWaitKey(0); |
| | | cvDestroyAllWindows(); |
| | | if (!dont_show) { |
| | | cvWaitKey(0); |
| | | cvDestroyAllWindows(); |
| | | } |
| | | #endif |
| | | if (filename) break; |
| | | } |
| | |
| | | |
| | | void run_detector(int argc, char **argv) |
| | | { |
| | | int dont_show = find_arg(argc, argv, "-dont_show"); |
| | | int http_stream_port = find_int_arg(argc, argv, "-http_port", -1); |
| | | char *out_filename = find_char_arg(argc, argv, "-out_filename", 0); |
| | | char *prefix = find_char_arg(argc, argv, "-prefix", 0); |
| | | float thresh = find_float_arg(argc, argv, "-thresh", .24); |
| | |
| | | if(weights) |
| | | if (weights[strlen(weights) - 1] == 0x0d) weights[strlen(weights) - 1] = 0; |
| | | char *filename = (argc > 6) ? argv[6]: 0; |
| | | if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh); |
| | | if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, dont_show); |
| | | else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear); |
| | | else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights); |
| | | else if(0==strcmp(argv[2], "recall")) validate_detector_recall(datacfg, cfg, weights); |
| | | else if(0==strcmp(argv[2], "map")) validate_detector_map(datacfg, cfg, weights); |
| | | else if(0==strcmp(argv[2], "map")) validate_detector_map(datacfg, cfg, weights, thresh); |
| | | else if(0==strcmp(argv[2], "demo")) { |
| | | list *options = read_data_cfg(datacfg); |
| | | int classes = option_find_int(options, "classes", 20); |
| | |
| | | char **names = get_labels(name_list); |
| | | if(filename) |
| | | if (filename[strlen(filename) - 1] == 0x0d) filename[strlen(filename) - 1] = 0; |
| | | demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, out_filename); |
| | | demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, out_filename, |
| | | http_stream_port, dont_show); |
| | | } |
| | | } |