背景
最近iOS15系统出了一个LiveText功能,功能非常好用,想在自己的APP里也实现该功能。可惜的是目前apple官方还没提供相应的接口供开发者使用。LiveText本质上是OCR技术,所以想预研下,这类功能是如何实现。网上搜集相关资料,免费的支持本地OCR功能,并且支持多个平台的也就谷歌提供的Tesseract了,而且支持pod,所以先从这个下手。
Tesseract简介
将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR)。可以实现OCR 的底层库并不多,目前很多库都是使用共同的几个底层OCR 库,或者是在上面进行定制。
Tesseract 是一个OCR 库,目前由Google 赞助(Google 也是一家以OCR 和机器学习技术闻名于世的公司)。Tesseract 是目前公认最优秀、最精确的开源OCR 系统。
除了极高的精确度,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体(只要这些字体的风格保持不变就可以),也可以识别出任何Unicode 字符。
简单来说,Tesseract采用机械学习的模式,先提取特征训练字符库,然后根据字符库来识别图片中的文字。目前支持多个平台。
开始安装
Tesseract应该是C++编写,目前iOS的主要分支应该是gali8分支。
github:https://github.com/gali8/Tesseract-OCR-iOS
截止目前为止最新版本是5.0.1并且支持swift,很不错。下面就是简单pod一下就好了。
我这里使用的是清华源,可以提升速度,也推荐给大家
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'
开始测试
首先看来看看Tesseract对项目结构的要求。使用Tesseract,我们需要将训练好的库放到项目中去,必须是一个文件夹,并且以tessdata命名,注意这里要选folder references,tessdata里面就是训练好的模型。
然后再来看看代码,发现意外的简单。
首先生成一个G8Tesseract对象,使用多种语言文字用+号连接,然后再配置引擎以及识别参数,最后就能将图片的文字识别到recognizedText。
下面找一张图片试试看:
这中文识别还行,但这英文嘛。。。。会不会是颜色干扰了识别?据我所知,图像识别一般都要黑白化,这样可以减少干扰因素。所以下面我们用GPUImage对图像进行处理试下(GPUImage刚才pod里面有)。改进代码:
问题更严重了。会不会是我用的字符库没经过训练,或者训练较差呢?然后我就去Tesseract官网看看有没有新的字符库。地址:
https://github.com/tesseract-ocr/tessdata 下载新的字符库发现跑不起来,原来TesseractOCRiOS 5.0.1 只适配到3.0.3的Tesseract,官方早就更新到4.0.0以上了。如果想要使用新的训练库,就得升级Tesseract。TesseractOCRiOS多年没维护,issues上也有类似的问题没有解决。所以只能找找看有没有支持4.0.0以上的野分支了。经过一番搜索,还真找到了一个分支,作者xwal。https://github.com/xwal/Tesseract-OCR-iOS
下面修改podFile重新拉代码:
经过测试,效果提升并不明显。而且英文与英文如果黏连很近,还是很容易出错。
总结
目前来看Tesseract方案和系统iOS自带的文字识别还是有一定差距的,而且要携带训练好的字符特征包,会增大APP的体积。所以目前想在照片使用OCR,用webView去显示图片,然后用系统自带功能可能更加合适一点。