我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python opencv3机器学习之EM算法怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python opencv3机器学习之EM算法怎么使用

今天小编给大家分享一下python opencv3机器学习之EM算法怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

引言

不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注。相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计。也能得到每个样本对应的标注值,类似于kmeans聚类(输入样本数据,输出样本数据的标注)。实际上,高斯混和模型GMM和kmeans都是EM算法的应用。

在opencv3.0中,EM算法的函数是trainEM,函数原型为:

bool trainEM(InputArray samples, OutputArray logLikelihoods=noArray(),OutputArray labels=noArray(),OutputArray probs=noArray())

四个参数:

 samples: 输入的样本,一个单通道的矩阵。从这个样本中,进行高斯混和模型估计。

logLikelihoods: 可选项,输出一个矩阵,里面包含每个样本的似然对数值。

labels: 可选项,输出每个样本对应的标注。

probs: 可选项,输出一个矩阵,里面包含每个隐性变量的后验概率

这个函数没有输入参数的初始化值,是因为它会自动执行kmeans算法,将kmeans算法得到的结果作为参数初始化。

这个trainEM函数实际把E步骤和M步骤都包含进去了,我们也可以对两个步骤分开执行,OPENCV3.0中也提供了分别执行的函数:

bool trainE(InputArray samples, InputArray means0,                        InputArray covs0=noArray(),                        InputArray weights0=noArray(),                        OutputArray logLikelihoods=noArray(),                        OutputArray labels=noArray(),                        OutputArray probs=noArray())
bool trainM(InputArray samples, InputArray probs0,                        OutputArray logLikelihoods=noArray(),                        OutputArray labels=noArray(),                        OutputArray probs=noArray())

 trainEM函数的功能和kmeans差不多,都是实现自动聚类,输出每个样本对应的标注值。但它比kmeans还多出一个功能,就是它还能起到训练分类器的作用,用于后续新样本的预测。

预测函数原型为:

Vec2d predict2(InputArray sample, OutputArray probs) const

sample: 待测样本

probs : 和上面一样,一个可选的输出值,包含每个隐性变量的后验概率

返回一个Vec2d类型的数,包括两个元素的double向量,第一个元素为样本的似然对数值,第二个元素为最大可能混和分量的索引值。

在本文中,我们用两个实例来学习opencv中的EM算法的应用。

一、opencv3.0中自带的例子

既包括聚类trianEM,也包括预测predict2

代码:

#include "stdafx.h"#include "opencv2/opencv.hpp"#include <iostream>using namespace std;using namespace cv;using namespace cv::ml;//使用EM算法实现样本的聚类及预测int main(){    const int N = 4;    //分成4类    const int N1 = (int)sqrt((double)N);    //定义四种颜色,每一类用一种颜色表示    const Scalar colors[] =    {        Scalar(0, 0, 255), Scalar(0, 255, 0),        Scalar(0, 255, 255), Scalar(255, 255, 0)    };    int i, j;    int nsamples = 100;   //100个样本点    Mat samples(nsamples, 2, CV_32FC1);  //样本矩阵,100行2列,即100个坐标点        Mat img = Mat::zeros(Size(500, 500), CV_8UC3);  //待测数据,每一个坐标点为一个待测数据    samples = samples.reshape(2, 0);    //循环生成四个类别样本数据,共样本100个,每类样本25个    for (i = 0; i < N; i++)    {        Mat samples_part = samples.rowRange(i*nsamples / N, (i + 1)*nsamples / N);        //设置均值        Scalar mean(((i%N1) + 1)*img.rows / (N1 + 1),            ((i / N1) + 1)*img.rows / (N1 + 1));        //设置标准差        Scalar sigma(30, 30);        randn(samples_part, mean, sigma);  //根据均值和标准差,随机生成25个正态分布坐标点作为样本    }    samples = samples.reshape(1, 0);    // 训练分类器    Mat labels;  //标注,不需要事先知道    Ptr<EM> em_model = EM::create();    em_model->setClustersNumber(N);    em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);    em_model->setTermCriteria(TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 300, 0.1));    em_model->trainEM(samples, noArray(), labels, noArray());    //对每个坐标点进行分类,并根据类别用不同的颜色画出    Mat sample(1, 2, CV_32FC1);    for (i = 0; i < img.rows; i++)    {        for (j = 0; j < img.cols; j++)        {            sample.at<float>(0) = (float)j;            sample.at<float>(1) = (float)i;            //predict2返回的是double值,用cvRound进行四舍五入得到整型            //此处返回的是两个值Vec2d,取第二个值作为样本标注            int response = cvRound(em_model->predict2(sample, noArray())[1]);            Scalar c = colors[response];  //为不同类别设定颜色            circle(img, Point(j, i), 1, c*0.75, FILLED);        }    }    //画出样本点    for (i = 0; i < nsamples; i++)    {        Point pt(cvRound(samples.at<float>(i, 0)), cvRound(samples.at<float>(i, 1)));        circle(img, pt, 2, colors[labels.at<int>(i)], FILLED);    }    imshow("EM聚类结果", img);    waitKey(0);    return 0;}

结果:

python opencv3机器学习之EM算法怎么使用

二、trainEM实现自动聚类进行图片目标检测

只用trainEM实现自动聚类功能,进行图片中的目标检测

代码:

#include "stdafx.h"#include "opencv2/opencv.hpp"#include &lt;iostream&gt;using namespace std;using namespace cv;using namespace cv::ml;int main(){    const int MAX_CLUSTERS = 5;    Vec3b colorTab[] =    {        Vec3b(0, 0, 255),        Vec3b(0, 255, 0),        Vec3b(255, 100, 100),        Vec3b(255, 0, 255),        Vec3b(0, 255, 255)    };    Mat data, labels;    Mat pic = imread("d:/woman.png");    for (int i = 0; i &lt; pic.rows; i++)    for (int j = 0; j &lt; pic.cols; j++)    {        Vec3b point = pic.at&lt;Vec3b&gt;(i, j);        Mat tmp = (Mat_&lt;float&gt;(1, 3) &lt;&lt; point[0], point[1], point[2]);        data.push_back(tmp);    }    int N =3;  //聚成3类    Ptr&lt;EM&gt; em_model = EM::create();    em_model-&gt;setClustersNumber(N);    em_model-&gt;setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);    em_model-&gt;setTermCriteria(TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 300, 0.1));    em_model-&gt;trainEM(data, noArray(), labels, noArray());    int n = 0;    //显示聚类结果,不同的类别用不同的颜色显示    for (int i = 0; i &lt; pic.rows; i++)    for (int j = 0; j &lt; pic.cols; j++)    {        int clusterIdx = labels.at&lt;int&gt;(n);        pic.at&lt;Vec3b&gt;(i, j) = colorTab[clusterIdx];        n++;    }    imshow("pic", pic);    waitKey(0);    return 0;}

测试图片

python opencv3机器学习之EM算法怎么使用

测试结果:

python opencv3机器学习之EM算法怎么使用

以上就是“python opencv3机器学习之EM算法怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python opencv3机器学习之EM算法怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python opencv3机器学习之EM算法怎么使用

今天小编给大家分享一下python opencv3机器学习之EM算法怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。引
2023-07-02

Python机器学习之AdaBoost算法

目录一、算法概述二、算法原理三、算法步骤四、算法实现五、算法优化一、算法概述AdaBoost 是英文 Adaptive Boosting(自适应增强)的缩写,由 Yoav Freund 和Robert Schapire 在1995年提出。A
2022-06-02

Python机器学习之Kmeans基础算法

一、K-means基础算法简介 k-means算法是一种聚类算法,所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。聚类与分类最大的区别在于,聚类过程为无监督过程,即待处理数据对
2022-06-02

Python机器学习之PCA降维算法详解

目录一、算法概述二、算法步骤三、相关概念四、算法优缺点五、算法实现六、算法优化一、算法概述主成分分析 (Principal ComponentAnalysis,PCA)是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因
2022-06-02

机器学习之决策树算法怎么实现

决策树是一种常用的机器学习算法,主要用于分类和回归问题。下面是决策树算法的实现步骤:1. 数据预处理:将原始数据进行清洗和转换,包括去除缺失值、处理异常值、进行特征选择和特征工程等。2. 特征选择:选择对分类有较好预测能力的特征,常用的特征
2023-10-11

Python机器学习之AdaBoost算法的示例分析

这篇文章将为大家详细讲解有关Python机器学习之AdaBoost算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、算法概述AdaBoost 是英文 Adaptive Boosting(自适
2023-06-15

Python机器学习k-近邻算法怎么实现

这篇文章主要介绍“Python机器学习k-近邻算法怎么实现”,在日常操作中,相信很多人在Python机器学习k-近邻算法怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python机器学习k-近邻算法怎
2023-06-21

python机器学习工具pyCaret怎么使用

这篇文章主要介绍“python机器学习工具pyCaret怎么使用”,在日常操作中,相信很多人在python机器学习工具pyCaret怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python机器学习工
2023-06-25

Python机器学习之PCA降维算法的示例分析

小编给大家分享一下Python机器学习之PCA降维算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、算法概述主成分分析 (Principal Com
2023-06-15

Python语法学习之正则表达式怎么使用

这篇文章主要介绍“Python语法学习之正则表达式怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python语法学习之正则表达式怎么使用”文章能帮助大家解决问题。要想成功的进行字符串的匹配需
2023-06-30

怎么用Python开启机器学习

本篇内容主要讲解“怎么用Python开启机器学习”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python开启机器学习”吧!随着行业内机器学习的崛起,能够帮用户快速迭代整个过程的工具变得至
2023-06-02

机器学习线性回归算法怎么实现

实现机器学习线性回归算法一般需要以下步骤:1. 导入所需的库:例如,numpy用于数值计算,matplotlib用于可视化数据等。2. 准备数据:将数据集分为特征矩阵X和目标向量y。3. 初始化模型参数:初始化权重向量w和偏置b。4. 定义
2023-09-21

C++技术中的机器学习:使用C++实现机器学习算法的并行编程

c++++ 中的并行编程可以极大地提高机器学习算法的效率。c++ 提供了线程等并行工具,以及 openmp 和 mpi 等 api。openmp 可用于共享内存并行,而 mpi 则适用于分布式内存并行。通过使用 openmp,可以并行化线性
C++技术中的机器学习:使用C++实现机器学习算法的并行编程
2024-05-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录