Detection and Tracking work well
| | |
| | | #ifdef GPU |
| | | float **input_gpu; |
| | | float **truth_gpu; |
| | | int wait_stream; |
| | | #endif |
| | | } network; |
| | | |
| | |
| | | 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; |
| | | } |
| | | } |
| | |
| | | |
| | | #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 |
| | | |
| | |
| | | bool const save_output_videofile = false; |
| | | #ifdef TRACK_OPTFLOW |
| | | Tracker_optflow tracker_flow; |
| | | detector.wait_stream = true; |
| | | #endif |
| | | |
| | | while (true) |
| | |
| | | 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); |
| | | } |
| | | }); |
| | | } |
| | |
| | | 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) { |
| | |
| | | |
| | | 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); |
| | |
| | | |
| | | 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; |
| | |
| | | //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; |
| | |
| | | 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(); |
| | |
| | | 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); |
| | | } |