From 4356d345424d8774bcc94f988816c045143d9c14 Mon Sep 17 00:00:00 2001 From: "marina.kolpakova" Date: Fri, 14 Dec 2012 17:57:55 +0400 Subject: [PATCH] write features to soft cascade xml --- apps/sft/include/sft/octave.hpp | 12 ++++++++---- apps/sft/octave.cpp | 33 ++++++++++++++++++++++++++++----- apps/sft/sft.cpp | 4 ++-- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/apps/sft/include/sft/octave.hpp b/apps/sft/include/sft/octave.hpp index 81b73bb..6544272 100644 --- a/apps/sft/include/sft/octave.hpp +++ b/apps/sft/include/sft/octave.hpp @@ -95,9 +95,11 @@ private: cv::Rect bb; int channel; - friend std::ostream& operator<<(std::ostream& out, const ICF& m); + friend void write(cv::FileStorage& fs, const string&, const ICF& f); + friend std::ostream& operator<<(std::ostream& out, const ICF& f); }; +void write(cv::FileStorage& fs, const string&, const ICF& f); std::ostream& operator<<(std::ostream& out, const ICF& m); class FeaturePool @@ -107,6 +109,7 @@ public: int size() const { return (int)pool.size(); } float apply(int fi, int si, const Mat& integrals) const; + void write( cv::FileStorage& fs, int index) const; private: void fill(int desired); @@ -140,11 +143,11 @@ public: virtual ~Octave(); virtual bool train(const Dataset& dataset, const FeaturePool& pool, int weaks, int treeDepth); - virtual void write( CvFileStorage* fs, string name) const; virtual float predict( const Mat& _sample, Mat& _votes, bool raw_mode, bool return_sum ) const; virtual void setRejectThresholds(cv::Mat& thresholds); + virtual void write( CvFileStorage* fs, string name) const; - virtual void write( cv::FileStorage &fs, const Mat& thresholds = Mat()) const; + virtual void write( cv::FileStorage &fs, const FeaturePool& pool, const Mat& thresholds = Mat()) const; int logScale; @@ -157,8 +160,9 @@ protected: float predict( const Mat& _sample, const cv::Range range) const; private: - void traverse(const CvBoostTree* tree, cv::FileStorage& fs, const float* th = 0) const; + void traverse(const CvBoostTree* tree, cv::FileStorage& fs, int& nfeatures, int* used, const float* th = 0) const; virtual void initial_weights(double (&p)[2]); + cv::Rect boundingBox; int npositives; diff --git a/apps/sft/octave.cpp b/apps/sft/octave.cpp index 6a02d54..bc8ea80 100644 --- a/apps/sft/octave.cpp +++ b/apps/sft/octave.cpp @@ -300,7 +300,7 @@ template int sgn(T val) { return (T(0) < val) - (val < T(0)); } -void sft::Octave::traverse(const CvBoostTree* tree, cv::FileStorage& fs, const float* th) const +void sft::Octave::traverse(const CvBoostTree* tree, cv::FileStorage& fs, int& nfeatures, int* used, const float* th) const { std::queue nodes; nodes.push( tree->get_root()); @@ -336,8 +336,10 @@ void sft::Octave::traverse(const CvBoostTree* tree, cv::FileStorage& fs, const f nodes.push( tempNode->right ); fs << internalNodeIdx++; } + int fidx = tempNode->split->var_idx; - fs << fidx; + fs << nfeatures; + used[nfeatures++] = fidx; fs << tempNode->split->ord.c; @@ -353,8 +355,11 @@ void sft::Octave::traverse(const CvBoostTree* tree, cv::FileStorage& fs, const f fs << "}"; } -void sft::Octave::write( cv::FileStorage &fso, const Mat& thresholds) const +void sft::Octave::write( cv::FileStorage &fso, const FeaturePool& pool, const Mat& thresholds) const { + cv::Mat used( 1, weak->total * (pow(2, params.max_depth) - 1), CV_32SC1); + int* usedPtr = used.ptr(0); + int nfeatures = 0; fso << "{" << "scale" << logScale << "weaks" << weak->total @@ -369,12 +374,19 @@ void sft::Octave::write( cv::FileStorage &fso, const Mat& thresholds) const CV_READ_SEQ_ELEM( tree, reader ); if (!thresholds.empty()) - traverse(tree, fso, thresholds.ptr(0)+ i); + traverse(tree, fso, nfeatures, usedPtr, thresholds.ptr(0)+ i); else - traverse(tree, fso); + traverse(tree, fso, nfeatures, usedPtr); } // + fso << "]"; + // features + + fso << "features" << "["; + for (int i = 0; i < nfeatures; ++i) + // fso << usedPtr[i]; + pool.write(fso, usedPtr[i]); fso << "]" << "}"; } @@ -483,6 +495,17 @@ float sft::FeaturePool::apply(int fi, int si, const Mat& integrals) const return pool[fi](integrals.row(si), model); } +void sft::FeaturePool::write( cv::FileStorage& fs, int index) const +{ + CV_Assert((index > 0) && (index < (int)pool.size())); + fs << pool[index]; +} + +void sft::write(cv::FileStorage& fs, const string&, const ICF& f) +{ + fs << "{" << "channel" << f.channel << "rect" << f.bb << "}"; +} + void sft::FeaturePool::fill(int desired) { diff --git a/apps/sft/sft.cpp b/apps/sft/sft.cpp index f3be928..61f9267 100644 --- a/apps/sft/sft.cpp +++ b/apps/sft/sft.cpp @@ -162,8 +162,8 @@ int main(int argc, char** argv) cv::Mat thresholds; boost.setRejectThresholds(thresholds); - boost.write(fso, thresholds); - boost.write(fsr); + boost.write(fso, pool, thresholds); + boost.write(fsr, pool); // std::cout << "thresholds " << thresholds << std::endl; cv::FileStorage tfs(("thresholds." + cfg.resPath(it)).c_str(), cv::FileStorage::WRITE); -- 2.7.4