opencv KNN 模型不能保存的问题
由Opencv 机器学习部分在线文档
http://docs.opencv.org/modules/ml/doc/ml.html
得知,这些机器学习方法K-Nearest Neighbors等都继承于基类CvStatModel,此基类中有save,load等方法,http://wiki.opencv.org.cn/index.php/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B8%AD%E6%96%87%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C#CvStatModel 中文解释说save,load方法会调用write和read方法。
在早期opencv中,基类的load和save都是纯虚函数,即子类要加以实现。
class CvStatModel
{
public:
/* CvStatModel(); */
/* CvStatModel( const CvMat* train_data ... ); */
virtual ~CvStatModel();
virtual void clear()=0;
/* virtual bool train( const CvMat* train_data, [int tflag,] ..., const CvMat* responses, ...,
[const CvMat* var_idx,] ..., [const CvMat* sample_idx,] ...
[const CvMat* var_type,] ..., [const CvMat* missing_mask,] <misc_training_alg_params> ... )=0;
*/
/* virtual float predict( const CvMat* sample ... ) const=0; */
virtual void save( const char* filename, const char* name=0 )=0;
virtual void load( const char* filename, const char* name=0 )=0;
virtual void write( CvFileStorage* storage, const char* name )=0;
virtual void read( CvFileStorage* storage, CvFileNode* node )=0;
};
而后来opencv对此做了修改,修改成为了虚函数。如下:
class CV_EXPORTS_W CvStatModel
{
public:
CvStatModel();
virtual ~CvStatModel();
virtual void clear();
CV_WRAP virtual void save( const char* filename, const char* name=0 ) const;
CV_WRAP virtual void load( const char* filename, const char* name=0 );
virtual void write( CvFileStorage* storage, const char* name ) const;
virtual void read( CvFileStorage* storage, CvFileNode* node );
protected:
const char* default_model_name;
};
这个虚函数声明说明,任何继承自CvStatModel的类都可以调用save,load等。
但是在使用KNN时调用save会出错,我们查看ml.hpp 文件发现opencv中K-Nearest Neighbors没有实现load,save,write,read这些函数。如下:
// k Nearest Neighbors
class CV_EXPORTS_W CvKNearest : public CvStatModel
{
public:
CV_WRAP CvKNearest();
virtual ~CvKNearest();
CvKNearest( const CvMat* trainData, const CvMat* responses,
const CvMat* sampleIdx=0, bool isRegression=false, int max_k=32 );
virtual bool train( const CvMat* trainData, const CvMat* responses,
const CvMat* sampleIdx=0, bool is_regression=false,
int maxK=32, bool updateBase=false );
virtual float find_nearest( const CvMat* samples, int k, CV_OUT CvMat* results=0,
const float** neighbors=0, CV_OUT CvMat* neighborResponses=0, CV_OUT CvMat* dist=0 ) const;
CV_WRAP CvKNearest( const cv::Mat& trainData, const cv::Mat& responses,
const cv::Mat& sampleIdx=cv::Mat(), bool isRegression=false, int max_k=32 );
CV_WRAP virtual bool train( const cv::Mat& trainData, const cv::Mat& responses,
const cv::Mat& sampleIdx=cv::Mat(), bool isRegression=false,
int maxK=32, bool updateBase=false );
virtual float find_nearest( const cv::Mat& samples, int k, cv::Mat* results=0,
const float** neighbors=0, cv::Mat* neighborResponses=0,
cv::Mat* dist=0 ) const;
CV_WRAP virtual float find_nearest( const cv::Mat& samples, int k, CV_OUT cv::Mat& results,
CV_OUT cv::Mat& neighborResponses, CV_OUT cv::Mat& dists) const;
virtual void clear();
int get_max_k() const;
int get_var_count() const;
int get_sample_count() const;
bool is_regression() const;
virtual float write_results( int k, int k1, int start, int end,
const float* neighbor_responses, const float* dist, CvMat* _results,
CvMat* _neighbor_responses, CvMat* _dist, Cv32suf* sort_buf ) const;
virtual void find_neighbors_direct( const CvMat* _samples, int k, int start, int end,
float* neighbor_responses, const float** neighbors, float* dist ) const;
protected:
int max_k, var_count;
int total;
bool regression;
CvVectors* samples;
};
此时如果用KNN.save时会调用基类的虚函数,而我们无法知道基类的save是如何实现的。
而在可以保存的svm等方法中发现了,read和write的声明
// SVM model
class CV_EXPORTS_W CvSVM : public CvStatModel
{
public:
// SVM type
virtual void write( CvFileStorage* storage, const char* name ) const;
virtual void read( CvFileStorage* storage, CvFileNode* node );
我们这里省略了大部分,可猜测不同的方法保存是有差别的。
我们没有在KNN代码中找到任何实现write和read的函数,通过运行出错,我们理解为opencv并没有实现对knn的write,这是源于knn的特点的,knn所谓的train也是只是保存样本数据,没有生成分类的模型,这个train函数也不是严格意义的训练。
如果我们想保存这些样本数据,可以通过保存样本特征在文件中,一次读入,可以参考http://www.aishack.in/2010/10/k-nearest-neighbors-in-opencv/
opencv KNN 模型不能保存的问题相关推荐
- 运动目标的背景建模-混合高斯背景建模和KNN模型建模的OpenCV代码实现
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 运动检测通常用于分析视频序列中的移动目标,如车辆 ...
- 一步步教你轻松学KNN模型算法
一步步教你轻松学KNN模型算法 ( 白宁超 2018年7月24日08:52:16 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解 ...
- KNN模型算法研究与案例分析
KNN模型算法研究与案例分析( 白宁超 2018年8月29日15:39:13 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解.整 ...
- 【数字图像处理3】(下) 使用Python+OpenCV+EDSR模型,实现超分辨率重建(SR)
超分辨率重建(SR) Python+OpenCV+EDSR模型 文章目录 超分辨率重建(SR) Python+OpenCV+EDSR模型 注意 1.安装OpenCV contrib模块 2.contr ...
- 线性回归之模型的保存和加载
线性回归之模型的保存和加载 1 sklearn模型的保存和加载API from sklearn.externals import joblib [目前这行代码报错,直接写import joblib ...
- R语言构建xgboost模型:模型的保存(xgb.save)和加载(xgb.load)、或者保存为R二进制文件(xgb.save.raw R binary vector)
R语言构建xgboost模型:模型的保存(xgb.save)和加载(xgb.load).或者保存为R二进制文件(xgb.save.raw,R binary vector) 目录
- R语言KNN模型数据分类实战
R语言KNN模型数据分类实战 目录 R语言KNN模型数据分类实战 #KNN基本原理 #案例分析 #数据集说明
- 使用KNN模型进行多标签分类实战(Multilabel Classification)
使用KNN模型进行多标签分类实战(Multilabel Classification) 详细的:二分类.多分类.多标签分类.多输出分类的概念参考笔者如下博文. 分类家族:二分类.多分类.多标签分类.多 ...
- 使用KNN模型进行多输出分类实战(Multioutput Classification)
使用KNN模型进行多输出分类实战(Multioutput Classification) 详细的:二分类.多分类.多标签分类.多输出分类的概念参考笔者如下博文. 分类家族:二分类.多分类.多标签分类. ...
最新文章
- java虚拟机内存分为,深入理解Java虚拟机笔记(一)----内存划分
- Maven的安装文字版(Windows/Linux/Mac)
- (NO.00001)iOS游戏SpeedBoy Lite成形记(十)
- [树链剖分]List wants to travel,Relief grain,hotel加强版,This world need more Zhu
- [转]自然语言处理中的Attention Model:是什么及为什么
- 移动最小二乘_最小移动以形成弦
- 超极本认知六大误区详解:不只是轻薄+长续航
- ACL2021 知识图谱、推荐系统相关论文
- Communication System--ZOJ 1409
- Node.js 4.0 中的 ES 6 特性介绍
- python3 模板库 好用_关于3个Python模板库的比较
- oracle多关键字查询,Oracle多关键字查询
- Android开发从0到1学习(知识+路线)
- AUTOSAR中CAN通信协议栈概述
- 2021最新!某盘加速下载工具复活了,无需登录,打开即可高速下载(附下载)!
- python实战项目分析2—物流
- 黑苹果声卡驱动成功后声音出现卡顿的解决办法
- codebook算法(背景建模)的原理
- 怎么在html中设置天数倒计时,PPT里面怎样设置时间倒计时,求大佬指教?
- 从联想ThinkStation工作站,窥见工具文明的新纪元