From aeb15b3cb9157f5d0b2a9962e17de22560b8a1b2 Mon Sep 17 00:00:00 2001
From: AlexeyAB <alexeyab84@gmail.com>
Date: Sun, 07 Jan 2018 22:47:50 +0000
Subject: [PATCH] Detection and Tracking work well

---
 src/network.h            |    1 +
 src/yolo_v2_class.cpp    |    3 ++-
 src/network_kernels.cu   |    3 ++-
 src/yolo_console_dll.cpp |   13 ++++++-------
 src/yolo_v2_class.hpp    |    3 ++-
 5 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/network.h b/src/network.h
index 49a2af2..6f4123a 100644
--- a/src/network.h
+++ b/src/network.h
@@ -64,6 +64,7 @@
     #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 341c7f8..9ecabdf 100644
--- a/src/network_kernels.cu
+++ b/src/network_kernels.cu
@@ -51,7 +51,8 @@
             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 abf4bdc..3f22eb5 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 @@
 	bool const save_output_videofile = false;
 #ifdef TRACK_OPTFLOW
 	Tracker_optflow tracker_flow;
+	detector.wait_stream = true;
 #endif
 
 	while (true) 
@@ -185,17 +186,15 @@
 							auto current_image = det_image;
 							consumed = true;
 							while (current_image.use_count() > 0) {
-								//std::vector<bbox_t> result;
 								auto result = detector.detect_resized(*current_image, frame_size, 0.24, false);	// true
-								//Sleep(200);
-								//Sleep(50);
 								++fps_det_counter;
 								std::unique_lock<std::mutex> 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 @@
 						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 88d2bc1..f509d21 100644
--- a/src/yolo_v2_class.cpp
+++ b/src/yolo_v2_class.cpp
@@ -36,6 +36,7 @@
 
 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 std::vector<bbox_t> Detector::detect(image_t img, float thresh, bool use_mean)
 {
-
 	detector_gpu_t &detector_gpu = *reinterpret_cast<detector_gpu_t *>(detector_gpu_ptr.get());
 	network &net = detector_gpu.net;
 	int old_gpu_index;
@@ -184,6 +184,7 @@
 	//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 392b71a..5afb22f 100644
--- a/src/yolo_v2_class.hpp
+++ b/src/yolo_v2_class.hpp
@@ -50,6 +50,7 @@
 	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 @@
 		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);
 	}

--
Gitblit v1.10.0