最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引言

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

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

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

四個參數(shù):

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

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

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

probs: 可選項,輸出一個矩陣,里面包含每個隱性變量的后驗概率

這個函數(shù)沒有輸入?yún)?shù)的初始化值,是因為它會自動執(zhí)行kmeans算法,將kmeans算法得到的結(jié)果作為參數(shù)初始化。

這個trainEM函數(shù)實際把E步驟和M步驟都包含進(jìn)去了,我們也可以對兩個步驟分開執(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差不多,都是實現(xiàn)自動聚類,輸出每個樣本對應(yīng)的標(biāo)注值。但它比kmeans還多出一個功能,就是它還能起到訓(xùn)練分類器的作用,用于后續(xù)新樣本的預(yù)測。

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

Vec2d predict2(InputArray sample, OutputArray probs) const

sample: 待測樣本

probs : 和上面一樣,一個可選的輸出值,包含每個隱性變量的后驗概率

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

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

一、opencv3.0中自帶的例子

既包括聚類trianEM,也包括預(yù)測predict2

代碼:

#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
using namespace cv::ml;
//使用EM算法實現(xiàn)樣本的聚類及預(yù)測
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個坐標(biāo)點    
    Mat img = Mat::zeros(Size(500, 500), CV_8UC3);  //待測數(shù)據(jù),每一個坐標(biāo)點為一個待測數(shù)據(jù)
    samples = samples.reshape(2, 0);
    //循環(huán)生成四個類別樣本數(shù)據(jù),共樣本100個,每類樣本25個
    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)差,隨機生成25個正態(tài)分布坐標(biāo)點作為樣本
    }
    samples = samples.reshape(1, 0);
    // 訓(xùn)練分類器
    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());
    //對每個坐標(biāo)點進(jìn)行分類,并根據(jù)類別用不同的顏色畫出
    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)行四舍五入得到整型
            //此處返回的是兩個值Vec2d,取第二個值作為樣本標(biāo)注
            int response = cvRound(em_model->predict2(sample, noArray())[1]);
            Scalar c = colors[response];  //為不同類別設(shè)定顏色
            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聚類結(jié)果", img);
    waitKey(0);
    return 0;
}

結(jié)果:

二、trainEM實現(xiàn)自動聚類進(jìn)行圖片目標(biāo)檢測

只用trainEM實現(xiàn)自動聚類功能,進(jìn)行圖片中的目標(biāo)檢測

代碼:

#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類
    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;
    //顯示聚類結(jié)果,不同的類別用不同的顏色顯示
    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;
}

測試圖片

測試結(jié)果:

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

相關(guān)文章

  • C語言實現(xiàn)套接字操作的示例代碼

    C語言實現(xiàn)套接字操作的示例代碼

    在C語言中,套接字(Socket)是一種進(jìn)行網(wǎng)絡(luò)通信的接口,這篇文章就來和大家介紹一下C語言中是如何進(jìn)行套接字操作的,需要的可以參考一下
    2023-06-06
  • C語言簡明分析指針與引用的具體用法

    C語言簡明分析指針與引用的具體用法

    指針是一個實體,引用是一個別名;在匯編上,引用的底層是以指針的方式實現(xiàn)的,定義一個引用變量,相當(dāng)于定義了一個指針,然后把引用內(nèi)存的地址寫到這個指針里面,當(dāng)通過引用變量修改它所引用的內(nèi)存時,它先訪問了指針里面的地址,然后在這個地址的內(nèi)存里面對值進(jìn)行修改
    2022-05-05
  • 擴展KMP算法(Extend KMP)

    擴展KMP算法(Extend KMP)

    我們這里說的KMP不是拿來放電影的(雖然我很喜歡這個軟件),而是一種算法。KMP算法是拿來處理字符串匹配的。今天我們談到的是對KMP算法的拓展
    2014-08-08
  • C語言常用的編輯器你知道幾個

    C語言常用的編輯器你知道幾個

    這篇文章主要為大家詳細(xì)介紹了C語言常用的編輯器,中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 利用C++11原子量如何實現(xiàn)自旋鎖詳解

    利用C++11原子量如何實現(xiàn)自旋鎖詳解

    當(dāng)自旋鎖嘗試獲取鎖時以忙等待(busy waiting)的形式不斷地循環(huán)檢查鎖是否可用,下面這篇文章主要給大家介紹了關(guān)于利用C++11原子量如何實現(xiàn)自旋鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-06-06
  • C++ COM編程之QueryInterface函數(shù)(二)

    C++ COM編程之QueryInterface函數(shù)(二)

    這篇文章主要介紹了C++ COM編程之QueryInterface函數(shù)(二),本文是第二篇,第一篇請參閱相關(guān)文檔,需要的朋友可以參考下
    2014-10-10
  • C++類的靜態(tài)成員變量與靜態(tài)成員函數(shù)詳解

    C++類的靜態(tài)成員變量與靜態(tài)成員函數(shù)詳解

    下面小編就為大家?guī)硪黄狢++類的靜態(tài)成員變量與靜態(tài)成員函數(shù)的文章。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • 關(guān)于VS+QT5應(yīng)用程序換圖標(biāo)的解決方案

    關(guān)于VS+QT5應(yīng)用程序換圖標(biāo)的解決方案

    這篇文章主要介紹了VS+QT5應(yīng)用程序換圖標(biāo)的處理方案,本文給大家提供了兩種解決方案供大家參考,每種方法給大家講解的都非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • Qt?自定義屬性Q_PROPERTY不顯示float類型的解決

    Qt?自定義屬性Q_PROPERTY不顯示float類型的解決

    這篇文章主要介紹了Qt?自定義屬性Q_PROPERTY不顯示float類型的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++結(jié)構(gòu)體數(shù)組實現(xiàn)貪吃蛇

    C++結(jié)構(gòu)體數(shù)組實現(xiàn)貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C++結(jié)構(gòu)體數(shù)組實現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

克什克腾旗| 论坛| 安福县| 广平县| 玉田县| 巴塘县| 班戈县| 石柱| 平江县| 安新县| 长沙县| 武城县| 淳安县| 瑞昌市| 延边| 白沙| 马关县| 广昌县| 齐齐哈尔市| 金华市| 老河口市| 沛县| 政和县| 原平市| 刚察县| 同心县| 宝兴县| 盱眙县| 方正县| 牟定县| 酒泉市| 秭归县| 汝阳县| 清水河县| 城口县| 思茅市| 成安县| 天祝| 嵊州市| 河北区| 喀喇沁旗|