<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OpenCV中神經(jīng)網(wǎng)絡(luò)介紹與使用

          共 5414字,需瀏覽 11分鐘

           ·

          2022-07-22 10:28

          點擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時間送達(dá)

           

          OpenCV中神經(jīng)網(wǎng)絡(luò)介紹與使用
           

          一:神經(jīng)網(wǎng)絡(luò)介紹

          人工神經(jīng)網(wǎng)絡(luò)(ANN) 簡稱神經(jīng)網(wǎng)絡(luò)(NN),最早它的產(chǎn)生跟并行計算有關(guān)系,主要是學(xué)習(xí)生物神經(jīng)元互聯(lián)觸發(fā)實現(xiàn)學(xué)習(xí)、完成對輸入數(shù)據(jù)的分類與識別。最基本的單元是神經(jīng)元,有一個輸入值,一個輸出值,神經(jīng)元本身根據(jù)激活函數(shù)來說決定輸出值,最簡單例子就是感知器

          上述在開始的時候通過隨機初始化生成權(quán)重,然后通過對數(shù)據(jù)X的訓(xùn)練迭代更新權(quán)重直到收斂,過程表示如下:

          上述就是最簡單的單個感知器工作原理。而在實際情況下,神經(jīng)網(wǎng)絡(luò)會有多個感知器,多個層級,我們把輸入數(shù)據(jù)X的層稱為輸入層,最終輸出結(jié)果的層稱為輸出層,中間各個層級統(tǒng)統(tǒng)稱為隱藏層。一個典型的多層感知器(MLP)網(wǎng)絡(luò)如下:

          這個時候我們選擇的激活函數(shù)就不能選擇簡單的二分類函數(shù),OpenCV中支持的激活函數(shù)有三個:

          上述網(wǎng)絡(luò)中的權(quán)重值是未知的,只有通過訓(xùn)練我們才可以得到這些權(quán)重值,生成可用網(wǎng)絡(luò)模型,OpenCV中支持的兩種訓(xùn)練算法分別是:

          • 反向傳播算法

          • RPROP算法 

          二:OpenCV中創(chuàng)建神經(jīng)網(wǎng)絡(luò)
           

          首先創(chuàng)建多層感知器的層數(shù):

          1. Mat_<int> layerSizes(1, 3);

          2. layerSizes(0, 0) = data.cols;

          3. layerSizes(0, 1) = 20;

          4. layerSizes(0, 2) = responses.cols;

          上面幾行代碼是創(chuàng)建一個三層的感知器,輸入層跟數(shù)據(jù)維度有關(guān)系,隱藏層有20個神經(jīng)元、最后是輸出層,一般是類別表示。

          1. Ptr<ANN_MLP> network = ANN_MLP::create();

          2. network->setLayerSizes(layerSizes);

          3. network->setActivationFunction(ANN_MLP::SIGMOID_SYM, 0.1, 0.1);

          4. network->setTrainMethod(ANN_MLP::BACKPROP, 0.1, 0.1);

          上述代碼是創(chuàng)建神經(jīng)網(wǎng)絡(luò),設(shè)置層數(shù)、激活函數(shù)、訓(xùn)練方法等參數(shù)。

          1. Ptr<TrainData> trainData = TrainData::create(data, ROW_SAMPLE, responses);

          2. network->train(trainData);

          上述代碼是創(chuàng)建訓(xùn)練數(shù)據(jù),執(zhí)行網(wǎng)絡(luò)訓(xùn)練

           

          三:代碼演示

          OpenCV3.4中的sample的代碼演示如下:

          1. #include<opencv2/ml/ml.hpp>

          2. usingnamespace std;

          3. usingnamespace cv;

          4. usingnamespace cv::ml;

          5. int main()

          6. {

          7.    //create random training data

          8.    Mat_<float> data(100, 100);

          9.    randn(data, Mat::zeros(1, 1, data.type()), Mat::ones(1, 1, data.type()));

          10.    //half of the samples for each class

          11.    Mat_<float> responses(data.rows, 2);

          12.    for(int i = 0; i<data.rows; ++i)

          13.    {

          14.        if(i < data.rows / 2)

          15.        {

          16.            responses(i, 0) = 1;

          17.            responses(i, 1) = 0;

          18.        }

          19.        else

          20.        {

          21.            responses(i, 0) = 0;

          22.            responses(i, 1) = 1;

          23.        }

          24.    }

          25.    /*

          26.    //example code for just a single response (regression)

          27.    Mat_<float> responses(data.rows, 1);

          28.    for (int i=0; i<responses.rows; ++i)

          29.    responses(i, 0) = i < responses.rows / 2 ? 0 : 1;

          30.    */

          31.    //create the neural network

          32.    Mat_<int> layerSizes(1, 3);

          33.    layerSizes(0, 0) = data.cols;

          34.    layerSizes(0, 1) = 20;

          35.    layerSizes(0, 2) = responses.cols;

          36.    Ptr<ANN_MLP> network = ANN_MLP::create();

          37.    network->setLayerSizes(layerSizes);

          38.    network->setActivationFunction(ANN_MLP::SIGMOID_SYM, 0.1, 0.1);

          39.    network->setTrainMethod(ANN_MLP::BACKPROP, 0.1, 0.1);

          40.    Ptr<TrainData> trainData = TrainData::create(data, ROW_SAMPLE, responses);

          41.    network->train(trainData);

          42.    if(network->isTrained())

          43.    {

          44.        printf("Predict one-vector:\n");

          45.        Mat result;

          46.        network->predict(Mat::ones(1, data.cols, data.type()), result);

          47.        cout << result << endl;

          48.        printf("Predict training data:\n");

          49.        for(int i = 0; i<data.rows; ++i)

          50.        {

          51.            network->predict(data.row(i), result);

          52.            cout << result << endl;

          53.        }

          54.    }

          55.    return0;

          56. }


          四:基于神經(jīng)網(wǎng)絡(luò)的實現(xiàn)mnist數(shù)據(jù)集訓(xùn)練

           

          1. Mat train_images = readImages(0);

          2. normalize(train_images, train_images, -1.0, 1.0, NORM_MINMAX, -1);

          3. Mat train_labels = readLabels(0);

          4. printf("\n read mnist train dataset successfully...\n");

          5. Mat response = Mat::zeros(Size(10, train_labels.rows), CV_32FC1);

          6. for(int i = 0; i < train_labels.rows; i++) {

          7.    int digit = train_labels.at<int>(i, 0);

          8.    response.at<float>(i, digit) = 1;

          9. }

          10. //create the neural network

          11. Mat_<int> layerSizes(1, 3);

          12. layerSizes(0, 0) = train_images.cols;

          13. layerSizes(0, 1) = 100;

          14. layerSizes(0, 2) = 10;

          15. Ptr<ANN_MLP> network = ANN_MLP::create();

          16. network->setLayerSizes(layerSizes);

          17. network->setActivationFunction(ANN_MLP::SIGMOID_SYM, 0.1, 0.1);

          18. network->setTrainMethod(ANN_MLP::BACKPROP, 0.1, 0.1);

          19. network->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 1000, 1e-6));

          20. Ptr<TrainData> trainData = TrainData::create(train_images, ROW_SAMPLE, response);

          21. printf("start network trainning...\n");

          22. network->train(trainData);

          23. if(network->isTrained())

          24. {

          25.    printf("ready to save network model data...\n");

          26.    network->save("D:/vcprojects/images/mnist/ann_knowledge.yml");

          27. }

          28. test_ann_minist();

          29. waitKey(0);

          30. return0;

          好消息!

          小白學(xué)視覺知識星球

          開始面向外開放啦??????




          下載1:OpenCV-Contrib擴展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實戰(zhàn)項目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實戰(zhàn)項目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 81
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大美女人人操人人摸 | 亚洲天堂AV在线观看 | 免费看肏屄 | 亚洲成人网 在线观看 | 久久九九er精品在线 |