欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

opencv3機(jī)器學(xué)習(xí)之EM算法示例詳解

 更新時(shí)間:2022年06月30日 08:46:42   作者:denny402  
這篇文章主要介紹了opencv3機(jī)器學(xué)習(xí)之EM算法的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

不同于其它的機(jī)器學(xué)習(xí)模型,EM算法是一種非監(jiān)督的學(xué)習(xí)算法,它的輸入數(shù)據(jù)事先不需要進(jìn)行標(biāo)注。相反,該算法從給定的樣本集中,能計(jì)算出高斯混和參數(shù)的最大似然估計(jì)。也能得到每個(gè)樣本對(duì)應(yīng)的標(biāo)注值,類(lèi)似于kmeans聚類(lèi)(輸入樣本數(shù)據(jù),輸出樣本數(shù)據(jù)的標(biāo)注)。實(shí)際上,高斯混和模型GMM和kmeans都是EM算法的應(yīng)用。

在opencv3.0中,EM算法的函數(shù)是trainEM,函數(shù)原型為:

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

四個(gè)參數(shù):

 samples: 輸入的樣本,一個(gè)單通道的矩陣。從這個(gè)樣本中,進(jìn)行高斯混和模型估計(jì)。

logLikelihoods: 可選項(xiàng),輸出一個(gè)矩陣,里面包含每個(gè)樣本的似然對(duì)數(shù)值。

labels: 可選項(xiàng),輸出每個(gè)樣本對(duì)應(yīng)的標(biāo)注。

probs: 可選項(xiàng),輸出一個(gè)矩陣,里面包含每個(gè)隱性變量的后驗(yàn)概率

這個(gè)函數(shù)沒(méi)有輸入?yún)?shù)的初始化值,是因?yàn)樗鼤?huì)自動(dòng)執(zhí)行kmeans算法,將kmeans算法得到的結(jié)果作為參數(shù)初始化。

這個(gè)trainEM函數(shù)實(shí)際把E步驟和M步驟都包含進(jìn)去了,我們也可以對(duì)兩個(gè)步驟分開(kāi)執(zhí)行,OPENCV3.0中也提供了分別執(zhí)行的函數(shù):

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函數(shù)的功能和kmeans差不多,都是實(shí)現(xiàn)自動(dòng)聚類(lèi),輸出每個(gè)樣本對(duì)應(yīng)的標(biāo)注值。但它比kmeans還多出一個(gè)功能,就是它還能起到訓(xùn)練分類(lèi)器的作用,用于后續(xù)新樣本的預(yù)測(cè)。

預(yù)測(cè)函數(shù)原型為:

Vec2d predict2(InputArray sample, OutputArray probs) const

sample: 待測(cè)樣本

probs : 和上面一樣,一個(gè)可選的輸出值,包含每個(gè)隱性變量的后驗(yàn)概率

返回一個(gè)Vec2d類(lèi)型的數(shù),包括兩個(gè)元素的double向量,第一個(gè)元素為樣本的似然對(duì)數(shù)值,第二個(gè)元素為最大可能混和分量的索引值。

在本文中,我們用兩個(gè)實(shí)例來(lái)學(xué)習(xí)opencv中的EM算法的應(yīng)用。

一、opencv3.0中自帶的例子

既包括聚類(lèi)trianEM,也包括預(yù)測(cè)predict2

代碼:

#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
using namespace cv::ml;
//使用EM算法實(shí)現(xiàn)樣本的聚類(lèi)及預(yù)測(cè)
int main()
{
    const int N = 4;    //分成4類(lèi)
    const int N1 = (int)sqrt((double)N);
    //定義四種顏色,每一類(lèi)用一種顏色表示
    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個(gè)樣本點(diǎn)
    Mat samples(nsamples, 2, CV_32FC1);  //樣本矩陣,100行2列,即100個(gè)坐標(biāo)點(diǎn)    
    Mat img = Mat::zeros(Size(500, 500), CV_8UC3);  //待測(cè)數(shù)據(jù),每一個(gè)坐標(biāo)點(diǎn)為一個(gè)待測(cè)數(shù)據(jù)
    samples = samples.reshape(2, 0);
    //循環(huán)生成四個(gè)類(lèi)別樣本數(shù)據(jù),共樣本100個(gè),每類(lèi)樣本25個(gè)
    for (i = 0; i < N; i++)
    {
        Mat samples_part = samples.rowRange(i*nsamples / N, (i + 1)*nsamples / N);
        //設(shè)置均值
        Scalar mean(((i%N1) + 1)*img.rows / (N1 + 1),
            ((i / N1) + 1)*img.rows / (N1 + 1));
        //設(shè)置標(biāo)準(zhǔn)差
        Scalar sigma(30, 30);
        randn(samples_part, mean, sigma);  //根據(jù)均值和標(biāo)準(zhǔn)差,隨機(jī)生成25個(gè)正態(tài)分布坐標(biāo)點(diǎn)作為樣本
    }
    samples = samples.reshape(1, 0);
    // 訓(xùn)練分類(lèi)器
    Mat labels;  //標(biāo)注,不需要事先知道
    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());
    //對(duì)每個(gè)坐標(biāo)點(diǎn)進(jìn)行分類(lèi),并根據(jù)類(lèi)別用不同的顏色畫(huà)出
    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進(jìn)行四舍五入得到整型
            //此處返回的是兩個(gè)值Vec2d,取第二個(gè)值作為樣本標(biāo)注
            int response = cvRound(em_model->predict2(sample, noArray())[1]);
            Scalar c = colors[response];  //為不同類(lèi)別設(shè)定顏色
            circle(img, Point(j, i), 1, c*0.75, FILLED);
        }
    }
    //畫(huà)出樣本點(diǎn)
    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聚類(lèi)結(jié)果", img);
    waitKey(0);
    return 0;
}

結(jié)果:

二、trainEM實(shí)現(xiàn)自動(dòng)聚類(lèi)進(jìn)行圖片目標(biāo)檢測(cè)

只用trainEM實(shí)現(xiàn)自動(dòng)聚類(lèi)功能,進(jìn)行圖片中的目標(biāo)檢測(cè)

代碼:

#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include <iostream>
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 < pic.rows; i++)
    for (int j = 0; j < pic.cols; j++)
    {
        Vec3b point = pic.at<Vec3b>(i, j);
        Mat tmp = (Mat_<float>(1, 3) << point[0], point[1], point[2]);
        data.push_back(tmp);
    }
    int N =3;  //聚成3類(lèi)
    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(data, noArray(), labels, noArray());
    int n = 0;
    //顯示聚類(lèi)結(jié)果,不同的類(lèi)別用不同的顏色顯示
    for (int i = 0; i < pic.rows; i++)
    for (int j = 0; j < pic.cols; j++)
    {
        int clusterIdx = labels.at<int>(n);
        pic.at<Vec3b>(i, j) = colorTab[clusterIdx];
        n++;
    }
    imshow("pic", pic);
    waitKey(0);
    return 0;
}

測(cè)試圖片

測(cè)試結(jié)果:

以上就是opencv3機(jī)器學(xué)習(xí)之EM算法的詳細(xì)內(nèi)容,更多關(guān)于opencv3 EM算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C/C++堆區(qū)專(zhuān)篇精講

    C/C++堆區(qū)專(zhuān)篇精講

    一直以來(lái)總是對(duì)這個(gè)問(wèn)題的認(rèn)識(shí)比較朦朧,我相信很多朋友也是這樣的,總是聽(tīng)到內(nèi)存一會(huì)在棧上分配,一會(huì)又在堆上分配,那么它們之間到底是怎么的區(qū)別呢,讓我們一起來(lái)看看
    2022-10-10
  • C語(yǔ)言實(shí)現(xiàn)井字棋游戲(人機(jī)對(duì)弈)

    C語(yǔ)言實(shí)現(xiàn)井字棋游戲(人機(jī)對(duì)弈)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)井字棋人機(jī)對(duì)弈游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Visual Studio 2019 DLL動(dòng)態(tài)庫(kù)連接實(shí)例(圖文教程)

    Visual Studio 2019 DLL動(dòng)態(tài)庫(kù)連接實(shí)例(圖文教程)

    這篇文章主要介紹了Visual Studio 2019 DLL動(dòng)態(tài)庫(kù)連接實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • VC++植物大戰(zhàn)僵尸中文版修改器實(shí)現(xiàn)代碼

    VC++植物大戰(zhàn)僵尸中文版修改器實(shí)現(xiàn)代碼

    這篇文章主要介紹了VC++植物大戰(zhàn)僵尸中文版修改器實(shí)現(xiàn)代碼,可實(shí)現(xiàn)植物大戰(zhàn)僵尸中的無(wú)限陽(yáng)光與無(wú)冷卻時(shí)間功能,需要的朋友可以參考下
    2015-04-04
  • windows 下C++生成Dump調(diào)試文件與分析

    windows 下C++生成Dump調(diào)試文件與分析

    dump文件是C++程序發(fā)生異常時(shí),保存當(dāng)時(shí)程序運(yùn)行狀態(tài)的文件,是調(diào)試異常程序重要的方法,所以程序崩潰時(shí),除了日志文件,dump文件便成了我們查找錯(cuò)誤的最后一根救命的稻草,這篇文章主要介紹了windows 下C++生成Dump調(diào)試文件與分析,需要的朋友可以參考下
    2023-04-04
  • Linux C/C++實(shí)現(xiàn)DNS客戶端請(qǐng)求域名IP的示例代碼

    Linux C/C++實(shí)現(xiàn)DNS客戶端請(qǐng)求域名IP的示例代碼

    DNS全稱(chēng):Domain Name System,域名解析系統(tǒng),是互聯(lián)網(wǎng)的一項(xiàng)服務(wù),本文主要介紹了C/C++如何實(shí)現(xiàn)DNS客戶端請(qǐng)求域名IP,感興趣的可以了解下
    2024-03-03
  • C++實(shí)現(xiàn)迷宮游戲

    C++實(shí)現(xiàn)迷宮游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)迷宮游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語(yǔ)言中字符的輸入輸出以及計(jì)算字符個(gè)數(shù)的方法詳解

    C語(yǔ)言中字符的輸入輸出以及計(jì)算字符個(gè)數(shù)的方法詳解

    這篇文章主要介紹了C語(yǔ)言中字符的輸入輸出以及計(jì)算字符個(gè)數(shù)的方法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • C語(yǔ)言使用函數(shù)實(shí)現(xiàn)字符串部分復(fù)制問(wèn)題

    C語(yǔ)言使用函數(shù)實(shí)現(xiàn)字符串部分復(fù)制問(wèn)題

    這篇文章主要介紹了C語(yǔ)言使用函數(shù)實(shí)現(xiàn)字符串部分復(fù)制問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 深入解析C++編程中基類(lèi)與基類(lèi)的繼承的相關(guān)知識(shí)

    深入解析C++編程中基類(lèi)與基類(lèi)的繼承的相關(guān)知識(shí)

    這篇文章主要介紹了C++編程中基類(lèi)與基類(lèi)的繼承的相關(guān)知識(shí),包括多個(gè)基類(lèi)繼承與虛擬基類(lèi)等重要知識(shí),需要的朋友可以參考下
    2016-01-01

最新評(píng)論