X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;ds=inline;f=src%2FMultiTracker.cpp;h=199d9f7d97774104ecc6b224e272ed32f700e78f;hb=HEAD;hp=aef5e2e9f854d578044c5999f96e70c877d52f53;hpb=a80807eb35cc0ff70a9afdd6b7db2f38cb686683;p=trackerpp.git diff --git a/src/MultiTracker.cpp b/src/MultiTracker.cpp index aef5e2e..199d9f7 100644 --- a/src/MultiTracker.cpp +++ b/src/MultiTracker.cpp @@ -1,9 +1,10 @@ #include "MultiTracker.h" -#include "Metrics.h" #include #include "hungarian.h" #include "Logger.h" #include "Utils.h" +#include +#include using namespace suanzi; using namespace cv; @@ -11,15 +12,16 @@ using namespace std; static const std::string TAG = "MultiTracker"; static const cv::Size PREFERRED_SIZE = Size(64, 128); - static const double MaxCost = 100000; -static const int MaxPatch = 5; +static const double ProbThreshold = 0.05; +static const int MaxTrackers = 100; MultiTracker::MultiTracker(EngineWPtr e) : engine(e) { LOG_DEBUG(TAG, "init - loading model.pkl"); - predictor = PredictorWrapper::create("./python", "./python/model.pkl"); + predictor = PredictorWrapperPtr(new PredictorWrapper()); + predictor->load("./resources/model.pkl"); predictor->dump(); this->descriptor = {Size(64, 128), Size(16, 16), Size(8, 8), Size(8, 8), 9}; } @@ -37,7 +39,9 @@ static std::vector similarity(const PatchPtr p1, const PatchPtr p2) cv::Mat im2(PREFERRED_SIZE, p2->image_crop.type()); cv::resize(p1->image_crop, im1, im1.size()); cv::resize(p2->image_crop, im2, im2.size()); - cv::Mat result; + + cv::Mat result = Mat::zeros(1,1, CV_64F); + cv::matchTemplate(im1, im2, result, CV_TM_CCOEFF_NORMED); feature.push_back(result.at(0, 0)); cv::matchTemplate(im1, im2, result, CV_TM_CCORR_NORMED); @@ -61,6 +65,14 @@ static std::vector similarity(const PatchPtr p1, const PatchPtr p2) feature.push_back(calc_iou_ratio(getRectInDetection(d1), getRectInDetection(d2))); +// for (auto i : feature){ +// cout << i << "\t"; +// if (isnan(i)){ +// throw overflow_error("Nan in feature"); +// } +// } +// cout << endl; +// return feature; } @@ -74,8 +86,11 @@ double MultiTracker::distance(TrackerPtr tracker, const cv::Mat& image, const De ss = similarity(i, patch); features.insert(features.end(), ss.begin(), ss.end()); } - double prob = predictor->predict(4, features); - return prob; + double prob = predictor->predict(tracker->patches.size() - 1, features); // TODO why is MaxPatch-1 + if (prob > ProbThreshold) + return -log(prob); + else + return MaxCost; } static float calc_iou_ratio(const Detection& d1, const Detection& d2) @@ -85,6 +100,12 @@ static float calc_iou_ratio(const Detection& d1, const Detection& d2) void MultiTracker::update(unsigned int total, const Detection* detections, const Mat& image) { + // predict trackers, update trackers using kalman filter + for (auto t : trackers){ + t->predict(); + } + + // match the trackers with the detections using linear sum assignment (hungarian) int row = trackers.size(); int col = total; Eigen::MatrixXi cost_matrix = Eigen::MatrixXi::Zero(row, col); @@ -141,7 +162,7 @@ void MultiTracker::update(unsigned int total, const Detection* detections, const for (auto i : unmatch_bbs_indices){ TrackerPtr new_tracker (new Tracker(image, detections[i])); new_tracker->addPatch(createPatch(image, detections[i])); - this->trackers.push_back(new_tracker); + addTracker(new_tracker); Person test; // TODO inPersons.push_back(test); } @@ -203,3 +224,12 @@ PatchPtr MultiTracker::createPatch(const Mat& image, const Detection& detect) patch->features = std::make_pair(feature_hog_double, hist); return patch; } + +void MultiTracker::addTracker(TrackerPtr t) +{ + trackers.insert(trackers.begin(), t); + if(trackers.size() > MaxTrackers){ + LOG_ERROR(TAG, "trackers reaches the maximum " + to_string(MaxTrackers)); + trackers.pop_back(); + } +}