OpenCV神经网络ANN代码编译运行与解读(一)
運行環境搭建:參考《VS2013安裝OpenCV4.1版本并搭建一個小程序》
- 基于OpenCV4.1.0中neural_network.cpp的例子代碼。
- 參考了《OpenCV3【神經網絡】ANN_MLP》中的部分代碼和注釋內容。
- BP神經網絡原理可參考《置頂 | 2019書單》中機器學習入門部分:
神經網絡算法:(以后向傳播神經網絡為例:Back Propagation)分為一個輸入層(神經元數量與特征向量維度相同),多個隱藏層,一個輸出層(如果是分類算法,神經元數量與集合數量相同)。每一層的神經元與相鄰層的所有神經元之間都有邊相連,每個神經元的輸入為:(上層所有神經元值與邊的權重乘積求和+本神經元的偏執常量)x激勵函數。先將輸入標準化到區間[0,1],隨機給出每條邊的初始權重在取間[-1,1]內和偏置值。然后逐層向下計算出結果。神經網絡的訓練過程是:給出初始權重和偏執,然后通過訓練集,自動的調整每條邊權重和每個神經元偏置的過程。正向過程全部算完后,根據誤差值(通過loss function,即誤差函數或損失函數)和給定的學習率再按照給定算法反向計算一遍可以得出每條邊的調整后的權重,和每個節點的調整后的偏置。每一組數據可以多次使用直至輸出達到可以接受的氛圍,經過大量數據的正向計算和反向調整后,即可得到訓練好的權重值和偏置值,即訓練好的神經網絡。(相鄰兩層神經元之間的權重可以視為一個矩陣,矩陣的長度和寬度分別是上層神經元和下層神經元的數量,由此整個神經網絡的計算可以視為若干個矩陣的乘法。)
#include <opencv2/ml/ml.hpp> #include<opencv2/core.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> #include <opencv2/imgcodecs.hpp>using namespace std; using namespace cv; using namespace cv::ml;const int SAMPLE_NUMBER = 200; ///樣本數目/// const int FEATURE_NUMBER = 500; ///單個樣本的特征值數目///int main() {//create random training data///data矩陣是訓練數據集///Mat_<float> data(SAMPLE_NUMBER, FEATURE_NUMBER);///訓練數據data///randn(data, Mat::zeros(1, 1, data.type()), Mat::ones(1, 1, data.type()));//隨機生成均值為0,標準差為1的數據dataimshow("", data);waitKey(0);///顯示data/////half of the samples for each class///responses矩陣是有監督訓練的分類結果集///Mat_<float> responses(data.rows, 2);///行數代表樣本數,2為每個樣本對應的標簽向量(1,0)或(0,1)///for (int i = 0; i < data.rows; ++i){if (i < data.rows / 2)///前一半數據標簽為(1,0)///{responses(i, 0) = 1;responses(i, 1) = 0;}else///后一半數據標簽為(1,0)///{responses(i, 0) = 0;responses(i, 1) = 1;}}/*//example code for just a single response (regression)Mat_<float> responses(data.rows, 1);for (int i=0; i<responses.rows; ++i)responses(i, 0) = i < responses.rows / 2 ? 0 : 1;*///create the neural network///三層神經網絡:/// 輸入層神經元數目:樣本的特征值數目////// 隱藏層神經元數目:1////// 輸出層神經元數目:目標分類數目///Mat_<int> layerSizes(1, 3);layerSizes(0, 0) = data.cols;layerSizes(0, 1) = 20;layerSizes(0, 2) = responses.cols;Ptr<ANN_MLP> network = ANN_MLP::create();///創建///network->setLayerSizes(layerSizes);///設置層數///network->setActivationFunction(ANN_MLP::SIGMOID_SYM, 0.1, 0.1);///激活函數:典型S型生長曲線函數///network->setTrainMethod(ANN_MLP::BACKPROP, 0.1, 0.1);///訓練方法:反向傳播算法。Backpropogation///Ptr<TrainData> trainData = TrainData::create(data, ROW_SAMPLE, responses);///創建訓練數據,ROW_SAMPLE表示data中每行為一個樣本///network->train(trainData);///訓練///cout << "========== Train Finish ==========" << endl;if (network->isTrained())///是否訓練完成///{printf("Predict one-vector:\n");Mat result;network->predict(Mat::ones(1, data.cols, data.type()), result);///預測全為1的一個樣本,得到結果result///cout << result << endl;printf("Predict training data:\n");for (int i = 0; i < data.rows; ++i){network->predict(data.row(i), result);///預測訓練樣本,得到結果result///cout << result << endl;}}cout << "========== Display Finish ==========" << endl;network->save("h:\\s.xml");//保存訓練好的網絡cout << "Save trained network ..." << endl;Ptr<ANN_MLP> bp = ANN_MLP::load("h:\\s.xml");///創建并加載保存的網絡/////bp->load();cout << "Load trained network ..." << endl;///仍然使用訓練集進行測試,得到一樣的結果,依次可以證明加載保存的神經網絡是成功的///if (1)///測試加載成功,與訓練的網絡一致///{printf("Predict one-vector:\n");Mat result;bp->predict(Mat::ones(1, data.cols, data.type()), result);cout << result << endl;printf("Predict training data:\n");for (int i = 0; i < data.rows; ++i){bp->predict(data.row(i), result);cout << result << endl;}}Mat I = Mat::ones(10, 10, data.type());cout << endl << I << endl;putchar(1);return 0; }完整工程項目(VS2013)可以從 OpenCV4-ANN神經網絡配套工程項目完整代碼 下載
另外點擊 這里 可以下載一個早期的VS2013+OpenCV2.3.1實現的K近鄰算法(KNN)實現的旋鈕圖片分類工程項目代碼。
總結
以上是生活随笔為你收集整理的OpenCV神经网络ANN代码编译运行与解读(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么微信转帐之前能用,现在不能用了
- 下一篇: 股债利差走势图在哪里看