Detector();
virtual ~Detector();
// TODO
- unsigned int detect(const cv::Mat& frame, Detection* detections){return 1;}
+ unsigned int detect(const cv::Mat& frame, Detection* detections){return 0;}
};
struct Detection
TK_DECLARE_PTR(Metrics);
//TK_DECLARE_PTR(Patch);
- struct Patch;
+// struct Patch;
class Metrics
{
public:
~Metrics(){}
const static long int MaxCost = 100000;
const static int MaxPatch = 5;
- void similarity(const Patch& p1, const Patch& p2);
//double distance()
-
-
private:
cv::HOGDescriptor descriptor = {cv::Size(64, 128), cv::Size(16, 16), cv::Size(8, 8), cv::Size(8, 8), 9};
};
- struct Patch
- {
- // bb_ltrb
-
- //
- // image_crop
- cv::Mat image_crop;
- //
- // features
-
- };
-
+// struct Patch
+// {
+// // bb_ltrb
+// //
+// // image_crop
+// cv::Mat image_crop;
+// //
+// // features
+// };
}
#endif /* _METRICS_H_ */
#include "Tracker.h"
#include "Detector.h"
-#include "Metrics.h"
#include "SharedPtr.h"
#include "PredictorWrapper.h"
#include <opencv2/opencv.hpp>
namespace suanzi {
+ TK_DECLARE_PTR(Patch);
TK_DECLARE_PTR(MultiTracker);
+ TK_DECLARE_PTR(Tracker);
class MultiTracker
{
public:
- MultiTracker(MetricsPtr m);
+ MultiTracker();
virtual ~MultiTracker();
void update(unsigned int total, const Detection* d, const cv::Mat& image);
private:
- MetricsPtr metrics;
std::vector<TrackerPtr> trackers;
int max_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);
+ PatchPtr createPatch(const cv::Mat& image);
+ double distance(TrackerPtr t, const cv::Mat& image, const Detection& d);
PredictorWrapperPtr predictor;
+ cv::HOGDescriptor descriptor;
+ };
+ class Patch
+ {
+ public:
+ ~Patch(){};
+ // bb_ltrb
+ cv::Mat image_crop;
+ std::vector<float> features;
+ protected:
+ friend class MultiTracker;
+ Patch(){};
};
#include "SharedPtr.h"
#include <boost/python.hpp>
+#include <vector>
namespace suanzi {
static PredictorWrapperPtr create(const std::string& fname);
~PredictorWrapper(){}
void dump();
- double predict();
+ double predict(int index, std::vector<double> f);
private:
PredictorWrapper(const std::string& fname);
#include <vector>
#include "Metrics.h"
#include "SharedPtr.h"
+#include "MultiTracker.h"
namespace suanzi {
+ TK_DECLARE_PTR(Tracker);
+ TK_DECLARE_PTR(Patch);
typedef enum
{
Fire = -1,
Delete
} TrackerStatus;
- TK_DECLARE_PTR(Tracker);
-// TK_DECLARE_PTR(KalmanFilter);
class Tracker
{
public:
Tracker(const cv::Mat& image, int id = 0);
virtual ~Tracker();
void updateState(const cv::Mat& image);
-// void addPatch(Patch* p);
+ void addPatch(PatchPtr p);
TrackerStatus status;
+ std::vector<PatchPtr> patches;
private:
TrackerStatus preStatus;
int id;
int age;
int last_active;
- std::vector<Patch> patches;
cv::KalmanFilter kf = {4,2};
};
-// class KalmanFilter
-// {
-// public:
-// KalmanFilter();
-// ~KalmanFilter();
-// private:
-// cv::KalmanFilter
-//
-// };
-
}
LOG_DEBUG(TAG, "==================================");
EnginePtr e = Engine::create();
e->addObserver(new Callback());
- e->setVideoSrc(VideoSrcType::URL, "rtsp://192.168.1.75:554/stream1");
+ //e->setVideoSrc(VideoSrcType::URL, "rtsp://192.168.1.75:554/stream1");
+ e->setVideoSrc(VideoSrcType::URL, "rtsp://192.168.56.101:5454/test.mp4");
e->start();
e->destroy();
log4cpp::Category::shutdown();
pp = predictors[index]
true_class = int(pp.classes_[1] == 1)
prob = pp.predict_proba([features])[0, true_class]
+ print prob
return prob
Engine::Engine()
{
detector = std::make_shared<Detector>();
- MetricsPtr m (new Metrics("model.pkl"));
- multiTracker = std::make_shared<MultiTracker>(m);
+ multiTracker = std::make_shared<MultiTracker>();
}
Engine::~Engine()
}
}
-
-void Metrics::similarity(const Patch& p1, const Patch& p2)
-{
-}
using namespace Eigen;
static const std::string TAG = "MultiTracker";
-MultiTracker::MultiTracker(MetricsPtr m) : metrics(m)
+static const cv::Size PREFERRED_SIZE = Size(64, 128);
+
+#define MaxCost 100000
+
+MultiTracker::MultiTracker()
{
LOG_DEBUG(TAG, "init - load model.pkl");
predictor = PredictorWrapper::create("./python/model.pkl");
predictor->dump();
+ this->descriptor = {cv::Size(64, 128), cv::Size(16, 16), cv::Size(8, 8), cv::Size(8, 8), 9};
+ std::vector<double> ff (40, 1);
+ predictor->predict(4, ff);
}
-
MultiTracker::~MultiTracker()
{
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);
-//}
-//
-void MultiTracker::removeTracker(TrackerPtr t)
-{
-// trackers.erase(t);
-}
-
-void MultiTracker::initNewTrackers(cv::Mat& iamge)
-{
-}
-void MultiTracker::correctTrackers(MetricsPtr m, Mat& image)
+static std::vector<double> similarity(const PatchPtr p1, const PatchPtr p2)
{
-}
+ std::vector<double> feature;
+ cv::Mat im1(PREFERRED_SIZE, p1->image_crop.type());
+ 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::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);
+ feature.push_back(result.at<double>(0, 0));
-void calculate_edistance()
-{
+ return feature;
}
-#define MaxCost 100000
-static double distance(TrackerPtr t, const cv::Mat& image, const Detection& d)
+double MultiTracker::distance(TrackerPtr t, const cv::Mat& image, const Detection& d)
{
- return 0.1;
+ PatchPtr patch = createPatch(image);
+ std::vector<double> features;
+ std::vector<double> ss;
+ for (const auto i : t->patches){
+ ss = similarity(i, patch);
+ features.insert(features.end(), ss.begin(), ss.end());
+ }
+ //predictor->predict();
+ return 0.1;
}
void MultiTracker::update(unsigned int total, const Detection* detections, const Mat& image)
{
- // correct_trackers
- // Generate cost matrix
int row = trackers.size();
int col = total;
MatrixXi cost_matrix = MatrixXi::Zero(row, col);
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
// TODO
- // int cost = MaxCost;
cost_matrix(i, j) = distance(trackers[i], image, detections[j]);
}
}
this->trackers.push_back(t);
}
}
+
+PatchPtr MultiTracker::createPatch(const cv::Mat& image)
+{
+ PatchPtr patch(new Patch());
+ std::vector<float> feature_hog;
+ cv::Mat img;
+ cv::resize(image, img, PREFERRED_SIZE);
+ this->descriptor.compute(img, feature_hog);
+
+ cv::Mat hist;
+ //cv::calcHist()
+ patch->image_crop = image;
+ return patch;
+}
static std::string parse_python_exception();
+template <class T>
+boost::python::list toPythonList(std::vector<T> vector) {
+ typename std::vector<T>::iterator iter;
+ boost::python::list list;
+ for (iter = vector.begin(); iter != vector.end(); ++iter) {
+ list.append(*iter);
+ }
+ return list;
+}
PredictorWrapperPtr PredictorWrapper::create(const std::string& fname)
{
LOG_DEBUG(TAG, ss);
}
-double PredictorWrapper::predict()
+double PredictorWrapper::predict(int index, std::vector<double> ff)
{
LOG_DEBUG(TAG, "predict");
try{
- this->predict_func();
+ this->predict_func(index, toPythonList(ff));
} catch (boost::python::error_already_set const &){
std::string perror_str = parse_python_exception();
LOG_ERROR(TAG, "Error in Python: " + perror_str)
this->kf.processNoiseCov = 1e-5 * Mat_<float>::eye(4, 4);
this->kf.measurementNoiseCov = 1e-1 * Mat_<float>::ones(2, 2);
this->kf.errorCovPost = 1. * Mat_<float>::ones(4, 4);
+
+
}
Tracker::~Tracker()
{
+ patches.clear();
}
-//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;
status = TrackerStatus::Lost;
}
}
+
+void Tracker::addPatch(PatchPtr p)
+{
+ this->patches.push_back(p);
+}
vcap.release();
}
+static long count = 0;
+
+static void printImg(const cv::Mat& mat)
+{
+ std::cout << mat.at<int>(0,0) << std::endl;
+}
+
bool UrlReader::read(cv::Mat& mat)
{
bool ret = vcap.read(mat);
LOG_ERROR(TAG, "blank frame grabbed");
return false;
}
+ count++;
+ std::string name = "./temp/image_" + std::to_string(count) + ".png";
+ if ((count % 50 == 0)){
+ imwrite(name.c_str(), mat);
+ }
return ret;
}
-
-//
-//void UrlReader::read()
-//{
-//}
-//
-//void FileReader::read()
-//{
-//}
-//
-//void UsbReader::read()
-//{
-//}
{
// The algorithm expects more columns than rows in the cost matrix.
MatrixXi correct_matrix = cost_matrix;
+ if (cost_matrix.cols() == 0 || cost_matrix.rows() == 0){
+ row_ind = VectorXi::Zero(0);
+ col_ind = VectorXi::Zero(0);
+ return 0;
+ }
bool is_transposed = false;
if (cost_matrix.cols() < cost_matrix.rows()){
cout << "cols < rows, transpose." << endl;