Halcon学习笔记(八)——OCR初步创建并训练OCR分类器

第一讲

OCR:(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。
摘自百度百科
这一部分我们主要利用letter_mlp的例程进行分析, 这个例程展示了怎样实现一个简单的OCR分类器,下面进行逐句解读。
首先我们要创建一个分类器是用于训练的,按照训练的思路,第一步就是要有训练字符,第二步是要知道训练字符的标签,第三步才是进行训练。下面我们一步一步来实现。

第一步:读取图片和显示图片,并获取图片参数,主要是长和宽,这里dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)表示打开一个适应图像尺寸的窗口,并设置颜色,获取图片路径之后定义训练文件名。

* This example program shows how to use a simple MLP OCR classifier
*
dev_update_off ()
read_image (Image, 'letters')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_colored (12)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
get_tmp_dir (TmpDir)
TrainFile := TmpDir + '/letters.trf'
dev_display (Image)

执行这一段代码之后得到
Halcon学习笔记(八)——OCR初步创建并训练OCR分类器_第1张图片
第二步:形成训练数据。
生成一个矩形区域,并与原图做差,即从原图中分割出这个区域的内容作为训练数据

gen_rectangle1 (Rectangle, 0, 0, Height - 1, 400)
reduce_domain (Image, Rectangle, Image)
* Segment the image

接着执行这一段代码得到以下内容,即从原图中分割出该矩形区域的内容。
Halcon学习笔记(八)——OCR初步创建并训练OCR分类器_第2张图片

第三步:对训练数据分割并排序
加下来对分割下来的部分进行处理。首先进行快速二值化binary_threshold,(快速二值化一般用于背景简单的内容)需要注意的是,快速二值化的参数dark表示需要处理的部分为黑色。由于字母ij为两个部分组成,所以需要先进行膨胀dilation_circle,使其成为一个连通域之后再进行打散操作connection,然后通过求交集intersection的方式,将膨胀后的字母还原成原来的大小。注意,在求交集运算中,即使最终ij上的点没有与下面连接,依然是一个连通域,打散之后进行排序操作sort_region,这里选用按字符行排列。

binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
* Connect the i's and j's with their dots
dilation_circle (Region, RegionDilation, 3.5)
* Compute the correct connected components
connection (RegionDilation, ConnectedRegions)
* Reduce each connected component (character) to its original shape
intersection (ConnectedRegions, Region, RegionIntersection)
* Sort the characters line-by-line
sort_region (RegionIntersection, Characters, 'character', 'true', 'row')
dev_display (Characters)
disp_message (WindowHandle, 'Training characters', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

运行以上代码得到
Halcon学习笔记(八)——OCR初步创建并训练OCR分类器_第3张图片
第四步:建立图片字符与理论字符的关联文件
先计算字符个数、训练数据每一行的长度,定义数组Classes,用于存储字母a ~ .ord('a') + j表示将a转成ASCII编码后加j表示其他字母的ASCII编码,chr(ord('a') + J))表示将ASCII编码转化为字符,gen_tuple_const(Length,chr(ord('a') + J))表示生成Length长的该字符tuplewrite_ocr_trainf (Characters, Image, Classes, TrainFile)表示将Image中的训练字符charactersClasses一一关联,存储在文件TrainFile中。

* Compute the true class of each character
count_obj (Characters, Number)
Length := Number / 27
Classes := []
for J := 0 to 25 by 1
    Classes := [Classes,gen_tuple_const(Length,chr(ord('a') + J))]
endfor
Classes := [Classes,gen_tuple_const(Length,'.')]
* Construct the necessary training file from the segmented characters
write_ocr_trainf (Characters, Image, Classes, TrainFile)

执行得到Classes数组的内容
Halcon学习笔记(八)——OCR初步创建并训练OCR分类器_第4张图片
至此,Classes数组与图片中的字符建立关联,关联文件为TrainFile。可以借助OCR训练文件浏览器查看,这里在汉字识别部分会进行补充。

第五步:训练OCR分类器
读取训练文件TrainFile,使用多层感知器创建一个OCR分类器create_ocr_class_mlp,配置如下:
Halcon学习笔记(八)——OCR初步创建并训练OCR分类器_第5张图片
使用MLP训练一个OCR分类器trainf_ocr_class_mlp,设置训练参数,即最大迭代次数、权重和容错率

* Create the classifier.  We read out the classes from the train file.
* Therefore, the training part of the program is generic and can be
* used to train any OCR classifier.
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 20, 'normalization', 26, 42, OCRHandle)
* Train the classifier
trainf_ocr_class_mlp (OCRHandle, TrainFile, 100, 0.01, 0.01, Error, ErrorLog)
* 

执行至此,我们已经完成了一个OCR分类器的训练,下面进行测试。

第六步:测试
首先扩展图片,full_domain,输入一个矩形,其边长为图像的新定义域。这意味着矩阵的所有像素都包含在进一步的操作中。因此,通过读取或生成图像来获得相同的定义域。矩阵的大小不会改变。
然后进行快速二值化等处理,这一步操作与第二步类似,不加赘述。
接下来使用刚刚训练的OCR分类器进行测试do_ocr_multi_class_mlp,对Image中排好序的Characters利用刚刚训练的OCR分类器,句柄为OCRHandle进行测试,测试结果为Class,精度为Confidence

* Now test the classifier on the whole training image
full_domain (Image, Image)
* Segment characters the same way as before
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold1)
dilation_circle (Region, RegionDilation, 3.5)
connection (RegionDilation, ConnectedRegions)
intersection (ConnectedRegions, Region, RegionIntersection)
sort_region (RegionIntersection, Characters, 'character', 'true', 'row')
* Classification
do_ocr_multi_class_mlp (Characters, Image, OCRHandle, Class, Confidence)
* 

执行至此,可以看到控制变量窗口处的Class变量为
在这里插入图片描述
完成此次OCR训练器的测试

第七步:显示
首先测得每个字符的面积、行、列,设置显示字体,显示Class的内容。

* Display results
area_center (Characters, Area, Row, Column)
dev_display (Image)
set_display_font (WindowHandle, 16, 'sans', 'true', 'false')
disp_message (WindowHandle, Class, 'image', Row - 16, Column + 8, 'blue', 'false')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
disp_message (WindowHandle, 'Classification result', 'window', 12, 12, 'black', 'true')
dev_set_check ('~give_error')
delete_file (TrainFile)
dev_set_check ('give_error')

执行至此,可以看到训练结果
Halcon学习笔记(八)——OCR初步创建并训练OCR分类器_第6张图片

总结
这个简单的OCR识别例程就分析到这里,首先要得到单个的训练数据,然后创建分类器,训练分类器,最后测试并显示。

你可能感兴趣的:(halcon学习笔记)