起因源于这么一个需求:现在网络上很多视频教程都是没有笔记的,但是视频不便于存储和检索,能不能将视频带文字部分的内容识别成文本记录下来用于日后检索呢?答案是能,这就涉及到OCR(Optical Character Recognition,中文翻译光学字符识别

图片识别成文本这个需求还是比较普遍,比如

  • 身份证号、银行卡号、手机号码识别
  • EXCEL表格识别
  • 扫描件、复印件、PDF等识别

常见工具也有很多,有接口类型的,也有产品类型的,比如

  • 百度文字识别API
  • 天若OCR / 树洞OCR
  • 微信/QQ文字识别
  • 白描
  • 全能扫描王
  • 扫描汪

有付费的,有免费的,但是以上OCR都有一个共同特点,它只是一个客户端,识别的时候需要将图片上传到服务器进行识别好之后再将数据进行返回,这样涉及到一些私人信息比如身份证、银行卡、手机号等就会有风险,老是把这些敏感信息往别人服务器传肯定不太好,有些私人或小公司免费服务(不只是OCR)之所以免费大概率是为了收集你的私人信息,或者主要是推广顺便在收集下私人信息,让你填这填那才让用,那服务器续费还要$呐,免费服务提供者不可能总是在用爱发电。那有没有本地离线版的OCR呢?答案是有的,我知道的至少有以下

  • Tesseract(OCR引擎)
  • tr(Text Recognition)

tr也就是今天的主角,为什么要介绍它,是因为它有一个网页版本,方便易用。

tr

一款针对扫描文档的离线文本识别SDK,核心代码全部采用C++开发,并提供Python接口

项目地址:github.com/myhub/tr/blo

简单扫了一下项目README,它核心是C++开发的,以二进制的形式提供,并未开源,接口以Python和C++的形式提供,Python的部分是开源的,最终lib以Python包的形式提供,安装该lib通过两种方式,要么下载到本地安装,要么直接通过github安装

# 下载到本地安装
git clone https://github.com/myhub/tr.git
cd ./tr
sudo python setup.py install
​
# 直接通过github安装
sudo pip install git+https://github.com/myhub/tr.git@master

Python使用案列

import tr

# 检测一行文字(检测文字的位置)
# detect text lines, return list of (cx, cy, width, height, angle)
print(tr.detect("imgs/web.png", tr.FLAG_RECT))

# 检测一行文字,带角度,文字不是水平的(检测文字的位置)
# detect text lines with angle, return list of (cx, cy, width, height, angle)
print(tr.detect("imgs/id_card.jpeg", tr.FLAG_ROTATED_RECT))

# 识别一行文字
# recognize text line, return (text, confidence)
print(tr.recognize("imgs/line.png"))

# 检测和识别
# detect and recognize text lines with angle, return list of ((cx, cy, width, height, angle), text, confidence)
print(tr.run("imgs/id_card.jpeg"))

要识别如下图这么一张身份证,代码应该这样写

for i in tr.run('path/to/your/id_card.png'):
    print(i[1])

识别结果如下

姓名
白小描
性别
女
民族汉
出生
2017
年6月21 日
住址山东省青岛市即墨区北
安街道办事处
公民身份号码
370000201706210510

这种辨识度很高的图片对它来说根本不是难事,它还支持GPU加速,让显卡也参与到识别的工作中来,详情参考项目README

以上只是接口部分,可供第三方程序调用,如果只是接口,那使用起来不是太方便,下面介绍该项目的相关项目TrWebOCR

TrWebOCR

项目地址:github.com/alisen39/TrW

TrWebOCR,基于开源项目 Tr 构建。 在其基础上提供了http调用的接口,便于你在其他的项目中调用。 并且提供了易于使用的web页面,便于调试或日常使用。
特性

  • 中文识别 快速高识别率
  • 文字检测 支持一定角度的旋转
  • 并发请求 由于模型本身不支持并发,但通过tornado多进程的方式,能支持一定数量的并发请求。具体并发数取决于机器的配置。

直接使用Docker部署,命令如下

docker run -itd --rm -p 8089:8089 --name trwebocr mmmz/trwebocr:latest 

访问http://IP:8089即可打开如下页面

效果测试

下面就是喜闻乐见的效果测试

  • 网页文字识别
  • 琴键说明书,琴键上的数字都能识别到
  • 日语识别,片假名识别正常,平假名识别错误
  • 英语识别
  • 繁体字识别还是有些差,测试了好多版本,香港繁体,澳门繁体,台湾正体,识别度都不高。
  • 表格识别
  • 艺术字就比较惨了,几乎识别不了
  • 身份证识别,最后一位X识别成了8
  • 扫描版PDF
  • 倾斜(带角度)的身份证识别,这也是作者案列中的素材
  • 如果倒过来?可以看到识别结果就非常魔怔了,所以文字的角度和识别正确率有很大关系
  • 银行卡识别,可以看到在有背景干扰的情况下识别度还是很高,各种手机钱包扫描识别银行卡号用OCR不就能识别了么
  • 毛爷爷识别,竖排字符识别效果不好,横排还是很OK
  • 海报识别,大一点的字识别很精准,小字识别很差,毕竟像素低,就算人类也要结合语境推敲,就别难为机器了:)
  • 歌词识别,识别度很高,原图有些糊,不糊识别度更高,排版有些乱,当然简谱符号(数字下面带点)识别不出来,只能识别到数字
  • 电商主图识别,新品发售这几个大字竟然没检测到,猜想颜色可能会对识别结果产生影响,能识别的字颜色都是统一的,唯独那几个大字是渐变色,还包含一些其他色块
  • 最后再来个终端字符识别,这个相当有用了,有时候有人找你排查个错误,结果那货只给你发一个错误截图???那我还得挨个字母敲到Google搜索,有了这个识别功能,直接识别后复制到Google搜索即可

总结

总体效果不错,如果仅仅是对一些背景不复杂,非艺术字,非繁体和非其他奇奇怪怪的字符的处理,识别度还是很高,如果识别度还是很低,确认待识别文字是否带有复杂颜色,是否倾斜,背景是否干净,是否清晰(像素是否够)

背景干净、颜色单一、中文简体、像素数足够(清晰)、不倾斜(水平排列)的字符识别率是最高的。如果某些条件不满足,可以在PS里面预处理一下再识别,预处理思路

  • 背景不够干净:调整色阶,对比度等
  • 颜色不够单一:去色,变黑白,调整色阶、对比度等
  • 繁体字:这个识别率比较低,可以联系作者优化繁体字识别率,项目地址上有作者邮箱;或者换个OCR引擎自行研究;再或者泡在两岸三地港澳台的相关论坛看看有没有相应项目,港澳台也有OCR需求
  • 像素数不够:锐化或者像素插值
  • 倾斜:旋转、变形

觉得前端不好用,有能力的大佬可自行修改,项目都是开源的,经过我的体验,每次需要保存图像比较麻烦,可添加的功能如下

  • 网页增加输入URL获取图片识别的功能
  • 截图识别

参考