当前位置: 首页 > news >正文

【秣厉科技】LabVIEW工具包——OpenCV 教程(12):机器学习

文章目录

  • 前言
  • 机器学习
    • 例1:支持向量机(SVM)做平面向量二分类
    • 例2: K邻近算法(KNearest)实现分类
  • 总结


前言

  1. 需要下载安装OpenCV工具包的朋友,请前往 此处 ;
  2. 系统要求:Windows系统,LabVIEW>=2018,兼容32位和64位。

机器学习

OpenCV 的机器学习算法位于 ml 模块,主要由基于统计学的 StatModel 类实现。

StatModel 是一个基类,根据不同的算法,衍生出一系列子类。

StatModel
ANN_MLP
DTrees
EM
KNearest
LogisticRegression
NormalBayesClassifier
SVM
SVMSGD
RTrees
Boost

选板如下,子目录下的函数,是子类私有方法,外部的是共有方法。

在这里插入图片描述


例1:支持向量机(SVM)做平面向量二分类

  • 第1步:准备训练数据(TrainData)

训练数据需要两个矩阵:Samples 和 Responses,即 样本矩阵 和 响应矩阵。

在本例中,随机生成(300 * 300)平面中的200个 (x, y) 坐标,组成 (200 * 2) 的二维 Mat 作为 Samples。

然后,按照某种线性规则将上述200个坐标分成两类(用 1 和 2 代表),组成 (200 * 1)的二维 Mat 作为 Responses。

注意,Samples 矩阵的数据类型须是浮点数,Responses 矩阵的数据类型须是整型数(CV_32S)。

插入一个 TrainData 类的 create 函数,输入上述的 Samples 和 Responses,并将布局设为“ROW_SAMPLE”,即每行一个样本。由此创建的 TrainData 对象,作为将来 SVM 算法的训练数据。

在这里插入图片描述

  • 第2步:创建SVM,设置参数并训练

插入一个 StatModel 类的 create 函数,切换多态标签至 “SVM”。

接着,插入多个 SVM 子类的私有函数 SVM_set,通过切换模式,设置不同的参数。

然后,插入一个 StatModel 类的公共函数 train,切换模式为 “TrainData”,并连接第1步准备好的TrainData对象。

在这里插入图片描述

  • 第3步:用新样本进行预测,评估训练效果

本例遍历(300 * 300)平面的每一个像素坐标,组成(90000 * 2) 的二维 Mat 作为测试样本矩阵。

插入一个 StatModel 类的公共函数 predict,输入上述测试样本矩阵,运行后获得预测结果矩阵。

可视化:根据预测结果(1或2),对(300 * 300)平面的每一个像素进行染色。

同时把训练时的200个散点也绘制在平面上,根据分类用不同的颜色进行区分。

完整过程如下图(可视化过程略),详见范例:examples/Molitec/OpenCV/ml/ml_1(StatModel_SVM).vi

在这里插入图片描述

在这里插入图片描述

从上图中可以看出,SVM 用线性边界将平面分割成了两类,而且在靠近边界的区域,允许存在一定的样本误差。

以上是一个简单的 SVM 应用,样本是二维向量。其实 SVM 还可以用在多维向量分类上,比如一张图片的特征向量。通过 SVM 找出多维向量样本在 “超平面” 上的最佳分割方案,进而对图片进行二分类。

感兴趣的读者,可以提前看一看 features2d 模块的范例:
examples/Molitec/OpenCV/features2d/features2d_5(BOW_SVM_train).vi


例2: K邻近算法(KNearest)实现分类

K近邻算法是一种基于实例的学习方法,主要用于分类和回归任务。其核心思想是:对于一个新的、未知类别的数据点,通过计算其与已知类别训练集中的数据点的距离,找出与其最近的K个邻居,并依据这K个邻居的多数类别来决定新数据点的类别归属‌。

  • 第1步:准备训练数据

训练数据需要两个矩阵:Samples 和 Responses,即 样本矩阵 和 响应矩阵。

本例围绕平面上的两个中心点,分别生成 50 个随机 (x, y) 坐标,组成 (100 * 2) 的二维 Mat 作为 Samples。

根据所属中心的不同,将上述100个点分类成1或2,组成 (100 * 1)的二维 Mat 作为 Responses。

数据类型要求与上文相同。本次不创建 TrainData 对象,直接使用 Samples 和 Responses 参与将来的训练。

在这里插入图片描述

  • 第2步:创建KNearest,设置参数并训练

插入一个 StatModel 类的 create 函数,切换多态标签至 “KNearest”。

接着,插入一个或多个 KNearest子类的私有函数 KNearest_set,通过切换模式,设置不同的参数。

然后,插入一个 StatModel 类的公共函数 train,切换模式为 “Samples”,连接第1步准备好的 Samples 和 Responses ,并将布局设为“ROW_SAMPLE”。

在这里插入图片描述

  • 第3步:引入新的样本,进行K邻近分类

插入一个 KNearest 子类的私有函数 KNearest_findNearest,设置K=5,输入新样本,运行后获得预测分类结果。

KNearest_findNearest 还有两个可选输入输出:neighborResponses 和 dist,可以返回K个相邻点的分类和距离。

完整过程如下图(可视化过程略),详见范例:examples/Molitec/OpenCV/ml/ml_2(StatModel_KNearest).vi

在这里插入图片描述

在这里插入图片描述

在上图中,新引入的样本点(150,150)位于画面中心的 “+” 标识,与其相邻的 K (5) 个点中,有3个属于1类(蓝色),有2个属于2类(红色),所以新样本的分类结果为1类。

KNearest 同样可以用于多维向量分类。通过找出 “超平面” 上K个最相邻的已知样本,对新样本进行分类。


总结

  1. 本系列博文作为LabVIEW工具包—OpenCV的教程,将以专栏的形式陆续发布和更新。
  2. 对工具包感兴趣的朋友,欢迎下载试用:秣厉科技 - LabVIEW工具包 - OpenCV
  3. 各位看官有什么想法、建议、吐槽、批评,或新奇的需求,也欢迎留言讨论。

相关文章:

  • 【一起学Rust | Tauri2.0框架】深入浅出 Tauri 2.0 应用调试:从新手到专家的蜕变
  • 企业建设——访问控制模型
  • python如何随机选取n个不同的数字
  • ESP32-C3物联网方案,智能设备创新升级,无线交互控制通信应用
  • Off-Road-Freespace-Detection配置pytorch2.0.0
  • 数据库概述
  • 合宙780E开发学习-Lua语法速查
  • vector和list区别
  • 个股场外期权参与条件有哪些要求?
  • Android 系统进程启动Activity方法说明
  • 一步部署FTP虚拟用户
  • ES数据过多,索引拆分
  • SBOM风险预警 | 恶意NPM组件开展木马投毒攻击,目标针对国内泛互企业
  • 前端面试整理
  • 三步打造Temu多账号独立IP环境
  • 2025年01月13日字节(本地生活)前端面试
  • centos 7 搭建FTP本地用户
  • 数据库取证分析
  • 【Git】--- 分支管理
  • vue 点击放大,图片预览效果
  • 吉林省公安厅出入境管理总队政委明志全已任省安保集团总经理
  • 五一期间上海景观照明开启重大活动模式,外滩不展演光影秀
  • 香港警务处高级助理处长叶云龙升任警务处副处长(行动)
  • 经济日报:多平台告别“仅退款”,规则调整有何影响
  • 核电开闸!国常会核准10台新机组,拉动超2000亿投资,新项目花落谁家?
  • “世纪火种”嘉年华启动,69家单位加入阅读“朋友圈”