OCR是光学字符识别(Optical Character Recognition)的缩写,是通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算机输入技术。通俗来讲就是识别图片里的文字信息,非常适用于提取网络截图或扫描pdf等文件里的文本,可以极大提高生产效率,避免在遇到有大量文本提取需求时仅靠肉眼识别,徒手打字打到头秃的惨状。
目前市面上的OCR工具已经有非常之多,其中百度AI提供的OCR服务算是其中的佼佼者,百度文字识别是百度AI开放平台提供的众多AI在线服务之一,其功能极其丰富,包括通用文字识别、汽车场景文字识别、财务票据、各类卡证等面向不同场景的文字识别服务。除了在线接口OCR服务之外,最近百度还开源了飞桨文字识别套件PaddleOCR,可以基于该工具开展本地化的文字识别,可以说非常良心了。今天主要介绍下通过在线api调用接口与本机部署PaddleOCR模型两种形式实现文字识别的方式,希望能帮到有需要的人。
如果本身有百度账号的话可以直接用百度账号登录,登录成功后界面如下:
之后选择其中的文字识别,进入文字识别应用界面,可以看到可用服务列表中提供了各类文字识别服务的使用状态、调用量限制等信息,一般每天都有几百次的免费调用机会,足以满足非大规模专业性的文字识别需求。初次使用时需要创建应用:
在创建新应用页面中,需要填写使用应用的相关信息,比如选择文字识别中的通用文字识别、以及选择是公司还是个人开发者使用等信息,全部填写完毕即可成功创建应用:
应用创建成功后会生成每个应用唯一的AppID、API Key、Secret Key等秘钥信息,这几个值是后续调用api接口的关键参数
利用第一步我们创建应用获取的key,构造url请求,实现图像文字识别。这里的请求分两个阶段,第一步是根据key构造的请求获取access_token;第二步是将获取的access_token所包含的信息作为提交的数据再次向url发送请求,最终得到返回的文本信息,示例代码如下:
'''
构建请求url,获取Access Token,必须参数如下:
grant_type: 必须参数,固定为client_credentials;
client_id: 必须参数,应用的API Key;
client_secret: 必须参数,应用的Secret Key;
'''
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + '替换为自己的API Key' + '&client_secret=' + '替换为自己的Secret Key'
headers = {
'Content-Type': 'application/json;charset=UTF-8'
}
# 获取token
res = requests.get(url=host, headers=headers).json()
url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic'
data = {}
data['access_token'] = res['access_token']
'''
基于之前获取的token值,再次向请求url发送post请求,完成文字识别
'''
# 读取图片
image = "D:\临时\图片1.png"
file = open(image, 'rb')
image = file.read()
file.close()
data['image'] = base64.b64encode(image)
#发送post请求,传入图片信息参数,获取文字识别结果
headers = {"Content-Type": "application/x-www-form-urlencoded"}
res = requests.post(url=url, headers=headers, data=data)
result = res.json()
text = result['words_result'][0]['words']
#输出文本结果,保存为txt
f=open("D:\临时\图片1.txt",'a+')
for i in range(0,len(result['words_result'])):
f.write(result['words_result'][i]['words']+"\n")
传入图片:
识别结果:
从这里可以看出,识别精度还是很不错的,这里我用的是高精度识别api接口,一天有500次免费使用机会,如果图片本身背景没有太多干扰的话,通用文字识别结果也是可以的。
上面介绍了通过在线调用api的形式来实现识别的方式,但这种方式还是有几点不足:
- 使用时本机要处在联网状态,如果是在离线环境下则没法通过请求接口的形式获取文字识别结果;
- 接口调用量有限,尤其是高精度文字识别每天只有500次使用机会,无法满足大量文字识别需求(当然也可以付费增加调用配额);
那么有没有可以自行离线部署,并且没有使用频率限制,同时文字识别精度还很高的解决方案呢?答案是使用PaddleOCR:
PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。
其主要特性如下:
支持中英文数字组合识别、竖排文本识别、长文本识别
支持多语言识别:韩语、日语、德语、法语
支持用户自定义训练,提供丰富的预测推理部署方案
支持PIP快速安装使用
可运行于Linux、Windows、MacOS等多种系统
更多相关信息可以参考PaddleOCR的github官方说明,这里主要介绍下使用python环境下通过pip安装部署paddleocr的步骤
pip install paddlepaddle
paddlepaddle是运行PaddleOCR库的依赖库,如果不预先安装,使用PaddleOCR时会报错
windows环境下不要直接使用pip install shapely安装这个库,通过这种方式安装好后在实际使用中会出现:[winRrror 126] 找不到指定模块的问题,最好直接这里下载whl文件,在本地安装。
安装好前面两个库以后,可以放心大胆的安装PaddleOCR了:
pip install paddleocr
至此环境配置工作已做好,接下来可以调用模型测试了。
官方文档给了很详细的代码操作示例,这里选用其中一种演示
# Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换
# 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。
ocr = PaddleOCR(use_angle_cls=True, lang="ch") # need to run only once to download and load model into memory
img_path = 'D:\\bu.png'
result = ocr.ocr(img_path, cls=True)
for line in result:
print(line)
# draw result
from PIL import Image
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores)
im_show = Image.fromarray(im_show)
im_show.show()
这里有个需要注意的地方是我们传入识别的图片不管是文件路径还是图片名称都不能包含中文字符,否则无法准确识别图片,会报NoneType Error错误:
可以看出这个文字识别效果丝毫不弱于调用api的高精度识别方式,并且给出了每个句子识别结果的置信度,在某些要求更高精度、更稳定环境的应用场景下,使用PaddleOCR无疑是更好的选择!
无论是百度AI提供的api,还是开源ocr工具PaddleOCR在实际应用场景中,大多数情况下二者的文字识别结果都可以保证不错的准确度,至于选择用哪种方式达成目标可以根据自己实际需求来定,可以预见的是随着OCR技术的不断发展,日后文字识别的应用场景会更丰富,识别精度也会更高!