• Halcon自动化训练OCR分类器举例


    进行OCR的时候,同一个字符,通常需要很多字符小图,这样图片多了,才能训练出健壮的分类器。如何自动化地执行该过程呢?我提供一种思路。

    待训练的图片集如下:

    其中,“文件夹0”和“文件夹1”中有多张图片,例如“文件夹1”中的图片是这样的(图片名称第一个字符都是“1”):

    训练OCR分类器的完整代码如下:

     1 set_font (200000, 'Arial'+'-Bold-20')
     2 dev_set_draw ('margin')
     3 
     4 ImageFolder := '第2行data'
     5 
     6 
     7 list_files (ImageFolder, ['files','follow_links','recursive'], ImageFiles)
     8 tuple_regexp_select (ImageFiles, ['\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima)$','ignore_case'], ImageFiles)
     9 
    10 gen_empty_obj (Images)
    11 gen_empty_obj (RegionChars)
    12 Chars := []
    13 
    14 for Index := 0 to |ImageFiles| - 1 by 1
    15     read_image (Image, ImageFiles[Index])
    16     parse_filename (ImageFiles[Index], BaseName, Extension, Directory)
    17     count_channels (Image, Channels)
    18     if (Channels != 1)
    19         rgb1_to_gray (Image, Image)
    20     endif
    21     
    22     *取文件名的第一个字符(例如字符1可能有多张图片,图片原始名字可能为11.bmp、12.bmp、13.bmp……)
    23     tuple_substr (BaseName, 0, 0, BaseNameReal)
    24     
    25     *增强图像对比度
    26     scale_image_max (Image, Image)
    27     emphasize (Image, Image, 11, 11, 1)
    28 
    29     if (BaseNameReal == '.')
    30         BaseNameReal := '.'
    31     endif
    32     
    33     threshold (Image, Region, 0, 152)
    34 *     binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
    35     opening_circle (Region, Region, 1)
    36     fill_up_shape (Region, Region, 'area', 1, 100)
    37     
    38     *将字符图像、字符区域、字符文本分别添加到Images、RegionChars、Chars中
    39     concat_obj (Images, Image, Images)
    40     concat_obj (RegionChars, Region, RegionChars)
    41     Chars := [Chars,BaseNameReal]  
    42     
    43     dev_display (Image)
    44     dev_display (Region)
    45 endfor
    46 
    47 *1.1创建训练文件
    48 TrainFile:='Line2_Words.trf'
    49 * delete_file(TrainFile)
    50 
    51 *1.2将字符区域、字符图像与字符文本关联,保存到.trf训练文件中
    52 for i:=1 to |Chars| by 1
    53     select_obj(RegionChars, SingleWord, i)
    54     select_obj(Images, SingleImage, i)
    55     append_ocr_trainf(SingleWord,SingleImage,Chars[i-1],TrainFile)
    56 endfor
    57 
    58 
    59 ***********************************************************************
    60 
    61 *2.1确定字体分类器文件名
    62 FontFile:='Line2_Words.omc'
    63 
    64 *2.2得到字符标识名(这一步非必须)
    65 read_ocr_trainf_names(TrainFile, CharacterNames, CharacterCount)
    66 
    67 *2.3确定神经网络隐藏层节点数
    68 NumHidden := 80
    69 
    70 *2.4创建神经网络分类器
    71 create_ocr_class_mlp(42, 67, 'constant', 'default', CharacterNames, NumHidden, 'none', 10, 42, OCRHandle)
    72 
    73 *2.5训练神经网络
    74 trainf_ocr_class_mlp(OCRHandle, TrainFile, 200, 1, 0.9, Error, ErrorLog)
    75 
    76 *2.6保存训练结果
    77 write_ocr_class_mlp(OCRHandle, FontFile)
    78 
    79 *2.7清除句柄
    80 clear_ocr_class_mlp(OCRHandle)
  • 相关阅读:
    CentOS7 安装Redis Cluster集群
    CentOS7 安装Redis 单机版
    CentOS7 配置免密登陆
    深入java虚拟机学习 -- 内存管理机制
    深入java虚拟机学习 -- 类的卸载
    深入java虚拟机学习 -- 类的加载机制(四)
    深入java虚拟机学习 -- 类的加载机制(三)
    深入java虚拟机学习 -- 类的加载机制(续)
    (原创)cocos lua 热更新从零开始(一)最简单demo
    lua 调用参数报错(a userdata value)
  • 原文地址:https://www.cnblogs.com/xh6300/p/13393031.html
Copyright © 2020-2023  润新知