基于MATLAB的BP神经网络的数字图像识别
基于MATLAB BP神经网络的数字图像识别
基于MATLAB BP神经网络的数字图像识别
【摘要】随着现代社会的发展,信息的形式和数量正在迅猛增长。其中很大一部分是图像,图像可以把事物生动的呈现在我们面前,让我们更直观地接受信息。同时,计算机已经作为一种人们普遍使用的工具为人们的生产生活服务。如今我们也可以把这些技术应用在交通领域。作为智能交通系统(InteUigent Traffic System,简称ITS)中的一个重要组成部分的车牌识别技术,当然就是其中的重点研究对象。车辆牌照识别(License P1ate Recognition,简称LPR),是一种关于计算机的包括图像处理、数学技术、数据库、信息技术以及智能技术于一体的综合技术。用MATLAB做车牌识别比用其他工具有许多优势,因为MATLAB在图像的灰度化、二值化、滤波等方面都有很大优势,所以,本次实验我们利用MA TLAB的这些优点来对车牌进行识别。
【关键词】BP神经网络;图像识别;字符识别;特征提取;车牌;Matlab
一课题研究背景
(一)图像识别的提出及应用
随着信息化时代的不断发展,人们越来越多地使用信息化的手段来解决各种问题——办公自动化、先进制造业、电子商务等利用计算机技术而产生的新兴行业正不断靠近我们的生活。在信息社会中,我们每天都接触大量的数据——工作数据、个人数据、无意间获得的数据等——在这些数据中,有些数据需要我们人工处理,而有些则可以利用计算机快速准确的完成——字符识别就是其中的一个范畴。
字符识别是一种图像识别技术,他的输入是一张带有某种字符的图片,而输出则是计算机中对于图片中字符的反应结果。所以,可以广泛的应用于各种领域:如,车牌检测、手写识别、自动阅读器、机器视觉……在生活生产的各个方面都起到了非常重要的作用。(二)图像识别技术的发展趋势
虽然图像识别技术还不是非常成熟,但现其已经有了很多可喜的成果,比如图像模式识别,图像文字识别。并且其还在飞速的发展着,图像识别的应用正朝着不同的领域渗透着,像计算机图像生成,图像传输与图像通信,高清晰度电视,机器人视觉及图像测量,办公室自动化,像跟踪及光学制导,医用图像处理与材料分析中的图像分析系统,遥感图像处理和空间探测,图像变形技术等等。从所列举的图像技术的多方面应用及其理论基础可以看出,它们无一不涉及高科技的前沿课题,充分说明了图像技术是前沿性与基础性的有机统一。
可以预计21世纪,图像技术将经历一个飞跃发展的成熟阶段,为深入人民生活创造新的文化环境,成为提高生产的自动化、智能化水平的基础科学之一。图像技术的基础性研究,特别是结合人工智能与视觉处理的新算法,从更高水平提取图像信息的丰富内涵,成为人类运算量最大、直观性最强,与现实世界直接联系的视觉和“形象思维”这一智能的模拟和复现,是一个很难而重要的任务。“图像技术”这一上世纪后期诞生的高科技之花,其前途是不可限量的。
随着21世纪经济全球化和信息时代的发展,作为信息来源的自动检测、图像识别技术越来越受到人们的重视。近年来计算机的飞速发展和数字图像处理技术的日趋成熟,为传统的交通管理带来了巨大转变。图像处理技术发展相当快,而其中对汽车牌照等相关信息的自动采集和管理对于交通车辆管理、园区车辆管理、停车场管理、交警稽查等方面有着十分重要的意义,成为信息处理技术的一项重要研究课题。汽车牌照自动识
别系统就是在这样的背景与目的下进行研究开发的。车辆牌照识别(License Plate Recognition,
LPR)技术作为交通管理自动化的重要手段之一,其任务是分析、处理汽车监控图像,自动识别汽车牌照号码,并进行相关智能化数据库管理。
(三)图像识别的机理
图像识别是人工智能的一个重要领域。为了编制模拟人类图像识别活动的计算机程序,人们提出了不同的图像识别模型。例如模板匹配模型。这种模型认为,识别某个图像,必须在过去的经验中有这个图像的记忆模式,又叫模板。当前的刺激如果能与大脑中的模板相匹配,这个图像也就被识别了。例如有一个字母A,如果在脑中有个A模板,字母A的大小、方位、形状都与这个A模板完全一致,字母A就被识别了。这个模型简单明了,也容易得到实际应用。但这种模型强调图像必须与脑中的模板完全符合才能加以识别,而事实上人不仅能识别与脑中的模板完全一致的图像,也能识别与模板不完全一致的图像。例如,人们不仅能识别某一个具体的字母A,也能识别印刷体的、手写体的、方向不正、大小不同的各种字母A。同时,人能识别的图像是大量的,如果所识别的每一个图像在脑中都有一个相应的模板,也是不可能的。为了解决模板匹配模型存在的问题,格式塔心理学家又提出了一个原型匹配模型。这种模型认为,在长时记忆中存储的并不是所要识别的无数个模板,而是图像的某些“相似性”。从图像中抽象出来的“相似性”就可作为原型,拿它来检验所要识别的图像。如果能找到一个相似的原型,这个图像也就被识别了。这种模型从神经上和记忆探寻的过程上来看,都比模板匹配模型更适宜,而且还能说明对一些不规则的,但某些方面与原型相似的图像的识别。但是,这种模型没有说明人是怎样对相似的“刺激”进行辨别和加工的,它也难以在计算机程序中得到实现。因此又有人提出了一个更复杂的模型,即“泛魔”识别模型。
所谓泛魔,即这个模型把图像识别过程分为不同的层次,每一层次都有承担不同职责的特征分析机制称作一种"小魔鬼",由于有许许多多这样的机制在起作用,因此叫做“泛魔”识别模型。这一模型的特点在于它的层次的划分。
自20世纪60年代初期出现第一代产品开始,经过30多年的不断发展改进,字符识别技术的研究已经取得了令人瞩目的成果。目前印刷体的识别技术已经达到较高水平。识别范围也从原来指定的印刷体数字、英文字母和部分符号,发展成为可以自动进行版面分析、表格识别,实现混合文字、多字体、多字号、横竖混排识别的强大的计算机信息快速录入工具。对印刷体汉字的识别率达到98%以上,即使对印刷质量较差的文字其识别率也达到95%以上。
(四)本文的研究内容
本文将以车牌作为研究对象,从数字、字母、汉字开始逐步提高识别的范围,针对图片中的字符提出一套切实可行的识别算法,并且在试验中不断改进。在开发期间,以功能强大的Matlab作为编程平台,利用一些行之有效的技术提高识别算法的性能,从而完成相应的识别软件。
二算法分析与设计
(一)特征分析
中国汽车牌照中使用的字符集包括59个汉字、25个大写英文字母(字母不包含I)和10个阿拉伯数(0-9),三种类型共94个,且都是印刷体,结构固定、笔画规范。牌照在图像中占有的高度从20个像素到50个像素不等。对于国内牌照来说,一般的车辆正面牌照中水平排列
着7个字符,其标准车牌样式:XlX2·X3X4X5X6X7;X1是各省,直辖市的简称:如“苏”、“桂”,或者特种车辆类型如“警”;X2是英文字母,表示各省的不同地区;X3从是英文字母或阿拉伯数字;X3X4X5X6X7均是阿拉伯数字。
(二)技术路线
1 原理分析
由于车辆牌照是机动车唯一的管理标识符号,在交通管理中具有不可替代的作用,因此车辆牌照识别系统应具有很高的识别正确率,对环境光照条件、拍摄位置和车辆行驶速度等因素的影响应有较大的容阈,并且要求满足实时性要求。
图2-1 牌照识别系统原理图
该系统是计算机图像处理与字符识别技术在智能化交通管理系统中的应用,它主要由牌照图像的采集和预处理、牌照区域的定位和提取、牌照字符的分割和识别等几个部分组成,如图1所示。其基本工作过程如下:
(1)当行驶的车辆经过时,触发埋设在固定位置的传感器,系统被唤醒处于工作状态;一旦连接摄像头光快门的光电传感器被触发,设置在车辆前方、后方和侧面的相机同时拍摄下车辆图像;
(2)由摄像机或CCD摄像头拍摄的含有车辆牌照的图像通视频卡输入计算机进行预处理,图像预处理包括图像转换、图像增强、滤波和水平矫正等;
(3)由检索模块进行牌照搜索与检测,定位并分割出包含牌照字符号码的矩形区域;(4)对牌照字符进行二值化并分割出单个字符,经归一化后输入字符识别系统进行识别。
2 总体设计方案
车辆牌照识别整个系统主要是由车牌定位和字符识别两部分组成,其中车牌定位又可以分为图像预处理及边缘提取模块和牌照的定位及分割模块;字符识别可以分为字符分割与特征提取和单个字符识别两个模块。
为了用于牌照的分割和牌照字符的识别,原始图像应具有适当的亮度,较大的对比度和清晰可辩的牌照图像。但由于该系统的摄像部分工作于开放的户外环境,加之车辆牌照的整洁度、自然光照条件、拍摄时摄像机与牌照的距离和角度以及车辆行驶速度等因素的影响,
牌照图像可能出现模糊、歪斜和缺损等严重缺陷,因此需要对原始图像进行识别前的预处理。
牌照的定位和分割是牌照识别系统的关键技术之一,其主要目的是在经图像预处理后的原始灰度图像中确定牌照的具体位置,并将包含牌照字符的一块子图像从整个图像中分割出来,供字符识别子系统识别之用,分割的准确与否直接关系到整个牌照字符识别系统的识别率。
由于拍摄时的光照条件、牌照的整洁程度的影响,和摄像机的焦距调整、镜头的光学畸变所产生的噪声都会不同程度地造成牌照字符的边界模糊、细节不清、笔划断开或粗细不均,加上牌照上的污斑等缺陷,致使字符提取困难,进而影响字符识别的准确性。因此,需要对字符在识别之前再进行一次针对性的处理。
车牌识别的最终目的就是对车牌上的文字进行识别。主要应用的为模板匹配方法。
因为系统运行的过程中,主要进行的都是图像处理,在这个过程中要进行大量的数据处理,所以处理器和内存要求比较高,CPU要求主频在600HZ及以上,内存在128MB及以上。系统可以运行于Windows98、Windows2000或者Windows XP操作系统下,程序调试时使用matlab。三具体技术路线
(1)图像预处理及边缘提取
在车牌自动识别系统中,车辆图像是通过图像采集卡将运动的车辆图像抓拍下来,并以位图的格式存放到系统内存中,这时的车辆数字图像虽然没有被人为损伤过,但在实际道路上行驶的车辆常会因为各种各样的原因使得所拍摄的车辆图像效果不理想,如外界光线对车牌的不均匀反射、极强阳光形成的车牌处阴影、摄像机快门值设置过大而引起的车辆图像拖影、摄像头聚焦或后背焦没有调整到位而形成的车辆图像不清晰、由于视频传输线而引起的图像质量下降、所拍摄图像中存在的噪声干扰、所安装的车牌不规范或车辆行驶变形等,这些都给车牌的模糊识别增加了难度。图像预处理技术可最大限度提高车牌正确识别率,这些图像
图3-1 预处理及边缘提取流程图
1、图像的采集与转换
考虑到现有牌照的字符与背景的颜色搭配一般有蓝底白字、黄底黑字、白底红字、绿底白字和黑底白字等几种,利用不同的色彩通道就可以将区域与背景明显地区分出来,例如,对蓝底白字这种最常见的牌照,采用蓝色B通道时牌照区域为一亮的矩形,而牌照字符在区
域中并不呈现。因为蓝色(255,0,0)与白色(255,255,255)在通道中并无区分,而在G 、R 通道或是灰度图像中并无此便利。同理对白底黑字的牌照可用R 通道,绿底白字的牌照可以用G 通道就可以明显呈现出牌照区域的位置,便于后续处理。原图、灰度图及其直方图见图2与图3。对于将彩色图像转换成灰度图像时,图像灰度值可由下面的公式计算:
R G B G 302.0588.0110.0++= (3-1) 3R
G B G ++=(3-2)
图 3-2 原图和它的灰度图以及灰度直方图2、边缘提取
边缘是指图像局部亮度变化显著的部分,是图像风、纹理特征提取和形状特征提取等图像分析的重要基础。所以在此我们要对图像进行边缘检测。图象增强处理对图象牌照的可辨认度的改善和简化后续的牌照字符定位和分割的难度都是很有必要的。增强图象对比度度的方法有:灰度线性变换、图象平滑处理等。
(1)灰度校正
由于牌照图像在拍摄时受到种种条件的限制和干扰,图像的灰度值往往与实际景物不完全匹配,这将直接影响到图像的后续处理。如果造成这种影响的原因主要是由于被摄物体的远近不同,使得图像中央区域和边缘区域的灰度失衡,或是由于摄像头在扫描时各点的灵敏度有较大的差异而产生图像灰度失真,或是由于曝光不足而使得图像的灰度变化范围很窄。这时就可以采用灰度校正的方法来处理,增强灰度的变化范围、丰富灰度层次,以达到增强图像的对比度和分辨率。我们发现车辆牌照图像的灰度取值范围大多局限在r=(50,200)之间,而且总体上灰度偏低,图象较暗。根据图象处理系统的条件,最好将灰度范围展开到s=(0,255)之间,为此我们对灰度值作如下的变换: s = T (r ) r=[r min,,r max ] (3-3)
使得S ∈[S min, S max],其中,T 为线性变换,
灰度线性变换
min r -max r min
r Smax -max r Smin r min r -max r Smin -Smax ??+=S (3-4) 图3-3 线性图
(3)若 r(50,200)s(0,255)
则:
85r 7.1150
50255-r 150255-≈?=S (3-5) (4)
图3-4 灰度增强后的图像
(2)平滑处理
对于受噪声干扰严重的图像,由于噪声点多在频域中映射为高频分量,因此可以在通过低 通滤波器来滤除噪声,但实际中为了简化算法,也可以直接在空域中用求邻域平均值的方法来削弱噪声的影响,这种方法称为图象平滑处理。例如,某一象素点的邻域S 有两种表示方法:8邻域和4邻域分别对应的邻域平均值为
∑∈=
s j i j i f M j i g ),(),(1),( (3-6)
2 3 i,j 1 4 4
3 2 5
i,j 1 6 7 8
图 3-5 邻域及其邻域模板
(5)
其中,M 为邻域中除中心象素点f(i,j) 之外包括的其它象素总数,对于4邻域M=4,8 邻域M=8。然而,邻域平均值的平滑处理会使得图像灰度急剧变化的地方,尤其是物体边缘区域和字符轮廓等部分产生模糊作用。为了克服这种平均化引起的图像模糊现象,我们给中心点象素值与其邻域平均值的差值设置一固定的阈值,只有大于该阈值的点才能替换为邻域平均值,而差值不大于阈值时,仍保留原来的值,从而减少由于平均化引起的图像模糊。
图3-6 平滑处理后的图像
图像中车辆牌照是具有比较显著特征的一块图像区域,这此特征表现在:近似水平的矩形区域;其中字符串都是按水平方向排列的;在整体图像中的位置较为固定。正是由于牌照图像的这些特点,再经过适当的图象变换,它在整幅中可以明显地呈现出其边缘。边缘提取是较经典的算法,此处边缘的提取采用的是Roberts算子。
图3-7未滤波直接提取出的边缘,经灰度校正后提取的边缘以及经平滑处理后提取的边缘
对比以上几幅图片,图8的边缘已经模糊掉了。图7中包含的噪声太多,图9未经滤波直接提取出的边缘图像最清晰,所包含的有用信息最多。分析这种情况产生的原因,归纳起来主要有以下方面:
1、原始图像清晰度比较高,从而简化了预处理
2、图像的平滑处理会使图像的边缘信息受到损失,图像变得模糊
3、图像的锐化可以增强图像中物体的边缘轮廓,但同时也使一些噪声得到了增强
综上所述,结合MATLAB实验过程,得出不是每一种图像处理之初都适合滤波和边界增强。本次汽车车牌的识别,为了保存更多的有用信息,经过多次比较,选择图9作为后期处理的依据。
2 车牌的定位与分割
车牌定位对车牌识别系统来说至关重要,目前已经提出了很多车牌定位的方法,这些方法都具有一个共同的出发点,即通过牌照区域的特征来判断牌照。根据不同的实现方法,大致可以把现有的定位方法分为直接法和间接法两类。
1)直接法。直接分析图像的特征,如基于线模板的二值化图像中的角检测算法,该算法利用车牌的边框角点,检测车牌的四个角点,并以此来定位车牌。基于直线边缘识别的图像区域定位算法,并且利用该算法定位车牌的边框线,以此定位车牌。利用车牌的尺寸、字符间距、字符特征等纹理特征定位车牌。利用车牌部分垂直高频丰富的特点先利用小波提取图像的垂直高频信息,然后利用数学形态学方法对小波分解后的细节图像进行一系列的形态运算,进一步消除无用的信息和噪声,以定位车牌。
2)间接法。主要是指利用神经网络法或者遗传算法定位车牌的方法。利用神经网络和遗传算法等柔性方法进行计算是当前研究热点之一。利用遗传算法对图像进行优化搜索,结合区域特征矢量构造的适应度函数,最终寻找到车牌的牌照区域的最佳定位参量。
目前较为常用的方法是先提取车辆图像的边缘,然后结合车辆牌照的几何特征,分析二值化边缘图像像素在水平和垂直方向的投影,判断出车辆牌照的位置。
图3-8 牌照定位于分割流程图
(1)牌照区域的定位
牌照图像经过了以上的处理后,牌照区域已经十分明显,而且其边缘得到了勾勒和加强。此时可进一步确定牌照在整幅图像中的准确位置。这里选用的是数学形态学的方法,其基本
思想是用具有一定形态的机构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形态特征,并除去不相干的结构。在本程序中用到了膨胀和闭合这两个基本运算,最后还用了bwareaopen来去除对象中不相干的小对象。
图 3-9 腐蚀后图像,平滑图像的轮廓以及从对象中移除小对象后图像
(2)牌照区域的分割
对车牌的分割可以有很多种方法,本程序是利用车牌的彩色信息的彩色分割方法。根据车牌底色等有关的先验知识,采用彩色像素点统计的方法分割出合理的车牌区域,确定车牌底色蓝色RGB对应的各自灰度范围,然后行方向统计在此颜色范围内的像素点数量,设定合理的阈值,确定车牌在行方向的合理区域。然后,在分割出的行区域内,统计列方向蓝色像素点的数量,最终确定完整的车牌区域。
图 3-10 行方向区域和最终定位出来的车牌
(3)车牌进一步处理
经过上述方法分割出来的车牌图像中存在目标物体、背景还有噪声,要想从图像中直接提取出目标物体,最常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群,即对图像二值化。均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素。再用模板中的全体像素的平均值来代替原来像素值。
图 3-11 裁剪出来的车牌的进一步处理过程
3 字符的分割与归一化
图 3-12 字符分割与归一化流程图
(1)字符分割
在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。字符识别的算法很多,因为车牌字符间间隔较大,不会出现字符粘连情况,所以此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。
图 3-13 分割出来的七个字符图像
(2)字符归一化 [m
,n]=size (d ),逐排检查有没有白色像素点,设置1<=j 若图像两边s (j )=0,则切割,去除图像两边多余的部分 切割去图像上下多余的部分 根据图像的大小,设置一阈值,检测图像的X 轴, 若宽度等于这一阈值则切割,分离出七个字符 归一化切割出来的字符图像的大小为40*20,与 模板中字符图像的大小相匹配 一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。但是对于车牌的识别,并不需要太多的处理就已经可以达到正确识别的目的。在此只进行了归一化处理,然后进行后期处理。 图 3-14 归一化处理后的七个字符图像 4 字符的识别 目前,字符识别方法主要有基于模板匹配算法和基于人工神经网络算法。基于模板匹配算法首先把待识别字符二值化并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。由于这种匹配算法稳定性较差、时间花费也较大,因此,在此基础上提出了基于关键点的匹配算法。此算法先对识别字符进行关键点提取,然后对关键点去噪,最后再确定字符的分类。这种匹配算法只利用了字符的关键点进行匹配,因此,提高了识别速度又具有较高的识别率。基于人工神经网络的算法主要有两种:一种是先对待识别字符进行特征提取,然后用所获得的特征来训练神经网络分类器;另一种方法是直接把待处理图像输入网络,由网络自动实现特征提取直至识别出结果。前一种方法识别结果与特征提取有关,而特征提取比较耗时,因此,特征提取是关键。后一种方法无须特征提取和模板匹配,随着相关技术的进步,这种方法更实用。 (1)神经网络 人工神经网络(ANNs)也称为神经网络或连接模型,是对人脑或自然神经网络若干基本特性的抽象和模拟。但是人工神经网络是近现代才提出来的一种新型技术,所以还有一些缺点,不过它的优点却是非常明显的:①它可以充分逼近任意复杂的非线性关系。②所有定量或定性的信息都等势分布于网络内的各神经元,故有很强的鲁棒性和容错性;采用并行分布的处理方法,使得快速地进行大量运算成为可能。③可学习和自适应不知道或不确定的系统。④能够同时处理定量、定性知识。⑤具有联想和存储功能。⑥具有高速寻找优化解的能力。它能够处理一些环境信息十分复杂、背景不清晰、有磨损、残缺等方面的问题的情况。 (2) BP神经网络 BP神经网络(Back Propagation Neural Net.work,简称BP神经网络)即反向传输神经网络。BP 神经网络可以应付各种数据和能够模拟一种复杂的决定系统。BP神经网络主要是通过一种模拟的方式对对象进行识别,它可以像人认识事物过程一样,逐渐地认清事物从而去模拟实现它。 BP神经网络由1024个输入节点、20个隐层节点、6个输出节点组成。每个节点的激活函数采用O.1函数,输出节点的输出值为0,1二值。训练以后,节点权值保存在配置文件中。在MATLAB工具箱中已经有了BP神经识别的函数,这里使用newlin函数adapt函数,使用这些函数需要输入预期的待学目标的输入范围,指定一个延迟输入信号和一个有延迟输入信号以及学习速度的参数,这样字符就能很好地在MATLAB中得到识别。 BP网络结构: 基于BP算法的多层前馈型网络将神经元按功能和顺序的不同分为输出层、中间层(隐层)、输出层。输入层各神经元负责接收来自外界的输入信息,并传给中间各隐层神经元;隐层是神经网络的内部信息处理层,负责信息变换。根据需要可设计为一层或多层;最后一个隐层将信息传递给输出层 神经元经进一步处理后向外界输出信息处理结果。同层节点中没有任何耦合,每一层节点的输出只影响下一层节点的输出。网络的学习过程由正向和反向传播两部分组成。反向传播其节点单元特征通常为Sigmoid型{f(X)=1/[1+exp(一Bx)],B>0}。在网络训练阶段用准备好的样本数据依次通过输入层、隐层和输出层。比较输出结果和期望值,若没有达到要求的误差程度或者训练次数,即经过输出层、隐层和输入层,来调节权值,以便使网络成为一定适应能力的模型。 用matlab 神经网络工具箱,用BP神经网络生成网络函数,部分程序如下: net=newff(pr,[25 1],{'logsig' 'purelin'}, 'traingdx', 'learngdm'); net.trainParam.epochs=3000; net.trainParam.goal=0.001; net.trainParam.show=10; net.trainParam.lr=0.05; net=train(net,p,t) 即创建和训练神经网络。其中权值函数为“logsig”,学习函数为:“purelin”.运行后,可在matlab上得到: LOADING...... ans = LOAD OK. TRAINGDX, Epoch 0/3000, MSE 18.0267/0.001, Gradient 19.9528/1e-006 TRAINGDX, Epoch 10/3000, MSE 6.55309/0.001, Gradient 1.92177/1e-006 TRAINGDX, Epoch 20/3000, MSE 5.08303/0.001, Gradient 1.59205/1e-006 TRAINGDX, Epoch 30/3000, MSE 3.32551/0.001, Gradient 1.35881/1e-006 TRAINGDX, Epoch 40/3000, MSE 1.70977/0.001, Gradient 0.830963/1e-006 TRAINGDX, Epoch 50/3000, MSE 0.808399/0.001, Gradient 0.588341/1e-006 TRAINGDX, Epoch 60/3000, MSE 0.255181/0.001, Gradient 0.301763/1e-006 TRAINGDX, Epoch 70/3000, MSE 0.0629529/0.001, Gradient 0.146848/1e-006 TRAINGDX, Epoch 80/3000, MSE 0.0175261/0.001, Gradient 0.0906425/1e-006 TRAINGDX, Epoch 90/3000, MSE 0.0146519/0.001, Gradient 0.364925/1e-006 TRAINGDX, Epoch 100/3000, MSE 0.0122441/0.001, Gradient 0.238192/1e-006 TRAINGDX, Epoch 110/3000, MSE 0.010538/0.001, Gradient 0.158065/1e-006 TRAINGDX, Epoch 120/3000, MSE 0.00900871/0.001, Gradient 0.0498804/1e-006 TRAINGDX, Epoch 130/3000, MSE 0.00778895/0.001, Gradient 0.0471643/1e-006 TRAINGDX, Epoch 140/3000, MSE 0.00642256/0.001, Gradient 0.0267898/1e-006 TRAINGDX, Epoch 150/3000, MSE 0.00506427/0.001, Gradient 0.0207391/1e-006 TRAINGDX, Epoch 160/3000, MSE 0.00378743/0.001, Gradient 0.0155848/1e-006 TRAINGDX, Epoch 170/3000, MSE 0.00259925/0.001, Gradient 0.012315/1e-006 TRAINGDX, Epoch 180/3000, MSE 0.00149217/0.001, Gradient 0.0137463/1e-006 TRAINGDX, Epoch 190/3000, MSE 0.00134022/0.001, Gradient 0.0518653/1e-006 TRAINGDX, Epoch 200/3000, MSE 0.00132563/0.001, Gradient 0.0549096/1e-006 TRAINGDX, Epoch 210/3000, MSE 0.00125472/0.001, Gradient 0.0293791/1e-006 TRAINGDX, Epoch 220/3000, MSE 0.00120414/0.001, Gradient 0.0082813/1e-006 TRAINGDX, Epoch 230/3000, MSE 0.00115466/0.001, Gradient 0.00760885/1e-006 TRAINGDX, Epoch 240/3000, MSE 0.00108049/0.001, Gradient 0.00798138/1e-006 TRAINGDX, Epoch 248/3000, MSE 0.000995008/0.001, Gradient 0.00708329/1e-006 TRAINGDX, Performance goal met. 即神经网络训练过程。误差曲线即测试样例经训练后的实际输出结果和期望输出的差值情况。其变化如图21,图22。 图 3-15 训练过程中误差曲线变化 图 3-16 训练结束时误差曲线 可见,当神经网络训练完成后,其样本得出的输出结果和期望输出结果完全相同,即误差为零。下面就图23所示测试样例进行测试。 图 3 -17 测试样例识别结果如下: FileName:D:\test a = 3 答案正确。其识别图形如图24。 图 3-18 识别结果图形 训练后神经网络以及权重结果信息为: net = Neural Network object: architecture: numInputs: 1 numLayers: 2 biasConnect: [1; 1] inputConnect: [1; 0] layerConnect: [0 0; 1 0] outputConnect: [0 1] targetConnect: [0 1] numOutputs: 1 (read-only) numTargets: 1 (read-only) numInputDelays: 0 (read-only) numLayerDelays: 0 (read-only) subobject structures: inputs: {1x1 cell} of inputs layers: {2x1 cell} of layers outputs: {1x2 cell} containing 1 output targets: {1x2 cell} containing 1 target biases: {2x1 cell} containing 2 biases inputWeights: {2x1 cell} containing 1 input weight layerWeights: {2x2 cell} containing 1 layer weight functions: adaptFcn: 'trains' initFcn: 'initlay' performFcn: 'mse' trainFcn: 'traingdx' parameters: adaptParam: .passes initParam: (none) performParam: (none) trainParam: .epochs, .goal, .lr, .lr_dec, .lr_inc, .max_fail, .max_perf_inc, .mc, .min_grad, .show, .time weight and bias values: IW: {2x1 cell} containing 1 input weight matrix LW: {2x2 cell} containing 1 layer weight matrix b: {2x1 cell} containing 2 bias vectors other: userdata: (user stuff) 由此可见,程序可满足期望要求。当然,也经常有识别错误的情况发生。对于识别错误情况的分析可知,主要原因:一是牌照自身的污渍等影响了图像的质量;二是牌照字符的分割失败导致的识别错误;再就是部分字符的形状相似性,比如,B 和8;A 和4 等字符识别结果可能发生混淆的情况。 总之,尽管目前牌照字符的识别率还不理想,但是只要在分割出的字符的大小、位置的归一化,以及尝试提取分类识别能力更好的特征值和设计分类器等环节上再完善,进一步提高识别率是完全可行的。 四总结 (一)课题小结 在车辆牌照字符识别系统的研究领域,近几年出现了许多切实可行的识别技术和方法,从这些新技术和方法中可以看到两个明显的趋势:一是单一的预处理和识别技术都无法达到理想的结果,多种方法的有机结合才能使系统有效识别能力提高。在此次实验中,也汲取了以上一些算法的思想,结合实际,反复比较,综合分析;二是在有效性和实用的原则下,结合神经网络和人工智能的新技术的应用是研究的一个方向。 根据车牌特点,一般采用的车牌定位算法有:1.边缘检测定位算法;2.利用哈夫变换进行车牌定位;3.色彩分割提取车牌等。这里我采用的是边缘检测的方法实现定位的。 字符分割的方法也有多种:1. 基于聚类分析的字符分割;2. 投影分割的方法;3.基于模板匹配的字符分割等。最常用的是投影分割,主要是针对在车牌定位,图像预处理后比较规则的车牌图像。优点是程序逻辑设计简单,循环执行功能单一,便于设计和操作,程序执行时间短。 字符识别的基本方法通常又三类:1.结构特征分析方法;2.模板匹配法;3.神经网络法。此处采用的是模板匹配的方法,即是将要识别的字符与事先构造好的模板进行比对,根据与模板的相似度的大小来确定最终的识别结果。 但是系统本身还存在许多不足,距离具体实用的要求仍有很大差距。 (二)体会 本次实验不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。这次USRP让我学到了很多东西,在这整个过程中我们查阅了大量的资料,涉及到方方面面的知识。同时在这期间我们遇到了很多困难,但我们知道做什么开始都不容易,只要定下心来,一步一个脚印的踏踏实实的去做,一定会成功。当然,理论只有应用到实际中才能学着更有意义。学习是一个长期积累的过程,在今后的工作、生活中都应该不断的学习,努力提高自己的综合素质。此外,我们还总结出:知识必须通过应用才能实现其价值!有些东西以为学会了,但真正到用的时候才发现是两回事,所以我们认为只有到真正会用的时候才是真的学会了。在整个实验中我们懂得了许多东西,也培养了合作的能力,树立了信心,发扬了吃苦耐劳的精神,相信会对今后的学习工作生活有非常重要的影响。同样此次USRP也大大提高了我们的动手的能力,使我们充分体会到了在创造过程中探索的艰难和成功时的喜悦。虽然这个实验做的并非对车牌都合适,但是在设计过程中所学到的学习方法是我最大收获和财 富,相信定会使我受益终身。 参考文献 [1] 夏庆观,盛党红,温秀兰,基于MATLAB GUI的零件图像识别2008年12月中国制造业信息化第37卷第23期 [2] 尹芳,王卫兵,陈德运,印刷体英文文档识别系统的设计与实现哈尔滨理工大学学报第13卷第6期 2008年12月 [3] 汪益民,梅林,张义超,基于OCR技术的书写文字识别系统设计甘肃科技第23卷第8期2007年8月 [4] 叶晨洲,廖金周,一种基于纹理的牌照图象二值化方法,微型电脑应用,1999(6) [5] 朱学芳等,一种自适应细化方法,模式识别与人工智能,Vol.10,No.2,1997(6) [6] 杨万山等,基于BP 神经网络的工程图纸图形符号的识别,微型电脑应用,Vol.16,No.2, 2000 [7] 袁志伟,潘晓露.车辆牌照定位的算法研究[J].昆明理工大学学报,2001,26(2) [8] 刘阳,伊铁源等.数字图象处理应用于车辆牌照的识别.辽宁大学学报.2004 [9] 许志影、李晋平.MATLAB极其在图像处理中的应用.计算机与现代化,2004(4) [10] 崔江、王友仁.车牌自动识别方法中的关键技术研究.计算机测量与控制,2003.11(4) [11] 梁玮、罗剑锋、贾云得.一种复杂背景下的多车牌图像分割与识别方法[D]. 2003. [12] 张引,潘云鹤,面向车辆牌照字符识别的预处理算法,计算机应用研究,1999(7) p=p1';t=t1'; [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); % 原始数据归一化 net=newff(minmax(pn),[5,1],{'tansig','purelin'},'traingdx'); %设置网络,建立相应的BP 网络net.trainParam.show=2000; % 训练网络 net.trainParam.lr=0.01; net.trainParam.epochs=100000; net.trainParam.goal=1e-5; [net,tr]=train(net ,pn,tn); %调用TRAINGDM 算法训练BP 网络 pnew=pnew1'; pnewn=tramnmx(pnew,minp,maxp); anewn=sim(net,pnewn); anew=postmnmx(anewn,mint,maxt); %对 BP 网络进行仿真%还原数据 y=anew'; 1、 BP 网络构建 (1)生成 BP 网络 net newff ( PR,[ S1 S2...SNl],{ TF1 TF 2...TFNl }, BTF , BLF , PF ) PR :由R 维的输入样本最小最大值构成的R 2 维矩阵。 [ S1 S2...SNl] :各层的神经元个数。 {TF 1 TF 2...TFNl } :各层的神经元传递函数。 BTF :训练用函数的名称。 (2)网络训练 [ net,tr ,Y, E, Pf , Af ] train (net, P, T , Pi , Ai ,VV , TV ) (3)网络仿真 [Y, Pf , Af , E, perf ] sim(net, P, Pi , Ai ,T ) {'tansig','purelin'},'trainrp' BP 网络的训练函数 训练方法 梯度下降法 有动量的梯度下降法 自适应 lr 梯度下降法 自适应 lr 动量梯度下降法弹性梯度下降法训练函数traingd traingdm traingda traingdx trainrp Fletcher-Reeves 共轭梯度法traincgf Ploak-Ribiere 共轭梯度法traincgp 以下是用Matlab中的m语言编写的BP神经网络代码,实现的是一个正弦函数的拟合过程,包括了初始化、BP算法、绘制曲线等过程,可以将代码放到一个M文件中运行,以下是代码: defaultpoints=20; %%%%%%%%%隐含层节点数 inputpoints=1; %%%%%%%%%输入层节点数 outputpoints=1; %%%%%%%%%输出层节点数 Testerror=zeros(1,100);%%%%每个测试点的误差记录 a=zeros(1,inputpoints);%%%%输入层节点值 y=zeros(1,outputpoints);%%%样本节点输出值 w=zeros(inputpoints,defaultpoints);%%%%%输入层和隐含层权值 %初始化权重很重要,比如用rand函数初始化则效果非常不确定,不如用zeros初始化 v=zeros(defaultpoints,outputpoints);%%%%隐含层和输出层权值 bin=rand(1,defaultpoints);%%%%%隐含层输入 bout=rand(1,defaultpoints);%%%%隐含层输出 base1=0*ones(1,defaultpoints);%隐含层阈值,初始化为0 cin=rand(1,outputpoints);%%%%%%输出层输入 cout=rand(1,outputpoints);%%%%%输出层输出 base2=0*rand(1,outputpoints);%%输出层阈值 error=zeros(1,outputpoints);%%%拟合误差 errors=0;error_sum=0; %%%误差累加和 error_rate_cin=rand(defaultpoints,outputpoints);%%误差对输出层节点权值的导数 error_rate_bin=rand(inputpoints,defaultpoints);%%%误差对输入层节点权值的导数 alfa=0.5; %%%% alfa 是隐含层和输出层权值-误差变化率的系数,影响很大 belt=0.5; %%%% belt 是隐含层和输入层权值-误差变化率的系数,影响较小 gama=5; %%%% gama 是误差放大倍数,可以影响跟随速度和拟合精度,当gama大于2时误差变大,容易震荡 %%%%规律100个隐含节点,当alfa *gama =1.5时,效果好,其他值误差变大,belt基本不影响效果 %%%%规律200个隐含节点,当alfa *gama =0.7时,效果好,其他值误差变大,belt基本不影响效果,最小误差和100个隐含点一样 %%%%规律50个隐含节点,当alfa *gama =3时,效果好,其他值误差变大,belt基本不影响效果,最小误差和100个隐含点一样 trainingROUND=200;% 训练次数,有时训练几十次比训练几百次上千次效果要好很多sampleNUM=361; % 样本点数 x1=zeros(sampleNUM,inputpoints); %样本输入矩阵 y1=zeros(sampleNUM,outputpoints); %样本输出矩阵 x2=zeros(sampleNUM,inputpoints); %测试输入矩阵 BP神经网络模型 第1节基本原理简介 近年来全球性的神经网络研究热潮的再度兴起,不仅仅是因为神经科学本身取得了巨大的进展.更主要的原因在于发展新型计算机和人工智能新途径的迫切需要.迄今为止在需要人工智能解决的许多问题中,人脑远比计算机聪明的多,要开创具有智能的新一代计算机,就必须了解人脑,研究人脑神经网络系统信息处理的机制.另一方面,基于神经科学研究成果基础上发展出来的人工神经网络模型,反映了人脑功能的若干基本特性,开拓了神经网络用于计算机的新途径.它对传统的计算机结构和人工智能是一个有力的挑战,引起了各方面专家的极大关注. 目前,已发展了几十种神经网络,例如Hopficld模型,Feldmann等的连接型网络模型,Hinton等的玻尔茨曼机模型,以及Rumelhart等的多层感知机模型和Kohonen的自组织网络模型等等。在这众多神经网络模型中,应用最广泛的是多层感知机神经网络。多层感知机神经网络的研究始于50年代,但一直进展不大。直到1985年,Rumelhart等人提出了误差反向传递学习算法(即BP算),实现了Minsky的多层网络 设想,如图34-1所示。 BP 算法不仅有输入层节点、输出层节点,还可有1个或多个隐含层节点。对于输入信号,要先向前传播到隐含层节点,经作用函数后,再把隐节点的输出信号传播到输出节点,最后给出输出结果。节点的作用的激励函数通常选取S 型函数,如 Q x e x f /11)(-+= 式中Q 为调整激励函数形式的Sigmoid 参数。该算法的学习过程由正向传播和反向传播组成。在正向传播过程中,输入信息从输入层经隐含层逐层处理,并 传向输出层。每一层神经元的状态只影响下一层神经 用遗传算法优化BP神经网络的Matlab编程实例(转) 由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。 程序一:GA训练BP权值的主函数 function net=GABPNET(XX,YY) %-------------------------------------------------------------------------- % GABPNET.m % 使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络 %-------------------------------------------------------------------------- %数据归一化预处理 nntwarn off XX=[1:19;2:20;3:21;4:22]'; YY=[1:4]; XX=premnmx(XX); YY=premnmx(YY); YY %创建网络 net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'tra inlm'); %下面使用遗传算法对网络进行优化 P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隐含层节点数 S=R*S1+S1*S2+S1+S2;%遗传算法编码长度 aa=ones(S,1)*[-1,1]; popu=50;%种群规模 save data2 XX YY % 是将 xx,yy 二个变数的数值存入 data2 这个MAT-file,initPpp=initializega(popu,aa,'gabpEval');%初始化种群 gen=100;%遗传代数 神经网络的设计实例(MATLAB编程) 例1 采用动量梯度下降算法训练BP 网络。训练样本定义如下: 输入矢量为 p =[-1 -2 3 1 -1 1 5 -3] 目标矢量为t = [-1 -1 1 1] 解:本例的MATLAB 程序如下: close all clear echo on clc % NEWFF——生成一个新的前向神经网络% TRAIN——对BP 神经网络进行训练 % SIM——对BP 神经网络进行仿真pause % 敲任意键开始 clc % 定义训练样本 P=[-1, -2, 3, 1; -1, 1, 5, -3]; % P 为输入矢量T=[-1, -1, 1, 1]; % T 为目标矢量 clc % 创建一个新的前向神经网络 net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm') % 当前输入层权值和阈值 inputWeights=net.IW{1,1} inputbias=net.b{1} % 当前网络层权值和阈值 layerWeights=net.LW{2,1} layerbias=net.b{2} pause clc % 设置训练参数 net.trainParam.show = 50; net.trainParam.lr = 0.05; net.trainParam.mc = 0.9; net.trainParam.epochs = 1000; net.trainParam.goal = 1e-3; pause clc % 调用TRAINGDM 算法训练BP 网络 [net,tr]=train(net,P,T); close all clear echo on clc % NEWFF——生成一个新的前向神经网络 % TRAIN——对 BP 神经网络进行训练 % SIM——对 BP 神经网络进行仿真 % 定义训练样本 % P为输入矢量 P=[0.7317 0.6790 0.5710 0.5673 0.5948;0.6790 0.5710 0.5673 0.5948 0.6292; ... 0.5710 0.5673 0.5948 0.6292 0.6488;0.5673 0.5948 0.6292 0.6488 0.6130; ... 0.5948 0.6292 0.6488 0.6130 0.5654; 0.6292 0.6488 0.6130 0.5654 0.5567; ... 0.6488 0.6130 0.5654 0.5567 0.5673;0.6130 0.5654 0.5567 0.5673 0.5976; ... 0.5654 0.5567 0.5673 0.5976 0.6269;0.5567 0.5673 0.5976 0.6269 0.6274; ... 0.5673 0.5976 0.6269 0.6274 0.6301;0.5976 0.6269 0.6274 0.6301 0.5803; ... 0.6269 0.6274 0.6301 0.5803 0.6668;0.6274 0.6301 0.5803 0.6668 0.6896; ... 0.6301 0.5803 0.6668 0.6896 0.7497]; % T为目标矢量 T=[0.6292 0.6488 0.6130 0.5654 0.5567 0.5673 0.5976 ... 0.6269 0.6274 0.6301 0.5803 0.6668 0.6896 0.7497 0.8094]; % Ptest为测试输入矢量 Ptest=[0.5803 0.6668 0.6896 0.7497 0.8094;0.6668 0.6896 0.7497 0.8094 0.8722; ... 0.6896 0.7497 0.8094 0.8722 0.9096]; % Ttest为测试目标矢量 Ttest=[0.8722 0.9096 1.0000]; % 创建一个新的前向神经网络 net=newff(minmax(P'),[12,1],{'logsig','purelin'},'traingdm'); % 设置训练参数 net.trainParam.show = 50; net.trainParam.lr = 0.05; net.trainParam.mc = 0.9; net.trainParam.epochs = 5000; net.trainParam.goal = 0.001; % 调用TRAINGDM算法训练 BP 网络 [net,tr]=train(net,P',T); % 对BP网络进行仿真 A=sim(net,P'); figure; plot((1993:2007),T,'-*',(1993:2007),A,'-o'); title('网络的实际输出和仿真输出结果,*为真实值,o为预测值'); xlabel('年份'); ylabel('客运量'); % 对BP网络进行测试 A1=sim(net,Ptest'); Matlab训练好的BP神经网络如何保存和读取方法(附实例说明) 看到论坛里很多朋友都在提问如何存储和调用已经训练好的神经网络。 本人前几天也遇到了这样的问题,在论坛中看了大家的回复,虽然都提到了关键的两个函数“save”和“load”,但或多或少都简洁了些,让人摸不着头脑(呵呵,当然也可能是本人太菜)。通过不断调试,大致弄明白这两个函数对神经网络的存储。下面附上实例给大家做个说明,希望对跟我有一样问题的朋友有所帮助。 如果只是需要在工作目录下保到当前训练好的网络,可以在命令窗口 输入:save net %net为已训练好的网络 然后在命令窗口 输入:load net %net为已保存的网络 加载net。 但一般我们都会在加载完后对网络进行进一步的操作,建议都放在M文件中进行保存网络和调用网络的操作 如下所示: %% 以函数的形式训练神经网络 functionshenjingwangluo() P=[-1,-2,3,1; -1,1,5,-3]; %P为输入矢量 T=[-1,-1,1,1,]; %T为目标矢量 net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm') %创建一个新的前向神经网络 inputWeights=net.IW{1,1} inputbias=net.b{1} %当前输入层权值和阀值 layerWeights=net.LW{2,1} layerbias=net.b{2} net.trainParam.show=50; net.trainParam.lr=0.05; net.trainParam.mc=0.9; BP神经网络matlab代码 p=[284528334488;283344884554;448845542928;455429283497;29283497 2261;... 349722616921;226169211391;692113913580;139135804451;35804451 2636;... 445126363471;263634713854;347138543556;385435562659;35562659 4335;... 265943352882;433528824084;433528821999;288219992889;19992889 2175;... 288921752510;217525103409;251034093729;340937293489;37293489 3172;... 348931724568;317245684015;]'; %====期望输出======= t=[4554292834972261692113913580445126363471385435562659... 4335288240841999288921752510340937293489317245684015... 3666]; ptest=[284528334488;283344884554;448845542928;455429283497;29283497 2261;... 349722616921;226169211391;692113913580;139135804451;35804451 2636;... 445126363471;263634713854;347138543556;385435562659;35562659 4335;... 265943352882;433528824084;433528821999;288219992889;19992889 2175;... 288921752510;217525103409;251034093729;340937293489;37293489 3172;... 348931724568;317245684015;456840153666]'; [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t);%将数据归一化 NodeNum1=20;%隐层第一层节点数 NodeNum2=40;%隐层第二层节点数 TypeNum=1;%输出维数 TF1='tansig'; TF2='tansig'; TF3='tansig'; net=newff(minmax(pn),[NodeNum1,NodeNum2,TypeNum],{TF1TF2 TF3},'traingdx'); BP神经网络matlab源程序代码) %******************************% 学习程序 %******************************% %======原始数据输入======== p=[2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;... 3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;... 4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;... 2659 4335 2882;4335 2882 4084;4335 2882 1999;2882 1999 2889;1999 2889 2175;... 2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;... 3489 3172 4568;3172 4568 4015;]'; %===========期望输出======= t=[4554 2928 3497 2261 6921 1391 3580 4451 2636 3471 3854 3556 2659 ... 4335 2882 4084 1999 2889 2175 2510 3409 3729 3489 3172 4568 4015 ... 3666]; ptest=[2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;... 3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;... 4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;... 2659 4335 2882;4335 2882 4084;4335 2882 1999;2882 1999 2889;1999 2889 2175;... 2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;... 3489 3172 4568;3172 4568 4015;4568 4015 3666]'; [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %将数据归一化 NodeNum1 =20; % 隐层第一层节点数 NodeNum2=40; % 隐层第二层节点数 TypeNum = 1; % 输出维数 TF1 = 'tansig'; 神经网络Matlab p=p1';t=t1'; [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始数据归一化net=newff(minmax(pn),[5,1],{'tansig','purelin'},'traingdx');%设置网络,建立相应的BP网络 net.trainParam.show=2000; % 训练网络 net.trainParam.lr=0.01; net.trainParam.epochs=100000; net.trainParam.goal=1e-5; [net,tr]=train(net ,pn,tn); %调用TRAINGDM算法训练BP网络 pnew=pnew1'; pnewn=tramnmx(pnew,minp,maxp); anewn=sim(net,pnewn); %对BP网络进行仿真 anew=postmnmx(anewn,mint,maxt); %还原数据 y=anew'; 1、BP网络构建 (1)生成BP网络 = net newff PR S S SNl TF TF TFNl BTF BLF PF (,[1 2...],{ 1 2...},,,) R?维矩阵。 PR:由R维的输入样本最小最大值构成的2 S S SNl:各层的神经元个数。 [1 2...] TF TF TFNl:各层的神经元传递函数。 { 1 2...} BTF:训练用函数的名称。 (2)网络训练 = [,,,,,] (,,,,,,) net tr Y E Pf Af train net P T Pi Ai VV TV (3)网络仿真 = [,,,,] (,,,,) Y Pf Af E perf sim net P Pi Ai T {'tansig','purelin'},'trainrp' BP网络的训练函数 训练方法训练函数 梯度下降法traingd 有动量的梯度下降法traingdm 自适应lr梯度下降法traingda 自适应lr动量梯度下降法traingdx 弹性梯度下降法trainrp Fletcher-Reeves共轭梯度法traincgf Ploak-Ribiere共轭梯度法traincgp Powell-Beale共轭梯度法traincgb 量化共轭梯度法trainscg 拟牛顿算法trainbfg 一步正割算法trainoss Levenberg-Marquardt trainlm 基于MATLAB的BP神经网络工具箱函数 最新版本的神经网络工具箱几乎涵盖了所有的神经网络的基本常用模型,如感知器和BP网络等。对于各种不同的网络模型,神经网络工具箱集成了多种学习算法,为用户提供了极大的方便[16]。Matlab R2007神经网络工具箱中包含了许多用于BP网络分析与设计的函数,BP网络的常用函数如表3.1所示。 3.1.1BP网络创建函数 1) newff 该函数用于创建一个BP网络。调用格式为: net=newff net=newff(PR,[S1S2..SN1],{TF1TF2..TFN1},BTF,BLF,PF) 其中, net=newff;用于在对话框中创建一个BP网络。 net为创建的新BP神经网络; PR为网络输入向量取值范围的矩阵; [S1S2…SNl]表示网络隐含层和输出层神经元的个数; {TFlTF2…TFN1}表示网络隐含层和输出层的传输函数,默认为‘tansig’; BTF表示网络的训练函数,默认为‘trainlm’; BLF表示网络的权值学习函数,默认为‘learngdm’; PF表示性能数,默认为‘mse’。 2)newcf函数用于创建级联前向BP网络,newfftd函数用于创建一个存在输入延迟的前向网络。 3.1.2神经元上的传递函数 传递函数是BP网络的重要组成部分。传递函数又称为激活函数,必须是连续可微的。BP网络经常采用S型的对数或正切函数和线性函数。 1) logsig 该传递函数为S型的对数函数。调用格式为: A=logsig(N) info=logsig(code) 其中, N:Q个S维的输入列向量; A:函数返回值,位于区间(0,1)中; 2)tansig 该函数为双曲正切S型传递函数。调用格式为: A=tansig(N) info=tansig(code) 其中, N:Q个S维的输入列向量; A:函数返回值,位于区间(-1,1)之间。 3)purelin 该函数为线性传递函数。调用格式为: A=purelin(N) info=purelin(code) 其中, N:Q个S维的输入列向量; A:函数返回值,A=N。 3.1.3BP网络学习函数 1)learngd 该函数为梯度下降权值/阈值学习函数,它通过神经元的输入和误差,以及权值和阈值的学习效率,来计算权值或阈值的变化率。调用格式为: [dW,ls]=learngd(W,P,Z,N,A,T,E,gW,gA,D,LP,LS) [db,ls]=learngd(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,LS) %======原始数据输入======== p=[284528334488;283344884554;448845542928;455429283497;29283497 2261;... 349722616921;226169211391;692113913580;139135804451;35804451 2636;... 445126363471;263634713854;347138543556;385435562659;35562659 4335;... 265943352882;433528824084;433528821999;288219992889;19992889 2175;... 288921752510;217525103409;251034093729;340937293489;37293489 3172;... 348931724568;317245684015;]'; %期望输出 t=[4554292834972261692113913580445126363471385435562659... 4335288240841999288921752510340937293489317245684015... 3666]; pt=[284528334488;283344884554;448845542928;455429283497;29283497 2261;... 349722616921;226169211391;692113913580;139135804451;35804451 2636;... 445126363471;263634713854;347138543556;385435562659;35562659 4335;... 265943352882;433528824084;433528821999;288219992889;19992889 2175;... 288921752510;217525103409;251034093729;340937293489;37293489 3172;... 348931724568;317245684015;456840153666]';%测试输入数据 tt=[………];%测试输出数据 [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t);%将数据归一化 NodeNum1=12;%隐层节点 TypeNum=1;%输出节点 TF1='tansig'; TF2='tansig'; net=newff(minmax(pn),[NodeNum1,TypeNum],{TF1 TF2},'traingdx'); inputWeights=net.IW{1,1};%第一层权值输出 bp神经网络及matlab实现 分类:算法学习2012-06-20 20:56 66399人阅读评论(28) 收藏举报网络matlab算法functionnetworkinput 本文主要内容包括:(1) 介绍神经网络基本原理,(2) https://www.360docs.net/doc/9d5831731.html,实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法。 第0节、引例 本文以Fisher的Iris数据集作为神经网络程序的测试数据集。Iris数据集可以在https://www.360docs.net/doc/9d5831731.html,/wiki/Iris_flower_data_set 找到。这里简要介绍一下Iris数据集: 有一批Iris花,已知这批Iris花可分为3个品种,现需要对其进行分类。不同品种的Iris花的花萼长度、花萼宽度、花瓣长度、花瓣宽度会有差异。我们现有一批已知品种的Iris花的花萼长度、花萼宽度、花瓣长度、花瓣宽度的数据。 一种解决方法是用已有的数据训练一个神经网络用作分类器。 如果你只想用C#或Matlab快速实现神经网络来解决你手头上的问题,或者已经了解神经网络基本原理,请直接跳到第二节——神经网络实现。 第一节、神经网络基本原理 1. 人工神经元( Artificial Neuron )模型 人工神经元是神经网络的基本元素,其原理可以用下图表示: 图1. 人工神经元模型 图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值( threshold ),或称为偏置( bias )。则神经元i的输出与输入的关系表示为: 图中yi表示神经元i的输出,函数f称为激活函数 ( Activation Function )或转移函数( Transfer Function ) ,net称为净激活(net activation)。若将阈值看成是神经元i的一个输入x0的权重wi0,则上面的式子可以简化为: 若用X表示输入向量,用W表示权重向量,即: X = [ x0 , x1 , x2 , ....... , xn ] 用遗传算法优化BP神经网络的 Matlab编程实例 由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。 程序一:GA训练BP权值的主函数 function net=GABPNET(XX,YY) %-------------------------------------------------------------------------- % GABPNET.m % 使用遗传算法对BP网络权值阈值进行优化,再用BP 算法训练网络 %-------------------------------------------------------------------------- %数据归一化预处理 nntwarn off XX=premnmx(XX); YY=premnmx(YY); %创建网络 net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},' trainlm'); %下面使用遗传算法对网络进行优化 P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隐含层节点数 S=R*S1+S1*S2+S1+S2;%遗传算法编码长度 aa=ones(S,1)*[-1,1]; popu=50;%种群规模 initPpp=initializega(popu,aa,'gabpEval');%初始化种群 gen=100;%遗传代数 %下面调用gaot工具箱,其中目标函数定义为gabpEval [x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,... 'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutatio n',[2 gen 3]); %绘收敛曲线图 figure(1) plot(trace(:,1),1./trace(:,3),'r-'); hold on plot(trace(:,1),1./trace(:,2),'b-'); xlabel('Generation'); ylabel('Sum-Squared Error'); figure(2) plot(trace(:,1),trace(:,3),'r-'); hold on plot(trace(:,1),trace(:,2),'b-'); xlabel('Generation'); ylabel('Fittness'); %下面将初步得到的权值矩阵赋给尚未开始训练的BP网络 [W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x); net.LW{2,1}=W1; net.LW{3,2}=W2; net.b{2,1}=B1; net.b{3,1}=B2; XX=P; YY=T; %设置训练参数 net.trainParam.show=1; net.trainParam.lr=1; net.trainParam.epochs=50; net.trainParam.goal=0.001; %训练网络 net=train(net,XX,YY); 程序二:适应值函数 function [sol, val] = gabpEval(sol,options) % val - the fittness of this individual % sol - the individual, returned to allow for Lamarckian evolution % options - [current_generation] load data2 nntwarn off XX=premnmx(XX); YY=premnmx(YY); P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隐含层节点数 S=R*S1+S1*S2+S1+S2;%遗传算法编码长度 for i=1:S, x(i)=sol(i); end; [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x); BP神经网络及其MATLAB实例 问题:BP神经网络预测2020年某地区客运量和货运量 公路运量主要包括公路客运量和公路货运量两方面。某个地区的公路运量主要与该地区的人数、机动车数量和公路面积有关,已知该地区20年(1999-2018)的公路运量相关数据如下: 人数/万人: 20.5522.4425.3727.1329.4530.1030.9634.0636.4238.09 39.1339.9941.9344.5947.3052.8955.7356.7659.1760.63机动车数量/万辆: 0.60.750.850.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2 2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1 公路面积/单位:万平方公里: 0.090.110.110.140.200.230.230.320.320.34 0.360.360.380.490.560.590.590.670.690.79 公路客运量/万人:5126621777309145104601138712353157501830419836 21024194902043322598251073344236836405484292743462公路货运量/万吨: 1237137913851399166317141834432281328936 11099112031052411115133201676218673207242080321804影响公路客运量和公路货运量主要的三个因素是:该地区的人数、机动车数量和公路面积。 Matlab代码实现 %人数(单位:万人) numberOfPeople=[20.5522.4425.3727.1329.4530.1030.9634.0636.42 38.0939.1339.9941.9344.5947.3052.8955.7356.7659.1760.63]; %机动车数(单位:万辆) numberOfAutomobile=[0.60.750.850.91.051.351.451.61.71.852.15 2.2 2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1]; %公路面积(单位:万平方公里) roadArea=[0.090.110.110.140.200.230.230.320.320.340.360.360.38 %% 清空环境变量 clc clear %% 训练数据预测数据提取及归一化 %下载四类语音信号 load data1 c1 load data2 c2 load data3 c3 load data4 c4 %四个特征信号矩阵合成一个矩阵 data(1:500,:)=c1(1:500,:); data(501:1000,:)=c2(1:500,:); data(1001:1500,:)=c3(1:500,:); data(1501:2000,:)=c4(1:500,:); %从1到2000间随机排序 k=rand(1,2000); [m,n]=sort(k); %输入输出数据 input=data(:,2:25); output1 =data(:,1); %把输出从1维变成4维 for i=1:2000 switch output1(i) case 1 output(i,:)=[1 0 0 0]; case 2 output(i,:)=[0 1 0 0]; case 3 output(i,:)=[0 0 1 0]; case 4 output(i,:)=[0 0 0 1]; end end %随机提取1500个样本为训练样本,500个样本为预测样本input_train=input(n(1:1500),:)'; output_train=output(n(1:1500),:)'; input_test=input(n(1501:2000),:)'; output_test=output(n(1501:2000),:)'; %输入数据归一化 [inputn,inputps]=mapminmax(input_train); %% 网络结构初始化 innum=24; midnum=25; outnum=4; %权值初始化 w1=rands(midnum,innum); b1=rands(midnum,1); w2=rands(midnum,outnum); b2=rands(outnum,1); w2_1=w2;w2_2=w2_1; w1_1=w1;w1_2=w1_1; b1_1=b1;b1_2=b1_1; b2_1=b2;b2_2=b2_1; %学习率 xite=0.1 alfa=0.01; %% 网络训练 for ii=1:10 E(ii)=0; for i=1:1:1500 %% 网络预测输出 x=inputn(:,i); % 隐含层输出 for j=1:1:midnum I(j)=inputn(:,i)'*w1(j,:)'+b1(j); Iout(j)=1/(1+exp(-I(j))); end % 输出层输出 yn=w2'*Iout'+b2; %% 权值阀值修正 %计算误差 e=output_train(:,i)-yn; E(ii)=E(ii)+sum(abs(e)); 介绍神经网络算法在机械结构优化中的应用的例子 (大家要学习的时候只需要把输入输出变量更改为你自己的数据既可以了,如果看完了还有问题的话可以加我微博“极南师兄”给我留言,与大家共同进步)。 把一个结构的8个尺寸参数设计为变量,如上图所示, 对应的质量,温差,面积作为输出。用神经网络拟合变量与输出的数学模型,首相必须要有数据来源,这里我用复合中心设计法则构造设计点,根据规则,八个变量将构造出81个设计点。然后在ansys workbench中进行81次仿真(先在proe建模并设置变量,将模型导入wokbench中进行相应的设置,那么就会自动的完成81次仿真,将结果导出来exceel文件) Matlab程序如下 P= [20 2.5 6 14.9 16.5 6 14.9 16.5 15 2.5 6 14.9 16.5 6 14.9 16.5 25 2.5 6 14.9 16.5 6 14.9 16.5 20 1 6 14.9 16.5 6 14.9 16.5 20 4 6 14.9 16.5 6 14.9 16.5 20 2.5 2 14.9 16.5 6 14.9 16.5 20 2.5 10 14.9 16.5 6 14.9 16.5 20 2.5 6 10 16.5 6 14.9 16.5 20 2.5 6 19.8 16.5 6 14.9 16.5 20 2.5 6 14.9 10 6 14.9 16.5 20 2.5 6 14.9 23 6 14.9 16.5 20 2.5 6 14.9 16.5 2 14.9 16.5 20 2.5 6 14.9 16.5 10 14.9 16.5 20 2.5 6 14.9 16.5 6 10 16.5 20 2.5 6 14.9 16.5 6 19.8 16.5 20 2.5 6 14.9 16.5 6 14.9 10 20 2.5 6 14.9 16.5 6 14.9 23 17.51238947 1.75371684 4.009911573 12.46214168 13.26610631 4.009911573 12.46214168 19.73389369 22.48761053 1.75371684 4.009911573 12.46214168 13.26610631 4.009911573 12.46214168 13.26610631 17.51238947 3.24628316 4.009911573 12.46214168 13.26610631 4.009911573(完整版)BP神经网络matlab实例(简单而经典).doc
人工神经网络Matlab实现代码
BP神经网络模型应用实例
基于遗传算法的BP神经网络MATLAB代码
BP神经网络地设计实例(MATLAB编程)
BP神经网络matlab源程序代码
Matlab训练好的BP神经网络如何保存和读取方法(附实例说明)
BP神经网络MATLAB代码
BP神经网络matlab源程序代码
BP神经网络matlab实例
matlab BP神经网络
BP神经网络matlab代码 (1)
bp神经网络及matlab实现
用遗传算法优化BP神经网络的Matlab编程实例
BP神经网络matlab实例
Matlab神经网络30个案例第1案例代码
matlab神经网络实例(超级简单)