From 168af40fe9a3cc81c6ee16b3e81f154780c36bdb Mon Sep 17 00:00:00 2001 From: Scheaven <xuepengqiang> Date: 星期四, 03 六月 2021 15:03:27 +0800 Subject: [PATCH] up new v4 --- lib/detecter_tools/darknet/demo.c | 855 +++++++++++++++++++++++++++++---------------------------- 1 files changed, 435 insertions(+), 420 deletions(-) diff --git a/lib/detecter_tools/darknet/demo.c b/lib/detecter_tools/darknet/demo.c index b2fd4a4..ad1cc6e 100644 --- a/lib/detecter_tools/darknet/demo.c +++ b/lib/detecter_tools/darknet/demo.c @@ -1,420 +1,435 @@ -#include "network.h" -#include "detection_layer.h" -#include "region_layer.h" -#include "cost_layer.h" -#include "utils.h" -#include "parser.h" -#include "box.h" -#include "image.h" -#include "demo.h" -#include "darknet.h" -#ifdef WIN32 -#include <time.h> -#include "gettimeofday.h" -#else -#include <sys/time.h> -#endif - -#ifdef OPENCV - -#include "http_stream.h" - -static char **demo_names; -static image **demo_alphabet; -static int demo_classes; - -static int nboxes = 0; -static detection *dets = NULL; - -static network net; -static image in_s ; -static image det_s; - -static cap_cv *cap; -static float fps = 0; -static float demo_thresh = 0; -static int demo_ext_output = 0; -static long long int frame_id = 0; -static int demo_json_port = -1; - -#define NFRAMES 3 - -static float* predictions[NFRAMES]; -static int demo_index = 0; -static mat_cv* cv_images[NFRAMES]; -static float *avg; - -mat_cv* in_img; -mat_cv* det_img; -mat_cv* show_img; - -static volatile int flag_exit; -static int letter_box = 0; - -static const int thread_wait_ms = 1; -static volatile int run_fetch_in_thread = 0; -static volatile int run_detect_in_thread = 0; - - -void *fetch_in_thread(void *ptr) -{ - while (!custom_atomic_load_int(&flag_exit)) { - while (!custom_atomic_load_int(&run_fetch_in_thread)) { - if (custom_atomic_load_int(&flag_exit)) return 0; - this_thread_yield(); - } - int dont_close_stream = 0; // set 1 if your IP-camera periodically turns off and turns on video-stream - if (letter_box) - in_s = get_image_from_stream_letterbox(cap, net.w, net.h, net.c, &in_img, dont_close_stream); - else - in_s = get_image_from_stream_resize(cap, net.w, net.h, net.c, &in_img, dont_close_stream); - if (!in_s.data) { - printf("Stream closed.\n"); - custom_atomic_store_int(&flag_exit, 1); - custom_atomic_store_int(&run_fetch_in_thread, 0); - //exit(EXIT_FAILURE); - return 0; - } - //in_s = resize_image(in, net.w, net.h); - - custom_atomic_store_int(&run_fetch_in_thread, 0); - } - return 0; -} - -void *fetch_in_thread_sync(void *ptr) -{ - custom_atomic_store_int(&run_fetch_in_thread, 1); - while (custom_atomic_load_int(&run_fetch_in_thread)) this_thread_sleep_for(thread_wait_ms); - return 0; -} - -void *detect_in_thread(void *ptr) -{ - while (!custom_atomic_load_int(&flag_exit)) { - while (!custom_atomic_load_int(&run_detect_in_thread)) { - if (custom_atomic_load_int(&flag_exit)) return 0; - this_thread_yield(); - } - - layer l = net.layers[net.n - 1]; - float *X = det_s.data; - float *prediction = network_predict(net, X); - - int i; - for (i = 0; i < net.n; ++i) { - layer l = net.layers[i]; - if (l.type == YOLO) l.mean_alpha = 1.0 / NFRAMES; - } - - cv_images[demo_index] = det_img; - det_img = cv_images[(demo_index + NFRAMES / 2 + 1) % NFRAMES]; - demo_index = (demo_index + 1) % NFRAMES; - - if (letter_box) - dets = get_network_boxes(&net, get_width_mat(in_img), get_height_mat(in_img), demo_thresh, demo_thresh, 0, 1, &nboxes, 1); // letter box - else - dets = get_network_boxes(&net, net.w, net.h, demo_thresh, demo_thresh, 0, 1, &nboxes, 0); // resized - - custom_atomic_store_int(&run_detect_in_thread, 0); - } - - return 0; -} - -void *detect_in_thread_sync(void *ptr) -{ - custom_atomic_store_int(&run_detect_in_thread, 1); - while (custom_atomic_load_int(&run_detect_in_thread)) this_thread_sleep_for(thread_wait_ms); - return 0; -} - -double get_wall_time() -{ - struct timeval walltime; - if (gettimeofday(&walltime, NULL)) { - return 0; - } - return (double)walltime.tv_sec + (double)walltime.tv_usec * .000001; -} - -void demo(char *cfgfile, char *weightfile, float thresh, float hier_thresh, int cam_index, const char *filename, char **names, int classes, - int frame_skip, char *prefix, char *out_filename, int mjpeg_port, int dontdraw_bbox, int json_port, int dont_show, int ext_output, int letter_box_in, int time_limit_sec, char *http_post_host, - int benchmark, int benchmark_layers) -{ - letter_box = letter_box_in; - in_img = det_img = show_img = NULL; - //skip = frame_skip; - image **alphabet = load_alphabet(); - int delay = frame_skip; - demo_names = names; - demo_alphabet = alphabet; - demo_classes = classes; - demo_thresh = thresh; - demo_ext_output = ext_output; - demo_json_port = json_port; - printf("Demo\n"); - net = parse_network_cfg_custom(cfgfile, 1, 1); // set batch=1 - if(weightfile){ - load_weights(&net, weightfile); - } - net.benchmark_layers = benchmark_layers; - fuse_conv_batchnorm(net); - calculate_binary_weights(net); - srand(2222222); - - if(filename){ - printf("video file: %s\n", filename); - cap = get_capture_video_stream(filename); - }else{ - printf("Webcam index: %d\n", cam_index); - cap = get_capture_webcam(cam_index); - } - - if (!cap) { -#ifdef WIN32 - printf("Check that you have copied file opencv_ffmpeg340_64.dll to the same directory where is darknet.exe \n"); -#endif - error("Couldn't connect to webcam.\n"); - } - - layer l = net.layers[net.n-1]; - int j; - - avg = (float *) calloc(l.outputs, sizeof(float)); - for(j = 0; j < NFRAMES; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float)); - - if (l.classes != demo_classes) { - printf("\n Parameters don't match: in cfg-file classes=%d, in data-file classes=%d \n", l.classes, demo_classes); - getchar(); - exit(0); - } - - flag_exit = 0; - - custom_thread_t fetch_thread = NULL; - custom_thread_t detect_thread = NULL; - if (custom_create_thread(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); - if (custom_create_thread(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); - - fetch_in_thread_sync(0); //fetch_in_thread(0); - det_img = in_img; - det_s = in_s; - - fetch_in_thread_sync(0); //fetch_in_thread(0); - detect_in_thread_sync(0); //fetch_in_thread(0); - det_img = in_img; - det_s = in_s; - - for (j = 0; j < NFRAMES / 2; ++j) { - free_detections(dets, nboxes); - fetch_in_thread_sync(0); //fetch_in_thread(0); - detect_in_thread_sync(0); //fetch_in_thread(0); - det_img = in_img; - det_s = in_s; - } - - int count = 0; - if(!prefix && !dont_show){ - int full_screen = 0; - create_window_cv("Demo", full_screen, 1352, 1013); - } - - - write_cv* output_video_writer = NULL; - if (out_filename && !flag_exit) - { - int src_fps = 25; - src_fps = get_stream_fps_cpp_cv(cap); - output_video_writer = - create_video_writer(out_filename, 'D', 'I', 'V', 'X', src_fps, get_width_mat(det_img), get_height_mat(det_img), 1); - - //'H', '2', '6', '4' - //'D', 'I', 'V', 'X' - //'M', 'J', 'P', 'G' - //'M', 'P', '4', 'V' - //'M', 'P', '4', '2' - //'X', 'V', 'I', 'D' - //'W', 'M', 'V', '2' - } - - int send_http_post_once = 0; - const double start_time_lim = get_time_point(); - double before = get_time_point(); - double start_time = get_time_point(); - float avg_fps = 0; - int frame_counter = 0; - int global_frame_counter = 0; - - while(1){ - ++count; - { - const float nms = .45; // 0.4F - int local_nboxes = nboxes; - detection *local_dets = dets; - this_thread_yield(); - - if (!benchmark) custom_atomic_store_int(&run_fetch_in_thread, 1); // if (custom_create_thread(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); - custom_atomic_store_int(&run_detect_in_thread, 1); // if (custom_create_thread(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); - - //if (nms) do_nms_obj(local_dets, local_nboxes, l.classes, nms); // bad results - if (nms) { - if (l.nms_kind == DEFAULT_NMS) do_nms_sort(local_dets, local_nboxes, l.classes, nms); - else diounms_sort(local_dets, local_nboxes, l.classes, nms, l.nms_kind, l.beta_nms); - } - - //printf("\033[2J"); - //printf("\033[1;1H"); - //printf("\nFPS:%.1f\n", fps); - printf("Objects:\n\n"); - - ++frame_id; - if (demo_json_port > 0) { - int timeout = 400000; - send_json(local_dets, local_nboxes, l.classes, demo_names, frame_id, demo_json_port, timeout); - } - - //char *http_post_server = "webhook.site/898bbd9b-0ddd-49cf-b81d-1f56be98d870"; - if (http_post_host && !send_http_post_once) { - int timeout = 3; // 3 seconds - int http_post_port = 80; // 443 https, 80 http - if (send_http_post_request(http_post_host, http_post_port, filename, - local_dets, nboxes, classes, names, frame_id, ext_output, timeout)) - { - if (time_limit_sec > 0) send_http_post_once = 1; - } - } - - if (!benchmark && !dontdraw_bbox) draw_detections_cv_v3(show_img, local_dets, local_nboxes, demo_thresh, demo_names, demo_alphabet, demo_classes, demo_ext_output); - free_detections(local_dets, local_nboxes); - - printf("\nFPS:%.1f \t AVG_FPS:%.1f\n", fps, avg_fps); - - if(!prefix){ - if (!dont_show) { - const int each_frame = max_val_cmp(1, avg_fps / 100); - if(global_frame_counter % each_frame == 0) show_image_mat(show_img, "Demo"); - int c = wait_key_cv(1); - if (c == 10) { - if (frame_skip == 0) frame_skip = 60; - else if (frame_skip == 4) frame_skip = 0; - else if (frame_skip == 60) frame_skip = 4; - else frame_skip = 0; - } - else if (c == 27 || c == 1048603) // ESC - exit (OpenCV 2.x / 3.x) - { - flag_exit = 1; - } - } - }else{ - char buff[256]; - sprintf(buff, "%s_%08d.jpg", prefix, count); - if(show_img) save_cv_jpg(show_img, buff); - } - - // if you run it with param -mjpeg_port 8090 then open URL in your web-browser: http://localhost:8090 - if (mjpeg_port > 0 && show_img) { - int port = mjpeg_port; - int timeout = 400000; - int jpeg_quality = 40; // 1 - 100 - send_mjpeg(show_img, port, timeout, jpeg_quality); - } - - // save video file - if (output_video_writer && show_img) { - write_frame_cv(output_video_writer, show_img); - printf("\n cvWriteFrame \n"); - } - - while (custom_atomic_load_int(&run_detect_in_thread)) { - if(avg_fps > 180) this_thread_yield(); - else this_thread_sleep_for(thread_wait_ms); // custom_join(detect_thread, 0); - } - if (!benchmark) { - while (custom_atomic_load_int(&run_fetch_in_thread)) { - if (avg_fps > 180) this_thread_yield(); - else this_thread_sleep_for(thread_wait_ms); // custom_join(fetch_thread, 0); - } - free_image(det_s); - } - - if (time_limit_sec > 0 && (get_time_point() - start_time_lim)/1000000 > time_limit_sec) { - printf(" start_time_lim = %f, get_time_point() = %f, time spent = %f \n", start_time_lim, get_time_point(), get_time_point() - start_time_lim); - break; - } - - if (flag_exit == 1) break; - - if(delay == 0){ - if(!benchmark) release_mat(&show_img); - show_img = det_img; - } - det_img = in_img; - det_s = in_s; - } - --delay; - if(delay < 0){ - delay = frame_skip; - - //double after = get_wall_time(); - //float curr = 1./(after - before); - double after = get_time_point(); // more accurate time measurements - float curr = 1000000. / (after - before); - fps = fps*0.9 + curr*0.1; - before = after; - - float spent_time = (get_time_point() - start_time) / 1000000; - frame_counter++; - global_frame_counter++; - if (spent_time >= 3.0f) { - //printf(" spent_time = %f \n", spent_time); - avg_fps = frame_counter / spent_time; - frame_counter = 0; - start_time = get_time_point(); - } - } - } - printf("input video stream closed. \n"); - if (output_video_writer) { - release_video_writer(&output_video_writer); - printf("output_video_writer closed. \n"); - } - - this_thread_sleep_for(thread_wait_ms); - - custom_join(detect_thread, 0); - custom_join(fetch_thread, 0); - - // free memory - free_image(in_s); - free_detections(dets, nboxes); - - free(avg); - for (j = 0; j < NFRAMES; ++j) free(predictions[j]); - demo_index = (NFRAMES + demo_index - 1) % NFRAMES; - for (j = 0; j < NFRAMES; ++j) { - release_mat(&cv_images[j]); - } - - free_ptrs((void **)names, net.layers[net.n - 1].classes); - - int i; - const int nsize = 8; - for (j = 0; j < nsize; ++j) { - for (i = 32; i < 127; ++i) { - free_image(alphabet[j][i]); - } - free(alphabet[j]); - } - free(alphabet); - free_network(net); - //cudaProfilerStop(); -} -#else -void demo(char *cfgfile, char *weightfile, float thresh, float hier_thresh, int cam_index, const char *filename, char **names, int classes, - int frame_skip, char *prefix, char *out_filename, int mjpeg_port, int dontdraw_bbox, int json_port, int dont_show, int ext_output, int letter_box_in, int time_limit_sec, char *http_post_host, - int benchmark, int benchmark_layers) -{ - fprintf(stderr, "Demo needs OpenCV for webcam images.\n"); -} -#endif +#include "network.h" +#include "detection_layer.h" +#include "region_layer.h" +#include "cost_layer.h" +#include "utils.h" +#include "parser.h" +#include "box.h" +#include "image.h" +#include "demo.h" +#include "darknet.h" +#ifdef WIN32 +#include <time.h> +#include "gettimeofday.h" +#else +#include <sys/time.h> +#endif + +#ifdef OPENCV + +#include "http_stream.h" + +static char **demo_names; +static image **demo_alphabet; +static int demo_classes; + +static int nboxes = 0; +static detection *dets = NULL; + +static network net; +static image in_s ; +static image det_s; + +static cap_cv *cap; +static float fps = 0; +static float demo_thresh = 0; +static int demo_ext_output = 0; +static long long int frame_id = 0; +static int demo_json_port = -1; +static bool demo_skip_frame = false; + + +static int avg_frames; +static int demo_index = 0; +static mat_cv** cv_images; + +mat_cv* in_img; +mat_cv* det_img; +mat_cv* show_img; + +static volatile int flag_exit; +static int letter_box = 0; + +static const int thread_wait_ms = 1; +static volatile int run_fetch_in_thread = 0; +static volatile int run_detect_in_thread = 0; + + +void *fetch_in_thread(void *ptr) +{ + while (!custom_atomic_load_int(&flag_exit)) { + while (!custom_atomic_load_int(&run_fetch_in_thread)) { + if (custom_atomic_load_int(&flag_exit)) return 0; + if (demo_skip_frame) + consume_frame(cap); + this_thread_yield(); + } + int dont_close_stream = 0; // set 1 if your IP-camera periodically turns off and turns on video-stream + if (letter_box) + in_s = get_image_from_stream_letterbox(cap, net.w, net.h, net.c, &in_img, dont_close_stream); + else + in_s = get_image_from_stream_resize(cap, net.w, net.h, net.c, &in_img, dont_close_stream); + if (!in_s.data) { + printf("Stream closed.\n"); + custom_atomic_store_int(&flag_exit, 1); + custom_atomic_store_int(&run_fetch_in_thread, 0); + //exit(EXIT_FAILURE); + return 0; + } + //in_s = resize_image(in, net.w, net.h); + + custom_atomic_store_int(&run_fetch_in_thread, 0); + } + return 0; +} + +void *fetch_in_thread_sync(void *ptr) +{ + custom_atomic_store_int(&run_fetch_in_thread, 1); + while (custom_atomic_load_int(&run_fetch_in_thread)) this_thread_sleep_for(thread_wait_ms); + return 0; +} + +void *detect_in_thread(void *ptr) +{ + while (!custom_atomic_load_int(&flag_exit)) { + while (!custom_atomic_load_int(&run_detect_in_thread)) { + if (custom_atomic_load_int(&flag_exit)) return 0; + this_thread_yield(); + } + + layer l = net.layers[net.n - 1]; + float *X = det_s.data; + //float *prediction = + network_predict(net, X); + + cv_images[demo_index] = det_img; + det_img = cv_images[(demo_index + avg_frames / 2 + 1) % avg_frames]; + demo_index = (demo_index + 1) % avg_frames; + + if (letter_box) + dets = get_network_boxes(&net, get_width_mat(in_img), get_height_mat(in_img), demo_thresh, demo_thresh, 0, 1, &nboxes, 1); // letter box + else + dets = get_network_boxes(&net, net.w, net.h, demo_thresh, demo_thresh, 0, 1, &nboxes, 0); // resized + + //const float nms = .45; + //if (nms) { + // if (l.nms_kind == DEFAULT_NMS) do_nms_sort(dets, nboxes, l.classes, nms); + // else diounms_sort(dets, nboxes, l.classes, nms, l.nms_kind, l.beta_nms); + //} + + custom_atomic_store_int(&run_detect_in_thread, 0); + } + + return 0; +} + +void *detect_in_thread_sync(void *ptr) +{ + custom_atomic_store_int(&run_detect_in_thread, 1); + while (custom_atomic_load_int(&run_detect_in_thread)) this_thread_sleep_for(thread_wait_ms); + return 0; +} + +double get_wall_time() +{ + struct timeval walltime; + if (gettimeofday(&walltime, NULL)) { + return 0; + } + return (double)walltime.tv_sec + (double)walltime.tv_usec * .000001; +} + +void demo(char *cfgfile, char *weightfile, float thresh, float hier_thresh, int cam_index, const char *filename, char **names, int classes, int avgframes, + int frame_skip, char *prefix, char *out_filename, int mjpeg_port, int dontdraw_bbox, int json_port, int dont_show, int ext_output, int letter_box_in, int time_limit_sec, char *http_post_host, + int benchmark, int benchmark_layers) +{ + if (avgframes < 1) avgframes = 1; + avg_frames = avgframes; + letter_box = letter_box_in; + in_img = det_img = show_img = NULL; + //skip = frame_skip; + image **alphabet = load_alphabet(); + int delay = frame_skip; + demo_names = names; + demo_alphabet = alphabet; + demo_classes = classes; + demo_thresh = thresh; + demo_ext_output = ext_output; + demo_json_port = json_port; + printf("Demo\n"); + net = parse_network_cfg_custom(cfgfile, 1, 1); // set batch=1 + if(weightfile){ + load_weights(&net, weightfile); + } + if (net.letter_box) letter_box = 1; + net.benchmark_layers = benchmark_layers; + fuse_conv_batchnorm(net); + calculate_binary_weights(net); + srand(2222222); + + if(filename){ + printf("video file: %s\n", filename); + cap = get_capture_video_stream(filename); + demo_skip_frame = is_live_stream(filename); + }else{ + printf("Webcam index: %d\n", cam_index); + cap = get_capture_webcam(cam_index); + demo_skip_frame = true; + } + + if (!cap) { +#ifdef WIN32 + printf("Check that you have copied file opencv_ffmpeg340_64.dll to the same directory where is darknet.exe \n"); +#endif + error("Couldn't connect to webcam.\n"); + } + + layer l = net.layers[net.n-1]; + int j; + + cv_images = (mat_cv**)xcalloc(avg_frames, sizeof(mat_cv)); + + int i; + for (i = 0; i < net.n; ++i) { + layer lc = net.layers[i]; + if (lc.type == YOLO) { + lc.mean_alpha = 1.0 / avg_frames; + l = lc; + } + } + + if (l.classes != demo_classes) { + printf("\n Parameters don't match: in cfg-file classes=%d, in data-file classes=%d \n", l.classes, demo_classes); + getchar(); + exit(0); + } + + flag_exit = 0; + + custom_thread_t fetch_thread = NULL; + custom_thread_t detect_thread = NULL; + if (custom_create_thread(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); + if (custom_create_thread(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); + + fetch_in_thread_sync(0); //fetch_in_thread(0); + det_img = in_img; + det_s = in_s; + + fetch_in_thread_sync(0); //fetch_in_thread(0); + detect_in_thread_sync(0); //fetch_in_thread(0); + det_img = in_img; + det_s = in_s; + + for (j = 0; j < avg_frames / 2; ++j) { + free_detections(dets, nboxes); + fetch_in_thread_sync(0); //fetch_in_thread(0); + detect_in_thread_sync(0); //fetch_in_thread(0); + det_img = in_img; + det_s = in_s; + } + + int count = 0; + if(!prefix && !dont_show){ + int full_screen = 0; + create_window_cv("Demo", full_screen, 1352, 1013); + } + + + write_cv* output_video_writer = NULL; + if (out_filename && !flag_exit) + { + int src_fps = 25; + src_fps = get_stream_fps_cpp_cv(cap); + output_video_writer = + create_video_writer(out_filename, 'D', 'I', 'V', 'X', src_fps, get_width_mat(det_img), get_height_mat(det_img), 1); + + //'H', '2', '6', '4' + //'D', 'I', 'V', 'X' + //'M', 'J', 'P', 'G' + //'M', 'P', '4', 'V' + //'M', 'P', '4', '2' + //'X', 'V', 'I', 'D' + //'W', 'M', 'V', '2' + } + + int send_http_post_once = 0; + const double start_time_lim = get_time_point(); + double before = get_time_point(); + double start_time = get_time_point(); + float avg_fps = 0; + int frame_counter = 0; + int global_frame_counter = 0; + + while(1){ + ++count; + { + const float nms = .45; // 0.4F + int local_nboxes = nboxes; + detection *local_dets = dets; + this_thread_yield(); + + if (!benchmark) custom_atomic_store_int(&run_fetch_in_thread, 1); // if (custom_create_thread(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); + custom_atomic_store_int(&run_detect_in_thread, 1); // if (custom_create_thread(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed"); + + //if (nms) do_nms_obj(local_dets, local_nboxes, l.classes, nms); // bad results + if (nms) { + if (l.nms_kind == DEFAULT_NMS) do_nms_sort(local_dets, local_nboxes, l.classes, nms); + else diounms_sort(local_dets, local_nboxes, l.classes, nms, l.nms_kind, l.beta_nms); + } + + if (l.embedding_size) set_track_id(local_dets, local_nboxes, demo_thresh, l.sim_thresh, l.track_ciou_norm, l.track_history_size, l.dets_for_track, l.dets_for_show); + + //printf("\033[2J"); + //printf("\033[1;1H"); + //printf("\nFPS:%.1f\n", fps); + printf("Objects:\n\n"); + + ++frame_id; + if (demo_json_port > 0) { + int timeout = 400000; + send_json(local_dets, local_nboxes, l.classes, demo_names, frame_id, demo_json_port, timeout); + } + + //char *http_post_server = "webhook.site/898bbd9b-0ddd-49cf-b81d-1f56be98d870"; + if (http_post_host && !send_http_post_once) { + int timeout = 3; // 3 seconds + int http_post_port = 80; // 443 https, 80 http + if (send_http_post_request(http_post_host, http_post_port, filename, + local_dets, nboxes, classes, names, frame_id, ext_output, timeout)) + { + if (time_limit_sec > 0) send_http_post_once = 1; + } + } + + if (!benchmark && !dontdraw_bbox) draw_detections_cv_v3(show_img, local_dets, local_nboxes, demo_thresh, demo_names, demo_alphabet, demo_classes, demo_ext_output); + free_detections(local_dets, local_nboxes); + + printf("\nFPS:%.1f \t AVG_FPS:%.1f\n", fps, avg_fps); + + if(!prefix){ + if (!dont_show) { + const int each_frame = max_val_cmp(1, avg_fps / 60); + if(global_frame_counter % each_frame == 0) show_image_mat(show_img, "Demo"); + int c = wait_key_cv(1); + if (c == 10) { + if (frame_skip == 0) frame_skip = 60; + else if (frame_skip == 4) frame_skip = 0; + else if (frame_skip == 60) frame_skip = 4; + else frame_skip = 0; + } + else if (c == 27 || c == 1048603) // ESC - exit (OpenCV 2.x / 3.x) + { + flag_exit = 1; + } + } + }else{ + char buff[256]; + sprintf(buff, "%s_%08d.jpg", prefix, count); + if(show_img) save_cv_jpg(show_img, buff); + } + + // if you run it with param -mjpeg_port 8090 then open URL in your web-browser: http://localhost:8090 + if (mjpeg_port > 0 && show_img) { + int port = mjpeg_port; + int timeout = 400000; + int jpeg_quality = 40; // 1 - 100 + send_mjpeg(show_img, port, timeout, jpeg_quality); + } + + // save video file + if (output_video_writer && show_img) { + write_frame_cv(output_video_writer, show_img); + printf("\n cvWriteFrame \n"); + } + + while (custom_atomic_load_int(&run_detect_in_thread)) { + if(avg_fps > 180) this_thread_yield(); + else this_thread_sleep_for(thread_wait_ms); // custom_join(detect_thread, 0); + } + if (!benchmark) { + while (custom_atomic_load_int(&run_fetch_in_thread)) { + if (avg_fps > 180) this_thread_yield(); + else this_thread_sleep_for(thread_wait_ms); // custom_join(fetch_thread, 0); + } + free_image(det_s); + } + + if (time_limit_sec > 0 && (get_time_point() - start_time_lim)/1000000 > time_limit_sec) { + printf(" start_time_lim = %f, get_time_point() = %f, time spent = %f \n", start_time_lim, get_time_point(), get_time_point() - start_time_lim); + break; + } + + if (flag_exit == 1) break; + + if(delay == 0){ + if(!benchmark) release_mat(&show_img); + show_img = det_img; + } + det_img = in_img; + det_s = in_s; + } + --delay; + if(delay < 0){ + delay = frame_skip; + + //double after = get_wall_time(); + //float curr = 1./(after - before); + double after = get_time_point(); // more accurate time measurements + float curr = 1000000. / (after - before); + fps = fps*0.9 + curr*0.1; + before = after; + + float spent_time = (get_time_point() - start_time) / 1000000; + frame_counter++; + global_frame_counter++; + if (spent_time >= 3.0f) { + //printf(" spent_time = %f \n", spent_time); + avg_fps = frame_counter / spent_time; + frame_counter = 0; + start_time = get_time_point(); + } + } + } + printf("input video stream closed. \n"); + if (output_video_writer) { + release_video_writer(&output_video_writer); + printf("output_video_writer closed. \n"); + } + + this_thread_sleep_for(thread_wait_ms); + + custom_join(detect_thread, 0); + custom_join(fetch_thread, 0); + + // free memory + free_image(in_s); + free_detections(dets, nboxes); + + demo_index = (avg_frames + demo_index - 1) % avg_frames; + for (j = 0; j < avg_frames; ++j) { + release_mat(&cv_images[j]); + } + free(cv_images); + + free_ptrs((void **)names, net.layers[net.n - 1].classes); + + const int nsize = 8; + for (j = 0; j < nsize; ++j) { + for (i = 32; i < 127; ++i) { + free_image(alphabet[j][i]); + } + free(alphabet[j]); + } + free(alphabet); + free_network(net); + //cudaProfilerStop(); +} +#else +void demo(char *cfgfile, char *weightfile, float thresh, float hier_thresh, int cam_index, const char *filename, char **names, int classes, int avgframes, + int frame_skip, char *prefix, char *out_filename, int mjpeg_port, int dontdraw_bbox, int json_port, int dont_show, int ext_output, int letter_box_in, int time_limit_sec, char *http_post_host, + int benchmark, int benchmark_layers) +{ + fprintf(stderr, "Demo needs OpenCV for webcam images.\n"); +} +#endif -- Gitblit v1.8.0