Detection and Tracking work well

This commit is contained in:
AlexeyAB
2018-01-08 01:47:50 +03:00
parent 0cb81e5f50
commit aeb15b3cb9
5 changed files with 13 additions and 10 deletions

View File

@ -64,6 +64,7 @@ typedef struct network{
#ifdef GPU #ifdef GPU
float **input_gpu; float **input_gpu;
float **truth_gpu; float **truth_gpu;
int wait_stream;
#endif #endif
} network; } network;

View File

@ -51,7 +51,8 @@ void forward_network_gpu(network net, network_state state)
fill_ongpu(l.outputs * l.batch, 0, l.delta_gpu, 1); fill_ongpu(l.outputs * l.batch, 0, l.delta_gpu, 1);
} }
l.forward_gpu(l, state); l.forward_gpu(l, state);
cudaStreamSynchronize(get_cuda_stream()); if(net.wait_stream)
cudaStreamSynchronize(get_cuda_stream());
state.input = l.output_gpu; state.input = l.output_gpu;
} }
} }

View File

@ -11,10 +11,10 @@
#ifdef _WIN32 #ifdef _WIN32
#define OPENCV #define OPENCV
#include "windows.h" //#include "windows.h"
#endif #endif
#define TRACK_OPTFLOW //#define TRACK_OPTFLOW
#include "yolo_v2_class.hpp" // imported functions from DLL #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; bool const save_output_videofile = false;
#ifdef TRACK_OPTFLOW #ifdef TRACK_OPTFLOW
Tracker_optflow tracker_flow; Tracker_optflow tracker_flow;
detector.wait_stream = true;
#endif #endif
while (true) while (true)
@ -185,17 +186,15 @@ int main(int argc, char *argv[])
auto current_image = det_image; auto current_image = det_image;
consumed = true; consumed = true;
while (current_image.use_count() > 0) { while (current_image.use_count() > 0) {
//std::vector<bbox_t> result;
auto result = detector.detect_resized(*current_image, frame_size, 0.24, false); // true auto result = detector.detect_resized(*current_image, frame_size, 0.24, false); // true
//Sleep(200);
//Sleep(50);
++fps_det_counter; ++fps_det_counter;
std::unique_lock<std::mutex> lock(mtx); std::unique_lock<std::mutex> lock(mtx);
thread_result_vec = result; thread_result_vec = result;
current_image = det_image; current_image = det_image;
consumed = true; consumed = true;
cv_detected.notify_all(); 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 result_vec = tracker_flow.tracking_flow(cur_frame, result_vec); // track optical flow
#endif #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); //show_console_result(result_vec, obj_names);
if (output_video.isOpened() && videowrite_ready) { if (output_video.isOpened() && videowrite_ready) {

View File

@ -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) 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; int old_gpu_index;
#ifdef GPU #ifdef GPU
cudaGetDevice(&old_gpu_index); cudaGetDevice(&old_gpu_index);
@ -172,7 +173,6 @@ YOLODLL_API void Detector::free_image(image_t m)
YOLODLL_API std::vector<bbox_t> Detector::detect(image_t img, float thresh, bool use_mean) 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()); detector_gpu_t &detector_gpu = *reinterpret_cast<detector_gpu_t *>(detector_gpu_ptr.get());
network &net = detector_gpu.net; network &net = detector_gpu.net;
int old_gpu_index; int old_gpu_index;
@ -184,6 +184,7 @@ YOLODLL_API std::vector<bbox_t> Detector::detect(image_t img, float thresh, bool
//std::cout << "net.gpu_index = " << net.gpu_index << std::endl; //std::cout << "net.gpu_index = " << net.gpu_index << std::endl;
//float nms = .4; //float nms = .4;
net.wait_stream = wait_stream; // 1 - wait CUDA-stream, 0 - not to wait
image im; image im;
im.c = img.c; im.c = img.c;

View File

@ -50,6 +50,7 @@ class Detector {
const int cur_gpu_id; const int cur_gpu_id;
public: public:
float nms = .4; float nms = .4;
bool wait_stream;
YOLODLL_API Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0); YOLODLL_API Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
YOLODLL_API ~Detector(); YOLODLL_API ~Detector();
@ -172,7 +173,7 @@ public:
sync_PyrLKOpticalFlow_gpu = cv::cuda::SparsePyrLKOpticalFlow::create(); sync_PyrLKOpticalFlow_gpu = cv::cuda::SparsePyrLKOpticalFlow::create();
sync_PyrLKOpticalFlow_gpu->setWinSize(cv::Size(21, 21)); // 15, 21, 31 sync_PyrLKOpticalFlow_gpu->setWinSize(cv::Size(21, 21)); // 15, 21, 31
sync_PyrLKOpticalFlow_gpu->setMaxLevel(3); // +- 5 ptx 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); cv::cuda::setDevice(old_gpu_id);
} }