OCR+CNN完成铭牌字符识别【MATLAB】

RCNN问世之前传统的方法为OCR提取,将OCR提取到的字符进行归一化处理,再使用CNN或者SVM进行识别
下列为搭建的一个简易操作截面,流程为按钮部分:

image.png

第一步:选择图像

选择指定图像显示在左侧坐标区域,稍后的OCR操作也是在左侧的AXES1内完成。

global I;
[filename, filepath]=uigetfile('*.bmp;*.jpg;*.png'); %选择图像文件
I=imread([filepath filename]);%读取完整路径的图像
axes(handles.axes1); %指定显示的图像位置
imshow(I); %显示图像矩阵
复制代码

第二步: 执行OCR

在执行OCR操作前可以将图像灰度化,这是为了后面的图像识别步骤能够节约空间,同时也避免在归一化的时候对五张字符都进行灰度化
OCR操作的时候,使用imcrop函数完成,大家详细资料可以参考mathwork上的介绍;由于铭牌上的字符为5位,故而只需要贴出5个坐标区就行了

global I;
global X1;
global X2;
global X3;
global X4;
global X5;
if size(I,3) ~= 1
    I = rgb2gray(I);
end
X1 = imcrop(I);
X2 = imcrop(I);
X3 = imcrop(I);
X4 = imcrop(I);
X5 = imcrop(I);
axes(handles.axes2)
imshow(X1)
axes(handles.axes3)
imshow(X2)
axes(handles.axes4)
imshow(X3)
axes(handles.axes6)
imshow(X4)
axes(handles.axes5)
imshow(X5)
复制代码

第三步:归一化

由于在CNN识别前需要将图像归一化同等大小,而在执行OCR时就已经完成了灰度化操作,此时的图像都是灰度化后的图像,此时借用函数:imresize
这里我没有采用降噪滤波增强,偷懒了,大家在做的时候可以自行加上。

%%
global X1;
global X2;
global X3;
global X4;
global X5;

%%
global X1X;
global X2X;
global X3X;
global X4X;
global X5X;
%%
X1X = imresize(X1,[70,70]); % 都变成70 70的图像
axes(handles.axes2)
imshow(X1X)
%%
X2X = imresize(X2,[70,70]);  
axes(handles.axes3)
imshow(X2X)
%%
X3X = imresize(X3,[70,70]);  
axes(handles.axes4)
imshow(X3X)
%%
X4X = imresize(X4,[70,70]); 
axes(handles.axes5)
imshow(X4X)
%%
X5X = imresize(X5,[70,70]);  
axes(handles.axes6)
imshow(X5X)
复制代码

第四步:识别字符

这里我使用了AlexNet网络结构,大家可以参考本人:juejin.cn/post/707478… 这里有详细介绍该网络的结构,同时也可参考:juejin.cn/post/707478… 这里是使用Deep Network Designer的教程
为什么不使用更高级的网络结构:根据奥姆卡剃须刀原理,可以避免过拟合现象出现,同时也实属没必要,浪费算力。

load numdata.mat
global X1X;
global X2X;
global X3X;
global X4X;
global X5X;
Y1 = classify(net,X1X);%预测数据  
YPred1=cellstr(Y1);
Y2 = classify(net,X2X);%预测数据  
YPred2=cellstr(Y2);
Y3 = classify(net,X3X);%预测数据  
YPred3=cellstr(Y3);
Y4 = classify(net,X4X);%预测数据  
YPred4=cellstr(Y4);
Y5 = classify(net,X5X);%预测数据  
YPred5=cellstr(Y5);
set(handles.edit1,'string',YPred1);
set(handles.edit2,'string',YPred2);
set(handles.edit3,'string',YPred3);
set(handles.edit4,'string',YPred4);
set(handles.edit5,'string',YPred5);
复制代码

初始化

这个步骤就不多叙述了。

clc
axes(handles.axes1);
cla reset 
axes(handles.axes2);
cla reset 
axes(handles.axes3);
cla reset 
axes(handles.axes4);
cla reset 
axes(handles.axes5);
cla reset 
axes(handles.axes6);
cla reset 
A = " ";
set(handles.edit1,'string',A)
set(handles.edit2,'string',A)
set(handles.edit3,'string',A)
set(handles.edit4,'string',A)
set(handles.edit5,'string',A)
复制代码

操作截图:

步骤1:选择图像 image.png

步骤2:执行OCR image.png image.png

步骤3:预处理 image.png

步骤4:识别字符

image.png

おすすめ

転載: juejin.im/post/7075615299386474510