最近主要是完成专业内的一些课程作业,比如Oracle数据库、JaveEE、搜索引擎等作业。国内大学总是会学很多课程,其实对多数学生来说,一些课程都不知道学着有什么意义。这点国外做的较是不错,在英国UWS当交换生的时候,可以选择自己喜欢的课程,这样也就有很大的兴趣去学习这些知识点。
在解决这些课程作业之中,有件事感觉可以和大家分享一下。我们都知道计算机行业技术更新非常快,然而JavaEE老师教的知识点还是10多年前的内容,每次课程结束之中还需完成一个实验。但就是这样一个简单实验,却需要我们学生花费2天或者3天时间去完成。花这么长时间,按理来说应该很难吧,恰恰相反,实验很简单,那为什么还要花这么长时间呢。其实多数时间都是用在各种环境配置、参数设置、寻找各种jar包中,实在不需要写多少代码。比如我需要调用某个jar包,版本太高不行,版本太低不行,来来回回换个好几个,遇到问题想去查一些博客,竟然都是10年前的资料。完成一次实验之后,至此JaveEE的实验我再也没有去做,每次要交的时候,都是借用同学的电脑给老师展示一下,然后拿个分数就走。不是说我懒,没有什么探索、钻研精神,全然是因为学习这种东西实在没有什么用处,还浪费很多时间,不如利用这些时间去完成一些自己比较感兴趣的事情。
另外需要声明一点的是,我的意思并不是旧的东西就没有用,而是强调在实用性和意义方面。比如数据结构、网络原理、操作系统,这样原理性的知识点,沉淀起来才是精华。但对于JavaEE这种实际开发技术来说,我认为过于陈旧的东西实在没有必要去学习。另外针对JaveEE开发这门课,任课老师为什么就不能更新一下知识点,来教一些更新的技术呢。既然如此,我的目标又不是追求多高多高的GPA,那么不如利用这些时间来解决一些自己比较感兴趣的问题,做一些有意义的事情较好。
专业课程作业之外,还有一个实训作业,也就是从中软杯12个题目之中选出来一个完成,然后进行答辩,由指导老师进行评分。这个我感觉还是比较有意思的,所以选了个网店工商信息图片文字提取的题目,然后花四天时间完成,下面主要和大家分享一下问题的解决思路。
1.网店工商信息图片文字提取
图片内容如下所示,但每张图片中信息出现的位置不尽相同,题目要求所写的程序能够完成如下几个功能点。
- 程序能够识别不同格式的图片,并能够提取所要求的信息。
- 从图片之中提取企业注册号和企业名称信息,并保存到Excel表格之中。
- 程序能够自动读取企业工商信息图片所在的文件夹路径。
- 识别速度保持在60秒识别50张图片,识别正确率保证在95%以上。
2.Tess4j
了解题目要求之后,我们便开始来解决问题。首先明确一点的是,肯定不能从头去写文字识别算法或者文字识别程序,OCR(Optical Character Recognition , 光学字符识别)发展这么多年来,开源的库肯定不少,只需找到适合中文识别的类库或者项目即可。
个人采用的是Tess4j开源库,其中Tess4j是由Tesseract扩展而来,Tesseract是HP实验室开发由Google维护的开源OCR引擎,Tess4j支持Tiff,jpeg,gif,png,pdf等多种格式识别。我们只需要在https://sourceforge.net/projects/tess4j/下载类库,然后编写下述代码便可实现文字识别,使用方法很简单。如果你要使用的话,请注意package,imageFile,instance的位置。
代码语言:javascript复制package net.sourceforge.tess4j.example;
import java.io.File;
import net.sourceforge.tess4j.*;
public class TesseractExample1 {
public static void main(String[] args) {
File imageFile = new File("/Users/zhenhai/Downloads/SoftwareCup/Tess4J/test/resources/tianmao/1.png");
ITesseract instance = new Tesseract(); // JNA Interface Mapping
// ITesseract instance = new Tesseract1(); // JNA Direct Mapping
instance.setDatapath("/Users/zhenhai/Downloads/SoftwareCup/Tess4J");
instance.setLanguage("chi_sim");
try {
String result = instance.doOCR(imageFile);
System.out.println(result);
} catch (TesseractException e) {
System.err.println(e.getMessage());
}
}
}
3.网店工商信息图片文字提取
下载的tess4j项目自带英文字体库,而我们需要识别中文信息,所以需下载中文简体字体库。字体库下载完成之后,将题目提供给我们的图片进行识别,识别之后发现准确率很低,而且识别时间过长,所以需要对图片进行处理。
企业注册号 : 913302055612570鄄7 ′ 企业名称: 宁麦皮中哲票广鲳I忏善 蓼鬓′墓示埔壹甬 类 型 霉嫣膘占辆 虫资) 趴辕~蓼唧 ` 住惑7妻 踢「【庄北长兴路689弄22号11巾童A1壬蔚雀菅业^ 刁乏喔憩」壹雇 法 人: 杨禾口荣 成立时间:2010-08-26 甬 甬 注册资本 : 1000万人民币元 / / 营业I言【j目〖艮:2010-08洲:i墅o碾言壹 鹏 莹鬓、′墓示簪 经莒范戛蓼反逼卫 目艮饰日勺扎匕发、 零售、 薯批愤嵩爵签稻昊信息的咨询 ; 服装i氦十犹撕{ 菖〈茵珥跨止 懦牌苣理 广告服务、 企业苣癫颧琨蓼 扩〈喔圃蓼′ 登i 机关 : 浙江雀宁波市江北区工商『壬政苣王里局 核准时间 : 2015-12-24 _日q _日辄
3.1去除水印
首先能够看到,提供的图片带有天猫营业执照信息公示专用水印,所以我们需要进行去水印处理。花了很长时间在网上找去水印的开源代码,但多数都需要先提供水印模版,然后才能进行去水印处理。水印模版不是问题,我们直接截取水印图片即可,但重点是去水印处理之后,水印去除效果并不是很理想。观察一番之后,发现所有的图片水印都是同一个颜色,那么我们是不是可以把水印的rgb值改为和背景色相同,实验之后发现果然可以,由于代码比较简单,此处就不再贴出代码,可以自行尝试一下。然后重新对图片进行识别,发现准确率还是很低,那是什么原因呢?
企业注册号 : 913302055612570鄄7 ′ 企业名称: 宁麦皮中哲票广鲳I忏善 蓼鬓′墓示埔壹甬 类 型 霉裴章膘占辆 虫资) 趴辕~苜趴 ` 住惑)妻 踢「【庄北长兴路689弄22号11巾童A1壬蔚雀菅业^ 刁乏喔憩」壹雇 法 人: 杨禾口荣 成立时间:2010-08-26 甬 甬 注册资本 : 1000万人民币元 / / 营业I言【j目〖艮:2010-08洲:i墅o蔺言壹 鹏 莹鬓、′墓示簪 经莒范戛蓼反逼卫 目艮饰日勺扎匕发、 零售、 薯批愤嵩爵垦稻昊信息的咨询 ; 眼装i氦十犹撕{ 菖〈茵珥跨止 懦牌苣理 广告目艮务、 企业苣癫颧寰蓼 扩〈喔圃蓼′ 登i 机关 : 浙江雀宁波市江北区工商『壬政苣王里局 核准时间 : 2015-12-24 _日q _日辄
3.2图片格式转换
将图片放大之后,发现图片处于全黑的状态,完全看不到任何字。然后尝试将图片格式转换为其他格式,比如jpg,当然这里不是直接改后缀名,而是利用在线图片格式转换工具。当然你也可以转换成其他格式,看看效果如何,转换完成之后,再次进行图片文字识别,发现准确率有较大提升。
企业注丹舟号 : 9133020……612…70177 企业名称 : 宁波中哲慕尚电子商务有限公司 类 型 : 有限责任公司〈法人独资) 住 所 二 宁波市江才匕长兴路689弄22号11瞳A112室 法定代表人: 杨禾口荣 成立时间 : 2010-08-26 注册资本 : 1000万人民币元 营业期限 : 2010-08-26至2020-08-25 经菖范围 : 服装、 箱包、 鞋帽
眼饰的批发
零售、 网上批发` 零售及棺关信息的咨询 : 眼装i毓十 、 企业品牌营王里、 广 告眼务、 企业盲理咨询。 登记机关 : 浙江雀宁波市麦工才匕区工商肴壬政苣王里局 核准时间 : 2015-12-24
3.3分区域识别
图片识别准确率有一定程度提升之后,但是时间还是很高,大概15s左右,所以需要进一步优化。由于题目只需要我们识别企业注册号和企业名称,所以没有必要识别整张图片。但我们又不知道企业名称和企业注册号处于图片的什么位置,所以只能扫描着进行文字图片识别。我这里采用的是每次识别图片高度的18%,例第一次识别区域为0-18%,如果没有识别到我们所需的文字信息,下次识别图片15%-32%,这样就不会遇到文字刚好被识别区域切割的问题。
那这样识别会识别到很多重复区域,时间怎么会提升呢?其实不然,观察题目所给的50张图片,其中有46张图片的信息都是在头部,那么第一次扫描便能得到所需的信息,综合来看时间有很大程度提升。另外如果长时间未能识别到某张图片信息,那么则自动放弃识别。更改程序后重新识别图片,时间有很大程度提升,每张图片的识别速度在3s左右。
企业注册号 : 913302055612570177 企业名称 : 宁波中哲票尚电子商务有眼公司
对于本张图片来说,企业注册号已经能够正确识别,但是企业名称还是有个别字错误,比如将幕识别成票,将限识别成眼,因此需要进一步优化。
3.4 图片二值化
为进一步提高准确率,我们将图片二值化,然后再对图片放大10倍,其实放大倍数越高,识别准确率也应该越高。这里为了在时间和准确度之间做个平衡,对图片只放大10倍。
代码语言:javascript复制BufferedImage textImage = ImageHelper.convertImageToGrayscale(ImageHelper.getSubImage(image, 0, startHeight, resetWidth, resetHeight));
textImage = ImageHelper.convertImageToBinary(textImage);
textImage = ImageHelper.getScaledInstance(textImage, textImage.getWidth() * 10, textImage.getHeight() * 10);
图片放大10倍之后,我们再次对图片进行识别,发现企业注册号和企业名称完全正确。
企业注册号 : 913302055612570177 企业名称 : 宁波中哲幕尚电子商务有限公司
3.5图片模糊寻找和结果导出
图片模糊寻找的意思也就是,给出图片文件夹的大致路径,然后程序能够找到正确的图片路径,并能够正确进行文字识别。比如给定/Users/zhenhai/Downloads/SoftwareCup/Tess4J路径,程序能够找到/Users/zhenhai/Downloads/SoftwareCup/Tess4J/test/resources/tianmao1/1.jpg路径。然后将识别到的结果导出到Excel表格,问题也很简单,这里也就不给出相应代码。
至此已经能够识别图片,而且准确率挺不错,准确率在95%左右,识别成功之后也能够正常导出至Excel表格。但时间依旧不理想,目前识别50张图片大概在2分钟30s左右。
4.待优化
图片文字识别方面只做了4天,之前也没有做过相关问题,所以还是有很大的优化空间。
- 利用多线程,识别时间应该能够减少1分钟,达到1分钟30s识别50张(猜测)。
- 由于我们直接利用网上的字库,没有对字库做任何训练。比如可以将出现频率较高的词设置更高的优先级,这样不仅能够提高准确率,而且能够进一步降低时间,比如上述的限不会再识别成眼。
- 图片大小不一,可以将图片设置为平均宽度和高度,然后再进行分区域识别。而且每次识别时候不是识别企业注册号和企业名称的完整信息,而只是试探识别这几个字,如果识别成功之后,然后再扩大识别宽度,提取所需要的完整信息。
你看到的这篇文章来自于公众号「谓之小一」,欢迎关注我阅读更多文章。