abstract: 1.OpenCV中的神經(jīng)網(wǎng)絡(luò)OpenCV中封裝了類CvANN_MLP,因而神經(jīng)網(wǎng)絡(luò)利用很方便。 首先構(gòu)建一個網(wǎng)絡(luò)模型: CvANN_MLP ann; Mat structure(1,3,CV_32SC1); structure.at<uchar>(0) = 10;  
1.OpenCV中的神經(jīng)網(wǎng)絡(luò)
OpenCV中封裝了類CvANN_MLP,因而神經(jīng)網(wǎng)絡(luò)利用很方便。
首先構(gòu)建一個網(wǎng)絡(luò)模型:
CvANN_MLP ann;
Mat structure(1,3,CV_32SC1);
structure.at<uchar>(0) = 10;
structure.at<uchar>(0) = 4;
structure.at<uchar>(0) = 2; // structure中表示每一層中神經(jīng)元數(shù)目
ann.create(structure,CvANN_MLP::SIGMOID_SYM,1,1); // 很明顯第二個參數(shù)選擇的是激活函數(shù)的類型
然后需要對訓(xùn)練數(shù)據(jù)放在兩個Mat結(jié)構(gòu)中。第一個是存儲訓(xùn)練數(shù)據(jù)的Mat train,第二個是存儲類別的Mat label。其中,train的每一行代表一個訓(xùn)練樣例,label的對應(yīng)的一行是訓(xùn)練樣例的類別。比如有25個屬于7個類別的訓(xùn)練樣例,每個樣例為16維向量。則train結(jié)構(gòu)為25*16,label結(jié)構(gòu)為25*7。需要解釋的是類別數(shù)據(jù),label中一行表示樣例所處類別,如果屬于第一類則為(1,0,0,0,0,0,0),第二類為(0,1,0,0,0,0,0)...
接下來需要給ann提供一個樣例的權(quán)重向量Mat weight,它標(biāo)記的是訓(xùn)練樣例的權(quán)重,這里都初始化為1:
Mat weight;
weight.ones(1,25,CV_32FC1);
接下來可以做訓(xùn)練了:
ann.train(train,label,weight);
訓(xùn)練結(jié)束后用ann來做分類,輸入為Mat testSample,testSample為1*16的向量,輸出為Mat output,output為1*7向量:
ann.predict(testSample,output);
最后找到output中的最大值就知道所屬類別maxPos了:
int maxPos;
double maxVal;
minMaxLoc(output,0,&maxVal,0,&maxPos);
2.神經(jīng)網(wǎng)絡(luò)的訓(xùn)練
int CvANN_MLP::train(constMat& inputs, constMat& outputs,
constMat& sampleWeights, constMat& sampleIdx=Mat(),
CvANN_MLP_TrainParams params=CvANN_MLP_TrainParams(), intflags=0 );
1) inputs:輸入矩陣。它存儲了所有訓(xùn)練樣本的特征。假設(shè)所有樣本總數(shù)為nSamples,而我們提取的特征維數(shù)為ndims,
則inputs是一個nSamples?ndims的矩陣,每個樣本的特征占一行。
2) outputs:輸出矩陣。我們實際在訓(xùn)練中,我們知道每個樣本所屬的種類,假設(shè)一共有nClass類。那么我們將outputs設(shè)置為
一個nSample*nClass列的矩陣,每一行表示一個樣本的預(yù)期輸出結(jié)果,該樣本所屬的那類對應(yīng)的列設(shè)置為1,其他都為0。
比如我們需要識別0-9這10個數(shù)字,則總的類數(shù)為10類,那么樣本數(shù)字“3”的預(yù)期輸出為[0,0,1,0,0,0,0,0,0,0];
3) sampleWeights:一個在使用RPROP方法訓(xùn)練時才需要的數(shù)據(jù),所以這里我們不設(shè)置,直接設(shè)置為Mat()即可。
4) sampleIdx:相當(dāng)于一個遮罩,它指定哪些行的數(shù)據(jù)參與訓(xùn)練。如果設(shè)置為Mat(),則所有行都參與。
5) params:這個在剛才已經(jīng)說過了,是訓(xùn)練相關(guān)的參數(shù)。
3.神經(jīng)網(wǎng)絡(luò)的測試
float CvANN_MLP::predict(constMat&inputs,Mat&outputs)
圖像進(jìn)行特征提取,把它保存在inputs里,通過調(diào)用predict函數(shù),我們得到一個輸出向量,它是一個1*nClass的行向量,
其中每一列說明它與該類的相似程度(0-1之間),也可以說是置信度。我們只用對output求一個最大值,就可得到結(jié)果。
這個函數(shù)的返回值是一個無用的float值,可以忽略。