OpenCV中神经网络介绍与使用

小白学视觉

共 5414字,需浏览 11分钟

 · 2022-07-22

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

 

OpenCV中神经网络介绍与使用
 

一:神经网络介绍

人工神经网络(ANN) 简称神经网络(NN),最早它的产生跟并行计算有关系,主要是学习生物神经元互联触发实现学习、完成对输入数据的分类与识别。最基本的单元是神经元,有一个输入值,一个输出值,神经元本身根据激活函数来说决定输出值,最简单例子就是感知器

上述在开始的时候通过随机初始化生成权重,然后通过对数据X的训练迭代更新权重直到收敛,过程表示如下:

上述就是最简单的单个感知器工作原理。而在实际情况下,神经网络会有多个感知器,多个层级,我们把输入数据X的层称为输入层,最终输出结果的层称为输出层,中间各个层级统统称为隐藏层。一个典型的多层感知器(MLP)网络如下:

这个时候我们选择的激活函数就不能选择简单的二分类函数,OpenCV中支持的激活函数有三个:

上述网络中的权重值是未知的,只有通过训练我们才可以得到这些权重值,生成可用网络模型,OpenCV中支持的两种训练算法分别是:

  • 反向传播算法

  • RPROP算法 

二:OpenCV中创建神经网络
 

首先创建多层感知器的层数:

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

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

  3. layerSizes(0, 1) = 20;

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

上面几行代码是创建一个三层的感知器,输入层跟数据维度有关系,隐藏层有20个神经元、最后是输出层,一般是类别表示。

  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);

上述代码是创建神经网络,设置层数、激活函数、训练方法等参数。

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

  2. network->train(trainData);

上述代码是创建训练数据,执行网络训练

 

三:代码演示

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. }


四:基于神经网络的实现mnist数据集训练

 

  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;

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇




下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 42
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报