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
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);
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;
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;
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());
nodes.push( tempNode->right );
fs << internalNodeIdx++;
}
+
int fidx = tempNode->split->var_idx;
- fs << fidx;
+ fs << nfeatures;
+ used[nfeatures++] = fidx;
fs << tempNode->split->ord.c;
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
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 << "]"
<< "}";
}
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)
{
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);