您的位置 首页 > 德语词汇

extractor是什么意思、读音 Windows下Tesseract训练音符识别

很多朋友对于extractor是什么意思、读音和Windows下Tesseract训练音符识别不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

开局一张图:现在有这么一个需求,要将数字简谱中的数字带点的内容识别出来做进一步的处理,比如

616641533\n.....

识别成

extractor是什么意思、读音 Windows下Tesseract训练音符识别

F1FFDA533

其实就是通过下面的映射关系识别

#原简谱\n.\n123456712345671\n.......\n\n#映射\nABCDEFG1234567a

识别成什么无所谓,只要能区分带点的数字和不带点的数字即可,带点的这种数字是简谱的特殊字符,纯字符是打不出来的,这也是难点,有以下思路

首先需要找到样本,上面截图中的键盘很不错,字符很全,就拿这个当做训练样本,首先进行二值化(Binarization)操作,二值化可参考维基百科:https://zh.wikipedia.org/zh-hans/%E4%BA%8C%E5%80%BC%E5%8C%96

二值化的目的主要是为了简化背景,提供识别度,下面是Java的二值化代码

publicvoidbinaryImage(Stringin,Stringout)throwsIOException{\nFilefile=newFile(in);\nBufferedImageimage=ImageIO.read(file);\n\nintwidth=image.getWidth();\nintheight=image.getHeight();\n\nBufferedImagegrayImage=newBufferedImage(width,height,BufferedImage.TYPE_BYTE_BINARY);//重点,技巧在这个参数BufferedImage.TYPE_BYTE_BINARY\nfor(inti=0;i<width;i++){\nfor(intj=0;j<height;j++){\nintrgb=image.getRGB(i,j);\ngrayImage.setRGB(i,j,rgb);\n}\n}\n\nFilenewFile=newFile(out);\nImageIO.write(grayImage,"png",newFile);\n}

调用方式如下,输出一个图片文件,输出二值化后的图片文件

publicstaticvoidmain(String[]args)throwsIOException{\nImageBinaryzationdemo=newImageBinaryzation();\ndemo.binaryImage("D:\\\\20210626102826.jpg","D:\\\\20210626102826二值化.png");\n}

二值化前后对比如下

用PS等工具把它水平切分成三个文件备用,如下

Tesseract是一个光学字符识别引擎,支持多种操作系统。[1]Tesseract是基于Apache许可证的自由软件[2],自2006年起由Google赞助开发[3]。

Tesseract读音为/?tes??r?kt/,为啥用它?因为它开源,教程多

首先安装Tesseract4.0,安装地址如下,一路next即可

tesseract-v\ntesseract4.00.00alpha\nleptonica-1.74.1\nlibgif4.1.6(?):libjpeg8d(libjpeg-turbo1.5.0):libpng1.6.20:libtiff4.0.6:zlib1.2.8:libwebp0.4.3:libopenjp22.1.0

下载字库文件(本例不需要,因为只识别数字)

下面来简单识别一下:在有键盘二值化图片的文件夹打开cmd命令行,输入如下命令

tesseract键盘二值化.pngoutput-leng--psm6键盘二值化.png是输入图片output是输出结果文本--psm6表示这是一个文本块,不是一个字符也不是一行,--psm7表示一行,这个很重要,训练的时候生成基础box文件的时候会用到,需要告诉它这是一行还是一块,否则可能会报PageEmpty错误

其他--psm参数还有

0Orientationandscriptdetection(OSD)only.\n1AutomaticpagesegmentationwithOSD.\n2Automaticpagesegmentation,butnoOSD,orOCR.\n3Fullyautomaticpagesegmentation,butnoOSD.(Default)\n4Assumeasinglecolumnoftextofvariablesizes.\n5Assumeasingleuniformblockofverticallyalignedtext.\n6Assumeasingleuniformblockoftext.\n7Treattheimageasasingletextline.\n8Treattheimageasasingleword.\n9Treattheimageasasinglewordinacircle.\n10Treattheimageasasinglecharacter.\n11Sparsetext.Findasmuchtextaspossibleinnoparticularorder.\n12SparsetextwithOSD.\n13Rawline.Treattheimageasasingletextline,

看看识别的结果

L.234e\n67I23\n4s671

对比下原图

识别结果乱七八糟,压根不满足需求,5竟然识别成了s....

这个工具叫做jTessBoxEditor,中文翻译大概是基于java的Tesseract的盒子编辑器,所谓盒子可以理解成需要识别的字符,这个字符的边界框起来就是一个盒子(矩形),这个软件就是矫正这个边界,所以叫盒子编辑器。(个人理解),既然是基于Java的,所以Java环境也是需要的

打开后双击里面的jTessBoxEditorFX.jar即可打开界面

这个步骤的目的是将多张训练样本进行合并,在矫正的时候可以分页一起矫正

打开jTessBoxEditorFX.jar,点击Tools->MergeTIFF

选择刚才我们准备的三张样本图片,注意选择下文件格式,默认格式是选择TIFF

此时会再次弹出文件框让保存文件,输入music_my.font.exp0.tif然后保存,出现下图内容说明保存成功,如果不是下图内容需要根据提示排错(比如本来是jpg图后缀是png就会报错)

在当前文件夹cmd进入命令行窗口,输入

tesseractmusic_my.font.exp0.tifmusic_my.font.exp0-leng--psm7batch.nochopmakeboxmusic_my.font.exp0.tif:我们刚才生成的合并文件eng:用英文字库识别--psm7:指定待识别的图片为一行内容,上面已经说过了

执行之后会生成music_my.font.exp0.box文件,这样做的目的:既然我们要校正数据,得先生成一个基础的数据识别是吧,这就是生成的基础识别数据,我们在这个box文件的基础之上识别

打开jTessBoxEditorFX.jar,点击BoxEditor->Open,打开第一步生成的music_my.font.exp0.tif,会带第二步的识别基础数据(box文件)

左边列表就是识别的基础数据,右边就是我们的样本,下面page有三页,因为我们的样本是三张,将左边列表的数据与右边的样本图片进行校正,包括位置和内容,比如3识别成了C就需要校正,最后Ctrl+S保存

1.png\n2.png\n3.png\nmusic_my.font.exp0.box\nmusic_my.font.exp0.tif训练

这里包括了很多步骤,此处合到一起了,简称训练

在当前文件夹新建一个font_properties文件,输入内容

font00000

表示字体font的粗体、倾斜等共计5个属性全都设置为0,注意:这里输入的font名称必须与music_my.font.exp0.box中两个点号之间的font名称保持一致,还有编码必须为UTF-8不带BOM,所以不能用记事本

1.png\n2.png\n3.png\nmusic_my.font.exp0.box\nmusic_my.font.exp0.tif\nfont_properties生成训练的tr文件

tesseractmusic_my.font.exp0.tifmusic_my.font.exp0--psm7nobatchbox.train

注意这里也有--psm7,执行结果

TesseractOpenSourceOCREnginev4.00.00alphawithLeptonica\nPage1\nWarning.Invalidresolution1dpi.Using70instead.\nAPPLY_BOXES:\nBoxesreadfromboxfile:5\nFound5goodblobs.\nGeneratedtrainingdatafor5words\nPage2\nWarning.Invalidresolution1dpi.Using70instead.\nAPPLY_BOXES:\nBoxesreadfromboxfile:5\nFound5goodblobs.\nGeneratedtrainingdatafor5words\nPage3\nWarning.Invalidresolution1dpi.Using70instead.\nAPPLY_BOXES:\nBoxesreadfromboxfile:5\nFound5goodblobs.\nGeneratedtrainingdatafor5words

类似于Found5goodblobs.的输出说明是成功的,这一步会生成music_my.font.exp0.tr文件,此时文件列表如下

1.png\n2.png\n3.png\nmusic_my.font.exp0.box\nmusic_my.font.exp0.tif\nfont_properties\nmusic_my.font.exp0.tr提取字符集文件

执行下面命令

unicharset_extractormusic_my.font.exp0.box

执行结果如下

Extractingunicharsetfrommusic_my.font.exp0.box\nWroteunicharsetfile./unicharset.

这一步生成了unicharset文件,文件列表如下

1.png\n2.png\n3.png\nmusic_my.font.exp0.box\nmusic_my.font.exp0.tif\nfont_properties\nmusic_my.font.exp0.tr\nunicharset生成字典数据

mftraining-Ffont_properties-Uunicharset-Omusic_my.unicharsetmusic_my.font.exp0.tr\ncntrainingmusic_my.font.exp0.tr

输出分别如下

#mftraining-Ffont_properties-Uunicharset-Omusic_my.unicharsetmusic_my.font.exp0.tr\nWarning:noprotos/configsforJoinedinCreateIntTemplates()\nWarning:noprotos/configsfor|Broken|0|1inCreateIntTemplates()\nDone!\n\n\n#cntrainingmusic_my.font.exp0.tr\nReadingmusic_my.font.exp0.tr...\nClustering...\n\nWritingnormproto...

这两步生成了4个文件

inttemp\nnormproto\npffmtable\nshapetable

将这4个文件重命名一下,加上前缀music_my.,如果cmd没有mv命令可以在powershell中执行或者手动重命名

mvinttempmusic_my.inttemp\nmvnormprotomusic_my.normproto\nmvpffmtablemusic_my.pffmtable\nmvshapetablemusic_my.shapetable

此时生成的文件列表为

ModeLastWriteTimeLengthName\n---------------------------\n-a----2021/6/2615:1234211.png\n-a----2021/6/2615:1232622.png\n-a----2021/6/2615:1233473.png\n-a----2021/6/2711:0014font_properties\n-a----2021/6/2710:42310music_my.font.exp0.box\n-a----2021/6/2710:3812221music_my.font.exp0.tif\n-a----2021/6/2710:5727152music_my.font.exp0.tr\n-a----2021/6/2711:00134536music_my.inttemp\n-a----2021/6/2711:001382music_my.normproto\n-a----2021/6/2711:00110music_my.pffmtable\n-a----2021/6/2711:00184music_my.shapetable\n-a----2021/6/2711:00677music_my.unicharset\n-a----2021/6/2710:58665unicharset生成字库文件

最后一条命令

combine_tessdatamusic_my.

执行完输出如下

Combiningtessdatafiles\nOutputmusic_my.traineddatacreatedsuccessfully.\n1:unicharset:size=677,offset=168\n3:inttemp:size=134536,offset=845\n4:pffmtable:size=110,offset=135381\n5:normproto:size=1382,offset=135491\n13:shapetable:size=184,offset=136873

size和offset这些项没有-1表示成功,最后生成了一个music_my.traineddata文件,这就是最终的字库文件,将此文件拷贝到文初提到的默认字库文件夹C:\\ProgramFiles(x86)\\Tesseract-OCR\\tessdata就可以直接调用

最后再次测试我们的识别效果,在有键盘二值化.png文件的目录里执行

tesseract键盘二值化.pngoutput-lmusic_my--psm6

看下输出结果

ABCDE\nFG123\n4567a

非常完美,说明已经识别出来了,符合预期

其实我们用样本去测试字库文件这肯定是符合预期的,因为字库文件就是用样本的校正然后制作的,所以测试的时候应该用待识别的(非样本)图片作为测试,会发现,其实识别成功率还不是100%,本例中大概有90%左右的识别成功率,因为真实的曲谱二值化后可能长下面这样

所以需要一个重复训练的过程,将未识别的数据标记出来,然后在之前的基础之上重复训练,越训练得多越精准,是不是有大数据内味儿了~

重复训练是要在之前的基础之上来训练,这里我给一个思路,将要识别的图片放到之前第一次训练的那个目录里:

接下来的步骤和之前都是一样的,步骤很多很杂,其实无非就是合并>校正>训练>生成字典而已,下面将这些命令统一到一个地方,以后训练的时候只需要将music_my.前缀批量替换一下就行

#生成box文件\ntesseractmusic_my.font.exp0.tifmusic_my.font.exp0-leng--psm7batch.nochopmakebox\n\n#此处需要用jTessBoxEditorFX进行校正....\n....校正中....\n\n#生成字体特征文件(注意编码一定要是UTF-8无BOM)\necho'font00000'>font_properties\n\n\n#训练\ntesseractmusic_my.font.exp0.tifmusic_my.font.exp0--psm7nobatchbox.train\n#提取字符集\nunicharset_extractormusic_my.font.exp0.box\n\n#生成字典\nmftraining-Ffont_properties-Uunicharset-Omusic_my.unicharsetmusic_my.font.exp0.tr\ncntrainingmusic_my.font.exp0.tr\n\n#更名为统一的前缀\nmvinttempmusic_my.inttemp\nmvnormprotomusic_my.normproto\nmvpffmtablemusic_my.pffmtable\nmvshapetablemusic_my.shapetable\n\n#合并文件,生成字库文件\ncombine_tessdatamusic_my.Java调用Tesseract

java中调用Tesseract只需要引入Tesseract依赖即可,在maven中引入依赖

<dependency>\n<groupId>net.sourceforge.tess4j</groupId>\n<artifactId>tess4j</artifactId>\n<version>4.4.0</version>\n</dependency>

从图片识别的代码demo\npublicclassTestOCR{\n\n\n\nprivateLoggerlogger=LoggerFactory.getLogger(this.getClass());\n\nITesseractinstance;\n\nStringpath="D:\\\\22222.png";\n\n\n@Before\npublicvoidinit(){\n\ninstance=newTesseract();\n//如果没有设置TESSDATA_PREFIX环境变量下面需要设置字库文件位置\n//StringlagnguagePath="D:";\n//instance.setDatapath(lagnguagePath);\n//chi_sim:简体中文,eng根据需求选择语言库\ninstance.setLanguage("eng");\n//白名单,只识别成数字\ninstance.setTessVariable("tessedit_char_whitelist","1234657890");\n\n}\n\n\n@Test\npublicvoidtest1(){\nStringpath="C:\\\\Users\\\\Desktop\\\\o\\\\test.png";\nSystem.out.println(path);\n//识别图片的路径(修改为自己的图片路径)\nFilefile=newFile(path);\n\nStringresult=null;\ntry{\nlongstartTime=System.currentTimeMillis();\nresult=instance.doOCR(file);\nlongendTime=System.currentTimeMillis();\nSystem.out.println("Timeis:"+(endTime-startTime)+"毫秒");\n}catch(TesseractExceptione){\ne.printStackTrace();\n}\n\nSystem.out.println("result:");\nSystem.out.println(result);\n\n}\n}

Tess4JAPI提供的功能:1、直接识别支持的文件2、识别图片流3、识别图片的某块区域4、将识别结果保存为TEXT/HOCR/PDF/UNLV/BOX5、通过设置取词的等级,提取识别出来的文字6、获得每一个识别区域的具体坐标范围7、调整倾斜的图片8、裁剪图片9、调整图片分辨率10、从粘贴板获得图像11、克隆一个图像(目的:创建一份一模一样的图片,与原图在操作修改上,不相互影响)12、图片转换为二进制、黑白图像、灰度图像13、反转图片颜色

更多案列请参考:https://blog.csdn.net/weixin_30906185/article/details/99802837

源码参考:https://gitee.com/zhaohuihbwj/Tess4JDemo/blob/master/src/test/java/per/zh/tess4j/Tess4JTest.java

关于extractor是什么意思、读音的内容到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023