💥1 概述
字符识别长期以来都是采用传统的识别方法, 对印刷体字符的识别率一般只是稳定在96%左右, 未能进一步提高, 而对手写体字符的识别, 其研究还处于探索阶段, 其识别率还相当低, 因此, 为了提高识别率, 就必须寻求新的方法和途径。
20世纪80年代中期, 人们已经开始利用人工神经网络解决手写体数字识别问题。人工神经网络为OCR研究提供了新的手段, 它具有一些传统技术所没有的特点:1) 具有很强的分类能力, 可以在特征空间内形成任意复杂的决策区域;2) 硬件实现后的神经网络分类速度比传统方法快得多;3) 分类器便于训练, 无需人为过多的干预。特别是对手写体字符识别问题, 神经网络技术更显示出独特的优越性。
目前研究的神经网络字符识别系统可划分为两大类.第一类系统实际上是传统方法与神经网络技术的结合, 这也是本文采用的方法.这类系统分为两块, 第一块主要完成样本模式预处理和字符特征抽取任务, 第二块是用前面获得的模式特征来训练神经网络分类器, 从而达到识别字符的目的。这类系统充分利用了人的经验来获取模式特征以及神经网络的杰出分类能力来识别字符, 是人们通常采用的方法。第二类系统省去了特征抽取工作, 整个字符直接作为神经网络的输入, 这类系统的神经网络结构的复杂度大大增加了, 首先输入模式维数的增加导致网络规模的庞大, 使得网络的训练、学习非常困难。此外神经网络结构上要消除模式变形的影响。通常这类网络都采用局部连接的方式减少网络的复杂度, 并采用共享连接权的策略增强网络抗变形 (输入模式) 的能力。
由于人工神经网络具有并行处理和很强的容错性等特点, 因此有可能大大提高手写体字母数字识别的准确率和速度。目前神经网络手写体字母数字识别系统的识别水平已与传统模式方法相当, 且大有提高的余地。本文阐述了利用BP网络进行手写体字母 (小写) 、数字识别的一些尝试, 取得了令人满意的测试结果。
📚2 运行结果
🎉3 参考文献
[1]余波,简炜,方勇.利用Matlab神经网络工具箱在VC++.net中进行手写体数字识别[J].湖北汽车工业学院学报,2007(01):39-42.
👨💻4 Matlab代码
主函数部分代码:
%实现一个手写体数字识别的神经网络训练程序 clc; clear; load('X.mat', 'X'); load('data.mat','y'); %测试集100张图片 testData=[X(1:10,:);X(501:510,:);X(1001:1010,:);X(1501:1510,:);X(2001:2010,:);X(2501:2510,:);X(3001:3010,:);X(3501:3510,:);X(4001:4010,:);X(4501:4510,:)]; testResult=[y(1:10,:);y(501:510,:);y(1001:1010,:);y(1501:1510,:);y(2001:2010,:);y(2501:2510,:);y(3001:3010,:);y(3501:3510,:);y(4001:4010,:);y(4501:4510,:)]; % image = reshape(X(1,:),20,20); % imshow(image) %准备训练数据 num=200; %每个数字训练数据集的大小,最大490 trainingData=[X(11:10+num,:);X(511:510+num,:);X(1011:1010+num,:);X(1511:1510+num,:);X(2011:2010+num,:);X(2511:2510+num,:);X(3011:3010+num,:);X(3511:3510+num,:);X(4011:4010+num,:);X(4511:4510+num,:)]; trainingTarget=[y(11:10+num,:);y(511:510+num,:);y(1011:1010+num,:);y(1511:1510+num,:);y(2011:2010+num,:);y(2511:2510+num,:);y(3011:3010+num,:);y(3511:3510+num,:);y(4011:4010+num,:);y(4511:4510+num,:)]; trainingTarget(1:num) = zeros(1,num); testResult(1:10) = zeros(1,10); save('trainingTarget.mat','trainingTarget') trainX = trainingData'; trainT = trainingTarget'; testX = testData'; testT = testResult'; algorithms = char('traingd','traingdx','trainrp','traincgf','traincgp','traincgb','trainscg','trainoss','trainbr','trainlm'); node_s = [20,30,40,50,60]; lr_s = [0.01,0.005,0.001,0.0005,0.0001]; regression_test = zeros(1,5); regression_train = zeros(1,5); performance_test = zeros(1,5); performance_train = zeros(1,5); for i = 1:length(lr_s) % [x,t] = building_dataset; net = feedforwardnet([50,10]); % net.trainFcn = strtrim(algorithms(3,:)); net.trainFcn = 'traincgf'; % net.divideParam.trainRatio = 70/100; % net.divideParam.valRatio = 15/100; % net.divideParam.testRatio = 15/100; net.trainParam.epochs = 10000; %设置训练回合数 net.trainParam.goal = 0; %设置训练目标 net.trainParam.lr = lr_s(i); % 设置学习率 % net.trainParam.max_fail = 100; net.divideFcn = ''; % view(net) % 训练神经网络 [net,TR] = train(net,trainX,trainT); file_path_name_ = [save_path,num2str(i)]; if exist(file_path_name_)==0 %该文件夹不存在,则直接创建 mkdir(file_path_name_); end