src/*.o
*.o
.sconsign.dblite
+*.pyc
env.ParseConfig("pkg-config --libs opencv log4cpp")
env.ParseConfig("python-config --cflags --libs")
env.Append(LIBS = ['pthread', 'boost_python'])
+env['CCFLAGS'].remove('-Wstrict-prototypes') # invalid in C++
env.Append(LIBPATH=['#.'])
const static long int MaxCost = 100000;
const static int MaxPatch = 5;
void similarity(const Patch& p1, const Patch& p2);
+ //double distance()
private:
#include "Detector.h"
#include "Metrics.h"
#include "SharedPtr.h"
+#include "PredictorWrapper.h"
#include <opencv2/opencv.hpp>
namespace suanzi {
MetricsPtr metrics;
std::vector<TrackerPtr> trackers;
int max_id = 0;
- void addTracker(TrackerPtr t);
- TrackerPtr createTracker(int id = 0);
+ //void addTracker(TrackerPtr t);
+ //TrackerPtr createTracker(int id = 0);
void removeTracker(TrackerPtr t);
void correctTrackers(MetricsPtr m, cv::Mat& image);
void initNewTrackers(cv::Mat& iamge);
+ PredictorWrapperPtr predictor;
+
};
public:
static PredictorWrapperPtr create(const std::string& fname);
~PredictorWrapper(){}
- void dump() { this->dump_func(); }
- void predict() { this->predict_func();}
+ void dump();
+ double predict();
private:
PredictorWrapper(const std::string& fname);
class Tracker
{
public:
- Tracker(int id);
+ Tracker(const cv::Mat& image, int id = 0);
virtual ~Tracker();
void updateState(const cv::Mat& image);
- void addPatch(Patch* p);
+// void addPatch(Patch* p);
TrackerStatus status;
private:
int id;
int age;
int last_active;
- std::vector<Patch *> patches;
+ std::vector<Patch> patches;
cv::KalmanFilter kf = {4,2};
};
e->setVideoSrc(VideoSrcType::URL, "rtsp://192.168.1.75:554/stream1");
e->start();
e->destroy();
-
log4cpp::Category::shutdown();
}
def dump():
global predictors
+ ss = '\n'
for i in predictors:
- print i
- print i.coef_
+ ss += str(i.__dict__)
+ ss += '\n'
+# ss += str(i.coef_)
+# ss += '\n'
+ return ss
def predict(index, features):
using namespace suanzi;
-const static std::string TAG = "Engine";
+static const std::string TAG = "Engine";
static std::mutex g_mutex;
static EngineWPtr g_instance;
Engine::~Engine()
{
+ destroy();
}
void Engine::destroy()
{
+ LOG_DEBUG(TAG, "destroy");
+ detector.reset();
+ multiTracker.reset();
+ reader.reset();
+ observer_list.clear();
}
void Engine::setVideoSrc(VideoSrcType type, const std::string& url)
{
- PredictorWrapperPtr pp = PredictorWrapper::create("./python/model.pkl");
-
- pp->dump();
-
-// videoSrc = url;
- //reader = VideoReaderFactory::createVideoReader(type, url);
-
+ reader = VideoReaderFactory::createVideoReader(type, url);
}
void Engine::run()
#include "Metrics.h"
#include <algorithm>
#include "hungarian.h"
+#include "Logger.h"
using namespace suanzi;
using namespace cv;
using namespace Eigen;
+static const std::string TAG = "MultiTracker";
MultiTracker::MultiTracker(MetricsPtr m) : metrics(m)
{
+ LOG_DEBUG(TAG, "init - load model.pkl");
+ predictor = PredictorWrapper::create("./python/model.pkl");
+ predictor->dump();
}
{
trackers.clear();
}
-
-TrackerPtr MultiTracker::createTracker(int id)
-{
- TrackerPtr t (new Tracker(id));
- addTracker(t);
- return t;
-}
-
-void MultiTracker::addTracker(TrackerPtr t)
-{
- trackers.push_back(t);
-}
-
+//
+//TrackerPtr MultiTracker::createTracker(int id)
+//{
+// TrackerPtr t (new Tracker(id));
+// addTracker(t);
+// return t;
+//}
+//
+//void MultiTracker::addTracker(TrackerPtr t)
+//{
+// trackers.push_back(t);
+//}
+//
void MultiTracker::removeTracker(TrackerPtr t)
{
// trackers.erase(t);
#define MaxCost 100000
+static double distance(TrackerPtr t, const cv::Mat& image, const Detection& d)
+{
+ return 0.1;
+}
+
void MultiTracker::update(unsigned int total, const Detection* detections, const Mat& image)
{
// correct_trackers
MatrixXi cost_matrix = MatrixXi::Zero(row, col);
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
- TrackerPtr tracker = trackers[i];
- Detection det = detections[j];
-
- int cost = MaxCost;
-
// TODO
- cost_matrix(i, j) = cost;
+ // int cost = MaxCost;
+ cost_matrix(i, j) = distance(trackers[i], image, detections[j]);
}
}
VectorXi tracker_inds, bb_inds;
linear_sum_assignment(cost_matrix, tracker_inds, bb_inds);
- // handle the result
+ // handle unmatched trackers
vector<TrackerPtr> unmatched_trackers;
- vector<Detection> unmatched_detection;
for (int i = 0; i < row; i++){
if (!(tracker_inds.array() == i).any()){
unmatched_trackers.push_back(trackers[i]);
}
}
+ for (auto t : unmatched_trackers){
+ t->updateState(image);
+ }
+
+
+ // handle unmatched detections
+ vector<int> unmatched_detection;
for(int j = 0; j < col; j++){
if (!(bb_inds.array() == j).any()){
- unmatched_detection.push_back(detections[j]);
+ unmatched_detection.push_back(j);
}
}
-
-
// create new trackers for new detections
+ for (auto i : unmatched_detection){
+ TrackerPtr t (new Tracker(image));
+ this->trackers.push_back(t);
+ }
}
#include "PredictorWrapper.h"
#include <string>
+#include "Logger.h"
#include <iostream>
+#include <thread>
namespace py = boost::python;
PredictorWrapperWPtr PredictorWrapper::instance;
const static std::string PREDICTOR_PY_DIR = "./python";
+const static std::string TAG = "PredictorWrapper";
static std::string parse_python_exception();
PredictorWrapperPtr PredictorWrapper::create(const std::string& fname)
{
- //if (instance == nullptr){
if (instance.lock()){
- //instance = new PredictorWrapper(fname);
return PredictorWrapperPtr();
}
PredictorWrapperPtr ins (new PredictorWrapper(fname));
return ins;
}
+void PredictorWrapper::dump()
+{
+ LOG_DEBUG(TAG, "dump");
+ std::string ss = "";
+ try{
+ py::object ret = this->dump_func();
+ ss = py::extract<std::string>(ret);
+ } catch (boost::python::error_already_set const &){
+ std::string perror_str = parse_python_exception();
+ LOG_ERROR(TAG, "Error in Python: " + perror_str)
+ }
+ LOG_DEBUG(TAG, ss);
+}
+
+double PredictorWrapper::predict()
+{
+ LOG_DEBUG(TAG, "predict");
+ try{
+ this->predict_func();
+ } catch (boost::python::error_already_set const &){
+ std::string perror_str = parse_python_exception();
+ LOG_ERROR(TAG, "Error in Python: " + perror_str)
+ }
+ return 0.1;
+}
+
PredictorWrapper::PredictorWrapper(const std::string& fname)
{
Py_Initialize();
py::exec("import sys", main_namespace);
std::string cmd = "sys.path.insert(0, '" + PREDICTOR_PY_DIR + "')";
py::exec(cmd.c_str(), main_namespace);
- //py::exec("sys.path.insert(0, '/home/debian/project/tracker/python')", main_namespace);
- //py::exec("sys.path.insert(0, './python')", main_namespace);
+ py::exec("import signal", main_namespace);
+ py::exec("signal.signal(signal.SIGINT, signal.SIG_DFL)", main_namespace);
py::object predictor_mod = py::import("predictor");
py::object predictor_init = predictor_mod.attr("init");
dump_func = predictor_mod.attr("dump");
predict_func = predictor_mod.attr("predict");
-
predictor_init(fname.c_str());
- //predictor_dump();
- //py::exec("import predictor", main_namespace);
} catch (boost::python::error_already_set const &){
std::string perror_str = parse_python_exception();
- std::cout << "Error in Python: " << perror_str << std::endl;
+ LOG_ERROR(TAG, "Error in Python: " + perror_str)
}
}
static const int MaxLost = 5;
-Tracker::Tracker(int id) : id(id)
+Tracker::Tracker(const cv::Mat& image,int id) : id(id)
{
status = TrackerStatus::Fire;
preStatus = TrackerStatus::Fire;
{
}
-void Tracker::addPatch(Patch* p)
-{
- patches.push_back(p);
- if (patches.size() > Metrics::MaxPatch){
- patches.erase(patches.end());
- }
-}
-
+//void Tracker::addPatch(Patch* p)
+//{
+// patches.push_back(p);
+// if (patches.size() > Metrics::MaxPatch){
+// patches.erase(patches.end());
+// }
+//}
+//
void Tracker::updateState(const Mat& image)
{
preStatus = this->status;