java 图像识别OCR(一) tess4j
前段时间公司上面突然下来个需求,根据用户提供的身份证和营业执照图片,获取图片中的信息(就是姓名、身份证号、公司名称啥的),然后存入数据库。然后给的时间是两周,当时我就懵逼了,还好后面补了句尽量用免费的API。虽然我内心是想直接用付费的,付费的肯定用着简单又舒服。但免费的也还是得先研究一下,在网上搜索了一圈,基本上只有tess4j这一个了。直接上代码看效果了,老实说看了这么多资料对于tess4j我了解的还是不多。。。pom依赖
net.sourceforge.tess4jtess4j4.5.2main
importnet.sourceforge.tess4j.ITesseract;importnet.sourceforge.tess4j.Tesseract;importnet.sourceforge.tess4j.TesseractException;importjava.io.File;publicclasstest{publicstaticvoidmain(String[]args){//识别图片的路径(修改为自己的图片路径)//Stringpath="C:\Users\Tang\Desktop\图片\营业执照4.jpg";Stringpath="C:\Users\Tang\Desktop\图片\身份证3.jpg";//Stringpath="C:\Users\Tang\Desktop\图片\其他图片2.png";//语言库位置(修改为跟自己语言库文件夹的路径)StringlagnguagePath="D:\tessdata";Filefile=newFile(path);ITesseractinstance=newTesseract();//设置训练库的位置instance.setDatapath(lagnguagePath);//chi_sim:简体中文,eng根据需求选择语言库instance.setLanguage("thz");Stringresult=null;try{longstartTime=System.currentTimeMillis();result=instance.doOCR(file);longendTime=System.currentTimeMillis();System.out.println("Timeis:"+(endTime-startTime)+"毫秒");}catch(TesseractExceptione){e.printStackTrace();}System.out.println("result:");System.out.println(result);}}这里需要注意修改的有几点
图片的位置语言库的位置选择的语言库语言库这里给大家下载链接github最后运行结果大概是下面这样的可以看到还是有很多不准确的地方,这怎么行呢。得想办法提高准确的啊,于是又在网上搜了一圈,基本上都是优化语言训练库和openVC的方法。openVC已经有大佬写了demo上传到码云了,地址我把代码拉下来试了一下,作者的处理方法是在前端页面将身份证号码那一块裁剪下来传入后端识别,准确度基本达到了99%。但是仅仅是身份证号码对我来说并不够,对于地址姓名等中文识别还是不太又好。然后就是优化语言训练库了参考了Tesseract4.0训练字库OCR提高识别率必备(超详情)这篇文章也去试了一下。方法应该是可行的,但是应该需要大量的训练才能达到极高的准确度。(这篇文章里用的这种图片基本都还好,但是用到身份证和营业执照上,用训练的照片去识别都仍有差别,感觉是需要极大数据量才能减小误差了)。
开源API这条路暂时是走不通了。研究研究付费的吧。
参考使用tess4j完成身份证和营业执照图片的文字识别Java使用Tess4J实现简单的图像识别(Maven版)
java做图文识别
现在的世界,什么都需要人工智能AI进行处理,那么,对于Java程序猿来说,是不是有些工作是不是就不能胜任呢,答案是显然是不一定的,对于图片识别来说,这个任务就可以使用Java进行开发,虽然效率可能不是最好的,但是,结果是一致的。下面我就开始出大招了第一步,添加技能点如果需要进行图片识别,那么肯定需要识别的插件或者是一个库呀,不然程序怎么清楚是识别那些东西,识别是中文还是英文,对不对,这个时候呢,就出现了“野怪”——ocr,给我们提供支持,从而进行升级添加技能点什么事OCR,这个大家可以自行百度,其主要作用就是为我们进行识别图片中的文字的一个重要角色,下载方式直接百度tesseract下载就行下载完成后,需要进行配置环境变量,我这也不进行过多描述,可以自行百度,如果需要,可后续追加一篇配置下载的博客说明那么野怪位置找到了,我们就需要开始刷怪升级了第二步,添加词库需要识别文字,那么武器必不可少,如果没有装备,野怪也是能秒人的,所以,我们需要去下载一些词库,例如中文词库:chi_sim.traineddata,下载方式也可在百度上进行下载下来,下载完成后,在刚刚安装的tesseract下找到tessdata文件夹,将其复制过来就可以了,我的是D盘下,所以位置如下图移动过来后,我们就有武器了,开始刷怪第三步,开大,结束战斗(前方高能)
publicstaticStringIdentifyThePicture(){//识别图片System.out.println("开始识别");longstarttime=System.currentTimeMillis();//获取当前程序执行绝对路径。Stringtext=orcde("normal","D:\tesseract-ocr\tessdata","D://JT//1.png");System.out.println("discriminateinterval:"+(System.currentTimeMillis()-starttime)+",ocrtext:"+text);returntext;}publicstaticStringorcde(Stringlang,Stringlangpath,Stringimageurl){//识别图片的路径(修改为自己的图片路径)Stringpath=imageurl;//语言库位置(修改为跟自己语言库文件夹的路径)StringlagnguagePath=langpath;Filefile=newFile(path);ITesseractinstance=newTesseract();//设置训练库的位置instance.setDatapath(lagnguagePath);//chi_sim:简体中文,eng根据需求选择语言库instance.setLanguage(lang);Stringresult=null;try{longstartTime=System.currentTimeMillis();result=instance.doOCR(file);longendTime=System.currentTimeMillis();System.out.println("Timeis:"+(endTime-startTime)+"毫秒");}catch(TesseractExceptione){e.printStackTrace();}System.out.println("result:");System.out.println(result);returnresult;}运行结果如下:图片中的内容如下:你是不是发现有两个字不对,这个咱暂时不告诉你,请继续往下看代码看起来是不是很简单,(你心里觉得是这样想的)因为这是有野怪,如果没有野怪怎么办,或者等级不够怎么办(1级单挑100级?)显然是不可以的,这个时候就需要进行训练了,训练啥,训练词库,怎么训练,如下:第一步,下载jTessBoxEditor_jb51(找到新手训练营)jTessBoxEditor_jb51这是啥东西,我告诉你,这个是训练词库必须要用的一个jar包,但是呢,他不是在项目里面使用的,而是独立运行的,怎么使用,待会就来第二步,生产词条(找到野怪)怎么生产词条,也就将你需要识别的一些文字,做成一个jpg的图片,怎么做,直接截图呗,然后保存为jpg就行了是不是说好简单,还没完呢!有了jpg图片后,需要对其改变格式,不能手动改变后缀,需要通过格式工厂,或者在线转换插件进行转换,将jpg的图片转换为tif的文件格式,然后启动我们的新手训练营jTessBoxEditor_jb51,(里面有一个启动脚本的了)就是上面圈住的这个bat脚本,启动后,会出来一个Java窗口先过去将刚刚的图片更改图片名字,这个是有要求的
tif文面命名格式[lang].[fontname].exp[num].tiflang是语言fontname是字体比如我们要训练自定义字库myfontlab字体名normal那么我们把图片文件重命名myfontlab.normal.exp0.jpg在转tif。这个时候呢,我们需要打开黑命令框(CMD)输入命令生成box文件
tesseractmyfontlab.normal.exp0.jpgmyfontlab.normal.exp0-lchi_simbatch.nochopmakebox运行结果如图然后就会产生一个新的文件在该文件夹下这个时候就需要用的我们的jTessBoxEditor_jb51了,点击open,选择刚刚处理过得tif文件图片得到下面结果数据
然后开始修改我们不对的字第5行的窝应该是我,所以需要进修改,选择改行,然后点击save进保存,这个时候就词条就生产完毕了需要导入到我们的词库中去
第三步,词条添加到词库中(捡装备了)cmd中输入命令,生成.tr文件
tesseractmyfontlab.normal.exp0.jpgmyfontlab.normal.exp0nobatchbox.train再输入命令,生成unicharset文件
unicharset_extractormyfontlab.normal.exp0.box新建一个font_properties.txt文件里面内容写入normal00000表示默认普通字体运行命令
shapeclustering-Ffont_properties.txt-Uunicharsetmyfontlab.normal.exp0.trmftraining-Ffont_properties.txt-Uunicharset-Ounicharsetmyfontlab.normal.exp0.trcntrainingmyfontlab.normal.exp0.tr目录下会生成对应下列五个文件,在这五个文件前加上normal.进行重命名合并五个文件,此时目录下的normal.traineddata就是训练好的字库文件执行命令
combine_tessdatanormal.最后就产生了一个新的文件,这就是刚刚训练出来的词库最后将新的词库放人的OCR中就行了,怎么放,教你把normal.traineddata复制到Tesseract-OCRt程序目录下的“tessdata”目录,在Tesseract-OCRt程序目录下执行
tesseract.exemyfontlab.normal.exp0.jpgout–lnormal这个时候,词库就好了,再运行一下试试完美,图文识别成功
疯狂打架去吧,再也不用担心打不过了^_^
以上内容可能有不正确的地方,望大佬指正,如果需要下载配置介绍,欢迎评论去留言哦附上pom文件依赖
4.0.0org.springframework.bootspring-boot-starter-parent2.5.4com.playplay0.0.1-SNAPSHOTplayDemoprojectforSpringBoot1.8org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.bytedeco.javacpp-presetstesseract-platform3.04.01-1.3net.sourceforge.tess4jtess4j4.4.0org.springframework.bootspring-boot-maven-pluginJava图片识别技术原理
hiveontez详细配置和运行测试orange_bug:请问博主测试word.txt文件没问题,但是建表后自己插入数据时就会报错:[2020-10-2716:21:13.243]Containerexitedwithanon-zeroexitcode1.Errorfile:prelaunch.err.Last4096bytesofprelaunch.err:Last4096bytesofstderr:错误:找不到或无法加载主类1638请问有没有遇到,怎么解决呢?
Java图片识别技术原理qq_44976601:你这个图片识别比较特别呀
hiveontezhive运行在tez之上安装测试萌萌哒的理工男:小哥哥,FailedtoretrieveAMStatusviaproxy,我的日志里是这个错误==网上也查不到,求指点迷津
hiveontez详细配置和运行测试蜗农:怎么在hiveserver2中运行tez呢?