首页 >> 大全

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

2023-08-07 大全 38 作者:考证青年

这一部分我们主要利用的例程进行分析, 这个例程展示了怎样实现一个简单的OCR分类器,下面进行逐句解读。

首先我们要创建一个分类器是用于训练的,按照训练的思路,第一步就是要有训练字符,第二步是要知道训练字符的标签,第三步才是进行训练。下面我们一步一步来实现。

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

* 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)

执行这一段代码之后得到

第二步:形成训练数据。

生成一个矩形区域,并与原图做差,即从原图中分割出这个区域的内容作为训练数据

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

接着执行这一段代码得到以下内容,即从原图中分割出该矩形区域的内容。

第三步:对训练数据分割并排序

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

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 ()

运行以上代码得到

第四步:建立图片字符与理论字符的关联文件

先计算字符个数、训练数据每一行的长度,定义数组,用于存储字母a ~ .,ord('a') + j表示将a转成ASCII编码后加j表示其他字母的ASCII编码,chr(ord('a') + J))表示将ASCII编码转化为字符,(,chr(ord('a') + J))表示生成长的该字符tuple, (, Image, , )表示将Image中的训练字符与一一关联,存储在文件中。

* Compute the true class of each character
count_obj (Characters, Number)
Length := Number / 27
Classes := []
for J := 0 to 25 by 1Classes := [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)

执行得到数组的内容

至此,数组与图片中的字符建立关联,关联文件为。可以借助OCR训练文件浏览器查看,这里在汉字识别部分会进行补充。

第五步:训练OCR分类器

读取训练文件,使用多层感知器创建一个OCR分类器,配置如下:

使用MLP训练一个OCR分类器,设置训练参数,即最大迭代次数、权重和容错率

* 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分类器的训练,下面进行测试。

学习角的初步认识的教案__飞盘狗初步训练

第六步:测试

首先扩展图片,,输入一个矩形,其边长为图像的新定义域。这意味着矩阵的所有像素都包含在进一步的操作中。因此,通过读取或生成图像来获得相同的定义域。矩阵的大小不会改变。

然后进行快速二值化等处理,这一步操作与第二步类似,不加赘述。

接下来使用刚刚训练的OCR分类器进行测试lp,对Image中排好序的利用刚刚训练的OCR分类器,句柄为进行测试,测试结果为Class,精度为。

* 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')

执行至此,可以看到训练结果

总结

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

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了