OpenCV——ANN神經網絡


ANN—— Artificial Neural Networks 人工神經網絡

//定義人工神經網絡
    CvANN_MLP bp; 
    // Set up BPNetwork's parameters
    CvANN_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.;

兩種訓練方法:BACKPROP 與 RPROP

BACKPROP的兩個參數:

RPROP的四個參數:

 

//  training data
    float 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);
// layerSizes設置了有三個隱含層的網絡結構:輸入層,三個隱含層,輸出層。輸入層和輸出層節點數均為5,中間隱含層每層有兩個節點

    Mat layerSizes=(Mat_<int>(1,5) << 5,2,2,2,5);

//create第二個參數可以設置每個神經節點的激活函數,默認為CvANN_MLP::SIGMOID_SYM,即Sigmoid函數
//同時提供的其他激活函數有Gauss(CvANN_mlp::GAUSSIAN)和階躍函數(CvANN_MLP::IDENTITY)。
 bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);   //CvANN_MLP::SIGMOID_SYM  
bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);
//預測新節點
Mat sampleMat = (Mat_<float>(1,5) << i,j,0,0,0);  
            Mat responseMat;  
            bp.predict(sampleMat,responseMat);  

float CvANN_MLP::predict(constMat&inputs,Mat&outputs)

圖像進行特征提取,把它保存在inputs里,通過調用predict函數,我們得到一個輸出向量,它是一個1*nClass的行向量,

其中每一列說明它與該類的相似程度(0-1之間),也可以說是置信度。我們只用對output求一個最大值,就可得到結果。

完整代碼:

#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()  
{  
    CvANN_MLP bp;   
    
    CvANN_MLP_TrainParams params;  
    params.train_method=CvANN_MLP_TrainParams::BACKPROP;  //(Back Propagation,BP)反向傳播算法
    params.bp_dw_scale=0.1;  
    params.bp_moment_scale=0.1;  

    float labels[10][2] = {{0.9,0.1},{0.1,0.9},{0.9,0.1},{0.1,0.9},{0.9,0.1},{0.9,0.1},{0.1,0.9},{0.1,0.9},{0.9,0.1},{0.9,0.1}};  
    //這里對於樣本標記為0.1和0.9而非0和1,主要是考慮到sigmoid函數的輸出為一般為0和1之間的數,只有在輸入趨近於-∞和+∞才逐漸趨近於0和1,而不可能達到。
    Mat labelsMat(10, 2, CV_32FC1, labels);  

    float trainingData[10][2] = { {11,12},{111,112}, {21,22}, {211,212},{51,32}, {71,42}, {441,412},{311,312}, {41,62}, {81,52} };  
    Mat trainingDataMat(10, 2, CV_32FC1, trainingData);  
    Mat layerSizes=(Mat_<int>(1,5) << 2, 2, 2, 2, 2);                   //5層:輸入層,3層隱藏層和輸出層,每層均為兩個perceptron
    bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);
    bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);  
    int width = 512, height = 512;  
    Mat image = Mat::zeros(height, width, CV_8UC3);  
    Vec3b green(0,255,0), blue (255,0,0);  

    for (int i = 0; i < image.rows; ++i)
    {
        for (int j = 0; j < image.cols; ++j)  
        {  
            Mat sampleMat = (Mat_<float>(1,2) << i,j);  
            Mat responseMat;  
            bp.predict(sampleMat,responseMat);  
            float* p=responseMat.ptr<float>(0);  
            //
            if (p[0] > p[1])
            {
                image.at<Vec3b>(j, i)  = green;  
            } 
            else
            {
                image.at<Vec3b>(j, i)  = blue;  
            }
        }  
    }
    // Show the training data  
    int thickness = -1;  
    int lineType = 8;  
    circle( image, Point(111,  112), 5, Scalar(  0,   0,   0), thickness, lineType); 
    circle( image, Point(211,  212), 5, Scalar(  0,   0,   0), thickness, lineType);  
    circle( image, Point(441,  412), 5, Scalar(  0,   0,   0), thickness, lineType);  
    circle( image, Point(311,  312), 5, Scalar(  0,   0,   0), thickness, lineType);  
    circle( image, Point(11,  12), 5, Scalar(255, 255, 255), thickness, lineType);  
    circle( image, Point(21, 22), 5, Scalar(255, 255, 255), thickness, lineType);       
    circle( image, Point(51,  32), 5, Scalar(255, 255, 255), thickness, lineType);  
    circle( image, Point(71, 42), 5, Scalar(255, 255, 255), thickness, lineType);       
    circle( image, Point(41,  62), 5, Scalar(255, 255, 255), thickness, lineType);  
    circle( image, Point(81, 52), 5, Scalar(255, 255, 255), thickness, lineType);       

    imwrite("result.png", image);        // save the image   

    imshow("BP Simple Example", image); // show it to the user  
    waitKey(0);  

    return 0;
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM