【模式識別】OpenCV中使用神經網路 CvANN_MLP

來源:互聯網
上載者:User
OpenCV的ml模組實現了人工神經網路(Artificial Neural Networks, ANN)最典型的多層感知器(multi-layer perceptrons, MLP)模型。由於ml模型實現的演算法都繼承自統一的CvStatModel基類,其訓練和預測的介面都是train(),predict(),非常簡單。

下面來看神經網路 CvANN_MLP 的使用~

定義神經網路及參數:

//Setup the BPNetworkCvANN_MLP bp; // Set up BPNetwork's parametersCvANN_MLP_TrainParams params;params.train_method=CvANN_MLP_TrainParams::BACKPROP;params.bp_dw_scale=0.1;params.bp_moment_scale=0.1;//params.train_method=CvANN_MLP_TrainParams::RPROP;//params.rp_dw0 = 0.1; //params.rp_dw_plus = 1.2; //params.rp_dw_minus = 0.5;//params.rp_dw_min = FLT_EPSILON; //params.rp_dw_max = 50.;

可以直接定義CvANN_MLP神經網路,並設定其參數。 BACKPROP表示使用back-propagation的訓練方法,RPROP即最簡單的propagation訓練方法。

使用BACKPROP有兩個相關參數:bp_dw_scale即bp_moment_scale:

使用PRPOP有四個相關參數:rp_dw0, rp_dw_plus, rp_dw_minus, rp_dw_min, rp_dw_max:

上述代碼中為其預設值。

設定網路層數,訓練資料:

// Set up training datafloat labels[3][5] = {{0,0,0,0,0},{1,1,1,1,1},{0,0,0,0,0}};Mat labelsMat(3, 5, CV_32FC1, labels);float trainingData[3][5] = { {1,2,3,4,5},{111,112,113,114,115}, {21,22,23,24,25} };Mat trainingDataMat(3, 5, CV_32FC1, trainingData);Mat layerSizes=(Mat_<int>(1,5) << 5,2,2,2,5);bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);//CvANN_MLP::SIGMOID_SYM                                           //CvANN_MLP::GAUSSIAN                                           //CvANN_MLP::IDENTITYbp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);

layerSizes設定了有三個隱含層的網路結構:輸入層,三個隱含層,輸出層。輸入層和輸出層節點數均為5,中間隱含層每層有兩個節點。

create第二個參數可以設定每個神經節點的啟用函數,預設為CvANN_MLP::SIGMOID_SYM,即Sigmoid函數,同時提供的其他啟用函數有Gauss和階躍函數。

使用訓練好的網路結構分類新的資料:

然後直接使用predict函數,就可以預測新的節點:

Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);Mat responseMat;bp.predict(sampleMat,responseMat);

完整程式碼:

//The example of using BPNetwork in OpenCV//Coded by L. Wei#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/ml/ml.hpp>#include <iostream>#include <string>using namespace std;using namespace cv;int main(){//Setup the BPNetworkCvANN_MLP bp; // Set up BPNetwork's parametersCvANN_MLP_TrainParams params;params.train_method=CvANN_MLP_TrainParams::BACKPROP;params.bp_dw_scale=0.1;params.bp_moment_scale=0.1;//params.train_method=CvANN_MLP_TrainParams::RPROP;//params.rp_dw0 = 0.1; //params.rp_dw_plus = 1.2; //params.rp_dw_minus = 0.5;//params.rp_dw_min = FLT_EPSILON; //params.rp_dw_max = 50.;// Set up training datafloat labels[3][5] = {{0,0,0,0,0},{1,1,1,1,1},{0,0,0,0,0}};Mat labelsMat(3, 5, CV_32FC1, labels);float trainingData[3][5] = { {1,2,3,4,5},{111,112,113,114,115}, {21,22,23,24,25} };Mat trainingDataMat(3, 5, CV_32FC1, trainingData);Mat layerSizes=(Mat_<int>(1,5) << 5,2,2,2,5);bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);//CvANN_MLP::SIGMOID_SYM                                           //CvANN_MLP::GAUSSIAN                                           //CvANN_MLP::IDENTITYbp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);// Data for visual representationint width = 512, height = 512;Mat image = Mat::zeros(height, width, CV_8UC3);Vec3b green(0,255,0), blue (255,0,0);// Show the decision regions given by the SVMfor (int i = 0; i < image.rows; ++i)for (int j = 0; j < image.cols; ++j){Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);Mat responseMat;bp.predict(sampleMat,responseMat);float* p=responseMat.ptr<float>(0);int response=0;for(int i=0;i<5;i++){//cout<<p[i]<<" ";response+=p[i];}if (response >2)image.at<Vec3b>(j, i)  = green;else  image.at<Vec3b>(j, i)  = blue;}// Show the training dataint thickness = -1;int lineType = 8;circle(image, Point(501,  10), 5, Scalar(  0,   0,   0), thickness, lineType);circle(image, Point(255,  10), 5, Scalar(255, 255, 255), thickness, lineType);circle(image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);circle(image, Point( 10, 501), 5, Scalar(255, 255, 255), thickness, lineType);imwrite("result.png", image);        // save the image imshow("BP Simple Example", image); // show it to the userwaitKey(0);}

結果:

(轉載請註明作者和出處:http://blog.csdn.net/xiaowei_cqu 未經允許請勿用於商業用途)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.