基于OpenCV与深度学习框架的物体图像识别.docx
《基于OpenCV与深度学习框架的物体图像识别.docx》由会员分享,可在线阅读,更多相关《基于OpenCV与深度学习框架的物体图像识别.docx(12页珍藏版)》请在冰点文库上搜索。
![基于OpenCV与深度学习框架的物体图像识别.docx](https://file1.bingdoc.com/fileroot1/2023-5/16/1a66638f-c77b-4fe9-bc38-09693f8b2ed9/1a66638f-c77b-4fe9-bc38-09693f8b2ed91.gif)
基于OpenCV与深度学习框架的物体图像识别
基于OpenCV与深度学习框架Caffe的物体图像识别
摘要:
本文主要介绍深度神经网络中的卷积神经的相关理论与技术。
研究采用OpenCV深度学习模块DNN与深度学习框架Caffe进行物体识别。
采用OpenCV中的DNN模块加载深度学习框架Caffe模型文件,对物体图像进行识别。
实验结果表明,卷积神经网络在物体的识别方面具有较高的准确率。
一.概述
1.1OpenCV简介
OpenCV于1999年由Intel建立,如今由WillowGarage提供支持。
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。
它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
其最新版本是3.2,于2016年12月23日发布。
OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(IntegratedPerformancePrimitives)得到更快的处理速度。
在其最新版3.2版本中,已经添加了深度神经网络模块,并支持深度学习框架Caffe模型(Caffeframeworkmodels)。
1.2深度学习框架Caffe简介
Caffe(ConvolutionalArchitectureforFastFeatureEmbedding)是一个清晰而高效的深度学习框架,其作者是博士毕业于UCBerkeley的贾扬清,曾在Google工作,现任Facebook研究科学家。
Caffe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接无缝切换。
Caffe的优势是上手快:
模型与相应优化都是以文本形式而非代码形式给出。
Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。
速度快:
能够运行最棒的模型与海量的数据。
Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms。
模块化:
方便扩展到新的任务和设置上。
可以使用Caffe提供的各层类型来定义自己的模型。
开放性:
公开的代码和参考模型用于再现。
二.人工神经网络理论简介
2.1概述
人工神经网络(ArtificialNeuralNetwork,ANN)简称神经网络(NN),是基于生物学中神经网络的基本原理,在理解和抽象了人脑结构和外界刺激响应机制后,以网络拓扑知识为理论基础,模拟人脑的神经系统对复杂信息的处理机制的一种数学模型。
该模型以并行分布的处理能力、高容错性、智能化和自学习等能力为特征,将信息的加工和存储结合在一起,以其独特的知识表示方式和智能化的自适应学习能力,引起各学科领域的关注。
它实际上是一个有大量简单元件相互连接而成的复杂网络,具有高度的非线性,能够进行复杂的逻辑操作和非线性关系实现的系统。
神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。
每个节点代表一种特定的输出函数,称为激活函数(activationfunction)。
每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重(weight),神经网络就是通过这种方式来模拟人类的记忆。
网络的输出则取决于网络的结构、网络的连接方式、权重和激活函数。
而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
神经网络的构筑理念是受到生物的神经网络运作启发而产生的。
人工神经网络则是把对生物神经网络的认识与数学统计模型相结合,借助数学统计工具来实现。
另一方面在人工智能学的人工感知领域,我们通过数学统计学的方法,使神经网络能够具备类似于人的决定能力和简单的判断能力,这种方法是对传统逻辑学演算的进一步延伸。
图2.1基本神经元模型
而深度学习的概念源于人工神经网络的研究。
含多隐层的多层感知器就是一种深度学习结构。
深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。
图2.2深度学习本基本架构示意图
从一个输入中产生一个输出所涉及的计算可以通过一个流向图(flowgraph)来表示:
流向图是一种能够表示计算的图,在这种图中每一个节点表示一个基本的计算以及一个计算的值,计算的结果被应用到这个节点的子节点的值。
考虑这样一个计算集合,它可以被允许在每一个节点和可能的图结构中,并定义了一个函数族。
输入节点没有父节点,输出节点没有子节点。
这种流向图的一个特别属性是深度(depth):
从一个输入到一个输出的最长路径的长度。
2.2神经网络的特点
神经网络是由存储在网络内部的大量神经元通过节点连接权组成的一种信息响应网状拓扑结构,它采用了并行分布式的信号处理机制,因而具有较快的处理速度和较强的容错能力。
神经网络模型用于模拟人脑神经元的活动过程,其中包括对信息的加工、处理、存储、和搜索等过程。
人工神经网络具有如下基本特点:
(1)高度的并行性:
人工神经网络有许多相同的简单处理单元并联组合而成,虽然每一个神经元的功能简单,但大量简单神经元并行处理能力和效果,却十分惊人。
人工神经网络和人类的大脑类似,不但结构上是并行的,它的处理顺序也是并行和同时的。
在同一层内的处理单元都是同时操作的,即神经网络的计算功能分布在多个处理单元上,而一般计算机通常有一个处理单元,其处理顺序是串行的。
人脑神经元之间传递脉冲信号的速度远低于冯·诺依曼计算机的工作速度,前者为毫秒量级,后者的时钟频率通常可达108Hz或更高的速率。
但是,由于人脑是一个大规模并行与串行组合处理系统,因而在许多问题上可以做出快速判断、决策和处理,其速度可以远高于串行结构的冯·诺依曼计算机。
人工神经网络的基本结构模仿人脑,具有并行处理的特征,可以大大提高工作速度。
(2)高度的非线性全局作用:
人工神经网络每个神经元接受大量其他神经元的输入,并通过并行网络产生输出,影响其他神经元,网络之间的这种互相制约和互相影响,实现了从输入状态到输出状态空间的非线性映射,从全局的观点来看,网络整体性能不是网络局部性能的叠加,而表现出某种集体性的行为。
非线性关系是自然界的普遍特性。
大脑的智慧就是一种非线性现象。
人工神经元处于激活或抑制二种不同的状态,这种行为在数学上表现为一种非线性人工神经网络。
具有阈值的神经元构成的网络具有更好的性能,可以提高容错性和存储容量。
(3)联想记忆功能和良好的容错性:
人工神经网络通过自身的特有网络结构将处理的数据信息存储在神经元之间的权值中,具有联想记忆功能,从单一的某个权值并看不出其所记忆的信息内容,因而是分布式的存储形式,这就使得网络有很好的容错性,并可以进行特征提取、缺损模式复原、聚类分析等模式信息处理工作,又可以作模式联想、分类、识别工作。
它可以从不完善的数据和图形中进行学习并做出决定。
由于知识存在于整个系统中,而不只是一个存储单元中,预订比例的结点不参与运算,对整个系统的性能不会产生重大的影响。
能够处理那些有噪声或不完全的数据,具有泛化功能和很强的容错能力。
一个神经网络通常由多个神经元广泛连接而成。
一个系统的整体行为不仅取决于单个神经元的特征,而且可能主要由单元之间的相互作用、相互连接所决定。
通过单元之间的大量连接模拟大脑的非局限性。
联想记忆是非局限性的典型例子。
(4)良好的自适应、自学习功能:
人工神经网络通过学习训练获得网络的权值与结构,呈现出很强的自学习能力和对环境的自适应能力。
神经网络所具有的自学习过程模拟了人的形象思维方法,这是与传统符号逻辑完全不同的一种非逻辑非语言。
自适应性根据所提供的数据,通过学习和训练,找出输入和输出之间的内在关系,从而求取问题的解,而不是依据对问题的经验知识和规则,因而具有自适应功能,这对于弱化权重确定人为因素是十分有益的。
(5)知识的分布存储:
在神经网络中,知识不是存储在特定的存储单元中,而是分布在整个系统中,要存储多个知识就需要很多链接。
在计算机中,只要给定一个地址就可得到一个或一组数据。
在神经网络中要获得存储的知识则采用“联想”的办法,这类似人类和动物的联想记忆。
人类善于根据联想正确识别图形,人工神经网络也是这样。
神经网络采用分布式存储方式表示知识,通过网络对输入信息的响应将激活信号分布在网络神经元上,通过网络训练和学习使得特征被准确地记忆在网络的连接权值上,当同样的模式再次输入时网络就可以进行快速判断。
(6)非凸性:
一个系统的演化方向,在一定条件下将取决于某个特定的状态函数。
例如能量函数,它的极值相应于系统比较稳定的状态。
非凸性是指这种函数有多个极值,故系统具有多个较稳定的平衡态,这将导致系统演化的多样性。
正是神经网络所具有的这种学习和适应能力、自组织、非线性和运算高度并行的能力,解决了传统人工智能对于直觉处理方面的缺陷,例如对非结构化信息、语音模式识别等的处理,使之成功应用于神经专家系统、组合优化、智能控制、预测、模式识别等领域。
2.3卷积神经网络
卷积神经网络(ConvolutionalNeuralNetworks,CNN)就是深度学习结构的一种。
它是一种受视觉神经机制的启发而设计的多层感知器。
1962年,Hubel和Wiesel对猫的视觉皮层细胞的进行了相关研究,并提出了一种称之为感受野(ReceptiveField)的概念。
1980年,Fukushima在感受野概念的基础上提出了神经认知机(Neocognitron)模型,该模型可以看作是CNN的第一个实现,也是感受野概念首次应用于在人工神经网络领域。
图2.3输入图像的部分区域是隐藏神经元的局部感受野
CNN是一种特殊的深层的网络模型,它的特殊性体现在两个方面,一方面它的神经元间的连接是非全连接的,另一方面同一层中某些神经元之间的连接的权重是共享的。
它的局部连接和权值共享的网络结构与生物神经网络非常类似,降低了网络模型的复杂度,减少了权值的数量。
CNN是一种多层感知器,每层由多个二维平面组成,而每个平面由多个独立神经元组成。
这种网络结构对图像各种变化有着很强的适应性,如比例缩放、平移、倾斜或者共他形式的变形等。
CNN采用有监督的方式训练网络模型,网络的结构主要有稀疏连接和权值共享两个特点,详细描述如下:
(1)特征提取。
每个神经元只从上一层单向的接受输入,且接受的是局部区域,因而,整个过程提取的是局部特征。
而上下两层的特征位置具有一一对应的特性,即每一层的特征相对位置没有改变。
(2)特征映射。
CNN中每个隐藏层都由包含多个特征映射图,每个特征映射图都是一个二维平面图,其中的神经元共享相同的权值集。
这种网络结构和构建形式对图像的平移、缩放等形变具有很强的适应性,而且权值共享机制也减少了训练参数的数量。
(3)子抽样。
子采样层通常与卷积层相连,并对上一层特征映射图进行局部子采样,得到分辨率较低的特征映射图。
子采样的过程,可以降低输出对图像变形的敏感度。
典型的CNN包括四种基本结构层:
输入层、输出层、卷积层和采样层,如图2.1所示的是一个手写字体识别系统LeNet-5的CNN结构图。
图2.4手写字体识别LeNet-5系统的CNN结构图
LeNet-5共有7层,不包含输入,每层都包含可训练参数(连接权重)。
输入图像为32*32大小。
这要比Mnist数据库(一个公认的手写数据库)中最大的字母还大。
这样做的原因是希望潜在的明显特征如笔画断电或角点能够出现在最高层特征监测子感受野的中心。
卷积层C1和卷积层C3都使用5×5的卷积核;卷积层C1中包括6个特征面,每个特征面的大小为28×28(28=32-5+11。
采样层S2和S4都使用2x2的采样核,S2产生8个14X14(14=28/2)的特征面;第二层卷积层C3产生20个特征面,每个特征面的大小为10X10(10=14—5+1);采样层S4产生20个5X5(5=10/2)的特征面;第三层卷积层C5采用全连接方式,产生120个特征面,每个特征面的大小为1×1,实际上只是120个点;最右的一层是输出层,采用全连接的形式使用分类器进行分类输出。
三.实验过程
3.1实验环境
本次实验是在windows7系统下,使用C++编程语言,基于OpenCV3.2与VisualStudio2015进行,我们需要首先在各自的官网下载安装文件进行安装。
其中OpenCV3.2需要在系统环境变量中添加可执行文件库,并在工程属性中添加依赖库和头文件库。
本次实验是基于Caffe框架模型。
由于个人没有足够的训练样本,且受限于个人电脑的性能,无法在规定时间内完成卷积神经网络训练,因此,使用Google发布的已经训练好的Caffe模型。
3.2具体实现
首先,读取并初始化路径prototxt和caffemodel文件的路径。
Netnet=dnn:
:
readNetFromCaffe(modelTxt,modelBin);
载入Caffe模型文件:
Ptr:
Importer>importer;
importer=dnn:
:
createCaffeImporter(modelTxt,modelBin);
检查神经网络文件读取:
if(net.empty())
{
std:
:
cerr<<"Can'tloadnetworkbyusingthefollowingfiles:
"<:
endl;
std:
:
cerr<<"prototxt:
"<:
endl;
std:
:
cerr<<"caffemodel:
"<:
endl;
std:
:
cerr<<"bvlc_googlenet.caffemodelcanbedownloadedhere:
"<:
endl;
std:
:
cerr<<"http:
//dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel"<:
endl;
exit(-1);
}
把读入的图像文件转换为Caffe模型可支持的类型:
Matimg=imread(imageFile);
if(img.empty())
{
std:
:
cerr<<"Can'treadimagefromthefile:
"<:
endl;
exit(-1);
}
resize(img,img,Size(224,224));//GoogLeNetacceptsonly224x224RGB-images
MatinputBlob=blobFromImage(img);
调整图像大小并更改其通道顺序。
现在的图像实际上是一个224x224x3的三维数组。
创建神经网络并初始化:
dnn:
:
Netnet;
importer->populateNet(net);
importer.release();
输入图像数据:
net.setBlob(".data",inputBlob);
计算神经网络的输出:
net.forward();
取出prob层的输出,确定最终的分类:
dnn:
:
Blobprob=net.getBlob("prob");
intclassId;
doubleclassProb;
getMaxClass(prob,&classId,&classProb);
输出识别结果:
std:
:
vectorclassNames=readClassNames();
std:
:
cout<<"Bestclass:
#"<:
endl;
std:
:
cout<<"Probability:
"<:
endl;
四.实验结果
4.1识别效果展示
为了测试识别效果,这里选择了10张不同种类的图片进行测试。
其中5组具体识别效果见下图:
图4.1物体识别测试结果第1组-猫
图4.2物体识别测试结果第2组-水瓶
图4.3物体识别测试结果第3组-狗
图4.4物体识别测试结果第4组-航天飞机
图4.5物体识别测试结果第5组-汽车
4.2识别结果统计
表4.1识别结果统计
测试组数
测试图像类别
识别结果
结果可信概率
1
猫
猫
41.93%
2
狗
狗
92.14%
3
汽车
跑车
63.84%
4
航天飞机
航天飞机
99.96%
5
纯净水瓶
水瓶
68.46%
6
木桌
桌
58.98%
7
书
工具书
62.88%
8
乒乓球
乒乓球
84.56%
9
运动鞋
运动鞋
78.89%
10
自行车
自行车
69.97%
平均可信度
72.16%
五.总结
本文首先简要介绍了深度神经网络中的卷积神经的相关理论与技术。
然后采用OpenCV深度学习模块DNN与深度学习框架Caffe进行物体识别。
具体过程是使用OpenCV中的DNN模块加载深度学习框架Caffe模型文件,完成卷积神经网络的创建和训练,用该网络对测试物体图像进行识别。
实验结果表明,卷积神经网络在物体的识别方面具有较高的准确率和可信度。
参考文献
[1]ZipserD,AndersenRA.Aback-propagationprogrammednetworkthatsimulatesresponsepropertiesofasubsetofposteriorparietalneuron[J],Nature,1988,331(6158):
679-684
[2]蒋宗礼.人工神经网络导论[M].高等教育出版社.2001.8
[3]DeepLearning(深度学习)学习笔记整理系列[EBOL].
[4]Fengbingchun.人工神经网络简介[EBOL].