基于BP神经网络车牌识别系统的设计与实现

11 题目的主要研究内容

(1)工作的主要描述

        使用MATLAB将采集到的图像信息读入,采用一系列的方法对图像信息进行预处理;再分析不同像素点分布与边缘的相应变化范围,从而确定牌照的大致位置,由此分割出车牌的矩形区域;使用二值化的方式对矩形区域处理,再选用相应阈值将此切割成一个个字符;然后使用神经网络来识别字符,输出即为识别的车牌。

(2)系统流程图

12 题目研究的工作基础或实验条件

  1. 硬件环境

处理器Intel i5-8264U CPU,因特尔超高清显卡620;

  1. 软件环境

Windows操作系统,matlab2016b。

13 数据集描述

        本次课程报告数据集来源于互联网,分别为上海,郑州,沈阳,苏州四个地区的汽车牌照照片,车牌图片由省份简称和字符组成。本课设以上海的车牌进行演示。

数据集图像如图2所示:

图2 汽车牌照数据集展示

14 特征提取过程描述

1 图像预处理

        在实际应用中,不同的光照条件、汽车自身的运动变化、拍摄的角度、硬件设备等等因素会直接影响到拍摄图像的效果,存在各种噪声;故在牌照定位前,对图片信息预处理从而改善图像质量,获得更加有效的信息。其流程图为:

1)灰度处理

        灰度化处理就是将彩色的三维图像转变为二维图像。彩色图像有RGB 三个分量,灰度化就是使彩色的RGB 分量转化为三个相等的分量。灰度值大的像素点比较亮,灰度值小的像素点比较暗。灰度图像的变换采用了Rgb2gray函数,格式为I=rgb2gray(RGB)

原始图像和灰度图如图4和图5所示:

2)图像增强

        为提高识别率和精确度,必须在边缘提取前增强汽车牌照部位和其他部位的对比度以及增强车辆图像,使二维灰度化的图像明暗对比鲜明。本次课设中采取直方图均衡化的方式来对图像进行增强处理。由于图像有时会出现整体偏暗或者整体偏亮的情况,要使用MATLAB中的变换函数将原图像的直方图修的更为均匀,使其层次鲜明丰富、直方图均匀分布,从而避免整体偏暗或者整体偏亮的极端情况。本次图像增强的实现采用了Histeq函数,格式为I= histeq(gray)

图像增强图像如图6所示:

3)边缘提取

在检测边缘时,为突出图像灰度变化的作用,需要利用微分算子把图像信息进行微分运算;由于在图像边缘处的地方灰度变化比较大,所以此处图像微分计算所得到的值比较高;可以把此值作为相应点的边缘强度;将设置好的阈值与分支比较结果来判断和提取边缘点,只要分支大于阈值,就可以将其作为边缘点来提取。其主要的步骤如下:为了突出图像中的局部边缘,需要使用边缘来增强算子的方法;接着定义像素的边缘强度、设置门限,最后提取边缘点集,依此进行完成边缘的提取。

常用的边缘检测算子有 Robert 算子、Sobel 算子、Prewitt 算子、Laplace算子和Canny 算子。为增加车牌的边缘定位精准确性,需要抑制其他相应部分的边缘。根据Canny算子表现出来的能有效检测车牌区域纹理的特性,本课设使用Canny算子来检测汽车牌照边缘。如图7所示: 

15 分类过程描述

1 分割车牌

2 车牌预处理

由于放置不当或拍摄角度问题,分割下来的车牌可能存在水平或垂直方向的倾斜。为了准确的分割字符,识别出车牌,所以分割下来的车牌要进行倾斜校正。倾斜校正分为两步:第一步是计算出倾斜的角度,第二步是根据倾斜的角度进行旋转变化。

目前经常使用Hough变换、Radon变换的方法来计算倾斜角度。本课设主要使用Radon变换进行车牌校正。车牌水平方向倾斜校正步骤如下:

(1) 将分割的车牌灰度化,边缘提取;

(2) 调用Radon函数进行水平方向投影,计算倾斜角度;

(3) 调用Imrotate函数进行旋转;

得到水平方向校正的车牌如图11所示:

3 字符分割

为了得到包含车牌字符的水平条形区域,需要将分割后的车牌图形进行二值化和倾斜校正,然后将车牌字符分割出来,以便于识别。本课设采用的字符分割方法是先规定分割出的车牌区域长宽为23852,设置阈值为2,寻找大于阈值2的列的数目,然后找到跳变对应的前边缘和后边缘所对应的列,当跳变点所对应的前边缘和后边缘所对应列的长度是23852的0.02倍时进行分割。

4 字符识别

本文设计的汽车牌照识别系统是基于BP神经网络的识别系统。BP神经网络是一种多层前馈神经网络,它采用了误差反向传播算法。BP神经网络的实现分为学习过程和识别过程两个部分,在学习过程中,同时进行着两个过程,分别是信息的正向传播和误差的反向传播。基于BP算法的前馈网络由输入层、隐层、输出层三个部分组成。BP网络结构如图15所示:

在误差反向传播的过程中,经常采用梯度法修正权值,因此就要求输出函数是可微的,通常我们采用Sigmoid型的激活函数作为输出函数,如公式4-1所示。Sigmoid型函数具有个单元特性,然后把隐含节点的输出信息传送到输出节点,最后就可以将结果输出。通过网络学习的正向和反向传播过程的反复运用可以修改权值,从而得到最小的误差信号。当误差达到理想值时,便可结束网络学习过程。BP神经网络学习训练的步骤如下:在神经网络的初始参数设定后,外界通过输入层将信息传递到中间层的各神经元,根据实际的需要,中间层可以设为一层或者是多层,典型的三层BP神经网络中间层便是设置为一层;信息通过中间层的运算处理之后,经过最后一个中间层将数据传递到输出层,输出层再对这些数据进行最后一步计算,这样BP神经网络就完成一次学习中的正向传播过程。当输出层的输出不等于设定好的期望输出时,神经网络便会进入误差的反向传播阶段。误差按照误差梯度下降的理论方法,由输出层向中间层、输入层传播。通过一次又一次的信息正向传播和误差反向传播,各层权值不断调整,误差也变得越来越小,一直到神经网络输出的误差减少到可以接受时,或者训练次数达到之前的设定次数,神经网络的训练便会结束。

车牌识别的准确率在于模板库建立的大小,要想使车牌识别率高,首先要建立比较大的模板库。汽车牌照的字符一般有7个,第一个字符是汉字,通常代表车辆所属省份,第二位是字母,紧接其后的为字母与数字的混合。

16 主要程序代码(要求必须有注释)

% clear
% clc
%%  读取样本数据
DATADIR='.\sample\';                                   % 待处理图像目录 
dirinfo=dir(DATADIR);                                 % 获取图像目录所有文件信息
Name={dirinfo.name};                                   % 获取文件名
Name(1:2)=[];                                          % 去除文件夹固有信息
[nouse num_of_char]=size(Name);                        % 获取类别数量
count = 1;
images = [];
labels = [];
for  cnt=1  :num_of_char                               % for 循环读取所有文件夹
      pathname=horzcat(DATADIR, Name{cnt},'\');        % 把路径和名字融合一起
      sub_dirinfo=dir(pathname);                       % 获取图像目录所有文件信息
      sub_Name={sub_dirinfo.name};                     % 获取文件名
      sub_Name(1:2)=[];  
      [nouse num_of_image]=size(sub_Name); 
      for i = 1: num_of_image
      image = imread(horzcat(pathname,sub_Name{i}));
      if size(image,3) >1 
          image = rgb2gray(image);
      end
      bw  = im2bw(image,graythresh(image));
      bw1 = double(reshape(bw,288,1));
      images = [images,bw1];
      labels(count) = cnt;
      count = count +1;
      end
end
%% 设置神经网络参数并训练
input_layer_size  = 288;          % 12x24  输入图像大小
hidden_layer_size = 30;           % 隐含层个数
num_labels = num_of_char;         % 标签个数  

X = images';                        
y = labels'; 

initial_Theta1 = randInitializeWeights(input_layer_size, hidden_layer_size);   %初始化神经网络参数
initial_Theta2 = randInitializeWeights(hidden_layer_size, num_labels);  %初始化神经网络参数
initial_nn_params = [initial_Theta1(:) ; initial_Theta2(:)];    
options = optimset('MaxIter', 500);   
lambda = 1;
costFunction = @(p) nnCostFunction(p, ...                  % 用训练样本计算最优参数
                                   input_layer_size, ...
                                   hidden_layer_size, ...
                                   num_labels, X, y, lambda);
[nn_params, cost] = fmincg(costFunction, initial_nn_params, options);
Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
                 hidden_layer_size, (input_layer_size + 1));
Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
                 num_labels, (hidden_layer_size + 1));
             
%% 测试  可修改测试函数         
% images_test0 = imread(['3.jpg']);
% images_test1 = imresize(images_test0,[24 12]);  
% bw  = im2bw(images_test1,graythresh(images_test1));
% images_test = double(reshape(bw,288,1));
% pred = predict(Theta1, Theta2, images_test');                     
% Name{pred}             

 17 运行结果及分析

  • 0
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小蜗牛,大大梦想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值