Alexey
2017-04-23 a87abe8de58427f842b371c0169b4c41dc1cb6f1
src/yolo_v2_class.hpp
@@ -1,6 +1,8 @@
#pragma once
#include <memory>
#include <vector>
#include <deque>
#include <algorithm>
#ifdef OPENCV
#include <opencv2/opencv.hpp>       // C++
@@ -15,34 +17,41 @@
#endif
struct bbox_t {
   float x, y, w, h;
   float prob;
   unsigned int obj_id;
   unsigned int x, y, w, h;   // (x,y) - top-left corner, (w, h) - width & height of bounded box
   float prob;             // confidence - probability that the object was found correctly
   unsigned int obj_id;    // class of object - from range [0, classes-1]
   unsigned int track_id;     // tracking id for video (0 - untracked, 1 - inf - tracked object)
};
typedef struct {
   int h;
   int w;
   int c;
   float *data;
} image_t;
struct image_t {
   int h;                  // height
   int w;                  // width
   int c;                  // number of chanels (3 - for RGB)
   float *data;            // pointer to the image data
};
class Detector {
   std::shared_ptr<void> detector_gpu_ptr;
public:
   float nms = .4;
   YOLODLL_API Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
   YOLODLL_API ~Detector();
   YOLODLL_API std::vector<bbox_t> detect(std::string image_filename, float thresh = 0.2);
   YOLODLL_API std::vector<bbox_t> detect(image_t img, float thresh = 0.2);
   static YOLODLL_API image_t load_image(std::string image_filename);
   static YOLODLL_API void free_image(image_t m);
   YOLODLL_API std::vector<bbox_t> tracking(std::vector<bbox_t> cur_bbox_vec, int const frames_story = 4);
#ifdef OPENCV
   std::vector<bbox_t> detect(cv::Mat mat, float thresh = 0.2) {
      std::shared_ptr<image_t> image_ptr(new image_t, [](image_t *img) { free_image(*img); } );
   std::vector<bbox_t> detect(cv::Mat mat, float thresh = 0.2)
   {
      if(mat.data == NULL)
         throw std::runtime_error("file not found");
      std::shared_ptr<image_t> image_ptr(new image_t, [](image_t *img) { free_image(*img); delete img; });
      *image_ptr = mat_to_image(mat);
      return detect(*image_ptr, thresh);
   }
@@ -103,13 +112,9 @@
      }
   }
   static void free_image(image_t m)
   {
      if (m.data) {
         free(m.data);
      }
   }
#endif   // OPENCV
   std::deque<std::vector<bbox_t>> prev_bbox_vec_deque;
};