From aeb15b3cb9157f5d0b2a9962e17de22560b8a1b2 Mon Sep 17 00:00:00 2001 From: AlexeyAB Date: Mon, 8 Jan 2018 01:47:50 +0300 Subject: [PATCH] Detection and Tracking work well --- src/network.h | 1 + src/network_kernels.cu | 3 ++- src/yolo_console_dll.cpp | 13 ++++++------- src/yolo_v2_class.cpp | 3 ++- src/yolo_v2_class.hpp | 3 ++- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/network.h b/src/network.h index 49a2af23..6f4123ab 100644 --- a/src/network.h +++ b/src/network.h @@ -64,6 +64,7 @@ typedef struct network{ #ifdef GPU float **input_gpu; float **truth_gpu; + int wait_stream; #endif } network; diff --git a/src/network_kernels.cu b/src/network_kernels.cu index 341c7f8f..9ecabdf3 100644 --- a/src/network_kernels.cu +++ b/src/network_kernels.cu @@ -51,7 +51,8 @@ void forward_network_gpu(network net, network_state state) fill_ongpu(l.outputs * l.batch, 0, l.delta_gpu, 1); } l.forward_gpu(l, state); - cudaStreamSynchronize(get_cuda_stream()); + if(net.wait_stream) + cudaStreamSynchronize(get_cuda_stream()); state.input = l.output_gpu; } } diff --git a/src/yolo_console_dll.cpp b/src/yolo_console_dll.cpp index abf4bdc8..3f22eb55 100644 --- a/src/yolo_console_dll.cpp +++ b/src/yolo_console_dll.cpp @@ -11,10 +11,10 @@ #ifdef _WIN32 #define OPENCV -#include "windows.h" +//#include "windows.h" #endif -#define TRACK_OPTFLOW +//#define TRACK_OPTFLOW #include "yolo_v2_class.hpp" // imported functions from DLL @@ -102,6 +102,7 @@ int main(int argc, char *argv[]) bool const save_output_videofile = false; #ifdef TRACK_OPTFLOW Tracker_optflow tracker_flow; + detector.wait_stream = true; #endif while (true) @@ -185,17 +186,15 @@ int main(int argc, char *argv[]) auto current_image = det_image; consumed = true; while (current_image.use_count() > 0) { - //std::vector result; auto result = detector.detect_resized(*current_image, frame_size, 0.24, false); // true - //Sleep(200); - //Sleep(50); ++fps_det_counter; std::unique_lock lock(mtx); thread_result_vec = result; current_image = det_image; consumed = true; cv_detected.notify_all(); - while (consumed) cv_pre_tracked.wait(lock); + if(detector.wait_stream) + while (consumed) cv_pre_tracked.wait(lock); } }); } @@ -216,7 +215,7 @@ int main(int argc, char *argv[]) result_vec = tracker_flow.tracking_flow(cur_frame, result_vec); // track optical flow #endif - draw_boxes(cur_frame, result_vec, obj_names, 3, current_det_fps, current_cap_fps); + draw_boxes(cur_frame, result_vec, obj_names, 3, current_det_fps, current_cap_fps); // 3 or 16ms //show_console_result(result_vec, obj_names); if (output_video.isOpened() && videowrite_ready) { diff --git a/src/yolo_v2_class.cpp b/src/yolo_v2_class.cpp index 88d2bc12..f509d21d 100644 --- a/src/yolo_v2_class.cpp +++ b/src/yolo_v2_class.cpp @@ -36,6 +36,7 @@ struct detector_gpu_t{ YOLODLL_API Detector::Detector(std::string cfg_filename, std::string weight_filename, int gpu_id) : cur_gpu_id(gpu_id) { + wait_stream = 0; int old_gpu_index; #ifdef GPU cudaGetDevice(&old_gpu_index); @@ -172,7 +173,6 @@ YOLODLL_API void Detector::free_image(image_t m) YOLODLL_API std::vector Detector::detect(image_t img, float thresh, bool use_mean) { - detector_gpu_t &detector_gpu = *reinterpret_cast(detector_gpu_ptr.get()); network &net = detector_gpu.net; int old_gpu_index; @@ -184,6 +184,7 @@ YOLODLL_API std::vector Detector::detect(image_t img, float thresh, bool //std::cout << "net.gpu_index = " << net.gpu_index << std::endl; //float nms = .4; + net.wait_stream = wait_stream; // 1 - wait CUDA-stream, 0 - not to wait image im; im.c = img.c; diff --git a/src/yolo_v2_class.hpp b/src/yolo_v2_class.hpp index 392b71ae..5afb22fe 100644 --- a/src/yolo_v2_class.hpp +++ b/src/yolo_v2_class.hpp @@ -50,6 +50,7 @@ class Detector { const int cur_gpu_id; public: float nms = .4; + bool wait_stream; YOLODLL_API Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0); YOLODLL_API ~Detector(); @@ -172,7 +173,7 @@ public: sync_PyrLKOpticalFlow_gpu = cv::cuda::SparsePyrLKOpticalFlow::create(); sync_PyrLKOpticalFlow_gpu->setWinSize(cv::Size(21, 21)); // 15, 21, 31 sync_PyrLKOpticalFlow_gpu->setMaxLevel(3); // +- 5 ptx - sync_PyrLKOpticalFlow_gpu->setNumIters(1000); // def: 30 + sync_PyrLKOpticalFlow_gpu->setNumIters(2000); // def: 30 cv::cuda::setDevice(old_gpu_id); }