Fix nan issue in features
[trackerpp.git] / src / MultiTracker.cpp
index bbfc6f3..199d9f7 100644 (file)
@@ -1,9 +1,10 @@
 #include "MultiTracker.h"
-#include "Metrics.h"
 #include <algorithm>
 #include "hungarian.h"
 #include "Logger.h"
 #include "Utils.h"
+#include <cstdlib>
+#include <stdexcept>
 
 using namespace suanzi;
 using namespace cv;
@@ -13,6 +14,7 @@ static const std::string TAG = "MultiTracker";
 static const cv::Size PREFERRED_SIZE = Size(64, 128);
 static const double MaxCost  = 100000;
 static const double ProbThreshold = 0.05;
+static const int MaxTrackers  = 100;
 
 MultiTracker::MultiTracker(EngineWPtr e)
 : engine(e)
@@ -37,7 +39,9 @@ static std::vector<double> 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<double>(0, 0));
     cv::matchTemplate(im1, im2, result, CV_TM_CCORR_NORMED);
@@ -61,6 +65,14 @@ static std::vector<double> 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,7 +86,7 @@ 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(Tracker::MaxPatch - 1, features); // TODO why is MaxPatch-1
+    double prob = predictor->predict(tracker->patches.size() - 1, features); // TODO why is MaxPatch-1
     if (prob > ProbThreshold)
         return -log(prob);
     else 
@@ -150,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);
     }
@@ -212,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();
+    }
+}