OpenCV中神经网络介绍与使用
时间:2022-05-07
本文章向大家介绍OpenCV中神经网络介绍与使用,主要内容包括OpenCV中神经网络介绍与使用、二:OpenCV中创建神经网络、三:代码演示、四:基于神经网络的实现mnist数据集训练、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
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;
- 遇见requestAnimationFrame
- 认识createDocumentFragment
- 点击穿透原理及解决
- 如何使用Intellij搭建Spark开发环境
- 如何重置Cloudera Manager的admin密码
- 如何在CDH集群安装Anaconda&搭建Python私有源
- 如何使用Python Impyla客户端连接Hive和Impala
- 如何在Windows Server2008搭建DNS服务并配置泛域名解析
- 如何通过CM API优雅的获取元数据库密码
- CM启动报InnoDB engine not found分析
- 如何在Hue中使用Sentry
- 如何在Redhat中配置R环境
- 如何在Redhat中安装R的包及搭建R的私有源
- 什么是sparklyr
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现 Shape属性gradient 渐变效果
- 1K GitHub star+ 的项目是如何炼成的?
- Android属性动画实现图片从左到右逐渐消失
- Android实现清除应用缓存功能
- VBlog的代码结构,使用vue-element,vue-vant组件开发的纯前端博客
- Android仿微信视屏悬浮窗效果
- Android仿QQ可拉伸头部控件
- android使用surfaceview+MediaPlayer播放视频
- Android性能之冷启动优化详析
- Android自定义View实现地铁显示牌效果
- Android自定义控件实现望远镜效果
- Android自定义View实现点赞控件
- Android自定义View实现投票进度条
- 国外Reservo一款非常棒的商业图床程序
- 详解Android v1、v2、v3签名(小结)