【Adaboost算法】C++转C, 分类器结构设计
一、参考OpenCV的CascadeClassifier类LBPEvaluator类
如下,筛选出存放分类器相关信息的成员变量:
class CV_EXPORTS_W CascadeClassifier { public:CV_WRAP CascadeClassifier();CV_WRAP CascadeClassifier( const string& filename );virtual ~CascadeClassifier();CV_WRAP virtual bool empty() const;CV_WRAP bool load( const string& filename );virtual bool read( const FileNode& node );CV_WRAP virtual void detectMultiScale( const Mat& image,CV_OUT vector<Rect>& objects,double scaleFactor=1.1,int minNeighbors=3, int flags=0,Size minSize=Size(),Size maxSize=Size() );CV_WRAP virtual void detectMultiScale( const Mat& image,CV_OUT vector<Rect>& objects,vector<int>& rejectLevels,vector<double>& levelWeights,double scaleFactor=1.1,int minNeighbors=3, int flags=0,Size minSize=Size(),Size maxSize=Size(),bool outputRejectLevels=false );bool isOldFormatCascade() const;virtual Size getOriginalWindowSize() const;int getFeatureType() const;bool setImage( const Mat& );protected://virtual bool detectSingleScale( const Mat& image, int stripCount, Size processingRectSize,// int stripSize, int yStep, double factor, vector<Rect>& candidates );virtual bool detectSingleScale( const Mat& image, int stripCount, Size processingRectSize,int stripSize, int yStep, double factor, vector<Rect>& candidates,vector<int>& rejectLevels, vector<double>& levelWeights, bool outputRejectLevels=false);protected:enum { BOOST = 0 };enum { DO_CANNY_PRUNING = 1, SCALE_IMAGE = 2,FIND_BIGGEST_OBJECT = 4, DO_ROUGH_SEARCH = 8 };friend class CascadeClassifierInvoker;template<class FEval>friend int predictOrdered( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &featureEvaluator, double& weight);template<class FEval>friend int predictCategorical( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &featureEvaluator, double& weight);template<class FEval>friend int predictOrderedStump( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &featureEvaluator, double& weight);template<class FEval>friend int predictCategoricalStump( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &featureEvaluator, double& weight);bool setImage( Ptr<FeatureEvaluator>& feval, const Mat& image);virtual int runAt( Ptr<FeatureEvaluator>& feval, Point pt, double& weight );class Data{public:struct CV_EXPORTS DTreeNode{int featureIdx;float threshold; // for ordered features onlyint left;int right;};struct CV_EXPORTS DTree{int nodeCount;};struct CV_EXPORTS Stage{int first;int ntrees;float threshold;};bool read(const FileNode &node);bool isStumpBased;int stageType;int featureType;int ncategories;Size origWinSize;vector<Stage> stages;vector<DTree> classifiers;vector<DTreeNode> nodes;vector<float> leaves;vector<int> subsets;};Data data;Ptr<FeatureEvaluator> featureEvaluator;Ptr<CvHaarClassifierCascade> oldCascade;public:class CV_EXPORTS MaskGenerator{public:virtual ~MaskGenerator() {}virtual cv::Mat generateMask(const cv::Mat& src)=0;virtual void initializeMask(const cv::Mat& /*src*/) {};};void setMaskGenerator(Ptr<MaskGenerator> maskGenerator);Ptr<MaskGenerator> getMaskGenerator();void setFaceDetectionMaskGenerator();protected:Ptr<MaskGenerator> maskGenerator; };class LBPEvaluator : public FeatureEvaluator { public:struct Feature{Feature();Feature( int x, int y, int _block_w, int _block_h ) :rect(x, y, _block_w, _block_h) {}int calc( int offset ) const;void updatePtrs( const Mat& sum );bool read(const FileNode& node ); Rect rect; // weight and height for blockconst int* p[16]; // fast };LBPEvaluator();virtual ~LBPEvaluator();virtual bool read( const FileNode& node );virtual Ptr<FeatureEvaluator> clone() const;virtual int getFeatureType() const { return FeatureEvaluator::LBP; }virtual bool setImage(const Mat& image, Size _origWinSize);virtual bool setWindow(Point pt);int operator()(int featureIdx) const{ return featuresPtr[featureIdx].calc(offset); }virtual int calcCat(int featureIdx) const{ return (*this)(featureIdx); } protected:Size origWinSize;Ptr<vector<Feature> > features;Feature* featuresPtr; // optimization Mat sum0, sum;Rect normrect;int offset; };
二、开始设计适合自己分类器的数据结构
如下图,因为我们打算使用数组方式存储信息,为避免溢出,首先了解自己分类器的强分类器级数,nodes,leaves等信息,由于我们的分类器是通过opencv训练的,所以可以直接Debug查看分类器信息,或者通过xml文件查看。
设计结构体如下:
#ifndef _CP_ADABOOST_ #define _CP_ADABOOST_ #ifdef __cplusplus extern "C"{ #endif typedef struct tagCpSize {int iWidth;int iHeight; }CP_SIZE_S;typedef struct tagCPDTreeNode {int featureIdx;float threshold; // for ordered features onlyint left;int right; }CP_DTREE_NODE_S;typedef struct tagCpDTree {int nodeCount; }CP_DTREE_S;typedef struct tagCpStage {int first;int ntrees;float threshold; }CP_STAGE_S;typedef struct tagCPRect {int x;int y;int width;int height; }CP_RECT_S;typedef struct tagLBPFeature {CP_RECT_S rect;/*特征位置*/int* p[16];/* 特征在积分图中的地址 */ }CP_LBP_FEATURE_S;typedef struct tagCpClassifier {bool isStumpBased;int stageType;int featureType;int ncategories;CP_SIZE_S origWinSize;CP_STAGE_S stages[50]; /*强分类器级数*/int stagerNum; CP_DTREE_S classifiers[500]; int classfierNum;CP_DTREE_NODE_S nodes[500]; int nodeNum;CP_LBP_FEATURE_S feature[500]; int featureNum;float leaves[1000]; int leaveNum;int subsets[5000]; int subsetNum; }CP_CLASSIFIER_S;#ifdef __cplusplus } #endif #endif /* _CP_ADABOOST_ */
转载于:https://www.cnblogs.com/chenpi/p/5128229.html
【Adaboost算法】C++转C, 分类器结构设计相关推荐
- 基于Adaboost算法的人脸检测分类器!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陈锴,Datawhale优秀学习者,中山大学数学系 人脸检测属于计 ...
- Adaboost 算法的原理与推导
Adaboost 算法的原理与推导 0 引言 一直想写Adaboost来着,但迟迟未能动笔.其算法思想虽然简单:听取多人意见,最后综合决策,但一般书上对其算法的流程描述实在是过于晦涩.昨日11月1日下 ...
- Adaboost算法原理以及matlab代码实现(超详细)
一.AdaBoost简介 Boosting, 也称为增强学习或提升法,是一种重要的集成学习技术, 能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器,这在直接构造强学习器非常困难的情况 ...
- adaboost算法java_Adaboost 算法实例解析
Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...
- Adaboost算法原理分析和实例+代码(简明易懂)
Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333 ...
- Adaboost 算法的原理与推导(转载)
0 引言 一直想写Adaboost来着,但迟迟未能动笔.其算法思想虽然简单:听取多人意见,最后综合决策,但一般书上对其算法的流程描述实在是过于晦涩.昨日11月1日下午,在我组织的机器学习班 第8次课上 ...
- Adaboost算法原理分析和实例+代码(转载)
[尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333 本人最初了解AdaBoost算法着实是花了几天时 ...
- 机器学习(machine learning)之AdaBoost算法
转自:http://blog.csdn.net/haidao2009/article/details/7514787 浅谈 Adaboost 算法 机器学习是利用一些方法来使机器实现人的学习行为, ...
- AdaBoost 算法解析
一 Boosting 算法的起源 boost 算法系列的起源来自于PAC Learnability(PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的 ...
- 【机器学习】adaboost算法
[机器学习]adaboost算法 转载自:https://blog.csdn.net/guyuealian/article/details/70995333(算法原理与实例结合讲解很好!) 一.Ada ...
最新文章
- 基数排序算法LSD实现
- 笔记:django is not a registered namespace错误
- 全球及中国商用杠铃架行业营销策略及投资建议分析报告2021-2027年版
- OpenGL 期末考试作业
- oracle resetlog与noresetlog的作用(转载)
- python-weed的seaweedfs使用指南
- 20个短视频素材网站
- 大数据之clickhouse各类引擎
- 比肩Sci-hub的论文下载神器——Library Genesis
- 标题:书号验证 2004年起,国际ISBN中心出版了《13位国际标准书号指南》。 原有10位书号前加978作为商品分类标识;校验规则也改变。 校验位的加权算法与10位ISBN的算法不同,具体算法是
- swifty引用AFNetworking出现clang: error: linker command failed with exit code 1 (use -v to see invocation
- “onkeyup”=按键抬起触发,“onafterpaste”=粘贴之后触发
- 如何删除电脑上卸载软件的残留文件,清理软件残留?
- iphone html 手机震动,​苹果手机震动器在哪里?如何设置与关闭?
- html表格table的表头排序,js代码fastunit使用案例
- cubeIDE开发, stm32独立看门狗IWDG的CubeMX配置及HAL库底层实现分析
- css伪类炫酷迷幻边框
- 为自动驾驶carla配置车流量
- 电子和计算机工程密歇根大学,美国密歇根大学迪尔本校区电子与计算机工程系主任 Yi Lu Murphey教授来我校进行学术交流并作学术报告...
- python微信聊天界面生成器改编版