write features to soft cascade xml
authormarina.kolpakova <marina.kolpakova@itseez.com>
Fri, 14 Dec 2012 13:57:55 +0000 (17:57 +0400)
committermarina.kolpakova <marina.kolpakova@itseez.com>
Fri, 1 Feb 2013 10:34:39 +0000 (14:34 +0400)
apps/sft/include/sft/octave.hpp
apps/sft/octave.cpp
apps/sft/sft.cpp

index 81b73bb..6544272 100644 (file)
@@ -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;
index 6a02d54..bc8ea80 100644 (file)
@@ -300,7 +300,7 @@ template <typename T> 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<const CvDTreeNode*> 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<int>(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<float>(0)+ i);
+                traverse(tree, fso, nfeatures, usedPtr, thresholds.ptr<float>(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)
 {
index f3be928..61f9267 100644 (file)
@@ -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);