专栏首页贾志刚-OpenCV学堂OpenCV中神经网络介绍与使用

OpenCV中神经网络介绍与使用

OpenCV中神经网络介绍与使用

一:神经网络介绍

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

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

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

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

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

  • 反向传播算法
  • RPROP算法

二:OpenCV中创建神经网络

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

Mat_<int> layerSizes(1, 3);

layerSizes(0, 0) = data.cols;

layerSizes(0, 1) = 20;

layerSizes(0, 2) = responses.cols;

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

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

network->setLayerSizes(layerSizes);

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

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

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

Ptr<TrainData> trainData = TrainData::create(data, ROW_SAMPLE, responses);network->train(trainData);

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

三:代码演示

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

#include <opencv2/ml/ml.hpp>


using namespace std;

using namespace cv;

using namespace cv::ml;


int main()

{

    //create random training data

    Mat_<float> data(100, 100);

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


    //half of the samples for each class

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

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

    {

        if (i < data.rows / 2)

        {

            responses(i, 0) = 1;

            responses(i, 1) = 0;

        }

        else

        {

            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

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

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

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


    network->train(trainData);

    if (network->isTrained())

    {

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

        Mat result;

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

        {

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

            cout << result << endl;

        }

    }


    return 0;

}



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

Mat train_images = readImages(0);

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

Mat train_labels = readLabels(0);

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

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

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

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

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

}


//create the neural network

Mat_<int> layerSizes(1, 3);

layerSizes(0, 0) = train_images.cols;

layerSizes(0, 1) = 100;

layerSizes(0, 2) = 10;


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

network->setLayerSizes(layerSizes);

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

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

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

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

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

network->train(trainData);

if (network->isTrained())

{

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

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

}


test_ann_minist();

waitKey(0);

return 0;

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL),作者:gloomyfish

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenCV实现年龄与性别预测

    前面我写了很多篇关于OpenCV DNN应用相关的文章,这里再来一篇文章,用OpenCV DNN实现一个很有趣好玩的例子,基于Caffe的预训练模型实现年龄与性...

    OpenCV学堂
  • 从入门到冠军 中国移动人群画像赛TOP1经验分享

    郑雨轩,Datawhale数据科学团队负责人,长期活跃在国内外数据竞赛领域,拥有较为丰富的竞赛经验,最近比赛经历:

    OpenCV学堂
  • 轻松学Pytorch-使用卷积神经网络实现图像分类

    大家好,本篇教程的贡献者来自社区投稿作者【陨星落云】,使用CIFAR-10数据集进行图像分类。该数据集中的图像是彩色小图像,其中被分为了十类。一些示例图像,如下...

    OpenCV学堂
  • Python常见数据框操作①

    用户1359560
  • Python从零开始第五章生物信息学⑥GEO数据库实战分析(1)目录正文

    GEO数据库全称GENE EXPRESSION OMNIBUS,是由美国国立生物技术信息中心NCBI创建并维护的基因表达数据库。它创建于2000年,收录了世界各...

    用户1359560
  • 数据处理利器pandas入门

    想入门 Pandas,那么首先需要了解Pandas中的数据结构。因为Pandas中数据操作依赖于数据结构对象。Pandas中最常用的数据结构是 Series ...

    zhangqibot
  • R编程-实例

    barplot(data,col = cols,las=2,xlim=c(0,10),sub="Number of cock_SNPs(M)",horiz =T...

    西游东行
  • pandas(一)

    data= pd.Series([0.25,0.5,0.75,1.0])   默认索引是数字

    py3study
  • Python中的DataFrame模块学

      python 3.6.8 Windows x86 executable installer

    py3study
  • 图像处理的滤镜算法

    将颜色的RGB设置为相同的值即可使得图片为灰色,一般处理方法有: 1、取三种颜色的平均值 2、取三种颜色的最大值(最小值) 3、加权平均值:0.3R + ...

    用户1515472

扫码关注云+社区

领取腾讯云代金券