• 大屏23Tesseract字库训练Tesseract 3


    大屏23Tesseract字库训练Tesseract 3

    超级详细的Tesseract-OCR样本训练方法

    Sharon Liu 2018-11-05 16:38:52   55039   收藏 163

    分类专栏: C++ java

    版权

    Tesseract-OCR样本训练方法

    一、简介

    Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google维护。

    二、下载

    1.从https://github.com/UB-Mannheim/tesseract/wiki下载tesseract安装包,目前最新的版本是tesseract-ocr-w64-setup-v4.0.0.20181030.exe。

    2.从https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/下载jTessBoxEditor训练工具,目前最新的版本是jTessBoxEditor-2.2.0.zip。

    3.由于jTessBoxEditor是用Java开发的,需要安装Java虚拟机才能运行。从https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载Java JDK,目前最新的版本事jdk-8u191-windows-x64.exe。

    三、安装tesseract

    1.双击tesseract-ocr-setup-4.00.00dev.exe运行。

    2.点击Next。

    3.I accept the terms of the License Agreement前的复选框打勾,点击Next。

    4.Install for anyone using this computer前的复选框打勾,点击Next。

    5.选择需要安装的内容,点击Next。

    6.点击Browse…选择安装路径,默认安装在C:Program Files(x86)Tesseract-OCR,点击Next。

    7.点击Install。

    8.等待安装完成。

    9.点击Next。

    10.Show README前的复选框取消打勾,点击Finish。

    四、安装Java JDK

    1.双击jdk-8u191-windows-x64.exe运行。

    2.点击下一步。

    3.点击更改。

    4.输入安装路径后,点击确定。

    5.点击下一步。

    6.等待安装完成。

    7.点击关闭。

    五、配置Java环境变量

    1.此电脑右键。

    2. 点击属性。

    3.点击高级系统设置。

    4.选择高级->环境变量。

    5.点击新建。

    6.变量名输入JAVA_HOME,变量值输入JDK安装目录,点击确定。

    7.系统变量中,选择Path,点击编辑。

    8.点击新建。

    9.输入%JAVA_HOME%in,点击确定。

    10.点击确定。

    11.点击确定。

    12.重启电脑。

    六、安装jTessBoxEditor

    1.解压

    2.双击jTessBoxEditor-2.2.0

    3.双击jTessBoxEditor

    4.双击jTessBoxEditor,jar运行

    5.出现以下界面则安装成功。

    七、制作训练样本

    1. 运行jTessBoxEditor工具,点击Tools。

    2.点击Merge TIFF。

    3.文件类型选择All Image Files,选择样本图片,点击打开。

    4.文件名输入num.font.exp0.tif,文件类型选择TIFF,点击保存。

    5.点击确定。

    6. 将num.font.exp0.tif文件复制到Tesseract-OCR安装目录。

    7. 生成Box File文件。打开cmd命令行,以管理员身份运行。

    8.进入Tesseract-OCR安装目录。

    9.执行命令:

    tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox 

    生成的box文件为num.font.exp0.box,box文件为Tesseract识别出的字符及其坐标。

    注:Make Box File 文件名有一定的格式,不能随便乱取名字,命令格式为:

    tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox

    其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。

    10. 将上一步生成的.box和.tif样本文件放在同一目录。我是放在Tesseract-OCR默认安装目录下。

    11.运行jTessBoxEditor工具,点击Box Editor。

    12.点击Open。

    13.选择之前生成的num.font.exp0.tif,点击打开。

    14. 可以看出有些字符识别的位置不准确,可以通过该工具手动对每张图片中识别错误的字符和位置进行校正。校正完成后保存即可。

    注: 这里必须修改识别错误的字符,否则做出来的traineddata文件也是错的。可以在下面的界面中修改并保存,也可以直接在traineddata文件中修改。

    15. 定义字体特征文件。创建一个名称为font_properties的字体特征文件。font_properties不含有BOM头,文件内容格式如下:

    <fontname> <italic> <bold> <fixed> <serif> <fraktur>  

    其中fontname为字体名称,必须与[lang].[fontname].exp[num].box中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具有这些属性。

    这里在样本图片所在目录下创建一个名称为font_properties的文件,用记事本打开,输入以下下内容:

    font 0 0 0 0 0

    这里全取值为0,表示字体不是粗体、斜体等等。

    16. 生成语言文件。在样本图片所在目录下创建一个批处理文件,输入如下内容:

    rem 执行改批处理前先要目录下创建font_properties文件 

    echo Run Tesseract for Training.. 

    tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train 

    echo Compute the Character Set.. 

    unicharset_extractor.exe num.font.exp0.box 

    mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr 

    echo Clustering.. 

    cntraining.exe num.font.exp0.tr 

    echo Rename Files.. 

    rename normproto num.normproto 

    rename inttemp num.inttemp 

    rename pffmtable num.pffmtable 

    rename shapetable num.shapetable  

    echo Create Tessdata.. 

    combine_tessdata.exe num.

    17. 执行批处理文件, num.traineddata便是最终生成的语言文件,将生成的num.traineddata拷贝到程序的样本文件夹里,就可以使用了。

    ————————————————

    版权声明:本文为CSDN博主「Sharon Liu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/sylsjane/article/details/83751297

    import requests
    import shelve

    url='Your URL'
    verifyCodeUrl='Your verifyCodeUrl'
    s=requests.Session()

    html=s.get('Your URL').content
    f=open('verifyCode.jpg','wb')
    f.write(html)
    f.close()



    作者:匿名用户
    链接:https://www.zhihu.com/question/21451510/answer/36788950
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    作者:匿名用户
    链接:https://www.zhihu.com/question/21451510/answer/92877734
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    import requests
    from selenium import webdriver
    from xxx import decaptcha
     
    w = webdriver.PhantomJS()
    s = requests.Session()
    w.get(url)
    cookie = []
    for item in w.get_cookies():
        cookie.append(item['name'] + '=' + item['value'])
    c = ';'.join(cookie)
    s.headers.update({'cookie':c})
     
    while not isLogin:
        capt = decaptcha(s.get(captchaUrl).content)
        w.find_element...
        w.send_keys...
     

    发布于 2016-03-30

    ​赞同 13​​22 条评论

    ​分享

    ​收藏​喜欢

    继续浏览内容

    知乎

    发现更大的世界

    打开

    Chrome

    继续

    张楠

    我用的方法也是截图,将网页固定大小,截图后使用OCR技术进行识别。不过这个截图方法太死板,我希望有一个可以获取验证码在屏幕坐标的函数,那样就可以截取一个固定大小,无论验证码在屏幕的任何位置都可以去截取而不用修改代码。

    包使用的是tesseract-ocr

    import win32gui
    from ctypes import *

    import ctypes
    from PIL import ImageGrab

    import win32api,win32con
    import pyHook

    import pythoncom
    from selenium import webdriver

    import os
    import time

    #此处登录网站并且输入用户名密码
    browser = webdriver.Chrome()

    browser.get("此处输入你的网址")
    browser.find_element_by_id("username").send_keys("用户名")

    browser.find_element_by_id("password").send_keys("密码")
    #对验证码部分进行截图

    while (1):
    class RECT(ctypes.Structure):

    _fields_ = [('left', ctypes.c_int),
    ('top', ctypes.c_int),

    ('right', ctypes.c_int),
    ('bottom', ctypes.c_int)]

    rect = RECT()
    HWND = win32gui.GetForegroundWindow()

    ctypes.windll.user32.GetWindowRect(HWND, ctypes.byref(rect))
    # 下面这行是只截取验证码这个区域
    coordinate = (rect.left+432, rect.top+463, rect.right-420, rect.bottom-525)

    pic = ImageGrab.grab(coordinate)
    pic.save("D:\verificationcode.jpg")

    #使用OCR技术进行识别
    command = "tesseract verificationcode.jpg d:\verresult"

    os.system(command)
    f = open("d:\verresult.txt",'r')

    line = f.read(4)
    #print line

    f.close()
    g=line.isalnum()

    #print g
    #枚举识别,如果识别失败则重新截图识别,直到进入系统。

    if g:
    browser.find_element_by_id("authcode").send_keys(line)

    browser.find_element_by_xpath("//button[@type='submit']").click()
    #print "click submit ok"

    time.sleep(2)
    # 获取系统的title,比如成功登录进去以后的title是“系统首页”
    if u"系统首页" == browser.title :

    print "login success"
    break

    else:
    #下面就是验证码错误以后的处理,比如点掉提示验证码错误的框等等。
    #print "login faild"

    time.sleep(2)
    browser.find_element_by_id("okBtn").click()

    #print "click okbtn ok"
    time.sleep(2)

    browser.find_element_by_id("authCodeImg").click()
    #print "click codeimg ok"

    else:
    browser.find_element_by_id("authCodeImg").click()

    如果不跨域,注入 js,【把 img 画到 canvas,然后 toDataURL】或【xhr 然后 readAsDataURL】,把 base64 写入文本节点或者什么属性里面,然后再外面获取就是了

    Tesseract-OCR 图片数字识别的样本训练

    一声笑555 2018-06-12 16:57:22   15641   收藏 35

    分类专栏: python 文章标签: python pytesseract Tesseract-OCR jTessBoxEditor

    版权

    最近想利用python写一段识别穿越火线交易所各种道具价格的代码。命令行执行:

    tesseract.exe grab.jpg result -l eng

    使用默认的Tesseract语言库总会识别成字母或者乱码,如下图:

    于是参考https://blog.csdn.net/yasi_xi/article/details/8763385这篇帖子,训练了一个对游戏中数字识别度较高的样本库。

    训练样本:

    待识别的图像如下图中出售价格及我的CF点

    python代码:

    import win32con

    import win32gui

    import pytesseract

    from PIL import ImageGrab

    import time

    def get_bin_table(threshold=105):

        # 获取灰度转二值的映射table

        table = []

        for i in range(256):

            if i < threshold:

                table.append(0)

            else:

                table.append(1)

        return table

    def grab():

        hwnd = win32gui.FindWindow(0, "Crossfire20170910_0000.bmp - 画图")  # 获取句柄

        print(hwnd)

        left, top, right, bottom = win32gui.GetWindowRect(hwnd)

        print(left, top, right, bottom)

        win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)

        win32gui.SetForegroundWindow(hwnd)

        time.sleep(0.2)

        img = ImageGrab.grab((870,478,913,495))  # 截图,获取需要识别的区域

        img.show()

        imggray = img.convert('L')  # 转化为灰度图

        table = get_bin_table()

        out = imggray.point(table, '1')

        #out.show()

        text = pytesseract.image_to_string(out)  # 使用简体中文解析图片则改为chi_sim

        text = text.upper()

        print(text)

        # img.save('C:/Users/Ysx/PycharmProjects/ocr/out/%s.jpg' % text)

    if __name__ == '__main__':

        grab()

    使用默认的语言库识别成功率不高,会识别为乱码或者字母。所以计划自己训练一个只能识别数字的准确语言库。

    1.训练环境:首先安装jdk-10.0.1_windows-x64_bin.exe,它是java的运行环境。然后下载工具jTessBoxEditor,它是训练样本的工具。

    2.样本图像:从CF截图如下图像(越多越好,不过总共也就10个数字)。

    3.合并图像:运行jTessBoxEditor,菜单栏中Tools--Merge TIFF。在弹出的对话框中选择样本图像(按Shift选择多张),合并名为num.font.exp0.tif文件。

    4.生成Box file文件:

            命令行执行:    

     cd C:UsersYsxPycharmProjectsocr rain

    tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox

    * 生成num.font.exp0.box,BOX文件为Tessercat识别出的文字和其坐标。

    5.文字校正:jTessBoxEditor工具打开num.font.exp0.tif,增加未识别的、修改识别错误的数字。

    6.定义字体特征文件:(当前目录下新建记事本,输入font 0 0 0 0 0,存为font_properties,注意删除.txt后缀)

    格式应为<fontname> <italic> <bold> <fixed> <serif> <fraktur>,取值1/0代表是否拥有对应属性。

    7.生成语言文件:(当前目录下新建记事本,输入下列代码,存为1.bat)

    rem 执行改批处理前先要目录下创建font_properties文件  

    echo Run Tesseract for Training.. 

    tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train 

     

    echo Compute the Character Set.. 

    unicharset_extractor.exe num.font.exp0.box 

    mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr 

     

    echo Clustering.. 

    cntraining.exe num.font.exp0.tr 

     

    echo Rename Files.. 

    rename normproto num.normproto 

    rename inttemp num.inttemp 

    rename pffmtable num.pffmtable 

    rename shapetable num.shapetable  

     

    echo Create Tessdata.. 

    combine_tessdata.exe num.

    双击1.bat执行,生成的num.traineddata存到对应的Tesseract-OCR essdata目录。

    8.使用训练得到的num语言库:

    命令行执行:

    tesseract.exe grab.jpg result -l num

    原来不易识别的数字可以识别了,下一步就是做交易价格低于某值的时候自动操作购买道具的代码了。

    Tesseract-OCR安装和pytesseract配置参考http://www.inimei.cn/archives/297.html

    字库训练https://blog.csdn.net/a443475601/article/details/9854003

    ————————————————

    版权声明:本文为CSDN博主「一声笑555」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/u012555556/article/details/80666809

    Tesseract 3.02字库训练

    苹果皮 2013-08-09 13:41:57   21604   收藏 6

    版权

    下载chi_sim.traindata字库

    下载tesseract-ocr-setup-3.02.02.exe

    下载地址:http://code.google.com/p/tesseract-ocr/downloads/list

    下载jTessBoxEditor用于修改box文件

    下载地址:http://download.csdn.net/detail/a443475601/5896893 里面自带java运行库,安装后 然后启动命令行 java -jar jTessBoxEditor.jar即可打开

    为了方便 tif文面命名格式[lang].[fontname].exp[num].tif

    lang是语言 fontname是字体

    比如我们要训练自定义字库 image 字体名MyFont

    那么我们把tif文件重命名 image.MyFont.exp0.tif

    下面开始训练字库:

    1、tesseract image.MyFont.exp0.tif image.MyFont.exp0 -l chi_sim batch.nochop makebox

    该步骤会生成一个image.MyFont.exp0.box文件

    把tif文件和box文件放在同一目录,用jTessBoxEditor.jar打开tif文件,然后根据实际情况修改box文件

    2、tesseract image.MyFont.exp0.tif image.MyFont.exp0 nobatch box.train

    该步骤生成一个image.MyFont.exp0.tr文件

    3、unicharset_extractor image.MyFont.exp0.box

    该步骤生成一个unicharset文件

    4、新建一个font_properties文件

    里面内容写入MyFont 0 0 0 0 0 表示默认普通字体

    5、运行命令

    shapeclustering -F font_properties -U unicharset image.MyFont.exp0.tr

    mftraining -F font_properties -U unicharset -O image.unicharset image.MyFont.exp0.tr

    cntraining image.MyFont.exp0.tr

    6、把目录下的unicharset、inttemp、pffmtable、shapetable、normproto这五个文件前面都加上image.

    7、执行combine_tessdata image.

    然后把image.traineddata放到tessdata目录

    8、用新的字库对图片进行分析

    tesseract test.tif output -l image

    ————————————————

    版权声明:本文为CSDN博主「苹果皮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/a443475601/article/details/9854003

    Tesseract-OCR 字符识别---样本训练

    yasi_xi 2013-04-06 09:53:59  91292  收藏 11

    转自:http://blog.csdn.net/feihu521a/article/details/8433077

            Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google维护,目前发布在Googel Project上。地址为http://code.google.com/p/tesseract-ocr/



    使用默认的语言库识别

    1.安装Tesseract

            从 http://code.google.com/p/tesseract-ocr/downloads/list下载Tesseract,目前版本为Tesseract3.02。因为只是测试使用,这里直接下载winodws下的安装文件tesseract-ocr-setup-3.02.02.exe。安装成功后会在相应磁盘上生成一个Tesseract-OCR目录。通过目录下的tesseract.exe程序就可以对图像字符进行识别了。

    2.准备一副待识别的图像,这里用画图工具随便写了一串数字,保存为number.jpg,如下图所示:

            

    3.  打开命令行,定位到Tesseract-OCR目录,输入命令:

    [plain]  view plain copy

    1. tesseract.exe number.jpg result -l eng  

         其中result表示输出结果文件txt名称,eng表示用以识别的语言文件为英文。

    3.  打开Tesseract-OCR目录下的result.txt文件,看到识别的结果为7542315857,有3个字符识别错误,识别率还不是很高,那有没有什么方法来提供识别率呢?Tesseract提供了一套训练样本的方法,用以生成自己所需的识别语言库。下面介绍一下具体训练样本的方法。



         



    训练样本

    关于如何训练样本,Tesseract-OCR官网有详细的介绍 http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。这里通过一个简单的例子来介绍一下如何进行样本训练。

    1.下载工具jTessBoxEditor. http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,这个工具是用来训练样本用的,由于该工具是用JAVA开发的,需要安装JAVA虚拟机才能运行。

    2. 获取样本图像。用画图工具绘制了5张0-9的文样本图像(当然样本越多越好),如下图所示:

      

      



    3.合并样本图像。运行jTessBoxEditor工具,在点击菜单栏中Tools--->Merge TIFF。在弹出的对话框中选择样本图像(按Shift选择多张),合并成num.font.exp0.tif文件。

    4.生成Box File文件。打开命令行,执行命令:

    [plain]  view plain copy

    1. tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox  

      生成的BOX文件为num.font.exp0.box,BOX文件为Tessercat识别出的文字和其坐标。

    注:Make Box File 文件名有一定的格式,不能随便乱取名字,命令格式为:

    [plain]  view plain copy

    1. tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox  

    其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。

    Yasi:先前自己定义了tessdata的环境变量 TESSDATA_PREFIX 值为 E: esseract essdata,但没有从tesseract源文件目录中将tessdata子目录中的内容copy到 E: esseract essdata 中,造成上面的命令报错,说找不到batch.nochop makebox。解决办法: tesseract 源文件目录中所有文件和子文件夹(可能充分但非必要,先不管这些啦)copy E: esseract essdata

    5.文字校正。运行jTessBoxEditor工具,打开num.font.exp0.tif文件(必须将上一步生成的.box和.tif样本文件放在同一目录),如下图所示。可以看出有些字符识别的不正确,可以通过该工具手动对每张图片中识别错误的字符进行校正。校正完成后保存即可。

    Yasi】这里必须修改识别错误的字符,否则做出来的traineddata文件也是错的。可以在下面的界面中修改并保存,也可以直接在traineddata文件中修改。



    6.定义字体特征文件。Tesseract-OCR3.01以上的版本在训练之前需要创建一个名称为font_properties的字体特征文件。

    font_properties不含有BOM头,文件内容格式如下:

    [plain]  view plain copy

    1. <fontname> <italic> <bold> <fixed> <serif> <fraktur>  

    其中fontname为字体名称,必须与[lang].[fontname].exp[num].box中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具有这些属性。

    这里在样本图片所在目录下创建一个名称为font_properties的文件,用记事本打开,输入以下下内容:

    [plain]  view plain copy

    1. font 0 0 0 0 0  

    这里全取值为0,表示字体不是粗体、斜体等等。

    7.生成语言文件。在样本图片所在目录下创建一个批处理文件,输入如下内容。

    [plain]  view plain copy

    1. rem 执行改批处理前先要目录下创建font_properties文件  
    2. echo Run Tesseract for Training..  
    3.   
    4. unicharset_extractor.exe num.font.exp0.box  
    5.   
    1.   
    1. tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train  
    1. echo Compute the Character Set..  
    1. mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr  
    1. echo Clustering..  

    11. cntraining.exe num.font.exp0.tr  

    1.   

    13. echo Rename Files..  

    1. rename normproto num.normproto  

    15. rename inttemp num.inttemp  

    1. rename pffmtable num.pffmtable  

    17. rename shapetable num.shapetable   

    1.   

    19. echo Create Tessdata..  

    1. combine_tessdata.exe num.  

    将批处理通过命令行执行。执行后的结果如下:

    需确认打印结果中的Offset 1、3、4、5、13这些项不是-1。这样,一个新的语言文件就生成了。

    num.traineddata便是最终生成的语言文件,将生成的num.traineddata拷贝到Tesseract-OCR-->tessdata目录下。可以用它来进行字符识别了。

    使用训练后的语言库识别

    用训练后的语言库识别number.jpg文件, 打开命令行,定位到Tesseract-OCR目录,输入命令:

    [plain]  view plain copy

    1. tesseract.exe number.jpg result -l eng  

    识别结果如如图所示,可以看到识别率提高了不少。通过自定义训练样本,可以进行图形验证码、车牌号码识别等。感兴趣的朋友可以研究研究。

    【Yasi】试验结果如下:

    下面是num-yasi.png 

     将生成的num.traineddata拷贝到E: esseract essdata,即环境变量TESSDATA_PREFIX 设置的路径下,执行下面的命令( 注意第二条命令结尾是num,即新加的traineddata,而不是eng

    E:tesseracttesseract-svnvs2008LIB_Debugtesseractd.exe num-yasi.png result-eng -l eng
    E:tesseracttesseract-svnvs2008LIB_Debugtesseractd.exe num-yasi.png result-num -l num

    下图是两次识别结果对比

    使用eng traineddata的结果完全不靠谱;使用了自己的traineddata,识别出来的当然都是数字,但正确率实在糟糕。可能是我自己手写的字体和用来做traineddata的手写数字的字体差别太大了吧。

  • 相关阅读:
    从零开始学VUE之组件化开发(组件数据的存放)
    从零开始学VUE之组件化开发(组件分离写法)
    从零开始学VUE之组件化开发(语法糖优化组件注册)
    进程与线程的一个简单解释
    Crontab爬虫定时执行
    接口分类复习
    最长公共子串
    最长公共子序列(力扣第1143题)
    Reduce端分组排序源码分析
    Job提交流程源码和切片源码详解
  • 原文地址:https://www.cnblogs.com/xinxihua/p/14587122.html
Copyright © 2020-2023  润新知