From f441b3025aa7e4da75d7a88b65fc61bd28e048f2 Mon Sep 17 00:00:00 2001 From: Ksenya Ryabinova Date: Fri, 31 Jan 2020 16:04:34 +0300 Subject: [PATCH] Added -chart argument --- include/darknet.h | 2 +- src/classifier.c | 7 ++++--- src/detector.c | 7 ++++--- src/image_opencv.cpp | 17 ++++++++++++----- src/image_opencv.h | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/include/darknet.h b/include/darknet.h index 2be89f05..46217a39 100644 --- a/include/darknet.h +++ b/include/darknet.h @@ -914,7 +914,7 @@ LIB_API void reset_rnn(network *net); LIB_API float *network_predict_image(network *net, image im); LIB_API float *network_predict_image_letterbox(network *net, image im); LIB_API float validate_detector_map(char *datacfg, char *cfgfile, char *weightfile, float thresh_calc_avg_iou, const float iou_thresh, const int map_points, int letter_box, network *existing_net); -LIB_API void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dont_show, int calc_map, int mjpeg_port, int show_imgs, int benchmark_layers); +LIB_API void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dont_show, int calc_map, int mjpeg_port, int show_imgs, int benchmark_layers, char* chart_path); LIB_API void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, int dont_show, int ext_output, int save_labels, char *outfile, int letter_box, int benchmark_layers); LIB_API int network_width(network *net); diff --git a/src/classifier.c b/src/classifier.c index b1ba936a..647b37a7 100644 --- a/src/classifier.c +++ b/src/classifier.c @@ -27,7 +27,7 @@ float *get_regression_values(char **labels, int n) return v; } -void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dontuse_opencv, int dont_show, int mjpeg_port, int calc_topk, int show_imgs) +void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dontuse_opencv, int dont_show, int mjpeg_port, int calc_topk, int show_imgs, char* chart_path) { int i; @@ -113,7 +113,7 @@ void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int img_size = 1000; char windows_name[100]; sprintf(windows_name, "average loss (id:%d)", random_gen()); - if (!dontuse_opencv) img = draw_train_chart(windows_name, max_img_loss, net.max_batches, number_of_lines, img_size, dont_show); + if (!dontuse_opencv) img = draw_train_chart(windows_name, max_img_loss, net.max_batches, number_of_lines, img_size, dont_show, chart_path); #endif //OPENCV data train; @@ -1349,9 +1349,10 @@ void run_classifier(int argc, char **argv) char *filename = (argc > 6) ? argv[6]: 0; char *layer_s = (argc > 7) ? argv[7]: 0; int layer = layer_s ? atoi(layer_s) : -1; + char* chart_path = find_char_arg(argc, argv, "-chart", 0); if(0==strcmp(argv[2], "predict")) predict_classifier(data, cfg, weights, filename, top); else if(0==strcmp(argv[2], "try")) try_classifier(data, cfg, weights, filename, atoi(layer_s)); - else if(0==strcmp(argv[2], "train")) train_classifier(data, cfg, weights, gpus, ngpus, clear, dontuse_opencv, dont_show, mjpeg_port, calc_topk, show_imgs); + else if(0==strcmp(argv[2], "train")) train_classifier(data, cfg, weights, gpus, ngpus, clear, dontuse_opencv, dont_show, mjpeg_port, calc_topk, show_imgs, chart_path); else if(0==strcmp(argv[2], "demo")) demo_classifier(data, cfg, weights, cam_index, filename, benchmark, benchmark_layers); else if(0==strcmp(argv[2], "gun")) gun_classifier(data, cfg, weights, cam_index, filename); else if(0==strcmp(argv[2], "threat")) threat_classifier(data, cfg, weights, cam_index, filename); diff --git a/src/detector.c b/src/detector.c index 298f37f3..e4a26b58 100644 --- a/src/detector.c +++ b/src/detector.c @@ -22,7 +22,7 @@ int check_mistakes = 0; static int coco_ids[] = { 1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90 }; -void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dont_show, int calc_map, int mjpeg_port, int show_imgs, int benchmark_layers) +void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dont_show, int calc_map, int mjpeg_port, int show_imgs, int benchmark_layers, char* chart_path) { list *options = read_data_cfg(datacfg); char *train_images = option_find_str(options, "train", "data/train.txt"); @@ -150,7 +150,7 @@ void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, i int img_size = 1000; char windows_name[100]; sprintf(windows_name, "chart_%s.png", base); - img = draw_train_chart(windows_name, max_img_loss, net.max_batches, number_of_lines, img_size, dont_show); + img = draw_train_chart(windows_name, max_img_loss, net.max_batches, number_of_lines, img_size, dont_show, chart_path); #endif //OPENCV if (net.track) { args.track = net.track; @@ -1635,6 +1635,7 @@ void run_detector(int argc, char **argv) // and for recall mode (extended output table-like format with results for best_class fit) int ext_output = find_arg(argc, argv, "-ext_output"); int save_labels = find_arg(argc, argv, "-save_labels"); + char* chart_path = find_char_arg(argc, argv, "-chart", 0); if (argc < 4) { fprintf(stderr, "usage: %s %s [train/test/valid/demo/map] [data] [cfg] [weights (optional)]\n", argv[0], argv[1]); return; @@ -1673,7 +1674,7 @@ void run_detector(int argc, char **argv) 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, hier_thresh, dont_show, ext_output, save_labels, outfile, letter_box, benchmark_layers); - else if (0 == strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear, dont_show, calc_map, mjpeg_port, show_imgs, benchmark_layers); + else if (0 == strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear, dont_show, calc_map, mjpeg_port, show_imgs, benchmark_layers, chart_path); else if (0 == strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile); 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, thresh, iou_thresh, map_points, letter_box, NULL); diff --git a/src/image_opencv.cpp b/src/image_opencv.cpp index 73808477..8e3d1762 100644 --- a/src/image_opencv.cpp +++ b/src/image_opencv.cpp @@ -1003,8 +1003,13 @@ extern "C" void draw_detections_cv_v3(mat_cv* mat, detection *dets, int num, flo // ==================================================================== // Draw Loss & Accuracy chart // ==================================================================== -extern "C" mat_cv* draw_train_chart(char *windows_name, float max_img_loss, int max_batches, int number_of_lines, int img_size, int dont_show) +extern "C" mat_cv* draw_train_chart(char *windows_name, float max_img_loss, int max_batches, int number_of_lines, int img_size, int dont_show, char* chart_path) { + if (chart_path != NULL && chart_path[0] != '\0'){ + cv::Mat* img_ptr = new cv::Mat(cv::imread(chart_path)); + return (mat_cv*)img_ptr; + } + int img_offset = 60; int draw_size = img_size - img_offset; cv::Mat *img_ptr = new cv::Mat(img_size, img_size, CV_8UC3, CV_RGB(255, 255, 255)); @@ -1085,10 +1090,12 @@ extern "C" void draw_train_loss(char *windows_name, mat_cv* img_src, int img_siz if (iteration_old == 0) cv::putText(img, accuracy_name, cv::Point(10, 12), cv::FONT_HERSHEY_COMPLEX_SMALL, 0.7, CV_RGB(255, 0, 0), 1, CV_AA); - cv::line(img, - cv::Point(img_offset + draw_size * (float)iteration_old / max_batches, draw_size * (1 - old_precision)), - cv::Point(img_offset + draw_size * (float)current_batch / max_batches, draw_size * (1 - precision)), - CV_RGB(255, 0, 0), 1, 8, 0); + if (iteration_old != 0){ + cv::line(img, + cv::Point(img_offset + draw_size * (float)iteration_old / max_batches, draw_size * (1 - old_precision)), + cv::Point(img_offset + draw_size * (float)current_batch / max_batches, draw_size * (1 - precision)), + CV_RGB(255, 0, 0), 1, 8, 0); + } sprintf(char_buff, "%2.1f%% ", precision * 100); cv::putText(img, char_buff, cv::Point(10, 28), cv::FONT_HERSHEY_COMPLEX_SMALL, 0.7, CV_RGB(255, 255, 255), 5, CV_AA); diff --git a/src/image_opencv.h b/src/image_opencv.h index 136b7388..39c45218 100644 --- a/src/image_opencv.h +++ b/src/image_opencv.h @@ -92,7 +92,7 @@ void save_cv_jpg(mat_cv *img, const char *name); void draw_detections_cv_v3(mat_cv* show_img, detection *dets, int num, float thresh, char **names, image **alphabet, int classes, int ext_output); // Draw Loss & Accuracy chart -mat_cv* draw_train_chart(char *windows_name, float max_img_loss, int max_batches, int number_of_lines, int img_size, int dont_show); +mat_cv* draw_train_chart(char *windows_name, float max_img_loss, int max_batches, int number_of_lines, int img_size, int dont_show, char* chart_path); void draw_train_loss(char *windows_name, mat_cv* img, int img_size, float avg_loss, float max_img_loss, int current_batch, int max_batches, float precision, int draw_precision, char *accuracy_name, int dont_show, int mjpeg_port); @@ -126,4 +126,4 @@ void destroy_all_windows_cv(); } #endif -#endif // IMAGE_OPENCV_H \ No newline at end of file +#endif // IMAGE_OPENCV_H